当前位置:   article > 正文

埃氏筛法求素数

埃氏筛法求素数

计算素数(除了1和它本身以外不再有其他因数的自然数)的一个方法是埃氏筛法,它的算法理解起来非常简单:

首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不断筛下去,就可以得到所有的素数。

  1. #!usr/bin/env python
  2. #-*-coding=utf-8-*-
  3. def _odd_inter(): #先构造一个从3开始的奇数序列
  4. n = 1
  5. while True:
  6. n = n+2
  7. yield n
  8. def _not_divisible(n): #筛选函数
  9. return lambda x: x%n >0
  10. def primes(): #定义一个生成器,不断返回下一个素数
  11. yield 2
  12. it = _odd_inter() # 初始序列
  13. while True:
  14. n = next(it) # 返回序列的第一个数
  15. yield n
  16. # 构造新序列
  17. it = filter(_not_divisible(n),it)
  18. #出错:这里是_not_divisible(n),而非_not_divisible();写_not_divisible,也不对,跳过了对n的筛选
  19. #给无限序列primes()设置退出循环的条件:打印1000以内的素数
  20. for n in primes():
  21. if n < 1000:
  22. print(n)
  23. else:
  24. break

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/516070
推荐阅读
相关标签
  

闽ICP备14008679号