同余 (Congruence)是数论的「分类工具」——把所有整数按 除以 m m m 的余数 归成 m m m 类。它做的事情,就是把整数无穷无尽的乘法结构,搬到一个只有 m m m 个元素的有限集 { 0 , 1 , … , m − 1 } \set{0,1,\dots,m-1} { 0 , 1 , … , m − 1 } 上。
为什么要这么做?因为很多问题只关心余数,不关心整个数。比如「今天星期三,100 100 100 天后星期几」,没人会真的去数 100 100 100 天,而是看 100 m o d 7 = 2 100\bmod 7=2 100 mod 7 = 2 ,往后推两天。同余就是把这种「只看余数」的直觉变成一套能严格运算的代数。它后来成了现代密码学(RSA、椭圆曲线)的核心语言。
整数 a , b a,b a , b ,正整数 m m m ,若 m ∣ ( a − b ) m\mid(a-b) m ∣ ( a − b ) ,称 a a a 同余于 b b b 模 m m m ,记为:
a ≡ b ( m o d m ) a\equiv b\pmod m a ≡ b ( mod m )
这里 m m m 叫 模 (Modulus)。等价的说法是:a a a 与 b b b 除以 m m m 余数相同 。两种定义可以随手互换——「差被 m m m 整除」便于代数推导,「余数相同」便于直觉理解。
模 m m m 同余满足 自反、对称、传递 ,因此它是 Z \mathbb{Z} Z 上的一个 等价关系 。等价关系会把整个集合切成互不相交的小块,这里切出的每一块就是下面要讲的「剩余类」。
同余最有用的地方是它对加减乘 封闭 。设 a ≡ b , c ≡ d ( m o d m ) a\equiv b,\ c\equiv d\pmod m a ≡ b , c ≡ d ( mod m ) :
a ± c ≡ b ± d ( m o d m ) , a c ≡ b d ( m o d m ) a\pm c\equiv b\pm d\pmod m,\quad ac\equiv bd\pmod m a ± c ≡ b ± d ( mod m ) , a c ≡ b d ( mod m )
a k ≡ b k ( m o d m ) ( k ∈ N ) a^k\equiv b^k\pmod m\quad(k\in\mathbb{N}) a k ≡ b k ( mod m ) ( k ∈ N )
这意味着在任何加减乘(含乘方)的表达式里,都可以 随时把某个数换成它模 m m m 的余数 ,结果模 m m m 不变。算大数取模时,先把每个因子缩小再算,是最基本的提速手段。
例:求 123 × 456 m o d 7 123\times 456\bmod 7 123 × 456 mod 7 。先各自缩小:123 ≡ 4 ( m o d 7 ) 123\equiv 4\pmod 7 123 ≡ 4 ( mod 7 ) (123 = 7 × 17 + 4 123=7\times 17+4 123 = 7 × 17 + 4 ),456 ≡ 1 ( m o d 7 ) 456\equiv 1\pmod 7 456 ≡ 1 ( mod 7 ) (456 = 7 × 65 + 1 456=7\times 65+1 456 = 7 × 65 + 1 ),于是
123 × 456 ≡ 4 × 1 = 4 ( m o d 7 ) 123\times 456\equiv 4\times 1=4\pmod 7 123 × 456 ≡ 4 × 1 = 4 ( mod 7 )
不必真去算 123 × 456 = 56088 123\times 456=56088 123 × 456 = 56088 再取模——先缩后算总是更轻。
例:判断 2 10 + 1 2^{10}+1 2 10 + 1 能否被 11 11 11 整除。2 10 = 1024 2^{10}=1024 2 10 = 1024 ,但直接看 2 5 = 32 ≡ 10 ≡ − 1 ( m o d 11 ) 2^5=32\equiv 10\equiv-1\pmod{11} 2 5 = 32 ≡ 10 ≡ − 1 ( mod 11 ) ,故 2 10 = ( 2 5 ) 2 ≡ ( − 1 ) 2 = 1 ( m o d 11 ) 2^{10}=(2^5)^2\equiv(-1)^2=1\pmod{11} 2 10 = ( 2 5 ) 2 ≡ ( − 1 ) 2 = 1 ( mod 11 ) ,于是 2 10 + 1 ≡ 2 ( m o d 11 ) ≠ 0 2^{10}+1\equiv 2\pmod{11}\ne 0 2 10 + 1 ≡ 2 ( mod 11 ) = 0 ,不能整除。把底数先压到 ± 1 \pm 1 ± 1 再乘方,是手算幂模的常用捷径。
加减乘都没问题,唯独 除法(约去公因子)要小心 :
a c ≡ b c ( m o d m ) ⇏ a ≡ b ( m o d m ) ac\equiv bc\pmod m\nRightarrow a\equiv b\pmod m a c ≡ b c ( mod m ) ⇏ a ≡ b ( mod m )
比如 2 × 3 ≡ 2 × 0 ( m o d 6 ) 2\times 3\equiv 2\times 0\pmod 6 2 × 3 ≡ 2 × 0 ( mod 6 ) ,但 3 ≢ 0 ( m o d 6 ) 3\not\equiv 0\pmod 6 3 ≡ 0 ( mod 6 ) 。正确的约去法则是:
a c ≡ b c ( m o d m ) ⇒ a ≡ b ( m o d m gcd ( c , m ) ) ac\equiv bc\pmod m\Rightarrow a\equiv b\pmod{\tfrac{m}{\gcd(c,m)}} a c ≡ b c ( mod m ) ⇒ a ≡ b ( mod g c d ( c , m ) m )
特别地,当 gcd ( c , m ) = 1 \gcd(c,m)=1 g cd( c , m ) = 1 时,模数不变,可以放心约去。这正是「互素」条件反复出现的原因。
模 m m m 把整数分成 m m m 个 剩余类 (同余类),第 i i i 类是所有除以 m m m 余 i i i 的整数。它们构成 剩余类环 Z m = { [ 0 ] , [ 1 ] , … , [ m − 1 ] } \mathbb{Z}_m=\set{[0],[1],\dots,[m-1]} Z m = { [ 0 ] , [ 1 ] , … , [ m − 1 ] } ,环上的加法和乘法就是上面「运算保持」赋予的。
从每个剩余类里各取一个代表,凑成的 m m m 个数(模 m m m 两两不同余),称为 完全剩余系 (Complete Residue System)。最常用的是 { 0 , 1 , … , m − 1 } \set{0,1,\dots,m-1} { 0 , 1 , … , m − 1 } 。
完全剩余系里 与 m m m 互素 的那些代表,构成 简化剩余系 (Reduced Residue System,也叫既约剩余系)。它的元素个数记为 欧拉函数 φ ( m ) \varphi(m) φ ( m ) 。
简化剩余系为什么重要?因为只有与 m m m 互素的数在模 m m m 下才「可逆」(存在乘法逆元)。这些可逆元在乘法下自成一个封闭系统——简化剩余系对乘法封闭:互素的两个数之积仍与 m m m 互素。欧拉定理正是建立在这个系统上的。
φ ( m ) \varphi(m) φ ( m ) 表示 { 1 , 2 , … , m } \set{1,2,\dots,m} { 1 , 2 , … , m } 中与 m m m 互素的整数个数。
φ ( m ) = m ∏ p ∣ m ( 1 − 1 p ) \varphi(m)=m\prod_{p\mid m}\left(1-\frac{1}{p}\right) φ ( m ) = m p ∣ m ∏ ( 1 − p 1 )
其中 p p p 取遍 m m m 的不同素因子。直觉上:从 m m m 个数出发,每个素因子 p p p 都「筛掉」其中 1 p \frac1p p 1 的比例(即 p p p 的倍数),各素因子互相独立地筛,乘起来就是剩下的占比。
φ ( p ) = p − 1 \varphi(p)=p-1 φ ( p ) = p − 1 (p p p 为素数,除 p p p 自己外全都互素)。
φ ( p k ) = p k − p k − 1 \varphi(p^k)=p^k-p^{k-1} φ ( p k ) = p k − p k − 1 。
积性 :gcd ( a , b ) = 1 ⇒ φ ( a b ) = φ ( a ) φ ( b ) \gcd(a,b)=1\Rightarrow\varphi(ab)=\varphi(a)\varphi(b) g cd( a , b ) = 1 ⇒ φ ( ab ) = φ ( a ) φ ( b ) 。
更多性质详见 积性函数 。
设 p p p 是素数,gcd ( a , p ) = 1 \gcd(a,p)=1 g cd( a , p ) = 1 ,则:
a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod p a p − 1 ≡ 1 ( mod p )
更一般地,对 任意 整数 a a a 都有 a p ≡ a ( m o d p ) a^p\equiv a\pmod p a p ≡ a ( mod p ) (不要求互素)。
直觉上为什么成立?把简化剩余系 { 1 , 2 , … , p − 1 } \set{1,2,\dots,p-1} { 1 , 2 , … , p − 1 } 每个元素都乘以 a a a ,由于 a a a 与 p p p 互素,乘出来的 { a , 2 a , … , ( p − 1 ) a } \set{a,2a,\dots,(p-1)a} { a , 2 a , … , ( p − 1 ) a } 模 p p p 恰好还是原来那 p − 1 p-1 p − 1 个数(只是被打乱了顺序)。于是两组的乘积模 p p p 相等:a p − 1 ( p − 1 ) ! ≡ ( p − 1 ) ! ( m o d p ) a^{p-1}(p-1)!\equiv(p-1)!\pmod p a p − 1 ( p − 1 )! ≡ ( p − 1 )! ( mod p ) ,约去 ( p − 1 ) ! (p-1)! ( p − 1 )! (它与 p p p 互素)即得结论。
例:用费马小定理速算 3 100 m o d 7 3^{100}\bmod 7 3 100 mod 7 。7 7 7 是素数、gcd ( 3 , 7 ) = 1 \gcd(3,7)=1 g cd( 3 , 7 ) = 1 ,故 3 6 ≡ 1 ( m o d 7 ) 3^6\equiv 1\pmod 7 3 6 ≡ 1 ( mod 7 ) 。把指数对 6 6 6 取模:100 = 6 × 16 + 4 100=6\times 16+4 100 = 6 × 16 + 4 ,于是
3 100 = ( 3 6 ) 16 ⋅ 3 4 ≡ 1 16 ⋅ 3 4 = 81 ≡ 4 ( m o d 7 ) 3^{100}=\bigl(3^6\bigr)^{16}\cdot 3^4\equiv 1^{16}\cdot 3^4=81\equiv 4\pmod 7 3 100 = ( 3 6 ) 16 ⋅ 3 4 ≡ 1 16 ⋅ 3 4 = 81 ≡ 4 ( mod 7 )
(81 = 7 × 11 + 4 81=7\times 11+4 81 = 7 × 11 + 4 。)一步就把指数从 100 100 100 压到 4 4 4 ,比快速幂还快。
费马小定理的推广,把素数模换成任意模。设 gcd ( a , m ) = 1 \gcd(a,m)=1 g cd( a , m ) = 1 ,则:
a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1\pmod m a φ ( m ) ≡ 1 ( mod m )
证明思路与上面如出一辙,只是把整个简化剩余系(共 φ ( m ) \varphi(m) φ ( m ) 个元素)乘以 a a a 后重新排列。当 m = p m=p m = p 时 φ ( p ) = p − 1 \varphi(p)=p-1 φ ( p ) = p − 1 ,正好退化为费马小定理。
欧拉定理最实用的推论是 降幂 :求 a N m o d m a^N\bmod m a N mod m 时,若 gcd ( a , m ) = 1 \gcd(a,m)=1 g cd( a , m ) = 1 ,可以把指数 N N N 对 φ ( m ) \varphi(m) φ ( m ) 取模,即 a N ≡ a N m o d φ ( m ) ( m o d m ) a^N\equiv a^{N\bmod\varphi(m)}\pmod m a N ≡ a N mod φ ( m ) ( mod m ) ,瞬间把天文数字的指数压到 φ ( m ) \varphi(m) φ ( m ) 以内。这正是 RSA 加密里「公钥指数」与「私钥指数」互逆的数学根基。(当 a a a 与 m m m 不互素时,需要用扩展欧拉定理处理。)
例:求 7 222 m o d 10 7^{222}\bmod 10 7 222 mod 10 。模 10 10 10 不是素数,用欧拉定理:φ ( 10 ) = φ ( 2 ) φ ( 5 ) = 1 × 4 = 4 \varphi(10)=\varphi(2)\varphi(5)=1\times 4=4 φ ( 10 ) = φ ( 2 ) φ ( 5 ) = 1 × 4 = 4 ,且 gcd ( 7 , 10 ) = 1 \gcd(7,10)=1 g cd( 7 , 10 ) = 1 ,故 7 4 ≡ 1 ( m o d 10 ) 7^4\equiv 1\pmod{10} 7 4 ≡ 1 ( mod 10 ) 。指数对 4 4 4 取模 222 = 4 × 55 + 2 222=4\times 55+2 222 = 4 × 55 + 2 ,于是
7 222 ≡ 7 2 = 49 ≡ 9 ( m o d 10 ) 7^{222}\equiv 7^{2}=49\equiv 9\pmod{10} 7 222 ≡ 7 2 = 49 ≡ 9 ( mod 10 )
即 7 222 7^{222} 7 222 的个位数字是 9 9 9 。「求末位」就是模 10 10 10 ,正是降幂的典型用场。
它给出了素数的一个充要刻画:p p p 是素数当且仅当
( p − 1 ) ! ≡ − 1 ( m o d p ) (p-1)!\equiv -1\pmod p ( p − 1 )! ≡ − 1 ( mod p )
直觉上,{ 1 , 2 , … , p − 1 } \set{1,2,\dots,p-1} { 1 , 2 , … , p − 1 } 里每个元素都能在模 p p p 下找到自己的逆元,绝大多数和它的逆元配成一对、乘积为 1 1 1 ;唯一「自己是自己逆元」的只有 1 1 1 和 p − 1 p-1 p − 1 (即 − 1 -1 − 1 )。配对相消后只剩下 1 ⋅ ( p − 1 ) ≡ − 1 1\cdot(p-1)\equiv-1 1 ⋅ ( p − 1 ) ≡ − 1 。理论价值大于计算价值——阶乘增长太快,不适合用来实际判素。
例:在 p = 7 p=7 p = 7 上验证,并看清配对。逆元配对为 2 ⋅ 4 ≡ 1 2\cdot 4\equiv 1 2 ⋅ 4 ≡ 1 、3 ⋅ 5 ≡ 1 ( m o d 7 ) 3\cdot 5\equiv 1\pmod 7 3 ⋅ 5 ≡ 1 ( mod 7 ) ,自逆的是 1 1 1 和 6 6 6 。于是
6 ! = 1 ⋅ ( 2 ⋅ 4 ) ⋅ ( 3 ⋅ 5 ) ⋅ 6 ≡ 1 ⋅ 1 ⋅ 1 ⋅ 6 = 6 ≡ − 1 ( m o d 7 ) 6!=1\cdot(2\cdot 4)\cdot(3\cdot 5)\cdot 6\equiv 1\cdot 1\cdot 1\cdot 6=6\equiv-1\pmod 7 6 ! = 1 ⋅ ( 2 ⋅ 4 ) ⋅ ( 3 ⋅ 5 ) ⋅ 6 ≡ 1 ⋅ 1 ⋅ 1 ⋅ 6 = 6 ≡ − 1 ( mod 7 )
确实 ( p − 1 ) ! ≡ − 1 (p-1)!\equiv-1 ( p − 1 )! ≡ − 1 。反观合数 m = 6 m=6 m = 6 :5 ! = 120 = 6 × 20 ≡ 0 ( m o d 6 ) 5!=120=6\times 20\equiv 0\pmod 6 5 ! = 120 = 6 × 20 ≡ 0 ( mod 6 ) ,不是 − 1 -1 − 1 ——合数处阶乘里会凑出模 m m m 为 0 0 0 的因子,这正是威尔逊定理能判素的根据。
求 a n m o d m a^n\bmod m a n mod m 时,若把 a a a 自乘 n n n 次要 O ( n ) O(n) O ( n ) 步,指数一大就崩。快速幂 (Fast Exponentiation)用 n n n 的 二进制分解 把它压到 O ( log n ) O(\log n) O ( log n ) :
a n = ∏ k : n 的第 k 位为 1 a 2 k a^n=\prod_{k:\,n\text{ 的第 }k\text{ 位为 }1}a^{2^k} a n = k : n 的第 k 位为 1 ∏ a 2 k
具体做法是边平方边判位:维护一个底数不断自乘平方(得到 a , a 2 , a 4 , a 8 , … a,a^2,a^4,a^8,\dots a , a 2 , a 4 , a 8 , … ),扫描 n n n 的每一位二进制,遇到 1 1 1 就把当前平方值乘进答案,全程对 m m m 取模。这是 RSA、ECDSA、矩阵幂等几乎所有「大指数取模」场景的基础操作,也是下面解同余方程的常用零件。
例:用快速幂算 7 100 m o d 13 7^{100}\bmod 13 7 100 mod 13 。先把指数二进制化 100 = ( 1100100 ) 2 = 64 + 32 + 4 100=(1100100)_2=64+32+4 100 = ( 1100100 ) 2 = 64 + 32 + 4 ,即用到 7 64 , 7 32 , 7 4 7^{64},7^{32},7^4 7 64 , 7 32 , 7 4 。逐次平方并随时对 13 13 13 取模:
7 1 ≡ 7 7 2 ≡ 49 ≡ 10 7 4 ≡ 10 2 = 100 ≡ 9 7 8 ≡ 9 2 = 81 ≡ 3 7 16 ≡ 3 2 = 9 7 32 ≡ 9 2 = 81 ≡ 3 7 64 ≡ 3 2 = 9 ( m o d 13 ) \begin{aligned}
7^1&\equiv 7 \\
7^2&\equiv 49\equiv 10 \\
7^4&\equiv 10^2=100\equiv 9 \\
7^8&\equiv 9^2=81\equiv 3 \\
7^{16}&\equiv 3^2=9 \\
7^{32}&\equiv 9^2=81\equiv 3 \\
7^{64}&\equiv 3^2=9
\end{aligned}\pmod{13} 7 1 7 2 7 4 7 8 7 16 7 32 7 64 ≡ 7 ≡ 49 ≡ 10 ≡ 1 0 2 = 100 ≡ 9 ≡ 9 2 = 81 ≡ 3 ≡ 3 2 = 9 ≡ 9 2 = 81 ≡ 3 ≡ 3 2 = 9 ( mod 13 )
只把指数二进制为 1 1 1 的那几项(7 64 , 7 32 , 7 4 7^{64},7^{32},7^4 7 64 , 7 32 , 7 4 )乘起来:
7 100 ≡ 7 64 ⋅ 7 32 ⋅ 7 4 ≡ 9 × 3 × 9 = 243 ≡ 9 ( m o d 13 ) 7^{100}\equiv 7^{64}\cdot 7^{32}\cdot 7^4\equiv 9\times 3\times 9=243\equiv 9\pmod{13} 7 100 ≡ 7 64 ⋅ 7 32 ⋅ 7 4 ≡ 9 × 3 × 9 = 243 ≡ 9 ( mod 13 )
(243 = 13 × 18 + 9 243=13\times 18+9 243 = 13 × 18 + 9 。)所以 7 100 ≡ 9 ( m o d 13 ) 7^{100}\equiv 9\pmod{13} 7 100 ≡ 9 ( mod 13 ) 。整个过程只做了 6 6 6 次平方和 2 2 2 次乘法,远少于朴素的 99 99 99 次乘法。
形式:
a x ≡ b ( m o d m ) ax\equiv b\pmod m a x ≡ b ( mod m )
解的存在性 :有解 ⟺ gcd ( a , m ) ∣ b \iff\gcd(a,m)\mid b ⟺ g cd( a , m ) ∣ b 。这和 二元一次不定方程 的可解条件是同一件事——a x ≡ b ( m o d m ) ax\equiv b\pmod m a x ≡ b ( mod m ) 等价于 a x + m y = b ax+my=b a x + m y = b 有整数解。
解的个数 :若有解,则模 m m m 意义下恰有 gcd ( a , m ) \gcd(a,m) g cd( a , m ) 个互不同余的解。
例:解 3 x ≡ 6 ( m o d 9 ) 3x\equiv 6\pmod 9 3 x ≡ 6 ( mod 9 ) 。gcd ( 3 , 9 ) = 3 \gcd(3,9)=3 g cd( 3 , 9 ) = 3 ,而 3 ∣ 6 3\mid 6 3 ∣ 6 ,故有解,且模 9 9 9 下有 3 3 3 个解。两边连同模数一起除以 3 3 3 (约去公因子时模数也要除)得 x ≡ 2 ( m o d 3 ) x\equiv 2\pmod 3 x ≡ 2 ( mod 3 ) ,回到模 9 9 9 即 x ≡ 2 , 5 , 8 ( m o d 9 ) x\equiv 2,5,8\pmod 9 x ≡ 2 , 5 , 8 ( mod 9 ) 。可逐一验证:3 × 2 = 6 3\times 2=6 3 × 2 = 6 、3 × 5 = 15 ≡ 6 3\times 5=15\equiv 6 3 × 5 = 15 ≡ 6 、3 × 8 = 24 ≡ 6 ( m o d 9 ) 3\times 8=24\equiv 6\pmod 9 3 × 8 = 24 ≡ 6 ( mod 9 ) ,三个都对。
例:解 5 x ≡ 3 ( m o d 11 ) 5x\equiv 3\pmod{11} 5 x ≡ 3 ( mod 11 ) 。gcd ( 5 , 11 ) = 1 \gcd(5,11)=1 g cd( 5 , 11 ) = 1 ,唯一解。先求 5 5 5 的逆元——找 5 x ≡ 1 5x\equiv 1 5 x ≡ 1 :试 5 × 9 = 45 ≡ 1 ( m o d 11 ) 5\times 9=45\equiv 1\pmod{11} 5 × 9 = 45 ≡ 1 ( mod 11 ) ,故 5 − 1 ≡ 9 5^{-1}\equiv 9 5 − 1 ≡ 9 。于是 x ≡ 9 × 3 = 27 ≡ 5 ( m o d 11 ) x\equiv 9\times 3=27\equiv 5\pmod{11} x ≡ 9 × 3 = 27 ≡ 5 ( mod 11 ) 。验算 5 × 5 = 25 ≡ 3 ( m o d 11 ) 5\times 5=25\equiv 3\pmod{11} 5 × 5 = 25 ≡ 3 ( mod 11 ) ,正确。
当 gcd ( a , m ) = 1 \gcd(a,m)=1 g cd( a , m ) = 1 时,方程 a x ≡ 1 ( m o d m ) ax\equiv 1\pmod m a x ≡ 1 ( mod m ) 有唯一解,这个 x x x 称为 a a a 的 模逆元 (Modular Inverse),记 a − 1 m o d m a^{-1}\bmod m a − 1 mod m 。有了逆元,一般方程 a x ≡ b ax\equiv b a x ≡ b 的解就是 x ≡ a − 1 b ( m o d m ) x\equiv a^{-1}b\pmod m x ≡ a − 1 b ( mod m ) ,相当于在模运算里实现了「除法」。
求逆元有两条常用途径:
扩展欧几里得 :解 a x + m y = 1 ax+my=1 a x + m y = 1 ,求出的 x x x 就是逆元,对任意互素的 a , m a,m a , m 都适用。
费马小定理 :当 m m m 为素数时,a − 1 ≡ a m − 2 ( m o d m ) a^{-1}\equiv a^{m-2}\pmod m a − 1 ≡ a m − 2 ( mod m ) (因为 a ⋅ a m − 2 = a m − 1 ≡ 1 a\cdot a^{m-2}=a^{m-1}\equiv1 a ⋅ a m − 2 = a m − 1 ≡ 1 ),配合快速幂即可。
例(扩欧法):求 3 3 3 模 7 7 7 的逆元,即解 3 x + 7 y = 1 3x+7y=1 3 x + 7 y = 1 。辗转相除 7 = 2 × 3 + 1 7=2\times 3+1 7 = 2 × 3 + 1 ,故 1 = 7 − 2 × 3 1=7-2\times 3 1 = 7 − 2 × 3 ,对照得 x = − 2 , y = 1 x=-2,\ y=1 x = − 2 , y = 1 。于是 3 − 1 ≡ − 2 ≡ 5 ( m o d 7 ) 3^{-1}\equiv-2\equiv 5\pmod 7 3 − 1 ≡ − 2 ≡ 5 ( mod 7 ) ,验算 3 × 5 = 15 ≡ 1 ( m o d 7 ) 3\times 5=15\equiv 1\pmod 7 3 × 5 = 15 ≡ 1 ( mod 7 ) ,正确。扩欧的好处是 模数不必为素数 ,只要 gcd ( a , m ) = 1 \gcd(a,m)=1 g cd( a , m ) = 1 就能用。
例(费马法):求 3 3 3 模 7 7 7 的逆元。7 7 7 为素数,故 3 − 1 ≡ 3 7 − 2 = 3 5 ( m o d 7 ) 3^{-1}\equiv 3^{7-2}=3^5\pmod 7 3 − 1 ≡ 3 7 − 2 = 3 5 ( mod 7 ) 。算 3 5 3^5 3 5 :3 2 = 9 ≡ 2 3^2=9\equiv 2 3 2 = 9 ≡ 2 ,3 4 ≡ 2 2 = 4 3^4\equiv 2^2=4 3 4 ≡ 2 2 = 4 ,3 5 ≡ 4 × 3 = 12 ≡ 5 ( m o d 7 ) 3^5\equiv 4\times 3=12\equiv 5\pmod 7 3 5 ≡ 4 × 3 = 12 ≡ 5 ( mod 7 ) ,与扩欧法结果一致。费马法写起来更短,但要求模数是素数、且要做一次快速幂。
设模数 m 1 , m 2 , … , m k m_1,m_2,\dots,m_k m 1 , m 2 , … , m k 两两互素 ,考虑同余方程组:
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a k ( m o d m k ) \begin{cases}
x\equiv a_1\pmod{m_1} \\
x\equiv a_2\pmod{m_2} \\
\vdots \\
x\equiv a_k\pmod{m_k}
\end{cases} ⎩ ⎨ ⎧ x ≡ a 1 ( mod m 1 ) x ≡ a 2 ( mod m 2 ) ⋮ x ≡ a k ( mod m k )
则它在模 M = m 1 m 2 ⋯ m k M=m_1m_2\cdots m_k M = m 1 m 2 ⋯ m k 意义下有 唯一解 。这就是 中国剩余定理 (Chinese Remainder Theorem,CRT)。
CRT 的直觉是「分别定位,再拼合」。把一个数想象成由它在各个模下的余数 ( a 1 , … , a k ) (a_1,\dots,a_k) ( a 1 , … , a k ) 共同决定的一组坐标。两两互素保证了这组坐标 无冗余也无遗漏 :在 0 ∼ M − 1 0\sim M-1 0 ∼ M − 1 范围内,每一组可能的余数恰好对应唯一一个数。所以解方程组就是「已知各坐标,反求那个数」,必然有且只有一个答案。它在算法上还能反向用——把模 M M M 的运算拆成几个小模并行做,最后拼回来。
构造的妙处在于「凑出只在一个方程里起作用、对其他方程透明」的项。令 M i = M / m i M_i=M/m_i M i = M / m i ,则 M i M_i M i 是除 m i m_i m i 外所有模的倍数,因此 M i ≡ 0 ( m o d m j ) ( j ≠ i ) M_i\equiv 0\pmod{m_j}\,(j\ne i) M i ≡ 0 ( mod m j ) ( j = i ) 。由于 gcd ( M i , m i ) = 1 \gcd(M_i,m_i)=1 g cd( M i , m i ) = 1 ,可求出 M i M_i M i 模 m i m_i m i 的逆元 M i − 1 M_i^{-1} M i − 1 。于是:
x ≡ ∑ i = 1 k a i M i M i − 1 ( m o d M ) x\equiv\sum_{i=1}^{k}a_i\,M_i\,M_i^{-1}\pmod M x ≡ i = 1 ∑ k a i M i M i − 1 ( mod M )
第 i i i 项 a i M i M i − 1 a_iM_iM_i^{-1} a i M i M i − 1 在模 m i m_i m i 下等于 a i a_i a i (因为 M i M i − 1 ≡ 1 M_iM_i^{-1}\equiv1 M i M i − 1 ≡ 1 ),在模 m j ( j ≠ i ) m_j\,(j\ne i) m j ( j = i ) 下等于 0 0 0 (因为带着因子 M i M_i M i )。每一项各管一个方程,互不干扰,加起来就同时满足全部条件。
《孙子算经》的「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何。即解
x ≡ 2 ( m o d 3 ) , x ≡ 3 ( m o d 5 ) , x ≡ 2 ( m o d 7 ) x\equiv 2\pmod 3,\quad x\equiv 3\pmod 5,\quad x\equiv 2\pmod 7 x ≡ 2 ( mod 3 ) , x ≡ 3 ( mod 5 ) , x ≡ 2 ( mod 7 )
模数 3 , 5 , 7 3,5,7 3 , 5 , 7 两两互素,M = 3 × 5 × 7 = 105 M=3\times 5\times 7=105 M = 3 × 5 × 7 = 105 。逐项算 M i M_i M i 与其逆元:
M 1 = 105 / 3 = 35 , 35 ≡ 2 ( m o d 3 ) , M 1 − 1 ≡ 2 − 1 ≡ 2 ( m o d 3 ) M 2 = 105 / 5 = 21 , 21 ≡ 1 ( m o d 5 ) , M 2 − 1 ≡ 1 ( m o d 5 ) M 3 = 105 / 7 = 15 , 15 ≡ 1 ( m o d 7 ) , M 3 − 1 ≡ 1 ( m o d 7 ) \begin{aligned}
&M_1=105/3=35,\quad 35\equiv 2\pmod 3,\quad M_1^{-1}\equiv 2^{-1}\equiv 2\pmod 3 \\
&M_2=105/5=21,\quad 21\equiv 1\pmod 5,\quad M_2^{-1}\equiv 1\pmod 5 \\
&M_3=105/7=15,\quad 15\equiv 1\pmod 7,\quad M_3^{-1}\equiv 1\pmod 7
\end{aligned} M 1 = 105/3 = 35 , 35 ≡ 2 ( mod 3 ) , M 1 − 1 ≡ 2 − 1 ≡ 2 ( mod 3 ) M 2 = 105/5 = 21 , 21 ≡ 1 ( mod 5 ) , M 2 − 1 ≡ 1 ( mod 5 ) M 3 = 105/7 = 15 , 15 ≡ 1 ( mod 7 ) , M 3 − 1 ≡ 1 ( mod 7 )
(求逆元:2 × 2 = 4 ≡ 1 ( m o d 3 ) 2\times 2=4\equiv 1\pmod 3 2 × 2 = 4 ≡ 1 ( mod 3 ) 故 2 − 1 ≡ 2 2^{-1}\equiv 2 2 − 1 ≡ 2 ;另两个本身就 ≡ 1 \equiv 1 ≡ 1 ,逆元为 1 1 1 。)代入构造式:
x ≡ a 1 M 1 M 1 − 1 + a 2 M 2 M 2 − 1 + a 3 M 3 M 3 − 1 = 2 × 35 × 2 + 3 × 21 × 1 + 2 × 15 × 1 = 140 + 63 + 30 = 233 ≡ 23 ( m o d 105 ) \begin{aligned}
x&\equiv a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+a_3M_3M_3^{-1} \\
&=2\times 35\times 2+3\times 21\times 1+2\times 15\times 1 \\
&=140+63+30=233\equiv 23\pmod{105}
\end{aligned} x ≡ a 1 M 1 M 1 − 1 + a 2 M 2 M 2 − 1 + a 3 M 3 M 3 − 1 = 2 × 35 × 2 + 3 × 21 × 1 + 2 × 15 × 1 = 140 + 63 + 30 = 233 ≡ 23 ( mod 105 )
(233 = 105 × 2 + 23 233=105\times 2+23 233 = 105 × 2 + 23 。)所以最小正整数解是 23 \boxed{23} 23 ,全部解为 x ≡ 23 ( m o d 105 ) x\equiv 23\pmod{105} x ≡ 23 ( mod 105 ) 。验算:23 = 3 × 7 + 2 23=3\times 7+2 23 = 3 × 7 + 2 、23 = 5 × 4 + 3 23=5\times 4+3 23 = 5 × 4 + 3 、23 = 7 × 3 + 2 23=7\times 3+2 23 = 7 × 3 + 2 ,三个余数全对。这就是口诀「三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五便得知」里那三个系数 70 , 21 , 15 70,21,15 70 , 21 , 15 的来历——70 = a 1 70=a_1 70 = a 1 项的 M 1 M 1 − 1 = 35 × 2 M_1M_1^{-1}=35\times 2 M 1 M 1 − 1 = 35 × 2 。
形如 x k ≡ a ( m o d m ) x^k\equiv a\pmod m x k ≡ a ( mod m ) 的方程属于 高次同余 ,远比一次复杂。研究它的关键工具是 原根 (Primitive Root)。
设 gcd ( a , m ) = 1 \gcd(a,m)=1 g cd( a , m ) = 1 ,使 a d ≡ 1 ( m o d m ) a^d\equiv1\pmod m a d ≡ 1 ( mod m ) 成立的最小正整数 d d d 称为 a a a 模 m m m 的 阶 (Order)。由欧拉定理 d ∣ φ ( m ) d\mid\varphi(m) d ∣ φ ( m ) 。若某个 g g g 的阶恰好达到最大值 φ ( m ) \varphi(m) φ ( m ) ,就称 g g g 是模 m m m 的一个 原根 。
原根存在时(仅当 m = 1 , 2 , 4 , p k , 2 p k m=1,2,4,p^k,2p^k m = 1 , 2 , 4 , p k , 2 p k ,p p p 为奇素数),它的幂 g 0 , g 1 , … , g φ ( m ) − 1 g^0,g^1,\dots,g^{\varphi(m)-1} g 0 , g 1 , … , g φ ( m ) − 1 会 不重不漏地跑遍整个简化剩余系 。这相当于给乘法群配了一把「对数尺」:乘法变成指数相加,高次同余 x k ≡ a x^k\equiv a x k ≡ a 就化归为一次同余,可解。这套「离散对数」也是 Diffie–Hellman 密钥交换的基础。
例:求模 7 7 7 的一个原根。φ ( 7 ) = 6 \varphi(7)=6 φ ( 7 ) = 6 ,6 6 6 的真因子里要检验的是 6 2 = 3 \frac{6}{2}=3 2 6 = 3 和 6 3 = 2 \frac{6}{3}=2 3 6 = 2 ——只需验 g 2 ≢ 1 g^2\not\equiv 1 g 2 ≡ 1 且 g 3 ≢ 1 g^3\not\equiv 1 g 3 ≡ 1 ,就能断定阶恰为 6 6 6 (不必逐个算到 6 6 6 )。试 g = 3 g=3 g = 3 :3 2 = 9 ≡ 2 ≠ 1 3^2=9\equiv 2\ne 1 3 2 = 9 ≡ 2 = 1 ,3 3 = 27 ≡ 6 ≠ 1 ( m o d 7 ) 3^3=27\equiv 6\ne 1\pmod 7 3 3 = 27 ≡ 6 = 1 ( mod 7 ) ,两条都过,故 3 3 3 是原根。验证其幂跑遍简化剩余系:
3 1 ≡ 3 , 3 2 ≡ 2 , 3 3 ≡ 6 , 3 4 ≡ 4 , 3 5 ≡ 5 , 3 6 ≡ 1 ( m o d 7 ) 3^1\equiv 3,\ 3^2\equiv 2,\ 3^3\equiv 6,\ 3^4\equiv 4,\ 3^5\equiv 5,\ 3^6\equiv 1\pmod 7 3 1 ≡ 3 , 3 2 ≡ 2 , 3 3 ≡ 6 , 3 4 ≡ 4 , 3 5 ≡ 5 , 3 6 ≡ 1 ( mod 7 )
{ 3 , 2 , 6 , 4 , 5 , 1 } \set{3,2,6,4,5,1} { 3 , 2 , 6 , 4 , 5 , 1 } 恰好就是 { 1 , 2 , 3 , 4 , 5 , 6 } \set{1,2,3,4,5,6} { 1 , 2 , 3 , 4 , 5 , 6 } ,无重复、无遗漏。顺带一提 g = 2 g=2 g = 2 不是原根:2 3 = 8 ≡ 1 ( m o d 7 ) 2^3=8\equiv 1\pmod 7 2 3 = 8 ≡ 1 ( mod 7 ) ,阶只有 3 3 3 。
找原根的标准做法 不是 把 g 1 , g 2 , … g^1,g^2,\dots g 1 , g 2 , … 一直算到 φ ( m ) \varphi(m) φ ( m ) ,而是:分解 φ ( m ) = ∏ q i e i \varphi(m)=\prod q_i^{e_i} φ ( m ) = ∏ q i e i ,对每个素因子 q i q_i q i 检验 g φ ( m ) / q i ≢ 1 ( m o d m ) g^{\varphi(m)/q_i}\not\equiv 1\pmod m g φ ( m ) / q i ≡ 1 ( mod m ) 。只要所有这些都不为 1 1 1 ,g g g 的阶就必然是满的 φ ( m ) \varphi(m) φ ( m ) 。这把检验量从 φ ( m ) \varphi(m) φ ( m ) 次降到素因子个数次。
最简单的高次情形是 k = 2 k=2 k = 2 :问 x 2 ≡ a ( m o d p ) x^2\equiv a\pmod p x 2 ≡ a ( mod p ) 有没有解。若有解,称 a a a 是模 p p p 的 二次剩余 (Quadratic Residue,QR);否则称 二次非剩余 。
对奇素数 p p p ,简化剩余系里恰好一半是二次剩余、一半不是。判定用 勒让德符号 (Legendre Symbol):
( a p ) = { 1 , a 是二次剩余 − 1 , a 是二次非剩余 0 , p ∣ a \left(\frac{a}{p}\right)=\begin{cases}\ \ 1,&a\text{ 是二次剩余} \\ -1,&a\text{ 是二次非剩余} \\ \ \ 0,&p\mid a\end{cases} ( p a ) = ⎩ ⎨ ⎧ 1 , − 1 , 0 , a 是二次剩余 a 是二次非剩余 p ∣ a
它可由 欧拉判别法 算出:
( a p ) ≡ a p − 1 2 ( m o d p ) \left(\frac{a}{p}\right)\equiv a^{\frac{p-1}{2}}\pmod p ( p a ) ≡ a 2 p − 1 ( mod p )
直觉上,a p − 1 2 a^{\frac{p-1}{2}} a 2 p − 1 是费马小定理 a p − 1 ≡ 1 a^{p-1}\equiv1 a p − 1 ≡ 1 的「平方根」,只能取 ± 1 \pm1 ± 1 ;取 + 1 +1 + 1 当且仅当 a a a 本身开得出平方根。更高效的判定依赖 二次互反律 ——高斯称之为「黄金定理」,是数论的标志性成果之一。
例:先把模 7 7 7 的二次剩余列全。对 x = 1 ∼ 6 x=1\sim 6 x = 1 ∼ 6 算 x 2 m o d 7 x^2\bmod 7 x 2 mod 7 :
1 2 ≡ 1 , 2 2 ≡ 4 , 3 2 ≡ 2 , 4 2 ≡ 2 , 5 2 ≡ 4 , 6 2 ≡ 1 ( m o d 7 ) 1^2\equiv 1,\ 2^2\equiv 4,\ 3^2\equiv 2,\ 4^2\equiv 2,\ 5^2\equiv 4,\ 6^2\equiv 1\pmod 7 1 2 ≡ 1 , 2 2 ≡ 4 , 3 2 ≡ 2 , 4 2 ≡ 2 , 5 2 ≡ 4 , 6 2 ≡ 1 ( mod 7 )
去重得二次剩余为 { 1 , 2 , 4 } \set{1,2,4} { 1 , 2 , 4 } ,非剩余为 { 3 , 5 , 6 } \set{3,5,6} { 3 , 5 , 6 } ,恰好各 3 3 3 个(即 p − 1 2 \frac{p-1}{2} 2 p − 1 ),印证「一半是一半不是」。注意 x x x 与 − x -x − x 平方相同,故剩余总成对出现。
例:用欧拉判别法判 3 3 3 是否为模 7 7 7 的二次剩余。算 3 7 − 1 2 = 3 3 = 27 ≡ 6 ≡ − 1 ( m o d 7 ) 3^{\frac{7-1}{2}}=3^3=27\equiv 6\equiv-1\pmod 7 3 2 7 − 1 = 3 3 = 27 ≡ 6 ≡ − 1 ( mod 7 ) ,得 ( 3 7 ) = − 1 \left(\frac{3}{7}\right)=-1 ( 7 3 ) = − 1 ,所以 3 3 3 是 非剩余 ,x 2 ≡ 3 ( m o d 7 ) x^2\equiv 3\pmod 7 x 2 ≡ 3 ( mod 7 ) 无解——与上面列出的剩余表 { 1 , 2 , 4 } \set{1,2,4} { 1 , 2 , 4 } 不含 3 3 3 一致。再判 2 2 2 :2 3 = 8 ≡ 1 ( m o d 7 ) 2^3=8\equiv 1\pmod 7 2 3 = 8 ≡ 1 ( mod 7 ) ,故 ( 2 7 ) = 1 \left(\frac{2}{7}\right)=1 ( 7 2 ) = 1 ,2 2 2 是剩余,确有 3 2 ≡ 4 2 ≡ 2 3^2\equiv 4^2\equiv 2 3 2 ≡ 4 2 ≡ 2 。
同余几乎渗透在每个数论场景里:
整除判定 :判断一个数能否被 3 , 9 , 11 3,9,11 3 , 9 , 11 整除的「各位数字求和」法则,本质是 10 ≡ 1 ( m o d 9 ) 10\equiv1\pmod9 10 ≡ 1 ( mod 9 ) 、10 ≡ − 1 ( m o d 11 ) 10\equiv-1\pmod{11} 10 ≡ − 1 ( mod 11 ) 。
大整数运算 :把大数拆成多个小模(两两互素),用 CRT 并行计算再拼回,是高精度库的常用加速。
公钥密码 :RSA 的加解密就是模 n n n 下的幂运算,其正确性由欧拉定理保证,效率由快速幂和 CRT 支撑。