模板:拉格朗日插值(多项式)
所謂拉格朗日插值,就是在“拉格朗日”進行的一項民俗活動。拉格朗日通常在每年2月的第82個星期三。
(逃)
前言
非常強大的算法。
當可以證明某個函數是一個 kkk 次多項式時,我們就可以插入 k+1k+1k+1 個函數值并快速的求出我們要求的函數值。
拉格朗日插值
情境:
對于一個 n?1n-1n?1 次的多項式,若給出了 nnn 個形如 f(xi)=yyf({x_i})=y_yf(xi?)=yy? 的條件(xix_ixi? 互不相同),請你對于給出的 kkk,求出對應的函數值 f(k)f(k)f(k)。
首先,可以證明,這個函數是存在且唯一的。
我們寫出一個函數,形如:
f(x)=∑i=1nyi∏j≠ix?xjxi?xjf(x)=\sum_{i=1}^ny_i\prod_{j\ne i}\frac{x-x_j}{x_i-x_j}f(x)=i=1∑n?yi?j?=i∏?xi??xj?x?xj??
對于第 iii 項,當 x=xj(j≠i)x=x_j(j\ne i)x=xj?(j?=i) 時,會得到0,x=xix=x_ix=xi? 時,會得到 yiy_iyi?。
所以,這個函數時滿足給出的 nnn 個條件的,又由于這個東西顯然是 n?1n-1n?1 次的,所以它就是我們要找的那個唯一確定的函數。
那么我們直接把 kkk 往里代就好了,時間復雜度 O(n2)O(n^2)O(n2)
連續函數值的快速插值
很多時候,我們插入的 nnn 個值可以是 f(1),f(2),...,f(n)f(1),f(2),...,f(n)f(1),f(2),...,f(n)。此時可以在 O(n)O(n)O(n) 的復雜度內進行插值。
把原來的式子的 xix_ixi? 全都換成 iii,就變成:
f(x)=∑i=1nyi∏j≠ix?ji?jf(x)=\sum_{i=1}^ny_i\prod_{j\ne i}\frac{x-j}{i-j}f(x)=i=1∑n?yi?j?=i∏?i?jx?j?
這個東西就非常好看,我們隨便預處理出 一些前綴和和逆元就可以 O(1)O(1)O(1) 求出 ∏\prod∏ 里的結果。
總復雜度 O(n)O(n)O(n)
重心拉格朗日插值
有的時候我們需要動態的插點,每一次都 O(n2)O(n^2)O(n2) 的重新計算是我們不能接受的。
看原式:
f(k)=∑i=1n+1yi∏j≠ik?xjxi?xjf(k)=\sum_{i=1}^{n+1}y_i\prod_{j\ne i}\frac{k-x_j}{x_i-x_j}f(k)=i=1∑n+1?yi?j?=i∏?xi??xj?k?xj??
設:
g(k)=∏i=1n+1(k?xi)g(k)=\prod_{i=1}^{n+1}(k-x_i)g(k)=i=1∏n+1?(k?xi?)
ti=∏j≠i1xi?xjt_i=\prod_{j\ne i}\frac{1}{x_i-x_j}ti?=j?=i∏?xi??xj?1?
那么原式可以寫成:
f(k)=g(k)∑i=1n+1yitik?xif(k)=g(k)\sum_{i=1}^{n+1}\frac{y_it_i}{k-x_i}f(k)=g(k)i=1∑n+1?k?xi?yi?ti??
每次加入一個點時,暴力計算其重心 ttt 并更新其他點的重心即可。
單次復雜度達到 O(kn)O(kn)O(kn)(kkk 為求逆元復雜度)。
應用:對函數為多項式形式的證明和對多項式次數的求解
我們要用拉格朗日插值,前提當然得是這個東西得是一個多項式,并且得求出它的次數。(這也往往是拉格朗日插值的難點)
并不是所有的函數都是多項式的! 比如,最簡單的正弦函數就是一個無窮項數的函數(它的零點有無窮個)
例題:calc
看這篇博客吧。
總結
以上是生活随笔為你收集整理的模板:拉格朗日插值(多项式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos压力测试违法吗(ddos压力测试
- 下一篇: 模板:快速莫比乌斯变换(FMT)+快速沃