【OI数论】四、同余、扩展欧几里得与数论四大定理
同余、扩展欧几里得与数论四大定理
本文部分参考李煜东《算法竞赛进阶指南》
快速过证明过程,戳这里。
想自己思考,戳这里。
更新记录:
- 2026/07/11:同余部分基本完工
概述
数论中通常有四大定理:威尔逊定理、欧拉定理、中国剩余定理、费马小定理。但威尔逊定理涉及阶乘运算,其数值增长极快,在 OI 领域中应用较少,故本文暂不介绍。中国剩余定理涉及同余方程组的求解,相关内容请参见这篇文章
定义
同余
若整数 a a a 与整数 b b b 除以正整数 m m m 的余数相等,则称 a , b a, b a,b 模 m m m 同余,记为 a ≡ b ( m o d m ) a \equiv b \pmod m a≡b(modm)。
同余类
对于任意 a ∈ [ 0 , m − 1 ] a \in [0, m - 1] a∈[0,m−1],集合 { a + k m ∣ k ∈ Z } \{a + km \mid k \in \mathbb{Z}\} {a+km∣k∈Z} 中的所有数模 m m m 同余,余数均为 a a a。该集合称为模 m m m 的一个同余类,简记为 a ˉ \bar{a} aˉ。
剩余系
模 m m m 的同余类共有 m m m 个,分别为 0 ˉ , 1 ˉ , 2 ˉ , … , m − 1 ‾ \bar{0}, \bar{1}, \bar{2}, \dots, \overline{m - 1} 0ˉ,1ˉ,2ˉ,…,m−1。它们构成模 m m m 的完全剩余系。
1 ∼ m 1 \sim m 1∼m 中与 m m m 互质的数所代表的同余类共有 φ ( m ) \varphi(m) φ(m) 个,它们构成模 m m m 的简化剩余系。
这一部分内容十分重要,请大家务必深入理解。
一、同余
前置结论: 若 n ∣ ( a − b ) n \mid (a - b) n∣(a−b),则 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn)。
证明
设 a = n k 1 + c a = nk_1 + c a=nk1+c, b = n k 2 + d b = nk_2 + d b=nk2+d,则
a − b = n ( k 1 − k 2 ) + ( c − d ) a - b = n(k_1 - k_2) + (c - d) a−b=n(k1−k2)+(c−d)
若 n ∣ ( a − b ) n \mid (a - b) n∣(a−b),则必须有 c − d = 0 c - d = 0 c−d=0,即 c = d c = d c=d。因此 a a a 与 b b b 除以 n n n 的余数相同,故 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn)。
证毕。
同余的基本性质
1. 自反性
a ≡ a ( m o d n ) a \equiv a \pmod n a≡a(modn)
2. 对称性
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn),则 b ≡ a ( m o d n ) b \equiv a \pmod n b≡a(modn)
3. 传递性
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn), b ≡ c ( m o d n ) b \equiv c \pmod n b≡c(modn),则 a ≡ c ( m o d n ) a \equiv c \pmod n a≡c(modn)
证明
设 a − b = n k 1 a - b = nk_1 a−b=nk1, b − c = n k 2 b - c = nk_2 b−c=nk2,则
a − c = n ( k 1 + k 2 ) a - c = n(k_1 + k_2) a−c=n(k1+k2)
因此 a ≡ c ( m o d n ) a \equiv c \pmod n a≡c(modn)。
证毕。
4. 同加性
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn),则 a + c ≡ b + c ( m o d n ) a + c \equiv b + c \pmod n a+c≡b+c(modn)
证明
设 a − b = n k a - b = nk a−b=nk,则 ( a + c ) − ( b + c ) = n k (a + c) - (b + c) = nk (a+c)−(b+c)=nk,故 a + c ≡ b + c ( m o d n ) a + c \equiv b + c \pmod n a+c≡b+c(modn)。
证毕。
5. 同乘性
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn),则 a c ≡ b c ( m o d n ) ac \equiv bc \pmod n ac≡bc(modn)
证明
设 a − b = n k a - b = nk a−b=nk,则 a c − b c = n k c ac - bc = nkc ac−bc=nkc,故 a c ≡ b c ( m o d n ) ac \equiv bc \pmod n ac≡bc(modn)。
证毕。
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn), c ≡ d ( m o d n ) c \equiv d \pmod n c≡d(modn),则 a c ≡ b d ( m o d n ) ac \equiv bd \pmod n ac≡bd(modn)
证明
设 a − b = n k 1 a - b = nk_1 a−b=nk1, c − d = n k 2 c - d = nk_2 c−d=nk2,则
a c − b d = a c − b c + b c − b d = c ( a − b ) + b ( c − d ) = n ( k 1 c + k 2 b ) ac - bd = ac - bc + bc - bd = c(a - b) + b(c - d) = n(k_1 c + k_2 b) ac−bd=ac−bc+bc−bd=c(a−b)+b(c−d)=n(k1c+k2b)
因此 a c ≡ b d ( m o d n ) ac \equiv bd \pmod n ac≡bd(modn)。
证毕。
6. 同幂性
若 a ≡ b ( m o d n ) a \equiv b \pmod n a≡b(modn),则 a k ≡ b k ( m o d n ) a^k \equiv b^k \pmod n ak≡bk(modn)( k k k 为正整数)
证明
设 a − b = n k a - b = nk a−b=nk,由恒等式
a k − b k = ( a − b ) ( a k − 1 + a k − 2 b + ⋯ + a b k − 2 + b k − 1 ) a^k - b^k = (a - b)(a^{k-1} + a^{k-2}b + \cdots + ab^{k-2} + b^{k-1}) ak−bk=(a−b)(ak−1+ak−2b+⋯+abk−2+bk−1)
可得 a k − b k = n k ( ⋯ ) a^k - b^k = nk(\cdots) ak−bk=nk(⋯),故 a k ≡ b k ( m o d n ) a^k \equiv b^k \pmod n ak≡bk(modn)。
证毕。
二、扩展欧几里得算法
前置知识:欧几里得算法(见链接文章末尾部分)
1. Bézout 定理(裴蜀定理)
对于任意整数 a , b a, b a,b,存在一对整数 x , y x, y x,y,满足
a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) ax+by=gcd(a,b)
证明
在欧几里得算法的最后一步,即 b = 0 b = 0 b=0 时,显然存在 x = 1 , y = 0 x = 1, y = 0 x=1,y=0,使得
a ⋅ 1 + 0 ⋅ 0 = gcd ( a , 0 ) a \cdot 1 + 0 \cdot 0 = \gcd(a, 0) a⋅1+0⋅0=gcd(a,0)
若 b > 0 b > 0 b>0,则 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a, b) = \gcd(b, a \bmod b) gcd(a,b)=gcd(b,amodb)。假设存在整数 x , y x, y x,y 满足
b ⋅ x + ( a m o d b ) ⋅ y = gcd ( b , a m o d b ) b \cdot x + (a \bmod b) \cdot y = \gcd(b, a \bmod b) b⋅x+(amodb)⋅y=gcd(b,amodb)
因为 a m o d b = a − b ⌊ a / b ⌋ a \bmod b = a - b \lfloor a/b \rfloor amodb=a−b⌊a/b⌋,代入得
b x + ( a − b ⌊ a / b ⌋ ) y = a y + b ( x − ⌊ a / b ⌋ y ) b x + (a - b \lfloor a/b \rfloor)y = a y + b(x - \lfloor a/b \rfloor y) bx+(a−b⌊a/b⌋)y=ay+b(x−⌊a/b⌋y)
令 x ′ = y x' = y x′=y, y ′ = x − ⌊ a / b ⌋ y y' = x - \lfloor a/b \rfloor y y′=x−⌊a/b⌋y,则
a x ′ + b y ′ = gcd ( a , b ) a x' + b y' = \gcd(a, b) ax′+by′=gcd(a,b)
对欧几里得算法的递归过程应用数学归纳法,可知 Bézout 定理成立。
证毕。
Bézout 定理的上述证明同时给出了整数 x x x 和 y y y 的计算方法,这种方法称为扩展欧几里得算法。
代码实现
int exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
int z = x;
x = y;
y = z - y * (a / b);
return d;
}
扩展欧几里得算法求线性不定方程
对于线性不定方程 a x + b y = c ax + by = c ax+by=c,由 Bézout 定理可知,方程存在整数解当且仅当 gcd ( a , b ) ∣ c \gcd(a, b) \mid c gcd(a,b)∣c。否则方程无整数解。
先用扩展欧几里得算法求得 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) ax+by=gcd(a,b) 的一组特解 x 0 , y 0 x_0, y_0 x0,y0,再乘上系数 c gcd ( a , b ) \dfrac{c}{\gcd(a, b)} gcd(a,b)c,即可得到原方程的一组特解:
{ x = c gcd ( a , b ) ⋅ x 0 y = c gcd ( a , b ) ⋅ y 0 \begin{cases} x = \dfrac{c}{\gcd(a, b)} \cdot x_0 \\[6pt] y = \dfrac{c}{\gcd(a, b)} \cdot y_0 \end{cases} ⎩
⎨
⎧x=gcd(a,b)c⋅x0y=gcd(a,b)c⋅y0
原方程的通解为:
x = c gcd ( a , b ) x 0 + k ⋅ b gcd ( a , b ) , y = c gcd ( a , b ) y 0 − k ⋅ a gcd ( a , b ) ( k ∈ Z ) x = \frac{c}{\gcd(a, b)}x_0 + k \cdot \frac{b}{\gcd(a, b)},\qquad y = \frac{c}{\gcd(a, b)}y_0 - k \cdot \frac{a}{\gcd(a, b)} \qquad (k \in \mathbb{Z}) x=gcd(a,b)cx0+k⋅gcd(a,b)b,y=gcd(a,b)cy0−k⋅gcd(a,b)a(k∈Z)
代码实现
int line_equation(int a, int b, int c, int &x, int &y) {
int d = exgcd(a, b, x, y);
if (c % d) return 0; // 方程无解
int k = c / d;
x = x * k;
y = y * k; // 求得一组特解,其余解可由通解公式得到
return 1;
}
2. 乘法逆元
若整数 b , m b, m b,m 互质,且 b ∣ a b \mid a b∣a,则存在一个整数 x x x,使得
a b ≡ a ⋅ x ( m o d m ) \frac{a}{b} \equiv a \cdot x \pmod m ba≡a⋅x(modm)
称 x x x 为 b b b 在模 m m m 意义下的乘法逆元,记为 b − 1 ( m o d m ) b^{-1} \pmod m b−1(modm)。
由上式可知:
b ⋅ b − 1 ≡ 1 ( m o d m ) b \cdot b^{-1} \equiv 1 \pmod m b⋅b−1≡1(modm)
如果模数 m m m 是质数(此时常用符号 p p p 表示),且 b < p b < p b<p,根据费马小定理, b p − 1 ≡ 1 ( m o d p ) b^{p-1} \equiv 1 \pmod p bp−1≡1(modp),即 b ⋅ b p − 2 ≡ 1 ( m o d p ) b \cdot b^{p-2} \equiv 1 \pmod p b⋅bp−2≡1(modp)。因此,当模数 p p p 为质数时, b p − 2 b^{p-2} bp−2 即为 b b b 的乘法逆元。
如果只保证 b b b 与 m m m 互质,则乘法逆元可通过求解同余方程 b ⋅ x ≡ 1 ( m o d m ) b \cdot x \equiv 1 \pmod m b⋅x≡1(modm) 得到(利用扩展欧几里得算法即可)。下一节我们将正式介绍线性同余方程及其求解方法。
有了乘法逆元,在计数类问题中遇到形如 a / b a / b a/b 的除法算式时,可以先将 a , b a, b a,b 分别对模数 p p p 取模,再计算 a ⋅ b − 1 m o d p a \cdot b^{-1} \bmod p a⋅b−1modp 作为结果。当然,前提是必须保证 b b b 与 p p p 互质(当 p p p 是质数时,等价于 b b b 不是 p p p 的倍数)。
直接计算 a / b m o d p a / b \bmod p a/bmodp 时,若 a a a、 b b b 过大,直接相除可能溢出精度,且除法不满足模运算的分配律。因此可将其转化为乘法逆元来求: a ⋅ b − 1 m o d p a \cdot b^{-1} \bmod p a⋅b−1modp。
代码实现
// 利用费马小定理求 b 在模 m 下的逆元:b^(m-2) % m
int quick_pow(int b, int m) {
int r = 1, base = b, exp = m - 2;
while (exp) {
if (exp & 1) r = r * base % m;
base = base * base % m;
exp >>= 1;
}
return r % m;
}
三、数论四大定理(中的两个)
1. 欧拉定理
若正整数 a a a 与 n n n 互质,则
a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)} \equiv 1 \pmod n aφ(n)≡1(modn)
证明
设 n n n 的简化剩余系为 { a 1 ‾ , a 2 ‾ , … , a φ ( n ) ‾ } \{\overline{a_1}, \overline{a_2}, \dots, \overline{a_{\varphi(n)}}\} {a1,a2,…,aφ(n)}。
对任意 a i , a j a_i, a_j ai,aj,若 a ⋅ a i ≡ a ⋅ a j ( m o d n ) a \cdot a_i \equiv a \cdot a_j \pmod n a⋅ai≡a⋅aj(modn),则 a ( a i − a j ) ≡ 0 ( m o d n ) a(a_i - a_j) \equiv 0 \pmod n a(ai−aj)≡0(modn)。因为 gcd ( a , n ) = 1 \gcd(a, n) = 1 gcd(a,n)=1,所以 a i − a j ≡ 0 ( m o d n ) a_i - a_j \equiv 0 \pmod n ai−aj≡0(modn),即 a i ≡ a j a_i \equiv a_j ai≡aj。故当 a i ≠ a j a_i \neq a_j ai=aj 时, a a i a a_i aai 与 a a j a a_j aaj 也属于不同的同余类。
又因为简化剩余系关于模 n n n 乘法封闭,所以 a a i ‾ \overline{a a_i} aai 仍在简化剩余系中。因此,集合
{ a 1 ‾ , a 2 ‾ , … , a φ ( n ) ‾ } \{\overline{a_1}, \overline{a_2}, \dots, \overline{a_{\varphi(n)}}\} {a1,a2,…,aφ(n)}
与集合
{ a a 1 ‾ , a a 2 ‾ , … , a a φ ( n ) ‾ } \{\overline{a a_1}, \overline{a a_2}, \dots, \overline{a a_{\varphi(n)}}\} {aa1,aa2,…,aaφ(n)}
都表示 n n n 的简化剩余系(仅排列顺序可能不同)。
将两个集合中的所有元素分别相乘:
a φ ( n ) ⋅ a 1 a 2 ⋯ a φ ( n ) ≡ ( a a 1 ) ( a a 2 ) ⋯ ( a a φ ( n ) ) ≡ a 1 a 2 ⋯ a φ ( n ) ( m o d n ) a^{\varphi(n)} \cdot a_1 a_2 \cdots a_{\varphi(n)} \equiv (a a_1)(a a_2) \cdots (a a_{\varphi(n)}) \equiv a_1 a_2 \cdots a_{\varphi(n)} \pmod n aφ(n)⋅a1a2⋯aφ(n)≡(aa1)(aa2)⋯(aaφ(n))≡a1a2⋯aφ(n)(modn)
由于 a 1 a 2 ⋯ a φ ( n ) a_1 a_2 \cdots a_{\varphi(n)} a1a2⋯aφ(n) 与 n n n 互质,可约去,故
a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)} \equiv 1 \pmod n aφ(n)≡1(modn)
证毕。
推论
若正整数 a a a 与 n n n 互质,则对于任意正整数 b b b,有
a b ≡ a b m o d φ ( n ) ( m o d n ) a^b \equiv a^{b \bmod \varphi(n)} \pmod n ab≡abmodφ(n)(modn)
证明
设 b = q ⋅ φ ( n ) + r b = q \cdot \varphi(n) + r b=q⋅φ(n)+r,其中 0 ≤ r < φ ( n ) 0 \le r < \varphi(n) 0≤r<φ(n),则 r = b m o d φ ( n ) r = b \bmod \varphi(n) r=bmodφ(n)。
a b = a q ⋅ φ ( n ) + r = ( a φ ( n ) ) q ⋅ a r ≡ 1 q ⋅ a r ≡ a b m o d φ ( n ) ( m o d n ) a^b = a^{q \cdot \varphi(n) + r} = (a^{\varphi(n)})^q \cdot a^r \equiv 1^q \cdot a^r \equiv a^{b \bmod \varphi(n)} \pmod n ab=aq⋅φ(n)+r=(aφ(n))q⋅ar≡1q⋅ar≡abmodφ(n)(modn)
证毕。
2. 费马小定理
若 p p p 是质数,则对于任意整数 a a a,有
a p ≡ a ( m o d p ) a^p \equiv a \pmod p ap≡a(modp)
证明
若 a a a 不是 p p p 的倍数,则 gcd ( a , p ) = 1 \gcd(a, p) = 1 gcd(a,p)=1。由欧拉定理取 n = p n = p n=p, φ ( p ) = p − 1 \varphi(p) = p - 1 φ(p)=p−1,得 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod p ap−1≡1(modp),两边同乘 a a a 即得 a p ≡ a ( m o d p ) a^p \equiv a \pmod p ap≡a(modp)。
若 a a a 是 p p p 的倍数,则 a p ≡ a ≡ 0 ( m o d p ) a^p \equiv a \equiv 0 \pmod p ap≡a≡0(modp),命题显然成立。
证毕。
3. 扩展欧拉定理(降幂公式)
当 a a a 与 n n n 不一定互质时,对于 b > φ ( n ) b > \varphi(n) b>φ(n),有
a b ≡ a b m o d φ ( n ) + φ ( n ) ( m o d n ) a^b \equiv a^{b \bmod \varphi(n) + \varphi(n)} \pmod n ab≡abmodφ(n)+φ(n)(modn)
这意味着即使底数与模数不互质,我们仍然可以将指数缩小到容易计算的范围内。该结论可通过寻找 a b m o d n a^b \bmod n abmodn 的指数循环节来证明,此处留给学有余力的读者自行思考。
应用提示
许多计数类题目要求将答案对一个质数 p p p 取模后输出。
- 对于 a + b a + b a+b、 a − b a - b a−b、 a ⋅ b a \cdot b a⋅b 等运算,可以先将 a , b a, b a,b 对 p p p 取模后再计算。
- 对于乘方运算 a b a^b ab,根据欧拉定理的推论,可以先将底数 a a a 对 p p p 取模、指数 b b b 对 φ ( p ) \varphi(p) φ(p) 取模,再计算乘方。
- 当 a a a 与 p p p 不互质时,若 b > φ ( p ) b > \varphi(p) b>φ(p),可使用扩展欧拉定理进行降幂。
四、习题
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)