线性筛法求素数
来源:互联网 发布:全球气候变暖数据 编辑:程序博客网 时间:2024/06/13 12:35
普通筛法
先讲一下普通的筛法。筛法,顾名思义,就是筛掉合数,剩下的就是素数了。
我们知道,合数一定可以分解为两个或以上的素数,所以我们只需要对于每一个素数
Code(pascal) normal
for i:=2 to n do if bz[i] then //如果此数没有被小于它的质数乘上某个数所筛掉,说明它是质数 for j:=2 to n div i do //枚举i的乘数j bz[i*j]:=false; //筛掉此数
这个算法的时间复杂度是
我们可以发现,对于一个大于√
我们设这个数为
设j=
综上所述,当
Code(pascal) optimization
for i:=2 to trunc(sqrt(n)) do if bz[i] then //判断质数 for j:=i to n div i do //枚举i的乘数j(j≥i) bz[i*j]:=false; //筛数
线性筛法
现在开始讲主角了,先看看代码。
Code(pascal) linear
for i:=1 to n dobegin if bz[i]=false then //i为素数则bz[i]=false,为合数则bz[i]=true begin inc(o); s[o]:=i; //s为素数数组 end; for j:=1 to o do begin bz[i*s[j]]:=true; if (i mod s[j]=0) or (i*s[j]>n) then break; //难点???重点!!!超强优化!?!?!? end;end;
重点在于为什么i mod s[j]就不需要筛了?
事实上我们这样每个合数只会被筛一遍。
接下来我们需要证明两个东西:
1、质数一定不会被筛。
2、合数一定会被筛,且只会被筛一次。
我们知道质数只有一个质因数,因此,所以不会被两个大于1的数的乘积所筛。
对于合数,我们设合数
所以使得循环break掉的素数就是
又因为
通过上面我们可以知道,每个合数只会被自己最小的质因数乘上某数筛掉,因此只会被筛一次且一定被筛,所以时间复杂度就降至了
- 线性筛法求素数
- 快速线性筛法求素数
- 线性筛法求素数
- 快速线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数表
- 线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数【Template】
- 线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- libcurl 多线程使用注意事项(转载)
- java设计模式1--工厂方法模式(Factory Method)
- 工资计算
- java设计模式2--抽象工厂模式(Abstract Factory)
- ZOJ 1909Square 题解
- 线性筛法求素数
- java中的接口Iterator和Iterable的区别
- java设计模式3--单例模式(Singleton)
- son extends father and override father's variable
- java设计模式4--建造者模式(Builder)
- Errors occurred during the build.
- 蓝桥杯省赛总结
- 第二十七讲--Oracle IMU及Redo Private Strands技术
- java设计模式5--原型模式(Prototype)