1. 程式人生 > >簡單數論總結2——同余方程與擴展歐幾裏得算法

簡單數論總結2——同余方程與擴展歐幾裏得算法

turn cor 不一定 bsp 線性 得出 算法 nbsp 擴展歐幾裏得算法

在上一次總結過後鴿了沒多久其實是快要開學趕緊來肝上兩篇

今日內容——同余方程和擴展歐幾裏得算法

同余

同余的定義:若存在兩個整數a,b,使得(a - b) MOD P為0,則稱作a與b在MOD P的情況下同余

換種通俗的說法,就是,a MOD P與b MOD P相等

記作 \( a\equiv b (mod P) \)

對於整數a,b,c和自然數m,n

同余具有以下性質:

  1. 自反性:\( a\equiv a (mod P) \)
  2. 對稱性:若存在\( a\equiv b (mod P) \) ,則 \( b\equiv a (mod P) \)
  3. 傳遞性:若存在\( a\equiv b (mod P) \) ,\( b\equiv c (mod P) \), 則 \( a\equiv b (mod P) \)
  4. 同加性:若\( a\equiv b (mod P) \),則 \( (a+c)\equiv (b+c) (mod P) \)
  5. 同乘性1:若\( a\equiv b (mod P) \),則 \( (a*c)\equiv (b*c) (mod P) \)
  6. 同乘性2:若\( a\equiv b (mod P) \) , \( c\equiv d (mod P) \),則 \( (a*c)\equiv (b*d) (mod P) \)
  7. 同冪性:若\( a\equiv b (mod P) \),則 \( (a^c)\equiv (b^c) (mod P) \)

  由此,我們可以得到兩條推論

  1.   \( (a*b)mod k = (a mod k)*(b mod k) mod k \)
  2. 若\( a mod p = x ,a mod q = x,p、q互質,則a mod p*q =x \)

  但是,相信像我一樣睿智的你也發現了一個問題,沒錯,同余不滿足同除性,即不滿足若\( a\equiv b (mod P) \),則 \( (a/c)\equiv (b/c) (mod P) \)

  那麽除法取模要如何解決呢,禿頂聰明絕頂的數學家也發現了這個問題,利用逆元的知識,我們就可以解決這個問題啦!

  但是逆元,我決定下次再講,其實就是鴿了(咕咕咕)

擴展歐幾裏得算法

  歐幾裏得算法相信大家都已經知道了QwQ

  就是求gcd的輾轉相除法

  不知道的可以去看我的上一篇文章(理直氣壯的騙訪問量QwQ)

  那麽擴展歐幾裏得算法是啥?(黑人問號.jpg)

  擴展歐幾裏得算法就是利用了歐幾裏得算法中叠代的過程,使其能夠求出形如\( ax + by = gcd(a , b) \) 的方程的應用

  我們可以簡單的證明和感性理解一下擴展歐幾裏得算法的正確性:

  

  首先,當歐幾裏得算法停止叠代時

  有此情況 \( a=1,b=0,此時,gcd(a,b)=x,ax+by = gcd(a,b)顯然成立 \)

  在叠代的過程中

  有 \( b{x}‘ + (a mod b) {y}‘ = gcd(b, a%b) \)與 \( ax + by = gcd(a, b) \)

  則由上一層推出

  \( x= {y}‘ \),\( y={x}‘-a/b*{y}‘ \)

  於是可推至初始情況,得出解

  

  下面給出代碼的實現

int exgcd (int a, int b, int &x, int &y){
    if(b == 0){
        x = 1;
        y = 0;
        return a;
    }
    int ans = exgcd ( b , a % b , x ,y );
    int t = x;
    x = y;
    y= t - a / b * y;
    return ans;
}

  就是這樣喵

對擴展歐幾裏得定理的應用

  利用擴展歐幾裏得定理,我們能夠求解形如\( ax+by = c \)的問題

  當 \(c \mid gcd(a,b) \)時,有\( ax+by = c \)的不定方程有整數解

  所以,把原式變形為 \( ax+by = d (d = gcd(a,b) ) \)的形式,利用擴展歐幾裏得定理可解出方程的一組解\( (x,y) \),再將其乘以 \( \frac{c} {gcd(a,b)} \)

  就能解出原方程的解啦!(快誇我.jpg)

對擴展歐幾裏得定理求出解的處理

  由於形如 \( ax+by = c \) 的線性不定方程有無窮多解,擴展歐幾裏得定理進行求解的過程中,不一定保證求出的是最小正整數解,為得到最小正整數解,我們有如下的方式

  易推出,對於線性不定方程 \( ax+by = c \),有一組解\(x,y\) 與另一組解 \( a*(x + \frac {a*t} {gcd(a,b)}) ,b*(y- \frac {b*t} {gcd(a,b)} | (t\in \mathbb{Z})) \)都為原方程的解

  則可得出方法:對於線性不定方程 \(ax+by = c \) ,其最小正整數解為( \( x= ( (x\%t)+t)\%t) ,(t=b/gcd(a,b))\),\( y=(((y\%t)+t)\%t) ,(t=a/gcd(a,b)) \) )

  至此,問題得到了解決

簡單數論總結2——同余方程與擴展歐幾裏得算法