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

Lifting The Exponent (LTE) Lemma

· 수정 · 📖 약 4분 · 1,165자/단어 #algorithm #math #lte #number-theory #exponent
lte, lifting the exponent, LTE lemma

정의

Lifting The Exponent (LTE) 는 소수 p에 대해 v_p(a^n - b^n) 또는 v_p(a^n + b^n) 을 계산하는 정리. v_p(x)는 x의 p-진 값 (p로 나누어떨어지는 횟수).

1640년 페르마가 처음 사용했고, 현대 형태는 정수론 올림피아드에서 필수 도구.

문제 상황과 동기

큰 a^n - b^n에서 소수 p가 몇 번이나 나누는지 직접 계산: a^n은 지수 크기로 직접 계산 불가.

  • naive: a^n - b^n을 직접 계산. a=4, b=1, n=9에 대해 4^9 - 1 = 262143. p=3으로 나누기: 262143/3 = 87381, 87381/3 = 29127, 29127/3 = 9709. v_3 = 3.
  • LTE: v_3(4-1) = v_3(3) = 1, v_3(9) = 2. 합: 1+2 = 3. O(log n).

핵심 통찰: a^n - b^n의 p-진 값을 a-b의 p-진 값과 n의 p-진 값으로 분해.

시각화

핵심 아이디어

Case 1: p가 홀수, p | a-b, p ∤ a, p ∤ b

v_p(a^n - b^n) = v_p(a - b) + v_p(n)

증명 스케치: 수학적 귀납법으로 v_p(a^p - b^p) = v_p(a - b) + 1을 보이고, 일반 n에 대해 인수분해와 반복 적용.

Case 2: p = 2, 2 | a-b, a, b 홀수

v_2(a^n - b^n) = v_2(a - b) + v_2(a + b) + v_2(n) - 1   (n >= 1)

Case 3: p | a+b (a^n + b^n, n 홀수)

v_p(a^n + b^n) = v_p(a + b) + v_p(n)    (p 홀수, p | a+b, p ∤ a, p ∤ b)

핵심 공식

조건결과
p 홀수, p|a-b, p∤abv_p(a^n - b^n) = v_p(a-b) + v_p(n)
p=2, 2|a-b, a,b 홀수v_2(a^n - b^n) = v_2(a-b) + v_2(a+b) + v_2(n) - 1
p 홀수, p|a+b, p∤ab, n 홀수v_p(a^n + b^n) = v_p(a+b) + v_p(n)

알고리즘

// p-진 값 계산
v_p(x):
    cnt = 0
    while x % p == 0:
        cnt += 1
        x //= p
    return cnt

// LTE main
lte(p, a, b, n):
    if p == 2 and (a - b) % 2 == 0 and a % 2 == 1 and b % 2 == 1:
        return v_2(a - b) + v_2(a + b) + v_2(n) - 1
    if (a - b) % p == 0 and a % p != 0 and b % p != 0:
        return v_p(a - b) + v_p(n)
    if n % 2 == 1 and (a + b) % p == 0 and a % p != 0 and b % p != 0:
        return v_p(a + b) + v_p(n)
    // fallback: 직접 계산 (a^n - b^n) mod p^k
    return v_p(pow(a, n) - pow(b, n))

구현

// Lifting The Exponent Lemma
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int vp(ll x, int p) {
  int cnt = 0;
  while (x % p == 0) { cnt++; x /= p; }
  return cnt;
}

ll modpow(ll a, ll n, ll mod) {
  ll r = 1;
  while (n) {
      if (n & 1) r = r * a % mod;
      a = a * a % mod;
      n >>= 1;
  }
  return r;
}

int lte(int p, ll a, ll b, ll n) {
  if ((a - b) % p != 0) {
      if (n % 2 == 1 && (a + b) % p == 0 && a % p != 0 && b % p != 0)
          return vp(a + b, p) + vp(n, p);
      return 0;
  }
  if (a % p == 0 || b % p == 0) return 0;
  if (p == 2) {
      if (a % 2 == 0 || b % 2 == 0) return 0;
      return vp(a - b, 2) + vp(a + b, 2) + vp(n, 2) - 1;
  }
  return vp(a - b, p) + vp(n, p);
}

int main() {
  int p; ll a, b, n;
  cin >> p >> a >> b >> n;
  int ans = lte(p, a, b, n);
  cout << ans << "\n";
  // verify
  ll mod = 1;
  for (int i = 0; i < ans + 2; i++) mod *= p;
  ll diff = (modpow(a, n, mod) - modpow(b, n, mod) + mod) % mod;
  int act = vp(diff, p);
  cout << "v_p(a^n-b^n) = " << act << "\n";
}
stdin
3 4 1 9
결과
3
v_p(a^n-b^n) = 3

복잡도

항목
LTE 판정O(log_p(min(a,b)) + log n)
v_p 계산O(log_p x)
검증 (분할 정복 거듭제곱)O(log n)
공간O(1)

변형 / 활용

1. a^n + b^n (n 홀수)

p | a+b, p ∤ a, p ∤ b, n 홀수이면 v_p(a^n + b^n) = v_p(a+b) + v_p(n).

2. a^n - b^n where p | a-b but p | a

p가 a나 b를 나누면 조건 불충족. 다른 소인수 분석 필요.

3. 연립 LTE

여러 소인수에 대해 각각 LTE 적용 후 곱. 예: m = product of p_i^(e_i) 에 대해 m | a^n - b^n 조건.

함정

1. p가 a나 b를 나누는 경우

p | a이면 LTE 적용 불가. 직접 계산 또는 다른 소수 분석.

2. p = 2 특수 케이스

p=2에서는 일반 공식과 달라짐. v_2(a+b) 항이 추가로 필요.

3. 부호 반전

a^n - b^nb^n - a^n의 v_p는 같음. 단 n이 짝수면 a^n - (-b)^n 주의.

4. n이 p의 배수일 때

v_p(n)이 커질 수 있으므로 v_p(n) 계산에 overflow 주의.

BOJ 연습 문제

번호제목정답률링크
BOJ 11867수학을 너무 못해(수집 안 됨)kokoa-lab
BOJ 18291비요뜨의 징검다리 건너기(수집 안 됨)kokoa-lab
BOJ 20302민트 초콜릿(수집 안 됨)kokoa-lab
BOJ 11691LCM(수집 안 됨)kokoa-lab

참고

이 글의 용어 (4개)
모듈러 역원 (Modular Multiplicative Inverse)algorithm
정의 정수 a 의 모듈러 역원 (modular multiplicative inverse) 은 을 만족하는 정수 x. 기호로 또는 . 존재 조건: gcd(a, m) = 1 일 때만…
소인수분해 (Prime Factorization)algorithm
정의 소인수분해 (Prime Factorization) 는 양의 정수 N을 소수들의 곱으로 유일하게 나타내는 것. N = p₁^a₁ · p₂^a₂ · ... · pₖ^aₖ. 시행…
유클리드 호제법 (Euclidean Algorithm)algorithm
정의 유클리드 호제법 (Euclidean Algorithm) 은 두 정수 a, b 의 최대공약수 (GCD, Greatest Common Divisor) 를 O(log min(a,…
페르마 소정리 (Fermat's Little Theorem)algorithm
정의 페르마 소정리 (Fermat's Little Theorem, FLT) 는 소수 p 와 gcd(a, p) = 1 인 정수 a 에 대해 다음이 성립: 1640년 피에르 드 페르…

💬 댓글

사이트 검색 / 명령어

검색

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