簡體   English   中英

有人能幫我找出我寫的素數生成器函數中的錯誤嗎

[英]Can someone help me identify the error in the prime generator function I wrote

當我列出前 25 個素數時,有人可以幫助我為什么在我的生成器中得到某些數字,如“27”和“35”? 我知道有更有效的方法,比如 Erathosthenes 的篩選,但我擔心這段代碼中的一些錯誤。 謝謝!

def next_prime():
    num = 2
    while True:
        for i in range(1, num+1):
            if (i != 1) and (num % i == 0):
                # print(num, " is not prime")
                num += 1
        yield num
        num += 1

primes = next_prime()
[print(next(primes)) for i in range(25)]

下面的輸出 - 突出顯示了一些合數

3 5 7 11 13 17 19 23 27 29 31 35 37 41 43 47 53 59 61 67 71 73 79 83 87

您在for循環中增加num ,但您不能簡單地這樣做,因為那時i不會重置為1 ,因此您會錯過某些檢查。

因此,您應該break ,然后增加num並讓循環檢查下一個數字。 因此,我們可以使用for - else僅在循環成功(即沒有到達break語句)時產生一個數字。

現在會出現的另一個問題是,沒有數字是素數了。 這是因為您的range(1, num+1)包括num ,並且數字始終可以被自身整除。 因此,范圍應該介於1 (或更好的2 )和num (不包括)之間:

def next_prime():
    num = 2
    while True:
        for i in range(2, num):
            if num % i == 0:
                break
        else:
            yield num
        num += 1

然而,上述方法不是很有效。 我們可以使這種方式更快。 例如所有偶數,除了兩個不是素數,我們可以這樣改寫為:

def next_prime():
    yield 2
    num = 3
    while True:
        for i in range(2, num):
            if not num % i:
                break
        else:
            yield num
        num += 2

此外,我們只需要檢查 √n 以內的數n ,因為如果n可以被a大於n平方根的數a整除,那么存在一個小於平方的數b = n / a根:

from math import sqrt, ceil

def next_prime():
    yield 2
    num = 3
    while True:
        for i in range(3, ceil(sqrt(num))+1, 2):
            if not num % i:
                break
        else:
            yield num
        num += 2

暫無
暫無

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

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