1.质数的判定:
筛选法:
1 void prime() 2 {int k=0,i,j; 3 memset(vis,0,sizeof(vis)); 4 for (i=2;i<=n;i++) 5 if (vis[i]==0) 6 { 7 k++; 8 prime[k]=i; 9 for (j=i*i;j<=n;j+=i) 10 prime[j]=1; 11 } 12 }
复杂度为O(nlogn)
但还有更快的,就是线性筛法:
1 for (i=2;i<=2*n;i++) 2 { 3 if (vis[i]==0) 4 { 5 prime[++tot]=i; 6 }//关键1 7 for (j=1;j<=tot&&i*prime[j]<=2*n;j++) 8 { 9 vis[i*prime[j]]=1; 10 mp[i*prime[j]]=prime[j]; 11 if (!(i%prime[j])) break;// 关键2 12 } 13 }
2.质数相关定理:
1.唯一分解定理:
假设a>=2,则a可表示为p1*p2*p3*p4....
2.威尔逊定理:
设p为质数,则( p - 1 ) ! ≡ -1 ( mod p )
反之亦然:如果( p - 1 ) ! ≡ -1 ( mod p ),则p为质数
所以(p-1)+1=k*p,k为整数,利用sin函数,构出分布曲线f(n)=sin(3.1415926 * ( ( n - 1 ) ! + 1 ) / n ).
零点为质数
3.费马定理:
如果p为质数,a为正整数,且GCD(a,p)==1,则ap-1≡1( mod p )
在一般情况下,如果p为质数,则ap ≡ a ( mod p )
a无限制,这就是费马小定理
3.欧拉定理:
欧拉函数:不大于n中与n互质的数的个数,称为Φ(n)函数
引理1:
n为质数p时,Φ(p)=p-1
n为质数p的幂,则Φ(pa)=(p-1)*pa-1
n为互质两数a,b之积,Φ(a*b)=Φ(a)*Φ(b)
引理2:
设n=p1^a1*p2^a2*p3^a3....
则Φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)...
欧拉定理:
aΦ(n) ≡ 1 ( mod n )
5.欧拉函数的线性筛法:
设p为质数
性质1:
Φ(p)=p-1
性质2:
如果i%p=0,则Φ( p * i )=Φ( i )*p
性质3:
如果i%p<>0,则Φ(i * p)=Φ( i ) * ( p - 1 )
这样可以用质数线性筛法顺带求出Φ(n)
1 for (i=2;i<=n;i++) 2 { 3 if (mark[i]==0) 4 { 5 prime[++tot]=i; 6 phi[i]=i-1; 7 } 8 for (j=1;j<=tot;j++) 9 { 10 long long k=i*prime[j]; 11 if (k>n) break; 12 mark[k]=1; 13 if (i%prime[j]==0) 14 { 15 phi[k]=phi[i]*prime[j]; 16 break; 17 } 18 else phi[k]=phi[i]*(prime[j]-1); 19 } 20 }
先到这里,接下来还有BSGS及扩展算法,Pollard Rho求大数因子