일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 미래는_현재와_과거로
- back propagation
- 회고록
- 우선 순위 큐
- 조합론
- 2023
- 다익스트라
- dropout
- pytorch
- 이분 탐색
- 플로이드 와샬
- DP
- 크루스칼
- 가끔은_말로
- tensorflow
- 세그먼트 트리
- BFS
- 알고리즘
- c++
- 가끔은 말로
- object detection
- dfs
- 분할 정복
- 문자열
- 너비 우선 탐색
- Overfitting
- lazy propagation
- NEXT
- 자바스크립트
- 백트래킹
- Today
- Total
Doby's Lab
Extended Euclidean Algorithm (증명 X) 본문
확장 유클리드 알고리즘(Extended Eucildean Algorithm)이란 ax + by = c 같은 부정방정식이 주어졌을 때, (x, y)의 정수해를 알아내는 알고리즘입니다.
증명은 따로 하지 않으며 배운 곳까지만 작성하겠습니다. 증명 자료를 찾으려니 이해가 안 되는 부분들이 꽤나 많았습니다.
[사전 지식]
ax + by = c와 같이 미지수의 개수가 식의 개수보다 많아서 근이 일정하지 않은 방정식을 부정방정식(Underdetermined Equation)이라고 합니다.
그리고, ax + by = c에서 정수해를 구한다고 하였는데 부정방정식에서 정수해를 구하는 방정식을 디오판토스 방정식(Diophantine Equation)이라고 합니다.
=> 사실 이 용어는 그닥 중요하지 않습니다.
ax + by = c에서 정수해가 존재하려면 베주 항등식(Bezout's Identity)의 명제에 의거하여 c = gcd(a, b)의 정수배여야 합니다.
위에서 말했듯이 이번 포스팅에서 증명은 따로 하지 않습니다.
확장 유클리드 알고리즘은 두 정수 a, b의 나머지 정리와 유클리드 알고리즘을 반복하면서 정리할 수 있습니다.
반복하면서 정리하여 얻은 식들을 나열해보겠습니다.
r1 = a, r2 = b, s1 = 1, s2 = 0, t1 = 0, t2 = 1
r = r1 - r2 * q
s = s1 - s2 * q
t = t1 - t2 * q
코드가 반복되는 과정에서
r2 -> r1, r -> r2
s2 -> s1, s -> s2
t2 -> t1, t -> t2
r2가 0이 되는 시점에서 알고리즘 종료
종료된 시점에서 r1 = gcd(a, b), s1 = x, t1 = y가 됩니다.
즉, ax + by = c는 a*s1 + b*t1 = r1이 됩니다.
#include <iostream>
using namespace std;
void exGCD(int a, int b){
int r1 = a, r2 = b, s1 = 1, s2 = 0, t1 = 0, t2 = 1;
int r, s, t;
while(true){
int q = r1 / r2;
r = r1 - q * r2;
r1 = r2;
r2 = r;
s = s1 - q * s2;
s1 = s2;
s2 = s;
t = t1 - q * t2;
t1 = t2;
t2 = t;
if(r2 == 0) break;
}
cout << "gcd(a, b): " << r1 << '\n';
cout << "x: " << s1 << " y: " << t1;
}
int main(){
int a, b; cin >> a >> b;
exGCD(a, b);
}
'PS > Study Note' 카테고리의 다른 글
Miller-Rabin 소수 판별법 Code (0) | 2022.07.30 |
---|---|
Bitmasking 기본적인 연산 (0) | 2022.07.17 |
Euclidean Algorithm Code(반복, 재귀) (0) | 2022.06.18 |
Coordinate Compression 연구일지 (0) | 2022.06.05 |
Exponentiation By Squaring Code (0) | 2022.05.05 |