浅谈算法——拉格朗日插值

拉格朗日插值法:是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法(摘自某度百科)

首先我们需要知道,拉格朗日插值法有何用?



举例子永远是最好的方法

比如说,已知下面这几个点,我想找到一根穿过它们的曲线:

k+1个点是肯定可以确定一个k次函数的,因为待定系数法啊,然后我们假设函数为f(x)=a0+a1x+a2x2,然后我们就有

{y1=a0+a1x1+a2x12y2=a0+a1x2+a2x22y3=a0+a1x3+a2x32

可是可以,但是扩展性不强……毕竟考场上没有可以解多元一次方程的机子……手动推通解的话……呵呵

拉格朗日也是这样想的,但是他觉得:我可以通过三根二次曲线相加得到这个函数,那么是怎样的三根曲线嘞?

第一根曲线f1(x),满足f1(x1)=1,f1(x2)=f1(x3)=0

然后第二、三根曲线类似

我们可以发现

  • y1f1(x)可以保证,在x1处,取值为y1,其余两点取值为0
  • y2f2(x)可以保证,在x2处,取值为y2,其余两点取值为0
  • y3f3(x)可以保证,在x3处,取值为y3,其余两点取值为0

那么

f(x)=y1f1(x)+y2f2(x)+y3f3(x)

可以一一穿过这三个点

当函数不是二次,而是多次的时候,这个方法同样成立

于是前人根据这个方法,总结出了拉格朗日插值法的一般式,即

f(x)=i=0kyijixxjxixj

(因为1~k+1写起来很丑,所以这里写的是0~k,本质相同)

我们可以发现,任意代入一个xk,都必然有f(xk)=yk,过程留给读者自己推导

这样我们就可以在O(k2)的时间内求出f(x)


我们再来考虑一些特殊的情况,比如xi连续的情况

我们先把式子抄一遍

f(x)=i=0nyijixxjxixj

由于xi连续,所以我们可以把分子用前后缀积来表示

Pi=j=0i(xxj),Si=j=in(xxj)

然后分母可以写成阶乘的形式,式子变成

f(x)=i=0nyiPi1·Si+1(1)nii!(ni)!

那么我们就可以在O(k)的时间内算出f(x)的值了


至于一些应用,最常见的就是求i=1nik的值,也就是求幂和,根据这里的式子可以得到

Sk(n)=i=1nik=(n+1)k+1j=0k1(k+1j)Sj(n)1k+1

容易发现其为k+1次多项式,于是我们可以使用拉格朗日插值法

其中i[0,k+1]的取值我们用线筛,对于每个素数我们暴力快速幂,这部分时间复杂度为O(klnk·logk)=O(k)

所以总时间复杂度为O(k)

posted @   Wolfycz  阅读(3868)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示