Home 유클리드 호제법
Post
Cancel
List of Contents

개념

유클리드 호제법은 2개의 자연수 또는 정식의 최대공약수를 구하는 알고리즘입니다.

호제법은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 의미합니다.

2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r’를 구하고, 다시 r을 r’로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수입니다.

예시

1506과 1059의 최대 공약수를 구하면

1506 % 1059 = 447
1059 % 447 = 165
447 % 165 = 117
165 % 117 = 48
117 % 48 = 21
48 % 21 = 6
21 % 6 = 3
6 % 3 = 0

고로 1506과 1059의 최대공약수는 3입니다.

소스코드

1
2
3
4
5
6
def gcd(a, b):
    while b > 0:
        before = a
        a = b
        b = before%b
    return a

위와 같이 코드를 짤 수 있습니다.

최소공배수 구하기

최소공배수는 최대공약수와는 반대로, 두 수의 공통된 배수 중 가장 작은 값을 의미합니다.

최소공배수는 최대공약수와 밀접한 관계가 있습니다. 정수 a, b의 최대공약수 G = gcd(a, b)에 대하여 아래의 식을 만족하는 정수 x와 y가 존재합니다.

a = Gx, b = Gy (단, x, y는 정수)

이 때 a * b = GGxy 인걸 알 수 있고, G는 두 수의 최대 공약수이며 x와 y는 서로소인 관계를 가집니다.

집합적으로 생각하면, a와 b의 합집합은 G, x, y이고 이 세 수를 곱한 Gxy가 최소공배수임을 알 수 있습니다.

  1. a * b = GGxy
  2. a * b / G = GGxy / G (양변에 최소 공약수를 나누어 줌)
  3. a * b / G = Gx*y(최소공배수)
  4. 최소공배수 = a * b / G

그러므로 두 수의 최소공배수 L = lcm(a, b)은 L= lcm(a, b)= a * b / gcd(a, b)이 성립합니다.

1
2
def lcm(a, b):
    return a * b / gcd(a, b)
This post is licensed under GNU AGPL by the author.