繁体   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