我正在运行以下代码,这是在具有4GB RAM的计算机上运行win8的python 2.7.6 64位的erathosthene筛选版本。
def erathosthenes_sieve2(n):
'''Tests n>1 primality using improved erathostene's method'''
if n==2:
return True
if n%2==0:
return False
limit=long(math.floor(math.sqrt(n)))
for i in xrange(3,limit+1,2):
if n%i==0:
return False
return True
当我将此函数称为足够大的数字时,例如48112959837082048697(这是一个素数)我得到以下错误。
erathosthenes_sieve2(48112959837082048697)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-28-b0a5b24a8b94> in <module>()
----> 1 erathosthenes_sieve2(48112959837082048697)
D:\repos\PrimalityTests\Eratosthenes2.py in erathosthenes_sieve2(n)
9 return False
10 limit=long(math.floor(math.sqrt(n)))
---> 11 for i in xrange(3,limit+1,2):
12 if n%i==0:
13 return False
OverflowError: Python int too large to convert to C long
可以用什么方法解决这个问题?我知道这不是一个很好的测试质数的算法,但这只是我比较不同素性测试效率的项目的一部分,所以请忽略它。
答案 0 :(得分:2)
问题是xrange
需要C long
,这意味着你不能拥有任意精度int
。但是有一种解决方法。 To quote the docs:
CPython实现细节:xrange()旨在简单明了 快速。实现可能会对此实施限制。 C Python的实现将所有参数限制为本机C long (“短”Python整数),也要求数量 元素适合原生C长。如果需要更大的范围, 可以使用itertools模块制作备用版本:
islice(count(start, step), (stop-start+step-1+2*(step<0))//step)
所以在你的情况下:
for i in islice(count(3, 2), ((limit+1)-3+2-1+2*(2<0))//2):
...