임의의 자연수는 소인수분해가 유일하고, 크기순서가 잘 주어져 있기 때문에, 다음과 같은 greatest common divisor를 정의할 수 있습니다.
(Definition)For two positive integer , the greatest common divisor
is the largest positive number that divides
without remainder.
짧게는 로 씁니다. 다르게는 정수
에 대하여
의 음아닌 최솟값으로 정의할 수도 있지요. 수학을 전공하지 않은 분들도 이를 계산하는 다음 유클리드 알고리즘은 한 번씩 교과서에서 보셨을 것 같습니다.
[Algorithm]
input :
output :
- If
, return
.
- If
, return
.
- Otherwise return
.
이 알고리즘은 시간이 얼마나 걸릴까요? 가 n bit size정도 되는 경우
정도의 시간복잡도를 가짐을 증명할 수 있습니다.
의 계산방법은 유클리도 알고리즘이 가장 쉽고 좋은 방법일까요? 그렇다면 이런 글을 쓸 필요도 없고, 질문을 할 필요도 없었겠지요. 유클리드 알고리즘은 3번 과정에서
의 연산을 필요로 하고, 이 연산 때문에 시간복잡도에 곱하기 항이 생기게 됩니다. 우리가 더하기나 빼기는 좀 잘하는데, 곱하기, 나누기는 글쎄요… 이를 피하기 위한 다음과 같은 알고리즘도 있습니다.
[Algorithm]
input :
output :
- If
, return
.
- If
, return
.
- If
and
are both even, retrun
.
- If
is even and
is odd, return
.
- If
is odd and
is even, return
.
- Otherwise return
.
Binary-gcd는 유클리드 알고리즘과 달리 나누기 연산을 피해갔습니다. Asymptotic time complexity는 같습니다만, 실제 알고리즘은 조금 더 빨리 작동합니다. 그렇다면 이게 최적의 알고리즘일까요? 물론 아닙니다!
