查找 n ^ p 的算法是:
unsigned long long power(unsigned n, unsigned p)
{
unsigned long long x=1, y=n;
while(p > 0)
{
if(p&1) x *= y;
y *= y;
p >>= 1;
}
return x;
}
有人可以解释这个算法背后的逻辑/数学。我知道它的工作原理并为一些测试用例(干运行)进行了研究。我的意思是它是如何工作的,如何从一般的天真方法中获得效率。
答案 0 :(得分:6)
这是exponentiation by squaring:>>= 1
是一种写/= 2
的奇特方式。
背后的想法是,如果p
是偶数,你可以取n^(p/2)
并将其平方;当p
为奇数时,p-1
必须为偶数,因此您可以取n^((p-1)/2)
,将其平方,然后将结果乘以n
以补偿1
你在平方之前从p
中减去。