素数测试中的Python 2.7.6(64位)溢出错误

时间:2014-05-30 22:51:50

标签: python primes largenumber

我正在运行以下代码,这是在具有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

可以用什么方法解决这个问题?我知道这不是一个很好的测试质数的算法,但这只是我比较不同素性测试效率的项目的一部分,所以请忽略它。

1 个答案:

答案 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):
    ...