【OI数论】三、互质与欧拉函数
互质与欧拉函数
本文部分参考李煜东《算法竞赛进阶指南》
更新记录:
- 2026/07/10:互质与欧拉函数部分基本完工
概述
定义
互质
∀ a , b ∈ N \forall a, b \in \mathbb{N} ∀a,b∈N,若 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 1∼N 中与 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=p1c1p2c2⋯pmcm,则:
φ ( 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)=N⋅p1p1−1⋅p2p2−1⋯pmpm−1=N⋅质数 p∣N∏(1−p1)
证明
设 p p p 是 N N N 的质因子, 1 ∼ N 1 \sim N 1∼N 中 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 1∼N 中 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 p⋅q 的倍数被排除了两次,需要加回来一次。因此, 1 ∼ N 1 \sim N 1∼N 中不与 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) N−pN−qN+pqN=N⋅(1−p1−q1+pq1)=N⋅(1−p1)(1−q1)
对 N N N 的所有质因子依次应用上述容斥原理,即可得到欧拉函数的通项公式。
证毕。
实现
根据欧拉函数的通项公式,我们在用线性筛求质数时,可以顺便求出 1 ∼ N 1 \sim N 1∼N 中每个数的欧拉函数值。
代码实现
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)=p−1
证明
若 p p p 为质数,则 1 ∼ p − 1 1 \sim p-1 1∼p−1 中的所有数都与 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)=pk−pk−1
证明
在 1 ∼ p k 1 \sim p^k 1∼pk 中,与 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,…,p⋅pk−1,共 p k − 1 p^{k-1} pk−1 个。因此与 n n n 互质的数的个数为 p k − p k − 1 p^k - p^{k-1} pk−pk−1。
证毕。
性质四: ∀ n > 1 \forall n > 1 ∀n>1, 1 ∼ n 1 \sim n 1∼n 中与 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,n−x),所以与 n n n 互质的数 x x x 与 n − x n - x n−x 成对出现,每一对的平均值为 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 p∣n 且 p 2 ∣ n p^2 \mid n p2∣n,则 φ ( n ) = φ ( n / p ) ⋅ p \varphi(n) = \varphi(n/p) \cdot p φ(n)=φ(n/p)⋅p
证明
若 p ∣ n p \mid n p∣n 且 p 2 ∣ n p^2 \mid n p2∣n,则 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 p∣n 但 p 2 ∤ n p^2 \nmid n p2∤n,则 φ ( n ) = φ ( n / p ) ⋅ ( p − 1 ) \varphi(n) = \varphi(n/p) \cdot (p - 1) φ(n)=φ(n/p)⋅(p−1)
证明
若 p ∣ n p \mid n p∣n 但 p 2 ∤ n p^2 \nmid n p2∤n,则 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)=(p−1)⋅φ(n/p)
证毕。
性质九: ∑ d ∣ n φ ( d ) = n \displaystyle \sum_{d \mid n} \varphi(d) = n d∣n∑φ(d)=n
证明
设 f ( n ) = ∑ d ∣ n φ ( d ) f(n) = \sum_{d \mid n} \varphi(d) f(n)=∑d∣nφ(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)=d∣nm∑φ(d)= d∣n∑φ(d) ⋅ d∣m∑φ(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)=d∣pm∑φ(d)=φ(1)+φ(p)+φ(p2)+⋯+φ(pm)
由性质三, φ ( p k ) = p k − p k − 1 \varphi(p^k) = p^k - p^{k-1} φ(pk)=pk−pk−1( k ≥ 1 k \ge 1 k≥1),这是一个等比数列求和,结果为 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=1∏mf(pici)=i=1∏mpici=n
证毕。
四、总结
由前面提到的性质 4 和性质 5:
- 若 p ∣ n p \mid n p∣n 且 p 2 ∣ n p^2 \mid n p2∣n,则 φ ( n ) = φ ( n / p ) ⋅ p \varphi(n) = \varphi(n/p) \cdot p φ(n)=φ(n/p)⋅p;
- 若 p ∣ n p \mid n p∣n 但 p 2 ∤ n p^2 \nmid n p2∤n,则 φ ( n ) = φ ( n / p ) ⋅ ( p − 1 ) \varphi(n) = \varphi(n/p) \cdot (p - 1) φ(n)=φ(n/p)⋅(p−1)。
在线性筛法中,每个合数 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]);
}
}
}
三、习题
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)