栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

1.6 线性质数筛选

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1.6 线性质数筛选

文章目录
  • 算法
  • Python实现

算法

  前面学过了埃拉托色尼筛选,也简称为埃氏筛。埃氏筛使用一个布尔数组来表示是否为质数,所以如果使用位集的话,可以大大节省存储空间。
  线性质数筛选,因为其算法复杂度为 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]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/829691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号