首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python长乘法

Python长乘法
EN

Stack Overflow用户
提问于 2009-12-03 05:11:45
回答 4查看 16.5K关注 0票数 4

我需要一种比目前普通的Python长乘法更快的算法。

我试图找到一个像样的Karatsuba实现,但我做不到。

代码语言:javascript
复制
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()

如您所见,这并不复杂,只需要几次乘法。但它必须在2.5秒内处理最多100000位数字。

我想要一些函数的片段,或者只是到更快的乘法函数的实现的链接,或者任何有帮助的东西。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-03 06:00:32

您可以看看DecInt module的实现(纯Python版本可用(Toom-Cook),尽管在使用gmpy时可能是最快的)。

票数 2
EN

Stack Overflow用户

发布于 2009-12-04 17:06:59

我是DecInt (十进制整数)库的作者,所以我将做一些评论。

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的目标是非常小的利基市场。对于足够大的数字,DecInt的乘法和除法运算速度将比原生Python快。但是如果你追求的是纯粹的性能,像GMPY这样的库将是最快的。

我很高兴你发现DecInt很有帮助。

票数 27
EN

Stack Overflow用户

发布于 2009-12-03 06:10:14

15.9毫秒在我的慢速笔记本上。是指纹让你慢了下来。将二进制数转换为十进制数的速度相当慢,这是打印输出所必需的步骤。如果你需要输出这个数字,你应该尝试一下前面提到的DecInt ChristopheD。

DecInt的乘法速度会更慢,但打印速度会快得多

代码语言:javascript
复制
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

下面是一个示例,其中包含略微修改过的代码版本。请注意,在此计算机上将100000位字符串转换为长字符串需要大约1秒的时间

代码语言:javascript
复制
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
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1835857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档