中国剩余定理

中国剩余定理

今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?

这是《孙子算经》中的一个问题,称为“孙子问题”。这个问题的一般解法称为中国剩余定理。具体解法分三步:

  1. 找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
  2. 用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加15∗2+21∗3+70∗2得到和233。
  3. 用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。这个余数23就是符合条件的最小数。

古人是怎么想到这个方法的呢?

首先这个问题可以被抽象成这样:已知\(i\in [1, n]\),x满足\(x=c_i \mod p_i\),求出最小的x。

对于每个方程i,我们试图构造出一个\(A_i\),使得\(A_i=c_i\mod p_i\),同时\(A_{其他}=0\mod p_i\),这样答案就是\(\sum A_i \mod p_1p_2\dots p_n\)

\(M_i=\frac{p_1p_2\dots p_n}{p_i}\)\(invM_i=M_i^{-1}\mod p_i\),那么Ai的公式就是\(A_i=M_i*invM_i*c_i\)。为什么这么构造?\(M_i=\frac{p_1p_2\dots p_n}{p_i}\)乘在Ai里,保证只有\(A_i\)不被\(p_i\)整除。再乘上\(M_i\)对于\(p_i\)的逆元,此时的\(A_i\) mod \(p_i\)就为1了。再乘上\(c_i\),就可以满足方程\(A_i=c_i\mod p_i\)

扩展中国剩余定理

来自大佬:https://blog.csdn.net/litble/article/details/75807726。

假设这里有两个方程:\(\begin{aligned} x=a_1*x_1+b_1 \\ x=a_2*x_2+b_2 \end{aligned}\),它们的原方程是\(x=b_1 \mod a_1,x=b_2 \mod a_2\)

那么合并一下两个方程,可以得到:\(a_1x_1-a_2x_2=b_2-b_1\ (gcd(a_1, a_2)\mid b_2-b_1)\)。还不赶快有请扩展欧几里得!(这幽默感学不来)

解出\(x_1\)后,就可以求出带入方程求出\(x=k \mod [a_1, a_2]\),继续处理这个方程和下一个方程即可。

posted @ 2018-07-20 20:51  pechpo  阅读(469)  评论(0编辑  收藏  举报