Lagrange補間に関する記事です.

要約

$$ f(x) = \sum_{i = 0}^{k}\frac{ f(i) }{ (-1)^{k - i} \; i ! \; (k - i) ! } \cdot \frac{ 1 }{ x - i } \cdot \prod_{j=0}^{k} ( x - j ) $$

詳細

\( k \) 次多項式 $f(x)$ について,$x = 0, \ldots, k$ の値が,$f(0) = v_0, \ldots, f(k) = v_k$ と分かっているときに, $f(x)$ (の各係数) を決める方法. 連立方程式を解く方法だと,逆行列を計算する必要があるから,\( \Omega( k^3 ) \) になってしまうが, Lagrange補間だと,$O(k^2)$ で済む.

$I = \{0, \ldots, k\}$, $I_i = I \setminus \{ i \}$ とする.$i = 0, \ldots, k$ について,$k$ 次の多項式 $g_i(x)$ を, 次で定義する.

$$g_i(x) = \frac{ \prod \{ x - j \mid j \in I_i \} }{ \prod \{ i - j \mid j \in I_i \} } $$

$j = 0, \ldots, k$ について,

$$ g_i (j) = \begin{cases} 1 & \text{ if } i =j \\ 0 & \text{ if } i \neq j \end{cases}$$

であることに注意すると,

$$ f(x) = \sum_{i = 0}^{k} g_i(x)v_i $$

となることがわかる (左右両辺とも $k$ 次多項式で,$k+1$ 個の値が一致する).

$ g_i(x) $ の分母を $c_i$ と書くと,

$$ c_i = (-1)^{k - i} \; i ! \; (k - i) ! $$

であるから,これらは,事前に $k$ までの階乗を $O(k)$ で計算しておけば,$O(1)$ で求められる.

$g_i(x)$ の分子は,

$$ \frac{1}{x - i}\cdot\prod_{j=0}^{k} (x-j) $$

であるから,まず $\prod_{j=0}^{k} (x-j)$ を $O(k^2)$ で計算しておけば,各$i$について$O(k)$で,全体で$O(k^2)$で 計算できる.

AtCoder

AtCoder ABC137 F - Polynomial Construction は, Lagrange補間を用いて解ける. ただし,解説 に書かれている方法の方が簡単.