【问题标题】:Overflow error Python for Modular Cubes模块化多维数据集的溢出错误 Python
【发布时间】:2015-01-23 01:24:52
【问题描述】:

正在尝试解决这个问题:

对于一个正数 n,将 S(n) 定义为整数 x 之和,其中1 < x < nx^3 ≡ 1 mod n

n=91时,x有8个可能的值,分别是:9、16、22、29、53、74、79、81。 因此,S(91)=9+16+22+29+53+74+79+81=363

找到 S(13082761331670030)。

当然,我的代码适用于 S(91),当尝试查找 S(13082761331670030) 时,我得到两个不同的错误。

这是我的代码:

 def modcube(n):
     results = []
     for k in range(1,n):
            if k**3%n==1:
             results.append(k)
     return results

这会产生Overflow error: range has too many items. 当我尝试使用“xrange”而不是“range”时,我收到一条错误消息,指出 python int 太大而无法转换为 c long。我也刚刚尝试了其他几件事,但没有成功。

谁能指出我正确的方向,而不告诉我具体如何解决它?
请不要剧透。我已经做了两天了,我的下一个选择是尝试在 Java 中实现它,因为我是 Python 新手。

【问题讨论】:

  • 这可能会有所帮助。您遇到的错误是数字太大而无法存储在静态类型中的结果。 stackoverflow.com/questions/1386604/… 。希望这是您正在寻找的详细程度。
  • 13 万亿真的很大。我建议您通过寻找数学模式来寻找一种更有效的方法来编写您的解决方案;)
  • 您将无法使用蛮力解决此问题。如果您以某种方式设法每秒处理一万亿个数字,则需要三个小时。

标签: python overflow


【解决方案1】:

我认为你需要在这里理解两个概念:

1. C 和 Python 中的整数表示

您使用的 Python 实现称为 CPython,因为它是使用 C 语言编写的。在 C 中,长整数(通常)是 32 位长。这意味着它可以处理介于 -2147483647 和 2147483648 之间的整数。在 Python 中,当整数超出此范围时,它会将它们转换为任意精度的整数,其中整数的大小仅受计算机内存的限制。但是,对这些任意整数(在 Python 中称为长整数)的操作比对 32 位整数的操作慢一个数量级。

2。 rangexrange的区别:

range 生成一个列表。如果您有range(10),它会将列表[0, 1, ... 9] 完全存储在内存中。这就是为什么在内存中存储一​​个包含 13082761331670030 个项目的列表太过分了。假设每个数字都是 64 位,则需要 93 TB 的 RAM 来存储整个列表!

xrange 产生一个迭代器。它一一返回每个数字。这样,它允许对列表的每个数字执行操作,而无需将整个列表存储在内存中。但是同样,对 13082761331670030 不同的数字执行计算可能需要比你想象的更多的时间......关于xrange 的另一件事是它不适用于 Python 长整数。它被限制(出于速度原因)为 32 位整数。这就是为什么您的程序无法使用 xrange 运行的原因。


底线:欧拉计划问题(或多或少)按难度分类。你应该先从较低的问题开始。

【讨论】:

  • xrange 参数可能受 C long 类型的限制,例如,xrange(13082761331670030) 在我的 64 位系统上工作得很好。
  • python 3k 没有 xrange
  • 否,因为range 返回一个迭代器。但由于问题是关于xrange,我认为他使用的是 Python 2。
【解决方案2】:

你想要的是提示,而不是解决方案。

提示:

  1. 考虑到 13082761331670030 的 prime factors 等于以下素数:2 x 3 x 5 x 7 x 11 x 13 x 17 x 19 x 23 x 29 x 31 x 37 x 41 x 43

  2. Chinese remainder theorem

  3. 仅仅因为x^3 ≡ 1 mod n并不意味着除了3之外没有其他值满足这个条件。具体来说,prime1 ** (prime2 - 2) % prime2

我的 Python 解决方案是 86 毫秒...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多