Processing math: 100%
본문 바로가기

Algorithm/D. Math & Number Theory

44. Euclidean Algorithm

유클리드 호제법(유클리드 알고리즘, Euclidean Algorithm)은 두 다항식의 최대공약다항식을 빠르게 구하는 알고리즘이다. 일반적으로 차수가 1 이상인 두 다항식의 최대공약다항식을 구하는 상황은 자주 발생하지 않으며 대부분 차수가 0인 두 다항식, 즉 두 정수의 최대공약수를 구하기 위해 유클리드 호제법을 이용하게 된다.

 

유클리드 호제법의 내용은 다음과 같다. gcd(a,b)ab의 최대공약다항식을 의미한다.

a, b가 다항식이고 ab로 나눈 나머지를 c라고 하면 gcd(a,b)=gcd(c,b)이다. (b0)

 

유클리드 호제법의 증명은 다음과 같다. 

더보기
  • a, bab0, a>0을 만족하는 정수라고 하면, b=0일 경우 gcd(a,b)=a이다. b>0일 경우 ab로 나눈 나머지를 c라고 하면 0c<b이고 a=bx+c로 나타낼 수 있다. 또한 gcd(a,b)=k라고 하면 a=pk, b=qk로 나타낼 수 있다. 이때 pq서로소(Coprime)이다. 두 수가 서로소라는 것은 두 수의 최대공약수가 1인 것과 동치이다. (k, p, q, x는 정수)
  • a=bx+c에서 ab를 각각 pk, qk로 치환하면 pk=qxk+c, (pqx)k=c이므로 ck의 배수이다. pqx=r이라고 하면 c=rk이다. gcd(c,b)=gcd(rk,qk)=k×gcd(r,q)이므로 gcd(r,q)=1임을 보여야 한다.
  • gcd(r,q)=k라고 하면, r=rk, q=qk이라고 할 수 있다. 이때 pk=qxk+rk=qkxk+rkk=kk(qx+r)이므로 p=k(qx+r)이다. pq가 모두 k의 배수이므로 pq가 서로소가 되려면 k=1이어야 한다. 따라서 gcd(r,q)=1이고, gcd(a,b)=gcd(c,b)이다.

ab1차 이상의 다항식인 경우에도 거의 같은 방법으로 증명이 가능하다.

 

유클리드 호제법으로 최대공약수를 구하는 함수의 구현은 다음과 같다.

int gcd(int x, int y)
{
    if(y == 0)return x;
    else return gcd(y, x % y);
}

C++의 경우 헤더파일 <bits/stl_algo.h>에 __gcd 함수가 정의되어 있으므로 이 함수를 사용하는 것도 좋다. <bits/stl_algo.h> 헤더파일 대신 <algorithm> 헤더파일을 인클루드해도 된다.

 

[연습문제]

 

BOJ 2609. 최대공약수와 최소공배수 (Silver V)

더보기

최대공약수는 유클리드 호제법을 이용하면 구할 수 있다. 다만 이 문제의 경우 입려값의 범위가 작아서 1부터 10000까지를 일일히 확인해도 된다. 두 수 a, b의 최소공배수는 a×b÷gcd(a,b)와 같다. 이 문제에는 해당사항이 없지만 어떤 문제들의 경우 최소공배수를 구하는 과정에서 a×b가 오버플로우를 발생시킬 가능성이 존재하기 때문에 a÷gcd(a,b)×b와 같이 나눗셈을 먼저 하고 곱셈을 나중에 하는 식으로 구현하는 것이 안전하다.

 

BOJ 1735. 분수 합 (Silver III)

더보기

두 분수를 통분해서 더한 뒤 약분한다. 약분 과정에서 유클리드 호제법으로 분모와 분자의 최대공약수를 찾는다.

 

→ solved.ac tag: euclidean

'Algorithm > D. Math & Number Theory' 카테고리의 다른 글

47. Probability  (0) 2021.05.16
46. Combinatorics  (0) 2021.05.15
45. Modular Operation  (0) 2021.05.12
43. Power by Divide and Conquer  (0) 2021.05.11
42. Math & Number Theory Intro  (0) 2021.05.10