当前位置: 首页 > news >正文

[学习笔记]拉格朗日插值

拉格朗日插值法(图文详解)

自我感觉挺实用的一个算法。

也为一些题目提供了解决的思路。

插值:给一些散点,求满足这些个散点的函数(多项式),即求出这些系数

一般求一个点值,都要先得到系数,再O(n)算。求系数,高斯消元,是O(n^3)的。

但是,如果只要一个点值,这样岂不是血亏。

拉格朗日这个人比较厉害,他发明的算法,可以在不用求出具体系数的情况下,O(n^2)的计算一个位置的点值。

思想类似于互质的CRT,

对于给定n+1个点值,这个多项式最多n次的。而且,把每个横坐标带进去,xi自己的一项得到yi,别的由于分子有xi-xi,都是0

所以,这个多项式一定和实际上的多项式是一个多项式。

然后我们把要求的x带进去,就得到了函数值。

 

有什么用?

如果证明一个式子的函数是n次多项式的话,那么可以尝试得到n+1个点值,然后弄出这个公式,就可以计算比较大的答案。

https://blog.csdn.net/xyz32768/article/details/81233900

这个题,很大数据范围的k次方和,第一没有办法反演。第二没有规律可以找。

猜这个求和函数是一个k+1次多项式。然后带点求值,然后对目标答案的计算进行化简。

从O(n)到O(k^2)到O(klogk)(然鹅这个logk是因为点值的快速幂,后面的计算不是瓶颈23333)

突破口

1.想到是一个多项式

2.点值的取值是有讲究的,1~k+2这样连续的整点有助于预处理减少复杂度(跟自己干嘛要过不去23333)

所以,拉格朗日插值这个公式其实很整齐,

如果点值横坐标给的很好的话(支持递推),那么可以在O(n)时间求出一个值。已经非常不错了。

 

CF622F The Sum of the k-th Powers

代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
    char ch;x=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+5;
const int mod=1e9+7;
int n,k;
int qm(int x,int y){
    int ret=1;
    while(y){
        if(y&1) ret=(ll)ret*x%mod;
        x=(ll)x*x%mod;
        y>>=1;
    }
    return ret;
}
ll pre[N],bac[N];
ll fu[N];
ll y[N];
ll sol(){
    ll ret=0;
    for(reg i=1;i<=k+2;++i){
        //cout<<" i "<<i<<" : "<<y[i]<<" "<<pre[i-1]<<" "<<pre[k+2-i]<<" "<<bac[k+2]<<" "<<n-i<<endl;
        if(n>k+2) ret=(ret+y[i]*qm(pre[i-1]*(fu[k+2-i])%mod,mod-2)%mod*(bac[k+2]*qm((n-i),mod-2)%mod)%mod)%mod;
        else {
         if(n!=i) ret=(ret+y[i]*qm(pre[i-1]*(fu[k+2-i])%mod,mod-2)%mod*(bac[k+2]*qm(((n-i)+mod)%mod,mod-2)%mod)%mod)%mod;
         else ret=(ret+y[i])%mod;
        } 
    //    cout<<" ret "<<ret<<endl;
    }
    return ret;
}
int main(){
    rd(n);rd(k);
    pre[0]=1;
    bac[0]=1;
    fu[0]=1;
    y[0]=0;
    for(reg i=1;i<=k+2;++i){
        pre[i]=pre[i-1]*i%mod;
        fu[i]=fu[i-1]*(mod-i)%mod;
        bac[i]=(bac[i-1]*(n-i)%mod+mod)%mod;
        y[i]=(y[i-1]+qm(i,k))%mod;
    }
    printf("%lld",sol());
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/1/16 15:31:40
*/
View Code

 

 


upda:2019.2.18

如果要找到真正的系数:

可以快速插值O(nlogn),非常难写

一个比较实用的是O(N^2)的背包:

考虑拉格朗日插值的公式的每一个f(i)项对每个系数的贡献

$f(i) \frac{\Pi_{j!=i}(x-x_j)}{\Pi_{j!=i}(x_i-x_j)}$

分母是定值,$f(i)$是定值

分子不同之间差不多,

计算:$\Pi(x-x_j)$再每次O(N)除以$(x-x_i)$

计算方法:

对每一项的贡献就是选择k个x,剩下n-k个选择$-x_j$这样

所以背包:$f[i][j]$表示前i个“括号”,x次幂是j的权值之和

$f[i][j]=f[i-1][j]*(-x_i)+f[i-1][j-1]$

O(N^2)

 

还有一种更容易实现的方法:

$f*(x-x_i)=f*x-f*x_i$也就是f平移一位,然后减掉自己原来的xi倍

递推即可实现。

还原时候除法,就是倒着回退一次即可。

 

转载于:https://www.cnblogs.com/Miracevin/p/10158752.html

相关文章:

  • 网络的分类
  • IIS 6.0/7.0/7.5、Nginx、Apache 等Web Service解析漏洞总结
  • Python3 标准库概览
  • C#进阶系列——AOP?AOP!
  • QT5 进度条传文件
  • 网上炒股2
  • 大快搜索城市运河大数据政务管理平台案例解读
  • Axure RP初学2
  • AES加解密 集成 spring MVC
  • 硬科技产业的创新与难点,核心都在“技术落地”
  • 媒体转码HLS标准加密详解
  • 微信小程序视图层WXSS
  • Tomcat下wtpwebapps文件夹 和 webapps文件夹区别
  • 挂载本机的镜像文件到本机的某个目录
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • 【前端学习】-粗谈选择器
  • 2019年如何成为全栈工程师?
  • css系列之关于字体的事
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  •  D - 粉碎叛乱F - 其他起义
  • Git学习与使用心得(1)—— 初始化
  • Javascript编码规范
  • JavaWeb(学习笔记二)
  • Mysql优化
  • PermissionScope Swift4 兼容问题
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • ubuntu 下nginx安装 并支持https协议
  • 汉诺塔算法
  • 开发基于以太坊智能合约的DApp
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 说说动画卡顿的解决方案
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​比特币大跌的 2 个原因
  • ​力扣解法汇总946-验证栈序列
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $.ajax,axios,fetch三种ajax请求的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (JS基础)String 类型
  • (libusb) usb口自动刷新
  • (ros//EnvironmentVariables)ros环境变量
  • (八十八)VFL语言初步 - 实现布局
  • (差分)胡桃爱原石
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • ***原理与防范
  • .md即markdown文件的基本常用编写语法
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET简谈设计模式之(单件模式)
  • .NET企业级应用架构设计系列之应用服务器
  • ?php echo ?,?php echo Hello world!;?
  • @Mapper作用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [.net] 如何在mail的加入正文显示图片
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20150629]简单的加密连接.txt