计算p ^ q(指数)的有效方法,其中q是整数

q09*_*987 17 c++ math exponentiation

什么是计算p q的有效方法,其中q是整数?

Fre*_*Foo 43

通过平方的指数仅使用O(lg q)乘法.

template <typename T>
T expt(T p, unsigned q)
{
    T r(1);

    while (q != 0) {
        if (q % 2 == 1) {    // q is odd
            r *= p;
            q--;
        }
        p *= p;
        q /= 2;
    }

    return r;
}
Run Code Online (Sandbox Code Playgroud)

这应该适用于任何monoid(T,operator*),其中T构造的1是标识元素.这包括所有数字类型.

将其扩展signed q为简单:只需将上面的结果除以一个绝对值q(但通常在计算绝对值时要小心).

  • downvotes真的伤害了那么多吗?98个维基百科三个单词链接真的很少,你必须感到不安,或者代表别人不高兴吗? (4认同)
  • @Joe:OP要求提出建议,而不是完整的解决方案或正确的证明. (3认同)
  • @Joe Wreschnig:通常的投票标准(通过悬停在投票箭头上显示)是"这个答案是否有用",而不是"这个答案是否尽可能完整".另见http://meta.stackexchange.com/questions/2451/why-do-you-cast-downvotes-on-answers (3认同)

Mar*_*k B 12

假设这^意味着取幂而且q是运行时变量,请使用std::pow(double, int).

编辑:为了完整性,由于对这个答案的评论:我问的问题为什么从C++ 11中删除了std :: pow(double,int)?关于缺失的函数,实际上pow(double, int)没有在C++ 0x中删除,只是语言被更改了.但是,由于结果准确性问题,图书馆似乎无法实际优化它.

即使考虑到我仍然会使用,pow直到测量显示我需要进行优化.


小智 9

我假设你的意思是幂函数,而不是按位xor.

任何类型的p和任何正整数q的高效幂函数的开发是Stepanov和McJones的书"编程元素"的整个部分3.2的主题.本书中的语言不是C++,但很容易翻译成C++.

它包括几个优化,包括通过平方取幂,转换为尾递归然后迭代,以及累积变量消除,并将优化与类型规则性和关联运算的概念联系起来,以证明它适用于所有这些类型.