알고리즘 공부/수학

수학 - 최대공약수와 최소공배수(유클리드 호제법)

CastleMouse 2021. 12. 28. 20:15

최대공약수와 최소공배수는 유클리드 호제법으로 빠르게 구할 수 있다.

 

1) 최대공약수(GCD, Greatest Common Divisor)

위키피디아에서 가져온 유클리드 호제법은 다음과 같다.

 

2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.

 

이를 이용하여 최대공약수는 다음과 같이 구할 수 있다.

 

int gcd(int a, int b) {
    if (a < b) swap(a, b);
    int r = b;
    while (r > 0) {
        b = r;
        r = a % b;
        a = b;
    }
    return b;
}

 

2) 최소공배수(LCM, Least Common Multiple)

수학적으로 a * b = gcd(a, b) * lcm(a, b)이다. 이 성질을 이용한다.

 

int lcm(int a, int b) {

    return a * b / gcd(a, b);

}