跳到主要内容

同余

参考资料

引入

同余(Congruence)是数论的「分类工具」——把所有整数按 除以 mm 的余数 归成 mm 类。它做的事情,就是把整数无穷无尽的乘法结构,搬到一个只有 mm 个元素的有限集 {0,1,,m1}\set{0,1,\dots,m-1} 上。

为什么要这么做?因为很多问题只关心余数,不关心整个数。比如「今天星期三,100100 天后星期几」,没人会真的去数 100100 天,而是看 100mod7=2100\bmod 7=2,往后推两天。同余就是把这种「只看余数」的直觉变成一套能严格运算的代数。它后来成了现代密码学(RSA、椭圆曲线)的核心语言。

同余的定义

整数 a,ba,b,正整数 mm,若 m(ab)m\mid(a-b),称 aa 同余于 bbmm,记为:

ab(modm)a\equiv b\pmod m

这里 mm(Modulus)。等价的说法是:aabb 除以 mm 余数相同。两种定义可以随手互换——「差被 mm 整除」便于代数推导,「余数相同」便于直觉理解。

性质

等价关系

mm 同余满足 自反、对称、传递,因此它是 Z\mathbb{Z} 上的一个 等价关系。等价关系会把整个集合切成互不相交的小块,这里切出的每一块就是下面要讲的「剩余类」。

运算保持

同余最有用的地方是它对加减乘 封闭。设 ab, cd(modm)a\equiv b,\ c\equiv d\pmod m

a±cb±d(modm),acbd(modm)a\pm c\equiv b\pm d\pmod m,\quad ac\equiv bd\pmod m akbk(modm)(kN)a^k\equiv b^k\pmod m\quad(k\in\mathbb{N})

这意味着在任何加减乘(含乘方)的表达式里,都可以 随时把某个数换成它模 mm 的余数,结果模 mm 不变。算大数取模时,先把每个因子缩小再算,是最基本的提速手段。

例:求 123×456mod7123\times 456\bmod 7。先各自缩小:1234(mod7)123\equiv 4\pmod 7123=7×17+4123=7\times 17+4),4561(mod7)456\equiv 1\pmod 7456=7×65+1456=7\times 65+1),于是

123×4564×1=4(mod7)123\times 456\equiv 4\times 1=4\pmod 7

不必真去算 123×456=56088123\times 456=56088 再取模——先缩后算总是更轻。

例:判断 210+12^{10}+1 能否被 1111 整除。210=10242^{10}=1024,但直接看 25=32101(mod11)2^5=32\equiv 10\equiv-1\pmod{11},故 210=(25)2(1)2=1(mod11)2^{10}=(2^5)^2\equiv(-1)^2=1\pmod{11},于是 210+12(mod11)02^{10}+1\equiv 2\pmod{11}\ne 0,不能整除。把底数先压到 ±1\pm 1 再乘方,是手算幂模的常用捷径。

除法不自动成立

加减乘都没问题,唯独 除法(约去公因子)要小心

acbc(modm)ab(modm)ac\equiv bc\pmod m\nRightarrow a\equiv b\pmod m

比如 2×32×0(mod6)2\times 3\equiv 2\times 0\pmod 6,但 3≢0(mod6)3\not\equiv 0\pmod 6。正确的约去法则是:

acbc(modm)ab(modmgcd(c,m))ac\equiv bc\pmod m\Rightarrow a\equiv b\pmod{\tfrac{m}{\gcd(c,m)}}

特别地,当 gcd(c,m)=1\gcd(c,m)=1 时,模数不变,可以放心约去。这正是「互素」条件反复出现的原因。

剩余类与剩余系

剩余类

mm 把整数分成 mm剩余类(同余类),第 ii 类是所有除以 mmii 的整数。它们构成 剩余类环 Zm={[0],[1],,[m1]}\mathbb{Z}_m=\set{[0],[1],\dots,[m-1]},环上的加法和乘法就是上面「运算保持」赋予的。

完全剩余系

从每个剩余类里各取一个代表,凑成的 mm 个数(模 mm 两两不同余),称为 完全剩余系(Complete Residue System)。最常用的是 {0,1,,m1}\set{0,1,\dots,m-1}

简化剩余系

完全剩余系里 mm 互素 的那些代表,构成 简化剩余系(Reduced Residue System,也叫既约剩余系)。它的元素个数记为 欧拉函数 φ(m)\varphi(m)

提示

简化剩余系为什么重要?因为只有与 mm 互素的数在模 mm 下才「可逆」(存在乘法逆元)。这些可逆元在乘法下自成一个封闭系统——简化剩余系对乘法封闭:互素的两个数之积仍与 mm 互素。欧拉定理正是建立在这个系统上的。

欧拉函数

φ(m)\varphi(m) 表示 {1,2,,m}\set{1,2,\dots,m} 中与 mm 互素的整数个数。

公式

φ(m)=mpm(11p)\varphi(m)=m\prod_{p\mid m}\left(1-\frac{1}{p}\right)

其中 pp 取遍 mm 的不同素因子。直觉上:从 mm 个数出发,每个素因子 pp 都「筛掉」其中 1p\frac1p 的比例(即 pp 的倍数),各素因子互相独立地筛,乘起来就是剩下的占比。

性质

  • φ(p)=p1\varphi(p)=p-1pp 为素数,除 pp 自己外全都互素)。
  • φ(pk)=pkpk1\varphi(p^k)=p^k-p^{k-1}
  • 积性gcd(a,b)=1φ(ab)=φ(a)φ(b)\gcd(a,b)=1\Rightarrow\varphi(ab)=\varphi(a)\varphi(b)

更多性质详见 积性函数

三大定理

费马小定理

pp 是素数,gcd(a,p)=1\gcd(a,p)=1,则:

ap11(modp)a^{p-1}\equiv 1\pmod p

更一般地,对 任意 整数 aa 都有 apa(modp)a^p\equiv a\pmod p(不要求互素)。

直觉上为什么成立?把简化剩余系 {1,2,,p1}\set{1,2,\dots,p-1} 每个元素都乘以 aa,由于 aapp 互素,乘出来的 {a,2a,,(p1)a}\set{a,2a,\dots,(p-1)a}pp 恰好还是原来那 p1p-1 个数(只是被打乱了顺序)。于是两组的乘积模 pp 相等:ap1(p1)!(p1)!(modp)a^{p-1}(p-1)!\equiv(p-1)!\pmod p,约去 (p1)!(p-1)!(它与 pp 互素)即得结论。

例:用费马小定理速算 3100mod73^{100}\bmod 777 是素数、gcd(3,7)=1\gcd(3,7)=1,故 361(mod7)3^6\equiv 1\pmod 7。把指数对 66 取模:100=6×16+4100=6\times 16+4,于是

3100=(36)163411634=814(mod7)3^{100}=\bigl(3^6\bigr)^{16}\cdot 3^4\equiv 1^{16}\cdot 3^4=81\equiv 4\pmod 7

81=7×11+481=7\times 11+4。)一步就把指数从 100100 压到 44,比快速幂还快。

欧拉定理

费马小定理的推广,把素数模换成任意模。设 gcd(a,m)=1\gcd(a,m)=1,则:

aφ(m)1(modm)a^{\varphi(m)}\equiv 1\pmod m

证明思路与上面如出一辙,只是把整个简化剩余系(共 φ(m)\varphi(m) 个元素)乘以 aa 后重新排列。当 m=pm=pφ(p)=p1\varphi(p)=p-1,正好退化为费马小定理。

提示

欧拉定理最实用的推论是 降幂:求 aNmodma^N\bmod m 时,若 gcd(a,m)=1\gcd(a,m)=1,可以把指数 NNφ(m)\varphi(m) 取模,即 aNaNmodφ(m)(modm)a^N\equiv a^{N\bmod\varphi(m)}\pmod m,瞬间把天文数字的指数压到 φ(m)\varphi(m) 以内。这正是 RSA 加密里「公钥指数」与「私钥指数」互逆的数学根基。(当 aamm 不互素时,需要用扩展欧拉定理处理。)

例:求 7222mod107^{222}\bmod 10。模 1010 不是素数,用欧拉定理:φ(10)=φ(2)φ(5)=1×4=4\varphi(10)=\varphi(2)\varphi(5)=1\times 4=4,且 gcd(7,10)=1\gcd(7,10)=1,故 741(mod10)7^4\equiv 1\pmod{10}。指数对 44 取模 222=4×55+2222=4\times 55+2,于是

722272=499(mod10)7^{222}\equiv 7^{2}=49\equiv 9\pmod{10}

72227^{222} 的个位数字是 99。「求末位」就是模 1010,正是降幂的典型用场。

威尔逊定理

它给出了素数的一个充要刻画:pp 是素数当且仅当

(p1)!1(modp)(p-1)!\equiv -1\pmod p

直觉上,{1,2,,p1}\set{1,2,\dots,p-1} 里每个元素都能在模 pp 下找到自己的逆元,绝大多数和它的逆元配成一对、乘积为 11;唯一「自己是自己逆元」的只有 11p1p-1(即 1-1)。配对相消后只剩下 1(p1)11\cdot(p-1)\equiv-1。理论价值大于计算价值——阶乘增长太快,不适合用来实际判素。

例:在 p=7p=7 上验证,并看清配对。逆元配对为 2412\cdot 4\equiv 1351(mod7)3\cdot 5\equiv 1\pmod 7,自逆的是 1166。于是

6!=1(24)(35)61116=61(mod7)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

确实 (p1)!1(p-1)!\equiv-1。反观合数 m=6m=65!=120=6×200(mod6)5!=120=6\times 20\equiv 0\pmod 6,不是 1-1——合数处阶乘里会凑出模 mm00 的因子,这正是威尔逊定理能判素的根据。

快速幂取模

anmodma^n\bmod m 时,若把 aa 自乘 nn 次要 O(n)O(n) 步,指数一大就崩。快速幂(Fast Exponentiation)用 nn二进制分解 把它压到 O(logn)O(\log n)

an=k:n 的第 k 位为 1a2ka^n=\prod_{k:\,n\text{ 的第 }k\text{ 位为 }1}a^{2^k}

具体做法是边平方边判位:维护一个底数不断自乘平方(得到 a,a2,a4,a8,a,a^2,a^4,a^8,\dots),扫描 nn 的每一位二进制,遇到 11 就把当前平方值乘进答案,全程对 mm 取模。这是 RSA、ECDSA、矩阵幂等几乎所有「大指数取模」场景的基础操作,也是下面解同余方程的常用零件。

例:用快速幂算 7100mod137^{100}\bmod 13。先把指数二进制化 100=(1100100)2=64+32+4100=(1100100)_2=64+32+4,即用到 764,732,747^{64},7^{32},7^4。逐次平方并随时对 1313 取模:

71772491074102=10097892=81371632=973292=81376432=9(mod13)\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}

只把指数二进制为 11 的那几项(764,732,747^{64},7^{32},7^4)乘起来:

7100764732749×3×9=2439(mod13)7^{100}\equiv 7^{64}\cdot 7^{32}\cdot 7^4\equiv 9\times 3\times 9=243\equiv 9\pmod{13}

243=13×18+9243=13\times 18+9。)所以 71009(mod13)7^{100}\equiv 9\pmod{13}。整个过程只做了 66 次平方和 22 次乘法,远少于朴素的 9999 次乘法。

一次同余方程

形式:

axb(modm)ax\equiv b\pmod m

解的存在性:有解     gcd(a,m)b\iff\gcd(a,m)\mid b。这和 二元一次不定方程 的可解条件是同一件事——axb(modm)ax\equiv b\pmod m 等价于 ax+my=bax+my=b 有整数解。

解的个数:若有解,则模 mm 意义下恰有 gcd(a,m)\gcd(a,m) 个互不同余的解。

例:解 3x6(mod9)3x\equiv 6\pmod 9gcd(3,9)=3\gcd(3,9)=3,而 363\mid 6,故有解,且模 99 下有 33 个解。两边连同模数一起除以 33(约去公因子时模数也要除)得 x2(mod3)x\equiv 2\pmod 3,回到模 99x2,5,8(mod9)x\equiv 2,5,8\pmod 9。可逐一验证:3×2=63\times 2=63×5=1563\times 5=15\equiv 63×8=246(mod9)3\times 8=24\equiv 6\pmod 9,三个都对。

例:解 5x3(mod11)5x\equiv 3\pmod{11}gcd(5,11)=1\gcd(5,11)=1,唯一解。先求 55 的逆元——找 5x15x\equiv 1:试 5×9=451(mod11)5\times 9=45\equiv 1\pmod{11},故 5195^{-1}\equiv 9。于是 x9×3=275(mod11)x\equiv 9\times 3=27\equiv 5\pmod{11}。验算 5×5=253(mod11)5\times 5=25\equiv 3\pmod{11},正确。

模逆元

gcd(a,m)=1\gcd(a,m)=1 时,方程 ax1(modm)ax\equiv 1\pmod m 有唯一解,这个 xx 称为 aa模逆元(Modular Inverse),记 a1modma^{-1}\bmod m。有了逆元,一般方程 axbax\equiv b 的解就是 xa1b(modm)x\equiv a^{-1}b\pmod m,相当于在模运算里实现了「除法」。

求逆元有两条常用途径:

  • 扩展欧几里得:解 ax+my=1ax+my=1,求出的 xx 就是逆元,对任意互素的 a,ma,m 都适用。
  • 费马小定理:当 mm 为素数时,a1am2(modm)a^{-1}\equiv a^{m-2}\pmod m(因为 aam2=am11a\cdot a^{m-2}=a^{m-1}\equiv1),配合快速幂即可。

例(扩欧法):求 3377 的逆元,即解 3x+7y=13x+7y=1。辗转相除 7=2×3+17=2\times 3+1,故 1=72×31=7-2\times 3,对照得 x=2, y=1x=-2,\ y=1。于是 3125(mod7)3^{-1}\equiv-2\equiv 5\pmod 7,验算 3×5=151(mod7)3\times 5=15\equiv 1\pmod 7,正确。扩欧的好处是 模数不必为素数,只要 gcd(a,m)=1\gcd(a,m)=1 就能用。

例(费马法):求 3377 的逆元。77 为素数,故 31372=35(mod7)3^{-1}\equiv 3^{7-2}=3^5\pmod 7。算 353^532=923^2=9\equiv 23422=43^4\equiv 2^2=4354×3=125(mod7)3^5\equiv 4\times 3=12\equiv 5\pmod 7,与扩欧法结果一致。费马法写起来更短,但要求模数是素数、且要做一次快速幂。

中国剩余定理

设模数 m1,m2,,mkm_1,m_2,\dots,m_k 两两互素,考虑同余方程组:

{xa1(modm1)xa2(modm2)xak(modmk)\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}

则它在模 M=m1m2mkM=m_1m_2\cdots m_k 意义下有 唯一解。这就是 中国剩余定理(Chinese Remainder Theorem,CRT)。

提示

CRT 的直觉是「分别定位,再拼合」。把一个数想象成由它在各个模下的余数 (a1,,ak)(a_1,\dots,a_k) 共同决定的一组坐标。两两互素保证了这组坐标 无冗余也无遗漏:在 0M10\sim M-1 范围内,每一组可能的余数恰好对应唯一一个数。所以解方程组就是「已知各坐标,反求那个数」,必然有且只有一个答案。它在算法上还能反向用——把模 MM 的运算拆成几个小模并行做,最后拼回来。

构造解

构造的妙处在于「凑出只在一个方程里起作用、对其他方程透明」的项。令 Mi=M/miM_i=M/m_i,则 MiM_i 是除 mim_i 外所有模的倍数,因此 Mi0(modmj)(ji)M_i\equiv 0\pmod{m_j}\,(j\ne i)。由于 gcd(Mi,mi)=1\gcd(M_i,m_i)=1,可求出 MiM_imim_i 的逆元 Mi1M_i^{-1}。于是:

xi=1kaiMiMi1(modM)x\equiv\sum_{i=1}^{k}a_i\,M_i\,M_i^{-1}\pmod M

iiaiMiMi1a_iM_iM_i^{-1} 在模 mim_i 下等于 aia_i(因为 MiMi11M_iM_i^{-1}\equiv1),在模 mj(ji)m_j\,(j\ne i) 下等于 00(因为带着因子 MiM_i)。每一项各管一个方程,互不干扰,加起来就同时满足全部条件。

完整算例:物不知数

《孙子算经》的「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何。即解

x2(mod3),x3(mod5),x2(mod7)x\equiv 2\pmod 3,\quad x\equiv 3\pmod 5,\quad x\equiv 2\pmod 7

模数 3,5,73,5,7 两两互素,M=3×5×7=105M=3\times 5\times 7=105。逐项算 MiM_i 与其逆元:

M1=105/3=35,352(mod3),M11212(mod3)M2=105/5=21,211(mod5),M211(mod5)M3=105/7=15,151(mod7),M311(mod7)\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}

(求逆元:2×2=41(mod3)2\times 2=4\equiv 1\pmod 32122^{-1}\equiv 2;另两个本身就 1\equiv 1,逆元为 11。)代入构造式:

xa1M1M11+a2M2M21+a3M3M31=2×35×2+3×21×1+2×15×1=140+63+30=23323(mod105)\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}

233=105×2+23233=105\times 2+23。)所以最小正整数解是 23\boxed{23},全部解为 x23(mod105)x\equiv 23\pmod{105}。验算:23=3×7+223=3\times 7+223=5×4+323=5\times 4+323=7×3+223=7\times 3+2,三个余数全对。这就是口诀「三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五便得知」里那三个系数 70,21,1570,21,15 的来历——70=a170=a_1 项的 M1M11=35×2M_1M_1^{-1}=35\times 2

高次同余与原根

形如 xka(modm)x^k\equiv a\pmod m 的方程属于 高次同余,远比一次复杂。研究它的关键工具是 原根(Primitive Root)。

gcd(a,m)=1\gcd(a,m)=1,使 ad1(modm)a^d\equiv1\pmod m 成立的最小正整数 dd 称为 aamm(Order)。由欧拉定理 dφ(m)d\mid\varphi(m)。若某个 gg 的阶恰好达到最大值 φ(m)\varphi(m),就称 gg 是模 mm 的一个 原根

原根存在时(仅当 m=1,2,4,pk,2pkm=1,2,4,p^k,2p^kpp 为奇素数),它的幂 g0,g1,,gφ(m)1g^0,g^1,\dots,g^{\varphi(m)-1}不重不漏地跑遍整个简化剩余系。这相当于给乘法群配了一把「对数尺」:乘法变成指数相加,高次同余 xkax^k\equiv a 就化归为一次同余,可解。这套「离散对数」也是 Diffie–Hellman 密钥交换的基础。

例:求模 77 的一个原根。φ(7)=6\varphi(7)=666 的真因子里要检验的是 62=3\frac{6}{2}=363=2\frac{6}{3}=2——只需验 g2≢1g^2\not\equiv 1g3≢1g^3\not\equiv 1,就能断定阶恰为 66(不必逐个算到 66)。试 g=3g=332=9213^2=9\equiv 2\ne 133=2761(mod7)3^3=27\equiv 6\ne 1\pmod 7,两条都过,故 33 是原根。验证其幂跑遍简化剩余系:

313, 322, 336, 344, 355, 361(mod7)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,2,6,4,5,1}\set{3,2,6,4,5,1} 恰好就是 {1,2,3,4,5,6}\set{1,2,3,4,5,6},无重复、无遗漏。顺带一提 g=2g=2 不是原根:23=81(mod7)2^3=8\equiv 1\pmod 7,阶只有 33

提示

找原根的标准做法 不是g1,g2,g^1,g^2,\dots 一直算到 φ(m)\varphi(m),而是:分解 φ(m)=qiei\varphi(m)=\prod q_i^{e_i},对每个素因子 qiq_i 检验 gφ(m)/qi≢1(modm)g^{\varphi(m)/q_i}\not\equiv 1\pmod m。只要所有这些都不为 11gg 的阶就必然是满的 φ(m)\varphi(m)。这把检验量从 φ(m)\varphi(m) 次降到素因子个数次。

二次剩余

最简单的高次情形是 k=2k=2:问 x2a(modp)x^2\equiv a\pmod p 有没有解。若有解,称 aa 是模 pp二次剩余(Quadratic Residue,QR);否则称 二次非剩余

对奇素数 pp,简化剩余系里恰好一半是二次剩余、一半不是。判定用 勒让德符号(Legendre Symbol):

(ap)={  1,a 是二次剩余1,a 是二次非剩余  0,pa\left(\frac{a}{p}\right)=\begin{cases}\ \ 1,&a\text{ 是二次剩余} \\ -1,&a\text{ 是二次非剩余} \\ \ \ 0,&p\mid a\end{cases}

它可由 欧拉判别法 算出:

(ap)ap12(modp)\left(\frac{a}{p}\right)\equiv a^{\frac{p-1}{2}}\pmod p

直觉上,ap12a^{\frac{p-1}{2}} 是费马小定理 ap11a^{p-1}\equiv1 的「平方根」,只能取 ±1\pm1;取 +1+1 当且仅当 aa 本身开得出平方根。更高效的判定依赖 二次互反律——高斯称之为「黄金定理」,是数论的标志性成果之一。

例:先把模 77 的二次剩余列全。对 x=16x=1\sim 6x2mod7x^2\bmod 7

121, 224, 322, 422, 524, 621(mod7)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,4}\set{1,2,4},非剩余为 {3,5,6}\set{3,5,6},恰好各 33 个(即 p12\frac{p-1}{2}),印证「一半是一半不是」。注意 xxx-x 平方相同,故剩余总成对出现。

例:用欧拉判别法判 33 是否为模 77 的二次剩余。算 3712=33=2761(mod7)3^{\frac{7-1}{2}}=3^3=27\equiv 6\equiv-1\pmod 7,得 (37)=1\left(\frac{3}{7}\right)=-1,所以 33非剩余x23(mod7)x^2\equiv 3\pmod 7 无解——与上面列出的剩余表 {1,2,4}\set{1,2,4} 不含 33 一致。再判 2223=81(mod7)2^3=8\equiv 1\pmod 7,故 (27)=1\left(\frac{2}{7}\right)=122 是剩余,确有 324223^2\equiv 4^2\equiv 2

应用一瞥

同余几乎渗透在每个数论场景里:

  • 整除判定:判断一个数能否被 3,9,113,9,11 整除的「各位数字求和」法则,本质是 101(mod9)10\equiv1\pmod9101(mod11)10\equiv-1\pmod{11}
  • 大整数运算:把大数拆成多个小模(两两互素),用 CRT 并行计算再拼回,是高精度库的常用加速。
  • 公钥密码:RSA 的加解密就是模 nn 下的幂运算,其正确性由欧拉定理保证,效率由快速幂和 CRT 支撑。