擴展歐幾里德算法

  • 遇見這道題,對求最大公約數又有了新的認識

歐幾里得問題

int gcd(int a, int b) {
    if (b == 0) 
        return a;
    else 
        return gcd(b, a%b);
}

擴展歐幾里得問題

這裏寫圖片描述

  • 對於ax + by = c; 在 c % gcd(a,b) = 0的時候,我們一般先求 a/gcd(a,b) x + b/gcd(a,b) y = 1的解,然後在擴大c倍,就是原問題的解。當然c % gcd(a,b) != 0 的時候,原問題無解。
  • 根據下面參考文獻中的原理,我們可以得到下面的程序:
#include<iostream>
using namespace std;
void gcd(int a, int b, int &d, int &x, int &y) {
    if (!b) {
        d = a;
        x = 1;
        y = 0;
    }else {
        gcd(b, a%b, d, y, x);
        y -= x*(a/b);   //***
    }
}
int main() {
    int a, b, d, x, y;
    a = 6;
    b = 15; 
    gcd(a, b, d, x ,y);
    cout << x << " " << y << " " << d;
}
  • 對於程序中加*號的地方,我的理解:
    • 由參考文獻可知,x1 = y2; y1 = x2 - a/b * y2; 因爲經過了一步,gcd(b, a%b, d, y, x); 所以 此時的 y = x2; x = y2; 所以根據將 y1 公式翻過去就是 y = y - x *(a/b);

參考

發佈了76 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章