はじめての量子計算機

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

```math
\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通りのどちらかの値をとるので、それぞれを以下のような列ベクトルで定義する（これは単に表記だけの問題ではなくて物理的な意味があるのですが、まあそれはいま考えなくても説明はできるかなと。こんな感じでどんどんはしょって説明が続く）

```math
\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ビットとすると例えば以下のような感じはどうだろう。

```math
\ket{\psi} = \frac{1}{\sqrt{2}}\ket{0} + \frac{1}{\sqrt{2}}\ket{1} \tag{1} 
```
で、実際これが観測前のひとつの量子の状態を表すひとつの形となる。

一般に単一のQビットの状態を以下のように表す。
 
```math
\ket{\psi} = \alpha\ket{0} + \beta\ket{1}  \tag{2}\\\
```

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

```math
|\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$２つのQビットの場合を考える。
$a$、$b$のQビットの状態は単体でそれぞれ以下のように定義。

```math
\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}
```
この二つの状態の**テンソル積**をとる。

```math
\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} 
```
テンソル積の記号を省略して上記式をすっきりさせる。

```math
\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} \\\
```
ここで、

```math
c_0d_0 = \alpha, c_0d_1 = \beta, c_1d_0 = \gamma, c_1d_1 = \delta
```
に置き換える。

```math
\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}\\\
```

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

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

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

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

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

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

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

```math
\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}$側に該当するものをそれぞれまとめるように上記式を書き換える。　

```math
\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ビットの条件を満たす形にするため、以下のように変形。

```math
\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}
```

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

```math
\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であった場合、上の状態は、

```math
\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であった場合、上の状態は、

```math
\frac{1}{\sqrt{2}}\ket{a_1}\left( 1\ket{b_0} + 0\ket{b_1}\right)
```
となっていて、同様に状態はもはや量子もつれは発生しいない。$b$はかならず0になる。$a$の観測の違いによって$b$の観測が異なるのだからもつれている。

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

```math
\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)式の左辺で該当するところをみるとそれぞれの項の隣り合った同士をまとめて、その単位で観測を実行している。右辺の１項目が$a$が0である場合、2項目が1である場合になっている。
$b$の観測の際には、(9)式の右辺の括弧内に注目し、(9)式の左辺で該当するところをみるとそれぞれの項から1つ飛ばして２番目の要素同士をまとめて、その単位で観測を実行している。右辺の１項目が$b$が0である場合、2項目が1である場合になっている。 

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

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

```math
\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})$
<font color="red">■ ■</font> <font color="green">■ ■</font> <font color="orange">■ ■</font> <font color="blue">■ ■</font>

二つ目の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})$　
<font color="red">■</font> <font color="green">■</font> <font color="red">■</font> <font color="green">■</font> <font color="orange">■</font> <font color="blue">■</font> <font color="orange">■</font> <font color="blue">■</font>

三つ目の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})$ 
となる。
<font color="red">■</font> <font color="green">■</font> <font color="orange">■</font> <font color="blue">■</font> <font color="red">■</font> <font color="green">■</font> <font color="orange">■</font> <font color="blue">■</font>

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

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

##量子回路シミュレーター
量子計算機の勉強をかねて作成したゲート型の量子回路シュミレーターをGithubに上げてあります。これに関しては別途記事にしたいと思っていますが、内容はここで解説した、またはこれから解説していくそのものであり、記事の内容を実際に動かしてみて確認しながら進められると思います。
[GoQKit](https://github.com/takezo5096/goqkit) - Quantium Circuit Simulator in Golang
![](https://user-images.githubusercontent.com/21256885/108298718-c19f7d00-71e0-11eb-8113-ea0eec8a186c.png)