Chinese Remainder Theorem — 중국인의 나머지 정리

쌍마다 서로소인 여러 수로 나눈 나머지를 모아 두면, 그것만으로 원래 수가 하나의 합동류로 정해진다. 중국인의 나머지 정리는 그런 수가 반드시 존재하고 그 합동류가 유일하다는 것을 보장하고, 그 수를 직접 만드는 방법까지 준다.

이 포스트에서 다루는 내용
  • 설정: m1,,mrm_1, \ldots, m_r이 서로 쌍으로 서로소(pairwise coprime)이고 m=m1mrm = m_1 \cdots m_r
  • 보장: 임의의 c1,,crc_1, \ldots, c_r에 대해 xci(modmi)x \equiv c_i \pmod{m_i}를 동시에 만족하는 xxmod m\bmod\ m에서 유일하게 존재
  • 구성: Mi=m/miM_i = m/m_i, Ni=Mi1modmiN_i = M_i^{-1} \bmod m_i, x=ciMiNimodmx = \sum c_i M_i N_i \bmod m
  • 응용: RSA-CRT 최적화 (처리 속도 약 4배 향상)

정확한 설정

m1,,mrm_1, \ldots, m_r이 쌍으로 서로소(pairwise coprime): 임의의 iji \neq j에 대해 gcd(mi,mj)=1\gcd(m_i, m_j) = 1.

여기서 주의할 점은 전체 gcd가 1인 것쌍으로 서로소 는 다르다는 것이다. 예를 들어 {6,10,15}\{6, 10, 15\}gcd(6,10,15)=1\gcd(6,10,15)=1이지만, gcd(6,10)=21\gcd(6,10)=2 \neq 1이므로 쌍으로 서로소가 아니다.

m=m1m2mrm = m_1 \cdot m_2 \cdots m_r로 정의한다.

정리: 임의의 정수 c1,,crc_1, \ldots, c_r에 대해, 다음 연립 합동식을 동시에 만족하는 xxmod m\bmod\ m에서 유일하게 존재한다.

xc1(modm1),xc2(modm2),,xcr(modmr)x \equiv c_1 \pmod{m_1}, \quad x \equiv c_2 \pmod{m_2}, \quad \ldots, \quad x \equiv c_r \pmod{m_r}

유일성 증명

xxyy가 모두 연립 합동식을 만족한다고 하자. 그러면 각 ii에 대해

xci(modmi),yci(modmi)    mi(xy)x \equiv c_i \pmod{m_i}, \quad y \equiv c_i \pmod{m_i} \implies m_i \mid (x - y)

m1,,mrm_1, \ldots, m_r이 쌍으로 서로소이고 모두 (xy)(x-y)를 나누므로, 이들의 곱도 (xy)(x-y)를 나눈다.

m=m1mr(xy)    xy(modm)m = m_1 \cdots m_r \mid (x - y) \implies x \equiv y \pmod{m}

따라서 해는 mod m\bmod\ m에서 유일하다.

존재성 증명 — 구성 (Construction)

다음과 같이 변수를 정의한다.

Mi=mmi(mi를 제외한 나머지를 모두 곱한 값)M_i = \frac{m}{m_i} \quad \text{($m_i$를 제외한 나머지를 모두 곱한 값)}

MiM_imim_i는 서로소이다 (mim_i를 제외한 나머지의 곱이므로). 따라서 MiM_imod mi\bmod\ m_i 역원이 존재한다.

Ni=Mi1(modmi)(베주 항등식으로 계산)N_i = M_i^{-1} \pmod{m_i} \quad \text{(베주 항등식으로 계산)}

이제 다음을 해(解)로 정의한다.

x=i=1rciMiNi(modm)x = \sum_{i=1}^{r} c_i M_i N_i \pmod{m}

검증: jj번째 조건 xcj(modmj)x \equiv c_j \pmod{m_j}를 확인한다.

xmodmj=i=1rciMiNimodmjx \bmod m_j = \sum_{i=1}^{r} c_i M_i N_i \bmod m_j
  • iji \neq j인 항: Mi=m/miM_i = m/m_imjm_j가 인수로 포함되어 있으므로 Mi0(modmj)M_i \equiv 0 \pmod{m_j}. 해당 항은 사라진다.
  • i=ji = j인 항: MjNj1(modmj)M_j N_j \equiv 1 \pmod{m_j} (역원의 정의). 따라서 cjMjNjcj(modmj)c_j M_j N_j \equiv c_j \pmod{m_j}.
xcj(modmj)x \equiv c_j \pmod{m_j} \quad \checkmark
쉽게 말하면

CRT는 "여러 개의 작은 시계를 보고 하나의 큰 시계 시각을 알아내는 방법"이다. 서로소인 여러 수로 나눈 나머지들을 동시에 만족하는 수가 딱 하나 존재하고, 그 수를 명시적으로 구성할 수 있다. RSA에서는 이를 이용해 큰 수의 연산을 작은 수들의 연산으로 쪼개서 약 4배 빠르게 처리한다.

단계별 계산 예시

연립 합동식: x2(mod3)x \equiv 2 \pmod{3}, x3(mod5)x \equiv 3 \pmod{5}, x2(mod7)x \equiv 2 \pmod{7}

m=3×5×7=105m = 3 \times 5 \times 7 = 105

CRT 구성 계산표
CRT 구성 계산표

단계 1MiM_i 계산:

M1=1053=35,M2=1055=21,M3=1057=15M_1 = \frac{105}{3} = 35, \quad M_2 = \frac{105}{5} = 21, \quad M_3 = \frac{105}{7} = 15

단계 2NiN_i 계산 (베주 항등식 또는 직접 탐색):

352(mod3)    N1=21(mod3)=2(2×2=41)35 \equiv 2 \pmod{3} \implies N_1 = 2^{-1} \pmod{3} = 2 \quad (2 \times 2 = 4 \equiv 1) 211(mod5)    N2=11(mod5)=121 \equiv 1 \pmod{5} \implies N_2 = 1^{-1} \pmod{5} = 1 151(mod7)    N3=11(mod7)=115 \equiv 1 \pmod{7} \implies N_3 = 1^{-1} \pmod{7} = 1

단계 3 — 합산:

x=2352+3211+2151=140+63+30=233x = 2 \cdot 35 \cdot 2 + 3 \cdot 21 \cdot 1 + 2 \cdot 15 \cdot 1 = 140 + 63 + 30 = 233 233mod105=23233 \bmod 105 = 23

검증: 23=7×3+223 = 7 \times 3 + 2 ✓, 23=4×5+323 = 4 \times 5 + 3 ✓, 23=3×7+223 = 3 \times 7 + 2

연산 보존 성질

xx(c1,,cr)(c_1, \ldots, c_r)에, yy(d1,,dr)(d_1, \ldots, d_r)에 대응할 때, CRT 표현에서의 연산이 원래 연산을 보존한다.

x+y(c1+d1, c2+d2, , cr+dr)x + y \longleftrightarrow (c_1 + d_1,\ c_2 + d_2,\ \ldots,\ c_r + d_r) xy(c1d1, c2d2, , crdr)x \cdot y \longleftrightarrow (c_1 d_1,\ c_2 d_2,\ \ldots,\ c_r d_r)

즉, mm에 대한 큰 연산을 mim_i들에 대한 작은 연산들로 분해 할 수 있고, 결과를 다시 합칠 수 있다. 이것이 CRT 최적화의 핵심이다.

응용 — RSA-CRT 최적화

RSA 복호화는 m=cdmodnm = c^d \bmod n (n=pqn = pq)을 계산하는데, dd가 수백 비트이면 비용이 크다.

RSA-CRT 방법: n=pqn = pq (pp, qq 소수, gcd(p,q)=1\gcd(p,q)=1)일 때 CRT를 적용한다.

mp=cdp(modp),dp=dmod(p1)(페르마의 소정리 적용)m_p = c^{d_p} \pmod{p}, \quad d_p = d \bmod (p-1) \quad \text{(페르마의 소정리 적용)} mq=cdq(modq),dq=dmod(q1)m_q = c^{d_q} \pmod{q}, \quad d_q = d \bmod (q-1)

mpm_pmqm_q를 구한 뒤 CRT로 mmodnm \bmod n을 복원한다.

속도 향상 이유. 비용을 세려면 모형을 먼저 정해야 한다. 모듈러스가 \ell비트일 때 교과서 곱셈으로 모듈러 곱셈 한 번이 O(2)O(\ell^2)이고, 제곱·곱셈 방식은 지수의 비트 수만큼 곱셈을 돌린다. 지수도 \ell비트면 지수 연산 한 번은 O(3)O(\ell^3)이다.

RSA-CRT에서는 두 가지가 함께 반으로 줄어든다. 모듈러스가 nn에서 pp, qq로 바뀌어 /2\ell/2비트가 되고, 지수도 dd에서 d_p = d mod (p-1)로 바뀌어 /2\ell/2비트가 된다. 그래서 한 번의 비용이

\left( rac{\ell}{2} ight)^3 = rac{\ell^3}{8}

로 떨어진다. 이것을 두 번 하므로 합이 3/4\ell^3/4, 곧 원래의 1/41/4이다. 약 4배 가속은 여기서 나온다.

지수가 짧아지는 부분을 빼먹으면 각각 1/41/4에 두 번이라 1/21/2, 곧 2배밖에 되지 않는다. 두 몫이 함께 줄어드는 것이 핵심이다.

CRT로 다시 합치는 비용은 O(2)O(\ell^2) 수준이라 3\ell^3 앞에서 묻힌다. 다만 이 4배는 교과서 곱셈을 전제로 한 값이다. 곱셈에 더 빠른 알고리즘을 쓰면 지수가 달라져 배수도 달라진다.

핵심 정리
  • CRT는 쌍으로 서로소인 모듈러스들에 대한 연립 합동식이 mod m\bmod\ m에서 유일한 해를 가짐을 보장한다.
  • 유일성: 두 해의 차가 모든 mim_i의 배수이므로 mm의 배수 → mod m\bmod\ m에서 동일. 존재성: 구성적 증명으로 해를 명시적으로 구성한다.
  • 연산 보존 성질 덕분에 큰 모듈러스 연산을 작은 연산들로 분해·병렬화할 수 있다. 이것이 RSA-CRT의 수학적 근거다.
  • RSA-CRT는 n=pqn = pq 구조를 활용해 복호화 속도를 약 4배 향상시킨다. 모듈러스와 지수가 함께 절반이 되어 3\ell^3 비용이 1/81/8로 줄고, 그것을 두 번 하므로 1/41/4이다. 교과서 곱셈을 전제로 한 값이다.
다음 포스트

Find Prime — 소수 판별과 확률적 소수 탐색 — 소수 밀도 추정, Fermat 테스트의 한계, Witness와 Miller-Rabin 테스트까지 — RSA에서 큰 소수를 어떻게 찾는지 다룬다.

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