1. 程式人生 > >拉格朗日插值學習小結

拉格朗日插值學習小結

簡介

在數值分析中,拉格朗日插值法是以法國18世紀數學家約瑟夫·拉格朗日命名的一種多項式插值方法。如果對實踐中的某個物理量進行觀測,在若干個不同的地方得到相應的觀測值,拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。上面這樣的多項式就稱為拉格朗日(插值)多項式。

拉格朗日插值法

眾所周知,\(n + 1\)\(x\)座標不同的點可以確定唯一的最高為\(n\)次的多項式。在演算法競賽中,我們常常會碰到一類題目,題目中直接或間接的給出了\(n+1\)個點,讓我們求由這些點構成的多項式在某一位置的取值

一個最顯然的思路就是直接高斯消元求出多項式的係數,但是這樣做複雜度巨大\((n^3)\)

且根據演算法實現不同往往會存在精度問題

而拉格朗日插值法可以在\(n^2\)的複雜度內完美解決上述問題

假設該多項式為\(f(x)\), 第\(i\)個點的座標為\((x_i, y_i)\),我們需要找到該多項式在\(k\)點的取值

根據拉格朗日插值法

\[f(k) = \sum_{i = 0}^{n} y_i \prod_{i \not = j} \frac{k - x[j]}{x[i] - x[j]}\]

乍一看可能不是很好理解,我們來舉個例子理解一下

假設給出的三個點為\((1, 3)(2, 7)(3, 13)\)

直接把\(f(k)展開\)

\(f(k) = 3 \frac{(k - 2)(k - 3)}{(1 - 2)(1 - 3)} + 7\frac{(k-1)(k-2)}{(2 - 1)(2-3)} + 13\frac{(k-1)(k-2)}{(3 -1)(3-2)}\)

觀察不難得到,如果我們把\(x_i\)帶入的話,除第\(i\)項外的每一項的分子中都會有\(x_i - x_i\),這樣其他的所有項就都被消去了

因此拉格朗日插值法的正確性是可以保證的

下面說一下拉格朗日插值法的拓展

\(x\)取值連續時的做法

在絕大多數題目中我們需要用到的\(x_i\)的取值都是連續的,這樣的話我們可以把上面的演算法優化到\(O(n)\)複雜度

首先把\(x_i\)換成\(i\),新的式子為

\(f(k) = \sum_{i=0}^n y_i \prod_{i \not = j} \frac{k - j}{i - j}\)

考慮如何快速計算\(\prod_{i \not = j} \frac{k - j}{i - j}\)

對於分子來說,我們維護出關於\(k\)的字首積和字尾積,也就是

\[pre_i = \prod_{j = 0}^{i} k - j\]

\[suf_i = \prod_{j = i}^n k - j\]

對於分母來說,觀察發現這其實就是階乘的形式,我們用\(fac[i]\)來表示\(i!\)

那麼式子就變成了

\[f(k) = \sum_{i=0}^n y_i \frac{pre_{i-1} * suf_{i+1}}{fac[i] * fac[N - i]}\]

注意:分母可能會出現符號問題,也就是說,當\(N - i\)為奇數時,分母應該取負號

重心拉格朗日插值法

再來看一下前面的式子

\[f(k) = \sum_{i = 0}^{n} y_i \prod_{i \not = j} \frac{k - x[j]}{x[i] - x[j]}\]

\(g = \prod_{i=1}^n k - x[i]\)

\[ f(k) = g\sum_{i = 0}^{n} \prod_{i \not = j} \frac{y_i}{(k - x[i])(x[i] - x[j])} \]

\(t_i = \frac{y_i}{\prod_{j \not =i} x_i - x_j}\)

\[ f(k) = g\sum_{i = 0}^{n} \frac{t_i}{(k - x[i])} \]

這樣每次新加入一個點的時候只需要計算它的\(t_i\)即可

應用

經典應用

首先講一個經典應用:計算\(\sum_{i=1}^n i^k (n \leqslant 10^{15}, k \leqslant 10^6)\)

老祖宗告訴我們,這個東西是個以\(n\)為自變數的\(k + 1\)次多項式,具體證明可以看第二份參考資料

然後直接帶入\(k+1\)個點後用拉格朗日插值算即可,複雜度\(O(k)\)

那具體在題目中怎麼使用拉格朗日插值呢?

首先你要證明求的東西是某個多項式,判斷的依據是:

大部分情況下歸納一下就可以了

題目

由易到難排列

洛谷P4593 [TJOI2018]教科書般的褻瀆

BZOJ3453: tyvj 1858 XLkxc

BZOJ4559: [JLoi2016]成績比較

BZOJ2655: calc

參考資料

拉格朗日插值法

差分的應用及正整數的k次方冪求和

拉格朗日插值法及應用

拉格朗日插值 學習筆記