blueqatで量子ゲートの作成

## この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は[公式のチュートリアル](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)を元に作成しています。
今回は各量子ゲートを実装していきます。

## 量子ゲート
基本的な量子ゲートは[ここ](https://qiita.com/KeiichiroHiga/items/f5117efcf6a96c9d10b8)で確認してください。

## 1量子ゲート
### I, X, Y, Z, H, T, T†, S, S†
I, X, Y, Z, H, T, T†, S, S† ゲートはそれぞれ以下で実装できます。

| I | X | Y | Z | H | S | S†| T | T†|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|`i`|`x`|`y`|`z`|`h`|`s`|`sdg`|`t`|`tdg`|

#### 実装
以上のゲートを実装します。
###### I ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().i[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### X ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].m[:].run(shots=1000)

結果
Counter({'1': 1000})
```

###### Y ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().y[0].m[:].run(shots=1000)

結果
Counter({'1': 1000})
```

###### Z ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().z[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### H ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().h[0].m[:].run(shots=1000)

結果
Counter({'0': 511, '1': 489})
```

###### S ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().s[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### S† ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().sdg[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### T ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().t[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### T† ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().tdg[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

### Rx, Ry, Rz, U1, U2, U3
#### U1, U2, U3に関して
ゲートを汎用的に使うために U1, U2, U3 ゲートというものがあります。
U1, U2, U3 はそれぞれ以下のように表します。

``` math
U_1(\lambda) = \left(\begin{array}{cc}1 & 0 \\ 0 & e^{i\lambda} \end{array}\right),
U_2(\phi, \lambda) = \frac{1}{\sqrt2}\left(\begin{array}{cc}1 & -e^{i\lambda} \\ e^{i\phi} & e^{i(\lambda+\phi)} \end{array}\right),
U_3(\theta, \phi, \lambda) = \left(\begin{array}{cc}\cos\left(\frac{\theta}{2}\right) & -e^{i\lambda}\sin\left(\frac{\theta}{2}\right) \\ e^{i\phi}\sin\left(\frac{\theta}{2}\right) & e^{i(\lambda+\phi)}\cos\left(\frac{\theta}{2}\right) \end{array}\right)\\

U_1 \left\{ \begin{array}{c} \left|0\right> → \left|0\right> \\
\left|1\right> → e^{i\lambda}\left|1\right> \end{array} \right. ,
U_2 \left\{ \begin{array}{c} \left|0\right> → \frac{1}{\sqrt2}(\left|0\right> +
e^{i\phi} \left|1\right>) \\
\left|1\right> → -\frac{1}{\sqrt2}e^{i\lambda}(\left|0\right> -
e^{i\phi}\left|1\right>) \end{array} \right. ,
U_3 \left\{ \begin{array}{c} \left|0\right> → \cos\left(\frac{\theta}{2}\right)\left|0\right> +
e^{i\phi}\sin\left(\frac{\theta}{2}\right)\left|1\right> \\
\left|1\right> → -e^{i\lambda}(\sin\left(\frac{\theta}{2}\right)\left|0\right>-
e^{i\phi}\cos\left(\frac{\theta}{2}\right)\left|1\right>) \end{array} \right. 
```
U1ゲートは一般の位相ゲートとなります。
( $U_1(\pi) = Z, U_1(\frac{\pi}{2})=S, U_1(\frac{\pi}{4})=T$ )

U2ゲートでは、bloch球の $\theta → \pi/4, \phi → \phi$ の軸で $\pi$ 回転させるゲートです。
( $U_2(0,\pi) = H$ )

U3ゲートは、bloch球の $\theta → \theta/2, \phi → \phi$ の軸で $\pi$ 回転させるゲートになります。
$U_3\left|0\right>$ は bloch球の式に対応しています。
よってビットを任意の位置に移動させることができます。

$U_2, U_3$ の $\lambda$ に関して、

``` math
\left|\theta, \phi\right>_0 = \cos\left(\frac{\theta}{2}\right)\left|0\right> +
e^{i\phi}\sin\left(\frac{\theta}{2}\right)\left|1\right> \\
\left|\theta, \phi\right>_1 = \sin\left(\frac{\theta}{2}\right)\left|0\right> -
e^{i\phi}\cos\left(\frac{\theta}{2}\right)\left|1\right>
```
という基底を考えると、それぞれこの基底に関する位相が $\lambda$ によって変わることがわかります。

Rx, Ry, Rz, U1, U2, U3 ゲートはそれぞれ以下で実装できます。

| Rx | Ry | Rz | U1 | U2 | U3 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|`rx(θ)`|`ry(θ)`|`rz(θ)`or`phase(θ)`|`u1(λ)`|`u2(φ,λ)`|`u3(φ,λ,θ)`|

Rx, Ry, Rz の $\theta$ には各軸による回転角を記入します。

#### 実装
以上のゲートを実装します。

###### Rx ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().rx(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'1': 469, '0': 531})
```

###### Ry ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().ry(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'1': 524, '0': 476})
```

###### Rz ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().rz(math.pi/2)[0].m[:].run(shots=1000)
又は
c = Circuit().phase(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### U1 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u1(math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
```

###### U2 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u2(0, math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 486, '1': 514})
```

###### U3 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u3(math.pi/2,0,math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 503, '1': 497})
```

## 2量子ゲート
2量子ゲートは主に1量子ゲートに制御ビットが加わったものがあります。
### CX, CZ
CX, CZ ゲートは以下で実装できます。

| CX | CZ |
|:-:|:-:|
|`cx`or`cnot`|`cz`|

### CRx, CRy, CRz, CU1, CU2, CU3
CRx, CRy, CRz, CU1, CU2, CU3 ゲートは以下で実装できます。

| CRx | CRy | CRz | CU1 | CU2 | CU3 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|`crx(θ)`|`cry(θ)`|`crz(θ)`|`cu1(λ)`or`cphase(λ)`|`cu2(φ,λ)`|`cu3(φ,λ,θ)`|

$\theta, \lambda, \phi$ に関しては1量子ゲートのときと同じです。

### Swap
Swap ゲートは以下で実装できます。

|SWAP|
|:-:|
|`swap`|


#### 実装
以上のゲートを実装します。

###### CX ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().cx[0,1].m[:].run(shots=1000)
又は
c = Circuit().cx[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CZ ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().cz[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CRx ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CRy ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CRz ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crz(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CU1 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu1(math.pi)[0,1].m[:].run(shots=1000)
又は
c = Circuit().cphase(math.pi)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CU2 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu2(0,math.pi)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### CU3 ゲート

``` python:sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu3(math.pi/2,0,math.pi)[0].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

###### Swap ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().swap[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
```

## 3量子ゲート
3量子ゲートはCCX(Toffoli)ゲートのみあります。

### CCX(Toffoli)
CCX ゲートは以下で実装できます。

|CCX|
|:-:|
|`ccx`又は`toffoli`|

#### 実装
以上のゲートを実装します。

###### CCX ゲート

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().ccx[0,1,2].m[:].run(shots=1000)
又は
c = Circuit().toffoli[0,1,2].m[:].run(shots=1000)

結果
Counter({'000': 1000})
```

## まとめ
今回はblueqatを用いて全ゲートの関数を実装しました。
次回は2進数の和をblueqatで実装してみます。