Computer Science/Cryptography
< 암호학 > 유클리드 호제법
dxwny
2024. 10. 11. 22:32
설명
유클리드 알고리즘은 두 정수 사이의 최대공약수를 구하는 방식이다.
두 정수 사이의 아래와 같은 특성을 이용한다.
큰 수(a)와 작은 수(b) 사이의 최대 공약수 = 큰 수를 작은 수로 나눈 나머지(a mod b)와 작은 수(b) 사이의 최대 공약수
a,b의 최대공약수를 구하기 위해
GCD(a,b)를 반복적으로 사용하는데,
만약 b가 0이라면, a값을 리턴하고
b가 0이 아니라면, Euclid(b, a mod b) 를 재귀호출 (또는 while loop 사용) 한다.
앞의 파라미터를 계속 뒤의 파라미터로 나눈 나머지로 줄게 만들면서,
어느 순간 뒤 파라미터가 0 (나머지가 0)이 될 때 그 앞 파라미터가 두 수의 최대공약수이다.
3개 정수의 최대공약수를 구할 때는, 두 개씩 먼저 적용하면 된다.
gcd(a,b,c) = gcd ( gcd (a,b) , c)
c언어 구현 코드
2개 정수 사이의 GCD
// while loop 사용
int gcd(int a, int b) {
int temp = 0;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a; // b가 0이 돼서 while을 탈출한 경우, a가 최대공약수
}
// 재귀호출 사용
int gcd(int a, int b) {
if (b == 0) {
return a; // b가 0이면 a가 최대공약수
} else {
return gcd(b, a % b); // 재귀 호출: gcd(b, a % b)
}
}
3개 정수 사이의 GCD
// 두 정수의 GCD를 구하는 함수 (유클리드 알고리즘 사용)
int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// 세 정수의 GCD를 구하는 함수
int gcd_of_three(int a, int b, int c) {
int g = gcd(a, b); // a와 b의 GCD 구하기
return gcd(g, c); // a와 b의 GCD와 c의 GCD 구하기
}
참고 블로그 : https://olrlobt.tistory.com/44