模块化多维数据集的溢出错误Python

时间:2013-03-21 03:27:36

标签: python overflow

试图解决这个问题:

  

对于正数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的新手。

2 个答案:

答案 0 :(得分:2)

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

<强> 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


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

答案 1 :(得分:1)

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

提示:

  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

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