3.2 线性质数筛选

文章目录

算法

  前面学过了埃拉托色尼筛选,也简称为埃氏筛。埃氏筛使用一个布尔数组来表示是否为质数,所以如果使用位集的话,可以大大节省存储空间。
  线性质数筛选,因为其算法复杂度为 O ( n ) O(n) O(n),也就是复杂度是线性的,才得名线性质数筛选。线性质数筛选是Gries与Misra于1978年发明的,有时候也叫欧拉质数筛选,是因为欧拉更早使用了这种思想。
  线性质数筛选使用了一个最小质因数minimum prime factor数组。如果一个数的最小质因数是它自己,那么这个数字无疑是质数。如果最小质因数小于自己,那么这个数是个合数。
  我们处理每一个数时,都就将这个数乘以小于或等于自己的所有最小质因数,得到的这些数作为索引,把这个数设置为合数,并设置他们的最小质因数。如此循环下去,每次循环都只处理一个数字,所以复杂度是线性的。我举个例子:

步骤234567891011121314151617181920
初始化234567891011121314151617181920
处理2232567891011121314151617181920
处理3232527831011121314151617181920
处理4232527231011121314151617181920
处理52325272321112131431617181920
处理62325272321121314151617181920
处理7232527232112132151617181920
处理82325272321121323217181920
处理9232527232112132321721920
处理1023252723211213232172192
处理1123252723211213232172192

  到了11,倍数就超过了20了,我就不再举例了。

Python实现

# _*_ coding:utf-8 _*_

def sieve(n):
    mpfs = [0] * (n + 1)
    pn = []
    for i in range(2, n + 1):
        mpf = mpfs[i]
        if mpf == 0:
            pn.append(i)
            mpf = i
        for p in pn:
            if p > mpf:
                break
            x = p * i
            if x > n:
                break
            mpfs[x] = p
    return pn


if __name__ == '__main__':
    print(sieve(20))

  测试结果为:

[2, 3, 5, 7, 11, 13, 17, 19]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值