多项式求逆
已知
f(x),要求出
g(x)满足
f(x)g(x)≡1(modxn)
其中模
xn的意义是将指数大于等于
n的部分都去掉。
将
n向上扩充为
2k−1。假设我们已求出
g′(x)满足
f(x)g′(x)≡1(modx2n)
显然在模
xn成立的条件在模
x2n时也成立。于是上两式相减得
f(x)(g(x)−g′(x))≡0(modx2n)
由于
f(x)̸≡0,因此
g(x)−g′(x)≡0(modx2n)
两边平方得
g2(x)−2g(x)g′(x)+g′2(x)≡0(modxn)
两边同乘
f(x)得
g(x)−2g′(x)+f(x)g′2(x)≡0(modxn)
于是
g(x)≡2g′(x)−f(x)g′2(x)(modxn)
用FFT计算,递归求解即可。总时间复杂度为
O(nlogn)。
口诀:减去平成(2019.2.7)
多项式取模(多项式带余除法)
给定
f(x)、
g(x),要求
q(x)、
r(x)满足
f(x)=g(x)q(x)+r(x)
设
f(x)的阶为
n−1,
g(x)的阶为
m−1,则
q(x)的阶为
n−m,
r(x)的阶小于
m−1。
将
f(x)、
r(x)的系数在
[0,n−1]内翻转,
g(x)的系数在
[0,m−1]内翻转,
q(x)的系数在
[0,n−m]内翻转。以下标
r表示翻转,则同样有
fr(x)=gr(x)qr(x)+rr(x)
由于
r(x)的指数范围是
[0,m−2],因而
rr(x)的指数范围是
[n−m+1,n−1]。因此
fr(x)≡gr(x)qr(x)(modxn−m+1)
qr(x)≡fr(x)gr(x)−1(modxn−m+1)
由于
qr(x)的指数范围是
[0,n−m],模
xn−m+1对其不产生影响。于是可由此直接得到
q(x)。
多项式开方
求
g(x)满足
g2(x)≡f(x)(modxn)。
假设已求出
g′(x)满足
g′2(x)≡f(x)(modx2n),则
g′2(x)−g2(x)≡0(modx2n)
(g′(x)+g(x))(g′(x)−g(x))≡0(modx2n)
g′(x)−g(x)≡0(modx2n)
两边平方得
g2(x)−2g(x)g′(x)+g′2(x)≡0(modxn)
于是
g(x)≡2g′(x)f(x)+g′2(x)(modxn)
递归求解即可。注意如果取模,计算常数项时应用二次剩余。
现在你已经可以做小朋友与二叉树了。
11.19 here
扫描二维码关注公众号,回复:
5964974 查看本文章
多项式求对数
求
lnf(x)(modxn)。
lnf(x)≡∫(lnf(x))′≡∫f(x)f(x)′(modxn)。用多项式求导、多项式积分和多项式求逆即可。
多项式牛顿迭代
给定
g(f(x)),求其零点(即求一个
f(x)使
g(f(x))≡0(modxn))。
多项式上的牛顿迭代公式 设
f0(x)≡f(x)modx2n(modxn),则有
f(x)≡f0(x)−g′(f0(x))g(f0(x))(modxn)
递归解决即可。注意每次问题规模减半,每层复杂度
O(nlogn),因此总复杂度为
O(nlogn)。
多项式exp
求
f(x)≡eh(x)(modxn)。
两边取对数得
lnf(x)≡h(x)(modxn)
设
g(f(x))≡lnf(x)−h(x)(modxn),则问题变为求该函数的零点。由多项式上的牛顿迭代公式,有
f(x)≡f0(x)−f0(x)1lnf0(x)−h(x)(modxn)
f(x)≡f0(x)⋅(1−lnf0(x)+h(x))(modxn)
用牛顿迭代的方法递归即可。
多项式的幂
求
fg(x)(x)。
≡ef(x)lng(x)(modxn)
用多项式求对数和多项式exp即可。
Talk is cheap, show me the code!
[+] view code
FFT、NTT及FWT见多项式基础I。
多项式多点求值和多项式快速插值见多项式基础III。
另有任意模数NTT,无迹可循。