玄学小记.4 ~ 多项式插值
给定平面上的\(n\)个点,求一个\(n - 1\)阶多项式经过这些点……
我以前应该是只会\(O(n^3)\)的高斯消元的……就是直接把方程列出来直接解的那种……
考虑拉格朗日插值法:
$$F=\sum_{1 \leq i \leq n}y_i\prod_{j\neq i \& 1 \leq j \leq n}\frac{x-x_j}{x_i-x_j}$$
显然如果直接计算右边的式子可以得到一个\(O(n^3)\)的做法,这不够优越……
注意到\(\prod_{j\neq i \& 1 \leq j \leq n}(x-x_j)\)的形式非常美妙,考虑分治:
若令:
$$P_i=\frac{y_i}{\prod_{j\neq i \& 1 \leq j \leq n}(x_i-x_j)} $$
$$G(l, r) = \prod_{l \leq j \leq r}(x-x_j)$$
$$H(l, r)=\sum_{l \leq i \leq r}P_i \prod_{j\neq i \& l \leq j \leq r}(x-x_j)$$
那么就有\(F=H(1, n)\)。
显然有转移$$G(l, r) = G(l, m) G(m + 1, r)$$ $$H(l, r) = H(l, m)G(m + 1, r) +G(l, m) H(m + 1, r)$$,其中\(m = \frac{l + r}{2}\)。
直接算所有\(P_i\)的复杂度为\(O(n ^ 2)\)。
暴力乘法的话分治部分的复杂度为\(T(n) = 2T(\frac{n}{2}) + O(n ^ 2)\),可得\(T(n) = O(n ^ 2)\)。
因此整个东西的复杂度是\(O(n ^ 2)\)的。
注意到\(P_i\)也是可以用一个类似的分治快速计算的,使用多点求值可以在\(O(n log^3n)\)的时间内求出。
后面的分治部分可以使用FFT优化以在\(O(n log^2n)\)的时间内得到。
因此整个东西的复杂度是\(O(n log^3n)\)的,算法的瓶颈在多点求值上……
后面那个东西似乎没有什么卵用,虽然没有实现过但是总觉得常数非常大……
前面那个东西可以用来算幂级数的通项~