본문 바로가기

Programming/알고리듬

Euclid's Algorithm의 개선

모든 알고리즘은 개선될 여지가 있다. 그래서 알고리즘의 공부가 재미있다.

 

이전의 빼기를 이용한 유클리드 알고리즘은 입력되는 두 수 u 와 v의 차이가 클 때 실행시간이 오래 걸린다.

 

만약에 32767과 1의 최대공약수를 구하는 경우는 32767번이나 뺄셈을 하게 된다.

 

 그런데 250과 30을 뺄셈하여 만든 결과 10과 30을 자세히 살펴보면 10은 250을 30으로 나눈 뒤에 나머지임을 알 수 있다.

 

즉 10 = 250 % 30 인 것이다. 그래서 다음과 같은 식 4가 성립한다.

 

     GCD(u, v) = GCD(u%v, v)     -----식 4

 

이 식 4를 이용하여 280과 30의 최대공약수를 구해보자.

 

GCD(280, 30) = GCD(10, 30)     -----식 4(280%30==10)

                      GCD(30, 10)

                      GCD(0, 10)

                      GCD(10, 0)

                   = 10

 

a % b = c 일 때 c는 항상 b보다 작은 성질이 있다. 즉 나머지는 젯수보다 작다는 것인데

 

이를 이용하면 뻴셈을 이용할 경우 항상 u와 v의 대소 비교를 했던 것과는 반대로

 

%연산을 이용하면 다소가 분명해져서 % 연산 후 무조건 두 값을 교환하면 되므로

 

if(u<v) ...와 같은 문장을 없앨 수 있다.

 

 다음은 나머지 연산을 이용하여 최대공약수를 구하는 방법이다.

 

1. 임의의 두 정수 u와 v를 입력받는다.

2. v가 0인가?   0이면 u가 최대공약수이다. 끝.

                     0이 아니면   2.1 u에 u%v를 대입한다.

                                      2.2 u와 v의 값을 교환한다. 

'Programming > 알고리듬' 카테고리의 다른 글

Prime Number Algorithm  (0) 2017.12.11
Euclid's Algorithm  (0) 2017.12.11