中国剩余定理-CRT
一.什么是CRT?
CRT是用来解决线性同余方程组的求解的算法。它的前提是所有的模数互质就好。同时也是唯一一个以中国开头的算法(作为中国人要好好学呀)。
二.算法流程
首先从老祖宗的角度出发,他们当时解决的是这样一个问题。(为什么老祖宗这么强Orz)
- 三人同行七十稀
- 五树开花廿一枝
- 七子团圆正半月
- 除百零五便可知
这个问题的解答为该诗的最后一句,自己悟吧!不过我们先解决一个较为抽象的小问题。求
\[
x\equiv r_1(mod\;m_1)\\
x\equiv r_2(mod\;m_2)\\
x\equiv r_3(mod\;m_3)\\
\]
的解。
先记\(a_1,a_2,a_3\)为这三个方程各自的一个解使得\(x=a_1+a_2+a_3\)可以解出正解。对于这样的加法我们分类讨论。
- 对于\(a_1\)来说,根据同余的同加性,我们必须保证\(m_1|a_2,m_1|a_3\),这样才能有正确的答案。
- 对于\(a_2\)来说,根据同余的同加性,我们必须保证\(m_2|a_1,m_2|a_3\)
- 对于\(a_3\)来说,根据同余的同加性,我们必须保证\(m_3|a_1,m_3|a_2\)
由以上三点可知,每一个数必须保证是其他模数的倍数,由于所有的模数都互质所以说直接乘起来除掉这个数对应的模数就好,即令
\[
M=m_1*m_2...*m_n\\
q_i=\frac{M}{m_i}
\]
之后怎么操作我们先放在一边。现在来考虑怎么求出每个单独的\(a_i\),我们会直接去求方程\(a_i\equiv r_i \pmod{m_i}\)的解吗?老祖宗告诉我,不是的。那个东西不好求。老祖宗们考虑求出这个
\[
b_i\equiv 1(mod \;m_i)\\
b_i*r_i\equiv r_i(mod\;m_i)\\
q_i\equiv1(mod\;m_i)\\
b_i*r_i*q_i\equiv r_i(mod\;m_i)\\
\therefore a_i=b_i*r_i*q_i
\]
顺带一提,由于\(b_i*q_i\equiv1(mod\;m_i)\),所以\(b_i\)是\(q_i\)在\(mod\;m_i\)意义下的逆元。
到了现在,我们已经找到了求出x的方法,即\(x=\sum a_i=\sum inv(q_i)*r_i*q_i\),此处的inv是逆元的意义,但是此时求出来的x不一定是最小的解,所以说我们一边加还要一边对于M求余。
三.Code
ll CRT(ll r,ll pi){return r*Inv(mod/pi,pi)%mod*(mod/pi)%mod;}
好记吧!
四.不互质
不互质是不一定有解的,要用到扩展CRT,也称为合并线性同余方程组(利用扩展欧几里得算法)。详情请移步我的另一篇文章