拉格朗日插值法求系数

适用情况:

  • 用不了 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)\)

posted @ 2026-01-29 17:01  XiaoZi_qwq  阅读(4)  评论(0)    收藏  举报