埃拉托塞尼筛法是从2开始的整数每次取出第一个元素,自然是素数,然后将第一个元素的倍数的那些数全部去掉,一直取下去,所有取到的数都是素数。所以:
# 第一步是需要一个从2开始到无穷大的自然数序列
def series(start):
while True:
yield start
start += 1
# 第二步是筛
def filter_times(s, x):
for item in s:
if item % x:
yield item
# 第三步,入口
def eratosthenes():
s = series(2)
while True:
current = next(s)
yield current
s = filter_times(s, current)
# 下面是运行结果
>>> e = eratosthenes()
>>> next(e)
2
>>> next(e)
3
>>> next(e)
5
>>> next(e)
7
>>> next(e)
11
>>> next(e)
13
>>> next(e)
17
>>> next(e)
19
>>> next(e)
23
>>> next(e)
29
>>> next(e)
31
>>>