Zirnc's Blog

定义

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

如何求 $\varphi(n)$?

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

然后把 $2$ 的倍数和 $3$ 的倍数都删掉。

$2$ 的倍数:$2,4,6,8,10,12$

$3$ 的倍数:$3,6,9,12$

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

性质

求一个数的欧拉函数值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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;
}

线性筛求欧拉函数

在线性筛中,每一个合数都被最小的质因子筛掉。设 $p_1$ 是 $n$ 的最小质因子,$n’ = \frac{n}{p_1}$,那么 $n$ 通过 $n’ \times p_1$ 筛掉。

对 $n’ \mod p_1$ 分类讨论。

  1. $n’ \mod p_1 = 0$,那么 $n’$ 包含了 $n$ 的所有质因子。 $$ \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} $$
  2. $n’ \mod p_1 \ne 0$,此时 $n’$ 与 $p_1$ 互质,根据欧拉函数的性质,我们有: $$ \begin{aligned} \varphi(n) &= \varphi(p_1) \times \varphi(n’) \\ &= (p_1-1) \times \varphi(n’) \end{aligned} $$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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]];
    }  
  }
}

参考资料

#OI #算法 #数学 #欧拉函数 #积性函数 #线性筛 #数论