互質因子算法

互質因子算法（Prime-factor FFT algorithm, PFA），又稱為Good-Thomas算法 ，是一種快速傅立葉變換（FFT），把N = N1N2大小的離散傅立葉變換重新表示為N1 * N2大小的二維離散傅立葉變換，其中N1與N2需互質。變成N1和N2大小的傅立葉變換後，可以繼續遞迴使用PFA，或用其他快速傅立葉變換算法來計算。 較流行的Cooley-Tukey算法經由mixed-radix一般化後，也是把N = N1N2大小的離散傅立葉變換分割為N1和N2大小的轉換，但和互質因子算法 (PFA)作法並不相同，不應混淆。Cooley-Tukey算法的N1與N2不需互質，可以是任何整數。然而有個缺點是比PFA多出一些乘法，和單位根twiddle factors相乘。相對的，PFA的缺點則是N1與N2需互質 (例如N 是2次方就不適用)，而且要藉由中國剩餘定理來進行較複雜的re-indexing。互質因子算法 (PFA)可以和mixed-radix Cooley-Tukey算法相結合，前者將N 分解為互質的因數，後者則用在重複質因數上。 PFA也與nested Winograd FFT算法密切相關，後者使用更為精巧的二維摺積技巧分解成N1 * N2的轉換。因而一些較古老的論文把Winograd算法稱為PFA FFT。 儘管PFA和Cooley-Tukey算法並不相同，但有趣的是Cooley和Tukey在他們1965年發表的有名的論文中，沒有發覺到高斯和其他人更早的研究，只引用Good在1958年發表的PFA作為前人的FFT結果。剛開始的時候人們對這兩種作法是否不同有點困惑。 離散傅立葉變換（DFT）的定義如下: X k = ∑ n = 0 N − 1 x n e − 2 π i N n k k = 0 , … , N − 1 {\displaystyle X_{k}=\sum _{n=0}^{N-1}x_{n}e^{-{\frac {2\pi i}{N}}nk}\qquad k=0,\dots ,N-1} PFA將輸入和輸出re-indexing，代入DFT公式後轉換成二維DFT。 設N = N1N2，N1與N2兩者互質，然後把輸入n 和輸出k 一一對應到 n = n 1 N 2 + n 2 N 1 mod N {\displaystyle n=n_{1}N_{2}+n_{2}N_{1}\mod N} 因N1與N2 互質，故根據最大公因數表現定理，對每個n 都存在滿足上式的整數n1與n2，且在同餘N 之下n1可以調整至0～N1 –1之間，n2可以調整至0～N2 –1之間。並根據同餘理論易知滿足上式且在以上範圍內的整數n1與n2是唯一的。這稱為Ruritanian 映射 (或Good's 映射)， k = k 1 mod N 1 {\displaystyle k=k_{1}\mod N_{1}} k = k 2 mod N 2 {\displaystyle k=k_{2}\mod N_{2}} 舉例來說: 如果 N = 15 , N 1 = 5 , N 2 = 3 , n = 0 , 1 , 2 , . . . , 12 , 13 , 14 , {\displaystyle N=15,N_{1}=5,N_{2}=3,n=0,1,2,...,12,13,14,} 對於任一 n {\displaystyle n} 都可以對應到 n = n 1 N 2 + n 2 N 1 mod N , n 1 = 0 , 1 , . . . , N 1 − 1 , n 2 = 0 , 1 , . . . , N 2 − 1 {\displaystyle n=n_{1}N_{2}+n_{2}N_{1}\mod N,n_{1}=0,1,...,N_{1}-1,n_{2}=0,1,...,N_{2}-1} 0 = 0 ⋅ N 2 + 0 ⋅ N 1 mod 15 {\displaystyle 0=0\centerdot N_{2}+0\centerdot N_{1}\mod 15} 1 = 2 ⋅ N 2 + 2 ⋅ N 1 mod 15 {\displaystyle 1=2\centerdot N_{2}+2\centerdot N_{1}\mod 15} 2 = 4 ⋅ N 2 + 1 ⋅ N 1 mod 15 {\displaystyle 2=4\centerdot N_{2}+1\centerdot N_{1}\mod 15} 3 = 1 ⋅ N 2 + 0 ⋅ N 1 mod 15 {\displaystyle 3=1\centerdot N_{2}+0\centerdot N_{1}\mod 15} 4 = 3 ⋅ N 2 + 2 ⋅ N 1 mod 15 {\displaystyle 4=3\centerdot N_{2}+2\centerdot N_{1}\mod 15} 5 = 0 ⋅ N 2 + 1 ⋅ N 1 mod 15 {\displaystyle 5=0\centerdot N_{2}+1\centerdot N_{1}\mod 15} 6 = 2 ⋅ N 2 + 0 ⋅ N 1 mod 15 {\displaystyle 6=2\centerdot N_{2}+0\centerdot N_{1}\mod 15} 7 = 4 ⋅ N 2 + 2 ⋅ N 1 mod 15 {\displaystyle 7=4\centerdot N_{2}+2\centerdot N_{1}\mod 15} 8 = 1 ⋅ N 2 + 1 ⋅ N 1 mod 15 {\displaystyle 8=1\centerdot N_{2}+1\centerdot N_{1}\mod 15} 9 = 3 ⋅ N 2 + 0 ⋅ N 1 mod 15 {\displaystyle 9=3\centerdot N_{2}+0\centerdot N_{1}\mod 15} 10 = 0 ⋅ N 2 + 2 ⋅ N 1 mod 15 {\displaystyle 10=0\centerdot N_{2}+2\centerdot N_{1}\mod 15} 11 = 2 ⋅ N 2 + 1 ⋅ N 1 mod 15 {\displaystyle 11=2\centerdot N_{2}+1\centerdot N_{1}\mod 15} 12 = 4 ⋅ N 2 + 0 ⋅ N 1 mod 15 {\displaystyle 12=4\centerdot N_{2}+0\centerdot N_{1}\mod 15} 13 = 1 ⋅ N 2 + 2 ⋅ N 1 mod 15 {\displaystyle 13=1\centerdot N_{2}+2\centerdot N_{1}\mod 15} 14 = 3 ⋅ N 2 + 1 ⋅ N 1 mod 15 {\displaystyle 14=3\centerdot N_{2}+1\centerdot N_{1}\mod 15} 因N1與N2 互質，故根據中國剩餘定理，對於每組 ( k1 , k2 ) (其中k1在0～N1 – 1之間, k2在0～N2 – 1之間)，都有存在且唯一的k 在0～N - 1之間且滿足上兩式。這稱為 CRT 映射。 CRT 映射的另一種表示法如下 k = k 1 N 2 − 1 N 2 + k 2 N 1 − 1 N 1 mod N {\displaystyle k=k_{1}N_{2}^{-1}N_{2}+k_{2}N_{1}^{-1}N_{1}\mod N} 其中N1-1表示N1在模N2之下的反元素，N2-1反之。 ( 也可以改成對輸入n 用 CRT 映射以及對輸出k 用Ruritanian 映射) 對於有效re-indexing (理想上是達到原地)的方法有許多研究，以減少耗費時間的模運算。 表示方法一: 將以上的re-indexing代入DFT公式裡指數部分的nk 之中， e − 2 π i N n k = e − 2 π i N ( n 1 N 2 + n 2 N 1 ) k = e − 2 π i N 1 k n 1 e − 2 π i N 2 k n 2 = e − 2 π i N 1 k 1 n 1 e − 2 π i N 2 k 2 n 2 {\displaystyle e^{-{\frac {2\pi i}{N}}nk}=e^{-{\frac {2\pi i}{N}}(n_{1}N_{2}+n_{2}N_{1})k}=e^{-{\frac {2\pi i}{N_{1}}}kn_{1}}e^{-{\frac {2\pi i}{N_{2}}}kn_{2}}=e^{-{\frac {2\pi i}{N_{1}}}k_{1}n_{1}}e^{-{\frac {2\pi i}{N_{2}}}k_{2}n_{2}}} ( 因為e2πi = 1，所以兩個指數的k 部份可以分別模N1與N2 )。剩下的部分變成 X k 1 , k 2 = ∑ n 1 = 0 N 1 − 1 ( ∑ n 2 = 0 N 2 − 1 x n 1 N 2 + n 2 N 1 e − 2 π i N 2 n 2 k 2 ) e − 2 π i N 1 n 1 k 1 . {\displaystyle X_{k_{1},k_{2}}=\sum _{n_{1}=0}^{N_{1}-1}\left(\sum _{n_{2}=0}^{N_{2}-1}x_{n_{1}N_{2}+n_{2}N_{1}}e^{-{\frac {2\pi i}{N_{2}}}n_{2}k_{2}}\right)e^{-{\frac {2\pi i}{N_{1}}}n_{1}k_{1}}.} 則內部和外部的總和分別轉換成大小為N2與N1的DFT。 表示方法二: 如果令 k = k 1 N 2 + k 2 N 1 f o r k = 0 , 1 , . . . , N − 1 , {\displaystyle k=k_{1}N_{2}+k_{2}N_{1}\quad for\quad k=0,1,...,N-1,} 令 n = ( ( n 1 N 2 + n 2 N 1 ) ) N {\displaystyle n=((n_{1}N_{2}+n_{2}N_{1}))_{N}} ， ( ⋅ ) N {\displaystyle (\cdot )_{N}} 相當於取 N {\displaystyle N} 的餘數， n 1 = 0 , … , N 1 − 1 {\displaystyle n_{1}=0,\dots ,N_{1}-1} , n 2 = 0 , … , N 2 − 1 {\displaystyle n_{2}=0,\dots ,N_{2}-1} X [ ( ( k 1 N 2 + k 2 N 1 ) ) N ] = ∑ n = 0 N − 1 x [ ( ( n 1 N 2 + n 2 N 1 ) ) N ] e − j 2 π N 2 N 1 ( k 1 N 2 + k 2 N 1 ) ( n 1 N 2 + n 2 N 1 ) {\displaystyle X[((k_{1}N_{2}+k_{2}N_{1}))_{N}]=\sum _{n=0}^{N-1}x[((n_{1}N_{2}+n_{2}N_{1}))_{N}]e^{-j{\frac {2\pi }{N_{2}N_{1}}}(k_{1}N_{2}+k_{2}N_{1})(n_{1}N_{2}+n_{2}N_{1})}} = ∑ n = 0 N − 1 x [ ( ( n 1 N 2 + n 2 N 1 ) ) N ] e − j 2 π N 2 N 1 ( k 1 n 1 N 2 N 2 + k 2 n 2 N 1 N 1 + k 1 n 2 N 2 N 1 + k 2 n 1 N 1 N 2 ) {\displaystyle =\sum _{n=0}^{N-1}x[((n_{1}N_{2}+n_{2}N_{1}))_{N}]e^{-j{\frac {2\pi }{N_{2}N_{1}}}(k_{1}n_{1}N_{2}N_{2}+k_{2}n_{2}N_{1}N_{1}+k_{1}n_{2}N_{2}N_{1}+k_{2}n_{1}N_{1}N_{2})}} = ∑ n = 0 N − 1 x [ ( ( n 1 N 2 + n 2 N 1 ) ) N ] e − j 2 π N 1 ( k 1 n 1 N 2 ) e − j 2 π N 2 ( k 2 n 2 N 1 ) {\displaystyle =\sum _{n=0}^{N-1}x[((n_{1}N_{2}+n_{2}N_{1}))_{N}]e^{-j{\frac {2\pi }{N_{1}}}(k_{1}n_{1}N_{2})}e^{-j{\frac {2\pi }{N_{2}}}(k_{2}n_{2}N_{1})}} = ∑ n 2 = 0 N 2 − 1 { ∑ n 1 = 0 N 1 − 1 x [ ( ( n 1 N 2 + n 2 N 1 ) ) N ] e − j 2 π N 1 ( k 1 n 1 N 2 ) } e − j 2 π N 2 ( k 2 n 2 N 1 ) . {\displaystyle =\sum _{n_{2}=0}^{N_{2}-1}\{\sum _{n_{1}=0}^{N_{1}-1}x[((n_{1}N_{2}+n_{2}N_{1}))_{N}]e^{-j{\frac {2\pi }{N_{1}}}(k_{1}n_{1}N_{2})}\}e^{-j{\frac {2\pi }{N_{2}}}(k_{2}n_{2}N_{1})}.} 對於每一個 n 2 {\displaystyle n_{2}} 都要做一個 N 1 {\displaystyle N_{1}} 點的 D F T {\displaystyle DFT} ，而因為 n 2 = 0 , … , N 2 − 1 {\displaystyle n_{2}=0,\dots ,N_{2}-1} 有 N 2 {\displaystyle N_{2}} 個，所以需要 N 2 {\displaystyle N_{2}} 個 N 1 {\displaystyle N_{1}} 點 D F T {\displaystyle DFT} , 對於每一組 ( ( k 1 N 2 ) ) N 1 {\displaystyle ((k_{1}N_{2}))_{N_{1}}} 都要做一個 N 2 {\displaystyle N_{2}} 點的 D F T {\displaystyle DFT} ，而因為 N 2 {\displaystyle N_{2}} 為常數， k 1 = 0 , … , N 1 − 1 {\displaystyle k_{1}=0,\dots ,N_{1}-1} 有 N 1 {\displaystyle N_{1}} 個，所以需要 N 1 {\displaystyle N_{1}} 個 N 2 {\displaystyle N_{2}} 點 D F T {\displaystyle DFT} ， 因此如果要計算複雜度，可以乘法器的數量當作考量, 假設 N 1 {\displaystyle N_{1}} 點的 D F T {\displaystyle DFT} 需要 M 1 {\displaystyle M_{1}} 個乘法器, 假設 N 2 {\displaystyle N_{2}} 點的 D F T {\displaystyle DFT} 需要 M 2 {\displaystyle M_{2}} 個乘法器, 則總共需要 N 2 M 1 + N 1 M 2 {\displaystyle N_{2}M_{1}+N_{1}M_{2}} 個乘法器。 以N = 6為例，有兩種可能，N1 = 2, N2 = 3或N1 = 3, N2 = 2。 第一種情形所產生的流程圖如左圖所示。先做2次3點DFT後再做3次2點DFT。 第二種情形所產生的流程圖如右圖所示。先做3次2點DFT後再做2次3點DFT。 其中2點DFT的部份因構造單純，皆以交錯的蝴蝶圖來顯示。 可以看出即使在這個簡單的例子中，輸入和輸出的index也都經過有點複雜的重新排列。 如首段所述，Cooley-Tukey算法和互質因子算法 (PFA)曾被誤認為很類似。兩者皆有各自優點可適用於不同狀況，因此分辨它們的不同是很重要的。在1965年著名的論文中發表的Cooley-Tukey算法，是在DFT的定義 X k = ∑ n = 0 N − 1 x n e − 2 π i N n k k = 0 , … , N − 1 {\displaystyle X_{k}=\sum _{n=0}^{N-1}x_{n}e^{-{\frac {2\pi i}{N}}nk}\qquad k=0,\dots ,N-1} 中代入n = n1 + n2N1 , k = k1N2 + k2，則 e − 2 π i N n k = e − 2 π i N ( n 1 + n 2 N 1 ) ( k 1 N 2 + k 2 ) = e − 2 π i N 1 n 1 k 1 e − 2 π i N n 1 k 2 e − 2 π i N 2 n 2 k 2 {\displaystyle e^{-{\frac {2\pi i}{N}}nk}=e^{-{\frac {2\pi i}{N}}(n_{1}+n_{2}N_{1})(k_{1}N_{2}+k_{2})}=e^{-{\frac {2\pi i}{N_{1}}}n_{1}k_{1}}e^{-{\frac {2\pi i}{N}}n_{1}k_{2}}e^{-{\frac {2\pi i}{N_{2}}}n_{2}k_{2}}} X k 1 N 2 + k 2 = ∑ n 1 = 0 N 1 − 1 ( ∑ n 2 = 0 N 2 − 1 x n 1 + n 2 N 1 e − 2 π i N 2 n 2 k 2 ) e − 2 π i N n 1 k 2 e − 2 π i N 1 n 1 k 1 {\displaystyle X_{k_{1}N_{2}+k_{2}}=\sum _{n_{1}=0}^{N_{1}-1}\left(\sum _{n_{2}=0}^{N_{2}-1}x_{n_{1}+n_{2}N_{1}}e^{-{\frac {2\pi i}{N_{2}}}n_{2}k_{2}}\right)e^{-{\frac {2\pi i}{N}}n_{1}k_{2}}e^{-{\frac {2\pi i}{N_{1}}}n_{1}k_{1}}} 比PFA多了一些要乘的因子 e − 2 π i N n 1 k 2 {\displaystyle e^{-{\frac {2\pi i}{N}}n_{1}k_{2}}} (稱為twiddle factors )，但index較為簡單，且適用於任何N1、N2。在J. Cooley稍後發表的關於FFT歷史探討的論文中使用N = 24點FFT為例，顯示兩種作法在index結構上的不同。 快速傅立葉變換 中國剩餘定理 Bézout引理 I. J. Good, The interaction algorithm and practical Fourier analysis, J. R. Statist. Soc. B, 1958, 20(2): 361–372  L. H. Thomas, Using a computer to solve problems in physics, Applications of Digital Computers, 1963  S. C. Chan and K. L. Ho, On indexing the prime-factor fast Fourier transform algorithm, IEEE Trans. Circuits and Systems, 1991, 38(8): 951–953 . J. Cooley, P. Lewis, and P. Welch, Historical notes on the fast Fourier transform, IEEE Transactions on Audio and Electroacoustics, 1967, 15(2): 76–79  P. Duhamel and M. Vetterli, Fast Fourier transforms: a tutorial review and a state of the art, Signal Processing, 1990, 19: 259–299  fft note by Burrus（页面存档备份，存于互联网档案馆） cnx（页面存档备份，存于互联网档案馆）