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

      本文系转载:http://www.cnblogs.com/Lyush/archive/2012/08/06/2625113.html

      欧拉函数的作用已不用再明说什么,只是苦于数论方面的知识实在欠缺,一直搞不懂原理,先转载一篇自己慢慢斟酌,感谢网上众多大牛的分享-----

    ------------------------------转载正文----------------------------------

      本文转自 http://blog.sina.com.cn/s/blog_694034130100wlrh.html(修改了少量有误的地方)
    欧拉函数:

    对于一个正整数n,小于n且和n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。

    特殊性质:当n为奇数时,φ(2n)=φ(n)。

    完全余数集合:
    定义小于n且和n互质的数构成的集合为Zn,称呼这个集合为n的完全余数集合。

    显然,对于素数p,φ(p)= p - 1.

    对于两个素数p、q,他们的乘积n = pq 满足φ(n) =(p-1)(q-1)

            证明:对于质数p,q,满足φ(n) =(p-1)(q-1)
            考虑n的完全余数集Zn = { 1,2,....,pq -1},小于n的集合共有pq-1个元素
            而不和n互质的集合由下面两个集合的并构成:
            1) 能够被p整除的集合{p,2p,3p,....,(q-1)p} 共计q-1个
            2) 能够被q整除的集合{q,2q,3q,....,(p-1)q} 共计p-1个 
            很显然,1、2集合中没有共同的元素,因此Zn中元素个数 = pq -1 - (p -1 + q- 1) = (p-1)(q-1)

    欧拉定理:
    对于互质的整数a和n,有aφ(n)  ≡ 1 mod n

    {

    注:

       同余符号:  

        两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余

     

      记作 a ≡ b (mod m)

     

      读作a同余于b模m,或读作a与b关于模m同余。

     

      比如 26 ≡ 14 (mod 12)

    }


            证明:
            首先证明下面这个命题:
            对于集合Zn={x1,x2,...,xφ(n)},考虑集合
            S = {ax1 mod n,ax2mod n,...,axφ(n)mod n}
            则S = Zn
            1) 由于a,n互质,xi也与n互质,则axi也一定与n互质,因此
            任意xi,axi mod n 必然是Zn的一个元素
            2) 对于Zn中两个元素xi和xj,如果xi ≠ xj
            则axi mod n ≠ axj mod n,这个由a、n互质和消去律可以得出。
            所以,很明显,S=Zn
           
            既然这样,那么
            (ax1 × ax2×...×axφ(n))mod n
             = (ax1 mod n × ax2mod n × ... × axφ(n)mod n)mod n
             = (x1 × x2 × ... × xφ(n))mod n
             考虑上面等式左边和右边
             左边等于(a^φ(n) × (x1 × x2 × ... × xφ(n))mod n) mod n
             右边等于x1 × x2 × ... × xφ(n))mod n
             而x1 × x2 × ... × xφ(n))mod n和n互质
             根据消去律,可以从等式两边约去,就得到:
              aφ(n)  ≡  1 mod n

     

    费马定理:
    a是不能被质数p整除的正整数,则有 ap - 1 ≡ 1 mod p

    证明这个定理非常简单,由于φ(p) = p-1,代入欧拉定理即可证明。
    同样有推论:对于不能被质数p整除的正整数a,有ap ≡ a mod p

    欧拉函数公式:

    ( 1 ) pk 的欧拉函数

    对于给定的一个素数 p , φ(p) = p -1。则对于正整数 n = pk ,

    φ(n) = pk - pk -1

    证明:
    小于 pk 的正整数个数为 pk - 1个,其中
    和 pk 不互质的正整数有{p * 1,p * 2,...,p * (pk - 1-1)} 共计 pk - 1 - 1 个
    所以 φ(n) = pk - 1 - (pk - 1 - 1) = pk - pk - 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) = ∏  pik-1(p

    -1) = n ∏ (1 - 1 / pi)
            i=1                    i=1
    对于任意 n > 2,2 | Φ(n) ,因为必存在  p

    -1 是偶数。



    ---------------------------下面代码非上文转载---------------------------

    直接计算:
     1 __int64 Eular(__int64 n)
     2 {
     3     if(n==0) return 0;
     4     __int64 ans=n,ln=(__int64)sqrt(n*1.0);
     5     for(int i=2; i<=ln; i++)
     6     {
     7         if(n%i==0)
     8         {
     9             ans = ans/i*(i-1);
    10             while(n%i==0) n/= i;
    11         }
    12     }
    13     if(n>1)
    14         ans = ans / n * (n-1);
    15     return ans;
    16 }
    View Code
  • 相关阅读:
    FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:
    redis分布式锁原理与实现
    java中如何将 string 转化成 long
    FastJson中JSONObject用法及常用方法总结
    Spring IOC 一——容器装配Bean的简单使用
    静态代理和动态代理
    Spring AOP——Spring 中面向切面编程
    什么是分布式锁?实现分布式锁的三种方式
    @Consumes @Produces的作用
    pro、pre、test、dev环境
  • 原文地址:https://www.cnblogs.com/khan724/p/4149557.html
Copyright © 2011-2022 走看看