20:58
0
Định lý Bezout

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