平方求幂
当我通过平方搜索
幂运算时,我在那里找到了递归方法,但是后来我偶然发现了这个伪代码,我无法完全理解。
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;
}
如果您可以简单地给出一些见解,那将会有很大的帮助
回答:
该代码依赖于以下事实:
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
。
以上是 平方求幂 的全部内容, 来源链接: utcz.com/qa/397822.html