从多项式相乘来看FFT
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多项式相乘来看FFT相关的知识,希望对你有一定的参考价值。
简 介: 本文介绍视频 The Fast Fourier Transform (FFT): Most Ingenious Algorithm Ever? 中对快速傅里叶算法(FFT)的分析, 从另外一个角度揭示出FFT快速算法的来源,顺带着吧DFT的卷积性质也进行了说明。 从这个角度来理解FFT及其背后效率的提高,比较新颖。 不过它却隐藏了利用FFT计算所得到数据频谱的物理含义, 这或许成为这个视频讲解所付出的代价。
关键词
: FFT,快速算法
§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=0∑Nanxn , 可以使用它在 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(x以上是关于从多项式相乘来看FFT的主要内容,如果未能解决你的问题,请参考以下文章