中国剩余定理

CRT

CRT 是用来解决一元线性同余方程组的。

例如,对于下面的方程组:
{ x ≡ a 1    (   m o d    m 1 ) x ≡ a 2    (   m o d    m 2 )                    ⋯ ⋯ x ≡ a n    (   m o d    m n ) \begin{cases}x\equiv a_1\;(\,\mathrm {mod}\; m_1)\\ x\equiv a_2\;(\,\mathrm {mod}\; m_2)\\ \;\;\;\;\;\;\;\;\;\cdots\cdots \\ x\equiv a_n\;(\,\mathrm {mod}\; m_n) \end{cases} xa1(modm1)xa2(modm2)xan(modmn)

其中, m 1 , m 2 , . . . , m n m_1,m_2,...,m_n m1,m2,...,mn 是两两互质的整数。

我们令 m = ∏ i = 1 n m i m=\prod\limits_{i=1}^nm_i m=i=1nmi M i = m m i M_i=\frac{m}{m_i} Mi=mim t i t_i ti 是方程 M i t i ≡ 1 (   m o d    m i ) M_it_i\equiv1(\,\mathrm {mod}\; m_i) Miti1(modmi) 的一个解。

那么 x x x 有整数解,解为 x = ∑ i = 1 n a i M i t i x=\sum\limits_{i=1}^na_iM_it_i x=i=1naiMiti

证明如下:
因为 M i = m m i M_i=\frac{m}{m_i} Mi=mim 是除了 m i m_i mi 之外所有模数的倍数,所以对于 ∀ k ≠ i \forall k\ne i k̸=i,有 M i ≡ 0 (   m o d    m k ) M_i\equiv0(\,\mathrm {mod}\; m_k) Mi0(modmk),也即 a i M i t i ≡ 0 (   m o d    m k ) a_iM_it_i\equiv0(\,\mathrm {mod}\; m_k) aiMiti0(modmk)
又因为 a i M i t i ≡ a i (   m o d    m i ) a_iM_it_i\equiv a_i(\,\mathrm {mod}\; m_i) aiMitiai(modmi),所以如果代入 x = ∑ i = 1 n a i M i t i x=\sum\limits_{i=1}^na_iM_it_i x=i=1naiMiti,原方程组成立。
可以理解成每个 a i M i t i a_iM_it_i aiMiti 只对 i i i 这个方程有贡献,对其他方程都没有影响。
证毕。

这时,解出来的 x x x 是一个特解,通解可以用 x + k m ( k ∈ Z ) x+km(k\in \mathbb Z) x+km(kZ) 表示。

如果题目要我们求最小整数解,只需把 x x x m m m 取模,使得 x ∈ [    0    ,    m − 1    ] x\in[\;0\;,\;m-1\;] x[0,m1] 即可。

模板题:[51nod 1079] 中国剩余定理

exCRT

CRT 有一个缺陷,就是它只能解决 m m m 两两互质问题,若不满足 m m m 两两互质,我们就要用到 exCRT 算法了。

我们考虑能否把 { x ≡ a 1    (   m o d    m 1 ) x ≡ a 2    (   m o d    m 2 ) \begin{cases}x\equiv a_1\;(\,\mathrm {mod}\; m_1)\\ x\equiv a_2\;(\,\mathrm {mod}\; m_2) \end{cases} {xa1(modm1)xa2(modm2) 合并成一个方程。

把这个方程组变形,得到 { x = a 1 + m 1 y 1 x = a 2 + m 2 y 2 \begin{cases}x=a_1+m_1y_1\\ x= a_2+m_2y_2 \end{cases} {x=a1+m1y1x=a2+m2y2,也即 m 1 y 1 − m 2 y 2 = a 2 − a 1 m_1y_1-m_2y_2=a_2-a_1 m1y1m2y2=a2a1

那我们就可以用扩展欧几里得算法来解这个式子。

如果这个式子无解,则原同余方程组无解。

否则的话,解出一组可行解 ( y 1 , y 2 ) (y_1,y_2) (y1,y2),代回去解出一个关于 x x x 的可行解 x 1 x_1 x1,令 m = l c m ( m 1 , m 2 ) m=\mathrm {lcm}(m_1,m_2) m=lcm(m1,m2)。上述的方程组就等价于:

x ≡ x 1 (   m o d    m ) x\equiv x_1(\,\mathrm{mod}\;m) xx1(modm)

两两合并,最后只剩下 1 1 1 个方程,解出来便是答案。

模板题:[POJ 2891] Strange Way to Express Integers

你可能感兴趣的:(#,知识点)