離散フーリエ変換 (一般)

数学において、環上の**離散フーリエ変換**は、複素数上の離散フーリエ変換を一般化したものである。

## 定義
R を任意の環、n\geq 1 を自然数とする。\alpha \in R を、R の単位元の主 n 乗根(principal root)であり次式を満たす要素とする

: 
\begin{align}
& \alpha^n = 1 \\
& \sum_{j=0}^{n-1} \alpha^{jk} = 0 \text{ for } 1 \leq k 

離散フーリエ変換は、R の要素の*n*個組 (v_0,\ldots,v_{n-1}) を、次の計算式により R の要素の*n*個組 (f_0,\ldots,f_{n-1}) へ写像する。

: f_k = \sum_{j=0}^{n-1} v_j\alpha^{jk}.\qquad (2)

慣例により、(v_0,\ldots,v_{n-1}) は*時間領域*にあると言い、添え字 j を*時刻*と呼ぶ。また、(f_0,\ldots,f_{n-1}) は*周波数領域*にあると言い、k を*周波数*と呼ぶ。また、(f_0,\ldots,f_{n-1}) は(v_0,\ldots,v_{n-1})の*[[周波数スペクトル]]*とも呼ばれる。この用語は、フーリエ変換の信号処理への応用からきている。

もし環 R が整域（体の場合を含む)であるとき、\alphaは単位元の原始''n''乗根であれば十分であり、条件式(1)は、以下で置き換えることができる。

: \alpha^{k} \ne 1 for 1 \leq k 

証明：1 \leq k に対して、\beta = \alpha^k と置く。\alpha^n=1 であるから、\beta^n=(\alpha^n)^k=1 であり、

: \beta^n-1 = (\beta-1)\left(\sum_{j=0}^{n-1} \beta^j\right) = 0

が成り立つ。\alpha は原始*n*乗根であるから、\beta - 1 \ne 0 が成り立つ。 R が整域であれば、零因子を持たないため、和 \sum_{j=0}^{n-1} \beta^j は零である。∎

もう一つのシンプルな条件は、*n*が２のべき乗のときである。この場合、条件式(1)は \alpha^{n/2} = -1 でおきかえることができる。

## 逆変換
逆離散フーリエ変換は、以下の式で与えられる：

: v_j = \frac{1}{n}\sum_{k=0}^{n-1} f_k\alpha^{-jk}.\qquad (3)

ここで、1/n は R における n の乗法逆元である。（もしこれが存在しないならば、DFTは逆変換できない。）

証明：式(2)を式(3)の右辺に代入すると

: 
\begin{align}
& \frac{1}{n}\sum_{k=0}^{n-1} f_k\alpha^{-jk} \\
= {} & \frac{1}{n}\sum_{k=0}^{n-1}\sum_{j'=0}^{n-1} v_{j'}\alpha^{j'k}\alpha^{-jk} \\
= {} & \frac{1}{n}\sum_{j'=0}^{n-1} v_{j'} \sum_{k=0}^{n-1}\alpha^{(j'-j)k}.
\end{align}


が得られる。j'\neq j ならば \sum_{k=0}^{n-1}\alpha^{(j'-j)k}=0 であり（式(1)で k=j'-j と置けばよい）、 j'=j ならば \sum_{k=0}^{n-1}\alpha^{(j'-j)k}=n が成り立つので、上の式は v_j とちょうど一致する。∎

## 行列表現
離散フーリエ変換は線形写像であるから、行列積で表現できる。行列表現では、離散フーリエ変換は以下のように書ける。

: 
\begin{bmatrix}f_0\\f_1\\\vdots\\f_{n-1}\end{bmatrix}
= \begin{bmatrix}
1&1&1&\cdots &1 \\
1&\alpha&\alpha^2&\cdots&\alpha^{n-1} \\
1&\alpha^2&\alpha^4&\cdots&\alpha^{2(n-1)}\\
\vdots&\vdots&\vdots&&\vdots\\
1&\alpha^{n-1}&\alpha^{2(n-1)}&\cdots&\alpha^{(n-1)(n-1)}\\
\end{bmatrix}
\begin{bmatrix}v_0\\v_1\\\vdots\\v_{n-1}\end{bmatrix}


この行列は、DFT行列と呼ばれる。

同様に、逆離散フーリエ変換は

: 
\begin{bmatrix}v_0\\v_1\\\vdots\\v_{n-1}\end{bmatrix}
= \frac{1}{n}\begin{bmatrix}
1&1&1&\cdots &1 \\
1&\alpha^{-1}&\alpha^{-2}&\cdots&\alpha^{-(n-1)} \\
1&\alpha^{-2}&\alpha^{-4}&\cdots&\alpha^{-2(n-1)}\\
\vdots&\vdots&\vdots&&\vdots\\
1&\alpha^{-(n-1)}&\alpha^{-2(n-1)}&\cdots&\alpha^{-(n-1)(n-1)}
\end{bmatrix}
\begin{bmatrix}f_0\\f_1\\\vdots\\f_{n-1}\end{bmatrix}


と表せる。

## 多項式表現
*n*個組 (v_0,\ldots,v_{n-1}) を n-1 次の多項式

: p_v(x) = v_0 + v_1x + v_2x^2 + \cdots + v_{n-1}x^{n-1} 

と見做すと便利なことがある。離散フーリエ変換の定義式(2)の和を書き下すと、

: f_k = v_0 + v_1\alpha^{k} + v_2\alpha^{2k}  + \cdots + v_{n-1}\alpha^{(n-1)k} 

となる。つまり、f_k は多項式 p_v(x) の x=\alpha^k における値であり、

: f_k = p_v(\alpha^k) 

と書ける。したがって、離散フーリエ変換は、多項式の*係数*を*値*に変換するもの考えることができる。係数は時間領域で、値は周波数領域にある。もちろん、多項式の値は、単位元のn 乗根（\alpha とその2乗、3乗、4乗、...）において評価することが重要である。

同様に、逆離散フーリエ変換の式(3)を書き下すと

: v_j = \frac{1}{n}(f_0 + f_1\alpha^{-j} + f_2\alpha^{-2j}  + \cdots + f_{n-1}\alpha^{-(n-1)j}) \qquad (5)

である。多項式を

: p_f(x) = f_0 + f_1x + f_2x^2 + \cdots + f_{n-1}x^{n-1}

とすれば、

: v_j = \frac{1}{n}p_f(\alpha^{-j})

が成り立つ。

以上をまとめると、以下のようになる。 もし、多項式 p(x) の値が多項式 q(x) の係数であるならば、（定数倍と順番の入れ替えを除けば）q(x) の値は p(x) の係数と等しい。

## 特殊な場合

### 複素数
環として複素数体 F={\mathbb C} を考えると、1のn乗根は複素平面上の単位円上にある。

: \alpha=e^{\frac{-2\pi i}{n}}

と定義すれば、通常の離散フーリエ変換の式

: f_k = \sum_{j=0}^{n-1} v_j e^{\frac{-2\pi i}{n}jk}

が得られる。

正規化のため、逆方向の変換IDFT（式(3)）では係数 \frac{1}{n} がかかるが、複素数の離散フーリエ変換においては、係数 \frac{1}{\sqrt{n}} を順方向の変換DFTと逆方向の変換IDFTの両方にかけることもある。この正規化方法だと、DFT行列はユニタリ行列となる。 （\sqrt{n} は、任意の体においては意味を持たないことに注意。）

### 有限体
環として有限体 F=GF(q) （q は素数のべき乗）を考えた場合には、 単位元の原始*n*乗根の存在は自動的に n が q-1 を割り切ることを意味する。 これは、各元の位数は体 F の乗法群のサイズを必ず割り切り、乗法群のサイズは q-1 であることから言える。 これは、特に n=\underbrace{1+1+\cdots+1}_{n\ \rm times} が乗法逆元を持つことを保証し、式(3)における \frac{1}{n} はその逆元である。GF(q) 上での離散フーリエ変換の応用として、符号理論におけるリード・ソロモン符号やBCH符号の復号がある。これは、円分高速フーリエ変換といった効率の良いアルゴリズムによって実行可能である。

### 数論変換
**数論変換**（number-theoretic transform, NTT、あるいは数論的変換）は、環を F={\mathbb Z}/p{\mathbb Z} に限定した場合の離散フーリエ変換である。が素数ならば F は有限体であり、単位元の原始乗根は  が p-1 を割り切るとき、つまり、ある正の整数  を用いて p=\xi n+1 と書けるときには、必ず存在する。特に、単位元の原始乗根が \omega であれば、原始乗根は \alpha=\omega^{\xi} で得られる.

具体例）p=5、n=4、\alpha = 2 の場合、

: \begin{align}2^{1}&=2 \pmod 5\\2^{2}&=4 \pmod 5\\2^{3}&=3 \pmod 5\\2^{4}&=1 \pmod 5\end{align}

: 
\begin{bmatrix}
F(0) \\
F(1) \\
F(2) \\
F(3) \end{bmatrix}
=
 \begin{bmatrix}
1 & 1 & 1 & 1 \\
1 & 2 & 4 & 3 \\
1 & 4 & 1 & 4 \\
1 & 3 & 4 & 2 \end{bmatrix}
\begin{bmatrix}
f(0) \\
f(1) \\
f(2) \\
f(3) \end{bmatrix}


数論変換は、法が素数でない場合の環 \mathbb{Z}/m\mathbb{Z} においても、位数がである主要根が存在するならば、意味がある。ショーンハーゲ・ストラッセン法で用いられるフェルマー数変換（）や、メルセンヌ数変換（）のような特殊な数論変換は、法として合成数を用いている。 

## 性質
複素数上のDFTが持つ重要な特徴、例えば逆変換、畳み込み定理、多くの高速フーリエ変換(FFT) アルゴリズムなどは、変換の核が単位元の主要根であるという性質のみに依存している。したがって、一般化した離散フーリエ変換も同じ特徴を持つ（任意の環において、同様に証明できる）。特に、計算量が O(n \log n) の高速フーリエ変換アルゴリズムをNTTに適用できることと、畳み込み定理が成り立つことから、数論変換を利用することで、整数列の畳み込みを効率よく正確に計算できる。複素数上のDFTでも畳み込みを効率よく計算できるが、有限精度の浮動小数演算において丸め誤差が生じる恐れがある。一方NTTでは、固定サイズの整数しか扱わず、厳密に値を表現できるため、丸めの誤差は生じない。

## 高速なアルゴリズム
高速なアルゴリズム実装のためには、（複素数上の離散フーリエ変換を計算する高速フーリエ変換アルゴリズムの場合と同様に）変換したい入力の長さ*n*は小さな素数から成る合成数（典型的なのは2の冪）が望ましいことが良くある。しかし、WangとZhuのアルゴリズムのように、有限体の場合に特化したフーリエ変換アルゴリズムも存在しており、それらは*n*の因数分解に寄らず効率が良い。

## 関連項目

* （複素関数における）離散フーリエ変換
* ガウス和
* 畳み込み
* Multiplication algorithm
* 高速フーリエ変換(FFT)
* フーリエ級数
* フーリエ変換
* Z変換
* 直交関数系
* 離散時間フーリエ変換

## 参考文献

## 外部リンク

* http://www.apfloat.org/ntt.html