同余、扩展欧几里得与数论四大定理

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

快速过证明过程,戳这里

想自己思考,戳这里

更新记录:

  • 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 ab(modm)

同余类
对于任意 a ∈ [ 0 , m − 1 ] a \in [0, m - 1] a[0,m1],集合 { a + k m ∣ k ∈ Z } \{a + km \mid k \in \mathbb{Z}\} {a+kmkZ} 中的所有数模 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ˉ,,m1。它们构成模 m m m完全剩余系

1 ∼ m 1 \sim m 1m 中与 m m m 互质的数所代表的同余类共有 φ ( m ) \varphi(m) φ(m) 个,它们构成模 m m m简化剩余系


这一部分内容十分重要,请大家务必深入理解。

一、同余

前置结论: n ∣ ( a − b ) n \mid (a - b) n(ab),则 a ≡ b ( m o d n ) a \equiv b \pmod n ab(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) ab=n(k1k2)+(cd)
n ∣ ( a − b ) n \mid (a - b) n(ab),则必须有 c − d = 0 c - d = 0 cd=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 ab(modn)

证毕。

同余的基本性质

1. 自反性

a ≡ a ( m o d n ) a \equiv a \pmod n aa(modn)

2. 对称性

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn),则 b ≡ a ( m o d n ) b \equiv a \pmod n ba(modn)

3. 传递性

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn) b ≡ c ( m o d n ) b \equiv c \pmod n bc(modn),则 a ≡ c ( m o d n ) a \equiv c \pmod n ac(modn)

证明
a − b = n k 1 a - b = nk_1 ab=nk1 b − c = n k 2 b - c = nk_2 bc=nk2,则
a − c = n ( k 1 + k 2 ) a - c = n(k_1 + k_2) ac=n(k1+k2)
因此 a ≡ c ( m o d n ) a \equiv c \pmod n ac(modn)

证毕。

4. 同加性

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn),则 a + c ≡ b + c ( m o d n ) a + c \equiv b + c \pmod n a+cb+c(modn)

证明
a − b = n k a - b = nk ab=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+cb+c(modn)

证毕。

5. 同乘性

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn),则 a c ≡ b c ( m o d n ) ac \equiv bc \pmod n acbc(modn)

证明
a − b = n k a - b = nk ab=nk,则 a c − b c = n k c ac - bc = nkc acbc=nkc,故 a c ≡ b c ( m o d n ) ac \equiv bc \pmod n acbc(modn)

证毕。

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn) c ≡ d ( m o d n ) c \equiv d \pmod n cd(modn),则 a c ≡ b d ( m o d n ) ac \equiv bd \pmod n acbd(modn)

证明
a − b = n k 1 a - b = nk_1 ab=nk1 c − d = n k 2 c - d = nk_2 cd=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) acbd=acbc+bcbd=c(ab)+b(cd)=n(k1c+k2b)
因此 a c ≡ b d ( m o d n ) ac \equiv bd \pmod n acbd(modn)

证毕。

6. 同幂性

a ≡ b ( m o d n ) a \equiv b \pmod n ab(modn),则 a k ≡ b k ( m o d n ) a^k \equiv b^k \pmod n akbk(modn) k k k 为正整数)

证明
a − b = n k a - b = nk ab=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}) akbk=(ab)(ak1+ak2b++abk2+bk1)
可得 a k − b k = n k ( ⋯   ) a^k - b^k = nk(\cdots) akbk=nk(),故 a k ≡ b k ( m o d n ) a^k \equiv b^k \pmod n akbk(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) a1+00=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) bx+(amodb)y=gcd(b,amodb)
因为 a   m o d   b = a − b ⌊ a / b ⌋ a \bmod b = a - b \lfloor a/b \rfloor amodb=aba/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+(aba/b⌋)y=ay+b(xa/by)
x ′ = y x' = y x=y y ′ = x − ⌊ a / b ⌋ y y' = x - \lfloor a/b \rfloor y y=xa/by,则
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)cx0y=gcd(a,b)cy0

原方程的通解为:
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+kgcd(a,b)b,y=gcd(a,b)cy0kgcd(a,b)a(kZ)

代码实现

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 ba,则存在一个整数 x x x,使得
a b ≡ a ⋅ x ( m o d m ) \frac{a}{b} \equiv a \cdot x \pmod m baax(modm)
x x x b b b 在模 m m m 意义下的乘法逆元,记为 b − 1 ( m o d m ) b^{-1} \pmod m b1(modm)

由上式可知:
b ⋅ b − 1 ≡ 1 ( m o d m ) b \cdot b^{-1} \equiv 1 \pmod m bb11(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 bp11(modp),即 b ⋅ b p − 2 ≡ 1 ( m o d p ) b \cdot b^{p-2} \equiv 1 \pmod p bbp21(modp)。因此,当模数 p p p 为质数时, b p − 2 b^{p-2} bp2 即为 b b b 的乘法逆元。

如果只保证 b b b m m m 互质,则乘法逆元可通过求解同余方程 b ⋅ x ≡ 1 ( m o d m ) b \cdot x \equiv 1 \pmod m bx1(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 ab1modp 作为结果。当然,前提是必须保证 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 ab1modp

代码实现

// 利用费马小定理求 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 aaiaaj(modn),则 a ( a i − a j ) ≡ 0 ( m o d n ) a(a_i - a_j) \equiv 0 \pmod n a(aiaj)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 aiaj0(modn),即 a i ≡ a j a_i \equiv a_j aiaj。故当 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)a1a2aφ(n)(aa1)(aa2)(aaφ(n))a1a2aφ(n)(modn)
由于 a 1 a 2 ⋯ a φ ( n ) a_1 a_2 \cdots a_{\varphi(n)} a1a2aφ(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 ababmodφ(n)(modn)

证明
b = q ⋅ φ ( n ) + r b = q \cdot \varphi(n) + r b=qφ(n)+r,其中 0 ≤ r < φ ( n ) 0 \le r < \varphi(n) 0r<φ(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))qar1qarabmodφ(n)(modn)

证毕。

2. 费马小定理

p p p 是质数,则对于任意整数 a a a,有
a p ≡ a ( m o d p ) a^p \equiv a \pmod p apa(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)=p1,得 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod p ap11(modp),两边同乘 a a a 即得 a p ≡ a ( m o d p ) a^p \equiv a \pmod p apa(modp)

a a a p p p 的倍数,则 a p ≡ a ≡ 0 ( m o d p ) a^p \equiv a \equiv 0 \pmod p apa0(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 ababmodφ(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 ab a ⋅ b a \cdot b ab 等运算,可以先将 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),可使用扩展欧拉定理进行降幂。

四、习题

The Luckiest Number

Logo

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

更多推荐