欧拉函数

欧拉函数


在数论,对正整数n,欧拉函数是小于n的数中与n互质的数的数目。

通式:

   euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)
,其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质 的数(小于等于1)就是1本身)。

 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。

注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

补充:欧拉函数公式
( 1 ) p^k 的欧拉函数
对于给定的一个素数 p , φ(p) = p -1。则对于正整数 n = p^k ,
 φ(n) = p^k - p^(k -1)
  
证明:
 小于 pk 的正整数个数为 p^k - 1个,其中
 和 pk 不互质的正整数有{p * 1,p * 2,...,p * (p^k - 1-1)} 共计 p^(k - 1) - 1 个
 所以 φ(n) = p^k - 1 - (p^(k - 1) - 1) = p^k - p^(k - 1) 。

( 2 ) p * q 的欧拉函数

假设 p, q是两个互质的正整数,则 p * q 的欧拉函数为

φ(p * q) = φ(p) * φ(q) , gcd(p, q) = 1 。

证明:
 令 n = p * q , gcd(p,q) = 1
 根据中国余数定理,有 Zn 和 Zp × Zq 之间存在一一映射,(我的想法是: a ∈ Zp , b ∈ Zq ? b * p + a * q ∈ Zn 。) 所以 n 的完全余数集合的元素个数等于集合 Zp × Zq 的元素个数。 而后者的元素个数为 φ(p) * φ(q) ,所以有 φ(p * q) = φ(p) * φ(q) 。

( 3 ) 任意正整数的欧拉函数
任意一个整数 n 都可以表示为其素因子的乘积为:

      I
 n = ∏  piki (I 为 n 的素因子的个数)
     i=1

根据前面两个结论,很容易得出它的欧拉函数为:

         I                      I
 Φ(n) = ∏  piki -1(pi -1) = n ∏ (1 - 1 / pi)
        i=1                    i=1
对于任意 n > 2,2 | Φ(n) ,因为必存在  pi -1 是偶数。


<一>直接求解欧拉函数

int euler(int n){ //返回euler(n) 
     int res=n;
     for(int i=2;i<=sqrt(n);i++){
         if(n%i==0){
             res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 
             while(n%i==0) n/=i;
         }
     }
     if(n>1) res=res/n*(n-1);
     return res;
}


<二>筛选法打欧拉函数表

#define Max 1000001
int euler[Max];
void Init(){ 
     euler[1]=1;
     for(int i=2;i<Max;i++)       euler[i]=i;
     for(int i=2;i<Max;i++)
        if(euler[i]==i)
           for(int j=i;j<Max;j+=i)
              euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 
}




你可能感兴趣的:(欧拉函数)