计算p q 的有效方法是什么,其中q是整数?
答案 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;
}
这适用于任何monoid(T
,operator*
),其中T
由1
构成的身份元素。这包括所有数字类型。
将此扩展到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 ++。
它涵盖了几个优化,包括通过平方取幂,转换为尾递归然后迭代,以及累积变量消除,并将优化与类型规则性和关联操作的概念联系起来,以证明它适用于所有这些类型。