JOURNALについて

データアナリティクスラボ株式会社では、ITやデータサイエンスに関する技術の研究活動を行っています。このブログでは、研究活動で得られた知見や検証結果についての情報を発信します。

本ブログで提供される情報は、可能な限り正確かつ最新の情報であるように努めますが、必ずしもその正確性を保証することはできません。場合によっては誤情報が含まれたり、最新の情報ではない可能性もあります。予めご了承いただけますようお願い申し上げます。

journal

量子フーリエ変換をていねいに解説

はじめに

 データソリューション事業部の関田です。

 今回は量子計算で最も重要なテクニックの一つである量子フーリエ変換について、数式と量子回路の導出を行います。

 量子フーリエ変換はその名の通り、量子計算を用いてフーリエ変換を行う手法です。これは古典的な離散フーリエ変換よりも計算量が少ないことが証明されており、Shorのアルゴリズムなど様々な量子アルゴリズムのサブルーチンとして組み込まれています。したがって、量子アルゴリズムを理解するためには量子フーリエ変換の理解が欠かせません。

 本記事では、量子アルゴリズムを勉強中の方に向けて、途中式や式と量子回路との対応付けを詳細に解説していきます。

 以下の知識を持っていると読みやすいです。

  • 線形代数を中心とした大学レベルの数学
  • 2量子ビットゲートなど量子ゲートの基礎

1. 量子フーリエ変換の計算

 まずは、量子フーリエ変換の計算について詳しく解説します。

1.1. 量子フーリエ変換の導入

 2n 次元の複素ベクトル {xj} (j{0,1,,2n1}) の離散フーリエ変換 {yk} (k{0,1,,2n1}) を以下で定義します。

(1)yk:=12nj=02n1xje2πikj/2n

ただし、{xj} は以下のように規格化されているとします。

j=02n1|xj|2=1

規格化している理由は、量子回路の入力に対応させるためです。

 量子フーリエ変換の目標は、入力の量子状態 |x を出力の量子状態 |y へ変換することです。 ここで、各状態はそれぞれ以下で表されるものとします。

|x:=j=02n1xj|j,

(2)|y:=k=02n1yk|k

ここでは、|i は10進数表記と2進数表記の両方を用います。文脈によっていずれか便利な方を用いるので注意が必要です。

💡 表記の具体例
 量子ビットを n=2 個用意します。このとき状態 |i は以下の4通りの値を取りうることがわかります。

  • |0(10)=|00(2)
  • |1(10)=|01(2)
  • |2(10)=|10(2)
  • |3(10)=|11(2)

また、|i は各量子ビットの状態なので、正規直交基底となります。

それでは、入力の量子状態 |x を出力の量子状態 |y へ変換することを考えます。 まずは式 (1) を式 (2) へ代入します。

|y=k=02n112nj=02n1xje2πikj/2n|k=j=02n1xj(12nk=02n1e2πikj/2n|k)

これを入出力状態と見比べることにより、量子フーリエ変換では以下の変換を行う行列 UQFT を見つければよいことがわかります。

(3)UQFT|j=12nk=02n1e2πikj/2n|k

この UQFT による変換を量子フーリエ変換と呼びます。またこの変換がユニタリであることは付録A.1.で証明します。

1.2. 量子フーリエ変換の導出

 次に量子フーリエ変換の具体的な操作、つまり、式 (3) の具体的な表式を求めにいきます。

ここから、|j=|j1j2j3jn(jk{0, 1}) と表記します。つまり、量子状態を明示的に2進数表記します。 このとき、10進数での j と2進数での j1j2j3jn には以下の関係があります。

j(10)=j1j2j3jn(2)=(j12n1+j22n2++jn20)(10)

この表記を用いると、2の累乗での j の割り算が以下のような小数で表されます。

j2l=j1j2j3jn2l=j1j2jnl.jnl+1jnfor l=1,,n1

l=n の場合は先頭に0を置いて 0.j1jn となります。 さらに、オイラーの公式より以下の場合に j1j2jnl.jnl+1jn の整数部分は無視できます。

e2πij/2l=e2πi(j1j2jnl.jnl+1jn)=e2πi(j1j2jnl)e2πi(0.jnl+1jn)=1×e2πi(0.jnl+1jn)=e2πi0.jnl+1jn)

以上に注意すると、式 (3) の右辺は以下のように表されます (規格化定数は略) 。

k=02n1e2πikj/2n|k=k1=01k2=01kn=01e2πi(k12n1+k22n2++kn20)j/2n|k1k2kn=k1=01k2=01kn=01e2πi(k121+k222++kn2n)j|k1k2kn=(k1=01e2πik121j|k1)(k2=01e2πik222j|k2)(kn=01e2πikn2nj|kn)=(|0+e2πi(j1j2jn1.jn)|1)(|0+e2πi(j1jn2.jn1jn)|1)(|0+e2πi(0.j1j2jn1jn)|1)=(|0+e2πi(0.jn)|1)(|0+e2πi(0.jn1jn)|1)(|0+e2πi(0.j1j2jn1jn)|1)

最終的に、式 (3) すなわち量子フーリエ変換は以下のような変換を行えばよいことがわかります。

UQFT|j=UQFT|j1jn=12n(|0+e2πi(0.jn)|1)(|0+e2πi(0.jn1jn)|1)(4)(|0+e2πi(0.j1j2jn1jn)|1)

 ここで改めて式の意味を確認します。 j1,j2,,jn はそれぞれ1つの入力量子ビットに対応しており、状態 |j1jnn 個の量子ビットから成る変換前(入力時)の回路全体の状態を表します。量子フーリエ変換による変換後、各量子ビットは 12(|0+e2πi(0.jn)|1),,12(|0+e2πi(0.j1j2jn1jn)|1) の状態を取り、回路全体として式 (4) の状態になっています。

2. 量子フーリエ変換を行う量子回路

 ここでは、式 (4) を実行する量子回路の構成を考えます。

2.1. 量子ゲートの導入

 まずは準備として、アダマールゲート H と回転ゲート Rk を導入しておきます。 それぞれ以下で定義します。

H:=12(1111)

Rk:=(100exp(2πi2k))

証明は省略しますが、これらは共にユニタリ行列です。自身の随伴行列との積が単位行列になることが確認できるはずです。

💡 アダマールゲートと回転ゲートの具体的な操作
 各ゲートを状態 |0,|1 に作用させることで、以下の通り新たな状態を得ます。

アダマールゲート

H|0=12(1111)(10)=12(11)=|0+|12

H|1=|0|12

H ゲートの変換はまとめて次のように書くことができます。

H|j=|0+e2πi(0.j)|12

回転ゲート

Rk|0=|0

Rk|1=exp(2πi2k)|1

Rk ゲートの変換はまとめて次のように書くことができます。

(5)Rk|j=exp(2πij2k)|j

これらの変換を用いて、量子フーリエ変換を実現します。

2.2. 量子回路の作成

 式とそれに対応する量子回路を並行して見ていきましょう。

ステップA

 式 (4)n 番目の状態 12(|0+e2πi(0.j1j2jn1jn)|1) を作ることを考えます。 変換元である状態 |j1jn の1番目の状態 |j1H ゲートを作用させると、以下のように変換されます。

H|j1jn=12(|0+e2πi(0.j1)|1)|j2jn

図1. 状態 |j1H ゲートを作用させた回路図

さらに、2番目の状態 |j2 を制御ビット、1番目の上記の変換後の状態を標的ビットとしてR2 ゲートを作用させます。このような2量子ビットゲート R2 は以下のように動作します。

  • 制御ビット |j2|1 のとき、標的ビットの状態 |1exp(2πi4) 倍し、状態 |0 は変化させない
  • 制御ビット |j2|0 のとき、標的ビットの状態を変化させない

まとめると、式では |1exp(2πi(j2/4))=exp(2πi(0.0j2)) (右辺で j2/4 を2進数表記) をかければよいことがわかります。なお、これは式 (5) と同義です。

R212(|0+e2πi(0.j1)|1)|j2jn=12(|0+e2πi(0.0j2)e2πi(0.j1)|1)|j2jn=12(|0+e2πi(0.j1j2)|1)|j2jn

この操作を表す回路図は以下の通りです。

図2. 状態 |j2 を制御ビット、アダマール変換後の状態 |j1 を標的ビットとする R2 ゲートを作用させた回路図

同様に、3番目の状態 |j3 を制御ビット、1番目の上記の変換後の状態を標的ビットとしてR2 ゲートを作用させると、以下のように変換されます。

R312(|0+e2πi(0.j1j2)|1)|j2jn=12(|0+e2πi(0.j1j2j3)|1)|j2jn

図3. R3 ゲートを追加した回路図

同じ計算を n 番目の制御ビットまで繰り返すことにより、以下の状態を得ます。

12(|0+e2πi(0.j1j2jn1jn)|1)|j2jn

図4. Rn ゲートまで追加した回路図

上の状態は1番目の量子ビット |j1 を変換させていった結果なので、上記変換後に1番目の量子ビットを測定することで、 状態 12(|0+e2πi(0.j1j2jn1jn)|1) を得ることができます。
これが式 (4)n 番目の状態です。

ステップB

 式 (4)(n1) 番目の状態は、先ほどの (|0+e2πi(0.j1j2jn1jn)|1) から j1 を除き j2 を小数部分の先頭にしたものです。したがって、(n1) 番目の状態を得るためには、ステップAで j1 を基準に考えていた所を j2 に置き換えればよいことが類推できます。

同じ手続きではありますが、一部の計算を記載します。

ステップAで作成した状態の |j2H ゲートを作用させます。

H12(|0+e2πi(0.j1j2jn1jn)|1)|j2jn=12(|0+e2πi(0.j1j2jn1jn)|1)12(|0+e2πi(0.j2)|1)|j3jn

図5. 状態 |j2H ゲートを作用させた回路図

続いて、状態 |j3 を制御ビット、アダマール変換後の状態 |j2 を標的ビットとする R2 ゲートを作用させます。

R212(|0+e2πi(0.j1j2jn1jn)|1)12(|0+e2πi(0.j2)|1)|j3jn=12(|0+e2πi(0.j1j2jn1jn)|1)12(|0+e2πi(0.j2j3)|1)|j3jn

図6. 状態 |j3 を制御ビット、アダマール変換後の状態 |j2 を標的ビットとする R2 ゲートを作用させた回路図

同じ計算を n 番目の制御ビットまで繰り返すことにより、以下の状態を得ます。

12(|0+e2πi(0.j1j2jn1jn)|1)12(|0+e2πi(0.j2jn)|1)|j3jn

図7. Rn1 ゲートまで追加した回路図

ステップC

 ステップA, Bと同様の計算を回路全体で繰り返すことにより、以下の状態を得ます。

(6)12(|0+e2πi(0.j1j2jn1jn)|1)12(|0+e2πi(0.jn)|1)

図8. n 量子ビットで式 (6) の変換を行う量子回路

(6) は、式 (4) の右辺と積の順番が逆であることに注意が必要です。ここでは詳細は省略しますが、式 (4) と同じ順序にするためにはSWAP演算を行って順序を反転させます。

結局、SWAPゲートも含めた n 量子ビットの量子フーリエ変換を行う回路は以下となります。

図9. n 量子ビットで式 (4) の量子フーリエ変換を行う量子回路

これで量子回路の導出も完了です。

おわりに

 今回は量子計算で最も重要なテクニックの一つである量子フーリエ変換について、数式と量子回路の導出を行いました。途中式や量子回路との対応について初学者向けにていねいに解説したので、参考にしていただければ幸いです。

A. 付録

A.1. 量子フーリエ変換のユニタリ性

j|UQFTUQFT|j=12nl=02n1k=02n1e2πilj/2ne2πikj/2nl|k=12nl=02n1k=02n1e2πilj/2ne2πikj/2nl|kδk,l|k=12nk=02n1e2πikj/2ne2πikj/2nk|k=12nk=02n11=1=j|j

したがって

UQFTUQFT=I

であり、UQFT がユニタリ行列であることが示されました。

A.2. 量子ゲートはなぜユニタリ性を要求するのか

 量子状態 |it に対して量子ゲートによる変換 U を行ったときに、変換後の状態は |it+1=U|it で表されます。また、一般に量子状態は次のように規格化されています。

ti|it=1, t+1i|it+1=1

これより

ti|UU|it=1

すなわち

UU=I

が得られ、量子ゲートによる変換 U がユニタリ変換である必要があることが導かれます。

参考

オウンドメディアも運営しています