量子コンピュータの基礎(2)

## この記事に関して
前回の続きで今回は量子ゲートについて説明しようと思います。

## 量子ゲート
量子状態にかける行列のことをゲートと言います。
量子ゲートを施すことで量子状態を自由に変えることができます。

主に使う行列は以下の通りです。
・X、Y、Zゲート
・Hゲート
・S、S†、T、T†ゲート
・RX、RY、RZゲート
・CX、CY、CZ、CRX、CRY、CRZ、Swapゲート
・CCXゲート（Toffoliゲート）
これらの行列で量子状態がどう変換されるのか説明します。

## X、Y、Z ゲート
``` math
X = \left( \begin{array}{cc} 0 & 1\\ 1 & 0 \end{array} \right),
Y = \left( \begin{array}{cc} 0 & -i\\ i & 0 \end{array} \right),
Z = \left( \begin{array}{cc} 1 & 0\\ 0 & -1 \end{array} \right)\\
```
これを施すと

``` math
X:\left\{\begin{array}{l}\left|0\right>→\left|1\right> \\
\left|1\right>→\left|0\right>\end{array}\right.,
Y:\left\{\begin{array}{l}\left|0\right>→i\left|1\right> \\
\left|1\right>→-i\left|0\right>\end{array}\right.,
Z:\left\{\begin{array}{l}\left|0\right>→\left|0\right> \\
\left|1\right>→-\left|1\right>\end{array}\right.
```
と状態を変えることができます。
Xゲートは 0 と 1 を入れ替える古典の NOT ゲートに当たります。
Zゲートは 1 だけ符号を変えることができるので観測するときに何かしら使えそうです。

この二つは非常によく使います。

## H ゲート
量子状態の重ね合わせに必要なゲートです。

``` math
H = \frac{1}{\sqrt2} \left( 
\begin{array}{cc} 1 & 1\\ 1 & -1 \end{array} \right),
H:\left\{\left|0\right>→\frac{1}{\sqrt2}\left|0\right>+
\frac{1}{\sqrt2}\left|1\right>,
\left|1\right>→\frac{1}{\sqrt2}\left|0\right>-
\frac{1}{\sqrt2}\left|1\right>\right.
```
見てわかる通り $\left|0\right>,\left|1\right>$ をそれぞれ重ね合わせの状態に変換しています。
これもとても重要なゲートです。
普段はアダマールゲートと言います。(Hadamard)

## S、S†、T、T†ゲート
bloch球の横回転を考えているゲートです。

``` math
S = \left( \begin{array}{cc} 1 & 0\\ 0 & i \end{array} \right),
S^{\dagger} = \left( \begin{array}{cc} 1 & 0\\ 0 & -i \end{array} \right),
T = \left( \begin{array}{cc} 1 & 0\\ 0 & e^{i\frac{\pi}{4}} \end{array} \right),
T^{\dagger} = \left( \begin{array}{cc} 1 & 0\\ 0 & -e^{i\frac{\pi}{4}} \end{array} \right)
```
これを施すと

``` math
S:\left\{\begin{array}{l}\left|0\right>→\left|0\right> \\
\left|1\right>→i\left|1\right>\end{array}\right.,
S^\dagger:\left\{\begin{array}{l}\left|0\right>→\left|0\right> \\
\left|1\right>→-i\left|1\right>\end{array}\right.,
T:\left\{\begin{array}{l}\left|0\right>→\left|0\right> \\
\left|1\right>→e^{i\frac{\pi}{4}}\left|1\right>\end{array}\right.,
T^\dagger:\left\{\begin{array}{l}\left|0\right>→\left|0\right> \\
\left|1\right>→-e^{i\frac{\pi}{4}}\left|1\right>\end{array}\right.
```
となります。

見てわかる通り $\left|1\right>$ のみ変換しているのがわかります。
これはbloch球で述べた式の複素数の部分を動かしています。
この複素数の部分を動かすゲートを位相ゲートとも呼びます。

## Rx、Ry、Rz ゲート
bloch球を x, y, z それぞれの軸周りに回転するゲートです。

``` math
Rx(\theta) = \left( \begin{array}{cc} \cos\left(\frac{\theta}{2}\right) &
-i\sin\left(\frac{\theta}{2}\right)\\
-i\sin\left(\frac{\theta}{2}\right) &
\cos\left(\frac{\theta}{2}\right) \end{array} \right),
Ry(\theta) = \left( \begin{array}{cc} \cos\left(\frac{\theta}{2}\right) &
-\sin\left(\frac{\theta}{2}\right)\\
\sin\left(\frac{\theta}{2}\right) &
\cos\left(\frac{\theta}{2}\right) \end{array} \right),
Rz(\theta) = \left( \begin{array}{cc} e^{-i\frac{\theta}{2}} & 0\\ 0 & e^{i\frac{\theta}{2}} \end{array} \right)
```
各軸周りに回転できるのでbloch球の全ての位置はこのゲートの組み合わせで作ることができます。

## CX、CY、CZ、CRx、CRy、CRz ゲート
Controll ゲートは2量子ビットを用います。
これらは1ビット目が $\left|1\right>$ のときに2ビット目を変換させるゲートです。
例としてよく使う CXゲートを紹介します。

``` math
CX = 
\left( \begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0 \\
\end{array} \right)
=
\left( \begin{array}{ccc}
1 & 0 & \begin{array}{cc}0 & 0\end{array} \\
0 & 1 & \begin{array}{cc}0 & 0\end{array} \\
\begin{array}{cc}0 \\ 0\end{array} & \begin{array}{cc}0 \\ 0\end{array} & \Large{X}\\
\end{array} \right),
CX:\left\{\begin{array}{l}
\left|0\right>\otimes\left|0\right>→\left|0\right>\otimes\left|0\right> \\
\left|0\right>\otimes\left|1\right>→\left|0\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|0\right>→\left|1\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|1\right>→\left|1\right>\otimes\left|0\right>
\end{array}\right.
```
見てわかる通り1ビット目が $\left|1\right>$ のときに2ビット目にXゲートを施しているのがわかります。
それ以外の Controll ゲートも1ビット目が $\left|1\right>$ のときに2ビット目にそれぞれのゲートを施してます。

## Swap ゲート
Swap ゲートは2量子ビットを交換するゲートです。

``` math
\text{SWAP} = 
\left( \begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
\end{array} \right),
\text{SWAP}:\left\{\begin{array}{l}
\left|0\right>\otimes\left|0\right>→\left|0\right>\otimes\left|0\right> \\
\left|0\right>\otimes\left|1\right>→\left|1\right>\otimes\left|0\right> \\
\left|1\right>\otimes\left|0\right>→\left|0\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|1\right>→\left|1\right>\otimes\left|1\right>
\end{array}\right.
```
このゲートで相手と情報を入れ替えることができます。

## CCX ゲート(Toffoliゲート)
上のControlゲートをさらに増やしたゲートです。

``` math
CCX = 
\left( \begin{array}{cccccccc}
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 0
\end{array} \right),
CCX:\left\{\begin{array}{l}
\left|0\right>\otimes\left|0\right>\otimes\left|0\right>→\left|0\right>\otimes\left|0\right>\otimes\left|0\right> \\
\left|0\right>\otimes\left|0\right>\otimes\left|1\right>→\left|0\right>\otimes\left|0\right>\otimes\left|1\right> \\
\left|0\right>\otimes\left|1\right>\otimes\left|0\right>→\left|0\right>\otimes\left|1\right>\otimes\left|0\right> \\
\left|0\right>\otimes\left|1\right>\otimes\left|1\right>→\left|0\right>\otimes\left|1\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|0\right>\otimes\left|0\right>→\left|1\right>\otimes\left|0\right>\otimes\left|0\right> \\
\left|1\right>\otimes\left|0\right>\otimes\left|1\right>→\left|1\right>\otimes\left|0\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|1\right>\otimes\left|0\right>→\left|1\right>\otimes\left|1\right>\otimes\left|1\right> \\
\left|1\right>\otimes\left|1\right>\otimes\left|1\right>→\left|1\right>\otimes\left|1\right>\otimes\left|0\right>
\end{array}\right.
```
行列の右下にXゲートが入っていることがわかります。
これは1ビット目と2ビット目がともに $\left|1\right>$ ならば3ビット目にXゲートを施します。
よく使うので別名Toffoliゲートとも呼ばれます。

行列を大きくして同様のことをすると複数ビットのControllゲートを作ることができます。

## まとめ
量子状態はゲートで操作できる。