数论:质数理论整理

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为质数,则a≡ 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求大数因子

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/7118312.html

你可能感兴趣的:(数论:质数理论整理)