본문 바로가기
Study/알고리즘

유클리드 호제법

by 꼬부기가우는소리 2023. 6. 19.
728x90

 

유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다.

 

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

 

  1. 입력으로 두 수 m,n(m>n)이 들어온다.
  2. n이 0이라면, m을 출력하고 알고리즘을 종료한다.
  3. m이 n으로 나누어 떨어지면, n을 출력하고 알고리즘을 종료한다.
  4. 그렇지 않으면, m을 n으로 나눈 나머지를 새롭게 m에 대입하고, m과 n을 바꾸고 3번으로 돌아온다.

 

위 과정은 “n, m에 대해서 나머지 연산을 실시할 수 있다”라는 조건에만 의존하므로, 정수환뿐 아니라, 임의의 유클리드 정역에 대해도 똑같은 과정을 거치면 공약인자가 구해진다.

 

C++ 언어로는 아래와 같이 두 가지 방법으로 구현해줄 수 있다.

 

1) 재귀 함수 호출을 통한 구현

int gcd(int a, int b)
{
    return b ? gcd(b, a%b) : a;
}

 

2) while 문을 통한 구현

int gcd(int a, int b)
{
    int c;
    while(b)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

 

[출처] 위키백과 - 유클리드 호제법

 

* 관련 문제:

- [백준] 1934번: 최소공배수

- [백준] 13241번: 최소공배수

- [백준] 1735번: 분수 합

'Study > 알고리즘' 카테고리의 다른 글

제곱수  (0) 2023.06.24
기약분수  (0) 2023.06.20
중앙값  (0) 2023.06.07
정렬  (0) 2023.06.06

댓글