The cyclotomic fast Fourier transform is a type of fast Fourier transform algorithm over finite fields.[1] This algorithm first decomposes a DFT into several circular convolutions, and then derives the DFT results from the circular convolution results. When applied to a DFT over
, this algorithm has a very low multiplicative complexity. In practice, since there usually exist efficient algorithms for circular convolutions with specific lengths, this algorithm is very efficient.[2]
The discrete Fourier transform over finite fields finds widespread application in the decoding of error-correcting codes such as BCH codes and Reed–Solomon codes. Generalized from the complex field, a discrete Fourier transform of a sequence
over a finite field GF(pm) is defined as
![{\displaystyle F_{j}=\sum _{i=0}^{N-1}f_{i}\alpha ^{ij},0\leq j\leq N-1,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ee10a1e7280b0cfbea782d42b255856faf265643)
where
is the N-th primitive root of 1 in GF(pm). If we define the polynomial representation of
as
![{\displaystyle f(x)=f_{0}+f_{1}x+f_{2}x^{2}+\cdots +f_{N-1}x^{N-1}=\sum _{0}^{N-1}f_{i}x^{i},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4c62dcabbf0d60aab4d6b36a805d8860ddb63f8a)
it is easy to see that
is simply
. That is, the discrete Fourier transform of a sequence converts it to a polynomial evaluation problem.
Written in matrix format,
![{\displaystyle \mathbf {F} =\left[{\begin{matrix}F_{0}\\F_{1}\\\vdots \\F_{N-1}\end{matrix}}\right]=\left[{\begin{matrix}\alpha ^{0}&\alpha ^{0}&\cdots &\alpha ^{0}\\\alpha ^{0}&\alpha ^{1}&\cdots &\alpha ^{N-1}\\\vdots &\vdots &\ddots &\vdots \\\alpha ^{0}&\alpha ^{N-1}&\cdots &\alpha ^{(N-1)(N-1)}\end{matrix}}\right]\left[{\begin{matrix}f_{0}\\f_{1}\\\vdots \\f_{N-1}\end{matrix}}\right]={\mathcal {F}}\mathbf {f} .}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f1265f79edbfdbf2be3624afc83b9a95fdee874f)
Direct evaluation of DFT has an
complexity. Fast Fourier transforms are just efficient algorithms evaluating the above matrix-vector product.
First, we define a linearized polynomial over GF(pm) as
![{\displaystyle L(x)=\sum _{i}l_{i}x^{p^{i}},l_{i}\in \mathrm {GF} (p^{m}).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/541777c9583b92394526837ed61ffba5fea08253)
is called linearized because
, which comes from the fact that for elements ![{\displaystyle x_{1},x_{2}\in \mathrm {GF} (p^{m}),}](https://wikimedia.org/api/rest_v1/media/math/render/svg/767e222b1474f79d28316eabbac2ee635f81aa6c)
Notice that
is invertible modulo
because
must divide the order
of the multiplicative group of the field
. So, the elements
can be partitioned into
cyclotomic cosets modulo
:
![{\displaystyle \{0\},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/24e3d43e3dc8ecfabf8f9c40c9ab4965b1c92298)
![{\displaystyle \{k_{1},pk_{1},p^{2}k_{1},\ldots ,p^{m_{1}-1}k_{1}\},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e5a9a0360622a7afa8d115cc92de95e77ee5118c)
![{\displaystyle \ldots ,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a3dbfc5796975effdfc4a5e30c7b0ce9e80e0d5f)
![{\displaystyle \{k_{l},pk_{l},p^{2}k_{l},\ldots ,p^{m_{l}-1}k_{l}\},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0bc62f89c739a5df7508fd1baaf721a4e29d8571)
where
. Therefore, the input to the Fourier transform can be rewritten as
![{\displaystyle f(x)=\sum _{i=0}^{l}L_{i}(x^{k_{i}}),\quad L_{i}(y)=\sum _{t=0}^{m_{i}-1}y^{p^{t}}f_{p^{t}k_{i}{\bmod {N}}}.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9319dc74b1f47cf8796272486bfa933399924c63)
In this way, the polynomial representation is decomposed into a sum of linear polynomials, and hence
is given by
.
Expanding
with the proper basis
, we have
where
, and by the property of the linearized polynomial
, we have
![{\displaystyle F_{j}=\sum _{i=0}^{l}\sum _{s=0}^{m_{i}-1}a_{ijs}\left(\sum _{t=0}^{m_{i}-1}\beta _{i,s}^{p^{t}}f_{p^{t}k_{i}{\bmod {N}}}\right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/59f6c8334c584fe4f48749efc4fc11b45e3c7454)
This equation can be rewritten in matrix form as
, where
is an
matrix over GF(p) that contains the elements
,
is a block diagonal matrix, and
is a permutation matrix regrouping the elements in
according to the cyclotomic coset index.
Note that if the normal basis
is used to expand the field elements of
, the i-th block of
is given by:
![{\displaystyle \mathbf {L} _{i}={\begin{bmatrix}\gamma _{i}^{p^{0}}&\gamma _{i}^{p^{1}}&\cdots &\gamma _{i}^{p^{m_{i}-1}}\\\gamma _{i}^{p^{1}}&\gamma _{i}^{p^{2}}&\cdots &\gamma _{i}^{p^{0}}\\\vdots &\vdots &\ddots &\vdots \\\gamma _{i}^{p^{m_{i}-1}}&\gamma _{i}^{p^{0}}&\cdots &\gamma _{i}^{p^{m_{i}-2}}\\\end{bmatrix}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba74cdadc3eae6dcc5ca41676ef46b3db00cb581)
which is a circulant matrix. It is well known that a circulant matrix-vector product can be efficiently computed by convolutions. Hence we successfully reduce the discrete Fourier transform into short convolutions.
When applied to a characteristic-2 field GF(2m), the matrix
is just a binary matrix. Only addition is used when calculating the matrix-vector product of
and
. It has been shown that the multiplicative complexity of the cyclotomic algorithm is given by
, and the additive complexity is given by
.[2]