标签:之间 分解 应该 方法 组成 方程组 问题 log 时间
这几天学了学中国剩余定理。。。。本来计划是一天学互质版一天学非互质版的,结果非互质版就学了好长时间。。。不过好在会证明了,考场上大力推一波应该是没问题的吧。。。
中国剩余定理是求形如x≡a1(mod m1),x≡a2(mod m2)......x≡an(mod mn)这样的方程组的通解
我们考虑一下求这组方程组的最暴力的方法,对于每个方程,我们求一下mi的倍数加上ai的所有数,然后把这些数标上号,一个一个枚举所有解就行了。
但是当mi ai相差很大的时候,时间复杂度也注定会很高。
其实我们没有必要求出所有的k×mi+ai,我们只要求出最小的使方程组成立的值,然后将这个值每次加上lcm(mi,mj)就行了。因为既然x对于2个方程都成立,那么这两个方程的两个通解之间相差的最小值一定是lcm(m1,m2).证明如下:
设x1,x2为方程x≡a1(mod m1),x≡a2(mod m2)的两个解 则有:x1-x2≡0(mod m1),x1-x2≡0(mod m2) 那么:x1-x2=k1×m1,x1-x2=k2×m2 则:k1×m1=k2×m2,设d=gcd(m1,m2) 则k1×m1/d=k2×m2/d,那么k1×m1/d≡0(mod m2/d) 则有gcd(m1/d,m2/d)=1 则k1可分解为y×m2/d的形式,代回原式得x=y×lcm(m1,m2)
那么两两方程之间就可以合并成x≡M(mod lcm(m1,m2))的形式了,合并过程如下:
x≡a1(mod m1),x≡a2(mod m2) 设x=k1*m1+a1,x=k2*m2+a2,d=gcd(m1,m2) 联立两方程得:k1*m1+a1=k2*m2+a2
由裴蜀定理得,当d丨(a2-a1)时,原方程才有解 则k1*m1/d=k2*m2/d+(a2-a1)/d 即:k1*m1/d≡(a2-a1)/d(mod m2/d) 则:k1≡(a2-a1)/d*(m1/d)^(-1)(mod m2/d) 这里(a2-a1)/d*(m1/d)^(-1)是个定值,我们用y来代替 则:k1=k*m2/d+y 将k1代入原式 有:x=y*m1+k*lcm(m1,m2)+a1 即x≡y*m1+a1(mod lcm(m1,m2))
按照这样的方法,将方程两两合并之后就可以得到方程组的通解
标签:之间 分解 应该 方法 组成 方程组 问题 log 时间
原文地址:http://www.cnblogs.com/hinanawitenshi/p/7684112.html