有一些众所周知的加密算法可用于计算模幂运算(a ^ b)%c(如此处从右到左的二进制方法:http://en.wikipedia.org/wiki/Modular_exponentiation)。
但是存在算法来计算形式的模幂运算(a ^(2 ^ N))%m比使用“经典”算法快吗?
非常感谢!
注意:
1)m可以是一个非常大的素数......或者不是(因此根据m不进行优化)
2)N可以大至2 ^ 32-1(N <2 ^ 32)
答案 0 :(得分:18)
如果m是素数,你可以更快地计算它。
首先用从右到左的二元法计算p = 2 N %(m-1)。
然后使用从右到左的二进制方法计算 p %m,由于Fermat's little theorem,它等于原始表达式。
如果m不是素数,但足够小,以便可以计算,你可以计算Euler的totient函数并使用Euler's Theorem。
如果不能根据m进行优化,那么您可以做的最好就是使用Montgomery reduction。
答案 1 :(得分:3)
此外,作为对Evgeny答案的概括:如果你知道m:m = p1 * p2 * ... * p{n}
的因子分解,你可以使用Euler's theorem:
计算总数phi(m)= (p1-1)*(p2-1)*...*(p{n}-1)
。
然后,您可以计算p = 2^N % phi(m)
并找到a^(2^N) % m = a^p % m
。
然而,这些都不使用2^N
的特殊形式。
答案 2 :(得分:0)
Evgeny和Rasmus给出了很好的答案。除此之外,请记住使用连续的平方功率。也就是说,将基数E
中的指数(2
)写下来:
E = b0*1 + b1*2 + ... + bk*2^k
其中每个bi
为0
或1
,bk = 1
为最后一个非零位。然后,您可以通过
N
提出一个数字,比如E
N^E (mod m) = n0^b0 * n1^b1 * ... * nk^bk (mod m)
,其中
n0 = N (mod m)
n1 = n0^2 (mod m)
n2 = n1^2 (mod m)
...
nk = n(k-1)^k (mod m)
例如,要计算28^27 mod 76
,您有N = 28
,E = 27
,m = 76
,并且计算是
27 = 1 + 2 + 8 + 16
E = b0 + b1 + b3 + b4
和
n0 = 28 (mod 76)
n1 = 28^2 (mod 76) = 24
n2 = 24^2 (mod 76) = 44
n3 = 44^2 (mod 76) = 36
n4 = 36^3 (mod 76) = 4
最后
28^27 (mod 76) = 28 * 24 * 36 * 4 (mod 76) = 20
N^ E (mod m) = n0 * n1 * n3 * n4 (mod 76)