所谓拉格朗日插值,就是在“拉格朗日”进行的一项民俗活动。拉格朗日通常在每年2月的第82个星期三。

(逃)

前言

非常强大的算法。
当可以证明某个函数是一个 kkk 次多项式时,我们就可以插入 k+1k+1k+1 个函数值并快速的求出我们要求的函数值。

拉格朗日插值

情境:

对于一个 n−1n-1n−1 次的多项式,若给出了 nnn 个形如 f(xi)=yyf({x_i})=y_yf(xi​)=yy​ 的条件(xix_ixi​ 互不相同),请你对于给出的 kkk,求出对应的函数值 f(k)f(k)f(k)。

首先,可以证明,这个函数是存在且唯一的。

我们写出一个函数,形如:
f(x)=∑i=1nyi∏j≠ix−xjxi−xjf(x)=\sum_{i=1}^ny_i\prod_{j\ne i}\frac{x-x_j}{x_i-x_j}f(x)=i=1∑n​yi​j​=i∏​xi​−xj​x−xj​​
对于第 iii 项,当 x=xj(j≠i)x=x_j(j\ne i)x=xj​(j​=i) 时,会得到0,x=xix=x_ix=xi​ 时,会得到 yiy_iyi​。
所以,这个函数时满足给出的 nnn 个条件的,又由于这个东西显然是 n−1n-1n−1 次的,所以它就是我们要找的那个唯一确定的函数。
那么我们直接把 kkk 往里代就好了,时间复杂度 O(n2)O(n^2)O(n2)

ll lagrange(int n,ll *x,ll *y,ll k){k%=mod;ll res(0);for(int i=1;i<=n;i++){ll s1=1,s2=1;for(int j=1;j<=n;j++){if(i==j) continue;(s1*=(m-x[j]+mod))%=mod;(s2*=(mod+x[i]-x[j]))%=mod;}(res+=y[i]*s1%mod*ksm(s2,mod-2)%mod)%=mod;}return res;
}

连续函数值的快速插值

很多时候,我们插入的 nnn 个值可以是 f(1),f(2),...,f(n)f(1),f(2),...,f(n)f(1),f(2),...,f(n)。此时可以在 O(n)O(n)O(n) 的复杂度内进行插值。
把原来的式子的 xix_ixi​ 全都换成 iii,就变成:
f(x)=∑i=1nyi∏j≠ix−ji−jf(x)=\sum_{i=1}^ny_i\prod_{j\ne i}\frac{x-j}{i-j}f(x)=i=1∑n​yi​j​=i∏​i−jx−j​
这个东西就非常好看,我们随便预处理出 一些前缀和和逆元就可以 O(1)O(1)O(1) 求出 ∏\prod∏ 里的结果。
总复杂度 O(n)O(n)O(n)

ll lagrange(int n,ll *y,ll k){//consecutivek%=mod;jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;ni[n]=ksm(jc[n],mod-2);for(int i=n-1;i>=0;i--) ni[i]=ni[i+1]*(i+1)%mod;pre[0]=1;for(int i=1;i<=n;i++) pre[i]=pre[i-1]*(k-i)%mod;suf[n+1]=1;for(int i=n;i>=1;i--) suf[i]=suf[i+1]*(k-i)%mod;ll res(0);for(int i=1;i<=n;i++){ll add=y[i]*pre[i-1]%mod*suf[i+1]%mod*ni[i-1]%mod*ni[n-i]%mod;if((n-i)&1) add=mod-add;(res+=add)%=mod;}return res;
}

重心拉格朗日插值

有的时候我们需要动态的插点,每一次都 O(n2)O(n^2)O(n2) 的重新计算是我们不能接受的。
看原式:
f(k)=∑i=1n+1yi∏j≠ik−xjxi−xjf(k)=\sum_{i=1}^{n+1}y_i\prod_{j\ne i}\frac{k-x_j}{x_i-x_j}f(k)=i=1∑n+1​yi​j​=i∏​xi​−xj​k−xj​​
设:
g(k)=∏i=1n+1(k−xi)g(k)=\prod_{i=1}^{n+1}(k-x_i)g(k)=i=1∏n+1​(k−xi​)
ti=∏j≠i1xi−xjt_i=\prod_{j\ne i}\frac{1}{x_i-x_j}ti​=j​=i∏​xi​−xj​1​
那么原式可以写成:
f(k)=g(k)∑i=1n+1yitik−xif(k)=g(k)\sum_{i=1}^{n+1}\frac{y_it_i}{k-x_i}f(k)=g(k)i=1∑n+1​k−xi​yi​ti​​
每次加入一个点时,暴力计算其重心 ttt 并更新其他点的重心即可。
单次复杂度达到 O(kn)O(kn)O(kn)(kkk 为求逆元复杂度)。

应用:对函数为多项式形式的证明和对多项式次数的求解

我们要用拉格朗日插值,前提当然得是这个东西得是一个多项式,并且得求出它的次数。(这也往往是拉格朗日插值的难点)

并不是所有的函数都是多项式的! 比如,最简单的正弦函数就是一个无穷项数的函数(它的零点有无穷个)

例题:calc
看这篇博客吧。

模板:拉格朗日插值(多项式)相关推荐

  1. 拉格朗日插值的优缺点_浅谈拉格朗日插值

    浅谈拉格朗日插值 在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法.许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解.拉格 ...

  2. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. matlab全域基函数,多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]...

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见"计算基本理论". 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值 ...

  4. P4781 【模板】拉格朗日插值

    传送门 把公式实现一下即可: 当xxx连续的时候可以优化为O(N)O(N)O(N). // Problem: P4781 [模板]拉格朗日插值 // Contest: Luogu // URL: ht ...

  5. 简单的数据结构题(多项式、拉格朗日插值、线段树)

    简单的数据结构题 首先考虑计算要求的式子,不妨设l=1,r=nl=1,r=nl=1,r=n. ∑i=1naik∏j≠i1−aiajai−aj\sum_{i=1}^{n}a_i^k\prod_{j\n ...

  6. matlab有限域多项式除法_有限域GF(2^8)的四则运算及拉格朗日插值

    域的性质: 群和域在数学上的概念就不解释,可以参考维基百科.当然也可以参考<密码编码学与网络安全>这书的有限域一章.形象地说,域有这样一个性质:在加法和乘法上具有封闭性.也就是说对域中的元 ...

  7. 洛谷 P4781 【模板】拉格朗日插值

    题目传送门 参考:拉格朗日插值 学习笔记 代码: #include<bits/stdc++.h> using namespace std;typedef long long ll; con ...

  8. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...

  9. 【学习笔记】拉格朗日插值

    整理的算法模板合集: ACM模板 目录 P4781 [模板]拉格朗日插值 重心拉格朗日插值法 拉格朗日插值法求系数 自然数k次幂的和 点我看多项式全家桶(●'◡'●) P4781 [模板]拉格朗日插值 ...

最新文章

  1. 机器学习 LR getA()
  2. 为什么人人都该懂点LLVM
  3. OpenCV全向相机校准Omnidirectional Camera Calibration
  4. Linux从零开始(二、基础命令)
  5. selenium操作chrome时的一些配置
  6. .NET Core + JWT令牌认证 + Vue.js 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...
  7. 工业级光纤收发器的选用方法
  8. DataSet的Join操作
  9. (转)MFC消息机制
  10. GdiPlus[34]: IGPGraphicsPath (一)
  11. 最新摸头GIF在线生成工具源码+实测可用
  12. 计算机盘快捷键,电脑键盘快捷键全解
  13. python统计人的视角_Python--统计人的视角
  14. java 错误声音播放器_JavaME 声音播放器的使用
  15. java se开发web_javaSE web开发 登录思路代码
  16. 关于退火法的粗浅理解
  17. 自然语言处理NLP——GSDMM用于短文本聚类
  18. 浪潮服务器性能参数,浪潮高密度服务器i24
  19. adminLTE 教程
  20. 有图有话 | 嘘……你屏蔽了哪个微信群?

热门文章

  1. 我是怎么进入Oracle这样的大企业的?
  2. java定义接口_一文知道Java中接口的定义
  3. python解析xml文件选用模块_python解析xml模块封装代码
  4. php 获取对象所有成员变量,PHP成员变量获取对比
  5. matlab 如何画二维图形,Matlab 学习 画图篇 一 二维图形
  6. android刷新时的圆形动画_Android自定义加载圈动画效果
  7. html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图
  8. php html asp .net iis tomcat,iis+apache+tomcat 整合共享80口 支持ASP .NET JSP PHP全能WEB服务...
  9. 算法设计与分析———动态规划———最大子段和
  10. 每天一小时python官方文档学习(三)————函数