zoukankan      html  css  js  c++  java
  • 浅析拉格朗日插值

    前言

    拉格朗日插值,是一个根据(n)个点确定唯一的(n-1)次多项式,然后(O(n^2))单点求值的算法。

    它听起来好像很玄学、很高级,实际上很容易理解,毕竟我这种蒟蒻都看得懂

    拉格朗日插值

    设多项式为(f(x)),已知(n)个点,坐标为((x_i,y_i))。现在要求(f(k))的值。

    下面我们直接给出拉格朗日插值的基本公式:

    [f(k)=sum_{i=1}^ny_iprod_{i≠j}{frac{k-x_j}{x_i-x_j}} ]

    证明如下:

    1. 它一看就是一个(n-1)次多项式。
    2. (k=x_p)时:若(p≠i),则存在某一时刻(p=j),那么这时(k-x_j)值就为(0),此时的(y_iprod_{i≠j}{frac{k-x_j}{x_i-x_j}}=0);若(p=i),则(k-x_j=x_i-x_j⇒frac{k-x_j}{x_i-x_j}=1),那么此时的(y_iprod_{i≠j}{frac{k-x_j}{x_i-x_j}}=y_i)。故将任意(x_p)代入都可以得到(f(x_p)=y_p)
    3. 综上所述,这个函数是正确的。

    这也就是一般的拉格朗日插值的全部内容了。

    具体实现(板子题

    class Lagrange//拉格朗日插值
    {
    	public:
    		I int GV(CI n,CI k,int *x,int *y)//插值
    		{
    			RI i,j,v1,v2,ans=0;for(i=1;i<=n;++i)
    			{
    				for(v1=v2=j=1;j<=n;++j) i^j&&(v1=1LL*v1*(k-x[j]+X)%X,v2=1LL*v2*(x[i]-x[j]+X)%X);//分别计算分子和分母
    				ans=(1LL*y[i]*v1%X*Qpow(v2,X-2)+ans)%X;//统计
    			}return ans;//返回答案
    		}	
    }G;
    
  • 相关阅读:
    考试心得 模拟18
    模拟17 题解
    模拟16 题解
    考试心得 模拟17
    模拟15 题解(waiting)
    BZOJ2653 middle 【主席树】【二分】*
    BZOJ3932 CQOI2015 任务查询系统 【主席树】
    与或 【线段树】 *
    BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*
    网络流--最大权闭合子图 *
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Lagrange.html
Copyright © 2011-2022 走看看