多项式取模及其应用

前置知识

多项式求逆。

多项式取模

问题描述

A(x) mod B(x) ,其中 degA >= degB

Solution

A(x)=B(x)C(x)+D(x) ,其中 degD < degB
degA = n degB= m ,则degD < m degC< n -m+ 1

A(1x)=B(1x)C(1x)+D(1x)

两边同时乘上 xn ,可得

xnA(1x)=xmB(1x)xnmC(1x)+xnD(1x)

考虑一下这个式子是什么意思,其实就是将系数全部对称交换一次,
即[ x0 ] A(x) =[ xn ] xnA(1x) ,[ x1 ] A(x) =[ xn1 ] xnA(1x) ……

接下来考虑每一个新得到的多项式的指数的范围。
xnA(1x) 的每一项指数范围为 [0,n]
xmB(1x) 的每一项指数范围为 [0,m]
xnmC(1x) 的每一项指数范围为 [0,nm]
xnD(1x) 的每一项指数范围为 [nm+1,n]
所以对上述式子对 xnm+1 取模,可以发现 xnD(1x) 不见了,而 xnmC(1x) 不会有任何变化。

于是便能得到形如下面的式子

A(x)=B(x)xnmC(1x)

所以

xnmC(1x)=A(x)B(x)=A(x)B1(x)

多项式求逆后便可得到 xnmC(1x) ,将系数翻转回来便可得到 C(x) ,之后便能顺势推出 D(x)
时间复杂度 O(n log n) ,常数较大。

多点求值

给出多项式 F(x) ,再给出 a1,a2,a3....,an ,求 F(a1) F(a2) ,……, F(an)
首先由因式定理可得 F(ai) = F(x) mod (xai)
接着我们考虑怎么加速这个过程。

考虑分治。
设多项式 Ql,r(x)=ri=l(xai) , Pl,r(x)=F(x) mod Ql,r(x)
显然有 F(ai) = Pi,i(x)
同时显然也有 Pl,mid(x)=Pl,r(x) mod Ql,mid(x) Pmid+1,r(x)=Pl,r(x) mod Qmid+1,r(x)
当我们分治到区间( i ,i),我们便求到了 F(ai)
Ql,r(x) 可以用分治 FFT 先求出来。

一次多项式取模的时间复杂度为 O(n log n) ,分治 FFT 的时间复杂度为 O(n log2 n) ,所以总的时间复杂度为 O(n log2 n) ,常数巨大。

插值

已知 F(a1) = b1 F(a2) = b2 …… F(an) = bn ,求 F(x)
考虑用拉格朗日插值法。

F(x)=i=1mbi[ijxajaiaj]

直接暴力算要 O(n2) ,但我们可以通过某些玄学方法优化时间复杂度。
将式子分成两部分。

F(x)=i=1mbi[ij(xaj)][ij(1aiaj)]

Gi=ij(aiaj)


M(x)=i=1n(xai),Mi(x)=ij(xai)=M(x)(xai)

则有 Gi=Mi(ai) ,同时也有 M(ai)=0

x =ai,也就是

Gi=Mi(ai)=M(x)M(ai)(xai)=M(ai)

用分治 FFT 求出 M(x) ,在求出其导函数 M(x) ,然后再做一次多点求值求出 Gi

接下来只剩下了 bi[ij(xaj)] ,这部分可以用分治 FFT 求解。

多点求值和分治 FFT 的时间复杂度都是 O(n log2 n) 的,所以总的时间复杂度是 O(n log2 n) ,常数……

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值