0이 아닌 두 정수 a,b가 a=bq+c가 성립한다고 하자.(q,c는 정수) a,b의 공약수 전체집합과 b,c의 공약수 전체 집합은 서로 같다.
특히 (a,b)=(b,c)이다.
GCD
유클리드 호제법을 영어로 Euclidean Algorithm이라 한다. 이를 이용하여 최대공약수(이하 gcd)를 빠르게 구할 수 있다.
코드
if b∣a, then gcd(a,b)=b
otherwise, gcd(a,b)=gcd(b,amodb)
defgcd(a, b):if a % b ==0:return b
return gcd(b, a % b)
시간복잡도
좀 수학적인 지식이 필요하다.
우선 (ai,bi)를 i번째 단계에서의 (a,b)라 하자.
그러면 b1=0이고, 두번째 단계부터는 b≥1이다.
또한 (ak+1,bk+1) -> (ak,bk) -> (ak−1,bk−1)이 되고, 따라서 ak=bk+1, ak−1=bk, bk−1=akmodbk q≥1에 대하여 ak=qbk+bk−1이므로 bk+1≥bk+bk−1
한편 피보나치 수열 fn에 대하여 fn≈51(21+5)n이므로
시간복잡도는 O(log(a+b))이다.
LCM
lcm(a,b)=gcd(a,b)∣ab∣임을 이용한다. (단, a,b는 0이 아닌 정수)
시간복잡도는 gcd(a,b)를 구하는 시간인 O(log(a+b))이다.
또한 lcm(a1,a2,...,an)=lcm(a1,lcm(a2,a3,...,an))이다.