多项式的各种操作

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

求导

对于一个普通多项式 A(x)=aixbi A ( x ) = ∑ a i x b i ,它的导数为 A(x)=aibixbi1 A ′ ( x ) = ∑ a i b i x b i − 1

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

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

积分

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

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

反转

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

AR(x)=xdeg(A)A(1x) A R ( x ) = x d e g ( A ) A ( 1 x )

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

多项式对数

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

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

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

牛顿迭代

普通牛顿迭代

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

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

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

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

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

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

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

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

多项式牛顿迭代

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

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

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

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

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

f(x) f ( x ) f0(x) f 0 ( x ) 的后 n2 ⌈ n 2 ⌉ 是一样的,注意到第三项的 (f(x)f0(x))2 ( f ( x ) − f 0 ( x ) ) 2 ,则其后 n n 项必然是为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 ) = 1 A ( x ) ( mod x n )

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

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

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

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

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

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

多项式开根

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

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

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

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

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

多项式求exp

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

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

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

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

时间复杂度 T(n)=T(n2)+O(nlogn)=O(nlogn) T ( n ) = T ( n 2 ) + O ( n log ⁡ n ) = O ( n log ⁡ 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) d e g ( R ) < d e g ( B ) < d e g ( A ) , deg(D)=deg(A)deg(B)+1 d e g ( D ) = d e g ( A ) − d e g ( B ) + 1

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

  • 有余数
  • 没有模

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

那么我们可以得到 AR(x)BR(x)DR(x)(modxnm+1) A R ( x ) ≡ B R ( x ) D R ( x ) ( mod x n − m + 1 )

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

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

多项式k次方

A(x)k=eklnA(x) A ( x ) k = e k ln ⁡ A ( x )

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值