问题:有$n$个这样形式的方程组:$x\equiv c_i\mod m_i$。求通解和最小解。
一般的做法
考虑如何合并
我们设
即
用扩展欧几里得解出$k_1$即可。
1 | void CRT(ll *c,ll *m,int n) |
注意,扩展欧几里得通解的最小间隔是$m_2\over gcd(m_1,m_2)$。
$m_i$两两互质或者可以预处理欧拉函数
以下两种做法,仅适用于$m_i$两两互质或者可以预处理欧拉函数的情况:
一个比较通用的方法
考虑将两个方程$x\equiv b_1\mod m_1$与$x\equiv b_2 \mod m_2$合并。
由欧拉定理得
同理可证
发现这两个方程长的像原来的方程组
得到:
将所有的方程组依次合并即可。
一个只适用于$\prod m_i$不会超出unsigned long long 范围的方法
我们如果把所有的方程组合并完,可以得到:
模数自然是$lcm(m_1,m_2,\dots m_n)$
这样合并的话,考虑将合并过后的结果带回原来的方程组,对于$c_i$的这一项,当模数是$m_i$时,$({M\over m_i})^{\varphi(m_i)}\equiv 1$;当模数不为$m_i$的时候$({M\over m_i})^{\varphi(m_i)}\equiv 0$。那么这个通解的正确性也是显然的了。
Tips
其实求$x^{\varphi(m_i)}$的过程相当于求$x$与$x$在模$m_i$意义下的逆元的乘积,所以我们可以把这个计算过程换成扩展欧几里得。但是,这样做的前提是,$m_i$两两互质。
为什么模数是$lcm(m_1,m_2\cdots m_n)$
证明通解一定是$x\equiv c\mod lcm(m_1,m_2\cdots m_n)$的形式,本质就是要证明:相邻的两个解之间的差恰好为$lcm(m_1,m_2\cdots m_n)$。
考虑只有两个模数的情况(其他可以类似推出),若$x\equiv c_1\mod m_1$,那么$\cdots c_1-m_1,c_1,c_1+m_1,c_1+2m_1\cdots $对第一个方程来说,都是可行的$x$。因此对第一个方程可行的$x$恰好每$m_1$个数中就有一个,即解之间的间隔为$m_1$。而第二个方程的解的间隔是$m_2$。假若合并得到的是$x\equiv c$,那么$c$一定既是第一个方程的可行解,又是第二个方程的可行解。假设另一个解是$x’$,那么一定有$m_1|x-x’$并且$m_2|x-x’$,也就是说解的间隔是$m_1,m_2$的公倍数,所以解之间的最小间隔就是$lcm(m_1,m_2)$。