Python长乘法

Ned*_*dim 4 python biginteger multiplication

我需要比当前普通Python长乘法更快的算法.

我试图找到一个体面的Karatsuba实现,但我不能.

def main():
    a=long(raw_input())
    if(a<0):
        a=a*-1
        a=((a*(a+1)/2)-1)
        print(-a)
    else:
        a=(a*(a+1))/2
        print(a)
main()
Run Code Online (Sandbox Code Playgroud)

如你所见,它并不复杂,只需几次乘法.但它必须在2.5秒内处理高达100000位的数字.

我想要一些函数片段,或者只是一个快速乘法函数实现的链接,或任何有用的东西.

cas*_*evh 26

我是DecInt(Decimal Integer)库的作者,所以我会发表一些评论.

DecInt库专门设计用于需要转换为十进制格式的非常大的整数.转换为十进制格式的问题是大多数任意精度库以二进制形式存储值.这对于利用内存来说是最快和最有效的,但是从二进制到十进制的转换通常很慢.Python的二进制到十进制转换使用O(n ^ 2)算法并且非常快速地变慢.

DecInt使用大十进制基数(通常为10 ^ 250)并以250位数的块存储非常大的数字.将非常大的数字转换为十进制格式现在在O(n)中运行.

天真或小学,乘法的运行时间为O(n ^ 2).Python使用Karatsuba乘法,其运行时间为O(n ^ 1.585).DecInt使用Karatsuba,Toom-Cook和Nussbaumer卷积的组合来获得O(n*ln(n))的运行时间.

即使DecInt具有更高的开销,O(n*ln(n))乘法和O(n)转换的组合最终将比Python的O(n ^ 1.585)乘法和O(n ^ 2)转换更快.

由于大多数计算不要求每个结果都以十进制格式显示,因此几乎每个任意精度库都使用二进制,因为这使得计算更容易.DecInt针对的是一个非常小的利基市场.对于足够大的数字,Deci将比原生Python更快地进行乘法和除法.但如果你追求纯粹的表现,像GMPY这样的图书馆将是最快的.

我很高兴您发现DecInt很有帮助.


Joh*_*ooy 9

在我的慢速笔记本上15.9毫秒.印刷品正在减慢你的速度.将二进制数转换为十进制数非常慢,这是将其打印出来的必要步骤.如果您需要输出数字,您应该尝试已经提到的DecInt ChristopheD.

DecInt会比较慢,但会使打印速度更快

In [34]: a=2**333000

In [35]: len(str(a))
Out[35]: 100243

In [36]: b=2**333001

In [37]: len(str(b))
Out[37]: 100244

In [38]: timeit c=a*b
10 loops, best of 3: 15.9 ms per loop
Run Code Online (Sandbox Code Playgroud)

这是一个稍微修改过的代码版本的示例.请注意,在此计算机上将100000位数字符串转换为长整数已经需要约1秒

In [1]: def f(a):
   ...:     if(a<0):
   ...:         a=a*-1
   ...:         a=((a*(a+1)/2)-1)
   ...:     else:
   ...:         a=(a*(a+1))/2
   ...:     return a
   ...: 

In [2]: a=3**200000

In [3]: len(str(a))
Out[3]: 95425

In [4]: timeit f(a)
10 loops, best of 3: 417 ms per loop
Run Code Online (Sandbox Code Playgroud)

  • +1:用于在尝试优化之前实际测量性能* (3认同)