1 多项式与多项式与FFT 清华大学清华大学 宋斌恒宋斌恒 内容提要内容提要 ?多项式的表示方式 –系数 –值 ?多项式的基本运算 –加减乘除 ?运算的效率分析 ? FFT思想与实现 多项式多项式 ?在代数域F上的变量为x的多项式 ? n是幂次(degree)的上界,我们称k是上述多项 式的幂次,如果幂次最大的非零系数是a k , ∑ ? = = 1 0 )( n j j j xaxA 多项式加法多项式加法 ∑ ? = = 1 0 )( n j j j xbxB ∑ ? = = 1 0 )( n j j j xcxC C=A+B 1,...,0for ?=+= njbac jjj 示例示例1 ?若A(x) = 6x 3 + 7x 2 -10x + 9 ? B(x) = -2x 3 + 4x -5, ?则C(x) = 4x 3 + 7x 2 -6x + 4. 2 示例示例2:乘法:乘法 ? 6x 3 + 7x 2 -10x + 9 ? -2x 3 + 4x -5 ? ------------------------------------------------------------ ? -30x 3 -35x 2 + 50x - 45 ? 24x 4 + 28x 3 -40x 2 + 36x ? -12x 6 -14x 5 + 20x 4 -18x 3 ? ------------------------------------------------------------ ? -12x 6 -14x 5 + 44x 4 -20x 3 -75x 2 + 86x - 45 乘法公式乘法公式 )()()( xBxAxC = 22,...,0 , 1 0 ?== ∑ ? = ? njbac n k kjkj 多项式表示法多项式表示法 ? a = (a 0 , a 1 , . . ., a n-1 ).可以用一个n维向量来表示。 ∑ ? = = 1 0 )( n j j j xaxA 系数表示法宜于求值和加法系数表示法宜于求值和加法 ?计算A(x) 在点x 0 的值A(x 0 ). ? Horner‘s rule方法计算时间复杂度θ (n) : ? 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) 和B(x) ,其 乘法复杂度是θ (n 2 ), ?其积的系数向量c, 被称为是a和b的卷积 convolution并记做c = a*b. ?由于多项式乘法和卷积运算都是基本运 算,我们重点来计算卷积的高效率算法 点值表示法点值表示法 ?点值表示(point-value representation) 幂次为n-1的多项式A(x) 可以由点值对 (point-value pairs) ? {(x 0 , y 0 ), (x 1 , y 1 ), . . ., (x n-1 , y n-1 )} 来表示 ?其中x k 互不相等,y k = A(x k ) 3 进一步思路进一步思路 ?一个问题可能有多种等价表示方法。而不 同的表示方法对思考、解决问题有极大的 影响。 ?我们可以从各种角度去观察、度量一个物 体,只要我们的观察数据可以完全唯一地 反映这个物体的本身,我们就可以认为这 些度量就是这个物体的一个表示。 点表示定理点表示定理 ?对于{(x 0 , y 0 ), (x 1 , y 1 ), . . ., (x n-1 , y n-1 )} 存在 唯一幂次的上界为n的多项式A(x) 使得 ? y k = A(x k ) 对于k = 0, 1, . . ., n – 1成立. 证明:证明:Vandermonde矩阵 矩阵 ?上面提到的矩阵是 Vandermonde矩阵, 它可逆,其 determinant【行列 式】不为零。 ?以上事实表明,点表 示和系数表示是等价 的。 ? Lagrange公式: Lagrange 公式分析公式分析 ?复杂度θ(n 2 ) ?稳定性:如果点选择不好,结果会非常 差!!! 由此引发问题由此引发问题 ?科学计算需要注意的问题 –正确性 –稳定性 –精确度 –截断误差 –舍入误差 –计算溢出 –误差放大 –…… 4 点表示法的操作点表示法的操作 ?加法:只要是degree-bound【幂次的上 界】一样的具有相同点表示的多项式的加 法,可以直接把其相关点的值相加即可。 ?其复杂度为θ(n) 点表示的乘法点表示的乘法 ?类似地点表示法也可以方便地进行乘法, 若C(x) = A(x)B(x), 则C(x k ) = A(x k )B(x k ) 对 于所有x k 都成立 ?但我们必须面临一个问题:即C的degree -bound是A 和B的和。 ?我们需要扩充A和B的点值对。 乘法(续)乘法(续) ?扩充A的点对, ? {(x 0 ,y 0 ),(x 1 , y 1 ),...,(x 2n-1 ,y 2n-1 )}, ?扩充B的点对 ? {(x 0 ,y' 0 ),(x 1 ,y' 1 ),...,(x 2n-1 ,y' 2n-1 )}, ?则C 的点对表示 ? {(x 0 ,y 0 y' 0 ),(x 1 ,y 1 y' 1 ),...,(x 2n-1 ,y 2n-1 y' 2n-1 )}. 系数表示多项式的快速乘法系数表示多项式的快速乘法 ?我们可以利用线形复杂度的点对表示多项 式的乘法来实现系数表示多项式的快速乘 法。 –计算给定点集的值【如果选用合适点,其复杂 度θ(nlgn)】 –计算点值的乘法【θ(n)】 –点值表示插值成系数表示法【如果选用合适算 法,其复杂度θ(nlgn)】 示意图示意图 DFT和和FFT离散和快速傅立叶变换离散和快速傅立叶变换 ?对于多项式,我们取x 的值为x i =ω n i ,其中ω n 是方程 ? x n =1 ?的第一个根 null ω n =e 2πι/n ? the principal n th root of unity :n阶主根 5 主根的一些性质主根的一些性质 的倍数不是如果nk 0)( )()( 1 1 0 222/ 2 2/ = = ?== = ∑ ? = + n j jk n k n nk n n n k n dk dn ω ωω ωω ωω DFT ∑ ∑ ? = ? ? = = = 1 0 1 n 1 n 0 n 1 0 y ,,......,, )( n j kj njk n n j j j a xaxA ω ωωω上的值计算其在点: 多项式 Discrete Fourier Transform (DFT) ?我们称y = (y 0 , y 1 , . . . , y n-1 ) 是系数向量a = (a 0 , a 1 , . . . , a n-1 ) 的离散傅立叶变换,记 为: ? y = DFT n (a). Fast Fourier Transform (FFT) ?利用FFT可以在θ(n lg n)时间内计算DFT n (a) 而 不是直接法的θ (n 2 ) ? FFT 使用了divide-and-conquer 策略, 把A(x) 的 系数分为奇偶标号两类,然后定义两个degree- bound 为n/2 的多项式A [0] (x) 和A [1] (x): FFT续续 ?故有 ? A(x) = A [0] (x 2 ) + xA [1] (x 2 ), ?因此计算A(x)化简为只需计算A [0] (x) 和 A [1] (x)在点 ?(ω n 0 ) 2 ,(ω n 1 ) 2 ,……., (ω n n-1 ) 2 , ?上的值 6 复杂度复杂度 ? T(n)=2T(n/2)+θ(n) ? ?T(n)= θ(n lgn) 求解方程,计算求解方程,计算a 说明说明 ? y = V n a, 其中V n 是Vandermonde矩阵其x 的取值为ω n 的幂次方 ?于是 ? a=DFT n -1 (y)=V n -1 (y) 定理定理 ?对于任意j, k = 0, 1, . . . , n -1, V n -1 第(j, k) 位置的 数是ω n -jk /n. ?证明:如右图计 算V n -1 V n =I可得: ?当j=j’时为1否则 为0。 结论结论计算方法计算方法 ?利用FFT思想,我们同样可以得到复杂度为 θ(n lg n)的快速计算方法 7 定理定理 ?任意给定阶为n的向量a和b,其中n是2的密,有 ?其中我们把a和b前面用0补足到2n长。 FFT高效实现高效实现 ?由于FFT在信号处理等方面有相当大的需 求,故其高效实现有非常重要的意义。通 过精心设计可以让复杂度系数变得更小。 著名的蝴蝶操作:左边两个输著名的蝴蝶操作:左边两个输 入入,,y k [1] 乘以乘以ω n k 分治的递归调用图分治的递归调用图【【n=8】】 循环实现循环实现 ?递归实现中的10-13 行的优化:相同乘法 只做一次 FFT-BASE(A) ? 1 n ? length[a] // n is a power of 2. ? 2 for s ?1 to lg n do ? 3 m ?2 s ? 4 ω m ?e 2π i/m ? 5 for k ?0 to n - 1 by m do ? 6 ω ?1 ? 7 for j ? 0 to m/2 - 1 do ? 8t ?ω A[k + j + m/2] ? 9 u ? A[ k + j] ? 10 A[k + j] ? u + t ? 11 A[k + j + m /2] ?u - t ? 12 ω ? ωω m 8 ITERATIVE-FFT(a) ? 1 BIT-REVERSE-COPY (a, A) ? 2 n ? length[a] //n is a power of 2. ? 3 for s ?1 to lg n do ? 4 m ?2 s ? 5 ω m ?e 2 π I /m ? 6 ω ? 1 ? 7 for j ?0 to m/2 - 1 do ? 8 for k j to n - 1 by m do ? 9t ?ω A[k + m/2] ? 10 u ?A[k] ? 11 A[k] ?u + t ? 12 A[k + m/2] ?u - t ? 13 ω ?ωω m ? 14 return A Bit-reverse[位反转位反转] ? 001?100 ? 010?010 ? 011?110 ? 100?001 ? ……,k的位反转记为rev(k) ?把lgn位长度的数字按照二进制数进行位反 转,递归图的顺序排列就是一个位反转排 列 BIT-REVERSE-COPY(a, A) ? 1 n ? length[a] ? 2 for k ? 0 to n -1 do ? 3 A[rev(k)] ? a k Parallel FFT 总结总结 ?多项式的表示可以有多种 ?多项式的乘法可以利用FFT加快计算速度 ? FFT是信号处理中非常普遍的运算,其速度 直接影响许多仪器的性能 ?换一种思路,开阔你的眼界 ? FFT的实现细节