卷积
向量
a
⃗
\vec{a}
a ={
a
0
,
a
1
,
.
.
.
,
a
n
−
1
a_0,a_1,...,a_{n-1}
a0,a1,...,an−1 };
向量
b
⃗
\vec{b}
b = {
b
0
,
b
1
,
.
.
.
,
b
n
−
1
b_0,b_1,...,b_{n-1}
b0,b1,...,bn−1 };
a
⃗
∗
b
⃗
\vec{a}*\vec{b}
a∗b=
c
⃗
\vec{c}
c
(
a
0
b
0
a
1
b
0
.
.
.
a
n
−
1
b
0
a
0
b
1
a
1
b
1
.
.
.
a
n
−
1
b
1
a
0
b
2
a
1
b
2
.
.
.
a
n
−
1
b
2
⋮
⋱
a
0
b
n
−
1
a
1
b
n
−
1
.
.
.
a
n
−
1
b
n
−
1
)
\begin{pmatrix} a_0b_0&a_1b_0 &...&a_{n-1}b_0\\ a_0b_1&a_1b_1 &...&a_{n-1}b_1\\ a_0b_2&a_1b_2 &...&a_{n-1}b_2\\ \vdots & &\ddots\\ a_0b_{n-1}&a_1b_{n-1} &...&a_{n-1}b_{n-1}\\ \end{pmatrix}
⎝⎜⎜⎜⎜⎜⎛a0b0a0b1a0b2⋮a0bn−1a1b0a1b1a1b2a1bn−1.........⋱...an−1b0an−1b1an−1b2an−1bn−1⎠⎟⎟⎟⎟⎟⎞
c
⃗
\vec{c}
c中的元素为
c
k
c_k
ck为
∑
i
+
j
=
k
a
i
b
j
\sum_{i+j=k} a_ib_j
∑i+j=kaibj
多项式的两种表示方法
系数表示法
f ( x ) = a 0 + a 1 x 1 + a 2 x 2 + . . . + a n − 1 x n − 1 f(x)=a_0+a_1x_1+a_2x_2+...+a_{n-1}x_{n-1} f(x)=a0+a1x1+a2x2+...+an−1xn−1
点表示法
任取n个不同的x的值,
(
x
i
,
f
(
x
i
)
)
(x_i,f(x_i))
(xi,f(xi))也能唯一表示一个n-1阶多项式
证明
( 1 x 0 1 . . . x 0 n − 1 1 x 1 1 . . . x 1 n − 1 1 x 2 1 . . . x 2 n − 1 ⋮ ⋱ 1 x n − 1 1 . . . x n − 1 n − 1 ) ∗ ( c 0 c 1 c 2 ⋮ c n − 1 ) = ( f ( x 0 ) f ( x 1 ) f ( x 2 ) ⋮ f ( x n − 1 ) ) \begin{pmatrix} 1&x_0^1 &...&x_0^{n-1}\\ 1&x_1^1 &...&x_1^{n-1}\\ 1&x_2^1 &...&x_2^{n-1}\\ \vdots & &\ddots\\ 1&x_{n-1}^1 &...&x_{n-1}^{n-1}\\ \end{pmatrix}* \begin{pmatrix} c_0\\c_1\\c_2\\\vdots \\c_{n-1} \end{pmatrix}=\begin{pmatrix} f(x_0)\\f(x_1)\\f(x_2)\\\vdots \\f(x_{n-1}) \end{pmatrix} ⎝⎜⎜⎜⎜⎜⎛111⋮1x01x11x21xn−11.........⋱...x0n−1x1n−1x2n−1xn−1n−1⎠⎟⎟⎟⎟⎟⎞∗⎝⎜⎜⎜⎜⎜⎛c0c1c2⋮cn−1⎠⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎛f(x0)f(x1)f(x2)⋮f(xn−1)⎠⎟⎟⎟⎟⎟⎞
从系数表示法到点表示法
普通方法
令
f
(
x
)
=
a
0
+
a
1
x
1
+
a
2
x
2
+
.
.
.
+
a
n
−
1
x
n
−
1
f(x)=a_0+a_1x^1+a_2x^2+...+a_{n-1}x^{n-1}
f(x)=a0+a1x1+a2x2+...+an−1xn−1;
t
m
p
1
=
0
;
t
m
p
2
=
t
m
p
1
∗
x
i
+
a
n
−
1
t
m
p
3
=
t
m
p
2
∗
x
i
+
a
n
−
2
⋮
f
(
x
i
)
=
t
m
p
n
tmp1 = 0;\\ tmp2 = tmp1 *x_i+a_{n-1}\\ tmp3=tmp2*x_i+a_{n-2}\\ \vdots\\ f(x_i)=tmp\mathbf{n}
tmp1=0;tmp2=tmp1∗xi+an−1tmp3=tmp2∗xi+an−2⋮f(xi)=tmpn
每求一个值的复杂度为
n
n
n;求n个值的复杂度就为
n
2
n^2
n2
f f t fft fft变换
其复杂度为
n
log
n
n\log{n}
nlogn
令
f
(
x
)
=
a
0
+
a
1
x
1
+
a
2
x
2
+
.
.
.
+
a
n
−
1
x
n
−
1
f(x)=a_0+a_1x^1+a_2x^2+...+a_{n-1}x^{n-1}
f(x)=a0+a1x1+a2x2+...+an−1xn−1;
将偶数项拿出来加上将奇数项拿出来并提出一个公因式可得下式
f
(
x
)
=
f
e
v
e
n
′
(
x
2
)
+
x
f
o
d
d
′
(
x
2
)
f(x)=f^{'}_{even}(x^2)+xf^{'}_{odd}(x^2)
f(x)=feven′(x2)+xfodd′(x2)
采用分治算法递归划分下去
T
(
n
)
=
2
T
(
n
/
2
)
+
O
(
1
)
T(n)=2T(n/2)+O(1)
T(n)=2T(n/2)+O(1)由主定理得其复杂度为
log
(
n
)
\log(n)
log(n)
故其总复杂度为
n
log
(
n
)
n\log(n)
nlog(n)
fft如何选取n个值
答:选择所有 1 1 1的 n n n次方根,这里对 n n n的值有限制,原因,2次方根为 ± 1 \pm1 ±1,4次方根为 [ ± 1 , ± i ] [\pm1,\pm i] [±1,±i],而3次方根就无法写出3个解。
从点表示法回到系数表示法
n次方根的数学特性
- w n k = c o s ( k 2 π n ) + i s i n ( k 2 π n ) w_n^k=cos(k\frac{2\pi}{n})+isin(k\frac{2\pi}{n}) wnk=cos(kn2π)+isin(kn2π)
- w n k = − w n k + n 2 w_n^k=-w_n^{k+\frac{n}{2}} wnk=−wnk+2n
- w 2 n 2 k = w n k w_{2n}^{2k}=w_{n}^{k} w2n2k=wnk
f ( x ) = f e v e n ′ ( x 2 ) + x f o d d ′ ( x 2 ) f(x)=f^{'}_{even}(x^2)+xf^{'}_{odd}(x^2) f(x)=feven′(x2)+xfodd′(x2)
第二点可以利用
f
′
(
(
w
n
k
)
2
)
=
f
′
(
(
w
n
k
+
n
2
)
2
)
f'((w_n^k)^2)=f'((w_n^{k+\frac{n}{2}})^2)\\
f′((wnk)2)=f′((wnk+2n)2)
第三点可以利用起来
f
′
(
(
w
n
k
)
2
)
=
f
′
(
w
n
2
k
)
f'((w_n^k)^2)=f'(w_{\frac{n}{2}}^k)
f′((wnk)2)=f′(w2nk)
故只用求
[
0
,
n
2
]
[0 ,\frac{n}{2}]
[0,2n]的
f
e
v
e
n
′
和
f
o
d
d
′
f'_{even}和f'_{odd}
feven′和fodd′,就可以求出另一半
[
n
2
,
n
−
1
]
[\frac{n}{2},n-1]
[2n,n−1]。
令
g
(
x
)
=
c
0
+
c
1
x
1
+
c
2
x
2
+
.
.
.
+
c
n
−
1
x
n
−
1
g(x)=c_0+c_1x^1+c_2x^2+...+c_{n-1}x^{n-1}
g(x)=c0+c1x1+c2x2+...+cn−1xn−1;其中
c
i
=
f
(
x
i
)
c_i=f(x_i)
ci=f(xi)
c
k
=
∑
i
=
0
n
−
1
y
i
(
w
n
−
k
)
i
=
∑
i
=
0
n
−
1
(
∑
j
=
0
n
−
1
a
j
(
w
n
i
)
j
)
w
n
−
k
i
=
∑
i
=
0
n
−
1
∑
j
=
0
n
−
1
a
j
w
n
(
j
−
k
)
i
=
∑
j
=
0
n
−
1
a
j
∑
i
=
0
n
−
1
w
n
(
j
−
k
)
i
\begin{aligned} c_k & = \sum_{i=0}^{n-1}y_i(w_n^{-k})^i \\ & =\sum_{i=0}^{n-1}(\sum_{j=0}^{n-1}a_j(w_n^i)^j)w_n^{-ki}\\ & =\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_jw_n^{(j-k)i} \\ & =\sum_{j=0}^{n-1}a_j\sum_{i=0}^{n-1}w_n^{(j-k)i} \\ \end{aligned}
ck=i=0∑n−1yi(wn−k)i=i=0∑n−1(j=0∑n−1aj(wni)j)wn−ki=i=0∑n−1j=0∑n−1ajwn(j−k)i=j=0∑n−1aji=0∑n−1wn(j−k)i
∑
i
=
0
n
−
1
w
n
(
j
−
k
)
i
\sum_{i=0}^{n-1}w_n^{(j-k)i}
∑i=0n−1wn(j−k)i中,
(
j
−
k
)
(j-k)
(j−k)是一个常数。
令
S
(
x
)
=
1
+
x
+
x
2
+
.
.
.
+
x
n
−
1
S(x)=1+x+x^2+...+x^{n-1}
S(x)=1+x+x2+...+xn−1;
算:
S
(
w
n
k
)
S(w_n^k)
S(wnk)
当
k
≠
0
k\not=0
k=0时,
S
(
w
n
k
)
=
1
+
(
w
n
k
)
+
(
w
n
k
)
2
+
.
.
.
+
(
w
n
k
)
n
−
1
(
w
n
k
)
S
(
w
n
k
)
=
(
w
n
k
)
+
(
w
n
k
)
2
+
(
w
n
k
)
3
+
.
.
.
+
(
w
n
k
)
n
\begin{aligned} S(w_n^k)&=1+(w_n^k)+(w_n^k)^2+...+(w_n^k)^{n-1}\\ (w_n^k)S(w_n^k)&=(w_n^k)+(w_n^k)^2+(w_n^k)^3+...+(w_n^k)^n \end{aligned}
S(wnk)(wnk)S(wnk)=1+(wnk)+(wnk)2+...+(wnk)n−1=(wnk)+(wnk)2+(wnk)3+...+(wnk)n
(
w
n
k
)
n
=
1
(w_n^k)^n=1
(wnk)n=1故有
S
(
w
n
k
)
=
(
w
n
k
)
S
(
w
n
k
)
S
(
w
n
k
)
(
1
−
w
n
k
)
=
0
因
为
(
1
−
w
n
k
)
≠
0
,
所
以
S
(
w
n
k
)
=
0
S(w_n^k)=(w_n^k)S(w_n^k)\\ S(w_n^k)(1-w_n^k)=0\\ 因为(1-w_n^k)\not=0,所以S(w_n^k)=0
S(wnk)=(wnk)S(wnk)S(wnk)(1−wnk)=0因为(1−wnk)=0,所以S(wnk)=0
c
k
=
∑
i
=
0
n
−
1
y
i
(
w
n
−
k
)
i
=
∑
i
=
0
n
−
1
(
∑
j
=
0
n
−
1
a
j
(
w
n
i
)
j
)
w
n
−
k
i
=
∑
i
=
0
n
−
1
∑
j
=
0
n
−
1
a
j
w
n
(
j
−
k
)
i
=
∑
j
=
0
n
−
1
a
j
∑
i
=
0
n
−
1
w
n
(
j
−
k
)
i
=
a
k
n
\begin{aligned} c_k & = \sum_{i=0}^{n-1}y_i(w_n^{-k})^i \\ & =\sum_{i=0}^{n-1}(\sum_{j=0}^{n-1}a_j(w_n^i)^j)w_n^{-ki}\\ & =\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_jw_n^{(j-k)i} \\ & =\sum_{j=0}^{n-1}a_j\sum_{i=0}^{n-1}w_n^{(j-k)i} \\ & =a_kn \end{aligned}
ck=i=0∑n−1yi(wn−k)i=i=0∑n−1(j=0∑n−1aj(wni)j)wn−ki=i=0∑n−1j=0∑n−1ajwn(j−k)i=j=0∑n−1aji=0∑n−1wn(j−k)i=akn
所以
a
k
=
c
k
n
a_k=\frac{c_k}{n}
ak=nck
蝴蝶计算
由于递归本身对资源消耗比较大,且容易爆栈,能改成迭代的话,自是改成迭代要好
f ( w n k ) = f e v e n ′ ( w n 2 k ) + w n k f o d d ′ ( w n 2 k ) f(w_n^k)=f'_{even}(w_{\frac{n}{2}}^k)+w_n^k f'_{odd}(w_{\frac{n}{2}}^k) f(wnk)=feven′(w2nk)+wnkfodd′(w2nk)
从系数表示到点表示示例
f
=
a
0
+
a
1
x
+
a
2
x
2
+
a
3
x
3
f
1
=
a
0
+
a
2
x
2
f
2
=
a
1
+
a
3
x
2
f=a_0+a_1x+a_2x^2+a_3x^3\\ f1=a_0+a_2x^2\\ f2=a_1+a_3x^2\\
f=a0+a1x+a2x2+a3x3f1=a0+a2x2f2=a1+a3x2
f
(
w
4
0
)
f
(
w
4
1
)
f
(
w
4
2
)
f
(
w
4
3
)
f(w_{4}^{0})\qquad f(w_{4}^{1})\qquad f(w_{4}^{2})\qquad f(w_{4}^{3}) \\
f(w40)f(w41)f(w42)f(w43)
f
1
e
v
e
n
(
w
2
0
)
f
1
e
v
e
n
(
w
2
1
)
f
2
o
d
d
(
w
2
0
)
f
2
o
d
d
(
w
2
1
)
f1_{even}(w_{2}^{0})\quad f1_{even}(w_{2}^{1})\quad f2_{odd}(w_{2}^{0})\quad f2_{odd}(w_{2}^{1})\\
f1even(w20)f1even(w21)f2odd(w20)f2odd(w21)
a
0
a
2
a
1
a
3
a_0 \qquad\qquad a_2 \qquad\qquad a_1\qquad\qquad a_3
a0a2a1a3
原始序数为
a
0
a
1
a
2
a
3
a_0\quad a_1 \quad a_2 \quad a_3
a0a1a2a3
二进制表示为
00
01
10
11
00\quad 01\quad 10\quad 11
00011011
最底层系数
a
0
a
2
a
1
a
3
a_0\quad a_2 \quad a_1 \quad a_3
a0a2a1a3
00 10 01 11 00\quad 10\quad 01\quad 11 00100111
从右往左读的递增序