Toán & số học

2. Ước chung lớn nhất — thuật toán Euclid

UCLN của hai số là số lớn nhất chia hết cả hai. Thuật toán Euclid tìm nó cực nhanh dựa trên một quan sát: gcd⁡(a,b)=gcd⁡(b, a mod b)\gcd(a, b) = \gcd(b,\ a \bmod b). Ta thay cặp số bằng cặp nhỏ hơn cho đến khi số thứ hai bằng 0.

Thuật toán Euclid với UCLN(48, 18). Cặp số rút gọn dần: (48,18)→(18,12)→(12,6)→(6,0)(48,18) \to (18,12) \to (12,6) \to (6,0). Khi số thứ hai bằng 0, số thứ nhất chính là UCLN = 6.
euclid.cpp
int gcd(int a, int b) {
    while (b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return a;       // khi b = 0 thi a la UCLN
}

// boi chung nho nhat:
long long lcm(int a, int b) {
    return (long long)a / gcd(a, b) * b;   // chia truoc de tranh tran
}
Bội chung nhỏ nhất: lcm(a,b)=a⋅bgcd⁡(a,b)\text{lcm}(a,b) = \dfrac{a \cdot b}{\gcd(a,b)}. Chia cho gcd trước khi nhân để tránh tràn số.