ChineseRemainerTheorem 中国剩余定理

问题

对于非负整数xx,给定nn组正整数的除数aia_{i}和余数mim_{i}0i<n0 \leq i \lt n)满足:

xmodai=mix \bmod a_{i} = m_{i}

其中所有余数mi,mjm_{i}, m_{j}两两互质。设所有余数的乘积为:

M=m0×m1××mn1=i=0n1miM = m_{0} \times m_{1} \times \cdots \times m_{n-1} = \prod_{i=0}^{n-1} m_{i}

因为任意两个余数互质,显然0x<M0 \leq x \lt M

这样的方程组即为数论中的一元线性同余方程组:

(S)={xa0(modm0)xa1(modm1)xan1(modmn1)(S) = \begin{cases} x \equiv a_{0} \pmod{m_{0}} \\ x \equiv a_{1} \pmod{m_{1}} \\ \cdots \\ x \equiv a_{n-1} \pmod{m_{n-1}} \end{cases}

xx

数论倒数/模倒数/模逆元

首先介绍数论倒数,三个整数满足:

a×bmodm=1a \times b \bmod m = 1

即:

a×b1(modm)a \times b \equiv 1 \pmod{m}

则称bbaa关于mm的数论倒数,也称模倒数、模逆元。显然gcd(a,m)gcd(a, m)即为aa关于mm的模逆元,可以通过Euclid求出。

中国剩余定理

用中国剩余定理求解一元线性同余方程组。设除了mim_{i}之外所有余数的乘积为:

Mi=MmiM_{i} = \frac{M}{m_{i}}

因为所有余数两两互质,因此存在tit_{i}MiM_{i}关于mim_{i}的模逆元,即:

ti×Mi1(modmi)t_{i} \times M_{i} \equiv 1 \pmod{m_{i}}

可得方程组(S)(S)的通解形式为:

x=a0t0M0+a1+t1M1++an1tn1Mn1+k×M=k×M+i=0n1aitiMix = a_{0} \cdot t_{0} \cdot M_{0} + a_{1} \cdot + t_{1} \cdot M_{1} + \cdots + a_{n-1} \cdot t_{n-1} \cdot M_{n-1} + k \times M = k \times M + \sum_{i=0}^{n-1} a_{i} \cdot t_{i} \cdot M_{i}

其中kk为整数,0i<n0 \leq i \lt n

对于MM取模,则有唯一解:

x=i=0n1aitiMix = \sum_{i=0}^{n-1} a_{i} \cdot t_{i} \cdot M_{i}

该算法的时间复杂度为O(n)O(n)

源码

ChineseRemainerTheorem.h

ChineseRemainerTheorem.cpp

测试

ChineseRemainerTheoremTest.cpp

Last updated