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

페르마 소정리 (Fermat's Little Theorem)

· 수정 · 📖 약 3분 · 962자/단어 #algorithm #math #flt #number-theory #modular-arithmetic
fermat little theorem, FLT, 페르마 소정리, fermat

정의

페르마 소정리 (Fermat’s Little Theorem, FLT) 는 소수 p 와 gcd(a, p) = 1 인 정수 a 에 대해 다음이 성립:

a^(p-1) ≡ 1 (mod p)

1640년 피에르 드 페르마가 발견, 1736년 오일러가 최초 증명.

동치 형태:

a^p ≡ a (mod p)      (gcd(a, p) = 1 불필요)

문제 상황과 동기

모듈러 역원 a^(-1) (mod p) 를 구하라. p = 10^9 + 7 은 소수.

  • naive (a·x ≡ 1 을 x = 1..p-1 순회): O(p). p=10^9+7 이면 불가능.
  • 확장 유클리드: O(log p). mod 소수 아니어도 범용.
  • FLT + 분할 정복 거듭제곱: O(log p). p 가 소수일 때 가장 단순.

핵심 통찰: a·a^(p-2) ≡ a^(p-1) ≡ 1 (mod p). 따라서 inv(a) ≡ a^(p-2) (mod p).

시각화

핵심 아이디어

잉여계의 순열

Z_p = {0, 1, 2, …, p-1} 에서 0 을 제외한 집합 {1, 2, …, p-1} 에 a 를 곱하면:

{1·a, 2·a, 3·a, ..., (p-1)·a}

이는 {1, 2, …, p-1} 의 순열 (permutation). 왜? a 가 p 와 서로소이므로 a·x ≡ a·y → x ≡ y (mod p) (소거 가능).

정리 증명

1·2·3·...·(p-1) ≡ (1·a)·(2·a)·...·((p-1)·a) (mod p)
(p-1)! ≡ (p-1)! · a^(p-1) (mod p)

(p-1)! 은 p 와 서로소이므로 양변 소거:

1 ≡ a^(p-1) (mod p)

모듈러 역원

a·a^(p-2) ≡ a^(p-1) ≡ 1 (mod p)
∴ inv(a) = a^(p-2) mod p

알고리즘

// 분할 정복 거듭제곱 O(log p)
mod_pow(base, exp, mod):
    result = 1
    while exp > 0:
        if exp & 1:
            result = (result * base) % mod
        base = (base * base) % mod
        exp >>= 1
    return result

// FLT 로 모듈러 역원
mod_inverse(a, p):    // p 는 소수
    return mod_pow(a, p - 2, p)

구현

// Fermat 소정리 + 분할 정복 거듭제곱
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll mod_pow(ll base, ll exp, ll mod) {
  ll result = 1;
  while (exp > 0) {
      if (exp & 1) result = (result * base) % mod;
      base = (base * base) % mod;
      exp >>= 1;
  }
  return result;
}

ll mod_inv(ll a, ll p) {
  return mod_pow(a, p - 2, p);  // FLT
}

int main() {
  ll a, p; cin >> a >> p;
  cout << a << "^(" << p << "-2) mod " << p << " = " << mod_inv(a, p) << "\n";
  cout << "verify: " << a << " * " << mod_inv(a, p) << " mod " << p << " = "
       << (a * mod_inv(a, p)) % p << "\n";
  return 0;
}
stdin
3 1000000007
결과
inv(3) mod 1000000007 = 333333336
verify: 3 * 333333336 mod 1000000007 = 1

복잡도

항목
시간O(log p) (분할 정복 거듭제곱)
공간O(1)
전제 조건p 는 소수, gcd(a, p) = 1

변형 / 활용

응용설명
모듈러 역원inv(a) = a^(p-2) mod p. 조합 nCr 에서 나누기 대체
이항 계수 (Lucas 정리)큰 nCr 을 작은 소수 mod 에서 FLT 로 factorial inverse
Miller-Rabin 소수 판별a^(d·2^s) ≡ 1 (mod n) 검사. FLT 의 역 활용
RSA 암호ed ≡ 1 (mod φ(n)). FLT(오일러 정리) 가 기반
Fermat 의 인수분해a^2 ≡ b^2 (mod n) → gcd(a-b, n)

함정

1. p 가 소수가 아닌 경우

FLT 가 성립하지 않음. 예: 2^(10-1) = 512 ≡ 2 (mod 10) ≠ 1. 오일러 정리 a^(φ(n)) ≡ 1 사용.

2. a 가 p 의 배수인 경우

a mod p = 0 이면 a^(p-1) ≡ 0 (mod p). 동치 형태 a^p ≡ a (mod p) 는 항상 성립 (0^p = 0).

3. p = 2

a^(1) ≡ 1 (mod 2) 는 홀수 a 에서 성립. 짝수면 a^(1) ≡ 0. 동치 형 a^2 ≡ a 는 항상 참.

4. 조합 inverse 전처리

nCr 을 많이 구할 때: factorial[n], inv_factorial[n] = factorial[n]^(p-2) 로 전처리. O(N + log p).

BOJ 연습 문제

번호제목정답률링크
BOJ 11401이항 계수 3(수집 안 됨)kokoa-lab
BOJ 16134조합 (Combination)(수집 안 됨)kokoa-lab
BOJ 13172Σ(수집 안 됨)kokoa-lab
BOJ 15791세진이의 미팅(수집 안 됨)kokoa-lab

참고

이 글의 용어 (5개)
모듈러 역원 (Modular Multiplicative Inverse)algorithm
정의 정수 a 의 모듈러 역원 (modular multiplicative inverse) 은 을 만족하는 정수 x. 기호로 또는 . 존재 조건: gcd(a, m) = 1 일 때만…
소수 판정 (Primality Test)algorithm
정의 소수 판정 (Primality Test) 은 주어진 정수 N이 소수인지 합성수인지 판별하는 알고리즘. 시행 나눗셈 (Trial Division) O(√N), 확률적 Ferm…
오일러 피 함수 (Euler's Totient Function)algorithm
정의 오일러 피 함수 φ(n) 는 1 이상 n 이하의 자연수 중 n 과 서로소인 수의 개수. 1763년 레온하르트 오일러가 도입. , 소수 p 에 대해 . 문제 상황과 동기 n …
중국인의 나머지 정리 (Chinese Remainder Theorem)algorithm
정의 중국인의 나머지 정리 (CRT) 는 다음과 같은 연립 합동식의 해가 유일 하게 존재함을 보장: 단, m1, m2, ..., mk 는 쌍마다 서로소 (pairwise copr…
확장 유클리드 호제법 (Extended Euclidean Algorithm)algorithm
정의 확장 유클리드 호제법 (Extended Euclidean Algorithm) 은 두 정수 a, b 에 대해 를 구하면서, 동시에 를 만족하는 정수 x, y 를 찾는 알고리즘…

💬 댓글

사이트 검색 / 명령어

검색

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