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