MathLabs

算术与数论

中国剩余定理

模数两两互素的同余方程组,在其乘积模下总有唯一解。

直观不用数过77就能点清士兵

一位将军让士兵按每排33人列队,余22人;按每排55人列队,余33人;按每排77人列队,余22人。共有多少士兵?尽管将军从未数过超过77的数,这三个小小的余数(2,3,2)(2,3,2)就已经把人数在模3×5×7=1053\times5\times7=105下完全锁定:答案是2323(加上105105的任意倍数)。这就是中国剩余定理(CRT):只要各模数两两互素,知道模每个mim_i的余数所包含的信息,与知道模它们的乘积m1m2⋯mkm_1 m_2\cdots m_k的余数完全相同。它使我们能把模一个巨大数的一次困难计算拆成模其各个因子的若干简单、独立的计算,最后再把结果拼回。

展示模M的问题如何拆分为模互素因子的独立子问题并重新组合的网络图。
模 m=15=3×5m = 15 = 3 \times 5 的剩余类:每个剩余 x mod 15x \bmod 15 由余数对 (x mod 3, x mod 5)(x \bmod 3,\ x \bmod 5) 唯一确定。

中学定理陈述与显式公式

定义: 联立同余方程组

给定两两互素的模m1,…,mkm_1,\dots,m_k——即gcd⁡(mi,mj)=1(i≠j)\gcd(m_i,m_j)=1\quad(i\neq j)——以及任意整数a1,…,aka_1,\dots,a_k,方程组x≡ai(modmi)(1≤i≤k)x \equiv a_i \pmod{m_i}\quad(1\le i\le k)要求出一个对每个ii都同时满足模mim_i同余于aia_i的整数xx。设M=m1m2⋯mk,Mi=M/miM = m_1 m_2 \cdots m_k,\quad M_i = M/m_i,并取yiy_i为MiM_i在模mim_i下的逆元(即Miyi≡1(modmi)M_i y_i \equiv 1 \pmod{m_i},因gcd⁡(Mi,mi)=1\gcd(M_i,m_i)=1而存在),则解由x≡∑i=1kaiMiyi(modM)x \equiv \sum_{i=1}^{k} a_i M_i y_i \pmod{M}显式给出。

x≡ai(modmi)(1≤i≤k),gcd⁡(mi,mj)=1 (i≠j)x \equiv a_i \pmod{m_i}\quad(1\le i\le k),\qquad \gcd(m_i,m_j)=1\ (i\neq j)

和式中的每一项aiMiyia_i M_i y_i都被精心构造为≡ai(modmi)\equiv a_i \pmod{m_i}(因为Miyi≡1(modmi)M_i y_i\equiv1\pmod{m_i}),且对所有j≠ij\neq i满足≡0(modmj)\equiv 0 \pmod{m_j}(因为mjm_j是Mi=M/miM_i = M/m_i的因子)。因此当把整个和式对某个固定的mim_i取模时,除第ii项外其余各项全部消失,只留下aia_i——恰如所需。

x≡∑i=1kaiMiyi(modM),M=m1⋯mk, Mi=M/mi, Miyi≡1(modmi)x \equiv \sum_{i=1}^{k} a_i M_i y_i \pmod{M},\qquad M = m_1\cdots m_k,\ M_i = M/m_i,\ M_i y_i \equiv 1 \pmod{m_i}
两个模与kk个模的对比
情形假设唯一性所对的模
22个模m1,m2m_1,m_2gcd⁡(m1,m2)=1\gcd(m_1,m_2)=1m1m2m_1 m_2
kk个模m1,…,mkm_1,\dots,m_ki≠ji\neq j时gcd⁡(mi,mj)=1\gcd(m_i,m_j)=1M=m1⋯mkM=m_1\cdots m_k

大学定理

若m1,…,mkm_1,\dots,m_k两两互素(gcd⁡(mi,mj)=1(i≠j)\gcd(m_i,m_j)=1\quad(i\neq j)),则对任意整数a1,…,aka_1,\dots,a_k,方程组x≡ai(modmi)(1≤i≤k)x \equiv a_i \pmod{m_i}\quad(1\le i\le k)必有解xx,且任意两个解在模M=m1⋯mkM=m_1\cdots m_k下同余。

为什么成立?

由于各模数没有公共素因子,模m1m_1余a1a_1与模m2m_2余a2a_2是完全独立的约束——就像分别指定一个点的xx坐标与yy坐标一样。贝祖等式为我们提供了在某一个模下为11、在其余所有模下为00的"基向量",使我们能把解直接写成线性组合。

证明

我们先证明两个模的情形(k=2k=2),再通过归纳法推广。由gcd⁡(m1,m2)=1\gcd(m_1,m_2)=1,贝祖等式给出整数u,vu,v满足m1u+m2v=1m_1 u + m_2 v = 1。令x0=a1m2v+a2m1ux_0 = a_1 m_2 v + a_2 m_1 u。

在模m1m_1下检验:由m1u+m2v=1m_1 u + m_2 v = 1得m2v=1−m1u≡1(modm1)m_2 v = 1 - m_1 u \equiv 1 \pmod{m_1},而m1u≡0(modm1)m_1 u \equiv 0 \pmod{m_1},故x0≡a1⋅1+a2⋅0=a1(modm1)x_0 \equiv a_1\cdot 1 + a_2\cdot 0 = a_1 \pmod{m_1}。

对称地,在模m2m_2下:m1u=1−m2v≡1(modm2)m_1 u = 1-m_2 v \equiv 1 \pmod{m_2}且m2v≡0(modm2)m_2 v \equiv 0 \pmod{m_2},故x0≡a1⋅0+a2⋅1=a2(modm2)x_0 \equiv a_1\cdot 0 + a_2\cdot 1 = a_2 \pmod{m_2}。这证明了k=2k=2时的存在性。

当k=2k=2时的唯一性:若xx与x′x'都是方程组的解,则x−x′≡0(modm1)x-x'\equiv0\pmod{m_1}且x−x′≡0(modm2)x-x'\equiv0\pmod{m_2},即m1m_1与m2m_2都整除d=x−x′d=x-x'。把贝祖等式m1u+m2v=1m_1 u+m_2 v=1两边乘以dd:得d=dm1u+dm2vd = d m_1 u + d m_2 v。因m2∣dm_2\mid d,第一项dm1ud m_1 u是m1m2m_1 m_2的倍数;因m1∣dm_1\mid d,第二项dm2vd m_2 v也是m1m2m_1 m_2的倍数。因此m1m2∣dm_1 m_2 \mid d,即x≡x′(modm1m2)x\equiv x'\pmod{m_1 m_2}。

对一般的k>2k>2,用归纳法:前两个同余式(由k=2k=2情形)等价于模m1m2m_1 m_2的一个同余式;由于m3m_3与m1m_1、m2m_2都互素,它与乘积m1m2m_1 m_2也互素,因此可以继续合并,直至kk。同时注意显式和式x≡∑i=1kaiMiyi(modM)x \equiv \sum_{i=1}^{k} a_i M_i y_i \pmod{M}按完全相同的推理对任意kk直接成立:Mi=M/miM_i = M/m_i与mim_i互素故逆元yiy_i存在,而每个j≠ij\neq i的项都在MjM_j中含有因子mim_i。■\blacksquare

当gcd⁡(m1,m2)=1\gcd(m_1,m_2)=1时,映射ψ(x mod m1m2)=(x mod m1, x mod m2)\psi(x \bmod m_1 m_2) = (x\bmod m_1,\ x\bmod m_2)是环同构Z/(m1m2)Z≅(Z/m1Z)×(Z/m2Z)\mathbb{Z}/(m_1 m_2)\mathbb{Z} \cong (\mathbb{Z}/m_1\mathbb{Z})\times(\mathbb{Z}/m_2\mathbb{Z}),将ψ\psi限制到可逆元上即可证明φ(m1m2)=φ(m1) φ(m2)\varphi(m_1 m_2) = \varphi(m_1)\,\varphi(m_2)。

为什么成立?

这就是CRT的结构意义:模m1m2m_1 m_2的算术从字面上看就是两个相互独立的模算术副本(一个模m1m_1,一个模m2m_2)并排运行。这既是欧拉函数φ\varphi在互素数上能干净地分解为乘积的原因,也是计算机能够通过在每个小分量上分别计算来加速大整数与密码学运算的原因。

证明

第一,ψ\psi是良定义的:若x≡x′(modm1m2)x\equiv x'\pmod{m_1 m_2},则m1m2∣(x−x′)m_1 m_2\mid(x-x'),故m1m_1与m2m_2都整除x−x′x-x',即x≡x′(modm1)x\equiv x'\pmod{m_1}且x≡x′(modm2)x\equiv x'\pmod{m_2}。

第二,由于模mim_i化简保持加法与乘法(已在第一个同余主题中证明),ψ\psi在每个坐标上都保持加法与乘法,因此ψ\psi是环同态。

第三,上面的定理1恰好说明对每一对(a1,a2)(a_1,a_2)都存在映射到它的xx(故ψ\psi是满射),且该xx在模m1m2m_1 m_2下唯一(故ψ\psi是单射)。因此ψ\psi是双射,从而是环同构。

最后,在积环R1×R2R_1\times R_2中,元素(u1,u2)(u_1,u_2)有乘法逆元(v1,v2)(v_1,v_2)当且仅当在R1R_1中有u1v1=1u_1 v_1=1且在R2R_2中有u2v2=1u_2 v_2=1——也就是说当且仅当两个坐标都可逆。由于环同构保持可逆性,Z/(m1m2)Z\mathbb{Z}/(m_1 m_2)\mathbb{Z}中的可逆元(共φ(m1m2)\varphi(m_1 m_2)个)与(Z/m1Z)×(Z/m2Z)(\mathbb{Z}/m_1\mathbb{Z})\times(\mathbb{Z}/m_2\mathbb{Z})中的可逆元对(共φ(m1) φ(m2)\varphi(m_1)\,\varphi(m_2)对)一一对应。两边计数即得φ(m1m2)=φ(m1) φ(m2)\varphi(m_1 m_2)=\varphi(m_1)\,\varphi(m_2)。再结合素数幂的φ(pr)=pr−pr−1\varphi(p^r)=p^r-p^{r-1}(此时不互素的数恰好是pp的pr−1p^{r-1}个倍数),立即推出上一主题所使用的φ(n)\varphi(n)一般乘积公式。■\blacksquare

进阶实际应用与典型例题

除经典趣题外,中国剩余定理更是现代计算的主力工具。所有生产级RSA实现(OpenSSL、BoringSSL、硬件安全模块)都使用CRT-RSA(Quisquater–Couvreur,1982年),通过分别在模pp与模qq下计算再用CRT合并来求cd mod pqc^d \bmod pq——速度大约提升44倍,因为模幂运算的开销为O((log⁡m)3)O((\log m)^3),把模数的比特长度减半会使每次模幂的工作量降为原来的23=82^3=8分之一(做两次,总体快8/2=48/2=4倍)。同样的思想也支撑着快速大整数库与同态加密中的剩余数系统(RNS),以及天文与历法周期的计算。

例题: 求解孙子原版的点兵问题

求满足x≡2(mod3)x\equiv2\pmod3、x≡3(mod5)x\equiv3\pmod5与x≡2(mod7)x\equiv2\pmod7的所有整数xx。

解答

模m1=3,m2=5,m3=7m_1=3,m_2=5,m_3=7两两互素,乘积为M=3×5×7=105M = 3\times5\times7 = 105,因此可应用显式CRT公式,其中M1=105/3=35M_1 = 105/3 = 35,M2=105/5=21M_2 = 105/5 = 21,M3=105/7=15M_3 = 105/7 = 15。

分别求MiM_i在模mim_i下的逆元yiy_i:(1)35≡2(mod3)35 \equiv 2 \pmod 3,且2×2=4≡1(mod3)2\times2=4\equiv1\pmod3,故y1=2y_1=2;(2)21≡1(mod5)21 \equiv 1 \pmod 5,故y2=1y_2=1;(3)15≡1(mod7)15 \equiv 1 \pmod 7,故y3=1y_3=1。

以(a1,a2,a3)=(2,3,2)(a_1,a_2,a_3)=(2,3,2)代入x≡∑i=1kaiMiyi(modM)x \equiv \sum_{i=1}^{k} a_i M_i y_i \pmod{M}:x≡2⋅35⋅2+3⋅21⋅1+2⋅15⋅1=140+63+30=233(mod105)x \equiv 2\cdot35\cdot2 + 3\cdot21\cdot1 + 2\cdot15\cdot1 = 140 + 63 + 30 = 233 \pmod{105}。

因233=2×105+23233 = 2\times105 + 23,对模105105化简得x≡23(mod105)x \equiv 23 \pmod{105}。快速验算:23=3×7+2≡2(mod3)23 = 3\times7+2\equiv2\pmod3,23=5×4+3≡3(mod5)23=5\times4+3\equiv3\pmod5,23=7×3+2≡2(mod7)23=7\times3+2\equiv2\pmod7。三条全都成立,最小正整数解为**2323**。

例题: 利用CRT加速RSA解密(CRT-RSA)

在上一主题的RSA例子中(p=5,q=11,n=55,d=27p=5,q=11,n=55,d=27,密文c=8c=8),请不要直接在模5555下计算,而是拆成模55与模1111的两个小计算来求m=827 mod 55m = 8^{27} \bmod 55。

解答

模p=5p=5:将底数化简为8≡3(mod5)8\equiv3\pmod5,并用费马小定理把指数d=27d=27按模p−1=4p-1=4化简(27=4×6+327 = 4\times6+3,故dp=3d_p = 3)。于是mp=33=27≡2(mod5)m_p = 3^3 = 27 \equiv 2 \pmod 5——只需算一次很小的立方!

模q=11q=11:底数为88,用费马定理把指数2727按模q−1=10q-1=10化简(27=10×2+727 = 10\times2+7,故dq=7d_q = 7)。计算87 mod 118^7 \bmod 11:因8≡−3(mod11)8\equiv-3\pmod{11},有82≡9≡−28^2\equiv9\equiv-2,84≡48^4\equiv4,87=84⋅82⋅8≡4⋅(−2)⋅(−3)=24≡2(mod11)8^7 = 8^4\cdot8^2\cdot8\equiv 4\cdot(-2)\cdot(-3)=24\equiv2\pmod{11}。

现在用CRT合并m≡2(mod5)m\equiv2\pmod5与m≡2(mod11)m\equiv2\pmod{11}:由于两个余数恰好都是22,模5555下的唯一解立即就是m≡2(mod55)m\equiv2\pmod{55}(一般当mp,mqm_p,m_q不同时,只需套用一次两模CRT公式)。注意我们从未对大于1111的数做过平方,也从未用过大于77的指数——对于20482048比特的RSA素数,同样的拆分能把解密时间缩短到约四分之一。

研究研究前沿中的CRT:快速算术、故障攻击与格密码

求满足x≡1(mod3)x\equiv1\pmod3且x≡2(mod5)x\equiv2\pmod5的最小非负整数xx。

若m1=4,m2=9,m3=25m_1=4,m_2=9,m_3=25,则以这些数为模的CRT方程组的解在模多少下唯一?

关于方程组x≡1(mod4)x\equiv1\pmod4与x≡0(mod6)x\equiv0\pmod6,以下哪项正确?

为什么CRT能把RSA解密cd mod pqc^d\bmod pq加速大约44倍?

参考文献

  1. Jean-Jacques Quisquater, Christophe Couvreur (1982). Fast decipherment algorithm for RSA public-key cryptosystem · DOI:10.1049/el:19820617
  2. David Harvey, Joris van der Hoeven (2021). Integer multiplication in time O(n log n) · DOI:10.4007/annals.2021.193.2.4