所以我试图为GIMPS创建一个python脚本(找到mercenne primes),但每次运行它都会崩溃。有没有办法可以改变它,所以它不会使用这么多的CPU?这是脚本:
n = 77232917
restart = True
y = range(2,0.5*n - (n%2))
def restart_for(d):
for x in d:
if (2**n - 1) % x == 0:
n += 1
break
elif x == 0.5*n - (n%2):
print n
n += 1
if restart == True:
restart_for(range(2,0.5*n - n%2))
restart_for(range(2,0.5*n - n%2))
注意:我从大约77000000开始,因为那是最后一个主要的
答案 0 :(得分:0)
有一种技术涉及删除代码块,直到找到破坏整个程序的部分为止。
尝试将素数更改为最低素数,将其递增直至其中断。这应该让你很好地了解它是什么打破了它。如果没有,请尝试更改找到素数的算法,并确保方程和语句也正确。如果这不起作用,请尝试删除elif然后如果它仍然中断,请删除if。向后工作直到找到它的工作原理。一旦你发现程序运行,你就会知道你拿出的代码块是问题所在,你可以查看该块是如何编写的。
所有这些都是开发人员的工作。否则,你只是在等待成为一个客户。
答案 1 :(得分:0)
这个程序永远不会完成,并且总会崩溃。
由于restart
始终为True
,因此它将继续无限循环,直到您的RAM耗尽或达到最大入侵深度。
即使没有这个,我想知道整个算法的作用:你总是调用具有相同定义范围的函数restart_for()
,它只取决于n
。
n
不可能减少,因为对于for
- 循环的每次迭代,你继续增加1。
这意味着n
会在一段时间后变得过大。
由于函数一直在调用自身,因此它会在某些时候耗尽RAM,因为来自函数的每个单独调用的所有数据仍然存储在内存中(如果函数是{{{ 1}} - 环)。
这也解释了您上面描述的错误,代码告诉您while
未定义:这是因为n
在RAM中不再存在。因为你的内存不足,所以Python决定删除任何它认为不再需要的东西,以便腾出更多空间。由于n
是所有变量中最长的定义,因此它首先删除了这个变量。