给定平面上的(n)个点,求一个(n - 1)阶多项式经过这些点……
我以前应该是只会(O(n^3))的高斯消元的……就是直接把方程列出来直接解的那种……
考虑拉格朗日插值法:
$$F=sum_{1 leq i leq n}y_iprod_{j eq i & 1 leq j leq n}frac{x-x_j}{x_i-x_j}$$
显然如果直接计算右边的式子可以得到一个(O(n^3))的做法,这不够优越……
注意到(prod_{j eq i & 1 leq j leq n}(x-x_j))的形式非常美妙,考虑分治:
若令:
$$P_i=frac{y_i}{prod_{j eq 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 eq 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))的,算法的瓶颈在多点求值上……
后面那个东西似乎没有什么卵用,虽然没有实现过但是总觉得常数非常大……
前面那个东西可以用来算幂级数的通项~