int gcd(int a, int b) {
if (b == 0)
return a;
elsereturn 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>usingnamespacestd;
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);