拉格朗日插值如何插出係數

2022-08-20 23:21:13 字數 1477 閱讀 8998

好久之前在 cmd's blog 看到過,這次做題遇上了,就學了一下,其實挺 easy 的。

眾所周知其實是我不會證

\(n\) 個點 \((x_i,y_i)\) 可以唯一確定乙個次數為 \(n-1\) 的多項式,拉格朗日插值給出了一種構造:

\[f(z)=\sum_^ \dfrac(z-x_j)}(x_i-x_j)}

\]首先提出常數部分:

\[a_i=\dfrac(x_i-x_j)}

\]可以 \(o(n^2)\) 搞出每乙個 \(a_i\)。

然後求乙個多項式 \(g(z)=\prod_^ (z-x_i)\)。

可以發現

\[f(z)=\sum_^a_i\dfrac

\]考慮如何快速搞出後面那個 \(\dfrac\)。

設 \(h(z)=\dfrac\)。

可以得到 \((z-c)h(z)=g(z)\)。兩邊提取係數得到

\[[z^]h-c[z^i]h=[z^i]g\\

[z^i]h=\dfrac]h}

\]遞推即可。

給出 模板題 通過**:

#includeusing namespace std;

#define fi first

#define se second

#define mkp(x,y) make_pair(x,y)

#define pb(x) push_back(x)

#define sz(v) (int)v.size()

typedef long long ll;

typedef double db;

templatebool ckmax(t&x,t y)

#define rep(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)

#define per(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)

inline int read()

while(isdigit(ch))x=x*10+ch-'0',ch=getchar();

return f?x:-x;

}#define mod 998244353

inline int qpow(int n, int k)

vector lagrange(const vector &x, const vector &y)

b[0] = 1;

for(int i = 0; i < n; ++i)

for(int i = 0; i < n; ++i) else

for(int j = 0; j < n; ++j)

f[j] = (f[j] + 1ll * a[i] * c[j] % mod) % mod;

} return f;

}inline int calc(const vector &f, int x)

signed main()

拉格朗日插值

拉格朗日插值基函式 li x x x 0 x xi 1 x xi 1 x x n x i x0 xi xi 1 xi xi 1 xi xn 拉格朗日差值函式 ln x i 0 nyil i x 其中,x為缺失值對應的下表序號,ln x 為缺失值的插值結果,xi 為缺失值yi 的下表序號。對全部缺失值...

拉格朗日插值

function s larg1 x,y,xi m length x 求出插值節點向量長度 n length y if m n error 向量x與y的長度必須一致 這裡肯定一致,只是為了消除直接選取x,y資料的時候出錯而設定的 end s 0 for i 1 n z ones 1,length x...

拉格朗日插值

存在性和唯一性的證明以後再補。拉格朗日插值,emmmm,名字挺高階的 joy 它有什麼應用呢?我們在fft中講到過 設 n 1 次多項式為 y sum a i x i 有乙個顯然的結論 如果給定 n 個互不相同的點 x,y 則該 n 1 次多項式被唯一確定 那麼如果給定了這互不相同的 n 個點,利用...