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

拉格朗日插值

时间:2024-03-14 09:00:55浏览次数:14  
标签:拉格朗 插值 3010 ne int ans

插值
已知平面直角坐标系上的\(n\)个点,找出一个函数\(f(x)\)过这\(n\)个点,这样的函数有无限多个。
拉格朗日插值
首先他构造了\(n\)个函数,第\(i\)个是\(f_i(x)=\left\{\begin{matrix} y_i & x=x_i\\ 0 & x=x_j(j\ne i) \end{matrix}\right.\)。对于其余的\(x\),我们并不关心。
这样我们可以得出$f_i(x)=\frac{y_i\times \prod_{j\ne i} (x-x_j)}{\prod_{j\ne i} (x_i-x_j)} $。
最终可以得出答案 \(f(x)=\sum_{i-1}^n f_i(x)\)。
例题:
abc137F
代码

#include<iostream>
#define int long long
using namespace std;
int p;
int a[3010];
int b[3010];
int c[3010];
int d[3010];
int ksm(int x,int y){
	int ans=1;
	while(y){
		if(y%2==1){
			ans=ans*x%p;
		}
		x=x*x%p;
		y/=2;
	}
	return ans;
}
int inv[3010];
signed main(){
	cin>>p;
	for(int i=1;i<p;i++){
		inv[i]=ksm(p-i,p-2);
	}
	for(int i=0;i<p;i++){
		cin>>a[i];
	}
	b[0]=1;
	for(int i=0;i<p;i++){
		for(int j=p;j>=0;j--){
			b[j]=b[j]*(p-i)%p;
			if(j!=0){
				b[j]=(b[j]+b[j-1])%p;
			}
		}
	}
	c[0]=1;
	for(int i=1;i<p;i++){
		for(int j=p-1;j>=0;j--){
			c[j]=c[j]*(p-i)%p;
			if(j!=0){
				c[j]=(c[j]+c[j-1])%p;
			}
		}
	}
	int k=1;
	for(int j=1;j<p;j++){
		k=k*(p-j)%p;
	}
	k=ksm(k,p-2)*a[0]%p;
	for(int j=0;j<p;j++){
		d[j]=(d[j]+c[j]*k)%p;
	}
	for(int i=1;i<p;i++){
		for(int j=0;j<p;j++){
			c[j]=b[j];
		}
		for(int j=0;j<p;j++){
			c[j]=c[j]*inv[i]%p;
			if(j!=p-1){
				c[j+1]=(c[j+1]-c[j]+p)%p;
			}
		}
		k=1;
		for(int j=0;j<p;j++){
			if(i!=j){
				k=k*(i-j+p)%p;
			}
		}
		k=ksm(k,p-2)*a[i]%p;
		for(int j=0;j<p;j++){
			d[j]=(d[j]+c[j]*k)%p;
		}
	}
	for(int i=0;i<p;i++){
		cout<<d[i]<<" ";
	}
	return 0;
}

标签:拉格朗,插值,3010,ne,int,ans
From: https://www.cnblogs.com/z-2-we/p/18072044

相关文章

  • 文本插值
    文本插值是一种基本的数据绑定形式,用于将数据绑定到DOM文本节点。使用双大括号{{}}来显示JavaScript表达式的结果。它主要用于将数据绑定到HTML文本节点。在Vue组件的模板中使用文本插值时,Vue会自动将对应的数据显示在页面上,并且当这些数据变化时,页面上显示的内容也会自动更新......
  • 均值不等式证明(拉格朗日乘数法)
    Part1求证:\(\frac{n}{\sum_{i=1}^{n}\frac{1}{y_i}}\leq({\prod_{i=1}^{n}y_i})^{\frac{1}{n}}\)\(y_i\)为正实数\(n\geq3\)证明:令\(x_i\)=\(y_i^{\frac{1}{n}}\)且\(x_i\)为正实数原命题等价于:\[{\prod_{i=1}^{n}x_i}-\frac{n}{\sum_{i=1}^{n}\......
  • Vue学习笔记13--插值语法 + method
    插值语法示例:插值语法--实现信息拼接<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>插值语法--实现信息......
  • 线性插值计算百分位数的C++示例
    代码如下#include<iostream>#include<vector>#include<algorithm>doublepercentile_linear_interpolation(conststd::vector<double>&data,doublepercentile){//确保百分位数在合理范围内if(percentile<0.0||percentile>1......
  • P5667 拉格朗日插值2
    由拉格朗日插值公式得:\[f(x)=\sum_{i=0}^nf(i)\prod_{j\nei}\dfrac{x-j}{i-j}=\sum_{i=0}^n\dfrac{f(i)x^{\underline{n+1}}}{(-1)^{n-i}i!(n-i)!(x-i)}\]我们要把函数平移\(m\)个单位长度,所以要写\(f(x+m)\)的式子,即\[f(x+m)=\sum_{i=0}^n\dfra......
  • 拉格朗日插值学习笔记
    拉格朗日插值第一步:子函数\(f_i(x)=\begin{cases}1&x=x_i\\0&x=x_j(i\nej)\end{cases}\)由此可得:\(f(x)=\sum\limits_{i=1}^ny_if_i(x)\)第二步:对于\(f_i(x)\),要满足当\(x=x_i\)时,\(y=1\),而\(x\nex_i\)时,\(y=0\)故:\(f_i(x)=\dfrac{\prod\limits_{j=1,j\......
  • 拉格朗日插值学习笔记
    拉格朗日插值定义给定一个多项式函数过点\((x_i,y_i)\),求出这个多项式函数的在\(x=k\)时的取值。公式\[f(k)=\sum_{i=0}^ny_i\prod_{j\not=i}\dfrac{k-x_j}{x_i-x_j}\]时间复杂度\(O(n^2)\)横坐标连续的拉格朗日插值在横坐标连续的情况下,可以做到\(O(n)\)插值。\[\b......
  • 数学建模入门笔记(3) 插值与拟合
    插值与拟合插值和拟合的区别:拟合不要求过每一个已知点,而插值要求过每一个已知点,因而插值可以看作过每一个点的拟合。插值适用于补全缺失值,因为使用一般拟合就有可能使已知值偏移,不符合需求。据说PS用某种样条插值,放大的时候最大程度的保留连续性,因此显得不是那么模糊.数学建模......
  • C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
    字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合示例://创建一个string类型的变量并赋予一个值stringgreeting="Hello";如果需要,一个字符串变量可以包含多个单词:示例:stringgreeting2="Nicetomeetyou!";字符串长度在C#中,字符串实际上是一......
  • qt c语言双三次线性插值
    用chatgpt生成的测试了比较卡for(inty=0;y<enlargedHeight;y++){for(intx=0;x<enlargedWidth;x++){//计算原始图像中对应的浮点坐标floatoriginalX=(float)x/(float)enlar......