이전의 유클리드 호제법으로 최대공약수를 구하는법을 알았다
유클리드 호제법 이론 (최대 공약수 구하기)
즉, a, b의 최대공약수와 b, r의 최대공약수가 같음을 이용해서 최대공약수를 빠르게 구하는 방법이다. 예를들어 78696과 19323의 최대 공약수를 구하고자 한다면 78696 = 19323 * 4 + 1368 19323 = 1368 * 14 +..
fullfish.tistory.com
더 나아가서 이를 이용해서
a, b의 최대공약수와 함께 이 최대공약수가 되기위해서
a에 몇을 곱하고 b에 몇을 곱해야하는지 구해보자
gcd(a,b) = a * x + b * y
이러한 형식으로 표현되는데 x와 y를 구하는것이다
이전의 78696과 19332의 경우로 확장된 유클리드 호제법을 사용해 보겠다
78696 = 19332 * 4 + 1368
1368 = 78696 + 19332(-4) ...(i)
19332 = 1368 * 14 + 180
180 = 19332 + 1368(-14)
180 = 19332 + (i)(-14)
180 = 19332 -14(78696 + 19332(-4))
180 = 78696 *(-14) + 19332 * 57 ...(ii)
1368 = 180 * 7 + 108
108 = 1368 + 180(-7)
108 = (i) -7(ii)
108 = 78696 + 19332(-4) -7(78696 *(-14) + 19332 * 57)
108 = 78696 * 99 + 19332 * (-403) ...(iii)
180 = 108 * 1 + 72
72 = 180 + 108(-1)
72 = (ii) -(iii)
72 = 78696 * (-14) + 19332 * 57 -(78696 * 99 + 19332 * (-403))
72 = 78696 * (-113) + 19332 * 460 ...(iiii)
108 = 72 * 1 + 36
36 = 108 + 72(-1)
36 = (iii) -(iiii)
36 = (78696 * 99 + 19332 * (-403)) -(78696 * (-113) + 19332 * 460)
36 = 78696 * 212 + 19332 * (-863)
72 = 36 * 2 + 0
최대공약수는 36으로 동일하며
x = 212
y = -863 이다
용도
- 중국인의 나머지 정리
- 디오판토스 방정식
- 합동식 (Congruence Equation) 의 계산
코드
function EEA(a, b) {
let [r1, r2, s1, s2, t1, t2, q, r, s, t] = [a, b, 1, 0, 0, 1, 0, 0, 0, 0];
while (true) {
q = parseInt(r1 / r2);
r = r1 - q * r2;
s = s1 - q * s2;
t = t1 - q * t2;
if (r === 0) {
console.log(`최대공약수 : ${r2}, x : ${s2}, y : ${t2}`);
break;
}
r1 = r2;
r2 = r;
s1 = s2;
s2 = s;
t1 = t2;
t2 = t;
}
}
참고
[알고리즘] 확장된 유클리드 알고리즘 (Extended Euclidean Algorithm) 으로 최대공약수 (GCD) 구하기 (C++로
확장된 유클리드 알고리즘이란? '확장된' 이라는 말이 붙었습니다. 그렇다면 유클리드 알고리즘이란 무엇일까요? 많은 분들이 알고 계신 것처럼, 유클리드 알고리즘은 최대공약수 (GCD) 를 구할
kbw1101.tistory.com
'코딩 테스트 > 알고리즘 공부' 카테고리의 다른 글
버블 정렬 (Bubble Sort) (0) | 2022.06.14 |
---|---|
조합 (0) | 2022.06.14 |
유클리드 호제법 이론 (최대 공약수 구하기) (0) | 2022.05.31 |
거듭제곱 시간복잡도 줄이기 (0) | 2022.05.31 |
순열(DFS 깊이우선탐색) (0) | 2022.05.09 |