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

文章目录

  • FFT
    • 常数优化1——IDFT
    • 常数优化2
  • MTT
    • 常数优化
  • 多项式求逆
    • 常数优化
  • 多项式取对数
  • 牛顿迭代
  • 多项式求指数
  • 多项式开方
  • 拉格朗日反演

FFT

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

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

常数优化1——IDFT

若已知多项式 A ( x ) A(x) A(x)的点值表示
< ( ω n 0 , A ( ω n 0 ) ) , ( ω n 1 , A ( ω n 1 ) ) , ⋯   , ( ω n n − 1 , A ( ω n n − 1 ) ) > <(\omega_n^0,A(\omega_n^0)),(\omega_n^1,A(\omega_n^1)),\cdots,(\omega_n^{n-1},A(\omega_n^{n-1}))> <(ωn0,A(ωn0)),(ωn1,A(ωn1)),,(ωnn1,A(ωnn1))>
则多项式 A ( x ) A(x) A(x)满足
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 ω n k i A ( ω n i ) [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)
其中
r e v ( k ) = { 0 k = 0 n − k − 1 k ̸ = 0 rev(k)=\begin{cases} 0 & k=0\\ n-k-1 & k\not= 0 \end{cases} rev(k)={0nk1k=0k̸=0
就是说:IDFT只需要调用DFT函数然后std::reverse(a+1,a+n+1),最后同时除以 n n n即可。

证明:假设
A ( x ) = ∑ i = 0 n − 1 a i x i A(x)=\sum_{i=0}^{n-1}a_ix^i A(x)=i=0n1aixi
那么
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 ω n k i ∑ j = 0 n − 1 a j ω n i j [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
交换两个求和符号
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 a i ∑ j = 0 n − 1 ω n i j ω n k j [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
显然
[ x r e v ( k ) ] A ( x ) = 1 n ∑ i = 0 n − 1 a i ∑ j = 0 n − 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 = r e v ( k ) i=rev(k) i=rev(k),则 i + k = 0 (   m o d   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 = 0 n − 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 = 0 n − 1 ω n ( i + k ) j = 1 − ω n ( i + k ) n 1 − ω n i + 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
因此
[ x r e v ( k ) ] A ( x ) = 1 n a r e v ( k ) n = a r e v ( 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 ) + i B ( x ) P(x)=A(x)+iB(x) P(x)=A(x)+iB(x)

A ( ω n k ) = P ( ω n k ) + c o n j ( P ( ω n r e v ( k ) ) ) 2 B ( ω n k ) = i P ( ω n k ) − c o n j ( P ( ω n r e v ( 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 = − 1 i=\sqrt{-1} i=1 c o n j ( x ) \mathrm{conj}(x) conj(x) x x x的共轭虚数。

证明:容易发现,我们只需要证明
c o n j ( P ( ω n r e v ( k ) ) ) = A ( ω n k ) − i B ( ω n k ) \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 = 0 n − 1 a i x i B ( x ) = ∑ i = 0 n − 1 b i x i 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 ( ω n k ) − i B ( ω n k ) = ∑ j = 0 n − 1 a j ω n k j − i ∑ j = 0 n − 1 b j ω n k j 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
由于
ω n k = cos ⁡ 2 π k n + i sin ⁡ 2 π k n \omega_n^k=\cos\frac{2\pi k}{n}+i\sin\frac{2\pi k}{n} ωnk=cosn2πk+isinn2πk
带入得
A ( ω n k ) − i B ( ω n k ) = ∑ j = 0 n − 1 a j ( cos ⁡ 2 π k j n + i sin ⁡ 2 π k j n ) + ∑ j = 0 n − 1 b i ( − i cos ⁡ 2 π k j n + sin ⁡ 2 π k j n ) 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)
而由于 ω n r e v ( k ) = ω n − k \omega_n^{rev(k)}=\omega_n^{-k} ωnrev(k)=ωnk
c o n j ( P ( ω n r e v ( k ) ) ) = c o n j ( A ( ω n − k ) + i B ( ω 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))

c o n j ( P ( ω n r e v ( k ) ) ) = c o n j ( ∑ j = 0 n − 1 a j ( cos ⁡ ( − 2 π k j n ) + i sin ⁡ ( − 2 π k j n ) ) + ∑ j = 0 n − 1 b j ( i cos ⁡ ( − 2 π k j n ) − sin ⁡ ( − 2 π k j n ) ) ) \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 x sin(x)=sinx,cos(x)=cosx
c o n j ( P ( ω n r e v ( k ) ) ) = c o n j ( ∑ j = 0 n − 1 a j ( cos ⁡ 2 π k j n − i sin ⁡ 2 π k j n ) + ∑ j = 0 n − 1 b j ( i cos ⁡ 2 π k j n + sin ⁡ 2 π k j n ) ) \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))
由于 a j , b j a_j,b_j aj,bj是实数,因此
c o n j ( P ( ω n r e v ( k ) ) ) = A ( ω n k ) − i B ( ω n k ) \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)
求多项式乘法,   m o d   1 0 9 + 7 \bmod 10^9+7 mod109+7之类的质数。

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

假设这个质数为 p p p,令 p ′ = ⌊ p ⌋ p'=\lfloor\sqrt{p}\rfloor p=p
A ( x ) = p ′ Q A ( x ) + R A ( x ) B ( x ) = p ′ Q B ( x ) + R B ( x ) A(x)=p'Q_A(x)+R_A(x)\\ B(x)=p'Q_B(x)+R_B(x) A(x)=pQA(x)+RA(x)B(x)=pQB(x)+RB(x)
其中 R A ( x ) R_A(x) RA(x) R B ( x ) R_B(x) RB(x)的每一项的系数都 < p ′ < p' <p,那么
A ( x ) B ( x ) = p ′ 2 Q A ( x ) Q B ( x ) + p ′ ( Q A ( x ) R B ( x ) + Q B ( x ) R A ( x ) ) + R A ( x ) R B ( x ) A(x)B(x)=p'^2Q_A(x)Q_B(x)+p'(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 ) = 1 m o d    x n A(x)F(x)=1\mod{x^n} A(x)F(x)=1modxn

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

假设我们已经求出了
A ( x ) F 0 ( x ) = 1 m o d    x ⌈ n / 2 ⌉ A(x)F_0(x)=1\mod x^{\lceil n/2\rceil} A(x)F0(x)=1modxn/2
上面两式相减
F ( x ) − F 0 ( x ) = 0 m o d    x ⌈ n / 2 ⌉ F(x)-F_0(x)=0\mod x^{\lceil n/2\rceil} F(x)F0(x)=0modxn/2
两边平方
F 2 ( x ) − 2 F ( x ) F 0 ( x ) + F 0 2 ( x ) = 0 m o d    x n 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 ) − 2 F 0 ( x ) + A ( x ) F 0 2 ( x ) = 0 m o d    x n 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 ) = 2 F 0 ( x ) − A ( x ) F 0 2 ( x ) m o d    x n 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 ) m o d    x n F(x)=\ln A(x)\mod x^{n} F(x)=lnA(x)modxn

考虑对两边同时求导
F ′ ( x ) = A − 1 ( x ) A ′ ( x ) m o d    x n F'(x)=A^{-1}(x)A'(x)\mod x^n F(x)=A1(x)A(x)modxn
因此
F ( x ) = ∫ A − 1 ( x ) A ′ ( x ) d x F(x)=\int A^{-1}(x)A'(x)\mathrm dx F(x)=A1(x)A(x)dx

牛顿迭代

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

假设已经求出了
G ( F 0 ( x ) ) = 0 m o d    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)) F 0 ( x ) F_0(x) F0(x)处展开
G ( F ( x ) ) = G ( F 0 ( x ) ) + G ′ ( F 0 ( x ) ) 1 ! ( F ( x ) − F 0 ( x ) ) + G ′ ′ ( F 0 ( x ) ) 2 ! ( F ( x ) − F 0 ( x ) ) 2 + ⋯ G(F(x))=G(F_0(x))+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))+\frac{G''(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'(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) F 0 ( x ) F_0(x) F0(x)的最后 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil 2n项相同,因此
( F ( x ) − F 0 ( x ) ) k = 0 m o d    x n (F(x)-F_0(x))^k=0\mod x^n (F(x)F0(x))k=0modxn
k ≥ 2 k\geq 2 k2时都成立。

因此
G ( F ( x ) ) = G ( F 0 ( x ) ) + G ′ ( F 0 ( x ) ) ( F ( x ) − F 0 ( x ) ) m o d    x n G(F(x))=G(F_0(x))+G'(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 ( F 0 ( x ) ) = 0 m o d    x n G(F_0(x))=0\mod x^n G(F0(x))=0modxn
因此
F ( x ) = F 0 ( x ) − G ( F 0 ( x ) ) G ′ ( F 0 ( x ) ) m o d    x n F(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}\mod x^n F(x)=F0(x)G(F0(x))G(F0(x))modxn

多项式求指数

F ( x ) = e A ( x ) m o d    x n F(x)=e^{A(x)}\mod x^n F(x)=eA(x)modxn

两边同时取对数得到
ln ⁡ F ( x ) = A ( x ) m o d    x n \ln F(x)=A(x)\mod x^n lnF(x)=A(x)modxn

G ( F ( x ) ) = ln ⁡ F ( x ) − A ( x ) = 0 m o d    x n 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 ) m o d    x n G'(F(x))=F^{-1}(x)\mod x^n G(F(x))=F1(x)modxn
套牛顿迭代公式,假设我们已经求出了
ln ⁡ F 0 ( x ) − A ( x ) = 0 m o d    x ⌈ n / 2 ⌉ \ln F_0(x)-A(x)=0\mod x^{\lceil n/2\rceil} lnF0(x)A(x)=0modxn/2

F ( x ) = F 0 ( x ) − F 0 ( x ) ( ln ⁡ F 0 ( x ) − A ( x ) ) m o d    x n 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 ) = F 0 ( x ) ( 1 − ln ⁡ F 0 ( x ) + A ( x ) ) m o d    x n F(x)=F_0(x)(1-\ln F_0(x)+A(x))\mod x^n F(x)=F0(x)(1lnF0(x)+A(x))modxn

多项式开方

F 2 ( x ) = A ( x ) m o d    x n F^2(x)=A(x)\mod x^n F2(x)=A(x)modxn

考虑
G ( F ( x ) ) = F 2 ( x ) − A ( x ) = 0 m o d    x n G(F(x))=F^2(x)-A(x)=0\mod x^n G(F(x))=F2(x)A(x)=0modxn
容易发现
G ′ ( F ( x ) ) = 2 F ( x ) m o d    x n G'(F(x))=2F(x)\mod x^n G(F(x))=2F(x)modxn
套牛顿迭代公式,假设我们已经求出了
F 0 2 ( x ) − A ( x ) = 0 m o d    x ⌈ n / 2 ⌉ F_0^2(x)-A(x)=0\mod x^{\lceil n/2\rceil} F02(x)A(x)=0modxn/2
即有
F ( x ) = F 0 ( x ) − 2 − 1 F 0 − 1 ( x ) ( F 0 2 ( x ) − A ( x ) ) m o d    x n 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 ( F 0 ( x ) + A ( x ) F 0 − 1 ( x ) ) m o d    x n 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)无常数项。

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

UPD:证明

你可能感兴趣的:(FFT)