유클리드 호제법

2017. 5. 18. 01:13알고리즘/알고리즘

반응형

정의


유클리드 호제법(- 互除法, Euclidean algorithm)은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며,기원전 300년경에 쓰인 유클리드의 《원론》 제7권, 명제 1부터 3까지에 해당한다.


예시

1071과 1029의 최대공약수를 구하면,

  • 1071은 1029로 나누어떨어지지 않기 때문에, 1071을 1029로 나눈 나머지를 구한다. => 42
  • 1029는 42로 나누어떨어지지 않기 때문에, 1029를 42로 나눈 나머지를 구한다. => 21
  • 42는 21로 나누어떨어진다.

따라서, 최대공약수는 21이다.

78696과 19332의 최대공약수를 구하면,

    7869619332×4 + 1368
    19332 = 1368×14 + 180
     1368 = 180×7 + 108 
      180 = 108×1 + 72     
      108 = 72×1 + 36 
       72 = 36×2

따라서, 최대공약수는 36이다.


[출처 : wikipedia]




최대공약수 최소공배수


숫자 x, y가 존재할 때


최대공약수 = 유클리드 호제법을 이용해서 구한다.

최소공배수 = (x*y) / 최대공약수




구현 (재귀)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int euclid(int a, int b) {
    if (b == 0) {
        return a;
    }
    else {
        return euclid(b, a%b);
    }
}
 
int main() {
    int a, b;
    cin >> a >> b;
    cout << euclid(a, b) << '\n';
    return 0;
}
cs




구현 (반복분)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main() {
    int a, b;
    cin >> a >> b;
    while (1) {
        if (b == 0) {
            cout << a << '\n';
            break;
        }
        int tmp = a;
        a = b;
        b = tmp%b;
    }
    return 0;
}
cs





백준 문제


1934번 최소공배수

2609번 최대공약수와 최소공배수

1735번 분수 합

















반응형

'알고리즘 > 알고리즘' 카테고리의 다른 글

순열 알고리즘 (Permutation)  (0) 2017.07.18
조합 알고리즘 (Combination Algorithm)  (0) 2017.05.19
카운팅 정렬 (Counting Sort)  (0) 2017.05.19
병합 정렬 (Merge sort)  (0) 2017.05.19