はじめての量子計算機


ゲート型の量子計算機が動く仕組みに関連する要点をざっくり説明を試みる。私自身は量子コンピューターまたは量子計算理論の初学者ということもあり、いいかげんな説明や間違っていることもあるのであしからず。

\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} 

Qビットの表し方

あるひとつの量子をひとつのビットとみなして計算機回路を作ろうというのがベースのアイデア。
ひとつの量子ビット(Qビット)は0の場合と1の場合の2通りのどちらかの値をとるので、それぞれを以下のような列ベクトルで定義する(これは単に表記だけの問題ではなくて物理的な意味があるのですが、まあそれはいま考えなくても説明はできるかなと。こんな感じでどんどんはしょって説明が続く)

\ket{0} = \left(\array{1 \\\ 0}\right) \
\ket{1} = \left(\array{0 \\\ 1}\right) \\\ 

$\ket{0}$、 $\ket{1}$などの記号はケットと呼ばれ、計算するのにいろいろ便利だからある記号ではあるが、ここではそんなものか程度の認識で問題なし。

ここでさっそく量子の振る舞いを表す重要なポイントを説明。Qビットは0の場合と1の場合のどちらかをとるという話だったが、それはそのQビットを観測した瞬間から後の話で、その前は0でもあり1でもある状態にあるという。これを量子の重ね合わせというのだが、なんでそんなことになるの?というのは量子論の深い沼にはまっていきそうなのでここでは考えない。
さて、この状態はどのように表現できるだろうか?とりあえず0でも、1でもというのだから、$\psi$をQビットとすると例えば以下のような感じはどうだろう。

\ket{\psi} = \frac{1}{\sqrt{2}}\ket{0} + \frac{1}{\sqrt{2}}\ket{1} \tag{1} 

で、実際これが観測前のひとつの量子の状態を表すひとつの形となる。

一般に単一のQビットの状態を以下のように表す。

\ket{\psi} = \alpha\ket{0} + \beta\ket{1}  \tag{2}\\\

ただし、以下の条件付き。

|\alpha|^2 + |\beta|^2 = 1 \tag{3}\\\

$\alpha$、$\beta$には重要な意味があり、それぞれの絶対値を2乗したものがそれぞれ観測後に0または1をとる確率となっている。ここでも、なんで確率になるの?というのはかたくなにここでは考えない。量子の振る舞いがそうなっているからということだけと割り切る。この$\alpha$、$\beta$を確率振幅という。式(1)で言えば、$|1/\sqrt{2}|^2 + |1/\sqrt{2}|^2 = 1$となっており、確かに条件を満たす(合計1となるため確率の定義からしても正しい)。つまり0になるか1になるかはそれぞれ確率が1/2なので半々となる。Qビットの状態$\psi$は式(2)と(3)の条件を満たすのであればなんでもよくさまざまな値をとる可能性があるということになる。従来の計算機のビットは0か1のどちらかの値しかとらないことを考えるとQビットはそれとはかなり様子が異なる。 これで、単一のQビットの表し方は説明終了。加えていうなら、式(2)の$\ket{\psi}$は一般に複素ベクトルになる。量子の状態をモデル化できるためではあるが、確率振幅や、実際に量子計算機に必要な量子に対する位相の操作(あとで説明)で関係してくるので言及したが今はおいておく。

複数Qビットの表し方- 量子もつれ

さて、単一Qビットは前節で説明した通りで、かなり直感と反する現象だが数学的にモデル化できるという点で驚きではあるが、これだけではできることがかなり限定的。量子計算機の真髄は前節で説明した量子重ね合わせと、これから説明する量子もつれ状態を利用する点になる。
量子もつれ状態にある複数の量子は単一の量子を複数並べただけでは表すことができない状態を作り出す。いま、$a, b$2つのQビットの場合を考える。
$a$、$b$のQビットの状態は単体でそれぞれ以下のように定義。

\begin{align}
&\ket{\psi_a} = c_0\ket{a_0} + c_1\ket{a_1} \\\ 
&\ket{\psi_b} = d_0\ket{b_0} + d_1\ket{b_1} \\\
\end{align}

この二つの状態のテンソル積をとる。

\begin{align}
&\ket{\psi_a}\otimes\ket{\psi_b} \\
&= (c_0\ket{a_0} + c_1\ket{a_1})\otimes(d_0\ket{b_0} + d_1\ket{b_1}) \\
&= c_0d_0\ket{a_0}\otimes\ket{b_0} 
+ c_0d_1\ket{a_0}\otimes\ket{b_1} 
+ c_1d_0\ket{a_1}\otimes\ket{b_0} 
+ c_1d_1\ket{a_1}\otimes\ket{b_1} \\
\end{align} 

テンソル積の記号を省略して上記式をすっきりさせる。

\ket{\psi_a}\ket{\psi_b} 
= c_0d_0\ket{a_0}\ket{b_0} 
+ c_0d_1\ket{a_0}\ket{b_1} 
+ c_1d_0\ket{a_1}\ket{b_0} 
+ c_1d_1\ket{a_1}\ket{b_1} \\\

ここで、

c_0d_0 = \alpha, c_0d_1 = \beta, c_1d_0 = \gamma, c_1d_1 = \delta

に置き換える。

\ket{\psi_a}\ket{\psi_b} 
= \alpha\ket{a_0}\ket{b_0} 
+ \beta\ket{a_0}\ket{b_1} 
+ \gamma\ket{a_1}\ket{b_0} 
+ \delta\ket{a_1}\ket{b_1} \tag{4}\\\

ケット記号をつなげて以下で表せる。これが2つのQビットの状態を表す一般的な式となる。

\ket{\psi} 
= \alpha\ket{a_0b_0} 
+ \beta\ket{a_0b_1} 
+ \gamma\ket{a_1b_0} 
+ \delta\ket{a_1b_1} \tag{5}\\\ 

ただし、以下の条件付き。

|\alpha|^2 + |\beta|^2 + |\gamma|^2 + |\delta|^2 = 1 \tag{6}\\\

$\alpha, \beta, \gamma, \delta$はおなじみの確率振幅だ。式(5)、(6)のこの状態は量子のもつれと呼ばれる状態を表している。4つの状態がそれぞれの確率振幅によって同時に存在しうる状態だ。さらに2つのQビットのうちどちらかを観測すると確率振幅にしたがって値が決まり、同時にもう片方のQビットの値も確定する(ちなみに、この2つのQビットは物理的にどれだけ距離が離れていてももつれ現象が起こるということだ。なんでかはわからないので聞かないで。あと、物理的にどうやってもつれ状態を作るのかも知らない)ただし、この状態は正確には”もつれていない”状態の場合も含まれる。その場合は上記のような片方が片方に影響を与えるような現象は発生しない。 

直感的には一つ目のQビットの重ね合わせと、二つ目のQビットの重ね合わせが同時に混ぜ合わさった状態という感じになる。
数学的な言い方をすれば、この2つのQビットの状態というのはそれぞれのテンソル積(2階のテンソル)であたえられ、ベクトルは4次元となる。
以上の点から2つのQビットを用意できれば$2^2$の計算を一度でやれるポテンシャルがあるということだから、これはすごいことだ!2つだといまいち凄さが伝わらないが、たとえば10個のQビットあれば、$2^{10}=1024$の計算を一度に実行できるポテンシャルがあるということになり、もつれ状態を保つことができる前提でビット数を増すことにより取り得る状態は指数関数的に増えていく。従来の計算機のビットは量子現象を利用しておらずこうはいかない。

観測と対象となる状態ペア

さて、それでは量子もつれ状態にある2つのQビットをそれぞれ観測した際にどうなるか?を見ていきたい。式(4)にならって以下の具体的な状態を想定する。

\ket{\psi_a}\ket{\psi_b} 
= \frac{1}{2}\ket{a_0}\ket{b_0} 
+ \frac{1}{2}\ket{a_0}\ket{b_1} 
+ \frac{1}{\sqrt{2}}\ket{a_1}\ket{b_0} 
+ 0\ket{a_1}\ket{b_1} \\\

まず、Qビット$a$に関して観測を行うため、$a$に関係する$\ket{0}$側と$\ket{1}$側に該当するものをそれぞれまとめるように上記式を書き換える。 

\begin{align}
&\frac{1}{2}\ket{a_0}\ket{b_0} 
+ \frac{1}{2}\ket{a_0}\ket{b_1} 
+ \frac{1}{\sqrt{2}}\ket{a_1}\ket{b_0} 
+ 0\ket{a_1}\ket{b_1} \\
&= \ket{a_0} \left( \frac{1}{2}\ket{b_0}+\frac{1}{2}\ket{b_1}\right) + \ket{a_1}\left( \frac{1}{\sqrt{2}}\ket{b_0} + 0\ket{b_1}\right) \tag{7}
\end{align}

括弧内をQビットの条件を満たす形にするため、以下のように変形。

\begin{align}
&\ket{a_0} \left( \frac{1}{2}\ket{b_0}+\frac{1}{2}\ket{b_1}\right) + \ket{a_1}\left( \frac{1}{\sqrt{2}}\ket{b_0} + 0\ket{b_1}\right) \\
&=\frac{1}{\sqrt{2}}\ket{a_0} \left( \frac{1}{\sqrt{2}}\ket{b_0}+\frac{1}{\sqrt{2}}\ket{b_1}\right) + \frac{1}{\sqrt{2}}\ket{a_1}\left( 1\ket{b_0} + 0\ket{b_1}\right)
\end{align}

もう一度、最初の状態から最後状態をあらためて示す。

\begin{align}
&\frac{1}{2}\ket{a_0}\ket{b_0} 
+ \frac{1}{2}\ket{a_0}\ket{b_1} 
+ \frac{1}{\sqrt{2}}\ket{a_1}\ket{b_0} 
+ 0\ket{a_1}\ket{b_1} \\\
&= \frac{1}{\sqrt{2}}\ket{a_0} \left( \frac{1}{\sqrt{2}}\ket{b_0}+\frac{1}{\sqrt{2}}\ket{b_1}\right) + \frac{1}{\sqrt{2}}\ket{a_1}\left( 1\ket{b_0} + 0\ket{b_1}\right) \tag{8}
\end{align}

$\ket{a_0}, \ket{a_1}$の前の確率振幅が示す通り、$a$は1/2の確率0または1になる。$a$を観測して0であった場合、上の状態は、

\frac{1}{\sqrt{2}}\ket{a_0} \left( \frac{1}{\sqrt{2}}\ket{b_0}+\frac{1}{\sqrt{2}}\ket{b_1}\right) 

となっている。この状態はもはや量子もつれは発生していない。$b$は確率1/2で0または1になる。
$a$を観測して1であった場合、上の状態は、

\frac{1}{\sqrt{2}}\ket{a_1}\left( 1\ket{b_0} + 0\ket{b_1}\right)

となっていて、同様に状態はもはや量子もつれは発生しいない。$b$はかならず0になる。$a$の観測の違いによって$b$の観測が異なるのだからもつれている。

次に、Qビット$b$を観測する場合も同様に$b$に関して式変形すると以下になる。

\begin{align}
&\frac{1}{2}\ket{a_0}\ket{b_0} 
+ \frac{1}{2}\ket{a_0}\ket{b_1} 
+ \frac{1}{\sqrt{2}}\ket{a_1}\ket{b_0} 
+ 0\ket{a_1}\ket{b_1} \\
&= \left( \frac{1}{2}\ket{a_0}+\frac{1}{\sqrt{2}}\ket{a_1} \right)\ket{b_0} + \left( \frac{1}{2}\ket{a_0}+0\ket{a_1} \right)\ket{b_1} \tag{9}\\

&= \left(\frac{1}{\sqrt{3}}\ket{a_0} + \frac{\sqrt{2}}{\sqrt{3}}\ket{a_1} \right)\frac{\sqrt{3}}{2}\ket{b_0} + \left( 1\ket{a_0}+0\ket{a_1} \right)\frac{1}{2}\ket{b_1} \tag{10} 
\end{align} 

Qビット$b$の観測で3/4で0に、1/4で1となる。$b$を観測するともつれ状態は解消され、Qビット$b$を観測し0だった場合は$a$は1/3で0、2/3で1となる。$b$が1だった場合は、$a$はかならず0となる。$b$の観測の違いによって$a$の観測が異なるのだからもつれている。

注目する点として(7)、(9)式をみると一定のパターンがあるのがわかる。
$a$の観測の際には、(7)式の右辺の括弧内に注目し、(7)式の左辺で該当するところをみるとそれぞれの項の隣り合った同士をまとめて、その単位で観測を実行している。右辺の1項目が$a$が0である場合、2項目が1である場合になっている。
$b$の観測の際には、(9)式の右辺の括弧内に注目し、(9)式の左辺で該当するところをみるとそれぞれの項から1つ飛ばして2番目の要素同士をまとめて、その単位で観測を実行している。右辺の1項目が$b$が0である場合、2項目が1である場合になっている。

以上のことから、(以下のまとめが言いたいがためにどうしても避けて通れないかったため長々とした説明になってしまったが)まとめるとそれぞれのQビットを観測した時にそのQビットがどの程度で0となり、どの程度で1となるかは、それぞれの確率振幅の値を使って以下のように計算する。
2つのQビットの一般式(4)に戻って、 

\ket{\psi_a}\ket{\psi_b} 
= \alpha\ket{a_0}\ket{b_0} 
+ \beta\ket{a_0}\ket{b_1} 
+ \gamma\ket{a_1}\ket{b_0} 
+ \delta\ket{a_1}\ket{b_1}\\\

一つ目のQビット$a$を観測した場合、式(4)の$\alpha$、$\gamma$の2乗の合計が0となる確率、$\beta$、$\delta$の2乗の合計が1となる確率となる。
二つ目のQビット$b$を観測した場合、式(4)の$\alpha$、$\gamma$の2乗の合計が0となる確率、$\beta$、$\delta$の2乗の合計が1となる確率となる。 
このようにどのQビットを観測するかによって読み出し方が異なることになる。これは$\ket{0}$側と$\ket{1}$側を構成するペアとなる状態がこれから説明するルールにしたがって決めれる。一つ目のQビットの観測の場合は、式(4)で隣り合った同士がペアになっている。二つ目のQビットの観測の場合は、式(4)でひとつ飛ばしたもの(2つ先)同士がペアになっている。
そして、一般的にも量子もつれ状態にあるN個のQビットを使ったは回路には$2^N$の状態があり、状態ペアはn番目のQビットについて$2^{n-1}$だけ飛ばした(隔てた)もの同士がペアになる。
たとえば、3つのQビットの量子回路では状態が$2^3$つまり8つの状態があり、その状態で三つ目のキュービットを観測した場合、$2^{2}=4$だけ飛ばした同士が操作対象のペアとなる。つまり以下のような感じになる。
3つのQビットの状態$\psi$が以下のようになっており、

\ket{\psi} = c_0\ket{000}+c_1\ket{001}+c_2\ket{010}+c_3\ket{011}
\\+c_4\ket{100}+c_5\ket{101}+c_6\ket{110}+c_7\ket{111}  \tag{11}\\\ 

それぞれのQビットを観測する場合のペアを列挙すると、
一つ目のQビットを観測する場合のペアは、(下段はペアごとに色でわけたイメージ)
$(c_0\ket{000}, c_1\ket{001})$、$(c_2\ket{010}, c_3\ket{011})$、$(c_4\ket{100}, c_5\ket{101})$、$(c_6\ket{110}, c_7\ket{111})$
■ ■ ■ ■ ■ ■ ■ ■

二つ目のQビットを観測する場合のペアは、
$(c_0\ket{000}, c_2\ket{010})$、$(c_1\ket{001}, c_3\ket{011})$、$(c_4\ket{100}, c_6\ket{110})$、$(c_5\ket{101}, c_7\ket{111})$ 

三つ目のQビットを観測する場合のペアは、
$(c_0\ket{000}, c_4\ket{100})$、$(c_1\ket{001}, c_5\ket{101})$、$(c_2\ket{010}, c_6\ket{110})$、$(c_3\ket{011}, c_7\ket{111})$
となる。

Qビットの数が増えた場合もこのルールでペアを作ることにより、観測するQビットの値を取り出すことができる。
じつは、この状態ペアというのは観測という操作だけでなく、全ての種類のQビットへの操作において同様に考えることができる。その操作についてはあとで説明していくことになるため、操作時に状態ペアが対象になるということだけ覚えておくとあとの理解が早くなる。

さて、いったん今回はこのくらいにしておいて、次回は具体的なゲートの作り方の解説をしていく予定。といっても、典型的な量子計算機の表面上のエッセンスはほぼ説明してしまった気がする。

量子回路シミュレーター

量子計算機の勉強をかねて作成したゲート型の量子回路シュミレーターをGithubに上げてあります。これに関しては別途記事にしたいと思っていますが、内容はここで解説した、またはこれから解説していくそのものであり、記事の内容を実際に動かしてみて確認しながら進められると思います。
GoQKit - Quantium Circuit Simulator in Golang