从多项式相乘来看FFT

FFT 快速算法

简 介: 本文介绍视频 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 中对快速傅里叶算法(FFT)的分析, 从另外一个角度揭示出FFT快速算法的来源,顺带着吧DFT的卷积性质也进行了说明。 从这个角度来理解FFT及其背后效率的提高,比较新颖。 不过它却隐藏了利用FFT计算所得到数据频谱的物理含义, 这或许成为这个视频讲解所付出的代价。

关键词 FFT快速算法

多项式相乘
目 录
Contents
多项式的系数表达
多项式的采样表示
采样值到系数转换
总 结

§01 项式相乘


  视频 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 从另外一个角度揭露了 FFT 的优美之处, 是从如何有效计算两个多项式乘积谈起。

1.1 多项式的系数表达

  如果你已知两个多项式,比如 A ( x ) = x 2 + 3 x + 2 A\left( x \right) = x^2 + 3x + 2 A(x)=x2+3x+2 B ( x ) = 2 x 2 + 1 B\left( x \right) = 2x^2 + 1 B(x)=2x2+1 ,求它们两个相乘之后对应的多项式 C ( x ) = A ( x ) ⋅ B ( x ) C\left( x \right) = A\left( x \right) \cdot B\left( x \right) C(x)=A(x)B(x) 。利用代数运算的分配率和结合律,你可以比较容易将它们计算出来。 C ( x ) = A ( x ) ⋅ B ( x ) = 2 x 4 + 6 x 3 + 5 x 2 + 3 x + 2 C\left( x \right) = A\left( x \right) \cdot B\left( x \right) = 2x^4 + 6x^3 + 5x^2 + 3x + 2 C(x)=A(x)B(x)=2x4+6x3+5x2+3x+2

  一个多项式可以利用它的系数来进行表达,比如前面多项式 A ( x ) , B ( x ) , C ( x ) A\left( x \right),B\left( x \right),C\left( x \right) A(x),B(x),C(x) 的系数分别是 [ 2 , 3 , 1 ] , [ 1 , 0 , 2 ] , [ 2 , 3 , 5 , 6 , 2 ] \left[ {2,3,1} \right],\left[ {1,0,2} \right],\left[ {2,3,5,6,2} \right] [2,3,1],[1,0,2],[2,3,5,6,2] 。根据多项式相乘过程,可以看到,乘积多项式的系数等于两个相乘多项式系数的卷积和。即 [ 2 , 3 , 5 , 6 , 2 ] = [ 2 , 3 , 1 ] ∗ [ 1 , 0 , 2 ] \left[ {2,3,5,6,2} \right] = \left[ {2,3,1} \right] * \left[ {1,0,2} \right] [2,3,5,6,2]=[2,3,1][1,0,2] 。一般情况下, 对于两个阶次为 N N N 的多项式, 它们的系数分别为 A ( x ) → [ a 0 , a 1 , ⋯   , a N ] A\left( x \right) \to \left[ {a_0 ,a_1 , \cdots ,a_N } \right] A(x)[a0,a1,,aN] B ( x ) → [ b 0 , b 1 , ⋯   , b N ] B\left( x \right) \to \left[ {b_0 ,b_1 , \cdots ,b_N } \right] B(x)[b0,b1,,bN] 它们相乘后多项式的阶次为 2 N 2N 2N ,对应的系数为 C ( x ) = A ( x ) ⋅ B ( x ) → [ c 0 , c 1 , c 2 , ⋯   , c 2 N ] C\left( x \right) = A\left( x \right) \cdot B\left( x \right) \to \left[ {c_0 ,c_1 ,c_2 , \cdots ,c_{2N} } \right] C(x)=A(x)B(x)[c0,c1,c2,,c2N] 计算出 C ( x ) C\left( x \right) C(x) 的系数,等于 A ( x ) , B ( x ) A\left( x \right),B\left( x \right) A(x),B(x) 多项式的系数序列进行卷积,需要的乘法次数为 ( N + 1 ) 2 \left( {N + 1} \right)^2 (N+1)2

1.2 多项式的采样表示

  除了使用多项式的系数来确定一个多项式之外,还可以通过多项式在某些采样点处的取值来表达是一个多项式。 对于一个 N N N 阶的多项式 A ( x ) = ∑ n = 0 N a n x n A\left( x \right) = \sum\limits_{n = 0}^N {a_n x^n } A(x)=n=0Nanxn , 可以使用它在 { x 0 , x 1 , x 2 , ⋯   , x N } \left\{ {x_0 ,x_1 ,x_2 , \cdots ,x_N } \right\} { x0,x1,x2,,xN} N + 1 N + 1 N+1 个不同采样点处的取值 { A ( x 0 ) , A ( x 1 ) , ⋯   , A ( x N ) } \left\{ {A\left( {x_0 } \right),A\left( {x_1 } \right), \cdots ,A\left( {x_N } \right)} \right\} { A(x0),A(x1),,A(xN)} 来唯一确定该多项式的系数。 实际上,只要不同取值点的个数超过 N + 1 N + 1 N+1 ,都可以唯一确定出该多项式。

▲ 图1.2.1 多项式的采样值与系数之间的关系

▲ 图1.2.1 多项式的采样值与系数之间的关系

  利用不同 x i x_i xi 点处的多项式取值来确定多项式, 它的一个好处就是可以比较方便计算两个多项式的乘积。

  比如已知 A ( x ) = x 2 + 2 x + 1 A\left( x \right) = x^2 + 2x + 1 A(x)=x2+2x+1 B ( x ) = x 2 − 2 x + 1 B\left( x \right) = x^2 - 2x + 1 B(x)=x22x+1 [ − 2 , − 1 , 0 , 1 , 2 ] \left[ { - 2, - 1,0,1,2} \right] [2,1,0,1,2] 五个点处的取值,将它们取值乘积之后,便可以得到 C ( x ) = A ( x ) ⋅ B ( x ) C\left( x \right) = A\left( x \right) \cdot B\left( x \right) C(x)=A(x)B(x) 在这五个点处的取值,从而就可以确定 C ( x ) C\left( x \right) C(x) 多项式。

▲ 图1.2.2  利用采样值计算多项式的乘积

▲ 图1.2.2 利用采样值计算多项式的乘积

  使用采样值表示多项式时,多项式的乘积计算中的乘法次数,就等于采样点个数 N N N ,而不是它的平方,这就比系数表达多项式计算节省了计算量。

1.3 采样值到系数转换

  为了利用采样值表示多项式的方法来快速计算两个多项式的乘积计算, 需要解决两个主要的问题:

  • 选择合适的多项式采样点 { x 0 , x 1 , x 2 , ⋯   , x N } \left\{ {x_0 ,x_1 ,x_2 , \cdots ,x_N } \right\} { x0,x1,x2,,xN}
  • 寻找高效的多项式系数与采样值之间的转换关系: C o e f f ↔ V a l u e Coeff \leftrightarrow Value CoeffValue

▲ 图1.3.1 多项式两种表示方式的转换

▲ 图1.3.1 多项式两种表示方式的转换

  在视频 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 中花了较大的篇幅论述了所有的采样点都是方程 x N = 1 x^N = 1 xN=1 N N N 各单位圆上的根,即 x n = e j 2 π n N , n = 0 , 1 , 2 , ⋯   , N − 1 x_n = e^{j{ {2\pi n} \over N}} ,n = 0,1,2, \cdots ,N - 1 xn=ejN2πn,n=0,1,2,,N1 ,可以通过二分法提高多项式采样点取值的计算效率,并且 N N N 最好是 2 的整数次幂。

  在这种情况下可以看出, 多项式的系数 p ( x ) = ∑ n = 0 N p n x n p\left( x \right) = \sum\limits_{n = 0}^N {p_n x^n } p(x)=n=0Npnxn 的系数 { p 0 , p 1 , ⋯   , p N } \left\{ {p_0 ,p_1 , \cdots ,p_N } \right\} { p0,p1,,pN} 与在采样点处的取值 P ( x k ) P\left( {x_k } \right) P(xk) 之间的关系就是离散傅里叶变换(DFT)的关系 P ( x k ) = ∑ n = 0 N − 1 p n e j 2 π k N n = D F T { p [ n ] } P\left( {x_k } \right) = \sum\limits_{n = 0}^{N - 1} {p_n e^{j{ {2\pi k} \over N}n} = DFT\left\{ {p\left[ n \right]} \right\}} P(xk)=n=0N1pnejN2πkn=DFT{ p[n]}

  而分组计算采样点取值的过程,恰好就是快速傅里叶变换(FFT)的计算过程。

▲ 图1.3.2 计算多项式在采样点处的取值过程就是FFT算法

▲ 图1.3.2 计算多项式在采样点处的取值过程就是FFT算法

  结 ※


  文介绍视频 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 中对快速傅里叶算法(FFT)的分析, 从另外一个角度揭示出FFT快速算法的来源,顺带着吧DFT的卷积性质也进行了说明。 从这个角度来理解FFT及其背后效率的提高,比较新颖。 不过它却隐藏了利用FFT计算所得到数据频谱的物理含义, 这或许成为这个视频讲解所付出的代价。


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/125074903