Algorithm 要计算的最快算法(a^(2^N))%m?
有一些著名的密码算法可以计算模幂(a^b)%c(就像这里的从右到左的二进制方法:) 但是,是否存在比“经典”算法更快地计算(a^(2^N))%m形式的模幂运算的算法 多谢各位 注: 1) m可以是一个非常大的素数。。。或否(因此不需要根据m进行优化)Algorithm 要计算的最快算法(a^(2^N))%m?,algorithm,cryptography,modulo,Algorithm,Cryptography,Modulo,有一些著名的密码算法可以计算模幂(a^b)%c(就像这里的从右到左的二进制方法:) 但是,是否存在比“经典”算法更快地计算(a^(2^N))%m形式的模幂运算的算法 多谢各位 注: 1) m可以是一个非常大的素数。。。或否(因此不需要根据m进行优化) 2) N可以大到2^32-1(N
2) N可以大到2^32-1(N<2^32)如果m是素数,那么计算速度会快得多 首先用从右到左的二进制方法计算p=2N%(m-1) 然后使用从右到左的二进制方法来计算ap%m,这等于原始表达式,因为
若m不是素数,但足够小,所以它可以被分解,你们可以计算Euler的toticent函数并使用它
如果不可能根据m进行优化,那么您最好使用。此外,作为对Evgeny答案的概括:如果您知道m的因式分解:
m=p1*p2*…*p{n}
,您可以使用:
计算总和φ(m)=(p1-1)*(p2-1)*…*(p{n}-1)
然后您可以计算p=2^N%phi(m),并找到a^(2^N)%m=a^p%m
然而,所有这些都没有使用特殊形式的
2^N
。埃夫根尼和拉斯穆斯给出了很好的答案。此外,记住对幂进行连续平方运算。也就是说,将指数写在base2
中,例如E
:
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)
在哪里
例如,要计算28^27 mod 76
,您需要N=28
,E=27
,m=76
,并且计算是
27 = 1 + 2 + 8 + 16
E = b0 + b1 + b3 + b4
及
最后
28^27 (mod 76) = 28 * 24 * 36 * 4 (mod 76) = 20
N^ E (mod m) = n0 * n1 * n3 * n4 (mod 76)
你知道Ronald L.Rivest的是基于这个问题的吗?选择这个问题是因为它本质上是一个串行计算。尽管它使用了
(2^(2^N))%m
。请注意,如果您知道m的因式分解,那么计算答案的速度比求幂更快。
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)