zoukankan      html  css  js  c++  java
  • 通常情况下的中国剩余定理

            这几天学了学中国剩余定理。。。。本来计划是一天学互质版一天学非互质版的,结果非互质版就学了好长时间。。。不过好在会证明了,考场上大力推一波应该是没问题的吧。。。

            中国剩余定理是求形如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))

            按照这样的方法,将方程两两合并之后就可以得到方程组的通解

  • 相关阅读:
    ARM里面的APB和AHB
    解决win10点击开始按钮无反应
    keil的51和ARM共存方法
    对于一个液晶而言什么是读状态、读数据、写指令、写数据
    关于VMware中Ubuntu 出现Unknown Display问题解决
    论基于SOA的面向服务架构设计及其应用
    科技小论文2
    软件体系架构的质量属性--论文
    一线架构师实践指南阅读笔记03
    一线架构师阅读指南-阅读感想02
  • 原文地址:https://www.cnblogs.com/hinanawitenshi/p/7684112.html
Copyright © 2011-2022 走看看