互质因子算法

互质因子算法（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）的定义如下:
PFA将输入和输出re-indexing，代入DFT公式后转换成二维DFT。
Re-indexing.
设"N" = "N"1"N"2，"N"1与"N"2两者互质，然后把输入"n" 和输出"k" 一一对应到
因"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" 映射)，
举例来说: 
如果formula_5对于任一 formula_6 都可以对应到
formula_7
formula_8
formula_9
formula_10
formula_11
formula_12
formula_13
formula_14
formula_15
formula_16
formula_17
formula_18
formula_19
formula_20
formula_21
formula_22
因"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" 映射的另一种表示法如下
其中"N"1-1表示"N"1在模"N"2之下的反元素，"N"2-1反之。
对于有效re-indexing (理想上是达到原地)的方法有许多研究，以减少耗费时间的模运算。
DFT re-expression.
表示方法一:
将以上的re-indexing代入DFT公式里指数部分的"nk" 之中，
( 因为"e"2π"i" = 1，所以两个指数的"k" 部份可以分别模"N"1与"N"2 )。剩下的部分变成
则内部和外部的总和分别转换成大小为"N"2与"N"1的DFT。
表示方法二:
如果令 formula_26
令 formula_27，formula_28相当于取 formula_29的余数，formula_30, formula_31
formula_32
formula_33
formula_34
formula_35
对于每一个 formula_36 都要做一个 formula_37 点的 formula_38，而因为 formula_31有 formula_40个，所以需要 formula_40 个 formula_37 点 formula_38,
对于每一组formula_44都要做一个 formula_40 点的 formula_38，而因为 formula_40为常数，formula_48有 formula_37 个，所以需要 formula_37 个 formula_40 点 formula_38，
因此如果要计算复杂度，可以乘法器的数量当作考量,
假设formula_37 点的 formula_38 需要 formula_55个乘法器,
假设formula_40 点的 formula_38 需要 formula_58个乘法器,
则总共需要 formula_59个乘法器。
范例.
以"N" = 6为例，有两种可能，"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的定义
中代入"n" = "n"1 + "n"2"N"1 , "k" = "k"1"N"2 + "k"2，则
比PFA多了一些要乘的因子formula_63 (称为twiddle factors )，但index较为简单，且适用于任何"N"1、"N"2。在J. Cooley稍后发表的关于FFT历史探讨的论文中使用"N" = 24点FFT为例，显示两种作法在index结构上的不同。
N1 与 N2 不互质情况.
formula_64，若formula_37 与 formula_40 并不互质，仍可透过拆解得到运算所需的乘法数量。
离散傅立叶变换（DFT）的定义如下:
formula_67
可以拆解成formula_40 个 formula_69 DFTs 和 formula_37 个 formula_71 formula_72，以及twiddle factor。
算法.
令 formula_73，formula_74。 formula_75, formula_76
可得出下列式子
formula_77
formula_78
formula_79
formula_80
上述的 formula_81 被称为twiddle factor，需要额外的乘法去做运算。
由于formula_75, formula_76
twiddle factors的数量为 formula_64，移去 formula_85 以及 formula_86 的情况，至多需要 formula_87个twiddle factors。
分阶段解析.
Step1.
令 formula_88
Step2.
固定 formula_36，对 formula_90 做 formula_71 formula_38。
formula_93
由于formula_94，所以有 formula_37 个 formula_71 formula_72
Step3.
formula_98 (twiddle factors)
Step4.
固定 formula_36，对 formula_100 做 formula_69 formula_38。
formula_103
由于formula_104，所以有 formula_40 个 formula_69 formula_72
Step5.
formula_108 
实际乘法量计算.
formula_64
假设 formula_69 DFT 的乘法量为 formula_111， formula_71 formula_38 的乘法量为 formula_114
且 formula_115 中，
有 formula_116 个值不为 formula_117 以及 formula_118 的倍数
有 formula_119 个值为 formula_117 或 formula_118 的倍数，但不为 formula_122 的倍数
则 formula_123 formula_38 的乘法量数量为 formula_125 个。
补充说明.
formula_126为一复数，则 formula_127 一般需要 3个乘法，但若 formula_128 = formula_129 或 formula_128 = formula_131 则只需要2个乘法。
简单范例.
formula_132 formula_38, formula_134
formula_135 needs formula_136
formula_115 = formula_138
formula_116 = 4 (1, 3, 3, 9), formula_119 = 4 (2, 2, 6, 6)
总计需要 formula_141