本文部分转载自:
有何用
板子:给出平面上n+1个点,求一条穿过这n+1个点的n次多项式,或这个多项式在另一个点处的值。
显然可以高斯消元求出每一项系数,然后输出/直接爆算。
其实拉格朗日插值有两种:朴素的,和重心拉个朗日插值。一般情况下,朴素的和高斯消元在求解第1问时复杂度没有区别,但是后者无论第几问都可以用(O(n^2))的复杂度爆艹高斯消元(O(n^3))。
以下全都介绍求多项式的方法。
直观理解
这里的是朴素插值。
比如说,已知下面这几个点,我想找到一根穿过它们的曲线:
首先显然可以用一个n次多项式经过,不保证第n项系数是否为0。
然后高斯消元告诉我们,这应该是一个二次曲线。
(y=a_0+a_1x+a_2x^2)
然后,显然可以解方程。
然而,如果不解方程呢?
拉格朗日发现,我们可以用三根二次函数相加得到我们要的函数。
第一个函数(f_1(x)),在(x=x_1)处值为1,在(x=x_2,x_3)处都为0。
第二个函数(f_2(x)),在(x=x_2)处值为1,其余两处值为0。
第三个函数(f_3(x)),在(x=x_3)处值为1,其余两处值为0。
现在我们考察 (y_1f_1(x)+y_2f_2(x)+y_3f_3(x)) 的性质。首先,它是一个二次函数。然后,它过这三个点。高斯消元告诉我们,这个函数就是唯一的二次函数 which(经过这三个点)。
形式化的表述
首先还是朴素插值。
假如有 (n+1) 个点,每个点形如 ((x_0,y_0),(x_1,y_1),(x_2,y_2),...) ,假设任意两个x都不相同,那么最后得到的多项式肯定是:
显然,这个式子计算连乘部分是n^2的(直接二项打开),总复杂度(O(n^3))。
而且,如果在原点集的基础上加一个点,它需要比较大的复杂度取更新。
以上是傻逼做法。
正常的做法应该是,发现每一个连乘的分子乘上一个二项式能变成一个统一的多项式,所以处理的时候直接用不需要的那个二项式去除那个多项式就行(下面的常数计算)。
P.S.:以上四行为第一次更新所更新的内容。初读可以忽略。
为了方便增加一个点的改进(正常做法)
令拉格朗日基本多项式
再令
可以得到
令重心权(w_j)为
就有
于是最后的多项式就是
对于这个公式,我们可以每次插入一个点,插一个点On,又因为除的项只有两项,可以手动讨论,因此最后统计(n^2),显然求出答案是(O(n^2))的。
只要求值
前面说过,如果只是求值,那么朴素的拉格朗日插值也能做到(O(n^2))。就是直接把要求的x带入上面一堆式子中的x即可。