N = p (素数)の場合の FFT
自分で使うため,そして勉強のため,FFT を計算するコードを書いていたが,長さ (素数)の場合に高速化する手法(Rader の FFT)を知らなかった.いろいろと調べた結果,何とか理解することができたのでまとめておこうと思う.
準備
のスペクトルをとする.つまり
行列表現では
変換行列
簡単のため,変換行列のの0以外の指数のみを取りだした行列を考えてみる.
この行列の行列の要素は
となる.modulo-N であるのは,回転子の性質による.
ガロア体
ガロア体についての詳しい説明は避けるが,ガロア体は個(=p (素数))の要素を持ち,四則演算について閉じているものであると考えてよい.今,をの原始根の1つであるとする.つまり,上でを計算すると,のみが1となるような要素である.
例えば,の場合,の原始根は2と3の2つが考えられる.
の逆元
が原始根ならば,が成り立っているから,の逆元は
より
行列の変形
行列を行については原始根の数列,列についてはそれらの逆元の数列の順番に入れ替え,その行列をとする.
行列の要素は対角方向に同じものが並んでいる.
FFTの計算式の変形
以上のような変形を最初のFFTの計算式(行列表現)に持ち込むと,
のようになる.は単純に和を取ればよいだけなので,それ以外について考える.以下のような置き換えを考え,
これ用いてを行列を数式に分解すれば,
となる.これはがとの巡回畳み込みで計算出来ることを意味している.この巡回畳み込みの計算には長さの FFT および IFFT が使用できる.ここがこの手法のミソである.
まとめ
この手法はの場合にも適用できる.ただし,が小さい場合には巡回畳み込み演算をさらに変形した手法が良いらしい.