반응형
유클리드 호제법은 두 정수의 최대 공약수(GCD)를 구하는 효율적인 알고리즘이다.
기본 아이디어
최대 공약수
두 수 a와 b가 주어졌을때, a를 b로 나눈 나머지를 r이라고 정의 ( a와 b의 공약수는 b와 r의 공약수와 동일하기 때문 )
a와 b의 최대 공약수는 b와 r의 최대 공약수와 같다 ( a와 b의 최대 공약수 == b와 r의 최대 공약수 )
즉, gcd(a, b) == gcd(b, r)이라는 식이 만들어진다.
b = 0이 되면 최대 공약수가 된다.
예를 들어, a = 48 과 b = 18이라고 생각해보자.
gcd(48, 18) = gcd(18, 12)
gcd(18, 12) = gcd(12, 6)
gcd(12 , 6) = gcd(6, 0)
gcd(6, 0) = 6 (b가 0이 되었으므로, 최대 공약수는 6이 된다.)
왜 b가 0이 되면 최대 공약수일까?
a를 b로 나눈 나머지 r이 0이 되면, 그 순간은 b가 a를 완전히 나눴다는 뜻이다.
gcd(a, 0)은 0은 모든 수로 나눌 수 있으므로, a의 모든 약수도 0으로 나눌 수 있다.
따라서 a와 0의 최대 공약수는 a이고, 그래서 gcd(a,0) = a 가 된다.
최소 공배수
최소배수는 아래와 같은 식을 이용하여 구할 수 있다.
lcm(a,b)= a×b / gcd(a,b)
코드 예제
def gcd(a, b):
while b:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
# 예제 실행
a, b = 48, 18
print("최대공약수:", gcd(a, b)) # 출력: 최대공약수: 6
print("최소공배수:", lcm(a, b)) # 출력: 최소공배수: 144
반응형
'Python > 알고리즘 - 이론' 카테고리의 다른 글
[자료구조 멘토링] 힙 (feat.Python) (0) | 2025.02.10 |
---|---|
[자료구조 멘토링] 정렬 이론 (feat.Python) (0) | 2025.02.04 |
[자료구조 멘토링] 트리 (feat.Python) (0) | 2025.02.04 |
[자료구조 멘토링] 스택, 큐, 덱 (feat.Python) (0) | 2025.02.02 |
[자료구조 멘토링] 시간 복잡도 (0) | 2025.01.20 |