中国剩余定理那些事

中国剩余定理是经常遇到的东西,不过其实也就是这样一个问题: 如何解线性同余方程组。
(注:以下各式中等号并不是标准的同余所用的符号,此处仅为方便。)
所谓同余方程组其实也就是下面这个问题:
X = R1 ( mod D1 )
X = R2 ( mod D2 )
……
X = Rn ( mod Dn )
已知 Di( Di 两两互质) 和 Ri 求 X。

初看上去可能没什么思路,因为似乎没有什么直接的方法能够解,毕竟它不同于我们以往见到的那些线性方程组。
但我们却能够得到一个方向: 寻找模运算的相关性质(说了等于白说……-_-|||)。
我们可能会这样想:如果 Ri % Dj = 0 就好了,因为那样的话我们就可以直接利用模运算加法的性质,求出 R1 -> Rn 的累和,它将直接是 X 的一个特解。至于其他的解自然可以通过 D1 -> Dn 的累积(公差)加减得到,然而我们并不能期望数据是如此的巧合。
考虑到 模运算乘法的性质,如果我们能够找到一个数列 Bi,满足这样的性质:Bi % Di = 1, Bi % Dj = 0(i != j),那么我们就可以构造这样一个数:X0 = R1 * B1 + R2 * B2 + …… + Rn * Bn。 事实上 X0 也就是我们所要找的一个特解。通解则同上。
那么问题就转化成了: 如何找到我们所需要的 Bi。
回想一下模运算的除法操作,我们在使用扩展欧几里得算法时,对于两个互质的数,我们可以得到这样一个式子:a * x + b * y = 1,这个式子也可以写作:a * x % b = 1。我们似乎看到了一条光明的大道。
令 Ci = D1 * D2 * …… * Di-1 * Di+1 * …… * Dn,显然,Ci 与 Di 互质,所以可以通过扩展欧几里得算法可以得到:Ci * Ri % Di = 1,并且它满足 Ci * Ri % Dj = 0(i != j)。
就这样,我们得到了 Bi,也就是说我们已经能够得到方程组的所有解,尽管我们的计算机可能不能用普通变量存储下这么大的数字,但那不关这个算法正确性的事。

多么巧妙的构造啊(至少我是这样认为的),然而我们所有的推论都基于一个前提: Di 两两互质。那么如果不满足呢?
X = R1 ( mod D1 )
X = R2 ( mod D2 )
……
X = Rn ( mod Dn )
已知 Di 和 Ri 求 X。
仅仅是少了那么几个字,如此巧妙的构造便失效了,我们不得不另辟蹊径以解决这个烦人的问题。
这次我们将用到 合并方程的方法,以两个方程的合并为例,因为你可以就这样一直循环下去直到只有一个方程,那么你就可以直接找到方程组的解:最后留下方程的 remainder。
如:
X = R1 ( mod D1 )
X = R2 ( mod D2 )
由这两个方程我们可以得到:k1 * D1 + R1 = k2 * D2 + R2。在此我们必须注意一个细节: 只有当 gcd ( D1, D2 ) | ( R1 - R2 ),我们才能合并这两个方程,否则个方程组无解。
那么记 cd = gcd ( D1, D2 ) = D1 * a + D2 * b, ci = R1 - R2。
则有:k2 * D2 / cd = k1 * D1 / cd + ci / cd
=> k2 * D2 / cd = ci / cd ( mod D1 / cd )
=> k2 * D2 = ci ( mod D1 / cd )
注意到:( D1 / cd ) * a + D2 * ( b / cd ) = 1
记 t = ( ( ci * b / cd ) % ( D1 / cd ) + ( D1 / cd ) ) % ( D1 / cd ),则:
=> k2 = t ( mod D1 / cd )(我不知道如何证明这两步的正确性,但似乎的确可以这样用)
=> X = ( t + y * D1 / cd ) * D2 + R2
=> X = t * D2 + R2 ( mod D1 * D2 / cd )
化至此式,所有变量均为已知或可计算得出,而原来的两个方程变成一个方程。
但还有一个问题:为什么它与原两个方程同解?我们可以肯定,满足前两个方程的解必满足后方程,但如何证明满足后者的解也必定满足前两个方程呢?也许很容易证明满足第二个方程,如下:
X = R2 + t * D2 ( mod D1 * D2 / cd )
=> X = R2 + t * D2 ( mod D2 )
=> X = R2 ( mod D2 )
但对于第一个方程则不是那么明显了:
X = R2 + t * D2 ( mod D1 * D2 / cd )
=> X = R2 + t * D2 ( mod D1 )
=> X = R2 + ( ( ci * b / cd ) + y * ( D1 / cd ) ) * D2 ( mod D1 )
=> X = R2 + ci * ( 1 - a * D1 / cd ) ( mod D1 )
=> X = R1 ( mod D1 )

好吧,关于中国剩余定理,就到这了。如果以上有任何不合理的地方,请通知我。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值