유클리드 호제법

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

유클리드 호제법(- 互除法, Euclidean algorithm)은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 유클리드의 《원론》 제7권, 명제 1부터 3까지에 해당한다.

예시[편집]

1071과 1029의 최대공약수를 구하면,

  • 1071은 1029로 나누어 떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. => 42
  • 1029는 42로 나누어 떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. => 21
  • 42는 21로 나누어 떨어진다.

따라서, 최대공약수는 21이다.

78696과 19332의 최대공약수를 구하면,

    7869619332×4 + 1368
    19332 = 1368×14 + 180
     1368 = 180×7 + 108 
      180 = 108×1 + 72     
      108 = 72×1 + 36 
       72 = 36×2

정수에 대한 유클리드 호제법[편집]

본문에 있는 내용을 다시 한 번 상기해 보면, 다음 정리를 이용하여 유클리드 호제법이 성립하게 된다.

정리[편집]

a, b \in \mathbb{Z}이고, ab로 나눈 나머지가 r이라고 하자. (여기서 a\ge b이고, r0 \le r < b인 정수.)

ab의 최대공약수를 \left(a, b\right)라고 하면, 다음이 성립한다.

\left(a, b\right) = \left(b, r\right).

상기한 1071과 1029에 대한 예시를 위와 같은 표현으로 적어보면,

\left(1071, 1029\right) = \left(1029, 42\right) = \left(42, 21\right) = \left(21, 0\right)=21

처럼 쓸 수 있다.

증명[편집]

a, b \in \mathbb{Z}이고, a\ge b라고 하자.

그러면, a=bq+r을 만족하는 유일한 정수 q, r이 존재한다. 이때, 0 \le r < b이다.

\left(a, b\right) = d, a=d\alpha, b=d\beta라고 하자. 즉, \alpha\beta서로소이다.

a=bq+r.
\Rightarrow d\alpha =d\beta q+r.
\Rightarrow d|r.

이제, r=d\rho.라고 하자.

만약 \left(\beta, \rho\right) = d' > 1라면, \beta = d'\beta', \rho=d'\rho'으로 두었을 때,

a=bq+r.
\Rightarrow d\alpha = d\beta q+d\rho = d d'\beta' q + d d' \rho'= d d'\left(\beta' q + \rho'\right).
\Rightarrow \alpha = d'\left(\beta' q + \rho'\right).

이 되므로, d'|\alpha이다.

즉, d'|\alpha, d'|\beta가 되어 \alpha\beta는 서로소라는 것에 모순이다.

그러므로 \left(\beta, \rho\right) = 1이고, 그것은 곧 \left(b, r\right) = d라는 것이다.

다항식에 대한 유클리드 호제법[편집]

임의의 두 다항식에 대해서도 유클리드 호제법과 같은 원리를 사용하여, 두 다항식의 최대차수공약다항식을 구할 수 있다. 즉, 다음과 같은 정리가 성립한다.

정리[편집]

f, g \in \mathbb{C}[x]이고, fg로 나눈 나머지가 r(x)이라고 하자. (여기서 \operatorname{deg}f\ge \operatorname{deg}g이고, r0 \le \operatorname{deg}r < \operatorname{deg}g인 다항식, \operatorname{deg}ff의 차수를 뜻한다.)

ff의 최대차수공약다항식을 \left(f, g\right)라고 하면, 다음이 성립한다.

\left(f, g\right) = \left(g, r\right).

다항식의 경우의 예시[편집]

f(x)=x^3+2x^2+x, g(x)=x^2-1을 예로 들어 보자.

x^3+2x^2+x=(x^2-1)(x+2)+(2x+2).
x^2-1=(2x+2)\left(\frac{x-1}{2}\right).

위 식으로부터, \left(x^3+2x^2+x, x^2-1\right) = \left(x^2-1, 2x+2\right)=\left(2x+2, 0\right)=x+1이다.

(\mathbb{C}[x]에서, 상수는 가역원이므로, 공약다항식에 대해서 말할 때에는 곱해주어서 계수를 조절해줄 수 있다.)

증명[편집]

f\in\mathbb{C}[x],g \in \mathbb{C}[x]\setminus\{0\}이고, \operatorname{deg}f\ge \operatorname{deg}g라고 하자.

그러면, \mathbb{C}[x]유클리드 정역이므로, f=gq+r을 만족하는 유일한 다항식 q, r이 존재한다. 이때, r=0이거나 \operatorname{deg}r < \operatorname{deg}g이다.

\left(f, g\right) = d, f=df', g=dg'라고 하자. 즉, \operatorname{deg}(f',g')=0이다.

f=gq+r.
\Rightarrow df' =dg'q+r.
\Rightarrow d|r.

이제, r=dr'.라고 하자.

만약 \left(g', r'\right) = d'이 상수가 아니라면, g' = d'g'', r'=d'r''으로 두었을 때,

f=gq+r.
\Rightarrow df' = dg'q+dr' = d d'g'' q + d d' r''= d d'\left(g'' q + r''\right).
\Rightarrow f' = d'\left(g'' q + r''\right).

이 되므로, d'|f'이다.

즉, d'|f', d'|g'이 되어 \operatorname{deg}(f',g')=0이라는 것에 모순이다.

그러므로 \operatorname{deg}\left(g', r'\right) = 0이고, 그것은 곧 \left(g, r\right) = d라는 것이다.

알고리즘[편집]

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

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

소스 코드[편집]

 def gcd(m,n):
    while n != 0:    
       t = m%n
       (m,n) = (n,t)
    return abs(m)
 int gcd(int p, int q)
 {
	if (q == 0) return p;
	return gcd(q, p%q);
 }
 public static int gcd(int p, int q)
 {
	if (q == 0) return p;
	return gcd(q, p%q);
 }
let rec gcd m n =
  match n with
  | 0 -> m
  | _ -> gcd n (m % n)

호제법의 확장[편집]

정수 m, n 의 최대공약수(Greatest Common Divisor)를 gcd(m,n)와 나타낼 때, 확장된 유클리드 호제법을 이용하여, am + bn = gcd(m,n)의 해가 되는 정수 a, b 짝을 찾아낼 수 있다.(a, b 중 한개는 보통 음수가 된다.) 이 식은 베주의 정의 라고 한다. 위에서 든 예의 경우,

1071 = 1 * 1029 + 42 
1029 = 24 * 42 + 21 
42 = 2 * 21 

이므로

21 = 1029 - 24 * 42 = 1029 - 24 * (1071 - 1 * 1029) = -24 * 1071 + 25 * 1029 

가 된다.

특히, m, n이 서로소(gcd(m,n) = 1)인 경우 유용한데, 그럼 위의 식은 am + bn = 1이 되고, 여기서 a는 모듈로 연산의 곱의 역원(modular multiplicative inverse)이 되기 때문이다.

계산량[편집]

유클리드 호제법을 이용하여 나머지를 취하는 조작을, 최악의 경우라도 작은 수를 십진법으로 표시한 자리수의 5배를 반복하기 전에 최대공약수에 이른다(라메의 정리).

최대공약수를 구할 때, 소인수 분해를 하는 것이 더 쉽다고 생각하는 사람이 있을지도 모르지만, 위 정리는 소인수 분해를 이용하는 것보다도 유클리드 호제법을 실시하여 구하는 것이 훨씬 빠르다는 것을 말한다.

실제로 계산량 이론에서 최대공약수를 요구하는 것은 “쉬운 문제”로서 알려져 있고, 소인수 분해는 “어려운 문제”로 여겨지고 있다. 입력된 2개의 정수의 비트수를 n이라고 하면, 유클리드 알고리즘은 Θ(n) 회의 나눗셈으로 최대공약수를 구할 수 있다.

연분수[편집]

위에 든 예에서 나온 1071과 1029의 최대공약수를 구하는 과정은 다음과 같이 나타낼 수 있다.

\begin{matrix}1071 &=& 1029 \times 1 + 42\\ 
1029 &=& 42 \times 24 + 21\\ 
42 &=& 21 \times 2\end{matrix}

즉,

\begin{matrix}1071 / 1029 &=& 1 + 42 / 1029\\
1029 / 42 &=& 24 + 21 / 42\\
42 / 21 &=& 2\end{matrix}

따라서,

\frac{1071}{1029} = 1 + \frac{1}{24 + \frac{1}{2}}

이와 같이, n와 m(n>m)의 최대공약수를 구할 때의 유클리드 호제법의 나눗셈의 모양은 유리수 n/m 의 연분수 전개와 같다.

같이보기[편집]