FFT 多项式点表示与系数表示的快速fft转换

卷积

向量 a ⃗ \vec{a} a ={ a 0 , a 1 , . . . , a n − 1 a_0,a_1,...,a_{n-1} a0,a1,...,an1 };
向量 b ⃗ \vec{b} b = { b 0 , b 1 , . . . , b n − 1 b_0,b_1,...,b_{n-1} b0,b1,...,bn1 };
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} a0b0a0b1a0b2a0bn1a1b0a1b1a1b2a1bn1............an1b0an1b1an1b2an1bn1
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+...+an1xn1

点表示法

任取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} 1111x01x11x21xn11............x0n1x1n1x2n1xn1n1c0c1c2cn1=f(x0)f(x1)f(x2)f(xn1)

从系数表示法到点表示法

普通方法

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+...+an1xn1;
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=tmp1xi+an1tmp3=tmp2xi+an2f(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+...+an1xn1;
将偶数项拿出来加上将奇数项拿出来并提出一个公因式可得下式
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次方根的数学特性

  1. 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π)
  2. w n k = − w n k + n 2 w_n^k=-w_n^{k+\frac{n}{2}} wnk=wnk+2n
  3. 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} fevenfodd,就可以求出另一半 [ n 2 , n − 1 ] [\frac{n}{2},n-1] [2n,n1]

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+...+cn1xn1;其中
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=0n1yi(wnk)i=i=0n1(j=0n1aj(wni)j)wnki=i=0n1j=0n1ajwn(jk)i=j=0n1aji=0n1wn(jk)i
∑ i = 0 n − 1 w n ( j − k ) i \sum_{i=0}^{n-1}w_n^{(j-k)i} i=0n1wn(jk)i中, ( j − k ) (j-k) (jk)是一个常数。
S ( x ) = 1 + x + x 2 + . . . + x n − 1 S(x)=1+x+x^2+...+x^{n-1} S(x)=1+x+x2+...+xn1;
算: 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)n1=(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)(1wnk)=0(1wnk)=0S(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=0n1yi(wnk)i=i=0n1(j=0n1aj(wni)j)wnki=i=0n1j=0n1ajwn(jk)i=j=0n1aji=0n1wn(jk)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

从右往左读的递增序

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值