歐幾里得定理專題


一、歐幾里得定理

1. 同余定理

\((a+b)\ \%\ mod=(a\ \%\ mod+b\ \%\ mod)\ \%\ mod\)

\((a-b)\ \%\ mod=(a\ \%\ mod-b\ \%\ mod)\ \%\ mod\)

\((a*b)\ \%\ mod=(a\ \%\ mod*b\ \%\ mod)\ \%\ mod\)

注意:除法沒有同余的性質,需要求逆元。

2. 歐幾里得定理

\(gcd(a,b)=gcd(b,a\%b)\)

3. 歐幾里得定理用法

(1) 求最大公約數

    //最大公約數,輾轉相除法
  int gcd(int a, int b) {
      if (b == 0) return a;
      return gcd(b, a % b);
  }

(2) 求最小公倍數

  //最小公倍數
  int lcm(int a, int b) {
      return a * b / gcd(a, b);
  }

二、擴展歐幾里得定理

1. 定義

\(ax+by=gcd(a,b)\),在已知\(a,b\)的情況下求解出一組\(x_0,y_0\)(特解)。

2. 推導過程

\(ax+by=gcd(a,b)\) \(①\)

根據歐幾里得定理,有:
\(gcd(a,b)=gcd(b,a\%b)\) \(②\)

\(b\)代替\(a\)的位置,用\(a\%b\)代替\(b\)的位置,得到:

\(bx_1+(a\%b)y_1=gcd(a,b)\) \(③\)

因為\(a\%b=a-\lfloor \frac{a}{b} \rfloor * b\) ,代入方程\(③\),得到:

\(bx_1+(a-a/b *b)y_1=gcd(a,b)\)

變形

\(ay_1+b(x_1-a/b)y_1=gcd(a,b)\) \(④\)

與方程\(①\)對比系數,得到

\(x=y_1,y=x_1-a/b*y_1\)

這就是擴展歐幾里得算法中關鍵代碼的由來。

int exgcd(int a, int b, int &x, int &y) {//返回gcd(a,b) 並求出解(引用帶回)
    if (b == 0) {
      x = 1, y = 0;
      return a;
    }
    int x1, y1, gcd;
    gcd = exgcd(b, a % b, x1, y1);
    x = y1, y = x1 - a / b * y1;
    return gcd;
}

簡化一下:

//yxc寫法
int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

3.性質

  1. 若通過擴展歐幾里得求出一組特解(\(x_0\),\(y_0\)),那么有\(ax_0+by_0=d\)
    則方程的通解為: 其中\(k\)為任意整數,\(d=gcd(a,b)\)

    \(x=x_0+k*(b/d)\)

    \(y=y_0-k*(a/d)\)

  2. 已知\(ax+by=d\)的解,對於\(ax+by=c\)的解,\(c\)為任意正整數,只有當\(d|c\)時才有解,
    則方程的通解為: 其中\(k\)為任意整數,\(d=gcd(a,b)\)

    \(x=(c/d)x_0+k(b/d)\)

    \(y=(c/d)y_0-k(a/d)\)

4.常見用法

(1)求形如\(ax+by=c\)的通解,或從中選取某些特解。
(2)求乘法逆元
(3)求解線性同余方程(組)

5.解題思路

  1. 先將問題轉化成不定方程\(ax+by=c\)

  2. \(a,b\)參數取正數,判斷\(a,b\)是否為負數,為負數就\(a,b,c\)都乘上\(-1\),另外注意若\(a,b\)中只有一個是負數,那另一個不需要乘\(-1\),因為\(a,b\)本身是含未知數參數的。

  3. \(d=exgcd(a,b,x_0,y_0)\),然后判斷是否有解采用\(if(c\%d==0)\)

  4. 求特解:\(x_1=x_0*c/d\), \(y_1=y_0*c/d\);

  5. 求通解:\(x=x_1 + b/d*t\) , \(y=y_1-a/d*t\) (其中 \(t\) 為整數)

  6. 求最小解:\(int\ s=b/d\); \(x_{min}= (x_1\%s+s)\%s\);

6.例題實例

問題描述:對於 \(ax+by=c\) 的不定方程求通解或特解?

\(d=gcd(a,b)\)

\(c\%d!=0\) 此方程無整數解

\(c\%d==0\)

特解:

\(x_1=x_0*c/d\) , \(y_1=y_0*c/d\)

通解:
\(x=x_1+b/d*t\) , \(y=y_1-a/d*t\) (其中 \(t\) 為整數)

最小解:

\(d=exgcd(a,b,x_0,y_0);\)

\(x_1=x_0*c/d;\)

\(int\ s=b/d;\)

\(x_{min}= (x_1\%s+s)\%s;\)

https://www.cnblogs.com/yaochen/p/10894280.html?share_token=23191250-107c-4b7f-a6c4-f4139ee37033


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM