離散フーリエ変換を O(n log n) で行うアルゴリズム

離散フーリエ変換とは,長さ n の数列 x_0, x_1, \ldots, x_{n - 1} から長さ n の数列 X_0, X_1, \ldots, X_{n - 1} への変換で,各  k (0 \leq k < n) について次のように定義されます.

 \displaystyle X_k = \sum_{j = 0}^{n - 1} \zeta_n^{-jk} x_j
ただし  \zeta_n \cos\frac{2\pi}{n} + \sqrt{-1}\sin\frac{2\pi}{n} で定義され,  n 乗すると 1 になる虚数(の1つ)です.また,逆離散フーリエ変換はその逆変換ですが,式はよく似ています.
 \displaystyle x_j = \frac{1}{n} \sum_{k = 0}^{n - 1} \zeta_n^{jk} X_k
逆離散フーリエ変換が離散フーリエ変換の逆変換になっていることの証明は容易です.

今回はこれを任意の  n について  O(n \log n) で計算するアルゴリズムを考えます.

Cooley-Tukey のアルゴリズム

Cooley-Tukey のアルゴリズムは離散フーリエ変換を行う最も有名なアルゴリズムで,  n合成数のときに限って使えます.例として,  n = 6 のときを考えます. x_0, x_1, \ldots, x_5 の離散フーリエ変換  X_0, X_1, \ldots, X_5 は,定義によれば次のようになります.

 \begin{alignat}{6}
X_0 &= x_0 + &x_1 &+ &x_2 &+ &x_3 &+ &x_4 &+ &x_5 \\
X_1 &= x_0 + &\zeta_6^{-1} x_1 &+ &\zeta_6^{-2} x_2 &+ &\zeta_6^{-3} x_3 &+ &\zeta_6^{-4} x_4 &+ &\zeta_6^{-5} x_5 \\
X_2 &= x_0 + &\zeta_6^{-2} x_1 &+ &\zeta_6^{-4} x_2 &+ &\zeta_6^{-6} x_3 &+ &\zeta_6^{-8} x_4 &+ &\zeta_6^{-10} x_5 \\
X_3 &= x_0 + &\zeta_6^{-3} x_1 &+ &\zeta_6^{-6} x_2 &+ &\zeta_6^{-9} x_3 &+ &\zeta_6^{-12} x_4 &+ &\zeta_6^{-15} x_5 \\
X_4 &= x_0 + &\zeta_6^{-4} x_1 &+ &\zeta_6^{-8} x_2 &+ &\zeta_6^{-12} x_3 &+ &\zeta_6^{-16} x_4 &+ &\zeta_6^{-20} x_5 \\
X_5 &= x_0 + &\zeta_6^{-5} x_1 &+ &\zeta_6^{-10} x_2 &+ &\zeta_6^{-15} x_3 &+ &\zeta_6^{-20} x_4 &+ &\zeta_6^{-25} x_5
\end{alignat}
さて,ここで  n = 6 n_1 \times n_2 の形に因数分解します.まず  n_1 = 2 n_2 = 3 としてみましょう.そして,右辺にある  x_0, x_1, \ldots, x_5 を,添字を  n_2 = 3 で割った余りで並び替えます.
 \begin{alignat}{6}
X_0 &= x_0 + &x_3 &+ &x_1 &+ &x_4 &+ &x_2 &+ &x_5 \\
X_1 &= x_0 + &\zeta_6^{-3} x_3 &+ &\zeta_6^{-1} x_1 &+ &\zeta_6^{-4} x_4 &+ &\zeta_6^{-2} x_2 &+ &\zeta_6^{-5} x_5 \\
X_2 &= x_0 + &\zeta_6^{-6} x_3 &+ &\zeta_6^{-2} x_1 &+ &\zeta_6^{-8} x_4 &+ &\zeta_6^{-4} x_2 &+ &\zeta_6^{-10} x_5 \\
X_3 &= x_0 + &\zeta_6^{-9} x_3 &+ &\zeta_6^{-3} x_1 &+ &\zeta_6^{-12} x_4 &+ &\zeta_6^{-6} x_2 &+ &\zeta_6^{-15} x_5 \\
X_4 &= x_0 + &\zeta_6^{-12} x_3 &+ &\zeta_6^{-4} x_1 &+ &\zeta_6^{-16} x_4 &+ &\zeta_6^{-8} x_2 &+ &\zeta_6^{-20} x_5 \\
X_5 &= x_0 + &\zeta_6^{-15} x_3 &+ &\zeta_6^{-5} x_1 &+ &\zeta_6^{-20} x_4 &+ &\zeta_6^{-10} x_2 &+ &\zeta_6^{-25} x_5
\end{alignat}
ここで, \zeta_6^6 = 1 であることを利用すると, \zeta_6 の肩の数字が次のように書き換えられます.
 \begin{alignat}{6}
X_0 &= x_0 + &x_3 &+ &x_1 &+ &x_4 &+ &x_2 &+ &x_5 \\
X_1 &= x_0 + &\zeta_6^{-3} x_3 &+ &\zeta_6^{-1} x_1 &+ &\zeta_6^{-4} x_4 &+ &\zeta_6^{-2} x_2 &+ &\zeta_6^{-5} x_5 \\
X_2 &= x_0 + &x_3 &+ &\zeta_6^{-2} x_1 &+ &\zeta_6^{-2} x_4 &+ &\zeta_6^{-4} x_2 &+ &\zeta_6^{-4} x_5 \\
X_3 &= x_0 + &\zeta_6^{-3} x_3 &+ &\zeta_6^{-3} x_1 &+ &\zeta_6^{-6} x_4 &+ &\zeta_6^{-6} x_2 &+ &\zeta_6^{-9} x_5 \\
X_4 &= x_0 + &x_3 &+ &\zeta_6^{-4} x_1 &+ &\zeta_6^{-4} x_4 &+ &\zeta_6^{-8} x_2 &+ &\zeta_6^{-8} x_5 \\
X_5 &= x_0 + &\zeta_6^{-3} x_3 &+ &\zeta_6^{-5} x_1 &+ &\zeta_6^{-8} x_4 &+ &\zeta_6^{-10} x_2 &+ &\zeta_6^{-13} x_5
\end{alignat}
この状態で式を次のようにくくると,同じ形がたくさん出てきます.
 \begin{alignat}{8}
X_0 &= (x_0 + &x_3) &+ &&&&(x_1 + &x_4) &+ &&&&(x_2 + &x_5) \\
X_1 &= (x_0 + &\zeta_6^{-3} x_3) &+ &&&\zeta_6^{-1} &(x_1 + &\zeta_6^{-3} x_4) &+ &&&\zeta_6^{-2} &(x_2 + &\zeta_6^{-3} x_5) \\
X_2 &= (x_0 + &x_3) &+ &\zeta_6^{-2} &&&(x_1 + &x_4) &+ &\zeta_6^{-4} &&&(x_2 + &x_5) \\
X_3 &= (x_0 + &\zeta_6^{-3} x_3) &+ &\zeta_6^{-2} &\cdot &\zeta_6^{-1} &(x_1 + &\zeta_6^{-3} x_4) &+ &\zeta_6^{-4} &\cdot &\zeta_6^{-2} &(x_2 + &\zeta_6^{-3} x_5) \\
X_4 &= (x_0 + &x_3) &+ &\zeta_6^{-4} &&&(x_1 + &x_4) &+ &\zeta_6^{-8} &&&(x_2 + &x_5) \\
X_5 &= (x_0 + &\zeta_6^{-3} x_3) &+ &\zeta_6^{-4} &\cdot &\zeta_6^{-1} &(x_1 + &\zeta_6^{-3} x_4) &+ &\zeta_6^{-8} &\cdot &\zeta_6^{-2} &(x_2 + &\zeta_6^{-3} x_5)
\end{alignat}
 \zeta_6^{-3} = \zeta_2^{-1} であることに注意すると,
 \begin{alignat}{3}
A_0 &= x_0 + &x_3 &= x_0 + &x_3 \\
A_1 &= x_0 + &\zeta_6^{-3} x_3 &= x_0 + &\zeta_2^{-1} x_3
\end{alignat}
は長さ  2 の数列  x_0, x_3 の離散フーリエ変換であり,
 \begin{alignat}{3}
B_0 &= x_1 + &x_4 &= x_1 + &x_4 \\
B_1 &= x_1 + &\zeta_6^{-3} x_4 &= x_1 + &\zeta_2^{-1} x_4
\end{alignat}
は長さ  2 の数列  x_1, x_4 の離散フーリエ変換であり,
 \begin{alignat}{3}
C_0 &= x_2 + &x_5 &= x_2 + &x_5 \\
C_1 &= x_2 + &\zeta_6^{-3} x_5 &= x_2 + &\zeta_2^{-1} x_5
\end{alignat}
は長さ  2 の数列  x_2, x_5 の離散フーリエ変換であるということに気付きます.これを用いてもとの式を書き換えると
 \begin{alignat}{5}
X_0 &= A_0 + &&&&B_0 + &&&&C_0 \\
X_1 &= A_1 + &&&\zeta_6^{-1} &B_1 + &&&\zeta_6^{-2} &C_1 \\
X_2 &= A_0 + &\zeta_6^{-2} &&&B_0 + &\zeta_6^{-4} &&&C_0 \\
X_3 &= A_1 + &\zeta_6^{-2} &\cdot &\zeta_6^{-1} &B_1 + &\zeta_6^{-4} &\cdot &\zeta_6^{-2} &C_1 \\
X_4 &= A_0 + &\zeta_6^{-4} &&&B_0 + &\zeta_6^{-8} &&&C_0 \\
X_5 &= A_1 + &\zeta_6^{-4} &\cdot &\zeta_6^{-1} &B_1 + &\zeta_6^{-8} &\cdot &\zeta_6^{-2} &C_1
\end{alignat}
となり,さらにこれを並べ替えると
 \begin{alignat}{5}
X_0 &= A_0 + &&&&B_0 + &&&&C_0 \\
X_2 &= A_0 + &\zeta_6^{-2} &&&B_0 + &\zeta_6^{-4} &&&C_0 \\
X_4 &= A_0 + &\zeta_6^{-4} &&&B_0 + &\zeta_6^{-8} &&&C_0 \\
X_1 &= A_1 + &&&\zeta_6^{-1} &B_1 + &&&\zeta_6^{-2} &C_1 \\
X_3 &= A_1 + &\zeta_6^{-2} &\cdot &\zeta_6^{-1} &B_1 + &\zeta_6^{-4} &\cdot &\zeta_6^{-2} &C_1 \\
X_5 &= A_1 + &\zeta_6^{-4} &\cdot &\zeta_6^{-1} &B_1 + &\zeta_6^{-8} &\cdot &\zeta_6^{-2} &C_1
\end{alignat}
となります.今度は  \zeta_6^{-2} = \zeta_3^{-1}\zeta_6^{-4} = \zeta_3^{-2}\zeta_6^{-8} = \zeta_3^{-4} であることに注意すると,
 \begin{alignat}{5}
X_0 &= A_0 + &B_0 &+ &C_0 &= A_0 + &B_0 &+ &C_0 \\
X_2 &= A_0 + &\zeta_6^{-2} B_0 &+ &\zeta_6^{-4} C_0 &= A_0 + &\zeta_3^{-1} B_0 &+ &\zeta_3^{-2} C_0 \\
X_4 &= A_0 + &\zeta_6^{-4} B_0 &+ &\zeta_6^{-8} C_0 &= A_0 + &\zeta_3^{-2} B_0 &+ &\zeta_3^{-4} C_0 \\
\end{alignat}
は長さ  3 の数列  A_0, B_0, C_0 の離散フーリエ変換であり,
 \begin{alignat}{5}
X_1 &= A_1 + &\zeta_6^{-1} B_1 &+ &\zeta_6^{-2} C_1 &= A_1 + &\zeta_6^{-1} B_1 &+ &\zeta_6^{-2} C_1 \\
X_3 &= A_1 + &\zeta_6^{-2} \cdot \zeta_6^{-1} B_1 &+ &\zeta_6^{-4} \cdot \zeta_6^{-2} C_1 &= A_1 + &\zeta_3^{-1} \cdot \zeta_6^{-1} B_1 &+ &\zeta_3^{-2} \cdot \zeta_6^{-2} C_1 \\
X_5 &= A_1 + &\zeta_6^{-4} \cdot \zeta_6^{-1} B_1 &+ &\zeta_6^{-8} \cdot \zeta_6^{-2} C_1 &= A_1 + &\zeta_3^{-2} \cdot \zeta_6^{-1} B_1 &+ &\zeta_3^{-4} \cdot \zeta_6^{-2} C_1 \\
\end{alignat}
は長さ  3 の数列  A_1, \zeta_6^{-1} B_1, \zeta_6^{-2} C_1 の離散フーリエ変換であるということに気付きます.つまり,長さ  6 の数列の離散フーリエ変換が,長さ  2 の数列の離散フーリエ変換  3 回と,長さ  3 の数列の離散フーリエ変換  2 回によって行えるわけです.
今度は,  n_1 = 3 n_2 = 2 としてみましょう.同様の変形により
 \begin{alignat}{7}
X_0 &= x_0 + &x_2 &+ &x_4 &+ &&&&(x_1 + &x_3 &+ &x_5) \\
X_1 &= x_0 + &\zeta_6^{-2} x_2 &+ &\zeta_6^{-4} x_4 &+ &&&\zeta_6^{-1} &(x_1 + &\zeta_6^{-2} x_3 &+ &\zeta_6^{-4} x_5) \\
X_2 &= x_0 + &\zeta_6^{-4} x_2 &+ &\zeta_6^{-8} x_4 &+ &&&\zeta_6^{-2} &(x_1 + &\zeta_6^{-4} x_3 &+ &\zeta_6^{-8} x_5) \\
X_3 &= x_0 + &x_2 &+ &x_4 &+ &\zeta_6^{-3} &&&(x_1 + &x_3 &+ &x_5) \\
X_4 &= x_0 + &\zeta_6^{-2} x_2 &+ &\zeta_6^{-4} x_4 &+ &\zeta_6^{-3} &\cdot &\zeta_6^{-1} &(x_1 + &\zeta_6^{-2} x_3 &+ &\zeta_6^{-4} x_5) \\
X_5 &= x_0 + &\zeta_6^{-4} x_2 &+ &\zeta_6^{-8} x_4 &+ &\zeta_6^{-3} &\cdot &\zeta_6^{-2} &(x_1 + &\zeta_6^{-4} x_3 &+ &\zeta_6^{-8} x_5) 
\end{alignat}
となるので, x_0, x_2, x_4 の離散フーリエ変換 D_0, D_1, D_2 とし,  x_1, x_3, x_5 の離散フーリエ変換 E_0, E_1, E_2 とすると,  X_0, X_3 D_0, E_0 の離散フーリエ変換であり,  X_1, X_4 D_1, \zeta_6^{-1} E_1 の離散フーリエ変換であり,  X_2, X_5 D_2, \zeta_6^{-2} E_2 の離散フーリエ変換であるわけです.

以上より,長さ  n の数列の離散フーリエ変換は,長さ  n_1 の数列の離散フーリエ変換 n_2 回行ったあとに,長さ  n_2 の数列の離散フーリエ変換 n_1 回行うことでできることが分かりました.これを繰り返していくことで,  n が小さな素数の積で構成されているときに  O(n \log n) で離散フーリエ変換を行うのが,Cooley-Tukey のアルゴリズムです.  n の最小の素因数を  n_1 としてこれを繰り返すやり方を DIF (周波数間引き), n の最小の素因数を  n_2 としてこれを繰り返すやり方を DIT (時間間引き)といいます.

特に  n 2 のべき乗のときの DIT が広く知られています.

フーリエ変換の性質

さて,次に  n素数のときを考えるのですが,その前に離散フーリエ変換の重要な性質について見てみます.それは「畳み込み定理」と呼ばれるものです.

長さが  n であるような 2 つの数列  x_0, x_1, \ldots, x_{n - 1} y_0, y_1, \ldots, y_{n - 1} について,その畳み込み  z_0, z_1, \ldots, z_{n - 1} を次のように定義します.

 \displaystyle z_k = \sum_{j = 0}^{n - 1} x_j y_{k - j}
ただし,  y_{-1}, y_{-2}, \ldots y_{n-1}, y_{n-2}, \ldots と等価とします.たとえば  n = 6 なら畳み込みは次のようになります.
 \begin{alignat}{5}
z_0 = x_0 y_0 + x_1 y_5 + x_2 y_4 + x_3 y_3 + x_4 y_2 + x_5 y_1 \\
z_1 = x_0 y_1 + x_1 y_0 + x_2 y_5 + x_3 y_4 + x_4 y_3 + x_5 y_2 \\
z_2 = x_0 y_2 + x_1 y_1 + x_2 y_0 + x_3 y_5 + x_4 y_4 + x_5 y_3 \\
z_3 = x_0 y_3 + x_1 y_2 + x_2 y_1 + x_3 y_0 + x_4 y_5 + x_5 y_4 \\
z_4 = x_0 y_4 + x_1 y_3 + x_2 y_2 + x_3 y_1 + x_4 y_0 + x_5 y_5 \\
z_5 = x_0 y_5 + x_1 y_4 + x_2 y_3 + x_3 y_2 + x_4 y_1 + x_5 y_0
\end{alignat}
このとき, \{x\}, \{y\}, \{z\} の離散フーリエ変換をそれぞれ  \{X\}, \{Y\}, \{Z\} とすると任意の  k (0 \leq k < n) について  Z_k = X_k Y_k が成り立つというのが畳み込み定理です.証明は次のようにできます.
 \displaystyle \begin{align}
Z_j &= \sum_{k = 0}^{n - 1} \zeta_n^{-jk} z_k \\
&= \sum_{k = 0}^{n - 1} \left( \zeta_n^{-jk} \sum_{l = 0}^{n - 1} x_l y_{k - l} \right) \\
&= \sum_{k = 0}^{n - 1} \sum_{l = 0}^{n - 1} \zeta_n^{-jk} x_l y_{k - l} \\
&= \sum_{l = 0}^{n - 1} \sum_{k = 0}^{n - 1} \zeta_n^{-jk} x_l y_{k - l} \\
&= \sum_{l = 0}^{n - 1} \left( x_l \sum_{k = 0}^{n - 1} \zeta_n^{-jk} y_{k - l} \right) \\
&= \sum_{l = 0}^{n - 1} \left( x_l \sum_{k = -l }^{n - l - 1} \zeta_n^{-j(k + l)} y_{k} \right) \\
&= \sum_{l = 0}^{n - 1} \left( \zeta_n^{-jl} x_l \sum_{k = -l }^{n - l - 1} \zeta_n^{-jk} y_{k} \right) \\
&= \sum_{l = 0}^{n - 1} \left( \zeta_n^{-jl} x_l \left( \sum_{k = -l}^{-1} \zeta_n^{-jk} y_{k} + \sum_{k = 0}^{n - l - 1} \zeta_n^{-jk} y_{k} \right) \right) \\
&= \sum_{l = 0}^{n - 1} \left( \zeta_n^{-jl} x_l \left( \sum_{k = n - l}^{n - 1} \zeta_n^{-jk} y_{k} + \sum_{k = 0}^{n - l - 1} \zeta_n^{-jk} y_{k} \right) \right) \\
&= \sum_{l = 0}^{n - 1} \left( \zeta_n^{-jl} x_l \sum_{k = 0}^{n - 1} \zeta_n^{-jk} y_{k} \right) \\
&= \left( \sum_{l = 0}^{n - 1} \zeta_n^{-jl} x_l \right)\left( \sum_{k = 0}^{n - 1} \zeta_n^{-jk} y_{k} \right) \\
&= X_j Y_j
\end{align}
(ただし途中でシグマの下の数が上の数より大きくなってしまうところはその総和の結果を  0 とします)

2020/10/25 追記:熨斗さんからより分かりやすい証明をいただきました.
多項式同士の mod を次のように定義します.

 f g h t多項式とする.ある多項式  r が存在して  f(t) = g(t) + h(t)r(t) t恒等式となるとき, f g h を法として合同であるといい, f \equiv g \mod h と書く.
このとき,次が成り立ちます.
 t多項式  f g h f \equiv g \mod h を満たすとき,  h(\zeta) = 0 であるような任意の  \zeta について  f(\zeta) = g(\zeta) が成り立つ.
さて, \{z\} \{x\} \{y\} の巡回畳み込みであるとき,
 \displaystyle x(t) = \sum_{k = 0}^{n - 1} x_k t^k = x_0 + x_1 t + x_2 t^2 + \cdots + x_{n - 1} t^{n - 1}
 \displaystyle y(t) = \sum_{k = 0}^{n - 1} y_k t^k = y_0 + y_1 t + y_2 t^2 + \cdots + y_{n - 1} t^{n - 1}
 \displaystyle z(t) = \sum_{k = 0}^{n - 1} z_k t^k = z_0 + z_1 t + z_2 t^2 + \cdots + z_{n - 1} t^{n - 1}
 w(t) = t^n - 1
とおくと  xy \equiv z \mod w が成り立ちます.  \zeta_n ^ k w(\zeta_n^k) = 0 を満たすので,  x(\zeta_n^k)y(\zeta_n^k) = z(\zeta_n^k) すなわち  X_k Y_k = Z_k となるわけです.

原始根

さて,突然ですが数論の話をします. p素数とし,  a 1 以上  p 未満の自然数とします.このとき,  a^e \equiv 1 \mod p を満たす最小の自然数  e を,  p を法とした  a の「位数」といい, \mathrm{ord}_p a と書きます. a の位数  e は常に  p - 1 の約数です.なぜなら,フェルマーの小定理より  a^{p - 1} \equiv 1 であり,もし  e \mid p - 1 でないと仮定すると  p - 1 e で割った余り  r (0 < r < e) a^r \equiv 1 を満たすので,  e ではなく  r a の位数となるはずだからです.

 g p の原始根である」とは,  \mathrm{ord}_p g = p - 1 であることをいいます.

 g p の原始根であるとき,  1, g, g^2, \ldots, g^{p - 2} p で割った余りは  1, 2, 3, \ldots, p - 1 を並べ替えたものになります.なぜなら任意の  i, j (0 \leq i < j < p - 1) について  g^{j - i} \not\equiv 1 より  g^i \not\equiv g^j だからです.

 g p の原始根かどうかは,O(\sqrt{p})で判定できます.もし  g が原始根でない,すなわち  e = \mathrm{ord}_p g < p - 1 ならば, g^e, g^{2e}, g^{3e}, \ldots, g^{p-1} は全て  1 と合同になるはずです.ということは,逆に  p - 1 の各素因数  q_1, q_2, \ldots について  g^\frac{p-1}{q_1}, g^\frac{p-1}{q_2}, \ldots を調べ上げれば,その中に必ず  1 と合同なものが含まれるはずです.もし含まれなければ,  g p の原始根です.

任意の奇素数  p に少なくとも 1 つ原始根が存在します.証明は難しいので省略しますが,整数  a (1 < a < p) p の原始根でなければ,  a, a^2, a^3, \ldots, a^{\mathrm{ord}_p a - 1} のいずれとも合同でない数  b (1 < b < p) をとってくることで,  ab の位数が  a の位数よりも大きくなります.これを繰り返すと,いつか位数が  p - 1 であるような数が見つかります(ただし,実際に原始根を求めるコードを書くときは,  2 以上  p 未満の自然数について順に原始根かどうか確かめていくだけで十分高速に動作します).

Rader のアルゴリズム

離散フーリエ変換の話に戻ります.Rader のアルゴリズムは, n 5 以上の素数のときに使えるアルゴリズムです.  n - 1合成数なので,長さ  n の数列の離散フーリエ変換を長さ  n - 1 の数列の離散フーリエ変換で表し, Cooley-Tukey のアルゴリズムを適用します.

例として,  n = 7 の場合を考えます.

 \begin{alignat}{7}
X_0 &= x_0 + &x_1 &+ &x_2 &+ &x_3 &+ &x_4 &+ &x_5 &+ &x_6 \\
X_1 &= x_0 + &\zeta_7^{-1} x_1 &+ &\zeta_7^{-2} x_2 &+ &\zeta_7^{-3} x_3 &+ &\zeta_7^{-4} x_4 &+ &\zeta_7^{-5} x_5 &+ &\zeta_7^{-6} x_6 \\
X_2 &= x_0 + &\zeta_7^{-2} x_1 &+ &\zeta_7^{-4} x_2 &+ &\zeta_7^{-6} x_3 &+ &\zeta_7^{-8} x_4 &+ &\zeta_7^{-10} x_5 &+ &\zeta_7^{-12} x_6\\
X_3 &= x_0 + &\zeta_7^{-3} x_1 &+ &\zeta_7^{-6} x_2 &+ &\zeta_7^{-9} x_3 &+ &\zeta_7^{-12} x_4 &+ &\zeta_7^{-15} x_5 &+ &\zeta_7^{-18} x_6\\
X_4 &= x_0 + &\zeta_7^{-4} x_1 &+ &\zeta_7^{-8} x_2 &+ &\zeta_7^{-12} x_3 &+ &\zeta_7^{-16} x_4 &+ &\zeta_7^{-20} x_5 &+ &\zeta_7^{-24} x_6\\
X_5 &= x_0 + &\zeta_7^{-5} x_1 &+ &\zeta_7^{-10} x_2 &+ &\zeta_7^{-15} x_3 &+ &\zeta_7^{-20} x_4 &+ &\zeta_7^{-25} x_5 &+ &\zeta_7^{-30} x_6 \\
X_6 &= x_0 + &\zeta_7^{-6} x_1 &+ &\zeta_7^{-12} x_2 &+ &\zeta_7^{-18} x_3 &+ &\zeta_7^{-24} x_4 &+ &\zeta_7^{-30} x_5 &+ &\zeta_7^{-36} x_6
\end{alignat}
まず  n の原始根  g を発見します.今回は  3 が原始根なので  g = 3 とします.このとき,  1, 3, 3^2, 3^3, 3^4, 3^5 7 で割った余りはそれぞれ  1, 3, 2, 6, 4, 5 なので, X_1 X_6 について次のような書き換えが可能です.
 \begin{alignat}{7}
X_1 &= x_0 + &\zeta_7^{-3^0} x_1 &+ &\zeta_7^{-3^1} x_3 &+ &\zeta_7^{-3^2} x_2 &+ &\zeta_7^{-3^3} x_6 &+ &\zeta_7^{-3^4} x_4 &+ &\zeta_7^{-3^5} x_5 \\
X_3 &= x_0 + &\zeta_7^{-3^1} x_1 &+ &\zeta_7^{-3^2} x_3 &+ &\zeta_7^{-3^3} x_2 &+ &\zeta_7^{-3^4} x_6 &+ &\zeta_7^{-3^5} x_4 &+ &\zeta_7^{-3^6} x_5 \\
X_2 &= x_0 + &\zeta_7^{-3^2} x_1 &+ &\zeta_7^{-3^3} x_3 &+ &\zeta_7^{-3^4} x_2 &+ &\zeta_7^{-3^5} x_6 &+ &\zeta_7^{-3^6} x_4 &+ &\zeta_7^{-3^7} x_5 \\
X_6 &= x_0 + &\zeta_7^{-3^3} x_1 &+ &\zeta_7^{-3^4} x_3 &+ &\zeta_7^{-3^5} x_2 &+ &\zeta_7^{-3^6} x_6 &+ &\zeta_7^{-3^7} x_4 &+ &\zeta_7^{-3^8} x_5 \\
X_4 &= x_0 + &\zeta_7^{-3^4} x_1 &+ &\zeta_7^{-3^5} x_3 &+ &\zeta_7^{-3^6} x_2 &+ &\zeta_7^{-3^7} x_6 &+ &\zeta_7^{-3^8} x_4 &+ &\zeta_7^{-3^9} x_5 \\
X_5 &= x_0 + &\zeta_7^{-3^5} x_1 &+ &\zeta_7^{-3^6} x_3 &+ &\zeta_7^{-3^7} x_2 &+ &\zeta_7^{-3^8} x_6 &+ &\zeta_7^{-3^9} x_4 &+ &\zeta_7^{-3^{10}} x_5 \\
\end{alignat}
少し混乱しますが落ち着いて確認しましょう.たとえば  X_5 における  x_6 の係数というのはもともと  \zeta_7^{-30} で,この右肩の  -30 という値は  -5 \times 6 という計算によって得られたものでした.今度はこれが  5 \equiv 3^5 6 \equiv 3^3 という式で書き換えられて,  -3^5 \times 3^3 = -3^{5+3} = -3^8 になっています.こうして掛け算が指数の足し算になったところで,さらに  3^6 \equiv 3^0 を使うことで,最終的には
 \begin{alignat}{7}
X_1 &= x_0 + &\zeta_7^{-3^0} x_1 &+ &\zeta_7^{-3^1} x_3 &+ &\zeta_7^{-3^2} x_2 &+ &\zeta_7^{-3^3} x_6 &+ &\zeta_7^{-3^4} x_4 &+ &\zeta_7^{-3^5} x_5 \\
X_3 &= x_0 + &\zeta_7^{-3^1} x_1 &+ &\zeta_7^{-3^2} x_3 &+ &\zeta_7^{-3^3} x_2 &+ &\zeta_7^{-3^4} x_6 &+ &\zeta_7^{-3^5} x_4 &+ &\zeta_7^{-3^0} x_5 \\
X_2 &= x_0 + &\zeta_7^{-3^2} x_1 &+ &\zeta_7^{-3^3} x_3 &+ &\zeta_7^{-3^4} x_2 &+ &\zeta_7^{-3^5} x_6 &+ &\zeta_7^{-3^0} x_4 &+ &\zeta_7^{-3^1} x_5 \\
X_6 &= x_0 + &\zeta_7^{-3^3} x_1 &+ &\zeta_7^{-3^4} x_3 &+ &\zeta_7^{-3^5} x_2 &+ &\zeta_7^{-3^0} x_6 &+ &\zeta_7^{-3^1} x_4 &+ &\zeta_7^{-3^2} x_5 \\
X_4 &= x_0 + &\zeta_7^{-3^4} x_1 &+ &\zeta_7^{-3^5} x_3 &+ &\zeta_7^{-3^0} x_2 &+ &\zeta_7^{-3^1} x_6 &+ &\zeta_7^{-3^2} x_4 &+ &\zeta_7^{-3^3} x_5 \\
X_5 &= x_0 + &\zeta_7^{-3^5} x_1 &+ &\zeta_7^{-3^0} x_3 &+ &\zeta_7^{-3^1} x_2 &+ &\zeta_7^{-3^2} x_6 &+ &\zeta_7^{-3^3} x_4 &+ &\zeta_7^{-3^4} x_5 \\
\end{alignat}
となります.これはまさしく,数列  \{x_1, x_3, x_2, x_6, x_4, x_5\} と数列  \{\zeta_7^{-3^0}, \zeta_7^{-3^1}, \zeta_7^{-3^2}, \zeta_7^{-3^3}, \zeta_7^{-3^4}, \zeta_7^{-3^5}\} の畳み込みです.よって,これらを離散フーリエ変換して積を計算し,逆離散フーリエ変換でもとにもどしてやれば計算できます.

よって,Cooley-Turkey のアルゴリズムと Rader のアルゴリズムを組み合わせて使うことで,任意の自然数  n に対して  O(n \log n) で離散フーリエ変換を計算することができます.

最後まで読んでくださってありがとうございましたm(_ _)m