본문으로 건너뛰기
김신건의 로그

정수론 (Number Theory)

· 수정 · 📖 약 5분 · 1,369자/단어 #algorithm #math #number-theory #gcd #modular
number theory, 정수론, 수론

정의

정수론 (Number Theory) 은 정수의 성질과 관계를 연구하는 분야. PS 에서는 약수/배수, 소수 (prime), 모듈러 연산, 유클리드 호제법, 확장 유클리드, 페르마/오일러 정리, 중국인의 나머지 정리 등이 핵심. 수천 년 역사, 그리스 시대 유클리드부터 근대 암호학까지.

문제 상황과 동기

정수의 구조적 성질 (나누어떨어짐, 소인수분해, 모듈러 역원) 을 빠르게 계산해야 한다.

  • naive: 모든 약수 나열 O(N), 소수 판정 O(√N) 시행착오.
  • 정수론 도구: GCD O(log N), 모듈러 역원 O(log MOD), 소수 판정 Miller-Rabin O(k log^3 N).

핵심 통찰: “곱셈과 나눗셈은 모듈러 세계에서 닫혀 있고, 역원이 존재하면 나눗셈 = 곱셈”. 암호학 (RSA, Diffie-Hellman), 해시 함수, 조합론 (nCr mod p), DP 등에 필수.

시각화

핵심 아이디어

1. GCD (최대공약수)

유클리드 호제법: gcd(a, b) = gcd(b, a mod b), base gcd(a, 0) = a. O(log min(a, b)).

gcd(48, 18) → gcd(18, 12) → gcd(12, 6) → gcd(6, 0) → 6

2. 확장 유클리드

ax + by = gcd(a, b) 의 정수해 (x, y) 를 구함. 모듈러 역원 계산에 핵심.

gcd(35, 15) = 5
35 · 1 + 15 · (-2) = 5

3. 모듈러 역원

a · a^(-1) ≡ 1 (mod M) 인 a^(-1). gcd(a, M) = 1 일 때만 존재.

  • 확장 유클리드: O(log M)
  • 페르마 소정리 (M 소수): a^(-1) ≡ a^(M-2) (mod M), 거듭제곱 O(log M)

4. 중국인의 나머지 정리 (CRT)

x ≡ a_1 (mod m_1), x ≡ a_2 (mod m_2) 를 만족하는 x. m_i 서로소 시 유일해 존재 (mod M = Π m_i).

5. 오일러 φ 함수

φ(n) = n 이하 n 과 서로소인 수의 개수. φ(p^k) = p^k - p^(k-1). 오일러 정리: a^φ(n) ≡ 1 (mod n) (gcd(a,n)=1).

알고리즘

gcd(a, b):
    while b ≠ 0:
        a, b = b, a mod b
    return a

extended_gcd(a, b):
    if b == 0:
        return (a, 1, 0)
    (g, x1, y1) = extended_gcd(b, a mod b)
    x = y1
    y = x1 - (a // b) * y1
    return (g, x, y)

mod_inverse(a, m):
    (g, x, _) = extended_gcd(a, m)
    if g ≠ 1:
        return None   # 역원 없음
    return (x % m + m) % m

fast_power(a, b, m):
    res = 1
    a = a mod m
    while b > 0:
        if b odd:
            res = (res * a) mod m
        a = (a * a) mod m
        b = b // 2
    return res

구현

// GCD, 확장 유클리드, 모듈러 역원, 거듭제곱
#include <bits/stdc++.h>
using namespace std;

long long gcd(long long a, long long b) {
  while (b) { long long t = b; b = a % b; a = t; }
  return a;
}

tuple<long long, long long, long long> extgcd(long long a, long long b) {
  if (b == 0) return {a, 1, 0};
  auto [g, x1, y1] = extgcd(b, a % b);
  return {g, y1, x1 - (a / b) * y1};
}

long long modinv(long long a, long long m) {
  auto [g, x, y] = extgcd(a, m);
  if (g != 1) return -1;   // 역원 없음
  return (x % m + m) % m;
}

long long power(long long a, long long b, long long m) {
  long long res = 1;
  a %= m;
  while (b > 0) {
      if (b & 1) res = res * a % m;
      a = a * a % m;
      b >>= 1;
  }
  return res;
}

int main() {
  long long a, b, m;
  cin >> a >> b >> m;
  cout << "gcd(" << a << ", " << b << ") = " << gcd(a, b) << "\n";
  cout << a << "^" << b << " mod " << m << " = " << power(a, b, m) << "\n";
  long long inv = modinv(a, m);
  if (inv == -1) cout << a << " has no inverse mod " << m << "\n";
  else cout << a << "^(-1) mod " << m << " = " << inv << "\n";
}
stdin
35 15 1000000007
결과
gcd(35, 15) = 5
35^15 mod 1000000007 = 590436101
35^(-1) mod 1000000007 = 142857145

복잡도

항목
GCDO(log min(a, b))
확장 유클리드O(log min(a, b))
모듈러 역원 (extgcd)O(log M)
모듈러 역원 (페르마)O(log M)
거듭제곱 (빠른 거듭제곱)O(log b)
소수 판정 (Miller-Rabin)O(k log^3 N) (k 반복)

변형 / 활용

1. 조합론 (nCr mod p)

nCr = n! / (r! (n-r)!) 를 mod p 로. factorial 미리 계산 + 모듈러 역원 → O(N + log p).

2. 이산 로그 (Discrete Log)

a^x ≡ b (mod m) 의 x 를 구함. Baby-step Giant-step O(√m).

3. RSA 암호

공개키 (e, N), 개인키 (d, N). c ≡ m^e (mod N), m ≡ c^d (mod N). 오일러 정리 기반.

4. Pollard rho

정수 N 의 소인수를 O(N^(1/4)) 에 찾는 확률적 알고리즘.

함정

1. 모듈러 역원 존재 조건

gcd(a, M) ≠ 1 이면 역원 없음. 확인 없이 나누기 쓰면 런타임 에러.

2. 페르마 소정리 조건

M 이 소수일 때만. 합성수면 오일러 정리 (a^φ(M)) 써야.

3. overflow

a * b mod M 계산 시 a, b < M 이어도 a*b 가 long long overflow. (__int128)a * b % M 또는 modmul.

4. 음수 mod

-5 % 3 가 C++ 에서 -2. (x % M + M) % M 로 양수 보장.

BOJ 연습 문제

번호제목정답률링크
BOJ 2609최대공약수와 최소공배수-kokoa-lab
BOJ 11401이항 계수 3 (nCr mod p)-kokoa-lab
BOJ 13172Σ (모듈러 역원)-kokoa-lab
BOJ 6591이항 쇼다운-kokoa-lab

참고

이 글의 용어 (4개)
수학 (Mathematics)algorithm
정의 수학 (Mathematics) 은 문제 해결에 필요한 모듈러 산술 (modular arithmetic), 최대공약수/최소공배수 (GCD/LCM), 거듭제곱 (exponent…
에라토스테네스의 체 (Sieve of Eratosthenes)algorithm
정의 에라토스테네스의 체 (Sieve of Eratosthenes) 는 1부터 N 까지의 모든 소수를 O(N log log N) 에 찾는 고대 그리스 알고리즘. 기원전 240 년…
중국인의 나머지 정리 (Chinese Remainder Theorem)algorithm
정의 중국인의 나머지 정리 (CRT) 는 다음과 같은 연립 합동식의 해가 유일 하게 존재함을 보장: 단, m1, m2, ..., mk 는 쌍마다 서로소 (pairwise copr…
Miller-Rabin 소수 판정 (Miller-Rabin Primality Test)algorithm
정의 Miller-Rabin 소수 판정 은 N 이 소수인지 확률적/결정론적으로 판별하는 알고리즘. Fermat 작은 정리와 이차잉여 성질을 결합해 O(k log^3 N) 에 동작…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기