반응형
유클리드 알고리즘의 변형이다.
스테인 알고리즘(Stein's Algorithm)이라고도 한다.
어째든 최대공약수를 찾는 알고리즘이다.
매우 큰 정수를 다룰 때, 나머지 연산자를 이용한 유클리드 호제법보다 빠르다.
기본 원리
- 모든 짝수는 2로 나눌 수 있다.
| 경우의 수 | 표현(식) | 설명 |
| A, B 모두 짝수 일 때 | GCD(A, B) = 2 x GCD(A / 2, B / 2) | 2를 공통인수로 가진다 |
| A만 짝수일 때 | GCD(A, B) = GCD(A / 2, B) | 한쪽이 홀수라면, 2는 공통인수가 될 수 없다. 따라서 짝수인 수만 2로 나누어도 GCD는 변하지 않는다 |
| B만 짝수일 때 | GCD(A, B) = GCD(A, B / 2) |
- 두 수가 모두 홀수인 경우
A(홀수) - B(홀수)는 반드시 짝수가 된다.
유클리드 호제법의 원리와 동일하게 'GCD(A, B) = GCD(A - B, B)' 성립한다
코드
//gcd(a, b) = gcd(a, b, 1)
int gcd(int a, int b, int res)
{
if (a == b)
return a * res;
else if (a % 2 == 0 && b % 2 == 0)
gcd(a / 2, b / 2, res * 2);
else if (a % 2 == 0)
gcd(a / 2, b, res);
else if(b % 2 == 0)
gcd(a, b / 2, res);
else if(a > b)
gcd(a - b, b, res);
else
gcd(a, b - a, res);
}반응형
'Algorithm' 카테고리의 다른 글
| 이진 탐색 (Binary Search Algorithm) (0) | 2025.02.14 |
|---|---|
| 너비 우선 탐색 (BFS, Breadth First Search) (0) | 2025.01.27 |
| 최대공약수 구하기 (유클리드 호제법) (0) | 2025.01.11 |
| 인수분해 (에라토스테네스의 체) (0) | 2025.01.01 |
| 소수 찾기 (에라토스테네스의 체) (0) | 2025.01.01 |