神奇的线性筛法
来源:互联网 发布:阿里云多个域名备案 编辑:程序博客网 时间:2024/05/29 08:39
关于线筛
所谓线性筛法,顾名思义它是线性的筛素数的方法,所以是
神奇的东西
int getprime(int lim){ int i,j,num=0; fo(i,2,lim) { if (!bz[i]) { prime[++num]=i; for(j=1;i*j<=lim;j++) bz[i*prime[j]]=1; } }}
这是普通筛法
int getprime(int lim){ int i,j,num=0; fo(i,2,lim) { if (!bz[i]) prime[++num]=i; for(j=1;i*prime[j]<=lim&&j<=num;j++) { bz[i*prime[j]]=1; if (!(i%prime[j])) break; } }}
这是线性筛法
实测
某神犇已经测过,我直接上结果
筛 [0, 100000) 范围内的素数
第一种素数筛法 0 毫秒
第二种素数筛法 0 毫秒筛 [0, 200000) 范围内的素数
第一种素数筛法 15 毫秒
第二种素数筛法 0 毫秒筛 [0, 400000) 范围内的素数
第一种素数筛法 16 毫秒
第二种素数筛法 15 毫秒筛 [0, 800000) 范围内的素数
第一种素数筛法 47 毫秒
第二种素数筛法 16 毫秒筛 [0, 1600000) 范围内的素数
第一种素数筛法 62 毫秒
第二种素数筛法 63 毫秒筛 [0, 3200000) 范围内的素数
第一种素数筛法 297 毫秒
第二种素数筛法 109 毫秒筛 [0, 6400000) 范围内的素数
第一种素数筛法 922 毫秒
第二种素数筛法 266 毫秒筛 [0, 12800000) 范围内的素数
第一种素数筛法 2187 毫秒
第二种素数筛法 563 毫秒筛 [0, 25600000) 范围内的素数
第一种素数筛法 4828 毫秒
第二种素数筛法 1187 毫秒
为什么是线性的呢?
回到程序
可以发现,普通筛法将每个质数的倍数都筛掉,每个合数都被筛了它的质因子次
That’s too slow!!
我们再看线性筛法
筛的时候,把当前到的这一个数(不论质数合数)乘上筛出来的每个质数筛一遍
关键是这一句
if (!(i%prime[j])) break;
这样的情况,意思是
并且,这个合数的任何倍数以后一定会被
所以后面的都不必筛了。
这样,每个合数都只被它的最小的质因子筛过一遍,所以是线性的复杂度。
- 神奇的线性筛法
- 线性筛法的应用
- 【线性筛法的应用】
- 线性筛法 与 线性求欧拉函数 的计算模板
- openjudge 数算练习 线性表 0217:神奇的幻方
- ACdream 神奇的%系列一 (素数筛)
- 打败主力的神奇划线法
- 短小精悍的线性时间素数筛法
- 强大的线性时间筛法
- 素数线性筛法的原理
- 短小精悍的线性时间素数筛法
- 短小精悍的线性时间素数筛法
- 【bzoj2813】奇妙的Fibonacci 线性筛法
- 关于素数的线性筛法
- 神奇的的调色板
- 线性筛法
- 线性筛法
- 线性素数筛法
- LeetCode #17 Letter Combinations of a Phone Number C# Solution
- 怎样用好Fragment,避免掉坑(一)
- 题目1170:找最小数
- HashMap和HashTable区别
- Tomcat日志设定
- 神奇的线性筛法
- Eclipse运行Tomcat8源码
- C语言练习篇-4河内之塔
- listview抢焦点
- hdu 1009 贪心
- 第十四周——阅读程序(1)
- 运行时库ML\MT\MD的区分和优劣
- hadoop & hive任务优化之map个数的影响因子
- HDOJ 2052 Picture(暑期练习)