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

时间:2011-04-11 18:00:06

标签: c++ math exponentiation

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

3 个答案:

答案 0 :(得分:42)

Exponentiation by squaring仅使用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;
}

这适用于任何monoidToperator*),其中T1构成的身份元素。这包括所有数字类型。

将此扩展到signed q很简单:只需将上面的结果除以q的绝对值(但通常在计算绝对值时要小心)。

答案 1 :(得分:12)

假设^表示取幂,q是运行时变量,请使用std::pow(double, int)

编辑:为了完整性,由于对此答案的评论:我问了关于缺失函数的问题Why was std::pow(double, int) removed from C++11?,实际上{C} 0x中没有删除pow(double, int),只是语言是改变。但是,由于结果准确性问题,图书馆似乎无法实际优化它。

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

答案 2 :(得分:9)

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

任何类型的p和任何正整数q 的高效幂函数的开发是an entire section, 3.2, in Stepanov's and McJones's book Elements of Programming的主题。本书中的语言不是C ++,而是很容易翻译成C ++。

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