[英]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.