拉格朗日插值法(求自然数幂和)

原创 2017年10月06日 16:10:11

背景

ni=1ik,给定n<=1e18,k<=1e6.

分析

g(x)=xi=1ik。考虑k=1与k=2时的公式,不难得出每个g(x)实际上都是一个k+1次多项式。(这是猜想,具体证明看http://blog.csdn.net/jokerwyt/article/details/54141757,那个递推式就是k+1次的)

那么问题就变成了已知一个k+1次多项式多项式L(x)的k+2个对应值点(xi,L(xi)),求L(或者说L(x0))
这个问题有解且唯一,因为对应方程组有唯一解。
可以使用高斯消元求解,解出系数。时间复杂度为O(k3)

拉格朗日插值法

拉格朗日插值法正是用于解决这种问题。如果点随便给,时间复杂度为O(k^2),但是对于有规律的给出点对(x,y)可以更快。
参考中国剩余定理,我们可以写出答案多项式的形式(之一)
L(x)=yili(x)
li(x)是构造的一个函数,满足li(xi)=1li(xj,i!=j)=0
也就是说这个多项式经过给出的每一点。又因为解唯一,所以这就是所求多项式。

li的构造方法比较简单:首先因为li(xj)=0。所以其有根xj.因此有因式(x-xj).
然后对于li(xi)=1,只需要消除上面构造带来的影响,也就是对于j!=i,除掉(xi-xj).
感性告诉我li是唯一构造的.
因此,只需要花费O(k * 计算li(x)的时间)就可以推算出L(x0)的答案了。在这一题中,li在预处理后可以O(1)算出.
对于一段连续的负数相乘,不要傻傻的将其加上mo再算阶乘(过大),直接将负号提出,其余按正数阶乘算

自然数幂和的拉格朗日解法

预处理出f(1..k+2)的值,然后直接拉格朗日插值。因为此处的li是有规律的(数轴上一段数相乘),可以做到O(k)的时间。(负数阶乘记得提出负号)

版权声明:未经作者本人允许禁止转载。

相关文章推荐

拉格朗日插值法 c语言

  • 2010年06月06日 09:04
  • 456B
  • 下载

拉格朗日插值法

  • 2012年12月12日 13:48
  • 2KB
  • 下载

拉格朗日插值法(Lagrange)

拉格朗日基函数插值

拉格朗日插值法

  • 2012年06月04日 19:16
  • 1KB
  • 下载

拉格朗日插值法c程序

  • 2009年09月30日 17:31
  • 29KB
  • 下载

拉格朗日插值法(伪代码 c/c++ python 实现)

数值计算方法:拉格朗日插值法的伪代码 c/c++ python编程实现。

拉格朗日插值法c语言版

  • 2013年10月19日 09:00
  • 2KB
  • 下载

已知正弦函数表利用拉格朗日插值法计算正弦函数的近似值

算法介绍: C语言代码实现 #include float l(float *x,float x0,int k,int n); //拉格朗日基函数 float lagrange(float...

【数值分析】插值算法-拉格朗日插值法

开篇明志之前学过《数值分析》这门课,现对部分内容做代码上的实现。今天讲拉格朗日插值法,那么什么是拉格朗日插值法呢?大概用大白话总结一下:利用函数f (x)在某区间中插入若干点的函数值,作出适当的特定函...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:拉格朗日插值法(求自然数幂和)
举报原因:
原因补充:

(最多只允许输入30个字)