拉格朗日插值法求系数
适用情况:
- 用不了 NTT。(没有原根)
- 时间复杂度允许 \(O(n^2)\) 的算法。
考虑拉格朗日插值法到底在干什么。在插值的时候其实本质上是分成了两步:
\[\begin{aligned}
f(x)&=\sum_{i=0}^ny_il_i(x)\\
l_i(x)&=\prod_{0\le j\le n,j\neq i}\dfrac{x-x_i}{x_i-x_j}
\end{aligned}
\]
如果暴力展开 \(l_i(x)\),那么就可以有 \(O(n^3)\) 的做法。
注意到如果没有 \(j\neq i\) 的限制,那么每一个 \(l_i(x)\) 的分子的多项式都一样。也就是说,构造 \(g(x)=\prod_{0\le i\le n}(x-x_i)\),那么有:
\[l_i(x)=\dfrac{g(x)}{x-x_i}\times\prod_{0\le j\le n,j\neq i}\dfrac{1}{x_i-x_j}
\]
其中右边的部分是常数,关键是左边部分怎么快速求出。
不妨认为 \(g(x)=\sum_{i=0}^na_ix^i\),商多项式为 \(f_i(x)=\sum_{i=0}^{n-1}b_ix^i\)。(因为一定可以整除,所以不考虑余数)
类似算常数的除法,从高位到低位考虑:首先 \(b_{n-1}=a_n\),然后将 \(g(x)\) 减去 \(b_{n-1}x^{n-1}(x-c)\),这样 \(g(x)\) 中的 \(a_n=0,a_{n-1}=b_nc+a_{n-1}\),变成关于 \(n-1\) 次多项式 \(g'(x)\) 的子问题。
这么计算除法的时间复杂度为 \(O(n)\),于是计算 \(l_i(x)\) 系数的时间复杂度为 \(O(n)\),预处理 \(g(x)\) 时间复杂度 \(O(n^2)\)。总时间复杂度 \(O(n^2)\)。

浙公网安备 33010602011771号