최대공약수 알고리즘

huGgW·2024년 1월 28일

최대공약수

최대공약수는 두 정수의 공통된 약수 중 가장 큰 수를 의미한다.
최대공약수를 구하는 방법 중에서 유클리드 호제법을 이용하면 빠르게 구할 수 있다.

유클리드 호제법

유클리드 호제법이란, 2개의 자연수 a, b (a > b)에 대하여 a를 b로 나눈 나머지를 r이라고 하면, a와 b의 최대공약수와 b와 r의 최대공약수가 같다는 성질을 이용하여 두 자연수의 최대공약수를 구하는 알고리즘이다.

성질 증명

우선 위의 성질을 간단하게 증명해보면 아래와 같다.
a,bZa, b \in \mathbb{Z}이고,
ab\, a \le {b}라고 하자.
그러면, a=bq+r\, a = bq + r을 만족하는 유일한 정수 q,r\, q, r이 존재한다.
이 때 0r<b\, 0 \le r < b이다.
이 때 a\,ab\,b의 최대공약수를 d\,d라고 하면,
a=dα,b=dβ\, a = d \alpha, \, b = d \beta이고 α\, \alphaβ\,\beta는 서로소이다.
따라서,
a=bq+ra = bq + r
dα=dβq+r\Rightarrow d \alpha = d \beta q + r
따라서 r\,rd\,d의 배수가 되어야 한다.
이제 r=dρ\,r = d \rho라고 하자.
만약 β\, \betaρ\, \rho가 1이 아닌 최대공약수가 존재한다면,
이를 d\,d'라고 하면 β=dβ,ρ=dρ\, \beta = d' \beta' ,\, \rho = d' \rho' 라고 할 수 있다.
따라서,
$ d \alpha = d \beta q + d \rho$
dα=ddβq+ddρ\Rightarrow d \alpha = d d' \beta' q + d d' \rho'
dα=dd(βq+ρ)\Rightarrow d \alpha = d d' (\beta' q + \rho')
α=d(βq+ρ)\Rightarrow \alpha = d' (\beta' q + \rho')
즉, α\,\alphaβ\,\beta는 모두 d\, d'의 배수이므로 둘은 서로소가 아니게 되고, 이는 a,b\,a, b의 최대공약수가 d\,d라는 가정에 모순이다.
이로 인해 β\, \betaρ\, \rho는 서로소임을 알 수 있다.
즉, b\, br\, r의 최대공약수는 d\, d로, a\, ab\, b의 최대공약수인 d\, d와 같다.

알고리즘

위의 성질을 이용하여 두 자연수의 최대공약수를 둘 중 작은 수와 큰 수를 작은 수로 나눈 나머지의 최대공약수를 구하는 과정으로 치환하는 과정을 반복하면, 나머지는 결국 0으로 수렴할 것이므로 간단하게 최대공약수를 구할 수 있다.
이를 코드로 구현하면 아래와 같이 나타낼 수 있다.

int gcd(int a, int b) {
    int big = (a > b) ? a : b;
    int small = (a + b) - big;

    if (small == 0) {
        return big;
    }
    else {
        int r = big % small;
        return gcd(small, r);
    }
}

Reference

0개의 댓글