Thuật toán Euclid

Thuật toán Euclid tính

gcd(a,b):
gcd(a,b)={anếu b=0gcd(b,amodb)nếu b0

int gcd(int a, int b) {
    if(b == 0)
        return a;
    return gcd(b, a % b);
}

Thuật toán Euclid mở rộng

Thuật toán Euclid mở rộng ngoài tính gcd của 2 số ra còn tính được 2 hệ số

x
y
sao cho:
ax+by=gcd(a,b)

Thuật toán

Gọi

gcd(a,b)
g
.

Trong thuật toán Euclid, khi gặp trường hợp

b=0, vậy khi đó
a=g
b=0ax+by=ggx+0y=gx=1,y=0

Vậy
x=1,y=0
trong base case.

Ta có

gcd(a,b)=gcd(b,amodb)=g.
Giả sử ta đã tìm được
x1
y1
là cặp
x,y
đối với
gcd(b,amodb)
.
Nói cách khác, đã tìm được
x1,y1
sao cho
bx1+(amodb)y1=g

Đầu tiên, ta viết lại

amodb thành
aabb
:
bx1+(aabb)y1=g

Tách ra:
bx1+ay1abby1=g

Lấy
b
làm nhân tử chung:
ay1+b(x1aby1)=g

Vậy ta đã tìm được cặp hệ số
x,y
đối với
a,b
:
{x=y1y=x1aby1

int extended_euclidean(int a, int b, int& x, int& y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int x1, y1;
    int g = extended_euclidean(b, a % b, x1, y1);
    x = y1;
    y = x1 - (a / b) * y1;
    return g;
}