学习笔记:欧拉函数与欧拉定理

欧拉函数与欧拉定理

欧拉函数

定义

欧拉函数,即 φ(n),表示的是小于等于 nn 互质的数的个数。

比如说 φ(1)=1

当 n 是质数的时候,显然有 φ(n)=n1

性质

  • 欧拉函数是积性函数。

    积性是什么意思呢?如果有 gcd(a,b)=1,那么 φ(a×b)=φ(a)×φ(b)

    特别地,当 n 是奇数时 φ(2n)=φ(n)

  • n=dnφ(d)

    如果 gcd(k,n)=d,那么 gcd(kd,nd)=1,(k<n)

    如果我们设 f(x) 表示 gcd(k,n)=x 的数的个数,那么 n=i=1nf(i)

    根据上面的证明,我们发现,f(x)=φ(nx),从而 n=dnφ(nd)。注意到约数 dnd 具有对称性,所以上式化为 n=dnφ(d)。证毕。

  • n=pk,其中 p 是质数,那么 φ(n)=pkpk1
    (根据定义可知)

  • 由唯一分解定理,设 n=i=1spiki,其中 pi 是质数,有 φ(n)=n×i=1spi1pi

    引理:设 p 为任意质数,那么 φ(pk)=pk1×(p1)

    证明:显然对于从 1 到 pk 的所有数中,除了 pk1p 的倍数以外其它数都与 pk 互素,故 φ(pk)=pkpk1=pk1×(p1),证毕。

    接下来我们证明 φ(n)=n×i=1spi1pi。由唯一分解定理与 φ(x) 函数的积性。

    φ(n)=i=1sφ(piki)=i=1s(pi1)×piki1=i=1spiki×(11pi)=n i=1s(11pi)

​ 证毕。

实现

如果只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了。这个过程可以用 Pollard Rho 算法优化。

int euler_phi(int n) {
    int m = int(sqrt(n + 0.5)), ans = n;
    for(int i = 2 ; i <= m ; i ++)
        if (n % i == 0){
        ans = ans / i * (i - 1);
        while(n % i == 0)n /= i;
        }
    if(n > 1)ans = ans / n * (n - 1);
    return ans;
}

如果将上面的程序改成如下形式,会提升一点效率:

int euler_phi(int n){
    int ans = n;
    for(int i = 2 ; i * i <= n ; i ++)
        if(n % i == 0){
            ans = ans / i * (i - 1);
            while(n % i == 0) n /= i;
    }
    if(n > 1)ans = ans / n * (n - 1);
    return ans;
}

如果是多个数的欧拉函数值,可以利用线性筛来求得。

注意到在线性筛中,每一个合数都是被最小的质因子筛掉。比如设 p1n 的最小质因子,n=np1,那么线性筛的过程中 n 通过 n×p1 筛掉。

观察线性筛的过程,我们还需要处理两个部分,下面对 nmodp1 分情况讨论。

如果 nmodp1=0,那么 n 包含了 n 的所有质因子。

φ(n)=n×i=1spi1pi=p1×n×i=1spi1pi=p1×φ(n)

那如果 nmodp10 呢,这时 np1 是互质的,根据欧拉函数性质,我们有:

φ(n)=φ(p1)×φ(n)=(p11)×φ(n)

    for(int i = 1 ; i <= 1145141919810 ; i ++)isp[i] = 1;
    int cnt = 0, isp[1] = 0;phi[1] = 1;
    for(int i = 2 ; i <= 1145141919810 ; i ++){
        if(isp[i] != 0){
            cnt++;pri[cnt] = i;
            phi[i] = i - 1;
        }
        for(int j = 1 ; j <= cnt && i * pri[j] <= 1145141919810 ; j ++){
            isp[i * pri[j]] = 0;
            if (i % pri[j] != 0)
                phi[i * pri[j]] = phi[i] * phi[pri[j]];
            else{
                phi[i * pri[j]] = phi[i] * pri[j];
                break;
            }
        }
    }

欧拉定理

定义

gcd(a,m)=1,则 aφ(m)1(modm)

证明

实际上这个证明过程跟上文费马小定理的证明过程是非常相似的:构造一个与 m 互质的数列,再进行操作。

r1,r2,,rφ(m) 为模 m 意义下的一个简化剩余系,则 ar1,ar2,,arφ(m) 也为模 m 意义下的一个简化剩余系。所以 r1r2rφ(m)ar1ar2arφ(m)aφ(m)r1r2rφ(m)(modm),可约去 r1r2rφ(m),即得 aφ(m)1(modm)

m 为素数时,由于 φ(m)=m1,代入欧拉定理可立即得到费马小定理。

扩展欧拉定理

定义

ab{abmodφ(m),gcd(a,m)=1,ab,gcd(a,m)1,b<φ(m),a(bmodφ(m))+φ(m),gcd(a,m)1,bφ(m).(modm)

解释

读者可能对第二行产生疑问,这一行表达的意思是:如果 b<φ(m) 的话,就不能降幂了。

主要是因为题目中 m 不会太大,而如果 b<φ(m),自然复杂度是可以接受的。而如果 bφ(m) 的话,复杂度可能就超出预期了,这个时候我们才需要降幂来降低复杂度。

证明

直观理解

fermat1

需要知道的是,在 (modm) 的条件下,abmodm 的取值范围一定在 [0,m),而 aimodm=(ai1modm)×amodm,那么对于任意一个数 a,那么很容易就能知道它的 后继,在有限的空间内这一定会形成一个循环。

在扩展欧拉定理中,循环分为纯循环和混循环。其中纯循环中不存在节点有两个前驱,而混循环则反之。而 aimodn 形成的序列可以是一个混循环,那么只需要知道循环节的长度,和前面那一小段未进入循环节的长度,就可以根据这个性质来进行降幂了。

值得注意的是,无论是费马小定理,还是(扩展)欧拉定理,一个很重要的应用就是降幂,从而将不可能的表达式化为可能。

形式证明

  1. 命题a 的从 0 次,1 次到 b 次幂模 m 构成的序列中,存在 rs,使得前 r 个数(即从 a0modmar1modm)互不相同,从第 r 个数开始,每 s 个数就循环一次。

    证明

    • 由鸽巢定理易证。

      我们把 r 称为 a 幂次模 m 的循环起始点,s 称为循环长度(注意:r 可以为 0)。

      用公式表述为:ir,aiai+s(modm)

      证毕。

  2. 命题a 为素数的情况,该式成立。

    证明

    • 若模 m 不能被 a 整除,而因为 a 是一个素数,那么 gcd(a,m)=1 成立,根据欧拉定理,容易证明该式成立。

    • 若模 m 能被 a 整除,那么存在 rm 使得 m=arm,且 gcd(a,m)=1 成立。所以根据欧拉定理有 aφ(m)1(modm)

      又由于 gcd(ar,m)=1,所以根据欧拉函数的求值规则,容易得到:φ(m)=φ(m)×(a1)ar1,即我们有:φ(m)φ(m)

      所以 aφ(m)1(modm),φ(m)φ(m)aφ(m)1(modm),即 aφ(m)=km+1,两边同时乘以 ar,得 ar+φ(m)=km+ar(因为 m=arm

      所以对于 m 中素因子 a 的次数 r 满足:arar+φ(m)(modm)。我们可以简单变换形式,得到 推论

      b>rabar+((br)modφ(m))(modm)

      又由于 m=arm,所以 φ(m)=φ(ar)φ(m)φ(ar)=ar1(a1)r(tips:a 是素数,最小是 2,而 r1)。

      所以因为 φ(m)r,故有:

      arar+φ(m)armodφ(m)+φ(m)(modm)

      所以

      abar+(br)modφ(m)armodφ(m)+φ(m)+(br)modφ(m)aφ(m)+bmodφ(m)(modm)

      ababmodφ(m)+φ(m)(modm)

      证毕。

  3. 命题a 为素数的幂的情况,该式成立。

    证明

    • 不妨令 a=pk,是否依然有 r,arar+φ(m)(modm)

      答案是肯定的,由命题 1 可知存在 s 使得 as1(modm),所以 plcm(s,k)1(modm),所以令 s=sgcd(s,k) 时,我们能有 psk1(modm)

      此时有关系:sssφ(m),且 r=rkrφ(m),由 r,sφ(m) 的关系,依然可以得到 ababmodφ(m)+φ(m)(modm)

      证毕。

  4. 命题a 为合数的情况,该式成立。

    证明

    • 只证 a 拆成两个素数的幂的情况,大于两个的用数学归纳法可证。

      a=a1a2,其中 ai=piki,而 ai 的循环长度为 si

      slcm(s1,s2),由于 s1φ(m),s2φ(m),那么 lcm(s1,s2)φ(m),所以 sφ(m)r=max(riki)max(ri)φ(m)

      r,sφ(m) 的关系,依然可以得到 ababmodφ(m)+φ(m)(modm)

      证毕。

posted @   tsqtsqtsq  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示