给出如下模方程组:
⎧⎩⎨⎪⎪x≡r1(mod m1)x≡r2(mod m2)……x≡rk(mod mk) { x ≡ r 1 ( m o d m 1 ) x ≡ r 2 ( m o d m 2 ) … … x ≡ r k ( m o d m k ) 其中 mi(1<=i<=k) m i ( 1 <= i <= k ) 两两互质,求解满足的最小x。中国剩余定理也称孙子定理,可以高效求解上述问题。 ps:好像几乎不考中国剩余定理=_=
举个孙子算经里的例子:(今有物不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?)
⎧⎩⎨⎪⎪x≡2(mod 3)x≡3(mod 5)x≡2(mod 7) { x ≡ 2 ( m o d 3 ) x ≡ 3 ( m o d 5 ) x ≡ 2 ( m o d 7 ) 定理①:当 ax≡b(mod a x ≡ b ( m o d m) m ) 时, ax∗c≡b∗c(mod a x ∗ c ≡ b ∗ c ( m o d m) m ) ,这个很显然。 还可以得出 x0+105k(k∈Z,k>=0) x 0 + 105 k ( k ∈ Z , k >= 0 ) 均为该问题的解( x0 x 0 是最小解,105是3,5,7的最小公倍数)。所以我们可以把原来的式子转变为这样:
⎧⎩⎨⎪⎪x≡1(mod 3)x≡0(mod 5)x≡0(mod 7)⎧⎩⎨⎪⎪x≡0(mod 3)x≡1(mod 5)x≡0(mod 7)⎧⎩⎨⎪⎪x≡0(mod 3)x≡0(mod 5)x≡1(mod 7) { x ≡ 1 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 0 ( m o d 7 ) { x ≡ 0 ( m o d 3 ) x ≡ 1 ( m o d 5 ) x ≡ 0 ( m o d 7 ) { x ≡ 0 ( m o d 3 ) x ≡ 0 ( m o d 5 ) x ≡ 1 ( m o d 7 ) 分别求解这三个模方程组的答案( x1 x 1 , x2 x 2 , x3 x 3 ),那么最后的答案x就等于 2∗x1+3∗x2+5∗x3 2 ∗ x 1 + 3 ∗ x 2 + 5 ∗ x 3 模105。我们来看第一个方程组,为了让x满足 x≡0(mod x ≡ 0 ( m o d 5) 5 ) 和 x≡0(mod x ≡ 0 ( m o d 7) 7 ) ,我们需要保证x是 lcm(5,7)=35 l c m ( 5 , 7 ) = 35 的倍数,设x=35*y,那么这个方程组简化为 35y≡1(mod 35 y ≡ 1 ( m o d 3) 3 ) ,也就变成了普通的模方程,用扩展欧几里得就可以求解出y=2即x=70。第二个方程组可以求解出x=21,第三个方程组可以求解出x=15。
那么最小解就是:(2*70+3*21+2*15) mod 105=23。(三人同行七十稀,五树梅花廿一枝,七子团圆月正半,除百零五便可知。)
有了这个例子,就不难给出代码了。不过我感觉中国剩余定理适用范围并不是很广,因为我们要取所有 mi m i 的最小公倍数即 Πmi Π m i , mi m i 随便大一点就炸掉了,如果要写高精度需要除法,代码复杂度就很高了=_=。
POJ1006,题解传送门。