zoukankan      html  css  js  c++  java
  • 欧拉函数

    欧拉函数详解

    对一个正整数N,欧拉函数是小于N且与N互质的数的个数.。

    例如φ(24)=8,因为1, 5, 7, 11, 13, 17, 19, 23均和 24 互质。

    φ(n) = n*(1-1/p1)*(1-1/p2)*......(1-1/pn)   其中(p1.....pn)为N的素因子

     

    欧拉函数的基本性质:

     

    ① N是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)

    ② 除了N=2,φ(N)都是偶数.

    ③ 小于N且与N互质的所有数的和是φ(n)*n/2

    ④ 欧拉函数是积性函数——若m,n互质,φ(m*n)=φ(m)*φ(n)。

    ⑤ 当N为奇数时,φ(2*N)=φ(N)

    ⑥ 若N是质数p的k次幂,φ(N)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟N互质

    ⑦ 当N是质数时,φ(N) = N-1

    8当b是质数,a%b==0,phi(a*b)=phi(a)*b

    算法实现:

    1.直接实现

     1 int phi(int n)
     2 {
     3     int rea=n;
     4     for(int i=2;i<=n;i++)
     5     {
     6         if(n%i==0)//第一次找到的必为素因子
     7         {
     8             rea=rea-rea/i;
     9             do{
    10                 n/=i;//把素因子全部排除掉
    11             }while(n%i==0);
    12         }
    13     }
    14     return rea;
    15 }

    参照公式

    2.素数表实现

    bool b[50000];
    int p[50000];
    void prime()
    {
        memset(b,0,sizeof(b));
        b[0]=b[1]=1;
        int k=0;
        for(int i=2;i<=50000;i++)
        {
            if(b[i]==0)
            {
                p[k]=i;
                k++;
                for(int j=i+i;j<=50000;j+=i)
                {
                    b[j]=1;
                }
            }
        }
    }
    
    int phi(int n)
    {
        int rea=n;
        for(int i=0;p[i]*p[i]<=n;i++)
        {
            if(n%p[i]==0)
            {
                rea=rea-rea/i;
                do{
                    n/=p[i];
                }while(n%p[i]==0);
            }
            if(n>1) rea=rea-rea/n;//减去自身的
    
        }return rea;
    }

     3.递推实现

    void phi()
    {
        for(int i=1;i<=50000;i++) p[i]=i;
        for(int i=2;i<=50000;i+=2) p[i]/=2;//根据定理φ(2*N)=φ(N)
        for(int i=3;i<=50000;i+=2)
        {
            if(p[i]==i)
            {
                for(int j=i;j<=50000;j+=i)
                {
                    p[j]=p[j]/i*(i-1);
                }
            }
        }
    }
  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/Fy1999/p/8719329.html
Copyright © 2011-2022 走看看