zoukankan      html  css  js  c++  java
  • 欧拉函数总结【数论】【欧拉函数】

         欧拉函数的定义:euler(k)=([1,n-1]中与n互质的整数个数).

         eg:euler(8)=4。由于1,3,5,7均和8互质

         能够推出下面公式:

       euler(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
              =k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
              =k*(1-1/p1)*(1-1/p2)....(1-1/pk) 

           故euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),当中p1,p2……pn为x的全部素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 
          

          依据以上性质能够推出: 

      若(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.      一个数的全部质因子之和是euler(n)*n/2。
    2.  一个质数n的欧拉函数是n-1           

          以下给出求euler函数的程序:

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

         在给出一个筛法打euler函数表:

    //筛选法打欧拉函数表
    #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);
    }

    先撸一题:

    poj3090   代码





  • 相关阅读:
    四种nlogn排序算法代码
    HDU1421
    HDU1789
    HDU1978
    HDU2059
    HDU2089
    深入理解数组与指针的区别
    存储字节对齐问题
    h5新特性<data*>
    浏览器的标准模式和怪异模式
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6817003.html
Copyright © 2011-2022 走看看