[Codility] 12. Euclidean Algorithm

joon_1592·2021년 2월 15일
0

Codility

목록 보기
17/22
post-custom-banner

유클리드 호제법

00이 아닌 두 정수 a,ba, ba=bq+ca=bq+c가 성립한다고 하자.(q,cq, c는 정수)
a,ba, b의 공약수 전체집합과 b,cb,c의 공약수 전체 집합은 서로 같다.
특히 (a,b)=(b,c)(a, b)=(b,c)이다.

GCD

유클리드 호제법을 영어로 Euclidean Algorithm이라 한다. 이를 이용하여 최대공약수(이하 gcdgcd)를 빠르게 구할 수 있다.

코드

if bab | a, then gcd(a,b)=bgcd(a, b) = b
otherwise, gcd(a,b)=gcd(b,amodb)gcd(a, b) = gcd(b, a \mod b)

def gcd(a, b):
    if a % b == 0:
        return b
    return gcd(b, a % b)

시간복잡도

좀 수학적인 지식이 필요하다.
우선 (ai,bi)(a_i, b_i)ii번째 단계에서의 (a,b)(a, b)라 하자.
그러면 b1=0b_1 = 0이고, 두번째 단계부터는 b1b \geq 1이다.
또한 (ak+1,bk+1)(a_{k+1}, b_{k+1}) -> (ak,bk)(a_{k}, b_{k}) -> (ak1,bk1)(a_{k-1}, b_{k-1})이 되고, 따라서
ak=bk+1a_k=b_{k+1}, ak1=bka_{k-1}=b_k, bk1=akmodbkb_{k-1}=a_k \mod b_k
q1q \geq 1에 대하여 ak=qbk+bk1a_k=qb_k+b_{k-1}이므로
bk+1bk+bk1b_{k+1} \geq b_k + b_{k-1}
한편 피보나치 수열 fnf_n에 대하여 fn15(1+52)nf_n \approx \frac{1}{\sqrt{5}}\big( \frac{1+\sqrt{5}}{2}\big)^n이므로
시간복잡도는 O(log(a+b))O(\log{(a+b)})이다.

LCM

lcm(a,b)=abgcd(a,b)lcm(a, b) = \frac{|ab|}{gcd(a, b)}임을 이용한다. (단, a,ba, b00이 아닌 정수)
시간복잡도는 gcd(a,b)gcd(a, b)를 구하는 시간인 O(log(a+b))O(\log{(a+b)})이다.

또한 lcm(a1,a2,...,an)=lcm(a1,lcm(a2,a3,...,an))lcm(a_1, a_2, ..., a_n)=lcm(a_1, lcm(a_2, a_3, ..., a_n))이다.

gcdgcd는 같은 성질이 적용되지 않는다.

profile
공부용 벨로그
post-custom-banner

0개의 댓글