插值
告诉你一个函数会经过 \(n\) 个点(\(n\)个点各不相同),然后让你计算其余几个位置的取值。(应该吧,个人理解)
一般情况下可能会用在一些数据统计中函数的拟合。(不然为什么会有这么多乱七八糟的拟合啊QAQ)
当然,这里主要涉及的是多项式插值,即利用经过这\(n\)个点的最高次项次数小于\(n\)的关于\(x\)的那个多项式,通过代入或者其他方法求出这几个位置的取值。
当然,这里给出一道模板题,在拉格朗日插值和牛顿插值时就是用这个模板题的。
当然,这种题目暴力用高斯消元也是能做的,可惜A不了,毕竟时间复杂度时\(O(n^3)\)
下文都认为给出的是\(n+1\)个点,点的标号从\(0\)开始,同时设第\(k\)个点为\((x_{k},y_{k})\)。
拉格朗日插值法
普通拉格朗日插值法
观察模板题和高斯消元,你会发现我们把这个多项式解出来真的太浪费啦。
有没有不用求出多项式也能求值的方法呢?
有!
拉格朗日发表了这么一个方法:
\(L(x)=\sum\limits_{i=0}^nℓ_{i}(x)y_{i}\)
其中\(ℓ_{i}(x)\)叫 拉格朗日基本多项式 ,\(L(n)\)叫 拉格朗日插值多项式 。
\(ℓ_{i}(x)=\prod\limits_{j=0,j≠i}^n\frac{(x-x_{j})}{(x_{i}-x_{j})}\)
这个多项式有个非常NB的性质(其实也非常显然)
就是\(ℓ_{i}(x)\)在\(x_{j}(j≠i)\)处为\(0\),在\(x_{i}\)处为\(1\)。
那么显然,\(L(x)\)经过这\(n\)个点。
这样,我们就只需要把\(k\)代入,就可以在\(O(n^2)\)的时间内求解了。
显然,我们节省的是求出这个多项式的时间。
当然,可以证明的是,这个拉格朗日插值多项式是唯一一个次数≤\(n\)的经过这\(n+1\)个点的多项式。
唯一性
假设存在两个\(n\)次多项式,都经过这\(n+1\)个点,假设这两个多项式为\(P_1,P_2\)
\(P_3=P_2-P_1\)
那么\(P_3\)显然\(≠0\)。
而且因为都经过\(n+1\)个点,所以有\(n+1\)个根,所以\(P_3\)的次数为\(n\)。
而且可以写成
那么\(P_{3}\)可以写成\(k\prod\limits_{i=0}^n(x-x_i)\)
但是这样次数是\(n+1\)的,显然不对,矛盾,证毕。
所以最多存在这样唯一一个多项式。
存在性
首先,不一定存在次数为 \(n\) 的多项式,举个例子:
\((1,1),(2,2),(3,3)\)就不能被一个二次方程经过。
当然,能经过这\(n+1\)个点的也不一定要是个次数大于\(0\)的多项式,比如你给\(n+1\)个\(y\)值相等的点,怎么可能存在一个\(n\)次多项式能够经过\(n+1\)个\(y\)值相同的点啊(因为这和一个多项式能有\(n+1\)个点的命题是等价的,这个命题先让错误,不然可以写成\((x-x_{i})\)的形式,证明这个形式次数大于\(n\))。
所以下面假定至少存在两个点 \(y\) 值不同。
在这个条件下,我们可以证明\(L(x)\)是一个次数大于\(0\)的多项式。
我们假设存在一组\(a_0,a_1,a_2,...a_{n+1}\)系数,使得:
\(P(x)=\sum\limits_{i=0}^na_{i}ℓ(i)=a_{n+1}\)
首先,因为\(ℓ_{i}(x)\)函数只有在\(x_{i}\)处为\(1\),其余\(x_{j}\)处都是为\(0\)的,所以显然\(P(x_{i})=a_{i}\),但是呢,这个函数的值又是恒定的,所以\(a_{0}=a_{1}=a_{2}=....=a_{n+1}\)。
又因为\(y_{i}\)并不相同,所以证毕。
代码
当然,这道题目我还是有🐎代码的。
时间复杂度\(O(n^2)\)
#include<cstdio>
#include<cstring>
#define N 2100
using namespace std;
typedef long long LL;
const LL mod=998244353;
inline LL ksm(LL x,LL y)
{
x%=mod;
LL ans=1;
while(y)
{
if(y&1)ans=ans*x%mod;
x=x*x%mod;y>>=1;
}
return ans;
}
LL n,k;
LL xx[N],yy[N];
void calc()
{
LL ans=0;
for(int i=0;i<=n;i++)
{
LL shit=1;
for(int j=0;j<=n;j++)if(i!=j)shit=(k-xx[j]+mod)*ksm(xx[i]-xx[j]+mod,mod-2)%mod*shit%mod;
ans=(shit*yy[i]+ans)%mod;
}
printf("%lld\n",ans);
}
int main()
{
scanf("%lld%lld",&n,&k);n--;
for(int i=0;i<=n;i++)scanf("%lld%lld",&xx[i],&yy[i]);
calc();
return 0;
}
当然,这样🐎是\(O(n^2\log{n})\)的,改进的方法也比较简单,分母乘起来最后求逆元就行了。
这样就可以到严格的\(O(n^2)\)了。
优点与缺点
这里直接照搬https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html的,因为我自己根本就不了解插值,OI中也基本上不会去处理数据拟合,下面是OI的貌似也不太需要的亚子。
拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。这时可以用重心拉格朗日插值法或牛顿插值法来代替。此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差(如右下图)。这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。
连续情况
当然,在给定的取值是连续的情况下(即等差数列),可以做到\(O(n)\)的插值。(当然,前提是你得花\(n\log{n}\)检验其是否是等差数列,当然,有时候是已知条件)
你可以通过函数的缩放,把\(x\)转变成:\(x_{i}=i\)的情况。
至于怎么做,照搬你谷日报:
而且,如果是在模运算的情况下,只要\(O(n)\)预处理逆元,也一样可以办到\(O(n)\)。
代码:
//你谷日报的代码
//当x_i=i时求L_n(k)
double L_n_k=0;
for (int i=1;i<=n;i++)
if ((n-i)%2) L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(-fac[i]*fac[n-i]));
else L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(fac[i]*fac[n-i]));
重心型拉格朗日插值法
Ⅰ型
总所周知,普通拉格朗日插值法在新增加一个点的时候就需要重新\(O(n^2)\)计算一下。(雾
不是,为什么啊(・∀・(・∀・(・∀・*),难道不是只要把\(ℓ_{i}(x)\)用数组存起来,计算不也是轻轻松松的事吗,当然,如果不用模运算的话时间复杂度是\(O(n)\),如果要用模运算,计算逆元的时间就比较久了,会到达\(O(n\log{n})\)。
如果是要另外求个点,求先把分子求出来,然后不断逆元乘法也能解决,复杂度跟上面同理。
为什么要\(O(n^2)\)。不过我没有去打代码验证
但是仔细想想上述的做法如果处理不好还是有一定弊端的,如果要另外求个点,而且是浮点数运算的话,这种做法可能掉精比较厉害,严重的可能精度直接起飞了,不过一般去到\(10^3\)一般也会加\(\mod{}\)运算吧,不过也很好解决,只要处理出现在分子和新的分子的比值再乘,那么掉精问题估计也就没有那么严重了。
额,认真的讲一下你谷博客中的\(Ⅰ\)型吧。
如果我们改变一下上述的式子:
\(L(n)=\sum\limits_{i=0}^ny_{i}\frac{\prod\limits_{j=0}^n(x-x_{i})}{(x-x_{i})\prod\limits_{j=0,i≠j}^n(x_{i}-x_{j})}\)
当然,这样插值的前提是要求\(x≠x_{i}\),否则式子就爆炸了啊。
设\(ℓ(x)=\prod\limits_{i=0}^n(x-x_{i}),w_{i}=\frac{y_{i}}{\prod\limits_{j=0,i≠j}^n(x_{i}-x_{j})}\)
那么\(L(n)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)
其中\(w_{i}\)叫做重心权。
同样的,这个可以支持\(O(n)\)撤销点,加入点。
同时也支持\(O(n)\)求另外一个点。
但是如果在模运算下,这些运算的复杂度统统都是\(O(n\log{n})\)的,我是真的没有找到这个东西到底有什么用,而且如果在非模运算下,这个做法求新的\(f(k)\)好像更加的容易掉精...,而且补救方法我也没有想到,除非直接像普通的那样维护,把\(ℓ(x)\)乘进\(\sum\)里面同时维护,好像就不太需要担心掉精问题了。
可能这一块内容就是为引出下一块内容准备的吧QAQ。
Ⅰ型具有向后稳定性。
Ⅱ型
我们插值一下\(f(x)=1\):
\(f(x)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)
然后用\(L(x)\)除\(f(x)\)。
\(L(x)=\frac{\sum\limits_{i=0}^ny_{i}\frac{w_{i}}{(x-x_{i})}}{\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}}\)
就得到了Ⅱ型。
当然,分母一般情况下是不为\(0\)的,同理也是要求\(k≠x_{i}\)
\(f(x)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}=1\)
所以\(\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)是绝对不为 \(0\) 的。
可以发现,这个式子不用去计算\(ℓ(x)\),计算也是比较方便,可以说是一个优势。
它的另一个优势是,结合切比雪夫节点(\(x_{i}=cos(\frac{(2i+1)\pi}{2(n+1)}),i∈[0,n]∩Z\))进行插值的话,可以很好地模拟给定的函数,使得插值点个数趋于无穷时,最大偏差趋于零。同时,重心拉格朗日插值结合切比雪夫节点进行插值可以达到极佳的数值稳定性。(这段话来自https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html)
Ⅱ型具有向前稳定性,并且勒贝格常数很小。
个人认为,复杂度其实也是类似\(Ⅰ\)型,但是在浮点数误差下,这个貌似更难去处理误差,只能硬生生的维护重心权\(w_{i}\),但是在\(n\)去到较大级别时,\(w_{i}\)要么太大,要么太小,都是难伺候的主啊,特别容易产生较大的精度误差,所以我也是没有找到这个的作用在哪。。。
小结
在OI中感觉这三种类型都差不多,其实,那些向前稳定和向后稳定我都不知道是什么,阿巴QAQ,OI中应该不会涉及这么一些东西。(上面那些专业术语都是看别人博客的QAQ)
而且这三种类型在OI中应该可以算是等价的了。
我还是用普通型的吧,告辞。
牛顿插值
差商是什么?
准确定义我反复读了三遍也没有看懂定义在阿巴什么,但是这里给出下面会用到的式子定义。
设\(f[x_0,x_1,...x_k]\)为\(f(x)\)的\(k\)阶差商。(所以我觉得 \(k\) 阶差商应该是有很多值的)
定义:\(f[x_0]=f(x_0)\)
\(f[x_{0},x_{1}...,x_{k}]=\frac{f[x_{1},x_{2}...,x_{k}]-f[x_0,x_1,x_2...,x_{k-1}]}{x_{k}-x_{0}}\)
同时要求\(x_{i}≠x_j(i≠j)\)(其实你可以发现如果把\(k\)阶差商全部展开成\(0\)阶差商并且不通分约分合并,你会发现对于任意的 \((x_{i}-x_{j})\) ,存在 \(k∈\){\(1,-1\)} 使得 \(k(x_i-x_j)\) 存在在某个分数的分母)。
那么\(f(x)=f[x]\)
\(\frac{f[x]-f[x_{0}]}{x-x_0}=f[x,x_0]\)
\(f[x]=(x-x_0)f[x,x_0]+f[x_0]\)
代回原式:\(f(x)=f[x_0]+(x-x_0)f[x,x_0]\)
由于计算\(f[x,x_0]\)仍然需要我们计算\(f(x)\)的值,所以我们继续像刚才一样展开:
\(f[x,x_0]=(x-x_1)f[x,x_0,x_1]+f[x_0,x_1]\)
\(f[x,x_0,x_1]=(x-x_2)f[x,x_0,x_1,x_2]+f[x_0,x_1,x_2]\)
...
然后不断的代回原式,直到出现\(f[x,x_0,x_1,x_2,...,x_{n+1}]\),此时停止展开,式子为:
\(f(x)=f[x,x_0,x_2,...,x_{n+1}]\prod\limits_{j=0}^{n}(x-x_i)+\sum\limits_{i=0}^nf[x_0,x_1,x_2,...,x_i]\prod\limits_{j=0}^{i-1}(x-x_i)\)
然后我们设\(R_n(x)=f[x,x_0,x_2,...,x_{n+1}]\prod\limits_{j=0}^{n}(x-x_i),N_{n}(x)=\sum\limits_{i=0}^nf[x_0,x_1,x_2,...,x_i]\prod\limits_{j=0}^{i-1}(x-x_i)\)
那么\(f(x)=N_{n}(x)+R_{n}(x)\)。
其中\(N_{n}(x)\)为牛顿插值公式,\(R_{n}(x)\)为插值余项。
而在插值的时候,我们忽略\(R_{n}(x)\),用\(N_{n}(x)\)的值表示\(f(x)\)
当然,至于正确性吗。
当然,为什么在展开到\(f[x,x_0,x_2,...,x_{n+1}]\)的时候就停下来了呢?
因为\(\prod\limits_{j=0}^{n}(x-x_i)\)已经是个\(n+1\)次数的多项式,已经没有用了,反正我们是用\(n\)次多项式拟合的,\(n+1\)次已经超了,直接扔掉。
但是目前的任务是确定\(N_{n}(x)\)是不是一个经过这\(n+1\)个点的多项式?(实际上拟合出来的多项式应该是和拉格朗日插值多项式是一模一样的)
当然,其实也特别好证明,因为\(R_{n}(x_i)=0\),所以\(f(x_{i})=N_{n}(x_{i})\)。
就证明完了,所以在求\(n\)次多项式拟合的时候,其实这两种插值法求出的多项式,我个人认为都没有什么区别好吧。
至于计算,可以直接用递推计算\(n\)阶差商的值,然后从左往右暴力硬推,处理好一点,应该可以做到空间上的\(O(n)\),但是时间上因为要用递推定义式计算,所以还是要\(O(n^2)\)。
但是呢,这个牛顿插值我个人认为最NB的东西也就在这,就是他同样可以做到\(O(n^2)\)的时间插出原来多项式的系数,而且是全部系数,只要多项式加乘即可,当然,其实拉格朗日用上多项式除法(都是只用乘除\(x+a\),非常的简单)同样可以办到一样的效果,其实这两个也没什么区别啦QMQ。
当然,比较鸡肋的是,如果你不花\(O(n^2)\)的空间记录下所有差商的信息,你会发现添点你做起来跟掐了 * 一样难搞,我个人认为搞不了,因为新的差商那也是真的难计算,当然,计算一个新的\(f(k)\)就只需要记录系数就行了,这个推起来还是挺简单的好吧。
当然,在牛顿插值中如果新增了一个点,那么只会增加一个项,这或许是优点,但是这个项的系数很难计算啊。
当然,其实还是有方法的,这个就要涉及到差商的通项公式了,这样只要记录通项公式中的分母,一样可以做到\(O(n)\)计算猛如虎,求新的点值在模意义下可以到达\(O(n)\),只要你\(O(n)\)记录系数,这个做法最妙的地方估计就是\(x\)不在分母位置,不用计算跟\(x\)有关的逆元,不过在模意义下,添加新点的代价依旧是\(O(n\log{n})\),没什么好说的。
但是呢,虽然新的点值可以到达\(O(n)\),但是与之相对的,如果是浮点数运算,在规模较大的情况下,系数的值可能会偏小,导致误差高涨,总之就是误差问题,如果不担心误差随便用好吧。
当然,扩展一下,这里介绍一下差商的性质。
差商的性质
公式
\(f[x_{0},x_1,x_2,x_3...,x_n]=\sum\limits_{j=0}^k\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^k(x_{j}-x_i)}\)
证明:
数学归纳法证明,当\(k=0\)时,显然成立。
当\(k>0\)时。
\(\frac{\sum\limits_{j=1}^{k+1}\frac{f(x_j)}{\prod\limits_{i=1,i≠j}^{n+1}(x_{j}-x_i)}-\sum\limits_{j=0}^k\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^k(x_{j}-x_i)}}{(x_{k+1}-x_0)}\)
对于\(j=k+1\),分母乘\((x_{k+1}-x_0)\)直接变成\(\frac{f(x_{k+1})}{\prod\limits_{i=0}^{n}(x_{k+1}-x_i)}\)
对于\(j=0\),分母乘\((x_{k+1}-x_0)\),可以把负号和这个合并,变成\((x_{0}-x_{k+1})\),于是和\(k+1\)一样,变成了\(k+1\)阶差商中应该有的样子。
对于\(j=[1,k]∩Z\)
\(\frac{f(x_j)}{\prod\limits_{i=1,i≠j}^{n+1}(x_{j}-x_i)}-\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^{n}(x_{j}-x_i)}=\frac{x_j(x_{k+1}-x_0)}{\prod\limits_{i=0,i≠j}^{n+1}(x_{j}-x_i)}\)
刚好除去\((x_{k+1}-x_0)\),同理也变成\(k+1\)阶差商的样子,归纳法证明完毕。
这个式子可以说明顺序在差商中是没有用的,差商具有对称性。
当然,我这里给出一个我认为正确的另外一种差商的计算式:
定义 \(c(A)\) 为这个集合的大小,集合 \(A\) 中的元素都是实数,如果集合\(A,B\)大小相同,且\(A,B\)中只有一个元素不同,那么\(A-B=x\)当且仅当\(x∈A且x∉B\)。(这里是我个人定义,请不要带到这篇博客以外的地方使用)
那么 \(f[A]\) 为 \(c(A)-1\) 阶差商,定义\(A_1,A_2\)为\(A\)的两个不同的大小为\(c(A)-1\)的子集,那么 \(f[A]=\frac{f[A_1]-f[A_2]}{(A_1-A_2)-(A_2-A_1)}\)
其实就是把定义式利用顺序不影响结果这一条结论改了一下而已QMQ
一个我不知道是什么的导数性质
对于\(f(x)\)的\(k\)阶差商,如果一个区间\([a,b]\)满足\(x_{i}(0≤i≤k)∈[a,b]\),且\([a,b]\)存在\(k\)阶导数,那么存在一个\(t∈[a,b]\),满足:
\(f[x_0,x_1,x_2,x_3...,x_t]=\frac{f^{(k)}(t)}{k!}\)
至于证明,学完微积分补,好吧。
当然,证明文档的链接放在参考文献中了,可以自行消化。
用处吗,不知道,就当扩展眼界了。
等距节点的牛顿插值
看这个也就图一乐好吧。
插值,其中\(x_{i}-x_{i-1}(i>0)\)是个定值,我们设其为\(h\)。
这个东西貌似也是只要根据等距的性质来,基本也不会有什么问题,不过如果你直接把其的节点缩放成\(x_{i}=i\),岂不美哉,这样就更加好处理了啊QMQ。
定义差分:
一阶前向差分:\(△f_{k}=f_{k+1}-f_{k},k=0,1,2,...,n-1\)
\(t\)阶前向差分:\(△^tf_{k}=△^{t-1}f_{k+1}-△^{t-1}f_{k}\)
一阶后向差分:\(∇f_{k}=f_{k}-f_{k-1},k=0,1,2,...,n-1\)
\(t\)阶后向差分:\(∇^tf_{k}=∇^{t-1}f_{k}-∇^{t-1}f_{k-1}\)
差分公式
差分公式:
\(△^tf_{k}=\sum\limits_{i=0}^t(-1)^iC_{t}^if(k+t-i)\)
\(∇^tf_{k}=\sum\limits_{i=0}^t(-1)^iC_{t}^if(t-i)\)
可能写错了
证明的话也是非常的简单,这里证明前向差分,后向差分类似证明。
回归到杨辉三角形:
\(△^tf_{k}\)
\(△^{t-1}f_{k+1}\) \(△^{t-1}f_{k}\)
\(△^{t-2}f_{k+2}\) \(△^{t-2}f_{k+1}\) \(△^{t-2}f_{k}\)
...
其实对于\(f(i)\)的系数就是所有从\(△^tf_{k}\)到达\(f(i)\)的路径方案的权值和。
那么一个路径方案的权值是多少呢?
一个路径从起点出发,权值为\(1\),如果往下走,乘\(1\),往右下走,乘\(-1\),最终得到的值为此方案的权值,又发现,往右下走列数\(+1\),所以方案的权值大小只与终点列数相关。
所以所有从\(△^tf_{k}\)到达\(f(i)\)的路径方案的权值都是一样的,要么\(1\),要么\(-1\),显然,为\((-1)^{t+k-i}\)。
至于系数,你可以发现,如果把每个值的系数算成绝对值,这就是一个活生生的杨辉三角形啊。
得证。
差商与差分的关系
等距节点差商与差分的关系:
那么有:
\(f[x_0,x_{1},...,x_{m}]=\frac{△^mf_0}{m!h^m}=\frac{∇^mf_m}{m!h^m}\)
至于证明,也是非常的简单,代入就可以轻松证明(这里证明前向差分,后向不证明了,类似):
计算对于\(f(x_{i})\)的系数。
那么值就等于:\(\frac{(-1)^{m-i}C_{m}^if(x_{i})}{m!h^m}\)
对比一下\(\frac{f(x_i)}{\prod\limits_{j=0,i≠j}^m(x_i-x_j)}=\frac{f(x_i)}{h^mi!(m-i)!*(-1)^{m-i}}\)
整理一下就发现两者一模一样。
牛顿前向插值公式
\(x_{i}=x_{0}+ih\)
设\(x=x_0+th\)(在模运算中,可以通过同余方程得到,在浮点数运算中,直接除法得到\(t\))
所以设\(w_{i}(x)=\prod\limits_{j=0}^{i-1}(x-x_j)=\prod\limits_{j=0}^{i-1}(t-j)h=h^i\prod\limits_{j=0}^{i-1}(t-j)\)
插值公式:
\(N_{n}(x)=f[x_0]+\sum\limits_{i=1}^nf[x_0,x_1...,x_i]w_{i}(x)\)
\(N_{n}(x_0+th)=f[x_0]+\sum\limits_{i=1}^n[\frac{△^if_{0}}{i!h^i}h^i\prod\limits_{j=0}^{i-1}(t-j)]=f[x_0]+\sum\limits_{i=1}^n[\frac{△^if_{0}}{i!}\prod\limits_{j=0}^{i-1}(t-j)]\)
貌似计算还是\(O(n^2)\)的,额,那好像还是没有太大用处。
插值余项就不算了,当然,后向插值公式也懒得搞了,这些都与OI没有太大关系,扩展到这里其实也就差不多了(其实就是我累了),有兴趣的可以在参考资料中自行进行学习,后续补一下导数性质的证明吧。
至于其余扩展的东西,等我大学无聊有时间学一下吧,现在学这么久与OI无关的东西已经很拖时间了,告辞。
小结
摘自https://blog.csdn.net/littlely_ll/article/details/71107092:
牛顿插值法优缺点
牛顿插值法的优点是计算较简单,尤其是增加节点时,计算只增加一项,这是拉格朗日插值无法比的。
缺点是仍没有改变拉格朗日的插值曲线在节点处有尖点,不光滑,插值多项式在节点处不可导等缺点。
摘自https://www.luogu.com.cn/blog/zhang-xu-jia/ji-zhong-cha-zhi-fang-fa-yang-xie
不过它比拉格朗日插值更好的是,它可以插出多项式的系数。当给出的节点等距时,使用差分能达到更优的效果,其计算更加简便。
不过我是真的没有看出来牛顿插值方便计算在哪了?(估计是我傻吧,只会口胡阿巴,望各位大佬指点一下我)
但是模意义求新的点值可以到\(O(n)\)是真的香好吧。
泰勒插值
基本就是阿巴过了。
已知函数在\(x_0\)处的\(i\)阶导数。\(0≤i≤k\)
\(0\)阶导数其实就是它的函数值。
求一个多项式满足这个条件。
泰勒展开随便搞。(当然,其实不用也可以,直接导数的定义也是可以处理的)
\(f(x)=f(x_i)+\sum\limits_{i=1}^n\frac{f^{(i)}(x_i)}{i!}(x-x_0)^i\)
然后就搞定啦。
时间复杂度:\(O(n^2)\)
应该是唯一的,且存在的。
你谷奆佬评价:
又慢,限制又多。
不过有的时候还是比较方便的。
多项式快速插值
也就是求一个小于\(n+1\)次的多项式经过给定的\(n+1\)个点。
要求输出多项式的系数。
高斯消元\(O(n^2)\),牛顿迭代\(O(n^2)\),但是还有更快的,想不到吧。
nlog^3做法
没🐎代码,后面补,现在更多学的是理论的东西。
其实就是分治,但是我不会QAQ。
学还是学得懂,就是比较阿巴。
同分治一样,把点拆分成\(0-\left \lfloor \frac{n}{2} \right \rfloor\)和\((\left \lfloor \frac{n}{2} \right \rfloor+1)-n\)的两个部分,分别命名为点集\(X_0,X_1\)。
设多项式\(A_0(x)\)是\(X_0\)的插值。
设\(P(x)=\prod\limits_{i=0}^{\left \lfloor \frac{n}{2} \right \rfloor}(x-x_i)\)。
那么我们可以得到:
\(A(x)=P(x)A_1(x)+A_0(x)\)。
\(A_1(x)\)是什么,看下去就知道了。
怎么求出\(A_1(x)\)呢?
\(y_i=P(x_i)A_1(x_i)+A_0(x_i)((\left \lfloor \frac{n}{2} \right \rfloor+1)≤i≤n)\)
\(A_{1}(x_i)=\frac{y_i-A_0(x_i)}{P(x_i)}\)
这样,我们就可以得到新的\(X_1\),而\(A_{1}(x)\)是这个新的\(X_{1}\)的插值多项式。
但是呢,这里有几个细节,首先是关于如何求出新的\(X_1\),原文没说,这里推测是用多项式多点求值(但是我不会QAQ),至于求\(P(x)\),分治一下就行了,将\((x-a)\)左右分成两半再用\(NTT\)乘起来,时间复杂度都是\(O(n\log^2{n})\)。
这样就可以完成多项式插值了。
于是就得到了这条式子:
\(T(n)=2T(\frac{n}{2})+n\log^2{n}\)
然后就可以得到时间复杂度是\(O(n\log^3{n})\),常数还有亿点点大。。。
参考文献
https://www.luogu.com.cn/blog/zhang-xu-jia/ji-zhong-cha-zhi-fang-fa-yang-xie
(讲真你谷初中生随便吊打我个高中生QAQ,我到现在都不会微积分)
https://blog.csdn.net/littlely_ll/article/details/71107092
https://wenku.baidu.com/view/568b7fbb336c1eb91b375df4.html
百度百科
https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html
https://www.docin.com/p-632016518.html
https://zhuanlan.zhihu.com/p/66793653
论如何在参考文献一坨的情况下学得一知半解的QAQ。
可恶,欺负我个不会微积分的人QAQ。
坑
补导数证明
补充你谷日报中提到的其余差分。
补充代码