Python溢出错误:无法安装';长';转换为一个索引=大小为的整数

Python溢出错误:无法安装';长';转换为一个索引=大小为的整数,python,rsa,primes,Python,Rsa,Primes,我想用我在网上找到的一个算法生成两个非常大的素数,这个算法稍微有点变化 我在第5行得到这个错误: Python OverflowError: cannot fit 'long' into an index=sized integer 我的代码: import math def atkin(end): if end < 2: return [] lng = ((end/2)-1+end%2) **sieve = [True]*(lng+1)**

我想用我在网上找到的一个算法生成两个非常大的素数,这个算法稍微有点变化

我在第5行得到这个错误:

Python OverflowError: cannot fit 'long' into an index=sized integer 
我的代码:

import math
def atkin(end):  
    if end < 2: return []  
    lng = ((end/2)-1+end%2)   
    **sieve = [True]*(lng+1)**  
    for i in range(int(math.sqrt(end)) >> 1):
        if not sieve[i]: continue  
        for j in range( (i*(i + 3) << 1) + 3, lng, (i << 1) + 3):  
            sieve[j] = False  
    primes = [2]  
    primes.extend([(i << 1) + 3 for i in range(lng) if sieve[i]])  
    return primes
导入数学
戴夫·阿特金(完):
如果结束<2:返回[]
液化天然气=((结束/2)-1+结束%2)
**筛子=[正确]*(液化天然气+1)**
对于范围内的i(int(math.sqrt(end))>>1):
如果没有筛选[i]:继续

对于范围内的j((i*(i+3)第5行trues,分配一个非常长的列表,其中包含
True
值。可能您的
lng
太大,无法在内存中容纳该列表

我无法准确地再现您的错误;在最坏的情况下,我只得到了一个
内存错误


可能算法还可以(尽管我不能打赌),只需尝试一个较小的数字。

以下代码演示了您遇到的问题:

import sys
x = [True]*(sys.maxint+1)
这将产生一个
溢出错误
。如果您这样做:

x = [True]*(sys.maxint)
然后你应该得到一个
内存错误


事情就是这样。Python可以用自己的可扩展数据类型处理任意大的整数。但是,当您尝试创建如上所述的列表时,Python尝试将小列表的重复次数(即Python整数)转换为Py_ssize_t类型的C整数。Py_ssize_t的定义因您的构建而异但是可以是ssize_t、long或int。本质上,Python在进行转换之前会检查Python整数是否适合C整数类型,如果它不起作用,则会引发溢出错误。

您是否对小数字使用过此代码?如果您想使用大数字,则应尝试使用库。此库有一个Python包装器,可以使用ked对我来说很好。是的,代码对较小的数字运行良好。我用它检查了介于1和100之间的素数,结果是正确的。不过感谢链接,我会检查它。使用这里讨论的算法,有很多方法可以快速获得较大的素数:对于python3,它是
sys.maxsize
而不是
sys.maxint