【数论学习笔记】质数
质数判定:
试除法:2到sqrt(n)全部试除。代码如下。
inline bool prime1(int n){ if(n<2) return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; }
质数筛法:
Eratosthenes筛法:所有质数的倍数全部为合数,每求到一个质数,统计倍数。代码如下。
int v[maxn]; inline void prime2(int n){ memset(v,0,sizeof(v)); for(int i=2;i<=n;i++){ if(v[i]) continue; printf("%d ",i); for(int j=i;j<=n/i;j++) v[i*j]=1; } }
线性筛法:
1. 2到 N 的每一个数若 v[i]=i 则为质数。
2.扫描不大于v[i]的每一个质数p,令v[i*p]=p,也就是记录最小的质因子。
代码如下。
int prime[maxn],v[maxn]; inline void prime3(int n){ memset(v,0,sizeof(v)); int m=0; for(int i=2;i<=n;i++){ if(v[i]==0){v[i]=i;prime[++m]=i;} for(int j=1;j<=m;j++){ if(prime[j]>v[i]||prime[j]>n/i) break; v[i*prime[j]]=prime[j]; } } for(int i=1;i<=m;i++) printf("%d ",prime[i]); }
质因数分解:
算数基本定理:任何一个大于1的正整数都能分解成有限个质数的乘积。
写作:N=p1^c1*p2^c2*....pm^cm。ci 为正整数,pi 为质数。
试除法:质数判定试除法+质数筛选欧拉筛。代码如下。
inline void divide(int n){ int m=0; for(int i=2;i<=sqrt(n);i++){ if(n%i==0){//i为质数 p[++m]=i,c[m]=0; while(n%i==0) n/=i,c[m]++;//除掉i } } if(n>1)//最后n是质数 p[++m]=n,c[m]=1; for(int i=1;i<=m;i++) printf("%d^%d\n",p[i],c[i]); }