**互質因子算法**（Prime-factor FFT algorithm, PFA），又稱為Good-Thomas算法
，是一種快速傅立葉變換（FFT），把*N* = *N*1*N*2大小的離散傅立葉變換重新表示為*N*1 \* *N*2大小的二維離散傅立葉變換，其中*N*1與*N*2需互質。變成*N*1和*N*2大小的傅立葉變換後，可以繼續遞迴使用PFA，或用其他快速傅立葉變換算法來計算。

較流行的Cooley-Tukey算法經由mixed-radix一般化後，也是把*N* = *N*1*N*2大小的離散傅立葉變換分割為*N*1和*N*2大小的轉換，但和互質因子算法 (PFA)作法並不相同，不應混淆。Cooley-Tukey算法的*N*1與*N*2不需互質，可以是任何整數。然而有個缺點是比PFA多出一些乘法，和單位根twiddle factors相乘。相對的，PFA的缺點則是*N*1與*N*2需互質 (例如*N* 是2次方就不適用)，而且要藉由中國剩餘定理來進行較複雜的re-indexing。互質因子算法 (PFA)可以和mixed-radix Cooley-Tukey算法相結合，前者將*N* 分解為互質的因數，後者則用在重複質因數上。

PFA也與nested Winograd FFT算法密切相關，後者使用更為精巧的二維摺積技巧分解成*N*1 \* *N*2的轉換。因而一些較古老的論文把Winograd算法稱為PFA FFT。

儘管PFA和Cooley-Tukey算法並不相同，但有趣的是Cooley和Tukey在他們1965年發表的有名的論文中，沒有發覺到高斯和其他人更早的研究，只引用Good在1958年發表的PFA作為前人的FFT結果。剛開始的時候人們對這兩種作法是否不同有點困惑。

算法
--

離散傅立葉變換（DFT）的定義如下:

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。

### Re-indexing

設*N* = *N*1*N*2，*N*1與*N*2兩者互質，然後把輸入*n* 和輸出*k* 一一對應到

n = n\_1 N\_2 + n\_2 N\_1 \mod N
因*N*1與*N*2 互質，故根據最大公因數表現定理，對每個*n* 都存在滿足上式的整數*n*1與*n*2，且在同餘*N* 之下*n*1可以調整至0～*N*1 –1之間，*n*2可以調整至0～*N*2 –1之間。並根據同餘理論易知滿足上式且在以上範圍內的整數*n*1與*n*2是唯一的。這稱為*Ruritanian* 映射 (或*Good's* 映射)，

k = k\_1 \mod N\_1
k = k\_2 \mod N\_2
舉例來說: 

如果{\displaystyle N=15,N\_{1}=5,N\_{2}=3,n=0,1,2,...12,13,14,}對於任一 n 都可以對應到

{\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}

{\displaystyle 0=0\centerdot N\_{2}+0\centerdot N\_{1}\mod 15}

{\displaystyle 1=2\centerdot N\_{2}+2\centerdot N\_{1}\mod 15}

{\displaystyle 2=4\centerdot N\_{2}+1\centerdot N\_{1}\mod 15}

{\displaystyle 3=1\centerdot N\_{2}+0\centerdot N\_{1}\mod 15}

{\displaystyle 4=3\centerdot N\_{2}+2\centerdot N\_{1}\mod 15}

{\displaystyle 5=0\centerdot N\_{2}+1\centerdot N\_{1}\mod 15}

{\displaystyle 6=2\centerdot N\_{2}+0\centerdot N\_{1}\mod 15}

{\displaystyle 7=4\centerdot N\_{2}+2\centerdot N\_{1}\mod 15}

{\displaystyle 8=1\centerdot N\_{2}+1\centerdot N\_{1}\mod 15}

{\displaystyle 9=3\centerdot N\_{2}+0\centerdot N\_{1}\mod 15}

{\displaystyle 10=0\centerdot N\_{2}+2\centerdot N\_{1}\mod 15}

{\displaystyle 11=2\centerdot N\_{2}+1\centerdot N\_{1}\mod 15}

{\displaystyle 12=4\centerdot N\_{2}+0\centerdot N\_{1}\mod 15}

{\displaystyle 13=1\centerdot N\_{2}+2\centerdot N\_{1}\mod 15}

{\displaystyle 14=3\centerdot N\_{2}+1\centerdot N\_{1}\mod 15}

因*N*1與*N*2 互質，故根據中國剩餘定理，對於每組 ( *k*1 , *k*2 ) (其中*k*1在0～*N*1 – 1之間, *k*2在0～*N*2 – 1之間)，都有存在且唯一的*k* 在0～*N* - 1之間且滿足上兩式。這稱為 *CRT* 映射。
 *CRT* 映射的另一種表示法如下

k = k\_1 N\_2^{-1} N\_2 + k\_2 N\_1^{-1} N\_1 \mod N
其中*N*1-1表示*N*1在模*N*2之下的反元素，*N*2-1反之。

( 也可以改成對輸入*n* 用 *CRT* 映射以及對輸出*k* 用*Ruritanian* 映射)

對於有效re-indexing (理想上是達到原地)的方法有許多研究，以減少耗費時間的模運算。

### DFT re-expression

表示方法一:

將以上的re-indexing代入DFT公式裡指數部分的*nk* 之中，

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} k n\_1} e^{-\frac{2\pi i}{N\_2} k n\_2} = e^{-\frac{2\pi i}{N\_1} k\_1 n\_1} e^{-\frac{2\pi i}{N\_2} k\_2 n\_2}
( 因為*e*2π*i* = 1，所以兩個指數的*k* 部份可以分別模*N*1與*N*2 )。剩下的部分變成

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 }.

則內部和外部的總和分別轉換成大小為*N*2與*N*1的DFT。

表示方法二:

如果令 {\displaystyle k=k\_{1}N\_{2}+k\_{2}N\_{1}\quad for\quad k=0,1,...N-1,}

令 {\displaystyle n=((n\_{1}N\_{2}+n\_{2}N\_{1}))\_{N}}，{\displaystyle (\cdot )\_{N}}相當於取 N的餘數，{\displaystyle n\_{1}=0,\dots ,N\_{1}-1}, {\displaystyle n\_{2}=0,\dots ,N\_{2}-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})}}

{\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})}}

{\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})}}

{\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} 都要做一個 N\_{1} 點的 {\displaystyle DFT}，而因為 {\displaystyle n\_{2}=0,\dots ,N\_{2}-1}有 N\_{2}個，所以需要 N\_{2} 個 N\_{1} 點 {\displaystyle DFT},

對於每一組{\displaystyle ((k\_{1}N\_{2}))\_{N\_{1}}}都要做一個 N\_{2} 點的 {\displaystyle DFT}，而因為 N\_{2}為常數，{\displaystyle k\_{1}=0,\dots ,N\_{1}-1}有 N\_{1} 個，所以需要 N\_{1} 個 N\_{2} 點 {\displaystyle DFT}，

因此如果要計算複雜度，可以乘法器的數量當作考量,

假設N\_{1} 點的 {\displaystyle DFT} 需要 M\_{1}個乘法器,

假設N\_{2} 點的 {\displaystyle DFT} 需要 M\_{2}個乘法器,

則總共需要 {\displaystyle N\_{2}M\_{1}+N\_{1}M\_{2}}個乘法器。

### 範例

以*N* = 6為例，有兩種可能，*N*1 = 2, *N*2 = 3或*N*1 = 3, *N*2 = 2。

 *N*1 = 2, *N*2 = 3 
 *N*1 = 3, *N*2 = 2 
第一種情形所產生的流程圖如左圖所示。先做2次3點DFT後再做3次2點DFT。

第二種情形所產生的流程圖如右圖所示。先做3次2點DFT後再做2次3點DFT。

其中2點DFT的部份因構造單純，皆以交錯的蝴蝶圖來顯示。

可以看出即使在這個簡單的例子中，輸入和輸出的index也都經過有點複雜的重新排列。

與Cooley-Tukey算法的比較
------------------

如首段所述，Cooley-Tukey算法和互質因子算法 (PFA)曾被誤認為很類似。兩者皆有各自優點可適用於不同狀況，因此分辨它們的不同是很重要的。在1965年著名的論文中發表的Cooley-Tukey算法，是在DFT的定義

X\_k = \sum\_{n=0}^{N-1} x\_n e^{-\frac{2\pi i}{N} nk }
\qquad
k = 0,\dots,N-1 
中代入*n* = *n*1 + *n*2*N*1 , *k* = *k*1*N*2 + *k*2，則

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\_1N\_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^{-\frac{2\pi i}{N} n\_1 k\_2} (稱為twiddle factors )，但index較為簡單，且適用於任何*N*1、*N*2。在J. Cooley稍後發表的關於FFT歷史探討的論文中使用*N* = 24點FFT為例，顯示兩種作法在index結構上的不同。

相關條目
----

* 快速傅立葉變換
* 中國剩餘定理
* Bézout引理

注釋
--

1. ↑  I. J. Good, J. R. Statist. Soc. B, 1958, **20(2)**: 361–372
2. ↑  L. H. Thomas, Applications of Digital Computers, 1963
3. ↑  S. C. Chan and K. L. Ho, IEEE Trans. Circuits and Systems, 1991, **38(8)**: 951–953 .
4. ↑  J. Cooley, P. Lewis, and P. Welch, IEEE Transactions on Audio and Electroacoustics, 1967, **15(2)**: 76–79

參考文獻
----

1. P. Duhamel and M. Vetterli, Signal Processing, 1990, **19**: 259–299

外部連結
----

* fft note by Burrus（页面存档备份，存于）
* cnx（页面存档备份，存于）