index > Algebra > prime sieve


主要内容

本篇只收录较快的线性筛法,作用就是求 2 到 n 的所有素数,顺便得到判断数组。

单纯求素数,标记所有合数。(常用)

const int MAXN = -1;//10000005
int prime[MAXN],pnum;
bool is_composite[MAXN];void sieve(const int &n) {// 1 is exception//clock_t begin = clock();for (int i = 2; i < n; ++i) {if (!is_composite[i]) prime[++pnum]=i;for (int j = 1; j <=pnum  && i * prime[j] < n; ++j) {is_composite[i * prime[j]] = true;if (i % prime[j] == 0) break;}}//cout << (double) (clock() - begin) / CLOCKS_PER_SEC << endl;
}

求素数的同时,求所有合数最小的质因子。

const int MAXN = -1;//10000005
int prime[MAXN], pnum;
int min_composite[MAXN];void sieve(const int &n) {// 1 is exception//clock_t begin = clock();for (int i = 2; i < n; ++i) {if (!min_composite[i]) {prime[++pnum] = i;min_composite[i] = i;}for (int j = 1; j <= pnum && prime[j] <= min_composite[i] && i * prime[j] < n; ++j) {min_composite[i * prime[j]] = prime[j];
//            if (i % prime[j] == 0) break;}}//cout << (double) (clock() - begin) / CLOCKS_PER_SEC << endl;
}

&& prime[j] <= min_composite[i]if (i % prime[j] == 0) break;相差无几,任选其一即可。

理解

Sieve of Eratosthenes 的思路很好理解,每次装入一个素数就把所有这个数的倍数都划掉。但是容易发现,很多数会被多次划掉。时间复杂度是O(nloglogn)O(n log log n )O(nloglogn)的,不太理想。

Euler’s sieve 的角度其实不太一样(尽管两者代码很相似)。为了理解,最好优先看第二份代码。下面是我的个人理解。

既然不希望合数被重复删去,那么应该尽量让所有合数是被最小素因子去掉的。这就构成了一种转移。假设pipipi是iii的最小素因子,那么对于所有小于等于pipipi的素数pjpjpj有,pj∗ipj*ipj∗i是一个合数,并且以pjpjpj为最小素因子。

当枚举到iii的时候,已经有了不超过iii的所有最小素数,那就可以通过遍历i∗prime[j]i * prime_{[j]}i∗prime[j]​ 依此把后面的数给删去。

被删去的状态,是从最小素数集合prime[j]prime_{[j]}prime[j]​中转移过来的,所以是可以理解新的合数是被最小的素因子删去了。

但不能一直删,当i%prime[j]==0i \% prime[j] == 0i%prime[j]==0 成立,说明此时的prime[j]prime[j]prime[j]恰好是iii的最小素数,KaTeX parse error: Undefined control sequence: \* at position 3: i \̲*̲ prime\_{[j+1]}之后的倍数,应该由iii作为最小素因子时删去。

prime[j]<=mincomposite[i]prime[j] <= min_composite[i]prime[j]<=minc​omposite[i]也是类似的判断。

虽然不知道如何验证,但是实事便是,所有的数都可以被常数次遍历。一般情况我们不需要最小素因子,所以可以优化成布尔型经行遍历。

花边

这个算法最早的渊源是和欧拉有关的,但好像不是欧拉自己提出的。

Euler’s proof of the zeta product formula contains a version of the sieve of Eratosthenes in which each composite number is eliminated exactly once.[8] The same sieve was rediscovered and observed to take linear time by Gries & Misra (1978).[19] It, too, starts with a list of numbers from 2 to n in order.

后人观测到了这个算法就发了一篇 CACM 期刊论文,而巨人欧拉只是以这个方法用来辅助一下更重要的证明(黎曼),没当回事儿···ORZ

但线性筛的概念,可以拓展到类积性函数的求法。去理解这个算法有更长远的意义。

参考

Math note — linear sieve By Nisiyama_Suzune 这篇博客有讲到线性筛

Sieve of Eratosthenes

prime sieve 素数筛相关推荐

  1. UVA 12101 Prime Path (素数筛+BFS)

    题意:给一个四位数的素数,求通过几步变换(一次只能换一个位置的数,且变换过程中只能出现素数)变为目标四位数 分析:素数筛法+BFS,BFS时更换一个数字如果符合条件就加入队列 代码: #include ...

  2. 素数筛 Prime sieve

    文章目录 素数筛 Prime sieve 一.素数的判定 二.埃氏筛法 三.欧拉筛法 四.六倍原理 素数筛 Prime sieve 素数又称质数:一个大于 1 的自然数,除了 1 和它自身外,不能被其 ...

  3. Prime Number Aizu - 0009(素数筛)

    题意: 给一个数n,问1~n内有多少个素数 题目: Write a program which reads an integer n and prints the number of prime nu ...

  4. Python:实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法(附完整源码)

    Python:实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法 # flake8: noqa def prime_sieve_eratosthenes(num):prim ...

  5. 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)

    原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收录在github 求star 前言 现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几 ...

  6. 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)

    [目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...

  7. M - Help Hanzo (大数区间素数筛)

    题目 思路:先对1e5之内的素数筛好,用这些素数筛去大区间内的合数. #include<cstdio> #include<cstring> #include<iostre ...

  8. M - Help Hanzo(模拟素数筛思想+优化)

    题目意思就是求[a,b]的素数个数.这道题我一看枚举不就完了吗? 但是看到那个2^31次方就知道了,如果枚举肯定TLE了: 所以百度了一下说模拟素数筛.我觉得我自己有必要回忆一下素数筛原理. #inc ...

  9. C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法

    前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...

最新文章

  1. synchronize
  2. Spring学习笔记(二)——Spring相关配置属性注入Junit整合
  3. HDU 2899 三分
  4. pwm 正弦波_CC6420单相正弦波直流无刷马达驱动应用指南
  5. RabbitMQ入门(二)-helloworld
  6. python培训学习方法_python编程学习方法及技术进阶建议
  7. lis25ba_LIS25BA - MEMS数字输出运动传感器:低噪声,高带宽,3轴加速度计,带TDM接口 - STMicroelectronics...
  8. 路径 (Path)–nodejs
  9. Nginx 的线程池与性能剖析【转载】
  10. spring事务管理中,用try-catch处理了异常,事务也会回滚?
  11. 并发编程的数据竞争问题以及解决之道
  12. php 变量 类名,关于php:使用变量类名和静态方法时出错
  13. Web前端新手一定要知道的几个框架!
  14. zabbix 之 配置iptables允许10050端口
  15. xp 与 windows 7 共享收藏夹
  16. 转 国内的go get问题的解决
  17. Home_W的位运算(位运算+预处理)
  18. 库 v10怎么安装_22000Pa强劲吸力加高续航,追觅V10无线吸尘器体验
  19. 力扣-674 最长连续递增序列
  20. JAVA日常优化---Guava缓存玩耍异步刷新

热门文章

  1. SWAT模型案例分析
  2. 上传文件计算机传输的,如何将手机微信中的文件传输到计算机
  3. 【获奖公布】 |新年新目标,立Flag的时候又到了
  4. Java判断手机号归属地
  5. 计算机基础试题教学,计算机基础试题答案
  6. js+html绘制文字居中,CreateJs系列教程之 EaselJs_2_绘制文字(Text)
  7. java8的优点_java8的优缺点
  8. android事件处理主要方法,详解Android的两种事件处理机制
  9. 龙之谷为什么不显示服务器列表,龙之谷选服务器的时候,字都看不到的。
  10. 安全科普:局域网攻击的常见方法