Greatest Common Divisor — 최대공약수와 유클리드 호제법

GCD는 Division Theorem에서 곧바로 나오는 첫 도구다. 두 수를 나눈 나머지가 공약수 집합을 바꾸지 않는다는 사실 하나로 유클리드 호제법이 서고, 그 과정을 거꾸로 읽으면 베주 항등식이 나온다. 이 둘이 뒤에서 볼 모듈러 역원과 RSA 키 생성의 바탕이 된다.

이 포스트에서 다루는 내용
  • GCD 대수적 정의: dad \mid a, dbd \mid b이고, cac \mid a, cbc \mid b이면 cdc \mid d가 되는 유일한 d0d \ge 0
  • 유클리드 호제법: gcd(b,a)=gcd(a,r)\gcd(b, a) = \gcd(a, r), 나머지가 0이 될 때까지 반복
  • 확장 유클리드 알고리즘: gcd(a,b)=xa+yb\gcd(a, b) = xa + yb (베주 항등식)
  • 서로소 성질: gcd(a,b)=1    ax+by=1\gcd(a, b) = 1 \iff ax + by = 1인 정수 x,yx, y가 존재

GCD 정의

임의의 정수 aa, bb에 대해, 최대공약수 d=gcd(a,b)d = \gcd(a, b)는 다음 두 조건을 동시에 만족하는 유일한 정수 d0d \geq 0이다.

  1. dad \mid a 이고 dbd \mid b
  2. 모든 정수 cc에 대해 cac \mid a 이고 cbc \mid b 이면, cdc \mid d

두 번째 조건이 핵심이다. 일상적인 정의(“공약수 중 가장 큰 수”)에서는 cdc \leq d를 요구하지만, cdc \mid d는 이보다 정확한 조건이다. ccdd의 약수이면 자동으로 cdc \leq d이기 때문이다.

aabb서로소(coprime) 이면 gcd(a,b)=1\gcd(a, b) = 1이다.

GCD 계산

GCD를 구하는 방법은 크게 두 가지다.

소인수분해(Factorization): 두 수를 각각 소인수분해한 뒤 공통 소인수의 최솟값을 곱한다. 직관적이지만 큰 수에서는 느리다.

느린 이유는 현재 알려진 고전 알고리즘의 실행 시간에 있다. nn비트 정수에 대해 가장 빠른 일반 알고리즘인 수체 체(Number Field Sieve)가 준지수 시간 L[1/3]L[1/3]을 쓴다. 다항식 시간 알고리즘은 아직 알려져 있지 않다.

여기서 흔히 인용되는 복잡도 분류는 조심해서 읽어야 한다. 소인수분해 자체는 값을 내놓는 함수 문제extNP ext{NP} 같은 판정 클래스에 바로 넣을 수 없다. 「nnkk 이하의 소인수를 갖는가」처럼 판정 문제로 바꾸면 extNPextcoNP ext{NP} \cap ext{co-NP}에 속한다는 것이 알려져 있는데, 이는 오히려 NP-완전일 가능성이 낮다는 신호다. extNPextcoNP ext{NP} \cap ext{co-NP} 소속만으로 어렵다거나 느리다는 결론은 나오지 않는다. 실제 근거는 앞 문단의 실행 시간이다.

유클리드 호제법(Euclidean Algorithm): 나머지 연산을 반복해 빠르게 GCD를 구한다.

유클리드 호제법

양의 정수 aa, bb에 대해, 나머지가 0이 될 때까지 다음 과정을 반복한다.

b=q1a+r1b = q_1 a + r_1 a=q2r1+r2a = q_2 r_1 + r_2 r1=q3r2+r3r_1 = q_3 r_2 + r_3 \vdots rk2=qkrk1+rkr_{k-2} = q_k r_{k-1} + r_k rk1=qk+1rk+0r_{k-1} = q_{k+1} r_k + 0

이때 gcd(a,b)=rk\gcd(a, b) = r_k이다. 핵심 관계식은 다음과 같다.

b=qa+r    gcd(b,a)=gcd(a,r)b = qa + r \implies \gcd(b, a) = \gcd(a, r)
유클리드 호제법 시각화
유클리드 호제법 시각화

증명 — 공약수 집합의 상호 포함으로 증명한다.

bbaa공약수 전체D1D_1, aarr의 공약수 전체를 D2D_2라 하자. 두 집합이 같음을 보이면 각 집합의 최댓값도 같으므로 gcd(b,a)=gcd(a,r)\gcd(b, a) = \gcd(a, r)이 따라온다.

D1D2D_1 \subseteq D_2: pD1p \in D_1이면 pbp \mid b, pap \mid a. r=bqar = b - qa이므로 p(bqa)p \mid (b - qa), 즉 prp \mid r. 따라서 pap \mid a, prp \mid r이므로 pD2p \in D_2.

D2D1D_2 \subseteq D_1: pD2p \in D_2이면 pap \mid a, prp \mid r. b=qa+rb = qa + r이므로 pbp \mid b. 따라서 pap \mid a, pbp \mid b이므로 pD1p \in D_1.

두 방향 포함이 성립하므로 D1=D2D_1 = D_2, 즉 gcd(b,a)=gcd(a,r)\gcd(b, a) = \gcd(a, r)이다.

확장 유클리드 알고리즘

유클리드 호제법의 각 단계를 역으로 거슬러 올라가면, GCD를 aabb일차 결합(linear combination) 으로 표현할 수 있다.

rk=rk2qkrk1r_k = r_{k-2} - q_k r_{k-1}

rk1r_{k-1}을 다시 rk3r_{k-3}rk2r_{k-2}로 표현하고 이 과정을 반복하면,

rk=(1+qkqk1)rk2qkrk3r_k = (1 + q_k q_{k-1}) r_{k-2} - q_k r_{k-3}

최종적으로 rkr_kaabb의 일차 결합으로 나타낼 수 있다.

gcd(a,b)=xa+yb(x,yZ)\gcd(a, b) = xa + yb \quad (x, y \in \mathbb{Z})

이것이 베주 항등식(Bézout’s Identity) 이다. xxyyaa, bb에 의존하며 유일하지 않다.

쉽게 말하면

확장 유클리드 알고리즘은 "GCD를 구하는 과정을 거꾸로 되감으면, GCD를 두 원래 수의 덧셈·뺄셈 조합으로 표현할 수 있다"는 뜻이다. 예를 들어 gcd(12,8)=4\gcd(12, 8) = 4이면, 4=12×1+8×(1)4 = 12 \times 1 + 8 \times (-1)처럼 쓸 수 있다. 이 성질이 RSA에서 비밀키를 계산하는 핵심 도구가 된다.

서로소의 성질

성질 1: 서로소 판별 기준

gcd(a,b)=1    어떤 정수 x,y에 대해 ax+by=1\gcd(a, b) = 1 \iff \text{어떤 정수 } x, y \text{에 대해 } ax + by = 1

증명 (⟹): gcd(a,b)=1\gcd(a, b) = 1이면 베주 항등식에 의해 ax+by=1ax + by = 1x,yx, y가 존재한다.

증명 (⟸): ax+by=1ax + by = 1을 만족하는 x,yx, y가 존재한다고 하자. d=gcd(a,b)d = \gcd(a, b)라 하면 dad \mid a, dbd \mid b이므로 d(ax+by)=1d \mid (ax + by) = 1. 따라서 d1d \leq 1이고, d0d \geq 0이므로 d=1d = 1.

성질 2: 서로소와 배수

abc 이고 gcd(a,b)=1    aca \mid bc \text{ 이고 } \gcd(a, b) = 1 \implies a \mid c

증명: gcd(a,b)=1\gcd(a, b) = 1이므로 ax+by=1ax + by = 1x,yx, y가 존재한다. 양변에 cc를 곱하면 acx+bcy=cacx + bcy = c. bc=kabc = ka (가정에서 abca \mid bc)를 대입하면 acx+kay=cacx + kay = c, 즉 a(cx+ky)=ca(cx + ky) = c. 따라서 aca \mid c.

성질 3: 서로소의 곱셈 보존

gcd(a,b)=1 이고 gcd(a,c)=1    gcd(a,bc)=1\gcd(a, b) = 1 \text{ 이고 } \gcd(a, c) = 1 \implies \gcd(a, bc) = 1

증명: gcd(a,b)=1\gcd(a, b) = 1이면 ax1+by1=1ax_1 + by_1 = 1, gcd(a,c)=1\gcd(a, c) = 1이면 ax2+cy2=1ax_2 + cy_2 = 1인 정수들이 존재한다. 두 식을 곱하면,

(ax1+by1)(ax2+cy2)=a(ax1x2+cx1y2+bx2y1)+bcy1y2=1(ax_1 + by_1)(ax_2 + cy_2) = a(ax_1 x_2 + cx_1 y_2 + bx_2 y_1) + bc \cdot y_1 y_2 = 1

이를 aabcbc의 일차 결합으로 표현했으므로, 성질 1에 의해 gcd(a,bc)=1\gcd(a, bc) = 1.

GCD 정의 동치 증명

일상적 정의(“공약수 중 가장 큰 수”)와 위의 대수적 정의가 동치임을 증명한다.

AA, BB, DD를 각각 aa, bb, dd의 약수 집합이라 하자. dd가 최대공약수이려면 D=ABD = A \cap B, 즉 dd의 약수 집합이 aabb의 공약수 집합과 일치해야 한다.

ABDA \cap B \subseteq D: tABt \in A \cap B이면 tat \mid a, tbt \mid b. 베주 항등식 d=xa+ybd = xa + yb에서 t(xa+yb)=dt \mid (xa + yb) = d. 따라서 tDt \in D.

DABD \subseteq A \cap B: tDt \in D이면 tdt \mid d, 즉 d=tkd = tk. a=ada = a'd, b=bdb = b'd로 쓰면 a=atka = a'tk, b=btkb = b'tk. 따라서 tat \mid a, tbt \mid b이므로 tABt \in A \cap B.

두 방향 포함이 성립하므로 D=ABD = A \cap B. 두 정의가 동치임이 증명되었다.

GCD 확장

GCD는 3개 이상의 정수로 자연스럽게 확장된다.

d=gcd(a,b,c)d = \gcd(a, b, c)는 다음을 만족하는 유일한 정수 d0d \geq 0이다.

  1. dad \mid a, dbd \mid b, dcd \mid c
  2. 모든 정수 ee에 대해 eae \mid a, ebe \mid b, ece \mid c이면 ede \mid d

계산은 연속 적용으로 처리한다. gcd(a,b,c)=gcd(gcd(a,b),c)\gcd(a, b, c) = \gcd(\gcd(a, b), c).

핵심 정리
  • GCD의 대수적 정의는 "가장 큰 공약수"라는 직관적 정의와 동치이며, cdc \mid d 조건이 더 엄밀하고 다루기 쉽다.
  • 유클리드 호제법은 gcd(b,a)=gcd(a,r)\gcd(b, a) = \gcd(a, r)을 반복 적용해 로그 시간에 GCD를 구한다.
  • 확장 유클리드 알고리즘(베주 항등식)은 gcd(a,b)=xa+yb\gcd(a, b) = xa + yb를 보장한다. 이는 서로소 판별, 모듈러 역원 계산, RSA 키 생성의 수학적 근거가 된다.
  • 서로소 성질(gcd=1\gcd = 1)은 정수론 전반에서 핵심 도구로 쓰이며, 특히 암호 시스템에서 키와 모듈러스의 관계를 보장하는 데 필수적이다.
다음 포스트

Modular Arithmetic — 모듈러 산술과 잉여계 — GCD를 기반으로 모듈러 산술의 동치 관계를 정의하고, 완전·축약 잉여계, 오일러 정리, 페르마의 소정리, 중국인의 나머지 정리(CRT)까지 — 공개키 암호의 계산 엔진을 완성한다.

© 2026 XsQuare01. Powered by GitHub Pages. · 방문자