如果要计算
C
(
x
)
=
A
(
x
)
B
(
x
)
C(x)=A(x)B(x)
C(x)=A(x)B(x),通常的做法是对
A
,
B
A,B
A,B各做一次DFT,各处点值相乘后再做一次逆DFT
但是这样做了三次DFT,在某些丧心病狂的题目中可能会被卡常
但是如果
A
(
x
)
,
B
(
x
)
A(x),B(x)
A(x),B(x) 的系数都是实数,可以只做两次DFT
方法一
从毛爷论文上搬的
令
P
(
x
)
=
A
(
x
)
+
i
B
(
x
)
,
Q
(
x
)
=
A
(
x
)
−
i
B
(
x
)
P(x)=A(x)+iB(x),Q(x)=A(x)-iB(x)
P(x)=A(x)+iB(x),Q(x)=A(x)−iB(x)
如果我们求出了
P
(
x
)
,
Q
(
x
)
P(x),Q(x)
P(x),Q(x) 的点值,那么
A
(
ω
n
k
)
=
P
(
ω
n
k
)
+
Q
(
ω
n
k
)
2
,
B
(
ω
n
k
)
=
−
i
P
(
ω
n
k
)
−
Q
(
ω
n
k
)
2
A(\omega_n^k)=\frac{P(\omega_n^k)+Q(\omega_n^k)}{2},B(\omega_n^k)=-i\frac{P(\omega_n^k)-Q(\omega_n^k)}{2}
A(ωnk)=2P(ωnk)+Q(ωnk),B(ωnk)=−i2P(ωnk)−Q(ωnk)
事实上只要求出了
P
(
x
)
P(x)
P(x)的点值就相当于求出了
Q
(
x
)
Q(x)
Q(x)的点值,因为
c
o
n
j
(
P
(
ω
n
k
)
)
=
Q
(
ω
n
n
−
k
)
conj(P(\omega_n^k))=Q(\omega_n^{n-k})
conj(P(ωnk))=Q(ωnn−k)
证明可以考虑几何意义,
P
,
Q
P,Q
P,Q的每一项系数都共轭,而
c
o
n
j
(
ω
n
k
)
=
ω
n
n
−
k
conj(\omega_n^k)=\omega_n^{n-k}
conj(ωnk)=ωnn−k,所以乘起来也共轭
方法二
令
D
(
x
)
=
A
(
x
)
+
B
(
x
)
+
i
(
A
(
x
)
−
B
(
x
)
)
D(x)=A(x)+B(x)+i(A(x)-B(x))
D(x)=A(x)+B(x)+i(A(x)−B(x))
直接对
D
(
x
)
D(x)
D(x)做DFT,将点值自乘,再做逆DFT
最后
D
(
x
)
D(x)
D(x)中实部恰好就是我们要求的值的4倍
也就是说,
D
2
(
x
)
D^2(x)
D2(x)的实部所组成的多项式的各项系数恰好是
(
A
∗
B
)
(
x
)
(A*B)(x)
(A∗B)(x)各项系数的4倍
证明 :
r
e
a
l
(
D
2
(
x
)
)
=
r
e
a
l
(
[
A
(
x
)
+
B
(
x
)
+
i
(
A
(
x
)
−
B
(
x
)
)
]
2
)
=
(
A
(
x
)
+
B
(
x
)
)
2
−
(
A
(
x
)
−
B
(
x
)
)
2
=
4
A
(
x
)
B
(
x
)
real(D^2(x))=real([A(x)+B(x)+i(A(x)-B(x))]^2)=(A(x)+B(x))^2-(A(x)-B(x))^2=4A(x)B(x)
real(D2(x))=real([A(x)+B(x)+i(A(x)−B(x))]2)=(A(x)+B(x))2−(A(x)−B(x))2=4A(x)B(x)