多项式的各种操作

这篇博客好像咕咕咕了很久,本来是应该学完NTT之后搞的,然而那段时间在回归常规……

求导

对于一个普通多项式A(x)=aixbiA(x)=∑aixbi,它的导数为A(x)=aibixbi1A′(x)=∑aibixbi−1

补充一些式子(AB)=uv+uv(AB)′=u′v+uv′

时间复杂度O(n)O(n)

积分

对于一个普通多项式A(x)=aixbiA(x)=∑aixbi,积分和求导是一种逆操作,那么对它做积分之后的形式是A(x)=aibi+1xbi+1A(x)=∑aibi+1xbi+1。注意到这个是没有常数项的,那么为了还原函数,我们还需要引入常数项。

时间复杂度O(n)O(n)

反转

对于多项式A(x)=aixiA(x)=∑aixi,其反转后的多项式记做AR(x)=ani1xiAR(x)=∑an−i−1xi,即相当于把所有的系数翻转。也有以下这种形式

AR(x)=xdeg(A)A(1x)AR(x)=xdeg(A)A(1x)

时间复杂度O(n)O(n)

多项式对数

对于给定的多项式A(x)A(x),求一个多项式f(x)f(x)满足f(x)=lnA(x)(modxn)f(x)=ln⁡A(x)(modxn)

lnA(x)=(lnA(x))=A(x)A(x)ln⁡A(x)=∫(ln⁡A(x))′=∫A′(x)A(x)

时间复杂度O(nlogn)O(nlog⁡n)

牛顿迭代

普通牛顿迭代

用于求一个函数f(x)f(x)的零点。

  • 瞎猜一个零点x
  • 取函数在x处的切线的零点为新的x,再继续迭代

这个步骤可以简化为一个递推

xn+1=xnf(xn)f(xn)xn+1=xn−f(xn)f′(xn)

有一种泰勒展开的考虑方法,在x处进行泰勒展开

f(x)=f(xn)+f(xn)(xxn)1!+f(xn)(xxn)22!+f(x)=f(xn)+f′(xn)(x−xn)1!+f″(xn)(x−xn)22!+⋯

我们知道泰勒展开是展开项越多,与原函数就拟合得越好。但是为了简便,我们可以只保留线性部分,也就是前两项,同样可以得到那个递推式。但由于我们每次只保留的线性部分,所以结果是不精确的,需要多次迭代才能满足精度上的要求。

能用牛顿迭代求零点的函数的充分条件是,要二阶可导且起始点位于待求的零点的邻近区域。但是也有可能这个区域只包含了零点,比如f(x)=x13f(x)=x13。要注意有可能初始点处的导数恰好为0,此时只需要重新选点即可。

多项式牛顿迭代

用于求满足g(f(x))0(modxn)g(f(x))≡0(modxn)的多项式f(x)f(x)

如果n=1,那么就只有常数项,直接算即可。

思想有点类似于多项式求逆,基本步骤是和上面类似的。

假设我们已经算出来了f0(x)f0(x)满足g(f0(x))0(modxn2)g(f0(x))≡0(modx⌈n2⌉)。我们把f0(x)f0(x)看作普通牛顿迭代法中的x0x0,那么我们在此处进行泰勒展开

g(f(x))=g(f0(x))+g(f0(x))(f(x)f0(x))+g(f(x))=g(f0(x))+g′(f0(x))(f(x)−f0(x))+⋯

f(x)f(x)f0(x)f0(x)的后n2⌈n2⌉是一样的,注意到第三项的(f(x)f0(x))2(f(x)−f0(x))2,则其后nn项必然是为0,更高次的同理。那么我们可以得到结论,多项式牛顿迭代求出的是精确解

f(x)=f0(x)g(f(x))g(f(x))

用其可以做多项式求逆,多项式开根,多项式求exp。

多项式求逆

对于给定的多项式A(x)A(x),求一个多项式f(x)f(x)满足f(x)=1A(x)(modxn)f(x)=1A(x)(modxn)

我们尝试构造这样的一个多项式G(x)G(x),使得其零点的多项式即为f(x)f(x),则有

G(f(x))=1f(x)A(x)G(f(x))=1f(x)−A(x)

G(f(x))=1f2(x)G′(f(x))=−1f2(x)

求其零点,那么我们直接代入牛顿迭代的式子中即得

f(x)=2f0(x)A(x)f20(x)f(x)=2f0(x)−A(x)f02(x)

时间复杂度T(n)=T(n2)+O(nlogn)=O(nlogn)T(n)=T(n2)+O(nlog⁡n)=O(nlog⁡n)

多项式开根

对于给定的多项式A(x)A(x),求一个多项式f(x)f(x)满足f2(x)=A(x)(modxn)f2(x)=A(x)(modxn)

我们同样可以构造一个多项式G(f(x))=f2(x)AG(f(x))=f2(x)−A,即得

G(f(x))=2f(x)G′(f(x))=2f(x)

f(x)=f20(x)+A(x)2f0(x)f(x)=f02(x)+A(x)2f0(x)

时间复杂度T(n)=T(n2)+O(nlogn)=O(nlogn)T(n)=T(n2)+O(nlog⁡n)=O(nlog⁡n)

多项式求exp

对于给定的多项式A(x)A(x),求一个多项式f(x)f(x)满足ef(x)=A(x)ef(x)=A(x)

构造G(x)=lnf(x)A(x)G(x)=ln⁡f(x)−A(x)

G(x)=1f(x)G′(x)=1f(x)

f(x)=f0(x)(1lnf0(x)+A(x))f(x)=f0(x)(1−ln⁡f0(x)+A(x))

时间复杂度T(n)=T(n2)+O(nlogn)=O(nlogn)T(n)=T(n2)+O(nlog⁡n)=O(nlog⁡n)

多项式除法与取模

A(x)=B(x)D(x)+R(x)A(x)=B(x)D(x)+R(x),其中A(x)A(x)为被除数,B(x)B(x)为除数,D(x)D(x)为商,R(x)R(x)为余数。它们满足deg(R)<deg(B)<deg(A)deg(R)<deg(B)<deg(A),deg(D)=deg(A)deg(B)+1deg(D)=deg(A)−deg(B)+1

我们只需要求出D(x)D(x)即可,这样R(x)R(x)可以代入得到。我们当然希望能利用到逆元,联系一下与多项式逆元的区别,我们来解决这些区别即可。

  • 有余数
  • 没有模

为了方便描述,我们不妨设deg(A)=n,deg(B)=mdeg(A)=n,deg(B)=m,则有deg(D)=nm+1deg(D)=n−m+1。模不能影响D(x)D(x),又要能消去R(x)R(x)的影响,那么可以考虑模xnm+1xn−m+1。我们知道在做NTT的时候N>nN>n,这样即是把从N开始的至少m-1项的系数给直接删去了。注意到deg(R)<mdeg(R)<m,那么我们把R进行反转即可。

那么我们可以得到AR(x)BR(x)DR(x)(modxnm+1)AR(x)≡BR(x)DR(x)(modxn−m+1)

得到D(x)D(x)后直接利用原来的等式即可求得R(x)R(x)

时间复杂度O(nlogn)O(nlog⁡n)

多项式k次方

A(x)k=eklnA(x)A(x)k=ekln⁡A(x)

时间复杂度O(nlogn)O(nlog⁡n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值