【问题标题】:Python OverflowError: cannot fit 'long' into an index=sized integerPython OverflowError:无法将“长”放入索引 = 大小的整数中
【发布时间】:2011-06-12 17:03:25
【问题描述】:

我想使用我在网上找到并稍作改动的算法生成两个非常大的素数。

我在第 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

如何解决我的错误?

如果您知道生成大素数的更好方法,那也会很有帮助。

【问题讨论】:

  • 你试过这个代码来处理小数字吗?如果您想使用大数字,您应该尝试gmplib.org 库。这个库有一个 Python 包装器,对我来说效果很好。
  • 是的,该代码适用于较小的数字。我用它检查了 1 到 100 之间的素数,它是正确的。谢谢你的链接,我去看看。
  • 这里讨论的算法有很多方法可以快速获得更大的素数:stackoverflow.com/questions/2897297/…

标签: python rsa primes


【解决方案1】:

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

import sys
x = [True]*(sys.maxint+1)

产生OverflowError。如果你这样做:

x = [True]*(sys.maxint)

那么你应该得到一个MemoryError

这就是正在发生的事情。 Python 可以使用自己的可扩展数据类型处理任意大的整数。但是,当您尝试像上面那样创建列表时,Python 会尝试将小列表的重复次数(Python 整数)转换为 Py_ssize_t 类型的 C 整数。 Py_ssize_t 的定义取决于您的构建,但可以是 ssize_t、long 或 int。从本质上讲,Python 在进行转换之前会检查 Python 整数是否适合 C 整数类型,如果它不起作用,则会引发 OverflowError。

【讨论】:

  • 对于 python3 它是 sys.maxsize 而不是 sys.maxint
【解决方案2】:

第 5 行为 true,以分配一个非常长的列表,其中包含 True 值。可能您的lng 太大而无法在内存中容纳该列表?

我无法准确重现您的错误;在最坏的情况下,我最终只得到了MemoryError

可能算法没问题(虽然我不能打赌),只是尝试一个较小的数字。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多