LogoCSP Wiki By Yundou
0 MathBasics

欧拉函数

定义

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

比如说 φ(1)=1\varphi(1) = 1

nn 是质数的时候,显然有 φ(n)=n1\varphi(n) = n - 1

性质

  • 欧拉函数是积性函数。

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

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

  • 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 是质数,有 φ(n)=n×i=1spi1pi\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}

  • 对任意不全为 00 的整数 m,nm,nφ(mn)φ(gcd(m,n))=φ(m)φ(n)gcd(m,n)\varphi(mn)\varphi(\gcd(m,n))=\varphi(m)\varphi(n)\gcd(m,n)

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

实现

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

示例代码

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

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

例题:

Status
Problem
Tags
P12216. 互质
欧拉函数容斥

On this page