1. 程式人生 > >演算法總結之求解模線性方程組

演算法總結之求解模線性方程組

1)求解模線性方程 ax = b(mod n)

  方程ax = b(mod n) -> ax = b + ny ->ax - ny = b

  -> ax + n (-y) =b 其中a,n,b已知。 可用擴充套件歐幾里得來求解該方程的一組特解。

  這裡給出下列幾個定理用來求解方程:

  1.當且僅當d|b時,方程ax = b(mod n)有解。d=gcd(a,n)

  2.ax = b(mod n) 或者有d個不同解,或者無解。

  3.令d=gcd(a,n) 假定對整數x', y', 有d = ax' + ny', 如果d | b, 則方程ax = b(mod n)有一個解的值為x0, 滿足:

    x0=x‘(b/d)(mod n)

  4.假設方程ax = b(mod n)有解, x0是方程的任意一個解, 則方程對模n恰有d個不同的解, 分別為:

    xi = x0 + i * (n / d), 其中 i = 1,2,3......d - 1

  根據這4個定理,運用擴充套件歐幾里得演算法就能輕易的求出模線性方程的所有解了。

虛擬碼如下:
MODULAR_LINEAR_EQUATION_SOLVER(a,b,n)
(d,x',y')=EXTENDED_EUCLID(a,n)
if (d|b)
    x0=x'(b/d) mod n
    for i=0 to d-1
    print (x0+i(n/d)) mod n
else
    print "no solutions"

2)求解模線性方程組

  x = a1(mod m1)

  x = a2(mod m2)

  x = a3(mod m3)

  先求解方程組前兩項。 x=m1*k1+a1=m2*k2+a2

 -> m1*k1+m2*(-k2)=a2-a1

  這個方程可以通過歐幾里得求解出最小正整數的k1 則x=m1*k1+a1 顯然x為兩個方程的最小正整數解。

  則這兩個方程的通解為 X=x+k*LCM(m1,m2) -> X=x(mod LCM(m1,m2)) 就轉換成了一個形式相同方程了

  在通過這個方程和後面的其他方程求解。最終的結果就出來了。