同餘式與線性同餘式定理

關注我的公衆號c137Lab獲取更多相關內容

在這裏插入圖片描述

同餘式的定義與性質

整除性是數論的有利工具。下面介紹一種同餘式理論,可以簡便的表達整除性質。

如果 mm 整除 aba-b 那麼定義:aabbmm 同餘,記爲
ab( mod m) a\equiv b(\ mod\ m)
特別的,如果 aa 除以 mm 得餘數 rr ,則 aarrmm 同餘。餘數滿足 0r<m0\leq r<m ,故每個整數必與 [0,m1][0,m-1] 之間的一個數模 mm 同餘

具有相同模的同餘式滿足加法和乘法 :
a1b1( mod m),a2b2( mod m) a_1\equiv b_1(\ mod\ m),\quad a_2\equiv b_2(\ mod\ m)
則:
a1+a2b1+b2( mod m),a1a2b1b2( mod m) a_1+a_2\equiv b_1+b_2(\ mod\ m),\quad a_1a_2\equiv b_1b_2(\ mod\ m)

但是如果 acbc( mod m)ac\equiv bc(\ mod\ m) ,則 ab( mod m)a\equiv b(\ mod\ m) 未必成立。而且可能有 uv0( mod m)uv\equiv 0(\ mod\ m)u≢0( mod m),v≢0( mod m)u\not\equiv0(\ mod\ m),v\not\equiv0(\ mod\ m) .但是,如果 gcd(c,m)=1gcd(c,m)=1,則可以從acbc( mod m)ac\equiv bc(\ mod\ m) 兩端消去 cc

證明:若 gcd(c,m)=1gcd(c,m)=1 則 可以從acbc( mod m)ac\equiv bc(\ mod\ m) 兩端消去 cc

由於
m(acbc) m\mid(ac-bc)

mc(ab) m\mid c(a-b)

又因爲 gcd(c,m)=1gcd(c,m)=1 ,則根據線性方程定理:
mx+cy=1 mx+cy=1
必有整數解,方程兩邊同乘 (ab)(a-b)
m(ab)x+c(ab)y=(ab) m(a-b)x+c(a-b)y=(a-b)
有整數解。顯然 mm(abx),mc(ab)ym\mid m(a-bx),m\mid c(a-b)y ,則:
m(ab) m\mid (a-b)

根據同餘式的定義,有:
a=b( mod m) a=b(\ mod\ m)

同餘式方程、線性同餘式定理

現有方程:
axc( mod m) ax\equiv c(\ mod\ m)
應該如何求得其解呢?

該方程可以表示爲:
maxc m\mid ax-c
即存在 yy 使得 axc=myax-c=my,即:
axmy=c ax-my=c
這就將這一同餘式方程轉化爲線性方程了,則該同餘式方程有解的條件可以根據線性方程定理得出:

假設 g=gcd(a,m)g=gcd(a,m), 當 gcg\mid c 時,該方程有解。當方程有解時,使用歐幾里得算法可以求出 方程 au+mv=gau+mv=g 的一組解 u=u0,v=vou=u_0, v=v_o.由於此時 gcg\mid c ,方程兩邊同乘 c/gc/g 得:
acu0g+mcv0g=c a\frac{cu_0}g+m\frac{cv_0}g=c
即:x0cu0g( mod m)x_0\equiv\frac{cu_0}g(\ mod\ m) 是同餘式方程 axc( mod m)ax\equiv c(\ mod \ m) 的解。

這樣,就求出了同餘式方程的一個解,但是同餘式方程往往不止一個解。假設 x1x_1 是方程的另一個解,則 ax1ax0( mod m)ax_1\equiv ax_0(\ mod\ m) ,所以 mm 整除 ax1ax0ax_1-ax_0 則:
mga(x1x0)g \frac m g \mid \frac{a(x_1-x_0)}g
已知 gcd(m/g,a/g)=1gcd(m/g,a/g)=1 ,故 m/g(x1x0)m/g\mid(x_1-x_0) ,則存在整數 kk 使:
x1=x0+kmg x_1=x_0+k\frac m g
上式中由 mm 的倍數所得的任何兩個不同解被視爲相同解。則正好有 g 個不同解,在 k=0,0,,g1k=0,0,\dots,g-1 處取得。

將結果總結成定理,就得到了線性同餘式定理:

線性同餘式定理 :設 a,c,ma,c,m 是整數,m>1m>1 且設 g=gcd(a,m)g=gcd(a,m)

  1. 如果 gcg\nmid c 則同餘式 axc( mod m)ax\equiv c(\ mod\ m) 無解

  2. 如果 gcg\mid c 則同餘式 axc( mod m)ax\equiv c(\ mod\ m)gg 個不同解

要求方程的解,首先使用線性方程定理求 au+mv=gau+mv=g 的一個解 (u0,v0)(u_0,v_0)x0=cu0/gx_0=cu_0/gaxc( mod m)ax\equiv c(\ mod\ m) 的一個解。

不同餘的完全集由
xx0+kmg,k=0,1,,g1 x\equiv x_0+k\frac m g,\quad k=0,1,\dots,g-1
給出。

重要 :線性同餘式定理最重要的情形是 gcd(a,m)=1gcd(a,m)=1 此時同餘式方程只有一個解。我們將其寫成分數:
xca( mod m) x\equiv \frac c a(\ mod\ m)

線性同餘式定理的編程實現


def linear_equ(a, b):
    if a == 0 or b == 0:
        return -1
    else:
        g, w = a, b
        x, v = 1, 0

        while w != 0:
            t = g % w
            s = x - (g // w) * v
            x, g = v, w
            v, w = s, t

        y = (g - a * x) // b
        return g, x, y


def linear_congruence(a, c, m):
    g, u, v = linear_equ(a, m)
    print(g)
    if c % g == 0:
        x0 = [c * u // g]
        for k in range(g - 1):
            x0.append(x0[0] + k * m // g)
        return x0
    else:
        return -1


a = int(input())
c = int(input())
m = int(input())

print(linear_congruence(a, c, m))

參考文獻:A Brief Introduction to Number Theory --Joseph H.Silverman

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章