一尘不染

平方求幂

algorithm

当我通过平方搜索
幂运算时,我在那里找到了递归方法,但是后来我偶然发现了这个伪代码,我无法完全理解。

function powermod(base, exponent, modulus) {
    if (base < 1 || exponent < 0 || modulus < 1)
        return -1

    result = 1;
    while (exponent > 0) {
       if ((exponent % 2) == 1) {
           result = (result * base) % modulus;
       }
       base = (base * base) % modulus;
       exponent = floor(exponent / 2);
    }
    return result;
}

如果您可以简单地给出一些见解,那将会有很大的帮助


阅读 357

收藏
2020-07-28

共1个答案

一尘不染

该代码依赖于以下事实:

x^y == (x*x)^(y/2)

循环正是这样做的:在对底进行平方时将指数除以二。

一个例子:

让我们考虑计算3 ^ 13的结果。您可以将指数(13)写成二进制幂的和:3^(8+4+1)。然后:3^13 = 3^8 * 3^4 * 3^1

这种分解在二元权力是由完成%2/2在代码中完成,使用上述exponained的理由。

一步步:

您从开始3^13。那样13%2==1,您将结果乘以3,因为答案 确实 有一个因数3^1

然后,将指数除以2,然后将底数(9^6 == 3^12)平方。因为6%2==0,这意味着答案 没有 因素3^2

然后,将指数除以2,然后将底数(81^3 == 3^12)平方。那样3%2==1,您将结果乘以81,因为答案 确实 有一个因数3^4

然后,将指数除以2,然后将底数(6561^1 == 3^8)平方。如此1%2==1,您将结果乘以6561,因为答案 确实
有一个因数3^8

2020-07-28