现在的位置: 首页 > 综合 > 正文

欧拉函数(Euler)

2017年05月28日 ⁄ 综合 ⁄ 共 974字 ⁄ 字号 评论关闭

比赛的时候,推出来一个题的答案是欧拉函数。以前听过了无数遍的。就是不会实现。那么今天就好好学习一下吧。


    /* 
    欧拉函数的条件:小于自然数N并与N互质(除1以外无其他公因子)的自然数。 
    1、φ(n)=n*(1-1/p1)*(1-1/p2)*........*(1-1/pi) ->容斥原理可证 
    2、欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n).->公式1可证 
    3、若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。 
    4、n=p1^q1*p2^q2*……pn^qn , 
       φ(n)=p1^(q1-1)*p2^(q2-1)……pn^(qn-1)*(p1-1)*(p2-1)*(p3-1)……(pn-1)->公式2、3可证 ,它可以证明很多结论 
    5、φ(p)=p-1(p是质数) 
    6、φ(1)=1 
    7、欧拉函数值为偶数 (n>=2)->公式4或者与(n,m)=1 =》(n,n-m)=1成对存在 
    8、p、q为两个质数,则φ(p*q)=(p-1)*(q-1);利用3和5 
    9、3的一个特例k==2,则φ(n)=(p-1)*p 
    10、可以快速求出欧拉函数的值(a为N的质因数)  
        若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;  
        若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);-》利用1或4 
    */  

欧拉函数值的求解有两种:

看代码:

/*
 if(n%a==0&&(n/a)%a==0) e(n)=e(n/a)*a;
 if(n%a==0&&(n/a)%a!=0) e(n)=e(n/a)*(a-1);
*/
LL Euler1(LL n){
    LL ans=n;
    for(LL i=2;i<=sqrt(n);i++){
        if(n%i==0){
            while(n%i==0) n=n/i;
            ans=ans/i*(i-1);
        }
    }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}
/*
  递推求e(x),欧拉值.
*/
LL Euler2(LL n){
    LL i,j,e[N];
    for(i=1;i<=n;i++) e[i] = i;
    for(i=2;i<=n;i+=2) e[i] /= 2;
    for(i=3;i<=n;i+=2)
    if(e[i]==i){
        for(j=i;j<=n;j+=i)
        e[j]=e[j]/i*(i-1);
    }
    return e[n];
}



抱歉!评论已关闭.