zoukankan      html  css  js  c++  java
  • 线性同余方程组

    线性同余方程和中国剩余定理就不多说了。

    线性同余方程组的求解可以分解为求若干个线性同余方程。比如,对于线性同余方程组:
    2x ≡ 2 (mod 6)
    3x ≡ 2 (mod 7)
    2x ≡ 4 (mod 8 )
    首先求解第一个方程,得到x ≡ 1 (mod 3),于是令x = 3k + 1,第二个方程就变为:
    9k ≡ −1 (mod 7 )
    解得k ≡ 3 (mod 7 )。于是,再令k = 7l + 3,第三个方程就可以化为:
    42l ≡ −16 (mod 8 )
    解出:l ≡ 0 (mod 4 ),即 l = 4m。代入原来的表达式就有 x = 21(4m) + 10 = 84m + 10,即解为:
    x ≡ 10 (mod 84 )
    对于一般情况下是否有解,以及解得情况,则需用到数论中的中国剩余定理。

    模仿中国剩余定理的做法来解决这个问题。

    如果只有一个方程:x mod a0 = r0。那么,显然x的最小正值为a0+r0。

    根据模的性质,我们容易得知,x+a0*k均为该方程的解。(k为正整数)

    如果多了一个方程:x mod a1 = r1。那么,我们为了使之间求得的解x0=a0+r0能够同时满足这两个方程,只好令x0=x0+a0*k,显然这样做x0仍然满足第一个方程。这时候我们相当于要求解这样一个模方程:(x0+a0*k) mod a1 = r1。这个方程我们可以用拓展欧几里得算法求得k的值。这样,只要令x0变成x0+a0*k,就能同时满足这两个方程了。

    推而广之,对于方程x mod ai = ri,假如我们之前求得的解为X,那么我们要令X变成X+k*LCM(a0,a1,a2…ai-1),使得它满足这个方程。k我们可以用拓展欧几里得算法求解,LCM可以在每一次更新,这样就能在接近O(klogk)的时间复杂度内解决这个问题了。

    无解的判断:若某个(X+k*LCM) mod ai = ri无整数解,那么原方程组无解。

  • 相关阅读:
    JAVA中的流-简介(二)
    JAVA中的流-简介(一)
    Java中内部类简介
    应用小练习-自定义栈
    集合知识点(二)
    集合知识点(一)
    JAVA中的正则表达式简介
    从头文件中学习sfr和sbit
    PCB中实现元器件旋转一个角度放置
    DXP中插入LOGO字体方法(2)
  • 原文地址:https://www.cnblogs.com/hsuppr/p/3503156.html
Copyright © 2011-2022 走看看