多项式的各种操作
By SemiWaker
目录
- 多项式乘法点这里
- 多项式逆元
- 多项式除法
- 多项式牛顿迭代法
- 多项式对数
- 多项式指数函数
- 多项式幂函数
- 多项式三角函数
- 多项式多点求值
- 多项式快速插值
多项式逆元
定义
A(x)A−1(x)≡1(modxn)
- A(x):要求逆元的多项式
- A−1(x) :多项式 A(x) 的逆元
- (modxn) :在模 xn 的意义下。 xn 是一个多项式,不是一个数。
模 xn 的意义类似数的除法:设 a=bd+r ,且 r<b ,那么有 a≡r(modb) 。在多项式中,只要r的界比b的界小就好了。
多项式除法要用多项式逆元,但是多项式逆元的定义又是多项式除法,这里先介绍多项式逆元,所以除法部分简单略过
xn 比较特殊,因为模 xn 实际上就是舍弃掉 ≥n 次的所有项,只剩下 0 到 n-1次的项。
(原因显然 ∑N−1i=0aixi=xn∑N−n−1i=0aixi+∑n−1i=0aixi )
为什么要模 xn 呢?
因为如果不模的话,除了只有常数项的多项式以外,其他多项式的逆元都是无穷级数。
例: 1+2x+3x2 。为了方便我们只写系数数列,从次数小的开始。
可以写成 1 1 1 。
设这个数列是 ai ,然后设逆元的系数数列是 bi ,最后设它们乘起来是 ci 。
根据定义, ci 满足 c0=1 , ∀i>0,ci=0 。
然后我们考虑这个的逆元会是什么。
显然 b0=1 。
然后 c1=a0b1+a1b0 ,可以解出 b1=−1
然后 c2=a0b2+a1b1+a2b0 ,可以解出 b2=0
依次类推 b3=1 , b4=−1 ……
发现无论如何都有非0项存在,所以是无穷级数。
模 xn 之后就可以解决这个问题,我们就可以只求我们需要的前n项。
做法
暴力做法
上面举例为什么一定要模 xn 的时候,已经给出了暴力做法了。
直接递推,时间复杂度 O(n2)
非暴力:
基本思路:倍增
只有常数项的多项式求逆元是比较简单的事,即普通的求逆元。
然后考虑怎么让已经求出的多项式翻倍,也就是倍增的思路。
首先,我们设长度为 ⌈n2⌉ 的已经求出的逆元为B(x)。
注意,是向上取整。
向上取整的好处是:翻倍后保证长度 ≥n 。
A(x)B(x)≡1(modx⌈n2⌉)
然后直接设当前求的逆元为 A−1(x)
A(x)A