多项式运算
n
n
n次多项式加法耗费的时间是
o
(
n
)
o(n)
o(n)。直接的
n
n
n次多项式相乘消耗的时间是
o
(
n
2
)
o(n^2)
o(n2),
A
(
x
)
=
∑
j
=
0
n
−
1
a
j
x
j
A(x)=\sum_{j=0}^{n-1}a_jx^j
A(x)=∑j=0n−1ajxj,
B
(
x
)
=
∑
j
=
0
n
−
1
b
j
x
j
B(x)=\sum_{j=0}^{n-1}b_jx^j
B(x)=∑j=0n−1bjxj,
C
(
x
)
=
∑
j
=
0
2
n
−
2
c
j
x
j
,
c
j
=
∑
k
=
0
j
a
k
b
j
−
k
C(x)=\sum_{j=0}^{2n-2}c_jx^j,c_j=\sum_{k=0}^{j}a_kb_{j-k}
C(x)=∑j=02n−2cjxj,cj=∑k=0jakbj−k
而快速傅里叶变换(FFT)可以将多项式的乘法运算降低到
O
(
n
l
g
n
)
O(nlgn)
O(nlgn)。
F
(
ω
)
=
∫
−
∞
+
∞
e
i
ω
t
s
(
t
)
d
t
,
S
(
f
)
=
∫
−
∞
+
∞
e
−
i
2
π
f
t
s
(
t
)
d
t
F(\omega)=\int_{-\infty}^{+\infty}e^{i\omega t}s(t)dt,S(f)=\int_{-\infty}^{+\infty}e^{-i2\pi ft}s(t)dt
F(ω)=∫−∞+∞eiωts(t)dt,S(f)=∫−∞+∞e−i2πfts(t)dt
多项式的表达
系数表示、点值表示。
系数表示
A
(
x
)
=
∑
j
=
0
n
−
1
a
j
x
j
A(x)=\sum_{j=0}^{n-1}a_jx^j
A(x)=∑j=0n−1ajxj
A
(
x
0
)
=
a
0
+
x
0
(
a
1
+
x
0
(
a
2
+
⋅
⋅
⋅
+
x
0
(
a
n
−
2
+
x
0
(
a
n
−
1
)
)
)
)
A(x_0 ) = a_0 +x_0 (a_1 +x_0 (a_2 + ··· +x_0 (a_{n-2} +x_0 (a_{n-1} ))))
A(x0)=a0+x0(a1+x0(a2+⋅⋅⋅+x0(an−2+x0(an−1))))
点值表示
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
,
⋅
⋅
⋅
,
(
x
n
−
1
,
y
n
−
1
)
{(x_0 , y_0 ), (x_1 , y_1 ), ···, (x_{n-1} , y_{n-1})}
(x0,y0),(x1,y1),⋅⋅⋅,(xn−1,yn−1)这
n
n
n个点唯一地表示一个多项式。
从系数表示到点值表示只需要计算
n
n
n个点即可,如果选取的点合理,耗费的时间只需要
O
(
n
l
g
n
)
O(nlgn)
O(nlgn),点值表示到系数表示被叫做插值,可以用范德蒙矩阵求出系数。
(
y
0
y
1
…
y
n
−
1
)
=
(
1
x
0
x
0
2
…
x
0
n
−
1
1
x
1
x
1
2
…
x
1
n
−
1
…
…
1
x
n
−
1
x
n
−
1
2
…
x
n
−
1
n
−
1
)
(
a
0
a
1
…
a
n
−
1
)
=
V
(
x
0
,
x
1
,
…
,
x
n
−
1
)
⋅
a
\begin{pmatrix}y_0\\y_1\\…\\y_{n-1} \end{pmatrix}=\begin{pmatrix}1&x_0&x_0^2&…&x_0^{n-1}\\1&x_1&x_1^2&…&x_1^{n-1}\\&&……\\1&x_{n-1}&x_{n-1}^2&…&x_{n-1}^{n-1}\\\end{pmatrix}\begin{pmatrix}a_0\\a_1\\…\\a_{n-1}\end{pmatrix}=V(x_0,x_1,…,x_{n-1})·a
⎝⎜⎜⎛y0y1…yn−1⎠⎟⎟⎞=⎝⎜⎜⎛111x0x1xn−1x02x12……xn−12………x0n−1x1n−1xn−1n−1⎠⎟⎟⎞⎝⎜⎜⎛a0a1…an−1⎠⎟⎟⎞=V(x0,x1,…,xn−1)⋅a
拉格朗日公式插值的时间复杂度是
O
(
n
2
)
O(n^2)
O(n2):
A
(
x
)
=
∑
k
=
0
n
−
1
y
k
∏
j
≠
k
x
−
x
j
∏
j
≠
k
x
k
−
x
j
A(x)=\sum_{k=0}^{n-1}y_k\frac{\prod_{j≠k}x-x_j}{\prod_{j≠k}x_k-x_j }
A(x)=k=0∑n−1yk∏j=kxk−xj∏j=kx−xj
多项式相乘时,系数表示的
n
n
n次多项式相乘消耗的时间是
O
(
n
2
)
O(n^2)
O(n2),点值表示的
n
n
n次多项式相乘消耗的时间是
O
(
n
)
O(n)
O(n)
离散傅里叶变换
单位复数根及其性质
ω
n
=
1
,
ω
\omega ^n=1,\omega
ωn=1,ω称为
1
1
1的
n
n
n次复根,或单位
n
n
n次复根
ω
n
=
e
2
π
i
n
ω_n =e^{\frac{2πi}{n}}
ωn=en2πi,单位
n
n
n次复根的基元
ω
n
k
=
(
ω
n
)
k
=
e
2
π
i
k
n
,
,
k
=
0
,
1
,
…
,
n
−
1
ω_n^k=(ω_n)^k=e^{\frac{2πik}{n}},,k=0,1,…,n-1
ωnk=(ωn)k=en2πik,,k=0,1,…,n−1,单位
1
1
1有
n
n
n个
n
n
n次复根。
e
i
u
=
c
o
s
(
u
)
+
i
⋅
s
i
n
(
u
)
e^{iu}=cos(u)+i·sin(u)
eiu=cos(u)+i⋅sin(u)
所以
ω
n
k
=
e
2
π
i
k
n
=
c
o
s
(
2
π
k
n
)
+
i
⋅
s
i
n
(
2
π
k
n
)
,
k
=
0
,
1
,
…
,
n
−
1
ω_n^k=e^{\frac{2πik}{n}}=cos(\frac{2πk}{n})+i·sin(\frac{2πk}{n}),k=0,1,…,n-1
ωnk=en2πik=cos(n2πk)+i⋅sin(n2πk),k=0,1,…,n−1。
n
n
n个单位
n
n
n次复根组成一个群,做乘法加法幂次方仍然是这
n
n
n个点
一些性质
- ω n n = ω n 0 = 1 ( ω n n = e 2 π i n n = c o s 2 π + i ⋅ s i n 2 π ) \omega_n^n=\omega_n^0=1(\omega_n^n=e^{\frac{2πin}{n}}=cos2\pi+i·sin2\pi) ωnn=ωn0=1(ωnn=en2πin=cos2π+i⋅sin2π)
- ω n j ω n k = ω n j + k = ω n ( j + k ) m o d n \omega_n^j\omega_n^k=\omega_n^{j+k}=\omega_n^{(j+k)\mod n} ωnjωnk=ωnj+k=ωn(j+k)modn
- ω n − 1 = ω n n − 1 \omega_n^{-1}=\omega_n^{n-1} ωn−1=ωnn−1
- ω d n d k = ω n k \omega_{dn}^{dk}=\omega_n^k ωdndk=ωnk
- ω n n 2 = ω 2 = − 1 \omega_n^{\frac{n}{2}}=\omega_2=-1 ωn2n=ω2=−1
- 等分引理: n n n个单位 n n n次复方根的平方是 n 2 \frac{n}{2} 2n个 n 2 \frac{n}{2} 2n次方根
- ∑ j = 0 n − 1 ( ω n k ) j = 0 \sum_{j=0}^{n-1}(\omega_n^k)^j=0 ∑j=0n−1(ωnk)j=0
DFT
我们期望取
x
=
ω
n
0
,
ω
n
1
,
…
,
ω
n
n
−
1
x=\omega_n^0,\omega_n^1,…,\omega_n^{n-1}
x=ωn0,ωn1,…,ωnn−1来计算
A
(
x
)
=
∑
j
=
0
n
−
1
a
j
x
j
A(x)=\sum_{j=0}^{n-1}a_jx^j
A(x)=∑j=0n−1ajxj
y
k
=
A
(
x
k
)
=
a
(
ω
n
k
)
=
∑
j
=
0
n
−
1
a
j
ω
n
k
j
y_k=A(x_k)=a(\omega_n^k)=\sum_{j=0}^{n-1}a_j\omega_n^{kj}
yk=A(xk)=a(ωnk)=∑j=0n−1ajωnkj,
(
y
0
y
1
…
y
n
−
1
)
=
(
1
1
1
…
1
1
ω
n
1
ω
n
2
…
ω
n
n
−
1
…
…
1
ω
n
(
n
−
1
)
⋅
1
ω
n
(
n
−
1
)
⋅
2
…
ω
n
(
n
−
1
)
⋅
(
n
−
1
)
)
(
a
0
a
1
…
a
n
−
1
)
\begin{pmatrix}y_0\\y_1\\…\\y_{n-1} \end{pmatrix}=\begin{pmatrix}1&1&1&…&1\\1&ω_n^1&ω_n^2&…&ω_n^{n-1}\\&&……\\1&ω_{n}^{(n-1)·1}&ω_{n}^{(n-1)·2}&…&ω_{n}^{(n-1)·(n-1)}\\\end{pmatrix}\begin{pmatrix}a_0\\a_1\\…\\a_{n-1}\end{pmatrix}
⎝⎜⎜⎛y0y1…yn−1⎠⎟⎟⎞=⎝⎜⎜⎛1111ωn1ωn(n−1)⋅11ωn2……ωn(n−1)⋅2………1ωnn−1ωn(n−1)⋅(n−1)⎠⎟⎟⎞⎝⎜⎜⎛a0a1…an−1⎠⎟⎟⎞
FFT
使用分治策略。
A
(
x
)
=
A
[
0
]
(
x
2
)
+
x
A
[
1
]
(
x
2
)
A(x)=A^{[0]}(x^2)+xA^{[1]}(x^2)
A(x)=A[0](x2)+xA[1](x2)
偶次项:
A
[
0
]
(
x
)
=
a
0
+
a
2
x
+
a
4
x
2
+
⋅
⋅
⋅
+
a
n
−
2
x
n
/
2
−
1
A ^{[0]} (x) = a_0 +a_2 x+a_4 x^2 +···+a_{n-2} x ^{n/2-1}
A[0](x)=a0+a2x+a4x2+⋅⋅⋅+an−2xn/2−1
奇次项:
A
[
1
]
(
x
)
=
a
1
+
a
3
x
+
a
5
x
2
+
⋅
⋅
⋅
+
a
n
−
1
x
n
/
2
−
1
A^{ [1]} (x) = a _1 +a _3 x+a_ 5 x^ 2 +···+a _{n-1} x^{ n/2-1}
A[1](x)=a1+a3x+a5x2+⋅⋅⋅+an−1xn/2−1
A
(
x
r
)
=
A
[
0
]
(
x
r
2
)
+
x
A
[
1
]
(
x
r
2
)
=
A
(
ω
n
r
)
=
A
[
0
]
(
(
ω
n
r
)
2
)
+
(
ω
n
r
)
A
[
1
]
(
(
ω
n
r
)
2
)
=
A
[
0
]
(
ω
n
/
2
r
)
+
(
ω
n
r
)
⋅
A
[
1
]
(
ω
n
/
2
r
)
A(x_r)=A^{[0]}(x_r^2)+xA^{[1]}(x_r^2)=A(\omega_n^r)=A^{[0]}((\omega_{n}^{r})^2)+(\omega_n^{r})A^{[1]}((\omega_{n}^r)^2)=A^{[0]}(\omega_{n/2}^r)+(\omega_n^r)·A^{[1]}(\omega_{n/2}^r)
A(xr)=A[0](xr2)+xA[1](xr2)=A(ωnr)=A[0]((ωnr)2)+(ωnr)A[1]((ωnr)2)=A[0](ωn/2r)+(ωnr)⋅A[1](ωn/2r)
A ( ω n k ) = A [ 0 ] ( ω n / 2 k ) + ( ω n k ) ⋅ A [ 1 ] ( ω n / 2 k ) A(\omega_n^k)=A^{[0]}(\omega_{n/2}^{k})+(\omega_n^k)·A^{[1]}(\omega_{n/2}^k) A(ωnk)=A[0](ωn/2k)+(ωnk)⋅A[1](ωn/2k),
A ( ω n n / 2 + k ) = A [ 0 ] ( ( ω n / 2 n / 2 + k ) 2 ) + ( ω n n / 2 + k ) ⋅ A [ 1 ] ( ω n / 2 n / 2 + k ) = A [ 0 ] ( ω n / 2 k ) − ( ω n k ) ⋅ A [ 1 ] ( ω n / 2 k ) A(\omega_n^{n/2+k})=A^{[0]}((\omega_{n/2}^{n/2+k})^2)+(\omega_n^{n/2+k})·A^{[1]}(\omega_{n/2}^{n/2+k})=A^{[0]}(\omega_{n/2}^{k})-(\omega_n^k)·A^{[1]}(\omega_{n/2}^k) A(ωnn/2+k)=A[0]((ωn/2n/2+k)2)+(ωnn/2+k)⋅A[1](ωn/2n/2+k)=A[0](ωn/2k)−(ωnk)⋅A[1](ωn/2k)