计算最快的算法(a ^(2 ^ N))%m?

时间:2012-03-22 07:35:43

标签: algorithm cryptography modulo

有一些众所周知的加密算法可用于计算模幂运算(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)

3 个答案:

答案 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

其中每个bi01bk = 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 = 28E = 27m = 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)