문제
차수 \(k\) 의 선형 점화식
$$ a_n = c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k} $$
이 주어졌을 때 \(a_N\) (\(N\) 이 \(10^{18}\) 급)을 구한다. 행렬 거듭제곱이 \(O(k^3\log N)\) 인데, 키타마사법은 이를 \(O(k^2\log N)\) (다항식 곱셈을 FFT로 하면 \(O(k\log k\log N)\))으로 낮춘다.
핵심 통찰: 다항식 잉여
수열의 한 항은 초기항들의 선형결합으로 표현된다. \(x^n\) 을 점화식의 특성다항식
$$ f(x) = x^k - c_1 x^{k-1} - c_2 x^{k-2} - \cdots - c_k $$
으로 나눈 나머지
$$ x^n \equiv \sum_{i=0}^{k-1} r_i x^i \pmod{f(x)} $$
를 구하면,
$$ a_n = \sum_{i=0}^{k-1} r_i\, a_i $$
가 된다. 왜냐하면 \(x^k \equiv c_1 x^{k-1}+\cdots+c_k \pmod f\) 라는 관계가 정확히 점화식과 동형이기 때문이다. \(x\) 에 "한 칸 시프트" 연산을 대입하면 다항식 환 \(\mathbb{F}[x]/(f)\) 에서의 계산이 수열 항 계산과 일치한다.
\(x^N \bmod f\) 를 빠르게
\(x^N \bmod f\) 는 다항식 환에서의 거듭제곱이다. 이진 거듭제곱으로
$$ x^N = (x^{N/2})^2 \cdot x^{N \bmod 2} $$
를 따라가며, 매 단계 곱한 뒤 \(f\) 로 나눈 나머지(차수 \(
복잡도
| 곱/나눗셈 방식 | 한 단계 | 전체 |
|---|---|---|
| 단순 (\(O(k^2)\)) | \(O(k^2)\) | \(O(k^2\log N)\) |
| FFT/NTT | \(O(k\log k)\) | \(O(k\log k\log N)\) |
행렬 거듭제곱과의 관계
행렬 거듭제곱의 동반행렬(companion matrix)이 곧 \(\mathbb{F}[x]/(f)\) 에서의 곱 \(x\) 에 해당한다. 키타마사는 그 행렬을 명시하지 않고 다항식 산술로 같은 결과를 더 싸게 얻는다.