线性筛
2015-10-04 20:07
225 查看
参考:
http://www.cnblogs.com/zhuohan123/p/3233011.html
我们现在要求1到N之间的素数。
我们先尝试把1到N之间的合数分解成a=bp的形式,b是a的最小素因数,那么p的最小素因数一定是大于等于b的,同时p的范围是2到N,每一个1到N的合数的p都在这个范围之间,我们只要遍历p,并且为每个p找到所有合适的b就可以找到1到N之间的所有合数。所以这就是线性筛。
第一层for循环的语句执行N次,第二层for循环的语句执行N次,所以是o(N)。
其实镶嵌在线性筛里的求欧拉函数,也可以镶嵌在埃筛中,只不过比线性筛慢罢了。
图中划红线的那一句是应用了
那么为什么遍历到 i 时如果 isprime[i] 仍是true,就代表i是素数呢?
假设此时 i 是合数,那么 i 的 p 一定小于 p,可定已经在第一层循环中遍历过了,既然在第一层循环中遍历过的话,那么就已经乘上了所有适合它 b ,所得的结果中一定有 i ,那么意味着 i ,应该已经被标记为了false,所以矛盾。并且这也标志着用到 phi[i] 时,phi[i]已经承载着正确的值了。
http://www.cnblogs.com/zhuohan123/p/3233011.html
我们现在要求1到N之间的素数。
我们先尝试把1到N之间的合数分解成a=bp的形式,b是a的最小素因数,那么p的最小素因数一定是大于等于b的,同时p的范围是2到N,每一个1到N的合数的p都在这个范围之间,我们只要遍历p,并且为每个p找到所有合适的b就可以找到1到N之间的所有合数。所以这就是线性筛。
第一层for循环的语句执行N次,第二层for循环的语句执行N次,所以是o(N)。
其实镶嵌在线性筛里的求欧拉函数,也可以镶嵌在埃筛中,只不过比线性筛慢罢了。
图中划红线的那一句是应用了
那么为什么遍历到 i 时如果 isprime[i] 仍是true,就代表i是素数呢?
假设此时 i 是合数,那么 i 的 p 一定小于 p,可定已经在第一层循环中遍历过了,既然在第一层循环中遍历过的话,那么就已经乘上了所有适合它 b ,所得的结果中一定有 i ,那么意味着 i ,应该已经被标记为了false,所以矛盾。并且这也标志着用到 phi[i] 时,phi[i]已经承载着正确的值了。
相关文章推荐
- poj 1127 计算几何入门题 求线段交点
- Android Filter筛选ListView并且筛选内容变色
- HDOJ 5498 Tree
- Linux第三次学习笔记
- iOS按钮的使用和动画的实现
- curl是一个利用URL规则在命令行下工作的文件传输工具。
- 自己练习一之对象的访问和对象的存储和指针
- IMS技术
- ApplicationContext.xml 的最终xml声明,包括注解 aop
- 2015/10/04 阴雨天纪事
- android中listview 异步加载防止图片移位
- 又见拦截导弹
- Gym 100685 F Flood
- C#集合类(数据结构)
- 2015腾讯校招后台开发类内推电话面试(技术工程事业群TEG内推面试分享)
- 【Linux 移植 】——2、移植 u-boot-2012.04.01指分析启动过程
- BZOJ1037 ZJOI2008 生日聚会
- C语言函数指针变量
- Mysql多列索引
- 我所具备的