首页 > 其他分享 >拉格朗日插值法

拉格朗日插值法

时间:2023-01-12 20:11:06浏览次数:53  
标签:拉格朗 limits 插值法 多项式 ll ne times prod

概述

  • 拉格朗日插值法(下简称拉插)是一种多项式单点求值的算法。

  • 对于任意的 \(K\) 次多项式,我们可以利用其已知的 \(K+1\) 个或更多的点唯一确定该多项式的形式,且拥有比高消更为优秀的复杂度。

实现原理

  • 在已知 \(K\) 次多项式 \(f(x)\) 的 \(K+1\) 个点后,我们可以利用 Gauss 消元来 \(O(K^3)\) 地求出其各项系数,查询复杂度则是 \(O(K)\)。注意到明显的不平衡,设法设计一种方式能 \(O(K^2)\) 之类地同时支持构建和查询。

  • 不妨记已知点为 \((k,v)\),考虑构建这么一个多项式:\(f(x)=\sum\limits_{i=1}^{K+1} v_i\times g_i(x)\),使得 \(g_i(x)=\begin{cases} 1 & x=k_i\\ 0 & otherwise\end{cases}\)。

  • 可以证明该函数符合已知的 \(K+1\) 个点,于是其唯一确定,从而该函数即为原函数。

  • 考虑 \(g\),可以这么配 \(g\):\(g_i(x)=\prod\limits_{j\ne i}^{} \dfrac{x-k_j}{k_i-k_j}\)。目的在于使得 \(x=k_i\) 时,分子分母全部互相消去, \(x\ne k_i\) 时,有一项分子为 \(0\) 的效果。

  • 综合得 \(f(x)=\sum\limits_{i=1}^{K+1} v_i \times \prod\limits_{j\ne i}^{} \dfrac{x-k_j}{k_i-k_j}\) ,可以在 \(n^2\) 的时间内求值,并且可以在模意义下进行。

  • 一个小 tip:把一个 \(K\) 次多项式认为成 \(K+?(?\geqslant0)\) 次多项式是合法的,因为这相当于高次项系数赋成 \(0\)。在不是很确定到底是多少次的时候,强烈建议 \(+7/+10/...\),以防由于前缀和/差分/...带来的升次而挂掉。

连续性拉插优化

  • 在我们自行构造的多项式中,可以考虑将 \(k\) 取连续的 \(1\sim n\)。此时会有非常美妙的性质:

  • 原式可以化为 \(f(x)=\sum\limits_{i=1}^{k+1} v_i\times \dfrac{\prod\limits_{j\ne i}^{} x-j}{\prod\limits_{j\ne i}^{} i-j}\) 。

  • 对于分子,可以 \(O(n)\) 求前缀积与后缀积;

  • 对于分母,显而易见它是一个类阶乘 \((i-1)!\times (-1)^{K+1-i}\times (K+1-i)!\) 。进一步地,其逆元是可以预处理的。

  • 所以能把 \(O(n^2)\) 优化到 \(O(n)\),比较常见的用法是在确保是多项式的 dp 中加速求解,如 P5469 [NOI2019] 机器人

  • 下面给出优化版本的封装函数式代码,其中 \(K\) 为多项式次数,\(k\) 为所求点。

il ll lagrange(ll K,ll k){
	static ll prof[maxk],prob[maxk],numer,denom,ret;//prod
	prof[0]=prob[K+2]=1,ret=0;
	for(ll i=1;i<=K+1;++i) prof[i]=prof[i-1]*(k-i)%mod;
	for(ll i=K+1;i;--i) prob[i]=prob[i+1]*(k-i)%mod;
	
	For(i,1,K+1){
		numer=prof[i-1]*prob[i+1]%mod; if(numer<0) numer+=mod;
		denom=finv[i-1]*finv[K+1-i]%mod;
		if((K+1-i)&1 && denom) denom=mod-denom;//需要考虑 denom=0 的情况
		ret=(ret+v[i]*numer%mod*denom)%mod;
	}
	return ret;
}

标签:拉格朗,limits,插值法,多项式,ll,ne,times,prod
From: https://www.cnblogs.com/weixin2024/p/17047815.html

相关文章

  • 拉格朗日插值
    连续的取点,时间复杂度\(O(n)\)模板#include<iostream>#include<cstdio>usingnamespacestd;constintN=60,MOD=998244353;intn,k,fac[N],inv[N],pows[......
  • 数值分析·学习 | 拉格朗日插值法matlab实现
    ​目录前言一、拉格朗日(Lagrange)插值是什么?二、matlab实现代码1.线性插值:2.抛物线插值:3.拉格朗日(Lagrange)插值:总结:前言本篇内容为个人所学知识分享一、拉格朗......
  • 数值分析·学习 | 牛顿插值法matlab实现
     目录前言一、牛顿插值法是什么?1.均差下的牛顿插值2.为了给出​编辑的表达式,引入均差的概念3.差分形式的牛顿插值公式(牛顿前插公式)三、matlab实现代码1.生成牛顿均......
  • 拉格朗日插值求系数
    拉格朗日插值求系数设有\(n\)个点,坐标为\((x_i,y_i)\),现在要求解它们所够成的\(n-1\)次多项式\(F(x)\)的系数.先回顾一下一般拉格朗日插值:定义\[f_i(x)=\begin{case......
  • 拉格朗日反演学习记录
    \(\texttt{updating……}\)多项式复合对于多项式\(F(x),G(x)\),其复合为:\(F(G(x))=\sum_{i}[x^i]F(x)G(x)^i\)求法:设\(B=\sqrtn\)\[\begin{aligned}\sum_{i=0}^n[x......
  • 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
    ​​DARKNET中使用的缩放算法是双线性内插值法,这里就实际验证一把DARKNET中scale的工作原理与效果:首先这是一张原图,画面中的是南京明城墙玄武门,玄武湖的正门。18年国庆带娃......
  • 使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)
    上次我们开始进行数字图像处理这门课程的实验,直到现在才抽空出来写写文章,记录一下知识点。介绍一下,使用Matlab对数字图像的简单处理。1、 读取与显示输入图像:%输入图像和显......
  • 数值分析实验6:多项式插值(牛顿、拉格朗日)
    数值分析第二章实习题第一题 拉格朗日插值test.m程序:functionyy=test(x,y,xx)n=length(x);m=length(y);ifn~=m   error('x和y的维数必须相同');   r......
  • 关于泰勒展开拉格朗日余项中值点的渐进性
    之前学拉格朗日中值定理的时候做到一道涉及到特定函数中值渐进性的题,感觉似乎有一般的结论,推广了一下就是这样了。感谢刘导拯救\(n=1\)都不会证的我,感谢王佬指出这是中......
  • 使用插值法公式组成数字电路进行计算的计算机
    使用插值法公式组成数字电路进行计算的计算机   使用插值法公式组成数字电路进行计算的计算机是一种可以使用插值法计算积分值,导数值,函数值的数字计算机,它由按键,液晶......