prime sieve 素数筛
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]<=mincomposite[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 素数筛相关推荐
- UVA 12101 Prime Path (素数筛+BFS)
题意:给一个四位数的素数,求通过几步变换(一次只能换一个位置的数,且变换过程中只能出现素数)变为目标四位数 分析:素数筛法+BFS,BFS时更换一个数字如果符合条件就加入队列 代码: #include ...
- 素数筛 Prime sieve
文章目录 素数筛 Prime sieve 一.素数的判定 二.埃氏筛法 三.欧拉筛法 四.六倍原理 素数筛 Prime sieve 素数又称质数:一个大于 1 的自然数,除了 1 和它自身外,不能被其 ...
- Prime Number Aizu - 0009(素数筛)
题意: 给一个数n,问1~n内有多少个素数 题目: Write a program which reads an integer n and prints the number of prime nu ...
- Python:实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法(附完整源码)
Python:实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法 # flake8: noqa def prime_sieve_eratosthenes(num):prim ...
- 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)
原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收录在github 求star 前言 现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几 ...
- 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)
[目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...
- M - Help Hanzo (大数区间素数筛)
题目 思路:先对1e5之内的素数筛好,用这些素数筛去大区间内的合数. #include<cstdio> #include<cstring> #include<iostre ...
- M - Help Hanzo(模拟素数筛思想+优化)
题目意思就是求[a,b]的素数个数.这道题我一看枚举不就完了吗? 但是看到那个2^31次方就知道了,如果枚举肯定TLE了: 所以百度了一下说模拟素数筛.我觉得我自己有必要回忆一下素数筛原理. #inc ...
- C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法
前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...
最新文章
- synchronize
- Spring学习笔记(二)——Spring相关配置属性注入Junit整合
- HDU 2899 三分
- pwm 正弦波_CC6420单相正弦波直流无刷马达驱动应用指南
- RabbitMQ入门(二)-helloworld
- python培训学习方法_python编程学习方法及技术进阶建议
- lis25ba_LIS25BA - MEMS数字输出运动传感器:低噪声,高带宽,3轴加速度计,带TDM接口 - STMicroelectronics...
- 路径 (Path)–nodejs
- Nginx 的线程池与性能剖析【转载】
- spring事务管理中,用try-catch处理了异常,事务也会回滚?
- 并发编程的数据竞争问题以及解决之道
- php 变量 类名,关于php:使用变量类名和静态方法时出错
- Web前端新手一定要知道的几个框架!
- zabbix 之 配置iptables允许10050端口
- xp 与 windows 7 共享收藏夹
- 转 国内的go get问题的解决
- Home_W的位运算(位运算+预处理)
- 库 v10怎么安装_22000Pa强劲吸力加高续航,追觅V10无线吸尘器体验
- 力扣-674 最长连续递增序列
- JAVA日常优化---Guava缓存玩耍异步刷新
热门文章
- SWAT模型案例分析
- 上传文件计算机传输的,如何将手机微信中的文件传输到计算机
- 【获奖公布】 |新年新目标,立Flag的时候又到了
- Java判断手机号归属地
- 计算机基础试题教学,计算机基础试题答案
- js+html绘制文字居中,CreateJs系列教程之 EaselJs_2_绘制文字(Text)
- java8的优点_java8的优缺点
- android事件处理主要方法,详解Android的两种事件处理机制
- 龙之谷为什么不显示服务器列表,龙之谷选服务器的时候,字都看不到的。
- 安全科普:局域网攻击的常见方法