1. 程式人生 > >拓展歐幾里得演算法

拓展歐幾里得演算法

我們從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;
}