埃拉托色尼筛选法求素数
列出大于等于2的自然数;2,3,4,5,6,7,8,9,10,11,…
取第一个数2,删掉所有2的倍数;2,3,5,7,9,11,13,14,15,…
取下一个数3,删掉所有3的倍数;3,5,7,11,13,17,19,23,…
取下一个数5,……不断筛选下去,就可找出所有素数
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
Python实现
def primes():
from functools import partial
def num_generator():
n = 2
yield 2
while True:
n += 1
yield n
def not_divisible(mod, n):
return n % mod != 0
num_list = num_generator()
while True:
num = next(num_list)
yield num
not_divisible_n = partial(not_divisible, num)
num_list = filter(not_divisible_n, num_list)
if __name__ == '__main__':
for n in primes():
if n < 50:
print(n)
else:
break
网友评论