欧拉函数与欧拉定理

来源:互联网 发布:辽宁联通网络测速 编辑:程序博客网 时间:2024/03/29 19:49
 

欧拉函数与欧拉定理

分类: 数论 411人阅读 评论(0) 收藏 举报
importstringclassinijava

先来介绍几个与欧拉函数有关的定理:


定理一:设m与n是互素的正整数,那么


定理二:当n为奇数时,有

因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值。


定理三:设p是素数,a是一个正整数,那么

关于这个定理的证明用到容斥:

由于表示小于互素数的正整数个数,所以用减去与它不互素的数的个数就行了。

那么小于不互素数的个数就是p的倍数个数,有个。所以定理得证。



定理四:设为正整数n的素数幂分解,那么


这个定理可以根据定理一和定理三证明,其实用到的就是容斥。



定理五:设n是一个正整数,那么


这个其实可以看莫比乌斯反演就明白了。


定理六:设m是正整数,(a,m)=1,则:是同于方程的解。


定理七:如果n大于2,那么n的欧拉函数值是偶数。



求欧拉函数值:

[cpp] view plaincopy
  1. int phi(int n)  
  2. {  
  3.     int i,rea=n;  
  4.     for(i=2;i*i<=n;i++)  
  5.     {  
  6.         if(n%i==0)  
  7.         {  
  8.             rea=rea-rea/i;  
  9.             while(n%i==0)  n/=i;  
  10.         }  
  11.     }  
  12.     if(n>1)  
  13.         rea=rea-rea/n;  
  14.     return rea;  
  15. }  


利用递推法求欧拉函数值:

算法原理:开始令i的欧拉函数值等于它本身,如果i为偶数,可以利用定理二变为求奇数的。

若p是一个正整数满足,那么p是素数,在遍历过程中如果遇到欧拉函数值等于自身的情况,那么说明该数为素数。

把这个数的欧拉函数值改变,同时也把能被该素因子整除的数改变。

[cpp] view plaincopy
  1. int phi()  
  2. {  
  3.     int i,j;  
  4.     for(i=1;i<N;i++)  p[i]=i;  
  5.     for(i=2;i<N;i+=2) p[i]>>=1;  
  6.     for(i=3;i<N;i+=2)  
  7.     {  
  8.         if(p[i]==i)  
  9.         {  
  10.             for(j=i;j<N;j+=i)  
  11.             {  
  12.                 p[j]=p[j]-p[j]/i;  
  13.             }  
  14.         }  
  15.     }  
  16. }