互质与欧拉函数

本文部分参考李煜东《算法竞赛进阶指南》

更新记录:

  • 2026/07/10:互质与欧拉函数部分基本完工

概述

定义

互质

∀ a , b ∈ N \forall a, b \in \mathbb{N} a,bN,若 gcd ⁡ ( a , b ) = 1 \gcd(a, b) = 1 gcd(a,b)=1,则称 a , b a, b a,b 互质。

对于三个数或更多个数的情况,我们把 gcd ⁡ ( a , b , c ) = 1 \gcd(a, b, c) = 1 gcd(a,b,c)=1 的情况称为 a , b , c a, b, c a,b,c 互质;把 gcd ⁡ ( a , b ) = gcd ⁡ ( a , c ) = gcd ⁡ ( b , c ) = 1 \gcd(a, b) = \gcd(a, c) = \gcd(b, c) = 1 gcd(a,b)=gcd(a,c)=gcd(b,c)=1 的情况称为 a , b , c a, b, c a,b,c 两两互质

欧拉函数

1 ∼ N 1 \sim N 1N 中与 N N N 互质的数的个数被称为欧拉函数,记为 φ ( N ) \varphi(N) φ(N)(读作 phi of n)。


一、欧拉函数的通项公式

若在算术基本定理中, N = p 1 c 1 p 2 c 2 ⋯ p m c m N = p_1^{c_1} p_2^{c_2} \cdots p_m^{c_m} N=p1c1p2c2pmcm,则:

φ ( N ) = N ⋅ p 1 − 1 p 1 ⋅ p 2 − 1 p 2 ⋯ p m − 1 p m = N ⋅ ∏ 质数  p ∣ N ( 1 − 1 p ) \varphi(N) = N \cdot \frac{p_1 - 1}{p_1} \cdot \frac{p_2 - 1}{p_2} \cdots \frac{p_m - 1}{p_m} = N \cdot \prod_{\text{质数 } p \mid N} \left( 1 - \frac{1}{p} \right) φ(N)=Np1p11p2p21pmpm1=N质数 pN(1p1)

证明

p p p N N N 的质因子, 1 ∼ N 1 \sim N 1N p p p 的倍数有 p , 2 p , 3 p , … , ( N / p ) ⋅ p p, 2p, 3p, \dots, (N/p) \cdot p p,2p,3p,,(N/p)p,共 N / p N/p N/p 个。

同理,若 q q q 也是 N N N 的质因子,则 1 ∼ N 1 \sim N 1N q q q 的倍数有 N / q N/q N/q 个。如果我们将这 N / p + N / q N/p + N/q N/p+N/q 个数去掉,那么 p ⋅ q p \cdot q pq 的倍数被排除了两次,需要加回来一次。因此, 1 ∼ N 1 \sim N 1N 中不与 N N N 含有共同质因子 p p p q q q 的数的个数为:

N − N p − N q + N p q = N ⋅ ( 1 − 1 p − 1 q + 1 p q ) = N ⋅ ( 1 − 1 p ) ( 1 − 1 q ) N - \frac{N}{p} - \frac{N}{q} + \frac{N}{pq} = N \cdot \left( 1 - \frac{1}{p} - \frac{1}{q} + \frac{1}{pq} \right) = N \cdot \left( 1 - \frac{1}{p} \right) \left( 1 - \frac{1}{q} \right) NpNqN+pqN=N(1p1q1+pq1)=N(1p1)(1q1)

N N N 的所有质因子依次应用上述容斥原理,即可得到欧拉函数的通项公式。

证毕。

实现

根据欧拉函数的通项公式,我们在用线性筛求质数时,可以顺便求出 1 ∼ N 1 \sim N 1N 中每个数的欧拉函数值。

代码实现

int phi(int n) {
    int ans = n;
    for (int i = 2; i <= sqrt(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 ) = 1 \varphi(1) = 1 φ(1)=1

证明

gcd ⁡ ( 1 , 1 ) = 1 \gcd(1, 1) = 1 gcd(1,1)=1,所以 [ 1 , 1 ] [1, 1] [1,1] 中有 1 1 1 个数与 1 1 1 互质。

性质二:若 p p p 为质数,则 φ ( p ) = p − 1 \varphi(p) = p - 1 φ(p)=p1

证明

p p p 为质数,则 1 ∼ p − 1 1 \sim p-1 1p1 中的所有数都与 p p p 互质。

性质三:若 n = p k n = p^k n=pk p p p 为质数, k > 0 k > 0 k>0),则 φ ( n ) = p k − p k − 1 \varphi(n) = p^k - p^{k-1} φ(n)=pkpk1

证明

1 ∼ p k 1 \sim p^k 1pk 中,与 n n n 不互质的数恰好是那些含有质因子 p p p 的数,即 p p p 的倍数: p , 2 p , 3 p , … , p ⋅ p k − 1 p, 2p, 3p, \dots, p \cdot p^{k-1} p,2p,3p,,ppk1,共 p k − 1 p^{k-1} pk1 个。因此与 n n n 互质的数的个数为 p k − p k − 1 p^k - p^{k-1} pkpk1

证毕。

性质四: ∀ n > 1 \forall n > 1 n>1 1 ∼ n 1 \sim n 1n 中与 n n n 互质的所有数之和为 n ⋅ φ ( n ) 2 \dfrac{n \cdot \varphi(n)}{2} 2nφ(n)

证明

因为 gcd ⁡ ( n , x ) = gcd ⁡ ( n , n − x ) \gcd(n, x) = \gcd(n, n - x) gcd(n,x)=gcd(n,nx),所以与 n n n 互质的数 x x x n − x n - x nx 成对出现,每一对的平均值为 n / 2 n/2 n/2。因此所有与 n n n 互质的数的平均值也为 n / 2 n/2 n/2,总和即为 n ⋅ φ ( n ) 2 \dfrac{n \cdot \varphi(n)}{2} 2nφ(n)

证毕。

性质五:欧拉函数是积性函数

gcd ⁡ ( a , b ) = 1 \gcd(a, b) = 1 gcd(a,b)=1,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab) = \varphi(a) \varphi(b) φ(ab)=φ(a)φ(b)

证明

a a a b b b 分别分解质因数,由于 a a a b b b 互质,它们的质因子集合无交集。根据欧拉函数的通项公式直接展开,即可得到 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab) = \varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)

证毕。

特别地,当 n n n 为奇数时, gcd ⁡ ( n , 2 ) = 1 \gcd(n, 2) = 1 gcd(n,2)=1,因此 φ ( 2 n ) = φ ( 2 ) ⋅ φ ( n ) = φ ( n ) \varphi(2n) = \varphi(2) \cdot \varphi(n) = \varphi(n) φ(2n)=φ(2)φ(n)=φ(n)

性质六:积性函数的质因数分解展开

f f f 是积性函数,且在算术基本定理中 n = ∏ i = 1 m p i c i n = \prod_{i=1}^m p_i^{c_i} n=i=1mpici,则 f ( n ) = ∏ i = 1 m f ( p i c i ) f(n) = \prod_{i=1}^m f(p_i^{c_i}) f(n)=i=1mf(pici)

证明

n n n 分解为互质的质数幂因子 p 1 c 1 , p 2 c 2 , … , p m c m p_1^{c_1}, p_2^{c_2}, \dots, p_m^{c_m} p1c1,p2c2,,pmcm,它们两两互质。根据积性函数的定义反复应用 f ( a b ) = f ( a ) f ( b ) f(ab) = f(a)f(b) f(ab)=f(a)f(b) gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1),即可得到上式。

证毕。

性质七:设 p p p 为质数,若 p ∣ n p \mid n pn p 2 ∣ n p^2 \mid n p2n,则 φ ( n ) = φ ( n / p ) ⋅ p \varphi(n) = \varphi(n/p) \cdot p φ(n)=φ(n/p)p

证明

p ∣ n p \mid n pn p 2 ∣ n p^2 \mid n p2n,则 n n n n / p n/p n/p 包含相同的质因子集合,只是 p p p 的指数相差 1 1 1。将 φ ( n ) \varphi(n) φ(n) φ ( n / p ) \varphi(n/p) φ(n/p) 分别按通项公式写出,二者相除,商为 p p p

证毕。

性质八:设 p p p 为质数,若 p ∣ n p \mid n pn p 2 ∤ n p^2 \nmid n p2n,则 φ ( n ) = φ ( n / p ) ⋅ ( p − 1 ) \varphi(n) = \varphi(n/p) \cdot (p - 1) φ(n)=φ(n/p)(p1)

证明

p ∣ n p \mid n pn p 2 ∤ n p^2 \nmid n p2n,则 n / p n/p n/p p p p 互质。由欧拉函数是积性函数(性质五)可得:

φ ( n ) = φ ( p ⋅ ( n / p ) ) = φ ( p ) ⋅ φ ( n / p ) = ( p − 1 ) ⋅ φ ( n / p ) \varphi(n) = \varphi(p \cdot (n/p)) = \varphi(p) \cdot \varphi(n/p) = (p - 1) \cdot \varphi(n/p) φ(n)=φ(p(n/p))=φ(p)φ(n/p)=(p1)φ(n/p)

证毕。

性质九: ∑ d ∣ n φ ( d ) = n \displaystyle \sum_{d \mid n} \varphi(d) = n dnφ(d)=n

证明

f ( n ) = ∑ d ∣ n φ ( d ) f(n) = \sum_{d \mid n} \varphi(d) f(n)=dnφ(d)。若 n , m n, m n,m 互质,则 n n n 的约数与 m m m 的约数两两相乘可得到 n m nm nm 的所有约数,由乘法分配律可得:

f ( n m ) = ∑ d ∣ n m φ ( d ) = ( ∑ d ∣ n φ ( d ) ) ⋅ ( ∑ d ∣ m φ ( d ) ) = f ( n ) ⋅ f ( m ) f(nm) = \sum_{d \mid nm} \varphi(d) = \left( \sum_{d \mid n} \varphi(d) \right) \cdot \left( \sum_{d \mid m} \varphi(d) \right) = f(n) \cdot f(m) f(nm)=dnmφ(d)= dnφ(d) dmφ(d) =f(n)f(m)

f ( n ) f(n) f(n) 也是积性函数。

对于单个质因子 p m p^m pm,有:

f ( p m ) = ∑ d ∣ p m φ ( d ) = φ ( 1 ) + φ ( p ) + φ ( p 2 ) + ⋯ + φ ( p m ) f(p^m) = \sum_{d \mid p^m} \varphi(d) = \varphi(1) + \varphi(p) + \varphi(p^2) + \cdots + \varphi(p^m) f(pm)=dpmφ(d)=φ(1)+φ(p)+φ(p2)++φ(pm)

由性质三, φ ( p k ) = p k − p k − 1 \varphi(p^k) = p^k - p^{k-1} φ(pk)=pkpk1 k ≥ 1 k \ge 1 k1),这是一个等比数列求和,结果为 p m p^m pm

因此:

f ( n ) = ∏ i = 1 m f ( p i c i ) = ∏ i = 1 m p i c i = n f(n) = \prod_{i=1}^m f(p_i^{c_i}) = \prod_{i=1}^m p_i^{c_i} = n f(n)=i=1mf(pici)=i=1mpici=n

证毕。


四、总结

由前面提到的性质 4 和性质 5:

  1. p ∣ n p \mid n pn p 2 ∣ n p^2 \mid n p2n,则 φ ( n ) = φ ( n / p ) ⋅ p \varphi(n) = \varphi(n/p) \cdot p φ(n)=φ(n/p)p
  2. p ∣ n p \mid n pn p 2 ∤ n p^2 \nmid n p2n,则 φ ( n ) = φ ( n / p ) ⋅ ( p − 1 ) \varphi(n) = \varphi(n/p) \cdot (p - 1) φ(n)=φ(n/p)(p1)
    在线性筛法中,每个合数 n n n 只会被它的最小质因子 p p p 筛一次。我们恰好可以在此执行上面两条判断,从 φ ( n / p ) \varphi(n/p) φ(n/p) 递推到 φ ( n ) \varphi(n) φ(n)

代码实现

int v[MAX_N], prime[MAX_N], phi[MAX_N];
void euler(int n) {
    memset(v, 0, sizeof(v)); // 最小质因子
    m = 0; // 质数数量
    for (int i = 2; i <= n; i++) {
        if (v[i] == 0) { // i 是质数
            v[i] = i, prime[++m] = i;
            phi[i] = i - 1;
        }
        // 给当前的数 i 乘上一个质因子
        for (int j = 1; j <= m; j++) {
            // i 有比 prime[j] 更小的质因子,或者超出 n 的范围,停止循环
            if (prime[j] > v[i] || prime[j] > n / i) break;
            // prime[j] 是合数 i*prime[j] 的最小质因子
            v[i*prime[j]] = prime[j];
            phi[i*prime[j]] = 
                phi[i] * (i % prime[j] ? prime[j] - 1 : prime[j]);
        }
    }
}

三、习题

仪仗队

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐