繁体   English   中英

使用生成器生成无限质数序列

[英]Generating infinite prime number squence using generators

我正在尝试使用Eratosthenes筛子生成无限质数序列。 这是代码:

def naturals()->int:
    '''Generate natural numbers indefinitely'''
    i = 1
    while True:
        yield i
        i = i+1

def primes():
    N = naturals()
    _ = next(N)#Pop out 1
    while True:
        n = next(N)
        yield n
        N = (i for i in N if i%n != 0)

但是,上面的生成器仅产生2,3,4 ...那么我到底在哪里出错?

如果您对后续的划分检查感到满意,则可以实施更通用的版本:

  • 用2初始化序列
  • 从3开始并仅检查奇数...
  • 如果N无法被任何现有素数整除,
  • ...将其添加到素数列表中并发出。
  • N增加2。

样式中的代码:

def primes():
    sofar = [2]
    n = 3
    yield 2

    while True:
        if all(n%i for i in sofar):
            sofar.append(n)
            yield n
        n += 2

在N = 250,000附近,速度减慢至100灌注/秒,并从那里继续退化。

一次完成一个步骤:

while True:
    n = next(N)

n是2。

    yield n
    N = (i for i in N if i%n != 0)

这会将N包装在生成器中,该生成器将删除n倍数的值。 请注意,我们说的是n倍数,而不是2的倍数。

在下一个循环中,我们从naturals()中获取下一个元素,得到3,对n模数化,得到2,得到1,但不为零。 因此,我们将3分配给n并产生它。 然后,我们将前一个N包装到另一个生成器中,该生成器执行与前一个包装器相同的操作,这会降低它的速度,但没有其他作用。

然后,在下一个循环中,我们从naturals()抓取下一个元素,将其对n取3的模数为4,并得到1,而不为零。 然后,我们再次进行模量计算,得到相同的结果。 所以我们给n赋4并产生它...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM