Prime-factor FFT algorithm

The prime-factor algorithm (PFA), also called the Good–Thomas algorithm (1958/1963), is a fast Fourier transform (FFT) algorithm that re-expresses the discrete Fourier transform (DFT) of a size "N" = "N"1"N"2 as a two-dimensional "N"1×"N"2 DFT, but "only" for the case where "N"1 and "N"2 are relatively prime. These smaller transforms of size "N"1 and "N"2 can then be evaluated by applying PFA recursively or by using some other FFT algorithm.
PFA should not be confused with the mixed-radix generalization of the popular Cooley–Tukey algorithm, which also subdivides a DFT of size "N" = "N"1"N"2 into smaller transforms of size "N"1 and "N"2. The latter algorithm can use "any" factors (not necessarily relatively prime), but it has the disadvantage that it also requires extra multiplications by roots of unity called twiddle factors, in addition to the smaller transforms. On the other hand, PFA has the disadvantages that it only works for relatively prime factors (e.g. it is useless for power-of-two sizes) and that it requires a more complicated re-indexing of the data based on the Chinese remainder theorem (CRT). Note, however, that PFA can be combined with mixed-radix Cooley–Tukey, with the former factorizing "N" into relatively prime components and the latter handling repeated factors.
PFA is also closely related to the nested Winograd FFT algorithm, where the latter performs the decomposed "N"1 by "N"2 transform via more sophisticated two-dimensional convolution techniques. Some older papers therefore also call Winograd's algorithm a PFA FFT.
Algorithm.
Recall that the DFT is defined by the formula:
The PFA involves a re-indexing of the input and output arrays, which when substituted into the DFT formula transforms it into two nested DFTs (a two-dimensional DFT).
Re-indexing.
Suppose that "N" = "N"1"N"2, where "N"1 and "N"2 are relatively prime. In this case, we can define a bijective re-indexing of the input "n" and output "k" by:
where "N"1−1 denotes the modular multiplicative inverse of "N"1 modulo "N"2 and vice versa for "N"2−1; the indices "k""a" and "n""a" run from 0, …, "N""a" − 1 (for "a" = 1, 2). These inverses only exist for relatively prime "N"1 and "N"2, and that condition is also required for the first mapping to be bijective.
This re-indexing of "n" is called the "Ruritanian" mapping (also "Good's" mapping), while this re-indexing of "k" is called the "CRT" mapping. The latter refers to the fact that "k" is the solution to the Chinese remainder problem "k" = "k"1 mod "N"1 and "k" = "k"2 mod "N"2.
A great deal of research has been devoted to schemes for evaluating this re-indexing efficiently, ideally in-place, while minimizing the number of costly modulo (remainder) operations (Chan, 1991, and references).
DFT re-expression.
The above re-indexing is then substituted into the formula for the DFT, and in particular into the product "nk" in the exponent. Because "e"2"πi" = 1, this exponent is evaluated modulo "N": any "N"1"N"2 = "N" cross term in the "nk" product can be set to zero. (Similarly, "X""k" and "x""n" are implicitly periodic in "N", so their subscripts are evaluated modulo "N".) The remaining terms give:
The inner and outer sums are simply DFTs of size "N"2 and "N"1, respectively.