문제
수열 \(a_0, a_1, \dots, a_{2k-1}\) 의 앞부분이 주어졌을 때, 이를 생성하는 최소 차수의 선형 점화식
$$ a_n = \sum_{i=1}^{L} c_i\, a_{n-i} $$
을 찾는다. 벌리캠프-매시(BM) 알고리즘은 이를 \(O(n^2)\) (필드 \(\mathbb{F}_p\) 위)에 구한다. 원래 LFSR(선형 되먹임 시프트 레지스터)의 최단 길이를 찾는 부호이론 알고리즘이지만, 경시에서는 "수열을 보고 점화식 역설계 → 키타마사로 먼 항" 콤보로 쓰인다.
점진적 갱신
앞에서부터 한 항씩 보며 현재 추정 점화식 \(C\) 를 유지한다. 항 \(a_i\) 에 대해 현재 점화식이 예측한 값과 실제 값의 차이를 discrepancy
$$ \delta = a_i - \sum_{j=1}^{L} c_j\, a_{i-j} $$
라 하자. \(\delta = 0\) 이면 현재 점화식이 이 항도 맞춘 것이라 그대로 둔다. \(\delta \ne 0\) 이면 점화식을 보정해야 한다.
보정 규칙
가장 최근에 길이를 늘렸던 시점의 점화식 \(B\) 와 그때의 discrepancy \(\delta_B\) 를 기억해 둔다. 보정은
$$ C \leftarrow C - \frac{\delta}{\delta_B}\, x^{\,(i - m)}\, B $$
형태로, \(B\) 를 적절히 시프트·스케일해 빼서 현재 항의 오차를 정확히 상쇄한다(\(m\) = \(B\) 를 마지막으로 저장한 인덱스). 이때 점화식 길이가 늘어나야 하면 (\(2L \le i\)) 길이를 \(L \leftarrow i+1-L\) 로 갱신하고 현재 \(C,\delta\) 를 새로운 \(B,\delta_B\) 로 저장한다.
최소성과 정확성
BM이 출력하는 점화식은 주어진 항들을 모두 만족하는 최단 LFSR임이 보장된다(Berlekamp–Massey 정리). 길이 갱신 조건 \(2L \le i\) 가 최소성을 강제한다. 입력이 길이 \(\ge 2L\) 이면 진짜 점화식을 정확히 복원한다. 따라서 안전하게 쓰려면 항을 점화식 차수의 두 배 이상 주어야 한다.
복잡도
| 단계 | 비용 |
|---|---|
| 항당 discrepancy + 보정 | \(O(L)\) |
| 전체 | \(O(nL) \le O(n^2)\) |