拉格朗日插值求系数

我比较懒,记 \(f_i=[x^i]f(x)\)
就是求 \(f(x)=\sum\limits_{i=1}^ny_i\prod\limits_{j\neq i}\frac{x-x_j}{x_i-x_j}\) 的系数。
\(a_i=\frac{y_i}{\prod\limits_{j\neq i}(x_i-x_j)}\)\(g(x)=\prod\limits_{i=1}^n(x-x_j)\),显然 \(f(x)=\sum\limits_{i=1}^n\frac{a_ig(x)}{x-x_i}\)
考虑怎么 \(O(n)\)\(h(x)=\frac{g(x)}{x-x_i}\) 的系数,即 \((x-x_i)h(x)=g(x)\).

  • 首先有 \(h_n=0\)
  • 注意到 \(g_j=h_{j-1}-x_ih_j\),所以可以得到 \(h_{j-1}=g_j+x_ih_j\),递推即可。

最后全都加起来,时间复杂度 \(O(n^2)\)

void lag(ll a[N]){
    ll res[N]{};
    ll s[N]{},t[N]{};
    s[0]=1;
    rep(i,0,n){
        rep(j,0,n)t[j]=s[j],s[j]=0;
        rep(j,0,n)Add(s[j],mul(t[j],dec(0,i))),Add(s[j+1],t[j]);
    }
    rep(i,0,n){
        ll mm=1;
        rep(j,0,n)if(i!=j)Mul(mm,dec(i,j));
        Mul(a[i],qpow(mm,mod-2));
        ll ss[N]{};
        ss[n]=s[n+1];
        per(j,n,1)ss[j-1]=dec(s[j],mul(ss[j],dec(0,i)));
        rep(j,0,n)Add(res[j],mul(ss[j],a[i]));
    }
    rep(i,0,n)a[i]=res[i];
}
posted @ 2025-02-12 14:21  KnownError  阅读(52)  评论(0)    收藏  举报