埃氏筛法

首先,列出从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, ...

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

用Python来实现这个算法,可以先构造一个从3开始的奇数序列:

def_odd_iter():

          n =1

          while True:        

                 n = n +2

                 yield  n


注意这是一个生成器,并且是一个无限序列。

然后定义一个筛选函数:

def_not_divisible(n):

     return    lambda x: x % n >0

最后,定义一个生成器,不断返回下一个素数:

defprimes():

    yield 2

     it = _odd_iter()# 初始序列

     while True:        

            n = next(it)# 返回序列的第一个数yieldn        it = filter(_not_divisible(n), it)# 

构造新序列

这个生成器先返回第一个素数2,然后,利用filter()不断产生筛选后的新的序列。

由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件:

# 打印1000以内的素数:

for n in primes():

    if  n <1000:        

         print(n)

    else:

          break

注意到Iterator是惰性计算的序列,所以我们可以用Python表示“全体自然数”,“全体素数”这样的序列,而代码非常简洁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • python内建的filter用于过滤序列,也可以接收函数。 和map()不同的是,filter()把传入的函数依...
    世外大帝阅读 867评论 0 0
  • 2112年1月2日,是我二十岁的生日,很重要的一天。 这一天意味着我可以继承我这一族系的所有遗产。也意味着我可以为...
    深海鱼不吃鱼阅读 286评论 0 0
  • 这是我第一次尝试在公众号上写文章,因为不会,开始有一个捉摸期,所以我的第一条公众号的内容是:我只是看看怎么弄! 不...
    庄雯皎阅读 258评论 0 0
  • 佛陀常把佛祖挂在嘴上 心在繁华的街市彷徨 诗人常把生死写进疯狂 世人皆醉他独醒 是他的模样 我们呢 而常把信仰遗忘...
    萧路遥阅读 288评论 6 7
  • 最初想用数位板是因为我看到可汗学院里面的老师用数位板录制视频用于教学,感觉蛮好玩的。再就是,以前做PPT浪费了大量...
    1Z实验室阿凯阅读 10,674评论 0 8