我目前正在研发一台超级计算机,将任务(查找素数)分配给其他机器。现在我正在某个地方遇到一个无限循环,我想我已将它追踪到我的素数函数,但无法确切地确定它在哪里。 我只是参与compsci,所以非常感谢任何帮助。
LB是我想要素数的范围的下限,UB上限。
谢谢!
def do_work(self,LB,UB):
msg = M_DATA
initialdata = self.recv()
n = UB
p = 2
total = 0
for p in range(LB,UB):
prime = True
for i in range(2, p):
if p % i == 0:
prime = False
break
if prime == True:
#print numbers found
#print (p)
total += 1
return (total)
答案 0 :(得分:0)
两个素数之间的距离增加,"趋于无穷大"。因此,对于相当大的LB
,查找素数所需的迭代次数变得足够大,看起来像是陷入了无限循环。这就是为什么素数难以找到的原因。
通过查看素数的定义,您可以在不做太多更改的情况下改进算法。您不需要检查每个整数小于prime
的剩余部分,但只检查低于或等于sqrt(prime)
的素数以给出明确的答案。以2为例:如果一个数字除以2,它就不会被偶数(4,6,8,10等)分开。
如果UB为奇数(即range(UB, LB, 2)
),则可以在外循环中使用range(UB + (1 - (UB % 2), LB, 2)
将所需的迭代次数减半。
对于你的内部循环,存储一个找到的素数列表,并在它低于sqrt(prime_to_check)
时迭代它。这对我们有很大的帮助。
答案 1 :(得分:0)
你测试过这个功能吗?有关从方法中提取的示例函数,请参见下文。没有进入效率和所有方面,它似乎没有无限循环,尽管你也可以按照逻辑看它。
#! /usr/bin/env python
def do_work(LB,UB):
p = 2
total = 0
primes = []
for p in range(LB,UB):
prime = True
for i in range(2, p):
if p % i == 0:
prime = False
break
if prime == True:
#print numbers found
primes.append(p)
total += 1
return LB, UB, total, primes
for i in xrange(100): print do_work(2, i)
有几点需要注意:你有msg,initialdata,n等变量没有被使用。 return语句有点奇怪。 return (total,)
将返回包含总数的元组。 return total
只返回总数。
M_DATA和self.recv()在这里是未知的,所以我冒昧地说你可能有一个与之相关的无限循环。