擴(kuò)展歐幾里德算法

擴(kuò)展歐幾里德算法用來在已知ab的情況下,求等式a\cdot x+b\cdot y=gcd(a, b)的一組可行解,該算法思路如下:

  1. b=0,則有gcd(a, b)=gcd(a, 0)=a,\{x=1, y=0\}是一組可行解
  2. b\neq 0,則設(shè)a=k\cdot b+r(0\le r<b),遞歸求等式b\cdot x+r\cdot y=gcd(b, r)的一組可行解。設(shè)求得的可行解為\{x=x', y=y'\},則有b\cdot x'+r\cdot y'=gcd(b, r)。又b\cdot x'+r\cdot y'=b\cdot x'+(a-k\cdot b)y'=a\cdot y'+b(x'-k\cdot y'),且gcd(b, r)=gcd(a, b),故有a\cdot y'+b(x'-k\cdot y')=gcd(a, b)。則,\{x=y', y=x'-k\cdot y'\}為原等式的一組可行解。

擴(kuò)展歐幾里德算法的實(shí)現(xiàn)代碼如下:

int ex_gcd(int a, int b, int & x, int & y){
    // ax + by = gcd(a,b) = r
    if(!b){
        x = 1; y = 0;
        return a;
    }
    int r = ex_gcd(b, a%b, x, y);
    int t = x; x = y; y = t-a/b*y;
    return r;
}

附上一道練習(xí)題:洛谷P1082 同余方程。

解題思路:求關(guān)于x的同余方程ax\equiv 1(mod\ b)的解,即相當(dāng)于求a\cdot x+b\cdot y=1的解,又ab必定互質(zhì),故相當(dāng)于求a\cdot x+b\cdot y=gcd(a, b)的解,可以使用擴(kuò)展歐幾里德算法。

AC代碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int ex_gcd(int a, int b, int & x, int & y){
    // ax + by = gcd(a,b) = r
    if(!b){
        x = 1; y = 0;
        return a;
    }
    int r = ex_gcd(b, a%b, x, y);
    int t = x; x = y; y = t-a/b*y;
    return r;
}
int main(){
    int a, b, x, y;
    cin >> a >> b;
    ex_gcd(a, b, x, y);
    cout << (x%b+b)%b << endl;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容