多项式基础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

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