『算法-ACM竞赛-数学-数论』中国剩余定理+扩展中国剩余定理(孙子定理)
『算法-ACM 竞赛-数学-数论』中国剩余定理+扩展中国剩余定理(孙子定理)
中国剩余定理
问题
求解同余方程组
其中$m_1,m_2,m_3…m_k$为两两互质的整数
求 x 的最小非负整数解
定理
令$M=\prod_{i=1}^km_i$,即 M 是所有 $m_i$的最小公倍数
$t_i$为同余方程 $M_t/m_i ≡ 1(mod\ m_i )$的最小非负整数解
则有一个解为$x=\sum_{i=1}^ka_i\frac{M}{m_i}t_i$
通解为$x+i*M(i\in Z)$
特别的,最小非负整数解为(x%M+M)%M
证明
代码实现
同余式的求解可以用扩展欧几里得
1 |
|
扩展中国剩余定理
求解同余方程组
其中$m_1,m_2,m_3…m_k$不一定为两两互质的整数
求 x 的最小非负整数解
求解:
求解
假设已经求出前 k-1 个方程组成的同余方程组的一个解为 x
且有$M=\prod_{i-1}^{k-1}m_i$
则前 k-1 个方程的方程组通解为 x+i∗M(i∈Z)x+i*M(i\in Z)x+i∗M(i∈Z)
那么对于加入第 k 个方程后的方程组
我们就是要求一个正整数 t,使得
$x+t∗M≡a_k(mod \ m_k)$
转化一下上述式子得
$t∗M≡a_k−x(mod\ m_k )$
对于这个式子我们已经可以通过扩展欧几里得求解 t
若该同余式无解,则整个方程组无解
若有,则前 k 个同余式组成的方程组的一个解解为$x_k=x+t*M$
所以整个算法的思路就是求解 k 次扩展欧几里得
1 |
|
『算法-ACM竞赛-数学-数论』中国剩余定理+扩展中国剩余定理(孙子定理)
https://chiamzhang.github.io/2024/06/29/『算法-ACM竞赛-数学-数论』中国剩余定理+扩展中国剩余定理(孙子定理)/