簡體   English   中英

(Python)質數函數無限循環

[英](Python) Prime Number Function infinite loop

我目前正在使用超級計算機將任務(查找質數)分配給其他計算機。 現在,我在某個地方遇到了無限循環,我想我已經找到了它的質數函數,但無法確切知道它在哪里。 我只是對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)

兩個質數之間的距離增加並且“趨於無窮”。 因此,對於相當大的LB ,找到質數所需的迭代次數變得足夠大,以至於看起來您陷入了無限循環。 這就是為什么很難找到素數的原因。

您可以通過查看質數的定義來改進算法而無需進行太多更改。 您不需要檢查每個整數是否小於prime數的余prime ,而只需檢查小於或等於sqrt(prime)即可得出確定的答案。 以2為例:如果一個數字不除以2,則不會被偶數(4、6、8、10等)划分。

然后,如果UB是奇數(即range(UB + (1 - (UB % 2), LB, 2) ),則可以在外循環中使用range(UB, LB, 2)將所需的迭代次數減半。

對於您的內部循環,存儲找到的素數列表,並在其低於sqrt(prime_to_check)時對其進行迭代。 那會很有幫助。

您測試過功能了嗎? 請參見下文,以了解從您的方法中提取的示例函數。 盡管您可以從邏輯上也看到它,但沒有深入了解它的效率和所有方面,它似乎沒有無限循環。

#! /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,)將返回一個包含total的元組。 return total將只返回總數。

M_DATA和self.recv()在這里是未知的,因此我敢冒險您可能有一個與之相關的無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM