めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

量子計算(量子回路)の考え方を理解するために最低限必要な量子力学の知識を(それなりに納得感のある形で)うまいこと導入する方法について考えてみた(その6)

何の話かというと

enakai00.hatenablog.com

の続編です。今回は最後のまとめとして、いわゆる「量子回路」の読み方を説明します。

n量子ビットシステム

と、言いながら、その前に、一般の n 量子ビットのシステムについて説明しておきます。

2量子ビットのシステムについては、z 軸方向のスピンを同時に観測した際に、とり得る値の組み合わせが 2^2 通りあり、それぞれの組み合わせを基底ベクトルとする複素ベクトル空間が構成されることを説明しました。一般に、n 個の量子ビットを持つシステムであれば、2^n 通りの組み合わせがあるので、2^n 次元の複素ベクトル空間が構成されます。ここでは、具体例として、4量子ビットの場合で説明をしていきます。

まず、一般の状態は次のように表されます。

 {\mid\psi\rangle} = c_{0000}{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle} + c_{0001}{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 1\rangle} + \cdots +  c_{1111}{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}

全確率が1になるという条件から、次の束縛条件が付きます。

 |c_{0000}|^2 + |c_{0001}|^2 + \cdots + |c_{1111}|^2 = 1

次にこの状態に対する演算処理は、2^4 \times 2^4 の巨大なユニタリ行列で表現されるわけですが、とても書き下す気にはなれないので、前回に説明したブラケット記号とテンソル積を用いて表すことにします。

特に量子計算機においては、通常、3個以上の量子ビットにまたがる演算というのは考えません。1個、もしくは、2個の量子ビットに対する演算を組み合わせることで、3個以上の量子ビットにまたがる演算を実現するというアプローチをとります。

たとえば、特定の1つの量子ビットに対する演算処理は、テンソル積を用いれば、次のように簡潔にあらわすことができます。

  U_1 = \sigma_x\otimes 1\otimes 1\otimes 1

これは、1つ目の量子ビットをフリップする演算で、\sigma_x1 は次で定義されます。

 \sigma_x ={\mid 1\rangle}{\langle 0 \mid} + {\mid 0\rangle}{\langle 1\mid},\ 1 = {\mid 0\rangle}{\langle 0 \mid} + {\mid 1\rangle}{\langle 1\mid}

あるいは、2つの量子ビットにまたがる演算の例に、Controlled-NOT がありました。たとえば、「1つ目の量子ビットが \mid 1\rangle の場合に、4つ目の量子ビットをフリップする」という演算は、今の場合、次になります。

  U_ 2 = {\mid 0\rangle}{\langle 0\mid}\otimes 1\otimes 1\otimes 1 + {\mid 1\rangle}{\langle 1\mid}\otimes 1\otimes 1\otimes \sigma_x

次のように2行に分けて書くと、条件分岐の雰囲気がでるかもしれません。

  U_ 2 = {\mid 0\rangle}{\langle 0\mid}\otimes 1\otimes 1\otimes 1
    + {\mid 1\rangle}{\langle 1\mid}\otimes 1\otimes 1\otimes \sigma_x

U_1 を演算した後に、続けて、U_2 を演算するという処理を次のように縦に並べるとどうでしょう。

   U_1 = \sigma_x\otimes 1\otimes 1\otimes 1

  U_ 2 = {\mid 0\rangle}{\langle 0\mid}\otimes 1\otimes 1\otimes 1
    + {\mid 1\rangle}{\langle 1\mid}\otimes 1\otimes 1\otimes \sigma_x

なんだかこれ、回路っぽい雰囲気がしません?!

そう、実は、量子回路は、これを回路っぽく図式化したものにほかなりません。

量子回路

先ほどの「回路っぽい」演算子の並びは、各量子ビットを左から右にならべて、それぞれの量子ビットに対する演算子を示したものになっています。量子回路の場合は、各量子ビットを上から下にならべて、それぞれの量子ビットに対する演算を所定の記号で書き表します。

たとえば、先ほどの U_1U_2 を続けて行う例であれば、次のようになります。

非常にわかりやすいですね。上図の⊕マークは、ビットフリップ \sigma_x を表します。黒丸は、Controlled-NOT における条件分岐を示すもので、黒丸部分が \mid 1\rangle の場合にのみ、縦線でつながった \sigma_x が発動することを示します。図の左に {\mid 0\rangle} が4つ並んでいるのは、この回路では、最初に量子ビットの状態が

 {\mid \psi\rangle} = {\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}

に初期化された状態から演算が始まることを示しています。

この他に、ちょっとおもしろい演算として、Controlled-Z があります。たとえば、「1つ目の量子ビットが \mid 1\rangle の場合にのみ、4つ目の量子ビットに \sigma_z を演算する」という処理を考えてみます。\sigma_z は、

 \sigma_z = {\mid 0\rangle}{\langle 0\mid} - {\mid 1\rangle}{\langle 1\mid}

という演算で、量子ビットが {\mid 1\rangle} の場合に、これを -{\mid 1\rangle} に変換するという処理を行います。

しかしながら、{\mid 1\rangle}-{\mid 1\rangle} に変換するというのは、4つの量子ビットのテンソル積全体に -1 を掛けることと同等です。例としては、次のような感じです。

 {\mid 1\rangle}\otimes {\mid 0\rangle}\otimes {\mid 0\rangle}\otimes {\mid 1\rangle}\ \Rightarrow\ {\mid 1\rangle}\otimes {\mid 0\rangle}\otimes {\mid 0\rangle}\otimes (-{\mid 1\rangle}) = -{\mid 1\rangle}\otimes {\mid 0\rangle}\otimes {\mid 0\rangle}\otimes {\mid 1\rangle}

したがって、「1つ目の量子ビットが \mid 1\rangle の場合にのみ、4つ目の量子ビットに \sigma_z を演算する」という処理は、結局のところ、「1つ目の量子ビットが \mid 1\rangle で、かつ、4つ目の量子ビットが \mid 1\rangle の時にテンソル積全体に -1 を掛ける」という処理と同じことになります。特に、この処理は、1つ目の量子ビットと4つ目の量子ビットが対等な関係になっていることがわかります。したがって、この処理は、回路上では、1つ目と4つ目を対等に扱って、次のように表記されます。


アダマール演算子による重ね合わせ状態の実現

これで、量子回路の雰囲気がつかめたことと思います。なお、回路上では、個々の量子ビットに対する操作として各演算が表記されますが、実際の物理的な操作としては、あくまでも、すべての量子ビットをまとめた状態、すなわち、2^n 次元の複素ベクトル空間に対する線形演算として操作が行われている点は忘れないでください。これを忘れると、0/1 のビットを操作する単なるデジタル論理回路との違いが見えなくなってしまいます。

ここで最後に、量子回路の特殊性が感じられる例として、アダマール演算子を紹介しておきます。

 \displaystyle H = \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle}){\langle 0\mid}+\frac{1}{\sqrt{2}}({\mid 0\rangle}-{\mid 1\rangle}){\langle 1\mid}

これは、{\mid 0\rangle}{\mid 1\rangle} をそれぞれ \displaystyle  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle})\displaystyle  \frac{1}{\sqrt{2}}({\mid 0\rangle}-{\mid 1\rangle}) に変換する演算子で、行列で表記すると、ユニタリ行列になっていることが確認できます。つまり、物理的に実装可能な変換の1つです。

このアダマール演算子を用いて、次の量子回路を構成します。

この回路では、量子ビットの初期状態は、

 {\mid \psi\rangle} = {\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}

となっており、各量子ビットにアダマール演算子による変換が行われます。それでは、この回路を適用した後、この量子ビット群は、どのような状態になっているでしょうか? 個々の量子ビットを個別に見ると、すべてが \displaystyle  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle}) という同じ状態になっているというだけですが、実はそうではありません。実際には、4つの量子ビットはテンソル積でつながった、1つの複素ベクトルなのです。

 \displaystyle  {\mid \psi'\rangle} = \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle})\otimes  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle})\otimes  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle})\otimes  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle}) --- (1)

したがって、この状態は、

 {\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle},\ {\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 1\rangle},\cdots,{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}

という、2^4 個の基底ベクトルで展開することができます。実際に、テンソル積を展開すると、次の結果が得られます。((1) を展開する作業は、各因子から {\mid 0\rangle}{\mid 1\rangle} のどちらかを選択して積を取る操作と同じであることに注意してください。)

 \displaystyle  {\mid \psi'\rangle} = \frac{1}{\sqrt{2}^4}\left(
{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}+{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 0\rangle}\otimes{\mid 1\rangle}+\cdots+{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}\otimes{\mid 1\rangle}
\right)

つまり、この状態は、すべての基底ベクトルを同じ重みで含んでおり、「あらゆるスピンの組み合わせ」の重ね合わせ状態となっているのです。もともと、この回路の初期状態は、すべての量子ビットが {\mid 0\rangle} という単純な状態だったのが、いとも簡単に、あらゆる状態の組み合わせに変わってしまいました。この後、さらに演算をほどこした場合、(量子回路の演算は、すべて線形演算ですので)、2^4 種類の状態に対する演算がすべて自動的に行われていくことになります。

この例からわかるのは、量子計算機においては、ある1つの「状態」について、さまざまな見方ができるという事です。この例であれば、

「すべてのスピンが \displaystyle  \frac{1}{\sqrt{2}}({\mid 0\rangle}+{\mid 1\rangle}) という状態」=「あらゆるスピンの組み合わせの重ね合わせ状態」

という、直感的には非自明な関係性があるという事です。そして、その結果として、個々の量子ビットに対する操作が、全体の状態に対して、思いもよらぬ影響を及ぼすことがありえます。量子アルゴリズムを駆使した計算処理を考える際は、古典計算機のプログラムとは、まったく違った「頭の使い方」が求められることが伝わったでしょうか。。。

次回予告 まとめ

本シリーズは、「量子計算(量子回路)の考え方を理解するために最低限必要な量子力学の知識を(それなりに納得感のある形で)うまいこと導入する方法」がテーマで、量子回路そのものの説明はスコープ外ですので、最後の量子回路の説明は、ちょっと中途半端だったかもしれません。が、まずは、次の点はなんとか伝えられたと思います。(量子演算を実行した後に行う、最後の観測処理の話が抜けているような気もしますが・・・)

・n 量子ビットの状態は、「2^n 次元の複素ベクトル」で表される。また、n 量子ビットに対する演算処理は、複素ベクトルに対する線形演算、すなわち、2^n\times 2^n のユニタリ行列で表される。

・行列の代わりに、ブラケット記号とテンソル積を用いて演算を表すこともできる。特にこの形式を用いると、1量子ビット、もしくは、2量子ビットにまたがる演算を簡明に表記できる。

・テンソル積の記法で表した演算処理を並べて図にしたものが、量子回路図にほかならない。

この後は、現実の量子計算機で用いられるさまざまなゲート演算、そして、それらを組み合わせたアルゴリズムを学んでいくのがよいかと思います。