exCRT 萌新讲解

考虑没有 互质的限制的同余方程

显然像 那样处理是不行的 =w=,我们考虑一个子问题

把这个式子拆开,得

也就是

, 考虑方程

使用 求解这个不定方程得到关于 的一个解

如果 不事 的倍数,那就自闭无解

的倍数,那么我们将上面的方程都乘上 ,就能快乐得到方程 的解

此时 就是原来求出的 倍,然后根据这个就可以推一下

这部分的代码很好写,伪代码:

g = exgcd(m1, m2, k1, k2); // 求出在 k2 * m2 - k1 * m1 = g 中 k1 的解和 gcd(m1, m2)
if ((a1 - a2) % g) return -1; // 判断无解的情况 =w=
k1 = (a1 - a2) / g * k1 % m2; // 求 k2 * m2 - k1 * m1 = c 中 k1 的解 k'

下一步就是求出 ,也就是这个子问题的一个特解 ,如果知道了 ,就可以得到 的通解

特解显然十分好求,也就是对于方程 ,我们求出了 的解,就可以直接回代方程

这里有一点需要注意的是,对于 ,我们求出来的是 也就得到了

我们转化成不定方程

满足这个方程的解也必定满足上面两个方程,满足上面两个方程的解也一定满足这个方程,也就是说这个同余方程等价于刚刚的方程组

这样就完成了合并操作

代码也十分好写,就是

a1 -= m1 * k1; // 求出新的余数
m1 = m1 / g * m2; // 模数 lcm(m1, m2) = m1 * m2 / gcd(m1, m2)
a1 %= m1; // 当心爆 long long

我们可以不断合并来求出整个方程组的通解,也就是把上面过程执行

代码很好写,这里就不放了 = =


By Shq