多项式全家桶——炫酷多项式变换

FFT

相信大家FFT已经掌握的很熟练了。

参考这一篇博客:浅谈算法——从多项式乘法到FFT

常数优化1——IDFT

若已知多项式A(x)A(x)A(x)的点值表示
&lt;(ωn0,A(ωn0)),(ωn1,A(ωn1)),⋯&ThinSpace;,(ωnn−1,A(ωnn−1))&gt; &lt;(\omega_n^0,A(\omega_n^0)),(\omega_n^1,A(\omega_n^1)),\cdots,(\omega_n^{n-1},A(\omega_n^{n-1}))&gt; <(ωn0,A(ωn0)),(ωn1,A(ωn1)),,(ωnn1,A(ωnn1))>
则多项式A(x)A(x)A(x)满足
[xrev(k)]A(x)=1n∑i=0n−1ωnkiA(ωni) [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ki}A(\omega_n^i) [xrev(k)]A(x)=n1i=0n1ωnkiA(ωni)
其中
rev(k)={0k=0n−k−1k̸=0 rev(k)=\begin{cases} 0 &amp; k=0\\ n-k-1 &amp; k\not= 0 \end{cases} rev(k)={0nk1k=0k̸=0
就是说:IDFT只需要调用DFT函数然后std::reverse(a+1,a+n+1),最后同时除以nnn即可。

证明:假设
A(x)=∑i=0n−1aixi A(x)=\sum_{i=0}^{n-1}a_ix^i A(x)=i=0n1aixi
那么
[xrev(k)]A(x)=1n∑i=0n−1ωnki∑j=0n−1ajωnij [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}\omega_n^{ki}\sum_{j=0}^{n-1}a_j\omega_n^{ij} [xrev(k)]A(x)=n1i=0n1ωnkij=0n1ajωnij
交换两个求和符号
[xrev(k)]A(x)=1n∑i=0n−1ai∑j=0n−1ωnijωnkj [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}a_i\sum_{j=0}^{n-1}\omega_n^{ij}\omega_n^{kj} [xrev(k)]A(x)=n1i=0n1aij=0n1ωnijωnkj
显然
[xrev(k)]A(x)=1n∑i=0n−1ai∑j=0n−1ωn(i+k)j [x^{rev(k)}]A(x)=\frac{1}{n}\sum_{i=0}^{n-1}a_i\sum_{j=0}^{n-1}\omega_n^{(i+k)j} [xrev(k)]A(x)=n1i=0n1aij=0n1ωn(i+k)j
此时,若i=rev(k)i=rev(k)i=rev(k),则i+k=0(&VeryThinSpace;mod&VeryThinSpace;n)i+k=0(\bmod n)i+k=0(modn),此时
ωn(i+k)j=1 \omega_n^{(i+k)j}=1 ωn(i+k)j=1

∑j=0n−1ωn(i+k)j=n \sum_{j=0}^{n-1}\omega_n^{(i+k)j}=n j=0n1ωn(i+k)j=n
否则由等比数列求和公式
∑j=0n−1ωn(i+k)j=1−ωn(i+k)n1−ωni+k=0 \sum_{j=0}^{n-1}\omega_n^{(i+k)j}=\frac{1-\omega_n^{(i+k)n}}{1-\omega_n^{i+k}}=0 j=0n1ωn(i+k)j=1ωni+k1ωn(i+k)n=0
因此
[xrev(k)]A(x)=1narev(k)n=arev(k) [x^{rev(k)}]A(x)=\frac{1}{n}a_{rev(k)}n=a_{rev(k)} [xrev(k)]A(x)=n1arev(k)n=arev(k)

常数优化2

假设有两个实多项式A(x),B(x)A(x),B(x)A(x),B(x),现在要求出他们两个的FFT后的结果。若
P(x)=A(x)+iB(x) P(x)=A(x)+iB(x) P(x)=A(x)+iB(x)

A(ωnk)=P(ωnk)+conj(P(ωnrev(k)))2B(ωnk)=iP(ωnk)−conj(P(ωnrev(k)))2 A(\omega_n^k)=\frac{P(\omega_n^k)+\mathrm{conj}(P(\omega_n^{rev(k)}))}{2}\\ B(\omega_n^k)=i\frac{P(\omega_n^k)-\mathrm{conj}(P(\omega_n^{rev(k)}))}{2} A(ωnk)=2P(ωnk)+conj(P(ωnrev(k)))B(ωnk)=i2P(ωnk)conj(P(ωnrev(k)))
其中i=−1i=\sqrt{-1}i=1conj(x)\mathrm{conj}(x)conj(x)xxx的共轭虚数。

证明:容易发现,我们只需要证明
conj(P(ωnrev(k)))=A(ωnk)−iB(ωnk) \mathrm{conj}(P(\omega_n^{rev(k)}))=A(\omega_n^k)-iB(\omega_n^k) conj(P(ωnrev(k)))=A(ωnk)iB(ωnk)
即可得证。

假设
A(x)=∑i=0n−1aixiB(x)=∑i=0n−1bixi A(x)=\sum_{i=0}^{n-1}a_ix^i\\ B(x)=\sum_{i=0}^{n-1}b_ix^i A(x)=i=0n1aixiB(x)=i=0n1bixi
那么
A(ωnk)−iB(ωnk)=∑j=0n−1ajωnkj−i∑j=0n−1bjωnkj A(\omega_n^k)-iB(\omega_n^k)=\sum_{j=0}^{n-1}a_j\omega_n^{kj}-i\sum_{j=0}^{n-1}b_j\omega_n^{kj} A(ωnk)iB(ωnk)=j=0n1ajωnkjij=0n1bjωnkj
由于
ωnk=cos⁡2πkn+isin⁡2πkn \omega_n^k=\cos\frac{2\pi k}{n}+i\sin\frac{2\pi k}{n} ωnk=cosn2πk+isinn2πk
带入得
A(ωnk)−iB(ωnk)=∑j=0n−1aj(cos⁡2πkjn+isin⁡2πkjn)+∑j=0n−1bi(−icos⁡2πkjn+sin⁡2πkjn) A(\omega_n^k)-iB(\omega_n^k)=\sum_{j=0}^{n-1}a_j(\cos \frac{2\pi kj}{n}+i\sin\frac{2\pi kj}{n})+\sum_{j=0}^{n-1}b_i(-i\cos \frac{2\pi kj}{n}+\sin \frac{2\pi kj}{n}) A(ωnk)iB(ωnk)=j=0n1aj(cosn2πkj+isinn2πkj)+j=0n1bi(icosn2πkj+sinn2πkj)
而由于ωnrev(k)=ωn−k\omega_n^{rev(k)}=\omega_n^{-k}ωnrev(k)=ωnk
conj(P(ωnrev(k)))=conj(A(ωn−k)+iB(ωn−k)) \mathrm{conj}(P(\omega_n^{rev(k)}))=\mathrm{conj}(A(\omega_n^{-k})+iB(\omega_n^{-k})) conj(P(ωnrev(k)))=conj(A(ωnk)+iB(ωnk))

conj(P(ωnrev(k)))=conj(∑j=0n−1aj(cos⁡(−2πkjn)+isin⁡(−2πkjn))+∑j=0n−1bj(icos⁡(−2πkjn)−sin⁡(−2πkjn))) \mathrm{conj}(P(\omega_n^{rev(k)}))=\mathrm{conj}(\sum_{j=0}^{n-1}a_j(\cos(-\frac{2\pi kj}{n})+i\sin(-\frac{2\pi kj}{n}))+\sum_{j=0}^{n-1}b_j(i\cos(-\frac{2\pi kj}{n})-\sin(-\frac{2\pi kj}{n}))) conj(P(ωnrev(k)))=conj(j=0n1aj(cos(n2πkj)+isin(n2πkj))+j=0n1bj(icos(n2πkj)sin(n2πkj)))
由于sin⁡(−x)=−sin⁡x,cos⁡(−x)=cos⁡x\sin (-x)=-\sin x,\cos(-x)=\cos xsin(x)=sinx,cos(x)=cosx
conj(P(ωnrev(k)))=conj(∑j=0n−1aj(cos⁡2πkjn−isin⁡2πkjn)+∑j=0n−1bj(icos⁡2πkjn+sin⁡2πkjn)) \mathrm{conj}(P(\omega_n^{rev(k)}))=\mathrm{conj}(\sum_{j=0}^{n-1}a_j(\cos \frac{2\pi kj}{n}-i\sin \frac{2\pi kj}{n})+\sum_{j=0}^{n-1}b_j(i\cos\frac{2\pi kj}{n}+\sin \frac{2\pi kj}{n})) conj(P(ωnrev(k)))=conj(j=0n1aj(cosn2πkjisinn2πkj)+j=0n1bj(icosn2πkj+sinn2πkj))
由于aj,bja_j,b_jaj,bj是实数,因此
conj(P(ωnrev(k)))=A(ωnk)−iB(ωnk) \mathrm{conj}(P(\omega_n^{rev(k)}))=A(\omega_n^k)-iB(\omega_n^k) conj(P(ωnrev(k)))=A(ωnk)iB(ωnk)
因此,我们将两个多项式的FFT变成了一个多项式的FFT。

MTT

对于两个多项式
A(x),B(x) A(x),B(x) A(x),B(x)
求多项式乘法,&VeryThinSpace;mod&VeryThinSpace;109+7\bmod 10^9+7mod109+7之类的质数。

不能NTT,FFT的精度误差太大,怎么办?

假设这个质数为ppp,令p′=⌊p⌋p&#x27;=\lfloor\sqrt{p}\rfloorp=p
A(x)=p′QA(x)+RA(x)B(x)=p′QB(x)+RB(x) A(x)=p&#x27;Q_A(x)+R_A(x)\\ B(x)=p&#x27;Q_B(x)+R_B(x) A(x)=pQA(x)+RA(x)B(x)=pQB(x)+RB(x)
其中RA(x)R_A(x)RA(x)RB(x)R_B(x)RB(x)的每一项的系数都&lt;p′&lt; p&#x27;<p,那么
A(x)B(x)=p′2QA(x)QB(x)+p′(QA(x)RB(x)+QB(x)RA(x))+RA(x)RB(x) A(x)B(x)=p&#x27;^2Q_A(x)Q_B(x)+p&#x27;(Q_A(x)R_B(x)+Q_B(x)R_A(x))+R_A(x)R_B(x) A(x)B(x)=p2QA(x)QB(x)+p(QA(x)RB(x)+QB(x)RA(x))+RA(x)RB(x)
这样能大大减小精度误差。

常数优化

使用上面FFT部分中提到的常数优化2即可。

多项式求逆

A(x)F(x)=1mod&ThinSpace;&ThinSpace;xn A(x)F(x)=1\mod{x^n} A(x)F(x)=1modxn

其中nnn是多项式A(x)A(x)A(x)的度数。

假设我们已经求出了
A(x)F0(x)=1mod&ThinSpace;&ThinSpace;x⌈n/2⌉ A(x)F_0(x)=1\mod x^{\lceil n/2\rceil} A(x)F0(x)=1modxn/2
上面两式相减
F(x)−F0(x)=0mod&ThinSpace;&ThinSpace;x⌈n/2⌉ F(x)-F_0(x)=0\mod x^{\lceil n/2\rceil} F(x)F0(x)=0modxn/2
两边平方
F2(x)−2F(x)F0(x)+F02(x)=0mod&ThinSpace;&ThinSpace;xn F^2(x)-2F(x)F_0(x)+F_0^2(x)=0\mod x^n F2(x)2F(x)F0(x)+F02(x)=0modxn
左右同时乘以A(x)A(x)A(x)
F(x)−2F0(x)+A(x)F02(x)=0mod&ThinSpace;&ThinSpace;xn F(x)-2F_0(x)+A(x)F_0^2(x)=0\mod x^n F(x)2F0(x)+A(x)F02(x)=0modxn

F(x)=2F0(x)−A(x)F02(x)mod&ThinSpace;&ThinSpace;xn F(x)=2F_0(x)-A(x)F_0^2(x)\mod x^n F(x)=2F0(x)A(x)F02(x)modxn

常数优化

对于MTT在多项式求逆上的常数优化,参见这篇文章:一个多项式求逆的卡常技巧

多项式取对数

F(x)=ln⁡A(x)mod&ThinSpace;&ThinSpace;xn F(x)=\ln A(x)\mod x^{n} F(x)=lnA(x)modxn

考虑对两边同时求导
F′(x)=A−1(x)A′(x)mod&ThinSpace;&ThinSpace;xn F&#x27;(x)=A^{-1}(x)A&#x27;(x)\mod x^n F(x)=A1(x)A(x)modxn
因此
F(x)=∫A−1(x)A′(x)dx F(x)=\int A^{-1}(x)A&#x27;(x)\mathrm dx F(x)=A1(x)A(x)dx

牛顿迭代

对于一个多项式F(x)F(x)F(x),满足
G(F(x))=0mod&ThinSpace;&ThinSpace;xn G(F(x))=0\mod x^n G(F(x))=0modxn
G(x)G(x)G(x)已知,现在要求F(x)F(x)F(x)

假设已经求出了
G(F0(x))=0mod&ThinSpace;&ThinSpace;x⌈n/2⌉ G(F_0(x))=0\mod x^{\lceil n/2\rceil} G(F0(x))=0modxn/2
考虑对G(F(x))G(F(x))G(F(x))F0(x)F_0(x)F0(x)处展开
G(F(x))=G(F0(x))+G′(F0(x))1!(F(x)−F0(x))+G′′(F0(x))2!(F(x)−F0(x))2+⋯ G(F(x))=G(F_0(x))+\frac{G&#x27;(F_0(x))}{1!}(F(x)-F_0(x))+\frac{G&#x27;&#x27;(F_0(x))}{2!}(F(x)-F_0(x))^2+\cdots G(F(x))=G(F0(x))+1!G(F0(x))(F(x)F0(x))+2!G(F0(x))(F(x)F0(x))2+
注意这里的G′(F(x))G&#x27;(F(x))G(F(x))G(F(x))G(F(x))G(F(x))F(x)F(x)F(x)取导数的结果。

由于F(x)F(x)F(x)F0(x)F_0(x)F0(x)的最后⌈n2⌉\lceil \frac{n}{2}\rceil2n项相同,因此
(F(x)−F0(x))k=0mod&ThinSpace;&ThinSpace;xn (F(x)-F_0(x))^k=0\mod x^n (F(x)F0(x))k=0modxn
k≥2k\geq 2k2时都成立。

因此
G(F(x))=G(F0(x))+G′(F0(x))(F(x)−F0(x))mod&ThinSpace;&ThinSpace;xn G(F(x))=G(F_0(x))+G&#x27;(F_0(x))(F(x)-F_0(x))\mod x^n G(F(x))=G(F0(x))+G(F0(x))(F(x)F0(x))modxn
由于
G(F0(x))=0mod&ThinSpace;&ThinSpace;xn G(F_0(x))=0\mod x^n G(F0(x))=0modxn
因此
F(x)=F0(x)−G(F0(x))G′(F0(x))mod&ThinSpace;&ThinSpace;xn F(x)=F_0(x)-\frac{G(F_0(x))}{G&#x27;(F_0(x))}\mod x^n F(x)=F0(x)G(F0(x))G(F0(x))modxn

多项式求指数

F(x)=eA(x)mod&ThinSpace;&ThinSpace;xn F(x)=e^{A(x)}\mod x^n F(x)=eA(x)modxn

两边同时取对数得到
ln⁡F(x)=A(x)mod&ThinSpace;&ThinSpace;xn \ln F(x)=A(x)\mod x^n lnF(x)=A(x)modxn

G(F(x))=ln⁡F(x)−A(x)=0mod&ThinSpace;&ThinSpace;xn G(F(x))=\ln F(x)-A(x)=0\mod x^n G(F(x))=lnF(x)A(x)=0modxn
容易发现
G′(F(x))=F−1(x)mod&ThinSpace;&ThinSpace;xn G&#x27;(F(x))=F^{-1}(x)\mod x^n G(F(x))=F1(x)modxn
套牛顿迭代公式,假设我们已经求出了
ln⁡F0(x)−A(x)=0mod&ThinSpace;&ThinSpace;x⌈n/2⌉ \ln F_0(x)-A(x)=0\mod x^{\lceil n/2\rceil} lnF0(x)A(x)=0modxn/2

F(x)=F0(x)−F0(x)(ln⁡F0(x)−A(x))mod&ThinSpace;&ThinSpace;xn F(x)=F_0(x)-F_0(x)(\ln F_0(x)-A(x))\mod x^n F(x)=F0(x)F0(x)(lnF0(x)A(x))modxn
更优雅的式子是
F(x)=F0(x)(1−ln⁡F0(x)+A(x))mod&ThinSpace;&ThinSpace;xn F(x)=F_0(x)(1-\ln F_0(x)+A(x))\mod x^n F(x)=F0(x)(1lnF0(x)+A(x))modxn

多项式开方

F2(x)=A(x)mod&ThinSpace;&ThinSpace;xn F^2(x)=A(x)\mod x^n F2(x)=A(x)modxn

考虑
G(F(x))=F2(x)−A(x)=0mod&ThinSpace;&ThinSpace;xn G(F(x))=F^2(x)-A(x)=0\mod x^n G(F(x))=F2(x)A(x)=0modxn
容易发现
G′(F(x))=2F(x)mod&ThinSpace;&ThinSpace;xn G&#x27;(F(x))=2F(x)\mod x^n G(F(x))=2F(x)modxn
套牛顿迭代公式,假设我们已经求出了
F02(x)−A(x)=0mod&ThinSpace;&ThinSpace;x⌈n/2⌉ F_0^2(x)-A(x)=0\mod x^{\lceil n/2\rceil} F02(x)A(x)=0modxn/2
即有
F(x)=F0(x)−2−1F0−1(x)(F02(x)−A(x))mod&ThinSpace;&ThinSpace;xn F(x)=F_0(x)-2^{-1}F_0^{-1}(x)(F_0^2(x)-A(x))\mod x^n F(x)=F0(x)21F01(x)(F02(x)A(x))modxn
更优雅的式子是
F(x)=2−1(F0(x)+A(x)F0−1(x))mod&ThinSpace;&ThinSpace;xn F(x)=2^{-1}(F_0(x)+A(x)F_0^{-1}(x))\mod x^n F(x)=21(F0(x)+A(x)F01(x))modxn

拉格朗日反演


G(F(x))=x G(F(x))=x G(F(x))=x
已知G(x)G(x)G(x)要求F(x)F(x)F(x)。其中,G(x)G(x)G(x)无常数项。

经过一些奥妙重重的变换可以得到
[xn]F(x)=1n[xn−1]1G′n(x) [x^n]F(x)=\frac{1}{n}[x^{n-1}]\frac{1}{G&#x27;^n(x)} [xn]F(x)=n1[xn1]Gn(x)1
其中
G′(x)=G(x)x G&#x27;(x)=\frac{G(x)}{x} G(x)=xG(x)
为啥?我也不知道……

UPD:证明

转载于:https://www.cnblogs.com/Canopus-wym/p/10376339.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值