19강 / 20강
정수론 — 나머지의 세계
소수 · 최대공약수 · 합동, 그리고 암호
지금 3시인데 20시간 뒤는 몇 시일까요? 3 + 20 = 23, 그리고
23 mod 12 = 11 — 11시입니다. 우리는 이미 나머지의 세계에서 살고 있어요.
a ≡ b (mod m) 는 "a와 b를 m으로 나눈 나머지가 같다"는 뜻이고
합동이라고 읽습니다. 9강의 언어로 말하면 동치관계예요 —
정수 전체를 나머지에 따라 m개의 조각으로 분할합니다.
여기에 두 가지 재료가 더 들어갑니다.
- 소수 — 1과 자기 자신으로만 나눠지는 수. 정수의 원자입니다.
- 최대공약수 gcd — 두 수를 동시에 나누는 가장 큰 수.
합동은 동치관계이고, 동치관계는 집합을 분할합니다.
Python
브라우저에서 실행
🎮 시계와 유클리드 호제법
모듈러 계산을 시계 위에서 눈으로 보고, 유클리드 호제법이 어떻게 몇 걸음 만에 최대공약수를 찾아내는지 단계별로 따라가 보세요. 간단한 RSA 암호도 직접 돌려 볼 수 있습니다.
유클리드 호제법 — 2300년 된 알고리즘
gcd(a, b) = gcd(b, a mod b). 이 한 줄이 전부입니다.
큰 수를 작은 수로 나눈 나머지로 바꿔 가며 줄이면, 놀랍도록 빨리 끝나요.
gcd(1071, 462) → gcd(462, 147) → gcd(147, 21)
→ gcd(21, 0) = 21. 네 걸음입니다.
이것이 인류가 기록한 가장 오래된 알고리즘이고, 지금도 모든 암호 라이브러리 안에서 그대로 돌고 있습니다.
20자리 수의 gcd도 눈 깜짝할 사이에 구합니다.
Python
브라우저에서 실행
배수를 지워 나가면 소수만 남습니다.
Python
브라우저에서 실행
RSA — 곱하기는 쉽고 되돌리기는 어렵다
두 소수 61과 53을 곱하면 3233. 1초면 됩니다.
반대로 3233을 보고 두 소수를 찾으라면? 작은 수라 금방이지만,
600자리 소수 두 개의 곱이라면 지구의 모든 컴퓨터를 동원해도 못 풉니다.
이 한쪽으로만 쉬운 성질이 RSA 암호의 전부입니다. 공개키로 잠그고(누구나 곱할 수 있고), 비밀키로만 열 수 있어요(소인수를 아는 사람만).
pow(a, b, n) 은 모듈러 거듭제곱을 아주 빠르게 계산합니다.
Python
브라우저에서 실행
🤔 확인 문제
17 ≡ 5 (mod 6) 이 참인 이유는?해설 합동은 차가 m의 배수라는 뜻입니다 —
17 mod 6 = 5, 5 mod 6 = 5 로 나머지가 같아요. 나머지가 같은 수들끼리 묶는 동치관계입니다.🤔 확인 문제
gcd(48, 18) 을 유클리드 호제법으로 구하면?해설
gcd(48,18) → gcd(18,12) → gcd(12,6) → gcd(6,0) = 6. 나머지로 계속 바꿔치기하면 세 걸음 만에 끝납니다 — 소인수분해를 하지 않고도요.🤔 확인 문제
RSA 암호의 안전성이 기대고 있는 사실은?
해설 한쪽 방향으로만 쉬운 계산이 핵심입니다. 소수를 찾는 것 자체는 (에라토스테네스의 체나 소수 판정법으로) 오히려 빠릅니다 — 어려운 것은 이미 곱해진 것을 되돌리는 일이에요.