跳转至

欧拉函数

定义

欧拉函数(Euler's totient function),即 φ(n),表示的是小于等于 n 和 n 互质的数的个数.

比如说 φ(1)=1.

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

性质

  • 欧拉函数是 积性函数.

    即对任意满足 gcd(a,b)=1 的整数 a,b,有 φ(ab)=φ(a)φ(b).

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

    证明参见 剩余系的复合.

  • n=∑d∣nφ(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=∑d∣nφ(nd).注意到约数 d 和 nd 具有对称性,所以上式化为 n=∑d∣nφ(d).

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

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

    证明
    • 引理:设 p 为任意质数,那么 φ(pk)=pk−1×(p−1).

      证明:显然对于从 1 到 pk 的所有数中,除了 pk−1 个 p 的倍数以外其它数都与 pk 互素,故 φ(pk)=pk−pk−1=pk−1×(p−1),证毕.

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

    φ(n)=∏i=1sφ(piki)=∏i=1s(pi−1)×piki−1=∏i=1spiki×(1−1pi)=n ∏i=1s(1−1pi)◻
  • 对任意不全为 0 的整数 m,n,φ(mn)φ(gcd(m,n))=φ(m)φ(n)gcd(m,n).

    可由上一条直接计算得出.

实现

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

参考实现
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <cmath>

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;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import math


def euler_phi(n):
    ans = n
    for i in range(2, math.isqrt(n) + 1):
        if n % i == 0:
            ans = ans // i * (i - 1)
            while n % i == 0:
                n = n // i
    if n > 1:
        ans = ans // n * (n - 1)
    return ans

如果是多个数的欧拉函数值,可以利用后面会提到的线性筛法来求得.

详见:筛法求欧拉函数

应用

欧拉函数常常用于化简一列最大公约数的和.国内有些文章称它为 欧拉反演1.

在结论

n=∑d|nφ(d)

中代入 n=gcd(a,b),则有

gcd(a,b)=∑d|gcd(a,b)φ(d)=∑d[d|a][d|b]φ(d),

其中 [⋅] 为 Iverson 括号.对上式求和,就可以得到

∑i=1ngcd(i,n)=∑d∑i=1n[d|i][d|n]φ(d)=∑d⌊nd⌋[d|n]φ(d)=∑d|n⌊nd⌋φ(d).

这里关键的观察是 ∑i=1n[d|i]=⌊nd⌋,即在 1 和 n 之间能够被 d 整除的 i 的个数是 ⌊nd⌋.

利用这个式子,就可以遍历约数求和了.需要多组查询的时候,可以预处理欧拉函数的前缀和,利用数论分块查询.

GCD SUM

给定 n≤100000,求

∑i=1n∑j=1ngcd(i,j).
思路

仿照上文的推导,可以得出

∑i=1n∑j=1ngcd(i,j)=∑d=1n⌊nd⌋2φ(d).

此时需要从 1 遍历到 n 求欧拉函数,用线性筛做就可以 O(n) 得到答案.

欧拉定理

与欧拉函数紧密相关的一个定理就是欧拉定理.其描述如下:

若 gcd(a,m)=1,则 aφ(m)≡1(modm).

扩展欧拉定理

当然也有扩展欧拉定理,用于处理一般的 a 和 m 的情形.

ab≡{abmodφ(m),gcd(a,m)=1ab,gcd(a,m)≠1,b<φ(m)abmodφ(m)+φ(m),gcd(a,m)≠1,b≥φ(m)(modm)

证明和习题详见 欧拉定理.

习题

参考资料与注释


  1. 这一说法并未见于学术期刊或国外的论坛中,在使用该说法时应当注意. ↩