量子コンピュータと量子ゲートと私

# はじめに

[IBM Quantum Experience](http://www.research.ibm.com/quantum/)が公開され、夢のコンピュータである量子コンピュータがクラウド上で触れる様になりました。
ところが、量子コンピュータはまだまだ抽象化されておらず、我々が論理ゲートを組み合わせて加算器を作るように、単純なゲートを組み合わせて、数値やアルゴリズムを表現していくか探索するような段階です。
試そうと思っても、難しい記号や数式がわんさと出てくるのですが

「僕達だって量子コンピュータ触りたいんだもんっ」

ということで、IBM Quantum Experience を触れて楽しめるような、基礎的な部分を勉強がてらまとめてみました。

# 量子コンピュータとは

我々がいつも利用しているコンピュータを、量子コンピュータの[レトロニム](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%88%E3%83%AD%E3%83%8B%E3%83%A0%E4%B8%80%E8%A6%A7)として、古典的コンピュータ呼びます。
古典的コンピュータは、計算の基本単位を Bit (Binary unit) といい、それぞれの Bit が 0 か 1 の状態をとり、2 進数で数を保持して演算を行います。
Bit の状態は、電圧の On / Off で状態保持しています。

量子コンピュータとは、量子力学的な状態の[重ね合わせ](https://ja.wikipedia.org/wiki/%E9%87%8D%E3%81%AD%E5%90%88%E3%82%8F%E3%81%9B) (Superposition) を用いて、並列性を実現するコンピュータ。
量子コンピュータは、計算の基本単位を Qubit (Quantum bit) とよばれる量子ビットを用い、それぞれの量子ビットが 0 か 1 になる__確率を保持__して演算を行います。
量子ビットの状態は、超伝導素子と呼ばれる[ジョセフソン接合](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%82%BB%E3%83%95%E3%82%BD%E3%83%B3%E5%8A%B9%E6%9E%9C)を利用した、右回りの電流と左回りの電流が相互に混ざり流れ合う量子的状態を利用して保持することが多く採用されているようです。

# 量子ビット

古典的ビットは電圧の On / Off で状態を保持し、その特徴は

- 0 若しくは 1 を保持する
- コピーが出来る

となります。

一方、量子ビットは量子的状態を利用し、その特徴は

- 0 と 1 の重ねあわせた状態を保持する(計算的利便性から[複素振幅](http://www.cybernet.co.jp/optical/course/optics/opt04/opt04.html)が利用される)
- 不確定性原理によりコピー出来ない
- [量子もつれ](https://www.kyoto-su.ac.jp/project/st/st04_04.html) (Entanglement)

となります。

## 不確定性原理

我々が普段生活しているようなマクロな世界では、光の反射、若しくはレーダのような電磁波を利用して計測しますが、ミクロの世界で電磁波を利用すれば、そのエネルギーで粒子の運動不正確になり、影響を受けないようなエネルギーで観測すれば粒子の位置が不正確になってしまいます。
つまり、位置と運動量、または時間とエネルギーを正確には測定できません。

これにより、量子論では「観測」した時点のみが正しく、観測出来ない部分は不確定であると根本決められた原理です。

## 観測

不確定性原理により、量子ビットは「観測」されるまで状態が決定されず、「観測」されることによっていずれかの状態に収縮されます。
「観測」は量子コンピュータにおいては、演算の一つで不可逆です。

## 数式表現

私の様な、普段から数学に慣れ親しんでない者には、とても辛い表現 :innocent: ですが、頻出するので簡単な解説をします。 $\newcommand{\bra}[1]{\left\langle #1 \right|}\\newcommand{\ket}[1]{\left|#1 \right\rangle}\\newcommand{\braket}[2]{\left\langle #1 \middle|#2 \right\rangle}$

量子ビットは [ブラ-ケット記法](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9-%E3%82%B1%E3%83%83%E3%83%88%E8%A8%98%E6%B3%95) $\braket{\phi}{\psi}$ といわれる記法が用いられ、量子の状態をそれぞれ  $\ket{0},\ket{1}$ として表現し、量子ビットはこれらの状態が重ねあわさっているので、

- $\ket{\psi} = \alpha\ket{0}+\beta\ket{1}\quad(|\alpha|^2+|\beta|^2=1)$

と表され、この時 $\alpha$ は $\ket{0}$ の振幅、$\beta$ は $\ket{1}$ の振幅となります。
ここで、量子ビットを「観測」すると、$|\alpha|^2$ が $\ket{0}$ の確率、$|\beta|^2$ が $\ket{1}$ の確率となります。

つまり、量子ビットは $\alpha = 1,\beta = 0$ の場合 $\ket{0}$ の状態となり、 $\alpha = 0,\beta = 1$ の場合 $\ket{1}$ の状態となります。

## ブロッホ球

![](https://upload.wikimedia.org/wikipedia/commons/6/6b/Bloch_sphere.svg)

量子ビットの取る値は、虚数を含む長さ１のベクトルになっており、半径１の球面として表現できます。
北極を$\ket{0}$ベクトル、南極を$\ket{1}$ベクトルとし、位相を属性として加えたものをブロッホ球(Bloch sphere)といいます。

ブロッホ球はベクトルの縦の向きで$\ket{0}$か$\ket{1}$になる確率を表し、横の向きで位相を表します。
量子ビットは波のように、重なった時に強め合ったり、弱めあう性質があり、それを位相といいます。

# 量子ゲート

[論理ゲート](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%9B%9E%E8%B7%AF)は、古典コンピュータでの計算で、0 と 1 を電気的に表現したものを利用して論理演算を行います。

一方、量子ゲートとは、量子演算の演算子に対応する演算を行うもので、[ユニタリ行列](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%82%BF%E3%83%AA%E8%A1%8C%E5%88%97)と呼ばれる $U^\*=U=UU^\*=I\quad(I: 単位行列)$ の行列でなければなりません。

## 量子ゲートでの量子ビット

量子ゲートは上述の通り、ユニタリ行列であり $k$ 個のキュービットを演算するのに $2^k \times 2^k$ の行列になります。
量子ゲートの作用は、量子状態を表すベクトルとのゲートを表す行列を乗算することによって実現されるので、演算を行うために量子ビットを以下のように表現します。

```math
\alpha\ket{0}+\beta\ket{1}=
\begin{bmatrix}
a\\b\\
\end{bmatrix}
```

つまり、それぞれの状態は以下の行列で表せられます

```math
\ket{0}=
\begin{pmatrix}
1\\
0\\
\end{pmatrix}
,
\ket{1}=
\begin{pmatrix}
0\\
1\\
\end{pmatrix}
```

このようにベクトルに変換して量子ゲートの演算を行っていきます。

今回は、[IBM Quantum Computing](http://www.research.ibm.com/quantum/)で利用するいくつかのゲートを紹介します。

## Pauli-X ゲート

```math
X=
\begin{bmatrix}
0 & 1\\
1 & 0
\end{bmatrix}
```

Pauil-X ゲートは上記の行列で表され、ブロッホ球上の X 軸の回転を表現します。

```math
\begin{align}
\begin{pmatrix}
1\\
0
\end{pmatrix}
X&=
\begin{pmatrix}
0\\
1
\end{pmatrix}
\\
\begin{pmatrix}
0\\
1
\end{pmatrix}
X&=
\begin{pmatrix}
1\\
0
\end{pmatrix}
\end{align}
```

## Pauli-Y ゲート

```math
Y=
\begin{bmatrix}
0 & -i\\
i & \phantom{-}0
\end{bmatrix}
```

Pauil-Y ゲートは上記の行列で表され、ブロッホ球上の Y 軸の回転を表現します。
それぞれの量子ビットは $\ket{0}Y=i\ket{1}$、$\ket{1}Y=-i\ket{0}$ と変換されます

```math
\begin{align}
\begin{pmatrix}
1\\
0
\end{pmatrix}
Y&=
\begin{pmatrix}
0\\
i
\end{pmatrix}
\\
\begin{pmatrix}
0\\
1
\end{pmatrix}
Y&=
\begin{pmatrix}
-i\\
\phantom{-}0
\end{pmatrix}
\end{align}
```

## Pauli-Z ゲート

```math
Z=
\begin{bmatrix}
1 & \phantom{-}0\\
0 & -1
\end{bmatrix}
```

Pauil-Z ゲートは上記の行列で表され、ブロッホ球上の Z 軸の回転を表現します。
それぞれの量子ビットは $\ket{0}Z=\ket{0}$、$\ket{1}Z=\ket{-1}$ と変換されます

```math
\begin{align}
\begin{pmatrix}
1\\
0
\end{pmatrix}
Z&=
\begin{pmatrix}
1\\
0
\end{pmatrix}
\\
\begin{pmatrix}
0\\
1
\end{pmatrix}
Z&=
\begin{pmatrix}
0\\
-1
\end{pmatrix}
\end{align}
```

## Hadamard ゲート

```math
H=\dfrac{1}{\sqrt{2}}
\begin{bmatrix}
1 & \phantom{-}1\\1 & -1
\end{bmatrix}
```

Hadamard ゲートは上記の行列で表され、量子ビットの重ね合わせ状態を表現することができます。
それぞれの量子ビットは $\ket{0}H=\dfrac{\ket{0}+\ket{1}}{\sqrt{2}}$、 $\ket{1}H=\dfrac{\ket{0}-\ket{1}}{\sqrt{2}}$ と変換されます。

```math
\begin{align}
\begin{pmatrix}
1\\
0
\end{pmatrix}
H&=
\dfrac{1}{\sqrt{2}}
\begin{pmatrix}
1\\
1
\end{pmatrix}
\\
\begin{pmatrix}
0\\
1
\end{pmatrix}
H&=
\dfrac{1}{\sqrt{2}}
\begin{pmatrix}
\phantom{-}1\\
-1
\end{pmatrix}
\end{align}
```

## Phase shift ゲート

```math
S=
\begin{bmatrix}
1 & \phantom{-}0\\0 & \phantom{-}i
\end{bmatrix}
\quad
S^\dagger=
\begin{bmatrix}
1 & \phantom{-}0\\0 & -i
\end{bmatrix}
```

Phase shift ゲートは上記の行列で表され、量子ビットの状態間の位相をずらす事が可能です。
理想的なゲートは位相の角度を指定できるのですが、今回は[IBM Quantum Computing](http://www.research.ibm.com/quantum/)で位相の反転を行うゲートを紹介します。
それぞれの量子ビットは $\ket{0}S=\ket{0}$、$\ket{1}S=i\ket{1}$ と変換されます。

```math
\begin{align}
\begin{pmatrix}
1\\
0
\end{pmatrix}
S&=
\begin{pmatrix}
1\\
0
\end{pmatrix}
\\
\begin{pmatrix}
0\\
1
\end{pmatrix}
S&=
\begin{pmatrix}
0\\
i
\end{pmatrix}
\end{align}
```

Phase shift ゲートを介しても、量子ビットに変化が無いように見えますが、量子状態の位相が変化していることがブロッホ球上で確認できます。
Phase shift ゲートを介し Hadamard ゲートに入力することで、複雑な位相を表現することが出来ます。

# おわりに

量子コンピュータはまだまだ、専門性が高く、我々にとっては理解しにくい事が多いです。
しかし、「量子を組み合わせて確率を変えていく」事で表現するという新しい方法が、誕生日に新しいジグソーパズル買ってもらったように楽しいですね。

IBM Quantum Experience　以外にもシミュレータはあるので、量子とはどんな性質を持っているのか知りたい方は是非試してみてください。

- [Quantum Computing Playground](http://www.quantumplayground.net/#/home): 擬似言語で量子ビットを操作でき、結果の表現方法も多種多様
- [Quantum Circuit Simulator](http://www.davyw.com/quantum/): IBM Quantum Experience のようにゲートを組み合わせたシミュレーションが可能

また僕自身が理解できるような事があれば、追記や修正をしていこうと思います。

# 参考

- [量子コンピュータ研究の最前線](http://www.ntt.co.jp/journal/1206/files/jn201206008.pdf)
- [線形空間に対する直和・直積・テンソル積に関するまとめ](http://kuee.vividcode.info/d/doc/20100417.pdf)
- [不確定性原理 - 哲学的な何か、あと科学とか](http://www.h5.dion.ne.jp/~terun/doc/fukakutei.html)
- [DSAS開発者の部屋:JavaScriptでつくる量子コンピューター](http://dsas.blog.klab.org/archives/52023039.html)
- [Quantum gate - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Quantum_gate)
- [√NOTで量子コンピュータ - 小人さんの妄想](http://d.hatena.ne.jp/rikunora/20081209/p1)
- [量子計算基礎.pdf](http://www.quest.is.uec.ac.jp/q-school/2010/archive/%E9%87%8F%E5%AD%90%E8%A8%88%E7%AE%97%E5%9F%BA%E7%A4%8E.pdf)
- [位相とは - スーパーサイエンスガール](http://dreistein.hatenablog.com/entry/2015/01/06/080000)