Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 要计算的最快算法(a^(2^N))%m?_Algorithm_Cryptography_Modulo - Fatal编程技术网

Algorithm 要计算的最快算法(a^(2^N))%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

有一些著名的密码算法可以计算模幂(a^b)%c(就像这里的从右到左的二进制方法:)

但是,是否存在比“经典”算法更快地计算(a^(2^N))%m形式的模幂运算的算法

多谢各位

注:

1) m可以是一个非常大的素数。。。或否(因此不需要根据m进行优化)


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

埃夫根尼和拉斯穆斯给出了很好的答案。此外,记住对幂进行连续平方运算。也就是说,将指数写在base
2
中,例如
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)