Processing math: 100%

새소식

반응형
컴퓨터공학 (Computer Science)/알고리즘 | Algorithm

유클리드 호제법보다 빠르게 최대공약수를 구하는 방법 - 스테인 알고리즘

  • -
반응형

이번 포스팅에서는 호제법보다 빠른 최대공약수 식별 알고리즘을 소개한다.

스테인 알고리즘 (Stein's algorithm) 이라고도 불리는 알고리즘이며, 기존의 호제법보다 60%의 효율개선을 보이는 획기적인 알고리즘이다.

는 그렇게 대단한 알고리즘이 아니다...

스테인 알고리즘은 이진 GCD 알고리즘이라고도 불리며, 호제법의 이진버전이라고 생각하면된다. 호제법에서 각 루틴마다. AmodB(A>B) 를 수행하지만, 스테인 알고리즘에서는 A와 B를 모두 반으로 나눈다.

다음과 같은 규칙을 따른다.

  1. 두 수가 짝수일 때는 2로 나눈다. a 변수를 1증가시킨다.
  2. 한 수만 짝수일 때는 그 수를 2로 나눈다.
  3. 두 수가 홀수일 때는 큰 수에서 작은 수를 뺀다.
  4. 0이 되는 수가 있으면 종료한다. 0이 아닌 반대쪽 수를 b변수라 한다.

이 루틴이 끝나면 2ab를 구한다. 이것이 두 수의 최대공약수이다.

증명은 어렵지 않다.

  • 두 수가 짝수일 때 2로 나누는 것은 공약수가 2를 포함하고 있다는 의미이다. 따라서 이를 a변수에 기록한다.
  • 한 수만 짝수일 때 2로 나누는 것은 한쪽만 2를 포함하고 있기때문에 이를 날리는 것이다.
  • 두 수가 홀수일 때 큰 수에서 작은 수를 빼는 것은 호제법과 같은 수행이므로 증명에 문제가 없다.

스테인 알고리즘을 통해 36과 24의 최대공약수를 찾는 과정은 다음과 같다.

36 → 18 →9 →9 →6 →3 →3 

24 → 12 →6 →3 →3 →3 →0

def binaryGCD(a, b): exp = 0 while (~(a|b)&1): exp += 1 a >>= 1 b >>= 1 while a and b: while ~a & 1: a >>= 1 while ~b & 1: b >>= 1 if a > b: a -= b else: b -= a n = a if a else b return n << exp
반응형

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.