유클리드 호제법
1. 개요
유클리드 호제법은 두 정수의 최대공약수를 효율적으로 계산하는 알고리즘이다. 기원전 300년경 유클리드의 저서에 처음 등장하며, 정수, 다항식, 실수 등 다양한 수학적 대상에 적용될 수 있다. 이 알고리즘은 최대공약수를 구하는 데 사용될 뿐 아니라, 베주의 항등식, 디오판토스 방정식, 유한체, 연분수, 정수 인수분해 등 다양한 분야에 응용된다. 유클리드 호제법은 계산 복잡도가 낮아 매우 효율적이며, 확장된 유클리드 호제법은 베주의 항등식의 해를 찾는 데 사용된다.
-
수론 알고리즘 -
고대 이집트 곱셈법
고대 이집트 곱셈법은 두 열을 사용하여 곱셈을 계산하는 방식으로, 첫 번째 수를 2의 거듭제곱으로 분해하고 두 번째 수에 2의 거듭제곱을 곱하는 방법을 사용했으며, 분배 법칙과 수학적 귀납법으로 정확성이 증명되어 현대 사회에도 응용된다. -
수론 알고리즘 -
이진 최대공약수 알고리즘
이진 최대공약수 알고리즘은 짝수/홀수 판별, 뺄셈, 비트 시프트 연산을 통해 최대공약수를 구하는 효율적인 알고리즘으로, 두 수가 짝수일 때 2를 공약수로 추출하고 한 수가 짝수일 때 2로 나누는 과정을 반복하며 C 언어, Rust 등 다양한 언어로 구현 가능하고 정수환으로 확장될 수 있다. -
에우클레이데스 -
유클리드 정역
유클리드 정역은 나눗셈 연산의 나머지에 대한 조건을 만족하는 유클리드 함수를 갖는 정역으로, 체, 정수환, 가우스 정수 환 등의 예시를 가지며 모든 유클리드 정역은 주 아이디얼 정역이지만 그 역은 성립하지 않고, 대수적 수체의 정수환이 유클리드 정역이 되는지 여부는 중요한 연구 대상이다. -
에우클레이데스 -
옥시링쿠스 파피루스 29번
옥시링쿠스 파피루스 29번은 《원론》 제2권의 다섯 번째 명제를 담고 있는 현존하는 가장 오래된 필사본 중 하나로, 고대 그리스 기하학 연구에 중요한 자료이다.
2. 역사
유클리드 호제법은 기원전 300년경 유클리드의 저서 《원론》에 처음 등장한다. 하지만, 이 알고리즘은 유클리드 이전에 이미 알려져 있었을 가능성이 크다. 인도와 중국에서도 유클리드 호제법과 유사한 알고리즘이 독립적으로 발견되었으며, 이는 주로 천문학 및 달력 계산에 활용되었다.
19세기에 들어서면서, 유클리드 호제법은 가우스 정수와 같은 새로운 수 체계의 개발에 영향을 주었으며, 대수학의 발전에도 기여하였다. 현대에는 정수 관계 알고리즘, RSA 암호화 알고리즘 등 다양한 분야에 응용되고 있다.
3. 작동 원리
유클리드 호제법은 주어진 두 수의 최대공약수를 구하는 알고리즘이다. 두 수 a와 b (a > b)의 최대공약수를 구하기 위해 다음과 같은 단계를 거친다.
* b가 0이면, a를 출력하고 알고리즘을 종료한다.
* a가 b로 나누어 떨어지면, b를 출력하고 알고리즘을 종료한다.
* 그렇지 않으면, a를 b로 나눈 나머지를 새로운 a에 대입하고, a와 b를 바꾸고 위의 과정을 반복한다.
이 과정은 나머지가 0이 될 때까지 반복되며, 마지막으로 나눈 수가 최대공약수가 된다.
예를 들어 1071과 1029의 최대공약수를 구하는 과정은 다음과 같다.
* 1071을 1029로 나눈 나머지는 42이다.
* 1029를 42로 나눈 나머지는 21이다.
* 42를 21로 나눈 나머지는 0이다.
따라서 최대공약수는 21이다.
이러한 과정은 "n, m에 대해서 나머지 연산을 실시할 수 있다"라는 조건에만 의존하므로, 정수환뿐 아니라 임의의 유클리드 정역에 대해서도 똑같은 과정을 거치면 공약인자를 구할 수 있다.
유클리드 호제법은 최대공약수를 구하는 대상인 두 정수를 폭과 높이로 설정한 직사각형 내에서 붉은색 사선의 직선을 그리는 과정으로도 표현할 수 있다. 붉은색 사선은 직사각형의 한쪽 구석에서 시작하여 45도 각도로 그려지며, 변에 닿으면 직각으로 반사된다. 직선이 반대편 변에 닿으면, 직전 반사 지점에서 수직으로 선을 그어 직사각형을 두 부분으로 나눈다. 이 과정을 반복하여 더 작은 직사각형을 만들고, 직선이 직사각형의 모서리에 닿으면 알고리즘이 종료된다. 이때 마지막 직사각형의 짧은 변의 길이가 최대공약수가 된다.
3.1. 정수의 경우
두 정수 a와 b의 최대공약수는 유클리드 호제법을 통해 다음과 같이 계산될 수 있다.
* 1071과 1029의 최대공약수를 구하는 과정은 다음과 같다.
1071을 1029로 나눈 나머지는 42이다.
1029를 42로 나눈 나머지는 21이다.
** 42를 21로 나눈 나머지는 0이다.
따라서, 최대공약수는 21이다.
* 78696과 19332의 최대공약수를 구하는 과정은 다음과 같다.
78696 = 19332×4 + 1368
19332 = 1368×14 + 180
1368 = 180×7 + 108
180 = 108×1 + 72
108 = 72×1 + 36
72 = 36×2 + 0
따라서, 최대공약수는 36이다.
유클리드 호제법의 정당성은 다음 정리를 통해 증명될 수 있다.
:이고, 를 로 나눈 나머지가 이라고 하자. (여기서 이고, 은 인 정수.)
:
* 1071과 1029에 대한 예시를 위와 같은 표현으로 적어보면,
:
과 같이 쓸 수 있다.
이고, 라고 하자.
그러면, 을 만족하는 유일한 정수 이 존재한다. 이때, 이다.
, , 라고 하자. 즉, 와 는 서로소이다.
:
:
:(즉, r은 d의 배수)
이제, 라고 하자.
여기서 β와 ρ가 서로소라면, b(= dβ)와 r(=dρ)의 최대 공약수도 d가 된다.
만약 (서로소가 아닌 수, 즉 다른 공약수를 가지는 수)이라면, , 으로 두었을 때,
:
:
:
이 되므로, 이다. (즉, α는 d'의 배수 )
즉, 가 되어 와 는 서로소라는 것에 모순이다.
이는 라는 가정에서 나타나는 모순이므로 (즉, β와 ρ는 서로소)이다.
따라서 이다.
쉽게 풀면 다음과 같다.
를 로 나눈 몫을 , 나머지를 이라고 할 때, 로 나타낼 수 있다. 와 의 최대 공약수를 라고 할 때, 이므로 도 로 나눌 수 있게 된다. 즉, 는 과 의 공약수가 된다. 따라서 , 라고 쓸 수 있다. 이때 , 은 서로소, 즉 공약수를 갖지 않는다. , 가 공약수 를 가지면 , 가 되어, , 라고 쓸 수 있다. 그러면, 가 된다. 이때 , 의 최대 공약수가 가 되어 가 최대공약수라는 것과 모순된다. 따라서 와 의 최대 공약수 는 과 의 최대 공약수이다.
3.2. 다항식의 경우
다항식에도 유클리드 호제법을 적용하여 최대차수공약다항식을 구할 수 있다. 두 다항식 ()에 대해, 를 로 나눈 나머지를 라 하면 () 다음이 성립한다.
:
여기서 는 와 의 최대차수공약다항식을 의미한다.
예를 들어 인 경우,
:
:
이므로, 이다.
이는 에서 상수가 가역원이므로, 공약다항식의 계수를 조절할 수 있기 때문이다.
다항식에 대한 유클리드 호제법의 정당성은 정수의 경우와 유사하게 증명할 수 있다. 이고, 라고 하자.
유클리드 정역의 성질에 의해, 을 만족하는 유일한 다항식 이 존재한다. (단, 이거나 )
라고 하면 (),
:
:
:.
라고 하고, 이 상수가 아니라고 가정하면, 으로 두었을 때,
:
:
:
이 되므로, 이다.
즉, 이 되어 이라는 것에 모순이다.
따라서 이고, 이는 임을 의미한다.
4. 확장된 유클리드 호제법
확장된 유클리드 호제법은 두 정수 m, n의 최대공약수(gcd(m,n))뿐만 아니라, mx + ny = gcd(m, n)을 만족하는 정수 x, y를 찾는 방법이다. 이 식은 베주의 정의라고 불린다.
특히, m, n이 서로소인 경우(gcd(m,n) = 1), 이 알고리즘은 mx + ny = 1을 만족하는 정수해 (x, y)를 제공하며, 여기서 x는 m의 모듈로 연산에서의 곱셈 역원이 된다. 즉, x는 m으로 나눈 나머지가 같은 수들의 집합에서 곱셈에 대한 역원 역할을 한다.
일반적으로, m = r0, n = r1에서 유클리드 호제법의 각 과정은 다음과 같이 반복될 수 있다.
:
:
:
:
:
행렬을 사용하면, 다음과 같이 표현할 수 있다.
:
라고 하면, 이므로 역행렬 이 존재하고,
:
을 고려하면,
:
이 된다.
:
이라고 놓고, 유클리드 호제법의 각 과정에서 얻어진 , , 등을 사용하여 우변을 계산하면, 좌변의 , 가 구해지며, 이는 베주 항등식 mx + ny = gcd(m,n)을 만족한다.
4.1. 정수의 경우
확장된 유클리드 호제법을 이용하면, 주어진 두 정수 m, n에 대해 am + bn = gcd(m, n)을 만족하는 정수 a, b를 구할 수 있다. 이 식은 베주의 정의라고 불린다. 특히, m, n이 서로소(gcd(m,n) = 1)인 경우, 이 식은 am + bn = 1이 되고, 여기서 a는 모듈로 연산의 곱의 역원이 된다.
예를 들어, 1071과 462의 최대공약수(GCD)를 구하는 과정은 다음과 같다.
* 1071 = 2 * 462 + 147
* 462 = 3 * 147 + 21
* 147 = 7 * 21 + 0
따라서 gcd(1071, 462) = 21이다. 이를 통해,
* 21 = 1029 - 24 * 42
* = 1029 - 24 * (1071 - 1 * 1029)
* = -24 * 1071 + 25 * 1029
이므로, a = -24, b = 25가 된다.
일반적으로, m = r0, n = r1에서 유클리드 호제법의 각 과정을 반복하면 다음과 같다.
* r0 = k0r1 + r2 ( 0 < r2 < r1)
* r1 = k1r2 + r3 ( 0 < r3 < r2)
* r2 = k2r3 + r4 ( 0 < r4 < r3)
* ...
* rh - 1 = kh - 1rh + 0
이 과정에서 행렬을 이용하여 표현하면 다음과 같다.
:
여기서 Ki = 라고 하면, |Ki| = -1 이므로 Ki-1이 존재하고,
:
Ki-1 = 을 고려하면,
:
이 된다.
이라고 놓고, 유클리드 호제법의 각 과정에서 얻어진 k0, k1, k2 등을 사용하여 우변을 계산하면, 좌변의 x, y가 구해지며, 이는 베주 항등식 mx + ny = gcd(m,n)을 만족한다.
4.2. 다항식의 경우
의 최대차수공약다항식을 라고 하면, 인 를 찾을 수 있다. 예를 들어,
일 때,
:
:
이므로
:
이다.
특히, 인 경우 인 를 찾을 수 있다.
5. 응용
유클리드 호제법의 다른 버전에서는 각 단계에서 음의 나머지의 크기가 일반적인 양의 나머지보다 작을 때 몫을 1 증가시킨다. 이전에는 다음 방정식이 있었다.
: rk−2 = qk rk−1 + rk
이는 rk−1 > rk > 0을 가정했다. 그러나 다음과 같은 대안적인 음의 나머지 ek를 계산할 수 있다.
: rk−2 = (qk + 1) rk−1 + ek (만약 rk−1 > 0 인 경우)
: rk−2 = (qk − 1) rk−1 + ek (만약 rk−1 < 0 인 경우)
만약 rk가 ek영어 < rk일 때 ek영어로 대체된다면, 다음을 만족하는 유클리드 호제법의 변형을 얻게 된다.
: rk영어 ≤ rk−1영어 / 2
레오폴트 크로네커는 이 버전이 유클리드 호제법의 어떤 버전보다도 가장 적은 단계를 필요로 함을 보였다. 더 일반적으로, 모든 입력 숫자 a와 b에 대해, 단계 수가 최소가 되는 것은 을 만족하도록 qk영어가 선택될 때이며, 여기서 는 황금비이다.
6. 계산 복잡도
유클리드 호제법은 매우 효율적인 알고리즘으로, 입력되는 두 수의 자릿수에 비례하는 시간 안에 최대공약수를 찾을 수 있다. 라메의 정리에 따르면, 유클리드 호제법을 이용하여 나머지를 취하는 조작을 최악의 경우라도 작은 수를 십진법으로 표시한 자리수의 5배를 반복하기 전에 최대공약수에 이른다. 일반적으로 유클리드 호제법은 소인수분해보다 훨씬 빠른 알고리즘으로 알려져 있다.
실제로, 계산 복잡성 이론에서는 최대공약수를 구하는 것은 "쉬운 문제"로 알려져 있으며, 소인수 분해는 "어려운 문제"라고 여겨진다. 입력된 두 정수 가운데 작은 정수 n의 자릿수를 d라고 하면, 유클리드 호제법에서는 O(d) 회의 나눗셈으로 최대공약수를 구할 수 있다. 자릿수 d는 O(log n)이므로, 유클리드 호제법에서는 O(log n) 회의 나눗셈으로 최대공약수를 구할 수 있다.
7. 다른 수 체계로의 확장
유클리드 호제법은 정수뿐만 아니라 다른 수 체계에도 적용할 수 있도록 일반화되었다. 예를 들어, 유리수 `n/m`의 연분수 전개는 유클리드 호제법의 나눗셈 모양과 같다.
1071과 462의 최대공약수를 구하는 예시를 통해 이를 확인할 수 있다. 유클리드 호제법을 적용하면 다음과 같은 과정을 거친다.
| 단계 | 방정식 | 몫 및 나머지 |
|---|---|---|
| 0 | 1071 = q0 × 462 + r0 | q0 = 2, r0 = 147 |
| 1 | 462 = q1 × 147 + r1 | q1 = 3, r1 = 21 |
| 2 | 147 = q2 × 21 + r2 | q2 = 7, r2 = 0 (알고리즘 종료) |
이 과정에서 마지막 나머지가 0이므로, 알고리즘은 21을 1071과 462의 최대공약수로 반환한다.
이처럼 유클리드 호제법은 타일링으로 시각화할 수 있다. a × b 직사각형을 정사각형 타일로 덮는 과정을 생각해보자. b × b 정사각형으로 시작하여, 남는 부분을 r0 × r0, r1 × r1, ... 정사각형으로 덮어 나간다. 잔여 직사각형이 없을 때, 즉 정사각형 타일이 이전 잔여 직사각형을 정확히 덮을 때 과정이 끝난다. 가장 작은 정사각형 타일의 변의 길이는 원래 직사각형의 최대공약수이다.
레오폴트 크로네커는 각 단계에서 음의 나머지의 크기가 양의 나머지보다 작으면 몫을 1 증가시키는 유클리드 호제법의 변형이 가장 적은 단계를 필요로 함을 보였다. 또한, 황금비를 이용하여 단계 수가 최소가 되는 조건을 찾을 수 있다.