[Algorithm] GCD / LCM / Euclidean Algorithm

1 minute read

python-version-3.7.1

GCD (최대공약수)

Greatest Common Divisor

두 개 이상의 수의 공통된 약수(공약수) 중 가장 큰 값

공약수가 1뿐인 경우,
해당 수들의 관계를 서로소(Coprime) 라고 한다.



두 수의 최대공약수를 구하는 방법

두 수를 각각 a, b 로 가정

해당 포스트에서는 두가지 방법으로 접근하였다.


# 1. 하나씩 전부 해보기

  • 반복문을 통해 2부터 제시된 두 수의 작은값 min(a, b)까지 나누기를 모두 시행

  • 만약 나누기를 시행한 수가 a, b 모두에서 나머지 0일 경우 해당 수를 변수 gcd 로 할당

  • 반복문을 모두 시행한 뒤에 최종적으로 변수 gcd 에 저장되어있는 값이 최대공약수


Python Implementation Code

def GCD(a, b):
    smaller = min(a, b)
    for i in range(1, smaller+1):
        if a % i == 0 and b % i == 0:
            result = i
    return result



# 2. 유클리드 호제법 (Euclidean Algorithm)

두 수 a, b (a > b) 가 있다.

a 나누기 b 의 나머지를 r1 라고 정의한다면
(a, b) 의 최대공약수는 (b, r1) 의 최대공약수와 동일하다.

b 나누기 r1 의 나머지를 r2 라고 정의한다면
(b, r1) 의 최대공약수는 (r1, r2) 의 최대공약수와 동일하다.

위의 방법을 반복하여 나머지 rn 이 0이 되었을 때
나누는 수가 최대공약수가 된다.


Example

유클리드 호제법으로 100과 24의 최대공약수 구하기

[100, 24]

100 나누기 24 의 나머지는 4 이다.

[24, 4]

24 나누기 4의 나머지는 0이다.
따라서 최대공약수는 4가 된다.


Python Implementation Code

def euclidean(a, b):
    num, div = max(a, b), min(a, b)
    while num % div:
        num, div = div, num % div
    return div



LCM (최소공배수)

Least Common Multiple

두 개 이상의 수의 공통된 배수 중 가장 작은 값



두 수의 최소공배수를 구하는 방법

두 수를 각각 a, b 로 가정

LCM = a x b / GCD(a, b)

위와 같은 식이 성립한다.



Python Implementation Code

def GCD(a, b):  # Euclidean
    num, div = max(a, b), min(a, b)
    while num % div:
        num, div = div, num % div
    return div
    

def LCM(a, b):
    return a * b / GCD(a, b)

Leave a comment