多项式基础3 多项式多点求值 多项式快速插值 多项式取模优化线性递推数列

本文介绍多项式多点求值与快速插值的方法,通过递归卷积和取模实现O(nlog^2n)的复杂度。同时探讨了线性递推数列的高效求解策略,利用多项式取模在O(mlognlogm)时间内解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多项式多点求值

给定nnn个值xix_ixi,求f(xi)f(x_i)f(xi)

f0(x)=∑i=0n2−1f(xi)f_0(x)=\sum_{i=0}^{\frac{n}{2}-1}f(x_i)f0(x)=i=02n1f(xi)P0(x)=∏i=0n2−1x−xiP_0(x)=\prod_{i=0}^{\frac{n}{2}-1}x-x_iP0(x)=i=02n1xxi。则有f(x)=P0(x)z(x)+f0(x)f(x)=P_0(x)z(x)+f_0(x)f(x)=P0(x)z(x)+f0(x)其中z(x)z(x)z(x)是某一多项式。

于是对于i&lt;n2i&lt;\frac{n}{2}i<2n,有f(xi)=(f&VeryThinSpace;mod&VeryThinSpace;P0)(xi)f(x_i)=(f\bmod P_0)(x_i)f(xi)=(fmodP0)(xi)。后一半同样。递归计算即可,每次用分治卷积和多项式取模,复杂度为O(nlog⁡2n)O(n\log^2n)O(nlog2n)

多项式快速插值

给定nnn个二元组(xi,yi)(x_i,y_i)(xi,yi),求F(x)F(x)F(x)使F(xi)=yiF(x_i)=y_iF(xi)=yi

由拉格朗日插值公式,F(x)=∑i∏j≠i(x−xj)∏j≠i(xi−xj)⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\prod_{j=\not i}(x_i-x_j)}\cdot y_iF(x)=ij≠i(xixj)j≠i(xxj)yi
M(x)=∏i(x−xi)M(x)=\prod_i(x-x_i)M(x)=i(xxi),则F(x)=∑i∏j≠i(x−xj)M(xi)xi−xi⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\frac{M(x_i)}{x_i-x_i}}\cdot y_iF(x)=ixixiM(xi)j≠i(xxj)yiF(x)=∑i∏j≠i(x−xj)M′(xi)⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{M&#x27;(x_i)}\cdot y_iF(x)=iM(xi)j≠i(xxj)yi
此时可以用多项式多点求值求出所有的M′(xi)M&#x27;(x_i)M(xi)。设Ai=yiM′(xi)A_i=\frac{y_i}{M&#x27;(x_i)}Ai=M(xi)yi,则等式变为F(x)=∑iAi∏j≠i(x−xj)F(x)=\sum_iA_i\prod_{j=\not i}(x-x_j)F(x)=iAij≠i(xxj)
分治即可。设两半边答案分别为F0(x)F_0(x)F0(x)F1(x)F_1(x)F1(x),则F(x)=F0(x)∏i=mid+1r(x−xi)+F1(x)∏i=lmid(x−xi)F(x)=F_0(x)\prod_{i=mid+1}^r(x-x_i)+F_1(x)\prod_{i=l}^{mid}(x-x_i)F(x)=F0(x)i=mid+1r(xxi)+F1(x)i=lmid(xxi)
复杂度为O(nlog⁡2n)O(n\log^2n)O(nlog2n)

*2019.01.11 13:30:18

线性递推数列

给定长为mmm的数列a0,a1,⋯&ThinSpace;,am−1a_0,a_1,\cdots,a_{m-1}a0,a1,,am1,给定f(i)(i&lt;m)f(i)(i&lt;m)f(i)(i<m),已知对于任意i≥mi\ge mimf(i)=∑j=0m−1ajf(i−j)f(i)=\sum_{j=0}^{m-1}a_jf(i-j)f(i)=j=0m1ajf(ij),求f(n)f(n)f(n)
n=1018n=10^{18}n=1018m=3×104m=3\times 10^4m=3×104

设数列AAA满足fn=∑i=0∞Aifif_n=\sum_{i=0}^\infty A_if_ifn=i=0Aifi,则我们容易得到一个合法的数列AAAAi′={0(i≠n)1(i=n)A&#x27;_i=\begin{cases}0(i=\not n)\\1(i=n)\end{cases}Ai={0(i≠n)1(i=n)。若我们求得一个AAA使其非零项的下标都在[0,m−1][0,m-1][0,m1],则我们可以立即求得f(n)f(n)f(n)。现在考虑将A′A&#x27;A变形。

原等式变形得f(i)−∑j=0i−1ajf(i−j)=0f(i)-\sum_{j=0}^{i-1}a_jf(i-j)=0f(i)j=0i1ajf(ij)=0设多项式Bi(x)=f(i)−∑j=0i−1ajf(i−j)B_i(x)=f(i)-\sum_{j=0}^{i-1}a_jf(i-j)Bi(x)=f(i)j=0i1ajf(ij),则其恒等于000

考虑这样一个过程:我们已有一个合法的AAA,其最高的非零项为AkA_kAk,现将AAA赋值为A−BkA-B_kABk,则其值不变,而最高非零项的下标严格减少。因此我们对A′A&#x27;A不断做这个过程即可得到我们想要的AAA

事实上,“不断做这个过程”等价于将A′A&#x27;ABm−1B_{m-1}Bm1取模。用多项式取模,我们就在O(mlog⁡nlog⁡m)O(m\log n\log m)O(mlognlogm)的时间复杂度内解决了问题。*2018.12.5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值