【发布时间】:2018-11-08 08:33:53
【问题描述】:
我正在尝试使用 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... 那么我到底哪里出错了?
【问题讨论】:
-
您必须在某处记录现有的主要因素。虽然我理解您的尝试,但如果它有效,out 将非常低效。
-
即使你得到这个工作,它也不会是 Eratosthenes 的筛子。这将是审判部门。真正的埃拉托色尼筛法不涉及可分性检验。
-
@Kevin:不过,生成器在创建后永远不需要使用
N变量。重新分配n是一个更大的问题。 -
实际上,我是通过查看在 Haskell 中实现此功能的计算机发烧友视频实现的。要么我理解错了,要么他们把它称为埃拉托色尼筛子是错误的。
-
naturals只是itertools.count