素数就是质数,在大于1的自然数中,除了1和它本身以外,不能被任何数整除
唯一分解定理: 一个数要么其本身是质数,要么可以分解为几个质数之积。
对于一个正整数X(除1外)都有这样一个式子
(p是素因子,a是素因子的个数)
判断素数 复杂度:O(√n)
int flag=0
for(int i=2;i*i<=n;i++){
if(x%i) {
flag=1;
break;
}
}
素数筛法
-
朴素算法:复杂度nlog(n)
int prim[MAXN]; bool flag[MAXN] for(int i=2;i<MAXN;i++){ if(flag[i]==false){ prim[++prim[0]]=i; for(int j=i+i;j<=MAXN;j+=i){ flag[j]=true; } } }
-
线性筛(欧拉筛): 复杂度 O(n)
O(n)的时间复杂度筛出1~n中的所有素数,之后可以O(1)判断1~n的某个数是否是素数。
vector<int> prim;
bool flag[MAXN]={false};
for(int i=2;i<MAXN;i++){
if(flag[i]==false) {
prim.push_back(i);
}
for(int j=0;j<prim.size();j++){
if(i*prim[j]>MAX