多項式多點求值
給定n個值xi,求f(xi)。
設f0(x)=∑i=02n−1f(xi),P0(x)=∏i=02n−1x−xi。則有f(x)=P0(x)z(x)+f0(x)其中z(x)是某一多項式。
於是對於i<2n,有f(xi)=(fmodP0)(xi)。後一半同樣。遞歸計算即可,每次用分治卷積和多項式取模,複雜度爲O(nlog2n)。
多項式快速插值
給定n個二元組(xi,yi),求F(x)使F(xi)=yi。
由拉格朗日插值公式,F(x)=i∑∏j≠i(xi−xj)∏j≠i(x−xj)⋅yi
設M(x)=∏i(x−xi),則F(x)=i∑xi−xiM(xi)∏j≠i(x−xj)⋅yiF(x)=i∑M′(xi)∏j≠i(x−xj)⋅yi
此時可以用多項式多點求值求出所有的M′(xi)。設Ai=M′(xi)yi,則等式變爲F(x)=i∑Aij≠i∏(x−xj)
分治即可。設兩半邊答案分別爲F0(x)、F1(x),則F(x)=F0(x)i=mid+1∏r(x−xi)+F1(x)i=l∏mid(x−xi)
複雜度爲O(nlog2n)。
*2019.01.11 13:30:18
線性遞推數列
給定長爲m的數列a0,a1,⋯,am−1,給定f(i)(i<m),已知對於任意i≥m有f(i)=∑j=0m−1ajf(i−j),求f(n)。
n=1018,m=3×104。
設數列A滿足fn=∑i=0∞Aifi,則我們容易得到一個合法的數列A即Ai′={0(i≠n)1(i=n)。若我們求得一個A使其非零項的下標都在[0,m−1],則我們可以立即求得f(n)。現在考慮將A′變形。
原等式變形得f(i)−j=0∑i−1ajf(i−j)=0設多項式Bi(x)=f(i)−∑j=0i−1ajf(i−j),則其恆等於0。
考慮這樣一個過程:我們已有一個合法的A,其最高的非零項爲Ak,現將A賦值爲A−Bk,則其值不變,而最高非零項的下標嚴格減少。因此我們對A′不斷做這個過程即可得到我們想要的A。
事實上,“不斷做這個過程”等價於將A′對Bm−1取模。用多項式取模,我們就在O(mlognlogm)的時間複雜度內解決了問題。*2018.12.5