Algo用于寻找能力,即n ^ p

时间:2012-12-24 14:27:51

标签: c++ c algorithm math

查找 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;
}

有人可以解释这个算法背后的逻辑/数学。我知道它的工作原理并为一些测试用例(干运行)进行了研究。我的意思是它是如何工作的,如何从一般的天真方法中获得效率。

1 个答案:

答案 0 :(得分:6)

这是exponentiation by squaring>>= 1是一种写/= 2的奇特方式。

背后的想法是,如果p是偶数,你可以取n^(p/2)并将其平方;当p为奇数时,p-1必须为偶数,因此您可以取n^((p-1)/2),将其平方,然后将结果乘以n以补偿1你在平方之前从p中减去。