我一直在从大量模数的维基百科中研究这个链接,这是伪代码。
function modular_pow(base, exponent, modulus)
result := 1
while exponent > 0
if (exponent mod 2 == 1):
result := (result * base) mod modulus
exponent := exponent >> 1
base = (base * base) mod modulus
return result
我不理解wiki中给出的解释。为什么我必须检查exp%2是偶数还是奇数。为什么我要做这三个操作?
答案 0 :(得分:4)
此算法是Exponentiation by Squaring算法和模运算的组合。
要了解正在发生的事情,首先要考虑exponent
是2
的力量时的情况。然后,假设exponent = 2 ^ k
,可以通过平方结果k
次来计算结果,即
res = (...((base ^ 2) ^2 ) ... ) ^2))
---------------------
k times
当exponent
不是2
的幂时,我们需要进行额外的乘法运算。事实证明,如果我们可以将exponent
除以2而没有余数,我们可以对基数求平方,并除以指数。但是,如果有余数,我们必须另外将中间结果乘以当前base
的值。
你看到的是通过应用于模乘法的平方的相同取幂。该算法使用exponent >> 1
操作表示整数除以2,与floor(exponent / 2)
相同。