演算法 拉格朗日插值法

2022-03-06 13:37:58 字數 1110 閱讀 9321

​ 給你\(n + 1\)個點\((x,y)\),希望你求出過這幾個點的\(n-1\)次多項式。

​ 樸素的想法是把該多項式每一項的係數作為未知數,然後把點代入多項式中求出很多個\(n\)元\(1\)次方程組。然後高斯消元,時間複雜度為\(o(n^3)\)

​ 我們要介紹的拉格朗日插值法本質上來說是一種構造法,而不是去根據點對來想辦法求解。

​ 思考:對於當前給出的\(n+1\)個點,若給你乙個多項式\(f_i(x)\),該多項式滿足當你代入\(x_i\)時,\(f_i(x)=y_i\),否則,\(f_i(x)=0\),那麼我們是不是只要把這\(n+1\)個多項式相加起來就可以求出我們想要求的多項式了。

​ 知道了這點後,我們開始構造這\(n+1\)個多項式,具體的,我們構造出的第\(i\)個多項式長的樣子像這樣:

​ \(f_i(x) = y_i\prod_\frac\)

​ 構造思想即是希望當你代入任何乙個\(x_j\neq x_i\)時,該多項式的某一因式為\(0\),當你代入\(x_i\)時,該多項式可分解為\(y_i*1\)。上述的多項式便由此得來。

​ 然後,我們要求的總的多項式\(f(x)=\sum_^y_i\prod_\frac\)。

​ 你可以把它拆開來求出每一項的係數,總時間複雜度為\(o(n^2)\)。

​ 模板題,已知\(x\)個點,再給你乙個\(k\),求\(x-1\)次多項式的某一點的值\(f(k)\)

#include #include #include #include #include #define maxn 30005

#define mod 998244353

long long co[maxn],xi[maxn],yi[maxn],n,k,ans = 0;

long long qpow(long long x,long long y)

return now;

}int main()

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

(ans += num * qpow(num1,mod - 2) % mod) %= mod;

} printf("%lld\n",ans);

return 0;

}

插值法(拉格朗日插值和牛頓插值)

牛頓插值 defnewton interpolation x,y,init sum y 0 temp np.zeros len x len x 將第一行賦值 for i in range 0,len x temp i,0 y i temp sum 1.0 for i in range 1,len x...

拉格朗日插值法

拉格朗日插值法 拉格朗日插值法可以幫助我們解決以下的問題 已知x取值0,1,1,2時,f取值2,2,0,6 求x 3時f的值。示例1 intxs intys f 3 intval lagrangepolynomial 3,xs,ys staticint lagrangepolynomial intx...

拉格朗日插值法

模板題 給出n nn個點 xi yi x i,y i xi y i 讓你確定這個n 1 n 1n 1次方程並代入求值 這個有三種求法 第一種是差分法,只適用於xi ix i i xi i的情況,就是不斷做差分直到序列變成乙個定值就可以求出所有項的係數,複雜度o n 2 o n 2 o n2 第二種是...