모듈러 산술 (Modular Arithmetic)
정의
모듈러 산술 (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 - : 오버플로
해결책:
- __int128 (GCC):
long long mulm(long long a, long long b, long long m) { return (__int128)a * b % m; } - Barrett reduction, Montgomery multiplication (고급)
- 두 배 분할:
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}$:…
이 개념을 다룬 위키 페이지 (15)
- wikiMatrix Exponentiation: 선형 점화식 fast
- wiki수학 (Mathematics)
- wikiCarmichael Function λ(n)
- wiki중국인의 나머지 정리 (Chinese Remainder Theorem)
- wiki이산 로그 (Discrete Logarithm)
- wiki이산 제곱근 (Discrete Square Root / Tonelli-Shanks)
- wiki유클리드 호제법 (Euclidean Algorithm)
- wiki오일러 피 함수 (Euler's Totient Function)
- wikiEuler Phi Function: φ(n)
- wiki페르마 소정리 (Fermat's Little Theorem)
- wiki가우스 소거법 (Gaussian Elimination)
- wikiLifting The Exponent (LTE) Lemma
- wiki뤼카 정리 (Lucas Theorem)
- wikiMiller-Rabin 소수 판정 (Miller-Rabin Primality Test)
- wiki이산수학 (Discrete Mathematics)
💬 댓글