拓展歐幾里得演算法
阿新 • • 發佈:2018-12-21
我們從17x + 5y = 1方程出發—— 歐幾里得演算法拓展:人們發現形如A * x + B * y = gcd(A, B) = gcd(B, A%B) (歐幾里得演算法得知)的方程,都是一定有解的。 我們做以下方程變換(程式碼原理):
// ∵A = A % B * B + A % B 即拆解A // 拆解後的 A 代入方程 A * x + B * y = gcd(A, B) = gcd(B, A%B) (A / B * B + A % B) * x + B * y = gcd(B, A%B) B * (A / B * x + y) + (A % B)* x = gcd(B, A % B) // 其實就是上面一個方程左式把 B 提取出來 // 設 新x = A/B*x + y 新y = A % B // ∴x = 新y y = 新x - A/B*新y
下面是C++程式碼:
#include<iostream> using namespace std; int e_gcd(int A, int B, int *x, int *y); int main() { int A, B; cin >> A >> B; int x, y; int a = e_gcd(A, B, &x, &y); cout << a << endl; cout << x << " " << y << endl; system("pause"); } int e_gcd(int A, int B, int *x, int *y) { if (B==0) { // 即A * x = gcd(A) *x = 1; // 你可以理解為一個數A的最大公約數就是它本身A *y = 0; // 為了方便標記為0 return A; } int ans = e_gcd(B, A%B, x, y); int t = *x; // 暫存新x *x = *y; // 即 x = 新y *y = t - A/B * (*x); // 即 y = 新x - A/B*新y return ans; }