浅谈拉格朗日插值
1. 多项式插值定理
我们知道,两点可以确定一条直线(一次多项式),而三点可以确定一条二次函数,四点可以确定一个三次函数 ......
这不由得让我们产生思考——给定 个点,是否有一个唯一的 次多项式过这所有点呢?答案是肯定的,这个定理被称作 多项式插值定理,证明见 *
一节 .
注意做题时必须确定答案是多项式才能插值,比如对非常平稳的一组点做插值时:
,,,,,,,,,,[表情]
2. 插值方法
由于多项式插值定理的存在,我们下面研究一个问题:给定 个点 ,求一个多项式 使得 .
0. 暴力(Get 0 Points)插值
和多项式插值定理的证明差不多,高斯消元解方程组即可,时间复杂度 .
当然也可以用 Cramer 法则求出解的表达式然后解行列式,也是 的,但是常数会高一些
1. 拉格朗日(Lagrange)插值
1. 朴素做法
考虑构造 个多项式 ,使得 ,且对于任意 有 ,然后 即是所求多项式 .
构造这个 ,可以令 ,这样 只取 ,那么自然满足条件 .
令 为
即可,当 时,每项都是 ,当 时,一定有一项使得分子为 .
所以我们就得到了拉格朗日插值公式:
上面设的 称做拉格朗日基本多项式(插值基函数), 叫做拉格朗日插值多项式 .
下面给出模板题 洛谷 P4781 的代码:
ll ans=0,x[N],y[N];
int n,k;
ll qpow(ll a,ll n)
{
ll ans=1;
while (n)
{
if (n&1) ans=ans*a%MOD;
a=a*a%MOD; n>>=1;
} return ans%MOD;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%lld%lld",x+i,y+i);
for (int i=1;i<=n;i++)
{
ll P=1,Q=1;
for (int j=1;j<=n;j++)
if (i!=j){P=P*(k-x[j])%MOD; Q=Q*(x[i]-x[j])%MOD;}
ans=(ans+y[i]*P%MOD*qpow(Q,MOD-2)%MOD)%MOD;
} printf("%lld",(ans%MOD+MOD)%MOD);
return 0;
}
这里因为是模 意义下的,所以用了逆元 .
其截断误差由如下定理得出
若 , 是 在区间 上 个不同点 上的次数不超过 的插值多项式,则对每个 都存在 满足:
证明见 *
一节 .
注意到利用定理估计截断误差实际上很困难,一是因为上式要计算 高阶导数,二是 的位置不确定 .
若有 组数据,前 个做一次插值,后 个做一次插值,然后相减化一下式子即可获得比较实用的公式 .
2. 当 连续时的更优做法
不妨加上 ,则有
维护 的前缀积,后缀积和阶乘即可 .
3. 重心拉格朗日插值
注意到每次新加入一个点的时候要重新插值,如果要多次增加点,拉格朗日插值就 gg 了 .
先看一下前面的式子
设
则
发现只有 是变化的,则令
从而
每次加点时 算出 即可求出新的 .
3. 快速插值
1. 插值
咕
2. 插值
咕
3. 插值
咕
4. 一些例题
1. 自然数 次方和
给定 ,求 对 取模的结果 .
先对 一定的序列差分,然后发现是 次的,所以原式是 次的,取 跑拉格朗日插值即可 .
typedef long long ll;
const int N=2e6+5,MOD=1e9+7;
ll pre[N],suf[N],fac[N],n,k;
ll qpow(ll a,ll n)
{
ll ans=1;
while (n)
{
if (n&1) ans=ans*a%MOD;
a=a*a%MOD; n>>=1;
} return ans%MOD;
}
int main()
{
scanf("%lld%lld",&n,&k); pre[0]=suf[k+3]=fac[0]=1;
for (int i=1;i<=k+2;i++) pre[i]=pre[i-1]*(n-i)%MOD;
for (int i=k+2;i>=1;i--) suf[i]=suf[i+1]*(n-i)%MOD;
for (int i=1;i<=k+2;i++) fac[i]=fac[i-1]*i%MOD;
ll tmp=0,ans=0;
for (int i=1;i<=k+2;i++)
{
tmp=(tmp+qpow(i,k))%MOD;
ll P=pre[i-1]*suf[i+1]%MOD,Q=fac[i-1]*((k-i)&1?-1:1)*fac[k+2-i]%MOD;
ans=(ans+tmp*P%MOD*qpow(Q,MOD-2)%MOD)%MOD;
} printf("%lld\n",(ans+MOD)%MOD);
return 0;
}
*. 有关定理的证明
1. 多项式插值定理
若 是不同实数,则对任意实数 存在唯一的次数最多是 次的多项式 满足 .
Proof:
设 ,则有
以 做变量,则其系数行列式
这一步是由于其系数行列式为转置的范德蒙德(Vandermonde)行列式。又由于 Cramer 法则,因其系数行列式不等于 ,从而方程有唯一解,即多项式存在且唯一 .
2. 多项式插值误差定理
若 , 是 在区间 上 个不同点 上的次数不超过 的插值多项式,则对每个 都存在 满足:
Proof:
若 ,上式显然成立 .
否则令 ,其中 ,
显然 至少有 这 个不同的根,由罗尔定理, 至少有一个零点 ,形式化的,有从而,有
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/14489028.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】