[알고리즘] 최대공약수(GCD) 구하기-유클리드 호제법(Euclidean-algorithm)

수영·2022년 8월 4일
0

알고리즘

목록 보기
6/14
post-thumbnail
post-custom-banner

🧐유클리드 호제법이란?

유클리드 호제법어떤 두 수의 최대공약수를 구하는 알고리즘 중 가장 유명한 알고리즘 중 하나입니다.

유클리드기원전 300년경에 발견한 가장 오래된 알고리즘이며, 두 수가 서로 상대방의 수를 나누어서 원하는 수를 결과로 얻게 되는 방법호제법을 사용합니다.

유클리드 호제법은 아래와 같은 성질에 따라 최대공약수를 구합니다.

어떤 두 수 M,NM, N이 있을 때(M>NM>N), MMNN의 최대공약수는 M  mod  NM\;mod\;NNN의 최대공약수와 동일하다.


🧮유클리드 호제법으로 최대공약수 구하기

위에서 말한 유클리드 호제법의 성질에 따라 최대공약수를 구해봅시다!

1071과 1029의 최대공약수는 무엇일까?🤔

  • 10711029의 최대공약수1071 modmod 1029 = 421029의 최대공약수와 동일한 값을 가집니다.

  • 102942의 최대공약수1029 modmod 42 = 2142의 최대공약수와 동일한 값을 가집니다.

  • 42는 21로 나누어 떨어지기 때문에, 21과 42의 최대공약수21입니다.

  • 결론적으로 1071과 1029의 최대공약수 역시 21이라고 할 수 있습니다.

1071 modmod 1029 = 42
1029 modmod 42 = 21
42 modmod 21 = 0

간단히 말해, 유클리드 호제법으로 최대공약수를 구하려면 두 수중 큰 수를 작은 수로 나머지 연산을 하는 modmod 연산을 반복하면 된다!!


👩‍🏫유클리드 호제법의 원리

그래서, 어떻게 저런 성질이 성립하는데?!🤷‍♀️

위의 그림을 보면 조금 쉽게 이해할 수 있습니다.
임의의 수 MMNN을 계속해서 modmod 연산하는 과정을 나타낸 그림입니다.

MMNN을 막대로 표현하고, 막대의 한 칸을 MMNN의 최대공약수인 GG로 하여 막대를 나누어 표현해보았습니다.

과정을 잘 살펴보면, 나머지들도 계속해서 GG를 최대공약수로 가짐을 알 수 있습니다.


계산식으로도 유클리드 호제법을 이해할 수 있습니다.
  1. 어떤 수 MMNN으로 나눈다면 아래와 같이 표현할 수 있다.

    M=NQ+RM = NQ + R

  2. MMNN의 최대공약수를 GG라고 한다면, M=mGM = mG, N=nGN=nG로 표현할 수 있다.
    해당 식을 사용하여 나머지인 RR을 표현한다면 아래와 같다.

    mG=nGQ+RmG = nG Q + R
    R=mGnGQ=G(mnQ)R = mG - nGQ = G(m-nQ)

  3. 나머지 RR 역시 최대공약수인 GG를 가지고 있으니, MMNN의 최대공약수는 NNRR의 최대공약수와 같다고 할 수 있다.


💻유클리드 호제법 구현(python)

반복문으로 구현

import sys
M, N = map(int, sys.stdin.readline().split())

while(N): # 나머지가 0이 될 때까지 반복
    r = M % N 
    M = N
    N = r
print(M)

재귀법으로 구현

import sys
M, N = map(int, sys.stdin.readline().split())

def Euclidean(M, N):
    return Euclidean(N, M % N) if N else M

print(Euclidean(M, N))

Reference

위키백과 - 유클리드 호제법

유클리드 호제법(Euclidean-algorithm)

[코딩 팁] 최대공약수 : 유클리드 호제법 원리

썸네일 출처 - GIPHY

profile
하고 싶은 건 그냥 죽도록 합니다
post-custom-banner

0개의 댓글