插值

即 离散的数据点 \(\rightarrow\) 连续的函数

一般给定 \(n+1\) 个点 \((x_i,y_i),1\le i\le n+1\),求 \(n\) 阶多项式 \(f(x)\) 满足 \(f(x_i)=y_i,\forall i=0,1,...,n\)

常见方法有 Lagrange 插值法 和 Newton 插值法,两者只是实现不同,结果是相同的

Lagrange 插值法

公式:

\[f(x)=\sum_{i=1}^n y_i\prod_{j\neq i}\frac{x-x_j}{x_i-x_j} \]

\(O(n^2)\) 求出

可以优化到 \(O(n\log^2n)\)

多项式的多点求值

给出一个多项式 \(f(x)\)\(n\) 个点 \(x_1,x_2,...,x_n\),求
\(f(x_1),f(x_2),...,f(x_n)\)

考虑分治

将点集分为 \(X_0=\{x_1,x_2,...,x_{\lfloor\frac n2\rfloor}\}\\X_1=\{x_{\lfloor\frac n2\rfloor+1},...,x_{n-1},x_n\}\)

构造 \(g_0(x)=\prod_{x_i\in X_0}(x-x_i)\)

则有 \(\forall x\in X_0:g_0(x)=0\)

\(f(x)\) 表示为 \(g_0(x)Q(x)+f_0(x)\),即 \(f_0(x)= f(x)\bmod{g_0(x)}\)

则有 \(\forall x\in X_0:f(x)=g_0(x)Q(x)+f_0(x)=f_0(x)\)\(X_{1}\) 同理。

问题的规模减半,可以使用分治 + 多项式取模解决

时间复杂度 \(O(n\log^2n)\)

多项式的快速插值

令多项式 \(M(x)=\prod_{i=1}^n(x-x_i)\),其系数可以分治 \(O(n\log^2n)\) 求出

\(O(n)\) 求出其导数 \(M'(x)\) 的系数

求出 \(M'(x_i),1\le i\le n+1\),多点求值可以做到 \(O(n\log^2n)\)

\[f(x) = \sum_{i = 1}^n\frac{y_i}{M'(x_i)}\prod_{j\neq i}(x-x_j) \]

\(v_i=\frac{y_i}{M'(x_i)}\),可 \(O(n)\) 求出

然后分治计算 f 的系数

\(n=1\) (即最后分治到的子区间长度为 \(1\))时,\(f(x)=v_1, M(x)=x-x_1\)

否则令

\[\begin{aligned} f_0(x)&=\sum_{i=1}^{\lfloor\frac n2\rfloor}v_i\prod_{j\neq i\land j\le\lfloor\frac n2\rfloor}(x-x_j)\\ M_0(x)&=\prod_{i=1}^{\lfloor\frac n2\rfloor}(x-x_i)\\ f_1(x)&=\sum_{i=\lfloor\frac n2\rfloor+1}^n v_i\prod_{j \neq i\land\lfloor\frac n2\rfloor<j\le n}(x-x_j)\\ M_1(x)&=\prod_{i=\lfloor\frac n2\rfloor+1}^n(x-x_i) \end{aligned}\]

其中 \(f_0,M_0\) 为左一半的结果,\(f_1,M_1\) 为右一半

则可推出 \(f(x)=f_0(x)M_1(x)+f_1(x)M_0(x),M(x)=M_0(x)M_1(x)\)

\(O(nlog^2n)\) 求出

总时间复杂度 \(O(nlog^2n)\)

横坐标是连续整数的 Lagrange 插值

假如已知 \(f(1),f(2),...,f(n+1)\),则可 \(O(n)\) 求出 \(f\)

公式:

\[f(x)=\sum_{i=1}^{n+1}(-1)^{n+1-i}y_i\cdot\frac{\prod_{j=1}^{n+1}(x-j)}{(i-1)!(n+1-i)!(x-i)} \]

预处理 \((x-i)\) 前后缀积、阶乘逆,然后代入即可 \(O(n)\) 求出

参考

  1. oi-wiki 插值
posted @ 2024-11-14 20:59  Hstry  阅读(21)  评论(0)    收藏  举报