フーリエさん、ひさしぶり?

このワークシートは[url=https://www.geogebra.org/m/twxxx3yq]Math by Code[/url]の一部です。
今回は、量子フーリエ変換[b]QFT[/b]にとりくもう。[br][br]その前に、[br]フーリエ[b]級数[/b]からフーリエ[b]変換[/b]への流れを確認しておこう。[br]フーリエ級数というのは、周期関数を三角関数の和に展開するものだったね。[br][br][b][size=150]<フーリエ級数を思い出そう>[/size][/b][br]一般に、周期Tのf(t)のフーリエ級数は[br]f(t)=a0+ Σ( an cos[ 2π n t/T ] + bn sin[ 2π n t/T] ) [br]a0 = 1/T ∫ f(t) dt (-T/2, T/2) [br]an = 2/T ∫ f(t) cos[ 2π n t/T ] dt ( -T/2, T/2) [br]bn = 2/T ∫ f(t) sin[ 2π n t/T ] dt (-T/2, T/2) [br]とされていて、音の波形を作るのに役立ったね。[br]純音はy=a sin[ 2π f t] (f=440でA4の音)だった。[br]フーリエ級数展開では、周期関数f(t)と倍音周波数の純音に和分解していることになる。[br]ノコギリ波は[ーπ、+π]の区間で、f(t)=t, T=2πのときのフーリエ級数展開は[br]f(t) =2 Σ(-1)(n+1)/n sin(nt) [br]矩形波は[0, π]区間で作れたら奇関数で、f(t)=1, T=2πのときのフーリエ級数展開は[br]f(t) = Σ(1-(-1)n) /nπ sin(nt)[br]三角波はf(t) = t (0からπ/2) ;π-t (π/2, π)を偶関数化したフーリエ級数展開は[br]f(t)=π/4- 2/π{ cos 2t + 1/32 cos 6t +1/ 52 cos 10t + ......1/ (2m+1)2 cos2(2m+1)+.......}[br]基本周波数をfとすると、(周波数の倍率,振幅の倍率)のペアのリストができる。[br]純音   ;(1,1)[br]ノコギリ波;(1,1),(2,-1/2), (3, 1/3),(4,-1/4),(5,1/5),........ ( k, (-1)^(k+1)/k ),.....[br]矩形波  ;(1,1)    , (3, 1/3) ,(5,1/5),....., ( k, (1-(-1)^k)/k ),.....[br]三角波  ;(1,1),    ,(3, 1/32) ,(5,1/52),,.... (2k-1, 1/(2k-1)^2),.....[br]これらを決めるには、部分積分と三角関数の0、πの値が0や-1になることを利用したね。[br][br][b][size=150]<複素数化と区間の無限化でフーリエ変換>[/size][/b][br]また、オイラーの公式により、複素数を使うとフーリエ級数が複素フーリエ級数になった。[br]式が見やすくなり、f(t)に指数関数e^ixをかけた形でシンプルになったね。[br]複素フーリエ級数f(t) =...+c_-1e^(-ik-1t)+c0+c_1 e^(ik1t)+......= Σc_n e^(iknt)(n from ‐∞ to ∞)[br]複素フーリエ係数cn=1/T ∫ f(t) e^(-iknt) dt( -T/2, T/2)[br]さらに、複素フーリエ級数の周期T→∞にしたものがフーリエ変換と逆フーリエ変換だ。[br]f(t)の[b]フーリエ変換[/b]はF(k)=∫ [b]f(t) e^(-ikt) dt[/b] (‐∞,∞) [br]F(k)の[b]逆フーリエ変換は[/b]f(t)= 1/2π∫[b]F(k) e^(ikt) dk[/b] (‐∞,∞) [br][br]関数を波のベクトルとみなすと、[br][b]フーリエ級数が直交基底ベクトルの和でできている[/b]といえる。[br]{Un(x)}=1/√π{1/√2, cosx ,sinx, cos2x, sin2x, ........} も正規直交する基底関数だ。(xが-π以上とπ未満)[br]f(x)=Σ am | Um> ( m=[0、∞] )のように2π周期関数f(x)がUnの級数として表示できる。[br]これがフーリエ級数だった。[br]フーリエ級数が正規直交関数系(直交多項式)でできてることが、[br]フーリエ変換や微分方程式の解法につながった。[br][color=#0000ff](例)[/color][br] フーリエ級数y=1・sinx+1/3 ・sin3x+ 1/5・sin5x は、[br] 3つの正規直交基底Fm={sin x, sin3x, sin5x}の一次結合。[br] (正規直交関数である理由)[br] (sinx・sin3x)=(sin3x・sin5x)=(sin5x・sinx)=0[br] (sinx・sinx)=(sin3x・sin3x)=(sin5x・sin5x)=π。[br] ∫XYdx[ -π, π] は奇関数X×奇関数Y=奇関数の積分は原点対称で0になる。[br] X=mxとして、∫(sin X)2 dx=1/2 ∫(1- cos 2X) dx =1/2 ∫1 dx-1/2 ∫cos 2Xdx=1/2[x][-π,π] -0=π。[br][br]関数を波のベクトルとみなせば、[br]f(t)のフーリエ変換はF(k)=∫ [b]f(t)[/b] e^(-ikt) dt (‐∞,∞) [br]F(k)の逆フーリエ変換f(t)= 1/2π∫[b]F(k)[/b] e^(ikt) dk (‐∞,∞) [br]この2式が内積に見えてくるね。[br]f(t)という基本の時間波に周波数kごとの回転をかけてたし算する内積だ。[br]波にその周波数があれば強められてなければ弱められます。[b]波の干渉性[/b]ですね。[br][color=#0000ff][b][u]これって、量子論理とスゴク相性がいいですよね。[br][/u][/b][/color][b]ヒルベルト空間[/b]を思い出すと内積がピンとくるでしょう。[br]逆変換は周波数ごとの波F(k)に時間tの逆回転をして、それを合計すると、もとの基本波f(t)に戻るということだ。[br]だから、連続フーリエ変換はf(t)という[b]時間領域の非周期関数[/b]から、F(k)という[b]周波数領域の連続関数[/b]への変換をするので、フーリエ変換は周波数分解、[b]スペクトル分解[/b]と言い換えることもできる。[br][b][color=#0000ff]「周波数を横軸にとると、[/color][/b][b][color=#0000ff]特定の周波数kの成分がどれくらい含まれているかが視覚化」[/color][/b]できます。[br]もっと、実用的にかみ砕くと、Waveファイルから音高データを導くので、Midiファイル作成にもつながるね。[br][br][b][size=150]<DFTとFFT>[br][/size][/b]この関数の内積([b]F=∫f(t)*e dt[/b] )をデジタルな内積([b]y=Σx*e [/b])にしたものが[br]離散フーリエ変換(DFT)だ。[br]調べる時間がT秒間で、サンプリング間隔がD秒だとするとn=T/D。[br]時刻リストts={0,D,2D,....(n-1)D}に対するf(t)のデータx={x0, x1,x2,....x(n-1)}が得られたとしよう。[br]f(t)が連続的なときと同様にxt =...+c-1e-ik-1t+c0+c1eik1t+......= Σc_n e^(iknt) (‐∞,∞)[br]4つの時刻に対する音や波の信号データから、フーリエ係数c0,c1,c2,c3を逆算して、[br]求めることができるはずだ。[br][br][b][color=#0000ff]ベクトルと行列で再表現[/color][/b]してみよう。[br]この式を、ベクトルA=[c0,c1,c2,c3]からベクトルx=[x0,x1,x2,x3]を求める[br]かけ算[b]x=Ac[/b]とするとき、これが逆離散フーリエ変換([b]IDFT[/b])で、[br]この逆算の [b]c=A^-1 x[/b]が[b]離散フーリエ変換(DFT)[/b]です。[br]そして、DFTを高速化するものが[url=https://www.geogebra.org/m/twxxx3yq#material/emnr2tvd][b][size=150][color=#0000ff][size=200]FFT[/size][/color][/size][/b][/url]だったね。[br][br][b]FFT[/b]のアルゴリズムの基本は、[br][b]xをLとRに分けて、対応する番号順の和と差にし、[br]差については、回転子にリストの番号乗をしてかけることです。[br][/b]これをn=8,n=4,n=2に対して[b]再帰的に実行[/b]しよう。名付けて、[b]再帰分割(バタフライ演算)[/b]。[br]すると、[br]時間順に区切った音波の振幅データ[br]x=[x0,x1,x2,x3,x4,x5,x6,x7]に対して[br]X=[X0,X4,X2,X6,X1,X5,X3,X7]を順に求めることができますね。[br]このインデックスの入れ替わりは[b]2進数にしたときに左右逆転する数同士になっている[/b]こと(ビット反転)[br]を使うと、計算で求めることもできるはず。[br]このXをインデックス順に並べ替えることで、[br][X0,X1,X2,X3,X4,X5,X6,X7]が周波数を小さい順にならべた周波数特性のデータになります。[br]たとえば、n=8の場合[color=#0000ff]複素数のかけ算が8*8=[b]64[/b]個[/color]出てきます。[br]FFTを使うと、n=4にsizeダウンしたことで、8/2=4個。n=2にサイズダウンしたことで、4/2=2個を2回。[br]結果として、[b][color=#0000ff]4+2*2=4×2=8個[/color][/b]ですみます。[br][br]一般に、サイズがnなら複素数のかけ算の回数が[b]n^2回[/b]からFFTで[b]n/2×(log2(n)-1)回[/b]に激減します。[br][b]N*N[/b]のオーダーから[b]N*logN[/b]のオーダーに減るということですね。[br]
[b][size=150]<FFTからQFT>[/size][/b][br]フーリエ変換の関数の内積([b]F=∫f(t)*e dt[/b] )をデジタルな内積([b]y=Σx*e [/b])するとどうなったでしょうか。[br]連続フーリエ変換はF(k)=∫ [b]f(t)[/b] e^(-ikt) dt (‐∞,∞) は時間の波関数に周波数の波をかけて積分しました。[br]離散フーリエ変換は時間による波ベクトルxjから周波数ベクトルykを求めるために[br]周波数の波eをかけて総和を求めます。x、yともにサイズはNで添え字は0からN-1としましょう。[br][b][br]y_k=1/√N Σ x_j e^(2π ijk/N) [br][/b]ここで、[b]ω=e^2πi /N とすると、ω^jk= e^(2π i jk/N) [/b]となるね。[br]だから、FTはN行N列の行列でかくことができる。列ベクトル=|m)=(1,ω,ω^2,....,, ω^N-1)とおくと、[br][b]FT=1/√N[ |m^0), |m^1), |m^2),......,|m^N-1))[br][br][/b]これは基底1つの変換だったから、重なり状態の波については次のようになる。[br]FT: Σ xj |j) →Σ yk |k)[br]y=FT xのような行列方程式になるといえるね。[br]FTはユニタリー行列で、状態ベクトルの回転を表している。[br]この計算の工夫が、QFTのポイントになるということだね。[br][br]N=2^nとすれば、[br][b]ωn=e^2πi /N= e^(2πi /2^n)[br]ωl=e^(2πi /2^l) [br]ω=e^2πi [br][/b]とおくこともできて、[br]ωnは複素平面上の単位円のN等分したベクトル[br]ωlは複素平面上の単位円の2^l等分したベクトルと見られる。[br][br]ωはベクトルにかけると回転子となり、波に干渉することができる。[br]Nをnビットの2進数とみることもできる。[br][br]時間をデジタルにN個に切った基底ベクトル|j)を[br][b]N個の周波数の基底ベクトル|k)に対して周波数{k)のベクトルをかけた内積を求めるのがQFTだ。[/b][br]周波数の基底ベクトル|k)は、|k_1)から|k_n)までのn個のビットに区切って考えることができる。[br][br]だから、[br]FFTでN=8なら8→4→2と[br]周波数基底による線形結合を入れ子にして、[br][b]ペアのペアのぺア[/b][br] {[(x0-x4)+p2(x2-x6)]+[p1(x1-x5)+p3(x3-x7)]}[br]のように、2ビットまで2等分を繰り返して、[br][b]「多層的に表現」[/b]できる。[br][br]再帰的表現の代わりに指数でk1ビットが2を多くかけることになるね。[br]ただし、k1からknというのは[b]nビットのインデックスの意味であり、実際は0か1でしかない[/b]。[br]だから、最後はどのビットも0か1の2通りに分解できる。[br]代数式とみると、[b]「入れ子の式は因数分解で2項式のかけ算」[/b]に直せる。[br][br]また、[b]j/2^nを2進小数j_1j_2....j_n-1j_n[/b]と表すことができる。[br]回転は1回転を超えると切り捨てられることを考えると、[br]2進小数[b]0.[/b][b]j_1j_2....j_n-1j_n[/b]を2倍2倍していき、[b]整数を切り捨て[/b]ていくと、k1の回転子の指数は[b]0.j_n[/b]だけになる。[br][br]FT:[br][b][size=150][color=#0000ff] |j)=|j_1,j_2,....,j_n-1,j_n) [br][/color][/size][/b]->1/√N Σ ωn^j[b]k[/b] |k)[br] =1/√N [b]Σ[/b]_(k1) …[b]Σ[/b]_(kn) ωn^j [b](k1*2^(n-1)+....kn*2^0)[/b] |k1...kn)[br] =1/√N ([b]Σ[/b]_(k1)ω1^k1 |k1)) … ( [b]Σ[/b]_(kn) ωn^kn |kn) ) [br] [size=150][color=#0000ff][b]=1/√N (|0) +ω^0.j_n|1)) (|0) +ω^0.j_n-1j_n |1)) .... (|0) +ω^0.j_1j_2....j_n-1j_n|1))[br][br][/b][/color][/size]ビットごとに独立、並列して計算ができることがわかった。[br]あとは回転子の指数にある小数の計算を回路でどう実現するかという課題があるね。[br]
[b][size=150]<QFTの回路>[br][/size][/b]二進数はオンオフと親和性が高いですね。[br]しかも、回転するのは|1)です。[br]回転の最小単位はj/2^nです。これを位相ゲートRn=P(n)=[(1,0),)(0,e^2πi/2^n)]としましょう。[br]第kのビットがたっているときだけ、Rk=P(k)=[(1,0),)(0,e^2πi/2^k)]まわす制御位相ゲートをCRkとします。[br]第1ビットが1のときだけ、R1回すのは、Hでできますから、[br]jが3ビットのときは、[br]H, R2,R3を1ビット目にして、[br]2ビット目にはH,R2をして、[br]3ビット目にはHをします。[br]合計で3+2+1=6個のゲートで3つのビットに回転をかけられますね。[br]古典論理のFFTのときに、インデックスの大小を最後に入れ替えて整理したように、[br]量子論理でも、インデックスのソートをします。ソートは大小のSWAPを使いましょう。[br]SWAPは前にやりましたが、入れ替える2つのワイヤでCNOT3連発すればよかった。[br][br]結局、nビットのQFTのゲート数は回転でn+n-1+....+1=n(n+1)/2個横に並べ、[br]その後、大小整理で3*floor(n/2) 個。[br]合計で[b]n(n+1)/2+3floor(n/2)[/b]個のゲートで実現できるね。[br][br]FFTが[b]n*2^n[/b]のオーダーの計算量レベルだったのに対して、[br]QFTは[b]n*n[/b]のオーダーに減る。[br]QFTから見れば、FFTは指数関数的な計算量だ。[br][br]しかし、QFTは理論的にはすばらしいが、量子コンピュータでは[br]実際に音波に直接使うには音の振幅を直接測定することが難しいようです。[br][br][br][b][size=150]<QFTの振り返りとユースケース>[br][/size][/b]QFTを振り返ると、[br]まず、時間の関数である波をデジタル化して、2進数として基底を渡します。[br]FTでは、周波数を2進化して、基底と回転をセットにして、波にかけます。[br]この内積によって、周波数のあるところは強め、ないところはゼロにすることで、[br]周波数スペクトルを抜き出したのです。[br]時間の波から周波数を抜き出したということですね。[br]これが、FFTよりも驚異的な高効率ということだった。[br]このQFTのアルゴリズムは、位相推定、素因数分解、位数発見、暗号解読、[br]隠れ部分群の発見など、高難度で計算量の多い課題に対して[br]その有効性が確認されているようです。[br][br][color=#9900ff][b][u][size=150]課題:DFTとFFTとQFTの計算量のオーダーで視覚化しよう。[br][/size][/u][/b][/color]N=2^nとすると、[br]DFTはN*Nのオーダー、FFTはn×Nのオーダー、QFTはn×nのオーダーです。[br]N^2、NlogN, (logN)^2のグラフをかいてみよう。[br]
DFTとFFTとQFTのオーダーを比べよう

Information: フーリエさん、ひさしぶり?