模数算术的右到左二进制方法的解释?

时间:2013-11-07 15:11:26

标签: algorithm modular-arithmetic

我一直在从大量模数的维基百科中研究这个链接,这是伪代码。

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是偶数还是奇数。为什么我要做这三个操作?

1 个答案:

答案 0 :(得分:4)

此算法是Exponentiation by Squaring算法和模运算的组合。

要了解正在发生的事情,首先要考虑exponent2的力量时的情况。然后,假设exponent = 2 ^ k,可以通过平方结果k次来计算结果,即

res = (...((base ^ 2) ^2 ) ... ) ^2))
              ---------------------
                     k times

exponent不是2的幂时,我们需要进行额外的乘法运算。事实证明,如果我们可以将exponent除以2而没有余数,我们可以对基数求平方,并除以指数。但是,如果有余数,我们必须另外将中间结果乘以当前base的值。

你看到的是通过应用于模乘法的平方的相同取幂。该算法使用exponent >> 1操作表示整数除以2,与floor(exponent / 2)相同。