多项式求逆元

概述

多项式求逆元是多项式除法和多项式取模的必要过程,在竞赛中,有时候多项式求逆元的应用比多项式的除法还要多,用快速傅里叶变换以及倍增算法可以做到在  O(nlogn) O(nlog⁡n) 的时间内求出一个多项式的逆元

基本概念

在介绍多项式的逆元之前,先说明一些概念:多项式的度、多项式的逆元、多项式的除法和取余

对于一个多项式  A(x) A(x),称其最高项的次数为这个多项式的(degree),记作  degA degA

对于多项式  A(x),B(x) A(x),B(x),存在唯一的  Q(x),R(x) Q(x),R(x) 满足  A(x)=Q(x)B(x)+R(x) A(x)=Q(x)B(x)+R(x),其中  degR<degB degR<degB,我们称  Q(x) Q(x) 为  B(x) B(x) 除  A(x) A(x) 的 R(x) R(x) 为  B(x) B(x) 除  A(x) A(x) 的余数,可以记作

A(x)R(x)(modB(x)) A(x)≡R(x)(modB(x))

多项式的逆元

对于一个多项式  A(x) A(x),如果存在  B(x) B(x) 满足  degBdegA degB≤degA 并且

A(x)B(x)1(modxn) A(x)B(x)≡1(modxn)

那么称  B(x) B(x) 为  A(x) A(x) 在  modxn modxn 意义下的逆元(inverse element),记作  A1(x) A−1(x)

求解过程

现在考虑如何求  A1(x) A−1(x),当  n=1 n=1 时, A(x)c(modx) A(x)≡c(modx) c c 是一个常数,这样, A1(x) A−1(x) 就是  c1 c−1

对于  n>1 n>1 的情况,设  B(x)=A1(x) B(x)=A−1(x) 由定义可以知道

A(x)B(x)1(modxn)(1) (1)A(x)B(x)≡1(modxn)

假设在  modxn2 modx⌈n2⌉ 意义下  A(x) A(x) 的逆元是  B(x) B′(x) 并且我们已经求出,那么

A(x)B(x)1(modxn2)(2) (2)A(x)B′(x)≡1(modx⌈n2⌉)

再将  (1) (1) 放到  modxn2 modx⌈n2⌉ 意义下

A(x)B(x)1(modxn2)(3) (3)A(x)B(x)≡1(modx⌈n2⌉)

然后  (2)(3) (2)−(3) 就可以得到

B(x)B(x)0(modxn2) B(x)−B′(x)≡0(modx⌈n2⌉)

两边平方

B2(x)2B(x)B(x)+B2(x)0(modxn) B2(x)−2B′(x)B(x)+B′2(x)≡0(modxn)

这里解释一下平方后为什么模的  xn2 x⌈n2⌉ 也会平方,这是因为,左边多项式在  modxn modxn 意义下为  0 0,那么就说明其  0 0 到  n1 n−1 次项系数都为  0 0,平方了之后,对于第  0i2n1 0≤i≤2n−1 项,其系数  ai ai 为  ij=0ajaij ∑j=0iajai−j,很明显  j j 和  ij i−j 之间必然有一个值小于  n n,因此  ai ai 必然是  0 0,也就是说平方后在  modx2n modx2n 意义下仍然为  0 0

然后同时乘上  A(x) A(x),移项可以得到

B(x)2B(x)A(x)B2(x)(modxn) B(x)≡2B′(x)−A(x)B′2(x)(modxn)

这样就可以得到  modxn modxn 意义下的逆元了,利用 FFT 加速之后可以做到在  O(nlogn) O(nlog⁡n) 时间内解决当前问题,最后总的时间复杂度也就是

T(n)=T(n2)+O(nlogn)=O(nlogn) T(n)=T(n2)+O(nlog⁡n)=O(nlog⁡n)

顺便一提,由这个过程可以看出,一个多项式有没有逆元完全取决于其常数项是否有逆元

代码实现

假设我已经有了计算快速傅里叶变换的函数 transform(int deg, complex_t* x, complex_t*w) 以及单位根表 eps 和 inv_eps

下面是数论版的,并且是完整的代码实现

 应用

预处理 Bernoulli 数

Bernoulli 数的指数生成函数(EGF)是

xex1=i=0Bixii! xex−1=∑i=0∞Bixii!

将  ex ex 泰勒展开就可以改写成

xex1=1i=0xi(i+1)! xex−1=1∑i=0∞xi(i+1)!

然后利用刚刚所说的方法,求出这个多项式的逆元就可以得到 Bernoulli 数了

计算有标号简单连通无向图个数

这篇文章,在列出方程后最后可以用多项式求逆优化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值