拉格朗日插值法求多项式系数 (附代码)

article/2025/9/21 20:57:46

写在前面:

学了拉格朗日插值法之后发现大家都说可以在O(n^2)时间内得到多项式系数,但是没有找到代码,网上找了很多资料又因为我太弱了没能看懂,最后在emofunx学长的帮助下终于搞明白了。
由于太弱没能看懂的文章

引入

我们都知道n个点可以确定一个n-1次的多项式F(x),然后用拉格朗日插值法可以求出这个多项式。
拉格朗日插值法
公式为:在这里插入图片描述

由这个公式,对于一个数k,我们很容易在O(n^2)时间求得F(k)的数值,如果xi是连续的,我们甚至可以利用预处理在O(n)时间内得到F(k)的数值。
但是如果xi不连续,又有多组查询,就需要得到这个多项式的系数以保证求一个函数值的时间为O(n)。

拉格朗日插值法求系数

首先观察式子,发现对于每个i, 上面部分是(x-x1) * (x-x2)… * (x-xn)/(x-xi), 下面那部分和yi都是常数。
所以可以O(n^2)处理出(x-x1) * (x-x2)… * (x-xn) 这个n次多项式,然后通过模拟长除法,O(n)时间内可以得到(x-x1) * (x-x2)… * (x-xn)/(x-xi),然后常系数直接O(n) 暴力算出来,就得到了xi对应的多项式,最后把所有多项式加起来就得到了最终的系数。

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e3 + 50;
ll mod = 998244353;
ll qm(ll a, ll b){ll res = 1;while(b) {if(b&1)res = res*a%mod;a = a*a%mod, b>>=1;}return res;
}
ll a[maxn], b[maxn], c[maxn], temp[maxn];
ll x[maxn], y[maxn];
int n;
void mul(ll *f, int len, ll t){//len为多项式的次数+1,函数让多项式f变成f*(x+t)for(int i = len; i > 0; --i) temp[i] = f[i], f[i] = f[i-1];temp[0] = f[0], f[0] = 0;for(int i = 0; i <= len; ++i) f[i] = (f[i] + t*temp[i])%mod;
}
void dev(ll *f, ll *r, ll t){//f是被除多项式的系数,r保存f除以x+t的结果for(int i = 0; i <= n; ++i) temp[i] = f[i];for(int i = n; i > 0; --i){r[i-1] = temp[i];temp[i-1] = (temp[i-1] - t*temp[i])%mod;}return;
}
void lglr(){memset(a,0,sizeof a);b[1] = 1, b[0] = -x[1];for(int i = 2; i <= n; ++i){mul(b, i, -x[i]);}//预处理(x-x1)*(x-x2)...*(x-xn)for(int i = 1; i <= n; ++i){ll fz = 1;for(int j = 1; j <= n; ++j){if(j == i) continue;fz = fz*(x[i] - x[j])%mod;}fz = qm(fz, mod-2);fz = fz*y[i]%mod;//得到多项式系数dev(b, c, -x[i]);//得到多项式,保存在b数组for(int j = 0; j < n; ++j) a[j] = (a[j] + fz*c[j])%mod;}
}
int main()
{ll k;cin>>n>>k;for(int i = 1; i <= n; ++i) scanf("%lld%lld",&x[i],&y[i]);lglr();ll ans = 0;ll res = 1;for(int i = 0; i < n; ++i){ans = (ans + res*a[i])%mod;res = res*k%mod;}ans = (ans + mod)%mod;cout<<ans<<endl;
}
学长的教诲
  1. 现代技术一般认为拉格朗日插值(模意义下)可以做到O(nlog^2n),是利用分治法 + 多项式取模实现的。
  2. 对于0,1,…,n这种特殊的取值,这个范德蒙矩阵的逆是可以用DP来O(n^2)算出的

http://chatgpt.dhexx.cn/article/tqPxwhQE.shtml

相关文章

拉格朗日插值多项式的龙格现象

利用插值基函数可以很容易得到拉格朗日插值多项式&#xff0c;公式结构紧凑&#xff0c;在理论分析中甚为重要。但存在以下问题&#xff1a; 当插值节点增减时&#xff0c;计算要全部重新进行&#xff0c;甚为不便&#xff08;当然现在我们有MATLAB&#xff0c;只需改变下参数…

拉格朗日多项式插值法

在数值分析中&#xff0c;拉格朗日常用于多项式插值。假定提供一组数据点[xi,yi]&#xff0c;拉格朗日插值多项式就是由这些 数据的线性运算得到的。 其中基本的多项式有以下公式计算得到 注意 1.第一提供的xi应该是没有相同的&#xff0c;否则不能应用此算法 2.对于每一个xi&…

拉格朗日插值和求多项式系数

拉格朗日介绍 先说说拉格朗日是啥吧 首先 拉格朗日插值是给你 n1 个点 (x,y) 然后根据这n个点可以O(n^2)的求出多项式的系数。也就是解出这个多项式的答案。 假设给你一个多项式 ya0a1*xa2*x^2 然后给你3个解 (x1,y1)(x2,y2)(x3,y3)你第一个想法是怎么解&#xff1f;解方程啊…

数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

文章目录 摘要&#xff08;必看&#xff09;0 基础概念什么是插值插值用途什么是拟合插值和拟合的相同点插值和拟合的不同点 1 常用的基本插值方法1.1 多项式插值法1.1.1 拉格朗日多项式插值法多项式插值并不是次数越大越好&#xff08;龙格现象&#xff09;分段低次线性插值以…

数模--拉格朗日多项式插值、matlab实现

拉格朗日多项式公式&#xff1a; matlab中插入一个值的代码 function yhlagrange(x,y,xh) %定义拉格朗日插入函数 nlength(x); %统计x和xh的长度 mlength(xh); yhzeros(1,m); %构建一行m列的zero矩阵 c1ones(n-1,1); …

计算方法实验(一):拉格朗日插值多项式

拉格朗日插值数学原理 给定平面上 n 1 n 1 n1个不同的数据点 ( x k , f ( x k ) ) (x_{k},f(x_{k})) (xk​,f(xk​))&#xff0c; k 0 , 1 , ⋯ , n k 0,1,\cdots,n k0,1,⋯,n&#xff0c; x i ≠ x j x_{i} \neq x_{j} xi​​xj​&#xff0c; i ≠ j i \neq j i​j&…

拉格朗日插值多项式在MATLAB中的实现

拉格朗日插值多项式在MATLAB中的实现 Hi! 这是我的一个CSDN博客 例 以下给出了针对题&#xff08;2&#xff09;的使用方法 输入&#xff1a; 1.节点值 2.需要插值的原函数 对于题&#xff08;2&#xff09;需要设置参数为&#xff1a; xx [0,0.25,0.5,1];% The nodes(n…

lagrange插值法:求拉格朗日插值多项式matlab实现(内附代码及例题)

lagrange插值法:求拉格朗日插值多项式matlab实现(内附代码及例题) 关于拉格朗日插值法相关理论知识&#xff0c;在这里小编不在赘述&#xff0c;请不明白的小伙伴自行百度。小编只负责给出matlab源码。 **例题:**看下面例题(如图): matlab代码: %%%% 求拉格朗日多项式及基函…

拉格朗日插值算法分析

这几天一直研究拉格朗日多项式&#xff0c;今天将自己对拉格朗日多项式的理解写在这里&#xff0c;方便大家交流。 在数值分析中&#xff0c;拉格朗日常用于多项式插值。假定提供一组数据点[xi,yi]&#xff0c;拉格朗日插值多项式就是由这些 数据的线性运算得到的。 其中基本…

拉格朗日(Lagrange)插值多项式

题目&#xff1a; 基本原理&#xff1a; 拉格朗日&#xff08;Lagrange&#xff09;插值多项式python实现&#xff1a; # encoding: utf-8 from symtable import Symbol X[0.4,0.5,0.6,0.7,0.8] Y[-0.9163,-0.6931,-0.5108,-0.3567,-0.2231] print(X,Y) Lfloat(0.0) x0.54 len…

使用拉格朗日多项式(Lagrangian polynomials)的插值法(python,数值积分)

第三十五篇 拉格朗日多项式插值 插值多项式 首先考虑一个函数的推导&#xff0c;该函数精准地通过一系列np离散数据点。虽然有无限多的函数具备这个条件&#xff0c;但我们将专注于最简单的一个&#xff0c;一个n阶多项式&#xff0c;其中n np−1。我们称这个函数为“插值多…

三点估算法 PERT计划评审技术

三点估算也称PERT法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff0c;计算最悲观的工 期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是 期望工期. 用PERT法计算工期&#xff0c;我们必须记住下面三个公…

计划评审技术PERT和关键路径法CP

PERT是利用网络分析制定计划以及对计划予以评价的技术。它能协调整个计划的各道工序&#xff0c;合理安排人力、物力、时间和资金&#xff0c;加速计划的完成。PERT网络是一种类似流程圈的箭线圈。它描绘出项目包含的各种活动的先后次序&#xff0c;标明每项活动的时间或相关的…

PERT(计划评审技术,Program Evaluation an Review Technique)

如果你对项目管理、系统架构有兴趣&#xff0c;请加微信订阅号“softjg”&#xff0c;加入这个PM、架构师的大家庭 PERT(计划评审技术&#xff0c;Program Evaluation an Review Technique) 的理论基础是假设项目持续时间以及整个项目完成时间是随机的&#xff0c;且服从某种概…

PERT网络分析法(计划评估和审查技术)

PERT网络分析法(计划评估和审查技术&#xff0c;Program Evaluation and Review Technique 什么是PERT网络分析? PERT(Program Evaluation and Review Technique)即计划评审技术&#xff0c;最早是由美国海军在计划和控制北极星导弹的研制时发展起来的。PERT技术使原先估计的、…

对项目工时的估算----( PERT “计划评审技术” ) 三点估算法

“三点估算法”也称“PERT”法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff1a;计算最悲观的工期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是期望工期。 用PERT法计算工期&#xff0c;我们必须记住下面…

技术评审

在工作中&#xff0c;我们经常可以听到以下的声音&#xff1a; “我们不进行评审&#xff0c;是因为我们项目比较特殊&#xff0c;没有时间……”。 “我们的项目已经进行了测试&#xff0c;不需要再进行评审了”。 “评审都是在走过场&#xff0c;没有效果……”。 业界公认评…

CMMI-技术评审管理方案

技术评审&#xff08;Technical Review, TR&#xff09;的目的是尽早地发现工作成果中的缺陷&#xff0c;并帮助开发人员及时消除缺陷&#xff0c;从而有效地提高产品的质量。 技术评审过程域是SPP模型的重要组成部分。本规范阐述了技术评审过程域的三个主要规程&#xff1a; …

PERT(计划评审技术Program Evaluation an Review Technique)

制定进度表中的PERT方法会用到三点估算&#xff0c;计算公式如下&#xff1a; i. 期望值 (悲观乐观4*最可能) / 6 ii. 标准差 (悲观-乐观) / 6 在培训班听课时&#xff0c;几个讲师都说采用三点估算服从正态分布&#xff0c;需要计算期望值与标准差&#xff0c;然而…

项目经理必须知道什么是PERT网络分析(计划评审技术)

目录 什么是PERT网络分析? PERT的基本要求[2] PERT的计算特点 [1] PERT网络分析法的工作步骤 [1] PERT网络分析法的改进[3] β分布及其性质 改进后的计划评审技术 PERT网络技术的作用 [4] 时间网络分析法的优点和局限性[5] PERT网络分析法的案例分析 PERT的案例一&…