多項式基礎3 多項式多點求值 多項式快速插值 多項式取模優化線性遞推數列

多項式多點求值

給定nn個值xix_i,求f(xi)f(x_i)

f0(x)=i=0n21f(xi)f_0(x)=\sum_{i=0}^{\frac{n}{2}-1}f(x_i)P0(x)=i=0n21xxiP_0(x)=\prod_{i=0}^{\frac{n}{2}-1}x-x_i。則有f(x)=P0(x)z(x)+f0(x)f(x)=P_0(x)z(x)+f_0(x)其中z(x)z(x)是某一多項式。

於是對於i<n2i<\frac{n}{2},有f(xi)=(f mod P0)(xi)f(x_i)=(f\bmod P_0)(x_i)。後一半同樣。遞歸計算即可,每次用分治卷積和多項式取模,複雜度爲O(nlog2n)O(n\log^2n)

多項式快速插值

給定nn個二元組(xi,yi)(x_i,y_i),求F(x)F(x)使F(xi)=yiF(x_i)=y_i

由拉格朗日插值公式,F(x)=ij≠i(xxj)j≠i(xixj)yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\prod_{j=\not i}(x_i-x_j)}\cdot y_i
M(x)=i(xxi)M(x)=\prod_i(x-x_i),則F(x)=ij≠i(xxj)M(xi)xixiyiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\frac{M(x_i)}{x_i-x_i}}\cdot y_iF(x)=ij≠i(xxj)M(xi)yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{M'(x_i)}\cdot y_i
此時可以用多項式多點求值求出所有的M(xi)M'(x_i)。設Ai=yiM(xi)A_i=\frac{y_i}{M'(x_i)},則等式變爲F(x)=iAij≠i(xxj)F(x)=\sum_iA_i\prod_{j=\not i}(x-x_j)
分治即可。設兩半邊答案分別爲F0(x)F_0(x)F1(x)F_1(x),則F(x)=F0(x)i=mid+1r(xxi)+F1(x)i=lmid(xxi)F(x)=F_0(x)\prod_{i=mid+1}^r(x-x_i)+F_1(x)\prod_{i=l}^{mid}(x-x_i)
複雜度爲O(nlog2n)O(n\log^2n)

*2019.01.11 13:30:18

線性遞推數列

給定長爲mm的數列a0,a1, ,am1a_0,a_1,\cdots,a_{m-1},給定f(i)(i<m)f(i)(i<m),已知對於任意imi\ge mf(i)=j=0m1ajf(ij)f(i)=\sum_{j=0}^{m-1}a_jf(i-j),求f(n)f(n)
n=1018n=10^{18}m=3×104m=3\times 10^4

設數列AA滿足fn=i=0Aifif_n=\sum_{i=0}^\infty A_if_i,則我們容易得到一個合法的數列AAAi={0(i≠n)1(i=n)A'_i=\begin{cases}0(i=\not n)\\1(i=n)\end{cases}。若我們求得一個AA使其非零項的下標都在[0,m1][0,m-1],則我們可以立即求得f(n)f(n)。現在考慮將AA'變形。

原等式變形得f(i)j=0i1ajf(ij)=0f(i)-\sum_{j=0}^{i-1}a_jf(i-j)=0設多項式Bi(x)=f(i)j=0i1ajf(ij)B_i(x)=f(i)-\sum_{j=0}^{i-1}a_jf(i-j),則其恆等於00

考慮這樣一個過程:我們已有一個合法的AA,其最高的非零項爲AkA_k,現將AA賦值爲ABkA-B_k,則其值不變,而最高非零項的下標嚴格減少。因此我們對AA'不斷做這個過程即可得到我們想要的AA

事實上,“不斷做這個過程”等價於將AA'Bm1B_{m-1}取模。用多項式取模,我們就在O(mlognlogm)O(m\log n\log m)的時間複雜度內解決了問題。*2018.12.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章