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

모듈러 산술 (Modular Arithmetic)

· 수정 · 📖 약 3분 · 846자/단어 #algorithm #math #number-theory #modular
modular-arithmetic, Modular Arithmetic, 모듈러 산술, 합동 관계, modular exponentiation, modular inverse, modular multiplication, mod 연산

정의

모듈러 산술 (Modular Arithmetic) 은 정수를 특정 수 으로 나눈 나머지 로 대응시켜 다루는 산술 체계입니다.

합동 관계 : 으로 나눈 나머지가 같음.

: (17시 = 오후 5시)

응용:

  • 정수론
  • 암호학 (RSA, ECDSA)
  • 해싱 (해시 함수)
  • 알고리즘 (경쟁 프로그래밍 mod 답)

왜 필요한가

  • 큰 수 관리: n! 등이 int64 초과 시 mod
  • 순환 구조: 시계, 요일
  • 역원 존재 (mod 소수): 나눗셈을 곱셈으로

기본 연산

, 이면:

나눗셈은 특수 (아래 modular inverse 참조).

코드

const long long MOD = 1e9 + 7;

long long addm(long long a, long long b) { return (a + b) % MOD; }
long long subm(long long a, long long b) { return ((a - b) % MOD + MOD) % MOD; }
long long mulm(long long a, long long b) { return (a * b) % MOD; }

주의: 뺄셈 시 음수 방지 위해 + MOD% MOD.

Modular Exponentiation (거듭제곱)

에.

Fast exponentiation (분할 정복):

a^n = \begin\{cases\} 1 & n = 0 \\ (a^\{n/2\})^2 & n \text\{ even\} \\ a \cdot a^\{n-1\} & n \text\{ odd\} \end\{cases\}
long long powm(long long base, long long exp, long long mod) {
    long long result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp & 1) result = result * base % mod;
        base = base * base % mod;
        exp >>= 1;
    }
    return result;
}

시간: .

Modular Inverse (역원)

을 만족하는 .

존재 조건: (서로소).

모듈러 나눗셈:

방법 1: 페르마 소정리 (mod 가 소수)

이 소수이면:

이유: 페르마 소정리 .

long long inv(long long a, long long m) {
    return powm(a, m - 2, m);   // mod 가 소수일 때만
}

가장 흔한 방법 (경쟁 프로그래밍 MOD = 10^9 + 7 은 소수).

방법 2: 확장 유클리드

이면 임의의 에.

long long extGcd(long long a, long long b, long long& x, long long& y) {
    if (b == 0) { x = 1; y = 0; return a; }
    long long x1, y1;
    long long g = extGcd(b, a % b, x1, y1);
    x = y1;
    y = x1 - (a / b) * y1;
    return g;
}

long long inv(long long a, long long m) {
    long long x, y;
    extGcd(a, m, x, y);
    return (x % m + m) % m;
}

자주 쓰는 문제

1. (이항 계수)

에 대해:

팩토리얼 미리 계산 + 역원:

const int MAXN = 1e6;
long long fact[MAXN + 1], invFact[MAXN + 1];

void precompute() {
    fact[0] = 1;
    for (int i = 1; i <= MAXN; i++) fact[i] = fact[i-1] * i % MOD;
    invFact[MAXN] = powm(fact[MAXN], MOD - 2, MOD);
    for (int i = MAXN - 1; i >= 0; i--) invFact[i] = invFact[i+1] * (i+1) % MOD;
}

long long binom(int n, int k) {
    if (k < 0 || k > n) return 0;
    return fact[n] * invFact[k] % MOD * invFact[n-k] % MOD;
}

2. 등비수열 합

mod 로 계산 시 을 역원으로.

Chinese Remainder Theorem (CRT)

여러 mod 조건을 만족하는 해:

\begin\{cases\} x \equiv a_1 \pmod\{m_1\} \\ x \equiv a_2 \pmod\{m_2\} \\ \vdots \end\{cases\}

가 서로소이면 유일한 해 (mod ) 존재. 자세한 것은 CRT 참조.

응용: 큰 mod 를 작은 mod 여러 개로 분할 (병렬 계산).

페르마 소정리 vs 오일러 정리

페르마: 소수, 이면 .

오일러 확장: 임의 , 이면 .

  • : 오일러 phi 함수 (자세한 것은 Euler Phi 참조)

Modular Multiplication 오버플로

long long 곱셈은 넘을 수 있음:

  • : a * b < 10^{18} < 2^{63} OK
  • : 오버플로

해결책:

  1. __int128 (GCC):
    long long mulm(long long a, long long b, long long m) {
        return (__int128)a * b % m;
    }
  2. Barrett reduction, Montgomery multiplication (고급)
  3. 두 배 분할:
    long long mulm(long long a, long long b, long long m) {
        long long result = 0;
        a %= m;
        while (b > 0) {
            if (b & 1) result = (result + a) % m;
            a = (a * 2) % m;
            b >>= 1;
        }
        return result;
    }

흔한 MOD

  • 10^9 + 7: 소수, int32 곱 시 오버플로 안 남. 대회 표준.
  • 10^9 + 9: 대안 소수
  • 998244353: NTT (Number Theoretic Transform) 친화 소수 ()
  • 2^61 - 1: 큰 소수 (해싱)

함정

WARNING

뺄셈 후 음수. (a - b) % MOD 는 음수 가능. ((a - b) % MOD + MOD) % MOD.

CAUTION

역원 존재 조건. 이면 역원 없음. mod 가 소수여야 대부분 케이스 안전.

WARNING

오버플로 in a * b. 가 큰 mod (10^18) 면 __int128 필수.

IMPORTANT

역원 반복 계산 X. 팩토리얼 역원은 뒤에서 앞으로 iteration 로 한 번에 (위 코드).

CAUTION

b == 0 나눗셈. 역원 구할 때 이면 없음.

관련 위키

이 글의 용어 (8개)
유클리드 호제법 (Euclidean Algorithm)algorithm
정의 유클리드 호제법 (Euclidean Algorithm) 은 두 정수 a, b 의 최대공약수 (GCD, Greatest Common Divisor) 를 O(log min(a,…
이산수학 (Discrete Mathematics)discrete-math
정의 이산수학 (Discrete Mathematics) 은 이산 (discrete, 셀 수 있는) 대상을 다루는 수학의 분야입니다. 연속 (continuous) 대상 을 다루는 …
조합론 기초 (Combinatorics)discrete-math
정의 조합론 (Combinatorics) 은 유한 집합의 원소를 세거나 배열하는 방법을 다루는 수학 분야입니다. "경우의 수 계산" 과 "구조의 존재/구성" 이 핵심 주제. 컴퓨…
중국인의 나머지 정리 (Chinese Remainder Theorem)algorithm
정의 중국인의 나머지 정리 (CRT) 는 다음과 같은 연립 합동식의 해가 유일 하게 존재함을 보장: 단, m1, m2, ..., mk 는 쌍마다 서로소 (pairwise copr…
페르마 소정리 (Fermat's Little Theorem)algorithm
정의 페르마 소정리 (Fermat's Little Theorem, FLT) 는 소수 p 와 gcd(a, p) = 1 인 정수 a 에 대해 다음이 성립: 1640년 피에르 드 페르…
확장 유클리드 호제법 (Extended Euclidean Algorithm)algorithm
정의 확장 유클리드 호제법 (Extended Euclidean Algorithm) 은 두 정수 a, b 에 대해 를 구하면서, 동시에 를 만족하는 정수 x, y 를 찾는 알고리즘…
Euler Phi Function: φ(n)algorithm
정의 Euler Phi Function φ(n) 은 1 이상 n 이하 정수 중 n 과 서로소 (gcd = 1) 인 정수의 개수입니다. 예시: - φ(1) = 1 (1은 모든 수와…
Pascal Triangle: 이항계수algorithm
정의 Pascal Triangle 은 각 원소가 위 두 원소의 합인 삼각형. 행 n, 열 k 의 원소가 이항계수 $\binom{n}{k}$. 이항계수 $\binom{n}{k}$:…

💬 댓글

사이트 검색 / 명령어

검색

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