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

    欧拉函数

    欧拉函数(Euler's totient function

    欧拉函数的定义:

        在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n)。

         φ函数的值:

        φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x的所有质因数;x是正整数;

        φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。

         例如:

             φ(10)=10×(1-1/2)×(1-1/5)=4;

             1 3 7 9

             φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;

             φ(49)=49×(1-1/7)=42;

    欧拉函数的性质:

    (1)   p^k型欧拉函数:

    若N是质数p(即N=p), φ(n)= φ(p)=p-p^(k-1)=p-1。

    若N是质数p的k次幂(即N=p^k),φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。

    (2)mn型欧拉函数

    设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。

    (3)n所有约数的欧拉函数和等于n   ∑ d|ϕ(d

    (4)若n为奇数时,φ(2n)=φ(n)。

    (5) 若(N % a == 0 && (N / a) mod a == 0) 则有:φ(N)=φ(N / a) * a。

    (6) 若(N % a == 0 && (N / a) mod a != 0)  则有:φ(N)=φ(N / a) * (a - 1)。 (a 为质数)

    (7)特殊性质:

    对于任何两个互质 的正整数a,n(n>2)有

    :a^φ(n)=1 mod n (恒等于)

    此公式即 欧拉定理

    当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有:

    a^(p-1)=1 mod n (恒等于)

    此公式即 费马小定理

    欧拉函数相关的证明:

    (1)   p^k型的欧拉函数的证明:

    对于给定的一个素数p: φ(p)=p-1 那么容易证明φ(n)=p^k-p^(k-1)

    已知少于或等于p^k的正整数的个数为p^k-1,其中和p^k不互质的正整数有{ 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)   mn型的欧拉函数的证明:

    因为:x=mn m与n互质(即:gcd(m,n)=1);根据中国剩余定理Z(x)和Z(m)×Z(n)之间存在一一映射,所以x的完全余数集(见下面参考)中的元素的个数Z(x)等于Z(m)×Z(n)元素的个数;而Z(m)×Z(n)= φ(m)φ(n)

    故有: φ(mn) =φ(m)φ(n) 成立。

    (3)任意正整数的欧拉函数的相关证明:

    任意一个整数n都可以表示为其质因子的乘积:

     n=(p(1)^k(1)) *(p(2)^k(2)) *(p(3)^k(3))…(p(i)^k(i))*…*(p(I)^k(I)) 其中I为n 的质因子的个数。

    根据(1)(2)的结论,很容易得出它的欧拉函数为:

    φ(n)=n(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(i)) 其中I为n 的质因子的个数。

    对于任意n>2,2|φ(n) 必定存在 p(i)-1是偶数

    欧拉定理的相关证明:

    (1)  令Z(n)={ X(1),X(2),…,X(φ(n)) }  S={ a*X(1) mod n, a*X(2) mod n ,…,a*X(φ(n)) mod n },则 Z(n)=S。

      1)因为a与n互质(即:gcd(a,n)=1), X(i)(1≤i≤φ(n))与n互质(即:gcd(X(i),n)=1);所以

      a*X(i)与n互质(即:gcd(a*X(i),n)=1),故 a*X(i) mod n ∈ Z(n)。

           2)若i≠j,那么 X(i)≠X(j) ,又有a与n互质(即:gcd(a,n)==1),则可得出: a*(X(i)) mod n ≠a*X(j) mod n (消去定律)。

    (2)   a^(φ(n))*X(1)*X(2)*X(3)*…*X(φ(n)) mod n

    =(a*X(1))*(a*X(2))*(a*X(3))*…*(a*X(φ(n))) mod n

    =(a*X(1) mod n)*(a*X(2) mod n)*(a*X(3) mod n)*…*(a*X(φ(n)) mod n) mod n

    =X(1)*X(2)*X(3)*…*X(φ(n)) mod n。

    对比等式左右两端,因为X(i)(1≤i≤φ(n))与n互质(即:gcd(X(i),n)==1) ,

    故: a^φ(n)=1 mod n (恒等于)成立。

     

    费马小定理的相关证明:

    若正整数 a与素数p互质,则有a^(p-1)=1 mod n(恒等于)

    由于φ(p)=p-1 且 a^φ(n)=1 mod n ,又有此处的p==n;

    故:a^(p-1)=1 mod n成立。

    此定理可以用来简化幂的模运算:

    例如: 计算 7^222的个位数,实际上是求7^222被10除的余数。

         且7与10互质,φ(10)=4,由欧拉定理知7^4= 1mod 10

         故7^222=(7^4)^55*(7^2)=>(1^55)*(7^2)=>49=>9 mod 10

    欧拉函数的延伸:

    于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2  (n>1)。

    相关知识参考:

     

    完全余数集合:

    定义小于 n 且和 n 互质的数构成的集合为 Z(n) ,称呼这个集合为 n 的完全余数集合。 显然 |Z(n)| =φ(n) 。

    同余定理:

         如果 a mod b = c 则有(a+kb) mod b =c(k为非0整数)

         如果 a mod b = c 则有(ka) mod b =kc (k为正整数)

         (a+b) mod c =((a mod c)+(b mod c )) mod c;

         (a*b) mod c=((a mod c)*(b mod c)) mod c

    欧拉函数模板  复杂度 O(sqrt(n))

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

    欧拉函数打表 O(n)

    int check[maxn],phi[maxn],prime[maxn];
    int main()
    {
        int n,cnt=0;
        n=maxn;
        phi[1]=1;
        for(int i=2; i<=n; i++)
        {
            if(!check[i])
            {
                prime[++cnt]=i;
                phi[i]=i-1;
            }
            for(int j=1; j<=cnt&&prime[j]*i<=n; j++)
            {
                check[i*prime[j]]=1;
                if(i%prime[j])
                    phi[i*prime[j]]=phi[i]*(prime[j]-1);
                else
                {
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
            }
        }
        for(int i=0;i<=n;i++)
            cout<<i<<" "<<phi[i]<<endl;
        for(int i=1;i<=cnt;i++)
            cout<<i<<" "<<prime[i]<<endl;
    }
  • 相关阅读:
    继承关系中子类使用@Data注解问题
    Professional, Entreprise, Architect版本的区别
    Delphi中ARC内存管理的方向
    技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
    C++ 函数模板与类模板(使用 Qt 开发编译环境)
    C++进阶之虚函数表
    Net反编译软件
    python虚拟环境--virtualenv和virtualenvwrapper
    Windows同时安装python3和python2
    python的pip源在windows和linux修改
  • 原文地址:https://www.cnblogs.com/stranger-/p/8858997.html
Copyright © 2011-2022 走看看