算法笔记 - 拉格朗日插值

\(k + 1\) 个点可以唯一确定一个 \(k\) 次多项式,很好证明,我们可以用这 \(k + 1\) 个点列出一个 \(k + 1\) 元一次方程,其中未知数为多项式的每项系数。

如果我们想要求出多项式 \(f(x)\) 在某一点 \(x'\) 上的值,我们大可以直接将方程列出,高斯消元即可,时间复杂度 \(O(n^3)\)

我们想要优化这个算法。准确来说,高斯消元并没有可以再优化的地方了,我们想要一些新的思路。

例题

事实上,如果我们只是关心多项式在 某一点 的值的话,我们并不用非要求出每一项系数都是什么。这启发我们通过求出 \(f(x')\) 在每一项的值,相加即可。

举个例子,例如 \(f(x) = a_2x^2+a_1x+a_0\),如果我们知道了 \(a_2(x')^2, a_1x', a_0\),相加可得 $f(x') =a_2(x')^2+ a_1x'+ a_0 $。

这启发我们枚举每一项作为要求出的项,然后对别的项构造一个都为 \(0\) 的解,这样我们对整个多项式做变换(乘/除),都不会影响在其他项的取值(即 \(0\))。

举个例子,例如我们有点 \((1, 1), (4, 5), (8, 1)\),我们此时选择 \((1, 1)\) 项作为要求出对应值的项,然后别的项,我们容易构造出 \(g(x) = (x - 4)(x - 8)\) 这样 \(x\)\(x = 4, x = 8\) 时都为 \(0\),我们可以放心的对整项做变换,且保持在 \(x = 4, x = 8\) 时多项式值仍然为 \(0\)

我们代入 \(x = 1\)\(g(1) = 21\) 于是我们令多项式变换为 \(g(x) = \dfrac{(x - 4)(x - 8)}{21}\) 这样在 \(x = 1\) 时即为 \(1\),再乘上 \(y_1 = 1\) 即可。

我们对剩下的项如法炮制,相加即得到了在某一位置的值。形式化的,我们有

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

code

posted @ 2023-11-09 07:58  Rainsheep  阅读(89)  评论(0编辑  收藏  举报