(Python)素数函数无限循环

时间:2014-12-06 10:41:03

标签: python infinite-loop primes

我目前正在研发一台超级计算机,将任务(查找素数)分配给其他机器。现在我正在某个地方遇到一个无限循环,我想我已将它追踪到我的素数函数,但无法确切地确定它在哪里。 我只是参与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)

2 个答案:

答案 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()在这里是未知的,所以我冒昧地说你可能有一个与之相关的无限循环。

相关问题