1 一の冪根と離散 Fourier 変換
補題 1.1.N∈N≥1とし、ωN:=e−2πi/Nと置く。任意のk∈Zに対して
j=0∑N−1ωNjk={N0(N∣k),(N∤k)が成り立つ。
証明.k∈Zをとり、q:=ωNk=e−2πik/Nと置く。N∣kならばq=1であり、和の各項は1であるから和はNである。N∤kならばk/N∈/Zであり、eiθ=1となる実数θは2πZの元に限るからq=1である。qN=e−2πik=1であるから
j=0∑N−1qj=q−1qN−1=0が成り立つ。▨
定義 1.2.N∈N≥1とし、ωN:=e−2πi/Nと置く。CNの元の成分を0,…,N−1で番号付ける。x=(x0,…,xN−1)∈CNとk∈Zに対して
x^k:=j=0∑N−1xjωNjkと置く。ωNN=1であるから、任意のk∈Zに対してx^k+N=x^kである。x^:=(x^0,…,x^N−1)∈CNをxの 離散 Fourier 変換 (discrete Fourier transform) といい、写像FN:CN→CN、x↦x^を長さNの離散 Fourier 変換という。
定理 1.3.N∈N≥1とし、CNに標準内積⟨x,y⟩:=∑j=0N−1xjyjとノルム∥x∥2:=⟨x,x⟩1/2を入れる。0≤k<Nに対してek∈CNを(ek)j:=N−1/2ωN−jk(0≤j<N)で定める。
- (e0,…,eN−1)はCNの正規直交基底であり、任意のx∈CNと0≤k<Nに対して⟨x,ek⟩=N−1/2x^kが成り立つ。
- 任意のx∈CNと0≤j<Nに対して
xj=N1k=0∑N−1x^kωN−jk
が成り立つ。FNはC上の線形同型である。
- 任意のx,y∈CNに対して⟨x^,y^⟩=N⟨x,y⟩と∥x^∥22=N∥x∥22が成り立つ。
証明.0≤k,l<Nをとる。∣ωN∣=1であるからωN−jl=ωNjlであり、
⟨ek,el⟩=N1j=0∑N−1ωN−jkωNjl=N1j=0∑N−1ωNj(l−k)である。∣l−k∣<NであるからN∣l−kとk=lは同値であり、補題 1.1により⟨ek,el⟩はk=lのとき1、k=lのとき0である。c0,…,cN−1∈Cが∑kckek=0を満たすならば、両辺とelの内積をとってcl=0を得るので、e0,…,eN−1は一次独立であり、dimCCN=NであるからCNの基底である。x∈CNに対して
⟨x,ek⟩=j=0∑N−1xjN−1/2ωN−jk=N−1/2j=0∑N−1xjωNjk=N−1/2x^kである。これで(1)は示された。
(1)と§E3.32 命題 2.3によりx=∑k=0N−1⟨x,ek⟩ek=∑k=0N−1N−1/2x^kekであり、第j成分をとって逆変換の式を得る。定義からFNはC-線形である。逆変換の式によりx^=0ならばx=0であるからFNは単射であり、有限次元線形空間CNからそれ自身への単射線形写像であるから全単射である。
x=∑k⟨x,ek⟩ekとy=∑l⟨y,el⟩elを内積へ代入し、内積の第一変数についての線形性、第二変数についての共役線形性、(ek)の正規直交性を用いると
⟨x,y⟩=k,l=0∑N−1⟨x,ek⟩⟨y,el⟩⟨ek,el⟩=k=0∑N−1⟨x,ek⟩⟨y,ek⟩=N1k=0∑N−1x^ky^k=N1⟨x^,y^⟩である。y=xとしてノルムの等式を得る。▨
2 循環畳み込み
定義 2.1.N∈N≥1とし、整数jをNで割った余りをjmodN∈{0,…,N−1}と書く。x,y∈CNに対して、x⊛y∈CNを
(x⊛y)j:=l=0∑N−1xly(j−l)modN(0≤j<N)で定め、xとyの 循環畳み込み (circular convolution) という。
補題 2.2.N∈N≥1、x,y∈CNとし、0≤j<Nに対してSj:={(l,i)∈{0,…,N−1}2∣l+i≡j(modN)}と置く。このとき
(x⊛y)j=(l,i)∈Sj∑xlyi(0≤j<N)が成り立つ。
定理 2.3.N∈N≥1、x,y∈CNとし、x⊙y:=(x0y0,…,xN−1yN−1)と置く。このときx⊛y=x^⊙y^であり、x⊛y=FN−1(x^⊙y^)が成り立つ。
証明.0≤k<Nをとり、Sjを補題 2.2の集合とする。補題 2.2により
x⊛yk=j=0∑N−1(l,i)∈Sj∑xlyiωNjkである。(l,i)∈Sjならばある整数rについてl+i=j+rNであり、ωNN=1であるからωNjk=ωN(l+i)kである。各(l,i)∈{0,…,N−1}2はj=(l+i)modNに対するSjだけに属するので、S0,…,SN−1は{0,…,N−1}2の分割である。したがって
x⊛yk=l=0∑N−1i=0∑N−1xlyiωNlkωNik=x^ky^kである。定理 1.3 (2)によりFNは全単射であるから、x⊛y=FN−1(x^⊙y^)である。▨
3 高速 Fourier 変換
補題 3.1.M∈N≥1、N:=2M、x∈CNとし、a,b∈CMをam:=x2m、bm:=x2m+1(0≤m<M)で定める。a^,b^を長さMの離散 Fourier 変換とする。このとき0≤k<Mに対して
x^k=a^k+ωNkb^k,x^k+M=a^k−ωNkb^kが成り立つ。
証明.κ∈Zをとる。和をj=2mとj=2m+1(0≤m<M)に分けると
x^κ=m=0∑M−1x2mωN2mκ+ωNκm=0∑M−1x2m+1ωN2mκである。ωN2=e−2πi/M=ωMであるから、右辺はa^κ+ωNκb^κに等しい。κ=kとして第一式を得る。κ=k+Mとすると、定義 1.2によりa^k+M=a^k、b^k+M=b^kであり、ωNM=e−πi=−1であるからωNk+M=−ωNkであり、第二式を得る。▨
定義 3.2.s∈N≥0とし、N:=2sと置く。複素数ωLk(L=2r、1≤r≤s、0≤k<L/2)の値は計算済みの定数として与えられるものとする。写像ΦN:CN→CNと、ΦN(x)の計算で実行する複素数の演算を、sに関して帰納的に次のように定める。
- s=0のとき、Φ1(x):=xとし、演算を実行しない。
- s≥1のとき、M:=N/2と置き、a,b∈CMをam:=x2m、bm:=x2m+1で定め、α:=ΦM(a)、β:=ΦM(b)を計算する。0≤k<Mの各kについて、乗算tk:=ωNkβkを一回、加算αk+tkと減算αk−tkを一回ずつ実行し、ΦN(x)k:=αk+tk、ΦN(x)k+M:=αk−tkと置く。ΦN(x)の計算の演算は、αとβの計算の演算と、これらの3M回の演算である。
ΦNを長さNの radix-2 高速 Fourier 変換 (radix-2 fast Fourier transform)(radix-2 FFT)という。
定理 3.3.s∈N≥0とし、N:=2sと置く。
- 任意のx∈CNに対してΦN(x)=x^である。
- ΦN(x)の計算は、複素数の乗算をちょうど(N/2)log2N回、複素数の加算・減算をちょうどNlog2N回実行する。複素数の乗算を実数の乗算4回と加減算2回で、複素数の加減算を実数の加減算2回で実行するとき、実数の演算の総数は5Nlog2Nである。
- 定数ωNr(0≤r<N)を与え、0≤k<Nの各kについてx^kをN個の積xjωN(jk)modNのN−1回の加算による和として計算すると、複素数の乗算はN2回、加算はN(N−1)回であり、前項と同じ換算で実数の演算の総数は8N2−2Nである。
証明.(1)を示す。s=0ならば、任意のx∈C1に対してx^0=x0ω10=x0=Φ1(x)0である。s≥1とし、M:=N/2についてΦM=FMが成り立つとする。x∈CNをとり、a,bを定義 3.2のとおりにとるとα=a^、β=b^であり、0≤k<Mに対してΦN(x)k=a^k+ωNkb^k、ΦN(x)k+M=a^k−ωNkb^kである。補題 3.1により右辺はそれぞれx^k、x^k+Mに等しい。{k,k+M∣0≤k<M}={0,…,N−1}であるからΦN(x)=x^であり、sに関する帰納法により任意のs∈N≥0についてΦ2s=F2sである。
(2)を示す。Φ2sの乗算の回数をμs、加減算の回数をσsと書く。定義 3.2によりμ0=σ0=0であり、s≥1に対して
μs=2μs−1+2s−1,σs=2σs−1+2sである。μs−1=(s−1)2s−2、σs−1=(s−1)2s−1ならばμs=(s−1)2s−1+2s−1=s2s−1、σs=(s−1)2s+2s=s2sであり、sに関する帰納法によりμs=(N/2)s、σs=Nsである。実数の演算の総数は6μs+2σs=3Ns+2Ns=5Nsである。
(3)を示す。各kについて乗算はN回、加算はN−1回であり、kはN通りである。実数の演算の総数は6N2+2N(N−1)=8N2−2Nである。▨
例 3.5.N=4、x=(1,2,3,0)とする。ω4=e−πi/2=−i、ω2=−1である。a=(x0,x2)=(1,3)、b=(x1,x3)=(2,0)であり、長さ2の段でα=Φ2(a)=(1+3,1−3)=(4,−2)、β=Φ2(b)=(2,2)である。長さ4の段ではt0=ω40β0=2、t1=ω4β1=−2iであり、
Φ4(x)=(α0+t0, α1+t1, α0−t0, α1−t1)=(6, −2−2i, 2, −2+2i)である。定義による計算x^1=1+2(−i)+3(−i)2=−2−2i、x^2=1−2+3=2、x^3=1+2i−3=−2+2i、x^0=6と一致する。乗算は長さ2の段で2回、長さ4の段で2回の計4=(4/2)log24回であり、加減算は4+4=8=4log24回である。∥x∥22=1+4+9=14、∥x^∥22=36+8+4+8=56=4⋅14であり、定理 1.3 (3)の等式が成り立っている。
例 3.7. CPython の float(基数2、仮数53桁、最近接偶数丸め、u=2−53≈1.11×10−16)で計算する。s∈{6,8,10,12}、N=2sとし、整数の入力xj:=((37j2+11j)mod101)−50(0≤j<N)をとる。
定数ωNr(0≤r<N)は、実部を math.cos(2*math.pi*r/N)、虚部を -math.sin(2*math.pi*r/N) で計算した値ω~Nrに置き換え、複素数の積(p+qi)(p′+q′i)は(pp′−qq′)+(pq′+qp′)iの各演算を丸めて計算する。直接計算は、各kについて積xjω~N(jk)modNをj=0,1,…,N−1の順に逐次和で加え、FFT はΦNのωLkを注意 3.4のω~NkN/Lに置き換えて計算する。
計算値y~と、50桁の十進演算で計算したx^から相対誤差∥y~−x^∥2/∥x^∥2を求めると次のとおりである。
| N |
直接計算 |
FFT |
| 26 |
3.1×10−16 |
2.8×10−16 |
| 28 |
6.1×10−16 |
3.2×10−16 |
| 210 |
1.0×10−15 |
3.9×10−16 |
| 212 |
2.1×10−15 |
4.7×10−16 |
表の値は一つの入力に対する観察であり、誤差の上界ではない。
4 零詰めと線形畳み込み
定義 4.1.m,n∈N≥1、x∈Cm、y∈Cnとする。0≤p≤m+n−2に対してTp:={(l,i)∣0≤l<m, 0≤i<n, l+i=p}と置き、x∗y∈Cm+n−1を(x∗y)p:=∑(l,i)∈Tpxlyiで定めて、xとyの 線形畳み込み (linear convolution) という。整数N≥mに対して、x[N]:=(x0,…,xm−1,0,…,0)∈CNをxの長さNへの 零詰め (zero padding) という。
命題 4.2.m,n,N∈N≥1とし、N≥max(m,n)、x∈Cm、y∈Cn、z:=x∗yとする。
- 0≤j<Nに対して
(x[N]⊛y[N])j=0≤p≤m+n−2p≡j (mod N)∑zp
が成り立つ。
- N≥m+n−1ならば、0≤j≤m+n−2に対して(x[N]⊛y[N])j=zjであり、m+n−1≤j<Nに対して(x[N]⊛y[N])j=0である。
証明.0≤j<Nをとり、x′:=x[N]、y′:=y[N]とする。補題 2.2により(x′⊛y′)j=∑(l,i)∈Sjxl′yi′である。l≥mまたはi≥nである項は0であるから、和は0≤l<m、0≤i<n、l+i≡j(modN)を満たす(l,i)の上の和∑xlyiに等しい。この集合は、0≤p≤m+n−2かつp≡j(modN)を満たすpに対するTpの交わらない和集合であり、(1)を得る。N≥m+n−1ならば、(1)の和に現れるpは0≤p<Nを満たし、0≤j<Nとp≡j(modN)からp=jである。j≤m+n−2ならば和はzjであり、j≥m+n−1ならば和は空であるから0である。▨
系 4.3.m,n∈N≥1、s∈N≥0、N:=2s≥m+n−1、x∈Cm、y∈Cnとする。w:=ΦN(x[N])⊙ΦN(y[N])と置き、wを成分ごとの複素共役とする。このとき0≤p≤m+n−2に対して
(x∗y)p=N1ΦN(w)pが成り立つ。ΦNの三回の計算、⊙のN回の乗算、2N回の複素共役、実数1/NによるN回の乗算によって右辺を0≤p<Nについて計算すると、複素数の乗算は(3/2)Nlog2N+N回、加減算は3Nlog2N回である。sを2s≥m+n−1を満たす最小の整数にとるとN<2(m+n−1)である。定義によるx∗yの計算は、乗算をmn回、加算をmn−(m+n−1)回実行する。
証明.x′:=x[N]、y′:=y[N]、v:=x′⊛y′と置く。定理 3.3 (1)と定理 2.3によりw=x′^⊙y′^=v^である。定理 1.3 (2)により、0≤p<Nに対して
vp=N1k=0∑N−1wkωN−pk=N1k=0∑N−1wkωNpk=N1wpであり、定理 3.3 (1)によりw=ΦN(w)である。N≥m+n−1であるから、命題 4.2 (2)により0≤p≤m+n−2に対してvp=(x∗y)pである。演算の回数は定理 3.3 (2)を三回分加え、⊙のN回を加えたものである。最小のsについて、s=0ならばN=1<2≤2(m+n−1)であり、s≥1ならば2s−1<m+n−1であるからN<2(m+n−1)である。定義による計算では、各pについて∣Tp∣回の乗算と∣Tp∣−1回の加算を実行する。0≤p≤m+n−2に対して(max(0,p−n+1),p−max(0,p−n+1))∈TpであるからTp=∅であり、T0,…,Tm+n−2は{0,…,m−1}×{0,…,n−1}の分割であるから∑p∣Tp∣=mnである。加算の回数はmn−(m+n−1)である。▨
例 4.4.m=3、n=2、x=(1,2,3)、y=(1,1)とする。z=x∗y=(1,3,5,3)であり、これは多項式の積(1+2t+3t2)(1+t)=1+3t+5t2+3t3の係数である。N=4=m+n−1とする。例 3.5によりx[4]=(6,−2−2i,2,−2+2i)であり、y[4]=(1+1, 1−i, 1−1, 1+i)=(2,1−i,0,1+i)である。成分ごとの積はw=(12,−4,0,−4)であり、ω4−1=iであるから定理 2.3と定理 1.3 (2)により
(x[4]⊛y[4])j=41(12−4ij−4i3j)=3−ij−i3j(0≤j<4)である。j=0,1,2,3で値は1,3,5,3であり、zに一致する。N=3とするとN≥max(3,2)であるがN<m+n−1であり、定義からx[3]⊛y[3]=(1⋅1+3⋅1, 1⋅1+2⋅1, 2⋅1+3⋅1)=(4,3,5)である。これは命題 4.2 (1)の(z0+z3,z1,z2)であり、t3の係数z3が添字0へ折り返されている。
5 区別することができない周波数
命題 5.1.N∈N≥1、ν,ν′∈Rとする。条件Pに対して、[P]をPが成り立つとき1、成り立たないとき0と置く。
- 任意のj∈Zに対してe2πiνj/N=e2πiν′j/Nが成り立つことと、ν′−ν∈NZであることは同値である。
- 任意のj∈Zに対してcos(2πνj/N)=cos(2πν′j/N)が成り立つことと、ν′−ν∈NZまたはν′+ν∈NZであることは同値である。
- ν∈Zとし、x,c∈CNをxj:=e2πiνj/N、cj:=cos(2πνj/N)(0≤j<N)で定める。このとき0≤k<Nに対して
x^k=N[k≡ν (mod N)],c^k=2N([k≡ν (mod N)]+[k≡−ν (mod N)])
が成り立つ。
証明.(1)を示す。ν′−ν=rN(r∈Z)ならば、任意のj∈Zに対してe2πiν′j/N=e2πiνj/Ne2πirj=e2πiνj/Nである。逆にj=1で等式が成り立つならばe2πi(ν′−ν)/N=1であり、eiθ=1となる実数θは2πZの元に限るから(ν′−ν)/N∈Zである。
(2)を示す。実数θ,θ′についてcosθ−cosθ′=−2sin2θ+θ′sin2θ−θ′であり、sinの零点はπZであるから、cosθ=cosθ′と「θ′−θ∈2πZまたはθ′+θ∈2πZ」は同値である。ν′=±ν+rN(r∈Z)ならば、任意のj∈Zに対して2πν′j/N=±2πνj/N+2πrjであり、余弦の値は等しい。逆にj=1で等式が成り立つならば、θ:=2πν/N、θ′:=2πν′/Nに上の同値を適用して、ν′−ν∈NZまたはν′+ν∈NZを得る。
(3)を示す。xj=ωN−νjであるからx^k=∑j=0N−1ωNj(k−ν)であり、補題 1.1により第一式を得る。xj′:=e−2πiνj/Nと置くとc=(x+x′)/2であり、第一式を−νに適用したx′^k=N[k≡−ν (mod N)]とFNの線形性から第二式を得る。▨
例 5.2.N=8、ν=3とする。ν′=5ではν′+ν=8∈8Z、ν′−ν=2∈/8Zであるから、命題 5.1 (2)により余弦の標本は一致し、命題 5.1 (1)により複素指数の標本は一致しない。実際j=1でe2πi⋅3/8=e3πi/4=e5πi/4=e2πi⋅5/8である。ν′=11ではν′−ν=8であり、複素指数の標本も余弦の標本も一致する。命題 5.1 (3)により、ν=3の複素指数の標本の離散 Fourier 変換はk=3だけで値8をとり、ν=5のものはk=5だけで値8をとる。余弦の標本の離散 Fourier 変換は、ν=3,5,11,13のいずれについてもk=3とk=5で値4、他のkで0である。
6 演習
解答.
0≤j<Nをとる。l,i∈{0,…,N−1}について、l+i≡j(modN)はi≡j−l(modN)と同値であり、{0,…,N−1}の中でj−lとNを法として合同な元は(j−l)modNだけであるから、(l,i)∈Sjとi=(j−l)modNは同値である。したがってl↦(l,(j−l)modN)は{0,…,N−1}からSjへの全単射であり、逆写像は(l,i)↦lである。この全単射で和の添字を付け替えると
(l,i)∈Sj∑xlyi=l=0∑N−1xly(j−l)modN=(x⊛y)jである。▨
問題 6.2.s∈N≥0、N:=2sとする。定義 3.2のΦNの計算で各段が実行する乗算tkのうち、k=0であるものの回数は(N/2)log2N−N+1であることを示せ。
解答.
Φ2sの計算でk=0である乗算の回数をνsと書く。ν0=0である。s≥1のとき、長さ2sの段はk=0,…,2s−1−1の2s−1回の乗算を実行し、そのうちk=0であるものは2s−1−1回であるから、νs=2νs−1+2s−1−1である。νs−1=(s−1)2s−2−2s−1+1ならば
νs=(s−1)2s−1−2s+2+2s−1−1=s2s−1−2s+1であり、s=0でs2s−1−2s+1=0=ν0であるから、sに関する帰納法によりνs=(N/2)log2N−N+1である。▨