Với a, b thuộc N, 1 <= b < a ta có:
a. Tồn tai x, y thuộc Z sao cho a.x + b.y = gcd (a, b) Ước chung lớn nhất (Greatest common divisor).
b. (a, b) = 1 khi và chỉ khi tồn tại x, y thuộc Z: a.x + b.y = 1
Thuật toán Bezout
Input: a, b thuộc N, 0 <= b < a.
Output: d = gcd(a, b) và x, y thuộc Z: a.x + b.y = d.
1. Nếu b = 0 thì d = a, x = 1, y = 0;
2. Khởi tạo: x1 = 0; x2 = 1; y1 = 1, y2 = 0;
3. while( b >0)
{
i. q -= a/b; r = a – q.b; x = x2 – x1.q; y = y2 – y1.q;
i.i. a = b; b = r; x2 = x1; x1 = x; y2 = y1; y1 = y;
}
d = a;
x = x2;
y = y2;
return (d, x, y).
Cài đặt thuật toán
Tạo 1 struct để lưu kết quả trả về như sau:
struct bezout_t { int d; int x; int y; };
Đây là phần cài đặt thuật toán:
bezout_t Bezout(int a, int b) { bezout_t result; int x1 = 0, x2 = 1, y1 = 1, y2 = 0, x = 0, y = 0, r = 0, q = 0; if (b == 0) { result.d = a; result.x = 1; result.y = 0; } while (b > 0) { q = a / b; r = a - b * q; x = x2 - x1 * q; y = y2 - y1 * q; a = b; b = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } result.d = a; result.x = x2; result.y = y2; return result; }
hoặc
Source Code (sưu tầm): Bezout Code
0 nhận xét:
Đăng nhận xét