试图解决这个问题:
对于正数n,将S(n)定义为整数x的总和,
1 < x < n
和x^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的新手。
答案 0 :(得分:2)
我认为你需要理解两个概念:
<强> 1。 C和Python中的整数表示
您使用的Python实现称为CPython,因为它是使用C语言编写的。在C中,长整数(通常)是32位长。这意味着它可以使用-2147483647和2147483648之间的整数。在Python中,当一个整数超出此范围时,它会将它们转换为任意精度整数,其中整数的大小仅受计算机内存的限制。但是,对那些任意整数(在Python中称为长整数)的操作比在32位整数上的操作慢一个数量级。
<强> 2。 range
和xrange
之间的差异:
range
生成一个列表。如果您有range(10)
,它会将列表[0, 1, ... 9]
完全存储在内存中。这就是为什么在内存中存储13082761331670030项目列表太过分了。假设每个数字是64位,则需要93 TB的RAM来存储整个列表!
xrange
生成一个迭代器。它逐个返回每个数字。这样,它允许对列表的每个数字执行操作,而无需将整个列表存储在内存中。但是,再一次,在13082761331670030上执行不同数字的计算可能需要更多的时间来考虑... xrange
的另一个原因是它不适用于Python长整数;由于速度原因,它被限制为32位整数。这就是为什么您的程序无法使用xrange
。
底线:项目欧拉问题(或多或少)按难易程度分类。你应该先从较低的问题开始。
答案 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
仅仅因为x^3 ≡ 1 mod n
并不意味着除了3之外没有其他值满足此条件。具体而言,prime1 ** (prime2 - 2) % prime2
我的Python解决方案是86毫秒...