recursion / knowledge

유클리드 호제법과 여러 수의 최소공배수

paul 2024.08.18 202words (1m)

재귀를 쓰기 시작하면서 남긴 메모가 하나 있다.

재귀는 똑같은 것을 반복하는 것이 아니다. 기본적인 로직만 같을 뿐.

호제법이 그 예다. 같은 함수를 부르지만 인자가 매번 작아진다.

python
def do(a, b):
    if b == 0:
        return a
    return do(b, a % b)

gcd(a, b)gcd(b, a % b) 의 답이 같다는 게 전부다. a % b 는 반드시 b 보다 작으므로 두 번째 인자가 계속 줄고, 결국 0이 된다. 그때의 첫 번째 인자가 답이다.

최소공배수는 여기서 바로 나온다.

python
gcd = do(a, b)
lcm = a * b // gcd

세 개 이상일 때

수가 여러 개면 앞에서부터 둘씩 접어 나간다.

python
def do(a, b):
    if b == 0:
        return a
    return do(b, a % b)

data = [2, 16, 34, 96, 124]
lcm = data[0]
for i in range(len(data) - 1):
    lcm = lcm * data[i + 1] // do(lcm, data[i + 1])

print(f'lcm:{lcm}')

지금까지의 lcm과 다음 수의 lcm을 다시 구하는 걸 반복한다. lcm(a, b, c) = lcm(lcm(a, b), c) 라서 성립한다.

곱하고 나서 나누는 순서로 쓰면 중간값이 커진다. lcm // gcd * next 로 먼저 나누면 그걸 줄일 수 있는데 파이썬은 정수 크기 제한이 없어서 여기서는 그냥 뒀다.