模数大数的力量

时间:2011-11-27 16:43:19

标签: algorithm math language-agnostic modulus

我正在尝试实施SAFER +算法。该算法需要找到幂函数的模数如下:

pow(45, x) mod 257

变量x是一个字节,因此范围从0到255.因此,如果使用32位或64位整数实现,则幂函数的结果可能非常大,导致值不正确。

我该如何进行此计算?

4 个答案:

答案 0 :(得分:20)

一些伪代码

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

并致电

powermod(45, x, 257)    

答案 1 :(得分:13)

通过重复平方进行取幂,每次操作后减去模数。这是一种非常标准的技术。

一个有效的例子:45^13 mod 257

  1. 首先计算45 ^ 2,45 ^ 4,45 ^ 8 mod 257:

    45 ^ 2 mod 257 = 2025 mod 257 = 226

    45 ^ 4 mod 257 = 226 ^ 2 mod 257 = 51076 mod 257 = 190

    45 ^ 8 mod 257 = 190 ^ 2 mod 257 = 36100 mod 257 = 120

  2. 然后使用13的二进制扩展来组合这些以得到结果:

    45 ^ 13 mod 257 = 45 ^ 1 * 45 ^ 4 * 45 ^ 8 mod 257

    45 ^ 13 mod 257 = 45 * 190 * 120 mod 257

    45 ^ 13 mod 257 = 8550 * 120 mod 257

    45 ^ 13 mod 257 = 69 * 120 mod 257

    45 ^ 13 mod 257 = 8280 mod 257

    45 ^ 13 mod 257 = 56

  3. 请注意,计算的中间结果永远不会大于257 * 257,因此可以很容易地以32位整数类型执行。

答案 2 :(得分:5)

基本方法是根据指数位进行平方或乘法,并在每一步执行模数减少。该算法称为(binary) modular exponentiation

答案 3 :(得分:3)

考虑简单的身份:

mod(A^2,p) = mod(A,p)*mod(A,p)

另请注意

A^4 = (A^2)^2

如果您知道要计算的最终指数的二进制表示,则可以轻松计算其他权力。