본문 바로가기

CS/Algorithm

유클리드 호제법(Euclidean algorithm)

 유클리드 호제법

유클리드에 의해 기원전 300년경에 발견된 가장 오래된 알고리즘으로,

두 수의 최대공약수를 구하는 알고리즘이다.

두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 것으로, 서로 호(互)와 덜(나누기) 제(除)를 써서 호제법이다.


‣ 예시: 1071과 1029의 최대공약수 계산하기

[일반적인 방법]

일반적으로 최대공약수를 구한다고 생각한다면, 먼저 소인수분해를 떠올린다.

1071 = 17 x 7 x 3 x 3

1029 = 7 x 7 x 7 x 3

두 수를 소인수분해한 결과, 공통된 소수를 찾으면 된다.

이를 통해 두 수의 최대공약수(GCD)가 " 7 x 3 = 21 "인 것을 알 수 있다.

 

하지만, 이 방법은 수가 커질 수록, 소인수분해를 수행하기 어려워진다는 단점이 있다.

유클리드 호제법은, 이러한 단점을 보완해 더 효율적으로 최대공약수(GCD)를 구할 수 있는 방법이다.


[유클리드 호제법을 사용한 방법]

유클리드 호제법은 두 값을 나눈 나머지를 구하는 MOD연산이다.

 

먼저, 큰 수를 작은 수로 나눈 나머지를 구한다.(= MOD연산)

1071 mod 1029 = 42

// 아래 식이랑 같습니다.
1071 % 1029 = 42

 다음으로, 나눴던 수와 나머지로 또 MOD 연산을 진행한다.

1029 mod 42 = 21
// 1029 % 42 = 21

이 과정을 계속 반복하여 나머지가 0이 되었을 때, 마지막 계산에서 나누는 수로 사용된 수가 최대 공약수(GCD)가 된다.

42 mod 21 = 0
// 42 % 21 = 0
// GCD == 21

 

∴ 유클리드 호제법은 MOD연산 (%)을 계속 반복하면 된다.


그림으로 보기

유클리드 호제법 gif

앞으로 다시는 안만들 ppt 애니메이션.


 요약

유클리드 호제법은 나눗셈만 반복해서 최대공약수(GCD)를 구할 수 있다.

두 개의 수가 아무리 커도 정해진 순서로 계산하면 효율적으로 최대공약수를 구할 수 있다.

코드

[Python]

def Euclidean(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

📎 def를 쓰지 않고 좀 더 간결하게 표현한다면??

while (b):
    a, b = b, a%b

 

[Kotlin]

fun Euclidean(num1:Int, num2:Int):Int{
    var r:Int = 0
    var a:Int = num1
    var b:Int = num2
    while(b!=0){
        r=a%b
        a=b
        b=r
    }
    return a
}

유클리드 호재법 관련 백준 문제


Reference

 

유클리드 호제법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란

ko.wikipedia.org

 

'CS > Algorithm' 카테고리의 다른 글

[Kotlin] DFS, BFS 기본 구현  (0) 2024.03.31
에라토스테네스의 체  (2) 2023.10.20
N진법  (1) 2023.10.04
힙(Heap)  (0) 2023.03.01
스택(Stack)  (0) 2023.02.27