프로그래밍/알고리즘

유클리드 호제법 (Euclidean Algorithm)

Mt.Hwang 2025. 4. 17. 10:34

 * 유클리드 호제법 (Euclidean Algorithm)

두 수의 최대공약수를 효율적으로 구하는 알고리즘
수학자 유클리드가 《원론(Elements)》에서 제시한 방법이다

GCD (Greatest Common Divisior) : 최대공약소

LCD (Least Common Multiple) : 최소공배수

mod : 나머지 연산자
a mod b == a%b

a > b에서 a를 b로 나눈 나머지를 r이라고 할 때 (r = a mod b)
gcd(a, b) = gcd(b, r)임을 이용
r = 0일때의 b가 최대공약수이다

gcd(n1, n2) = gcd(n2, n3) = gcd(n3, n4) = ... = gcd(n_last, r)
이렇게 연쇄적으로 이어지고 언젠가 r = 0이 되는 순간이 온다. 그때의 n_last가 최대공약수인 셈

시간복잡도가 O(log(min(a, b)))으로 매우 효율적

재귀와 반복으로 구현 가능

..~~~~..

 * 재귀 gcd()

int gcd(int a, int b)
 if( a == 0)
  return b

 return gcd(b, a%b)

..~~~~..

 * 반복문 gcd()

int gcd(int a, int b)
 while (b != 0)
  int r = a%b
  a = b
  b = r

 return a

..~~~~~..

 * 최소공배수 lcm()

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

..~~~~..

 * 수학에서의 최대공약수와 최소공배수

우선 두 수의 약수를 구한다
그리고 각각 약수와 지수를 정리한다

이때 각 약수들을 최소한으로 지수를 취하고 곱한 것이 최대공약수이고
각 약수들을 최대한으로 지수를 취하고 곱한 것이 최소공배수이다

즉,
최대공약수 : 공통된 소인수의 지수 중 최소값을 취해 곱한 것
최소공배수 : 공통된 소인수의 지수 중 최대값을 취해 곱한 것

..~~~~..