Euclidean Algorithm

개요

유클리드 호제법은 두 정수의 최대공약수를 빠르게 구하는 방법입니다.

두 정수 의 최대공약수를 라 합시다. 인 경우 입니다.

로 나눈 나머지를 이라 할 때, 이 성립합니다.

따라서 같은 방법으로 로 나눈 나머지를 이라 하면 이므로 나머지가 이 될 때 까지 계속 나머지를 취하는 방법으로 를 구할 수 있습니다.

def gcd(a: int, b: int) -> int:
    while b > 0:
        a, b = b, a % b
 
    return a

시간 복잡도는 입니다.

증명

알고리즘

라 하고 이라 합시다.

, , 으로 쓸 수 있습니다.

로 나눈 몫을 라 하면 입니다. 따라서 이므로 의 약수이고 의 공약수가 됩니다.

가 최대공약수이므로 으로 둡시다. (은 자연수)

이므로 의 약수이고 의 공약수가 됩니다.

이 최대공약수이므로 로 둡시다. (는 자연수)

를 대입하면 입니다. 이를 만족하는 자연수 , , 인 경우만 존재합니다. 따라서 입니다.

시간 복잡도

라 합시다.

나머지의 정의에 의해 입니다. 따라서 이고 이므로 입니다.

유클리드 호제법을 한번 더 적용해서 로 나눈 나머지를 이라 하면 임을 알 수 있습니다.

많아야 두 번 호제법을 사용하면 두 번째 인자가 절반으로 줄어드므로 시간 복잡도는 입니다.

최소공배수

최대공약수를 알면 최소공배수도 알 수 있습니다. 이기 때문입니다.

증명 1

로 나타낼 수 있습니다. 를 소인수 분해 했을 때 의 지수입니다.

같은 방식으로 입니다.

그렇다면 입니다.

같은 방식으로 입니다.

이때 임을 알 수 있습니다.

이는 와 같습니다.

증명 2

이라 합시다.

적당한 서로소인 정수 에 대해 입니다.

여기에 를 대입하면 입니다.

양변에 를 나누면 입니다.

는 각각 서로소이므로 입니다.

따라서

문제