素数筛:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e5;
bool ispr[MAX_N];
int pr[MAX_N];
void initPR(){
memset(ispr,1,sizeof(ispr)+MAX_N);
ispr[0]=false;
ispr[1]=false;
int mark=1;
int M=MAX_N/2+1;
for(int i=2;i<=M;i++){
if(ispr[i]){
for(int j=i<<1;j<MAX_N;j+=i){
ispr[j]=false;
}
pr[mark]=i;
mark++;
}
}
}
int main()
{
initPR();
for(int i=1;i<88;i++){
printf("%d\n",pr[i]);
}
return 0;
}
复杂度分析:
循环进行N/2次,第i次需要循环N/i次,所以总的复杂度是
N
/
2
+
N
/
3
+
.
.
.
.
N
/
N
/
2
=
N
(
1
/
2
+
1
/
3
+
.
.
.
1
/
N
/
2
)
N/2+N/3+....N/N/2=N(1/2+1/3+...1/N/2)
N/2+N/3+....N/N/2=N(1/2+1/3+...1/N/2)
调和级数是发散的(具体证明用到x>ln(x+1)即可),但是增长很慢,所以有限区间内不会产生非常高的复杂度
(1)当n有限时候:
1
+
1
/
2
+
1
/
3
+
…
…
+
1
/
n
=
l
n
n
1+1/2+1/3+……+1/n=lnn
1+1/2+1/3+……+1/n=lnn
(2)当n趋于无穷时:
1
+
1
/
2
+
1
/
3
+
…
…
+
1
/
n
=
l
n
n
+
R
1+1/2+1/3+……+1/n=lnn+R
1+1/2+1/3+……+1/n=lnn+R(R是欧拉常数,接近0.5772)
整个埃式筛的复杂度近似成o(
n
l
o
g
l
o
g
n
nloglogn
nloglogn),可以看成线性了
其他相关知识:
-
费马小定理:
任意素数p,任意非零整数a
a p m o d p ≡ a m o d p a^pmod p≡amodp apmodp≡amodp -
二次探测定理:
奇素数p(即除2外的素数)
x m o d p 2 = 1 xmodp^2=1 xmodp2=1的解只有 x = 1 x=1 x=1和 x = p − 1 x=p-1 x=p−1 -
素数定理:
随着x的增长, π ( x ) / ( x / l n ( x ) ) = 1 π(x)/(x/ln(x))=1 π(x)/(x/ln(x))=1,(π(x)为小于x的素数的个数)