定理内容
中国剩余定理(孙子定理),这是用来解出一堆线性同余方程组同一解的定理,通常会给出一对同余方程。如下,其中任意两个
m
i
mi
mi 互质,求解
x
x
x
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
x
≡
a
3
(
m
o
d
m
3
)
…
x
≡
a
n
(
m
o
d
m
n
)
\begin{aligned} x &\equiv a_1 \pmod {m_1} \\ x & \equiv a_2 \pmod {m_2} \\ x & \equiv a_3 \pmod {m_3} \\ & \dots \\ x & \equiv a_n \pmod {m_n} \end{aligned}
xxxx≡a1(modm1)≡a2(modm2)≡a3(modm3)…≡an(modmn)
在定理中设有几个变量
M
,
M
i
,
t
i
M,M_i,t_i
M,Mi,ti,对于他们有关系
M
=
m
1
×
m
2
×
m
3
×
⋯
×
m
n
M
i
=
M
÷
m
i
M
i
×
t
i
≡
1
(
m
o
d
m
i
)
\begin{aligned} &M = m_1 \times m_2 \times m_3 \times \dots \times m_n \\ &M_i = M \div m_i \\\\ &M_i \times t_i \equiv 1 \pmod {m_i} \end{aligned}
M=m1×m2×m3×⋯×mnMi=M÷miMi×ti≡1(modmi)
可以看出,其中
t
i
t_i
ti 是
M
i
M_i
Mi 关于
m
i
m_i
mi 的逆元。而
x
x
x 有
x
=
∑
i
=
1
n
a
i
×
M
i
×
t
i
x = \sum^{n}_{i = 1} a_i \times M_i \times t_i
x=i=1∑nai×Mi×ti
证明
由上面我们可以知道,中国剩余定理是通过构造来得到一组解, 因此只需要证明可行性即可。
你可以尝试带入进去。比如这里带入第一个式子 x ≡ a 1 ( m o d m 1 ) x \equiv a_1 \pmod {m_1} x≡a1(modm1)。因为 x x x 中除了第 1 1 1 项, 其他所有的 a i × M i × t i a_i \times M_i \times t_i ai×Mi×ti 中的 M i M_i Mi 里面都有 m 1 m_1 m1 这个因子,那么其他项就可以被取模 m 1 m_1 m1 给完美消掉,只剩下第一项 a 1 × M 1 × t 1 a_1 \times M_1 \times t_1 a1×M1×t1。
又因为 M i × t i ≡ 1 ( m o d m ) i M_i \times t_i \equiv 1 \pmod m_i Mi×ti≡1(modm)i, 那么M1 * t1 在取模 m 1 m_1 m1 下就为 1 1 1 ,那么就只剩下 a 1 a_1 a1,符合等式 1 1 1,对于其他的等式同理, 这就说明,这是一个正确解。
关于
t
i
t_i
ti 一定有解。
因为
M
i
×
t
i
≡
1
(
m
o
d
m
i
)
M
i
=
M
÷
m
i
gcd
(
m
i
,
m
j
)
=
1
,
i
≠
j
\begin{aligned} &M_i \times t_i \equiv 1 \pmod {m_i} \\ &Mi = M \div m_i \\ &\gcd(m_i,m_j) = 1,i \not = j \end{aligned}
Mi×ti≡1(modmi)Mi=M÷migcd(mi,mj)=1,i=j
通过裴蜀定理可得式子
M
i
×
x
+
m
i
×
y
=
1
M_i \times x + m_i \times y = 1
Mi×x+mi×y=1
而
M
i
×
t
i
≡
1
(
m
o
d
m
i
)
M_i \times t_i \equiv 1 \pmod {m_i}
Mi×ti≡1(modmi),可以化成等式
M
i
×
t
i
+
m
i
×
y
=
1
M_i \times t_i + m_i \times y = 1
Mi×ti+mi×y=1
那么
M
i
×
x
+
m
i
×
y
=
1
M_i \times x + m_i \times y = 1
Mi×x+mi×y=1 中的
x
x
x 就是
t
i
t_i
ti。
M
i
×
x
+
m
i
×
y
=
1
M_i\times x + m_i \times y = 1
Mi×x+mi×y=1 存在,等式
M
i
×
t
i
+
m
i
×
y
=
1
M_i \times t_i + m_i \times y = 1
Mi×ti+mi×y=1 就一定存在,
x
x
x 一定有解,即
t
i
t_i
ti 一定有解,那么
t
i
t_i
ti 就一定可以通过 exgcd 求出。
值得一提的是
M
M
M 是所有
m
i
m_i
mi 的乘积,那么通解应该也就知道了,即
x
=
x
0
+
k
×
M
x = x_0 + k \times M
x=x0+k×M
我
x
x
x 加上
k
k
k 个
M
M
M 不影响每个
m
i
m_i
mi 取余,它还是
a
i
a_i
ai,也就都是合法解。(这里有多组解的原因也是, 有
n
n
n 个式子但能找出来
n
+
1
n + 1
n+1 个未知数(把同余方程列乘等式),因此有无数解)
所以最小正整数解就是用代码就是 (x % M + M) % M