본문 바로가기
Algorithm/Number Theory

유클리드 호제법(Euclidean Algorithm)

by yoondoo 2022. 11. 28.
728x90

최대공약수 구할 때 사용하는 유클리드 호제법에 대해서 남기려고 한다.

 

최대공약수 GCD(Greatest Common Divisor)

최소공배수 LCM(Least Common Multiple)

 

소인수분해(최대공약수, 최소공배수)

두 수가 작은 수라면 소인수분해를 통해서 gcd와 lcm을 구할 수 있지만 숫자가 크다면 다른 방식으로 구해야한다.

 

유클리드 알고리즘이란 2개의 자연수(a,b)의 최대공약수를 구하는데

"자연수 a, b가 있을 때 (a>b, a!=b)
a를 b로 나눈 목을 q 나머지를 r이라고 했을 때 a = qb+ r이다.
GCD(a,b) = GCD(b,r)이며 r이 0일 때 b가 최대공약수이다."

만약 r=0이 아니면
a에는 b를 b에는 r을 넣어서 r=0이 나올 때까지 반복한다.

라는 원리이다.

 

그림으로 표현해보겠다.

mod연산에 대해서 알아야하는데

우리가 %연산자를 이용해서 나머지를 구하는 연산이다.

GCD를 구하는 과정

r이 0이 나올 때까지 큰 값에서 작은 값을 나눈 나머지를 계속 구하고

r이 0일 때의 작은 값이 최대공약수가 된다.

 

여기서 최소공배수도 구할 수 있는데 공식은

두 자연수 A,B의 최대공약수가 G이고 최소공배수가 L이면

 

A=a*G , B=b*G  (a,b는 서로소)

L=a*b*G

A*B=L*G

서로소란, a,b가 서로소라는건 gcd(a,b)=1    <=>   공통인수가 없다.(1을 제외하고)

두 식이 성립한다.

 LCM = GCD x (A/GCD) x (B/GCD)    A,B는 a,b자연수의 초기값

LCM을 구하는 과정

이렇게 유클리드 호제법을 이용해서 최대공약수와 최소공배수를 쉽게 구할 수 있다.

 

코드로 구현하는 방법은 2가지가 있다.

1. 반복문을 이용

2. 재귀함수를 이용

 

반목문 이용

반복문을 이용한 유클리드 호제법

재귀함수 이용

재귀함수를 이용한 유클리드 호제법

반응형

댓글