任意个数的素数求解
解析
- 给定一个自然数序列 1 ~ N
- 去掉自然数序列中2的倍数(不包含2) 1 2 3
45678910111213141516~ N - 去掉剩余序列中3的倍数(不包含3)1 2 3 5 7
9~ 11 131516 N - 去掉剩余序列中5的倍数(不包含5)。。。
如此循环下去我们不难发现规律:每遇到一个素数,则删除该素数在自然数序列中的倍数的数,那么序列的下一个数字,必然是下一个素数。
实现
1. 创建自然数列
# 使用生成器直接取一个无限的奇数列(即去掉素数2的倍数的剩余数列)
# 需要注意的是这个奇数列中不包含素数2,需要在取素数的时候特殊添加
def odd_generator():
n = 1
while True:
n += 2
yield n
2. 需要去掉剩余数列当前素数的倍数的通用方法
# 这个方法返回的是一个函数的引用,需要传入x参数
# 需要注意 我们使用内置filter()方法来出入参数
def remove_multiple_n(n):
return lambda x: x % n > 0
3. 生成器来逐个生成素数
# 别忘了补充弹出素数2
def prime():
yield 2
# 获取自然数列
odd_iter = odd_generator()
while True:
# 获取自然数列的下一个值(即为素数)并弹出
n = next(odd_iter)
yield n
# 去掉当前素数倍数--刷新自然序列
odd_iter = filter(remove_multiple_n(n), odd_iter)
程序
def odd_generate():
n = 1
while True:
n += 2
yield n
def remove_multiple_n(n):
return x: x % n > 0
def prime():
yield 2
odd_iter = odd_generate()
while True:
n = next(odd_iter)
yield n
odd_iter = filter(remove_mutiple_n(n), odd_iter)
if __name__ == '__main__':
# 前十位素数
pr = prime()
for i in range(10):
print(next(pr)
# 输出
3
5
7
11
13
17
19
23
29