如何提高Python中大数模乘法的效率

如何提高Python中大数模乘法的效率,python,python-3.x,gmpy,Python,Python 3.x,Gmpy,我正在使用python3,但没有为一些简单的算法定制任何库。控制计算效率的运算是许多2048位值的乘法: length=len(array) res=1 for x in range(length): res=(res*int(array[x])) ret=res%n2 为了让您了解情况,需要约3940秒才能使10000次乘法模成为一个数字,每次乘法一次: Intel Core i5 CPU M 560@2.67GHz×4,8GB内存,运行Ubuntu 12.04

我正在使用python3,但没有为一些简单的算法定制任何库。控制计算效率的运算是许多2048位值的乘法:

length=len(array)
res=1
for x in range(length):
       res=(res*int(array[x]))
       ret=res%n2
为了让您了解情况,需要约3940秒才能使10000次乘法模成为一个数字,每次乘法一次:

Intel Core i5 CPU M 560@2.67GHz×4,8GB内存,运行Ubuntu 12.04 32位
机器


使用gmpy2这样的库来增强它是否有意义,或者没有任何优势?

您似乎是在先计算所有数字的乘积,然后取余数,而不是利用模乘的特性:
a*b*c mod p==(a*b mod p)*c mod p
。将10000个2048位数字乘以某些
n
,所需时间非常短:

In [1]: import random

In [2]: array = [random.randrange(2**2048) for i in range(10000)]

In [3]: n = random.randrange(2**2048)

In [4]: prod = 1

In [5]: %%time
   ...: for e in array:
   ...:         prod *= e
   ...:         prod %= n
   ...: 
CPU times: user 210 ms, sys: 4.07 ms, total: 214 ms
Wall time: 206 ms
对于你,我建议:

array = map(int, array)
prod = 1
for x in array:
    prod *= x
    prod %= n2

您可以使用字符串编写自己的乘法函数/类,这可能不是最好的方法。您的意思是什么?我不明白。您的代码中必须存在复制粘贴错误。还有,n2是什么?@hop它是2048位number@curious:Python是从1991年Begging开始设计的,它让
for
迭代一系列项目,而不是计算数字,并使用这些数字作为您首先需要的项目的索引,就像在C或Javascript中一样。因此,Python在可读性和性能方面都得到了优化,可以对数组中的项使用
,而不是对范围内的x(len(array)):…使用
。。。array[x]
除了映射之外,与上一个代码片段相比,您的代码片段与我的代码片段有什么不同?实际上,我并没有按照您所说的做。我正在为每一次乘法生成中间模块化产品。不同的是,在每次迭代中计算
prod=prod*e
prodfin=prod%n
,而我发布的第二个代码段计算
prod=prod%n
(这使得
prod
更小,简化了乘法运算而不影响最终结果)。如果您真的需要中间被乘数,那么您将遭受
prod
的二次爆炸,移动到基于C的GMP库最多只会给您带来乘法运算的加速。