定义

欧拉函数 φ(n)\varphi(n) 表示小于等于 nn,且与 nn 互质的正整数的个数。

如何求 φ(n)\varphi(n)

比如 varphi(12)varphi(12)1212 质因数分解,12=22312=2^2*3,其实就是得到了 2233 两个互异的质因子。

然后把 22 的倍数和 33 的倍数都删掉。

22 的倍数:2,4,6,8,10,122,4,6,8,10,12

33 的倍数:3,6,9,123,6,9,12

但是是 661212 重复减了。所以还要把既是 22 的倍数又是 33 的倍数的数加回来。所以这样写:1212/212/3+12/(23)12 - 12/2 - 12/3 + 12/(2*3)。运用了容斥原理。

性质

  • 欧拉函数是积性函数。

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

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

  • n=dnφ(d)n = \sum_{d \mid n}{\varphi(d)}

    证明: 也可以这样考虑:如果 gcd(k,n)=d\gcd(k, n) = d,那么 gcd(kd,nd)=1,(k<n)\gcd(\dfrac{k}{d},\dfrac{n}{d}) = 1, ( k < n )。 如果我们设 f(x)f(x) 表示 gcd(k,n)=x\gcd(k, n) = x 的数的个数,那么 n=i=1nf(i)n = \sum_{i = 1}^n{f(i)}。 根据上面的证明,我们发现,f(x)=φ(nx)f(x) = \varphi(\dfrac{n}{x}),从而 n=dnφ(nd)n = \sum_{d \mid n}\varphi(\dfrac{n}{d})。注意到约数 ddnd\dfrac{n}{d} 具有对称性,所以上式化为 n=dnφ(d)n = \sum_{d \mid n}\varphi(d)

  • n=pkn = p^k,其中 pp 是质数,那么 φ(n)=pkpk1\varphi(n) = p^k - p^{k - 1}。(根据定义可知)

  • 由唯一分解定理,设 n=i=1spikin = \prod_{i=1}^{s}p_i^{k_i},其中 pip_i 是质数,有 $\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}$。

    证明:

    引理:设 pp 为任意质数,那么 φ(pk)=pk1×(p1)\varphi(p^k)=p^{k-1}\times(p-1)

    证明:显然对于从 1 到 pkp^k 的所有数中,除了 pk1p^{k-1}pp 的倍数以外其它数都与 pkp^k 互素,故 φ(pk)=pkpk1=pk1×(p1)\varphi(p^k)=p^k-p^{k-1}=p^{k-1}\times(p-1),证毕。

    接下来我们证明 $\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}$。由唯一分解定理与 φ(x)\varphi(x) 函数的积性

    $$\begin{aligned} \varphi(n) &= \prod_{i=1}^{s} \varphi(p_i^{k_i}) \\ &= \prod_{i=1}^{s} (p_i-1)\times {p_i}^{k_i-1}\\ &=\prod_{i=1}^{s} {p_i}^{k_i} \times(1 - \frac{1}{p_i})\\ &=n~ \prod_{i=1}^{s} (1- \frac{1}{p_i}) &\square \end{aligned} $$
  • $\varphi(a*b)=\varphi(a)*\varphi(b)*\frac{d}{\varphi(d)}$,其中 d=gcd(a,b)d = \gcd(a, b)

求一个数的欧拉函数值

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;
}

线性筛求欧拉函数

在线性筛中,每一个合数都被最小的质因子筛掉。设 p1p_1nn 的最小质因子,n=np1n' = \frac{n}{p_1},那么 nn 通过 n×p1n' \times p_1 筛掉。

nmodp1n' \mod p_1 分类讨论。

  1. nmodp1=0n' \mod p_1 = 0,那么 nn' 包含了 nn 的所有质因子。
$$\begin{aligned} \varphi(n) &= n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}} \\ &= p_1 \times n' \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}} \\ &= p_1 \times \varphi(n') \end{aligned} $$
  1. nmodp10n' \mod p_1 \ne 0,此时 nn'p1p_1 互质,根据欧拉函数的性质,我们有:
$$\begin{aligned} \varphi(n) &= \varphi(p_1) \times \varphi(n') \\ &= (p_1-1) \times \varphi(n') \end{aligned} $$
void sieve() {
  memset(isprime, true, sizeof isprime);
  tot = 0;
  isprime[1] = 0;
  phi[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (isprime[i]) {
      prime[++tot] = i;
      phi[i] = i-1;
    }
    for (int j = 1; j <= tot && prime[j]*i <= n; j++) {
      isprime[prime[j]*i] = 0;
      if (i%prime[j] == 0) {
        phi[i*prime[j]] = phi[i]*prime[j];
        break;
      }
      phi[i*prime[j]] = phi[i]*phi[prime[j]];
    }  
  }
}

参考资料