- 定义
- 不能被除1和他本身以外任何自然数整除
- 不超过N的质数大约有N/LnN个,即每lnN中大约有一个质数
- 质数的判定
- 试除法
-
bool is_prime(int n){ if(N<2)return false; rep(i,2,sqrt(n)){ if(n%i==0)return false; } return true; }
-
- Eratosthenes筛法
-
void primes(int n){ CLR(v); rep(i,2,n){ if(v[i])continue; for(int j=i;j<=n/i;j++) if(!v[i*j])v[i*j]=1; } }
- O(NloglogN)
-
- 线性筛
- 从大到小累积质因子,设数组v记录每个数的最小质因子
- 依次考虑2~N之间的每个数i
- 若v[i]=i,说明i是质数,保存它
- 扫描不大于v[i]的每个质数p,令v[i*p]=p,也就是在i的基础上累积一个质因子p。因为p<=v[i],所以p就是合数i*p的最小质因子
- O(N)
-
int v[MAXN],prime[MAXN]; void primes(int n){ CLR(v); m=0; rep(i,2,n){ if(v[i]==0){ v[i]=i; prime[++m]=i; } for(int j=1;j&lt;=m; j++){ //i有比prime[j]更小的质因子或者超出n的范围,停止循环 if(prime[j]&gt;v[i]||prime[j]&gt;n/i)break; v[i*prime[j]]=prime[j];//prime[j]是合数i*prime[j]的最小质因子 } } }
- 从大到小累积质因子,设数组v记录每个数的最小质因子
- 试除法
- 质因数分解
- 算术基本定理:
- 任何一个大于1 的整数都能唯一分解成有限个质数的乘积:
- 试除法:
- 结合质数判定的试除法以及Eratisthenes筛法
-
void divide(int n){ m=0; rep(i,2,sqrt(n)){ if(n%i==0){ p[++m]=i,c[m]=0; while(n%i==0)n/=i,c[m]++; } } if(n>1){ p[++m]=n,c[m]=1; } }
- Pollard’s Rho(有空查阅)
- 任何一个大于1 的整数都能唯一分解成有限个质数的乘积:
- 算术基本定理: