量子コンピュータの基本 - ユニタリ回転ゲートU1,U2,U3を学ぶ

## :sailboat: この記事の目的
量子ゲート操作の一つである**回転ゲート**U1,U2,U3について学びます。
また、プログラミングを通して実際に実行し、得られる結果を検証します。

本記事の内容は前回の記事「**量子コンピュータの基本 - 回転ゲートについてしっかり学ぶ**」の続編となりますので、予めこちらを読んで頂けると幸いです。

:paperclip:　量子コンピュータの基本 - 回転ゲートについてしっかり学ぶ
https://qiita.com/ttabata/items/ff3970e0c6a4068f1f55

## :sailboat: ユニタリ回転ゲートとは

ユニタリ回転ゲートに、**U1ゲート、U2ゲート、U3ゲート**があります。
これらの定義は以下となっています。

```math
\begin{align}
U_1 &= \begin{pmatrix} 1 & 0\\ 0 & e^{i\lambda}
\end{pmatrix} \mkern{2em} ... 式(1)\\
U_2 &= \frac{1}{\sqrt{2}}\begin{pmatrix} 1 & -e^{i\lambda} \\ e^{i\phi} & e^{i(\lambda+\phi)}
\end{pmatrix} \mkern{2em} ... 式(2)\\
U_3 &= \begin{pmatrix} \cos(\frac{\theta}{2}) & -e^{i\lambda}\sin(\frac{\theta}{2})\\
e^{i\phi}\sin(\frac{\theta}{2}) & e^{i(\lambda+\phi)}\cos(\frac{\theta}{2})\end{pmatrix} \mkern{2em} ... 式(3)\\
\end{align}

```

これらは、冒頭の前記事「量子コンピュータの基本 - 回転ゲートについてしっかり学ぶ」の任意回転行列、式(7)から導かれます。実際に導いてみましょう。

任意回転行列を以下に再掲します。ここでは式(4)としました。

```math
\begin{pmatrix}
\cos(\frac{\theta}{2}) & -e^{i\lambda}\sin(\frac{\theta}{2}) \\
e^{i\phi}\sin(\frac{\theta}{2}) & e^{i(\lambda+\phi)}\cos(\frac{\theta}{2}) \end{pmatrix}
 \mkern{2em} ... 式(4)

```

まず式(1)について、式(4)のパラメータ$\theta$、$\phi$をどちらも0に設定すれば得られることがわかります。パラメータ$\lambda$のみ有効となります。よって、このU1ゲートは、回転角$\lambda$を伴う位相回転(Z軸周りの回転)に使用することができる回転ゲートであると言うことができます。

次に式(2)について、式(4)のパラメータ$\theta$を90度($\pi$/2:ラジアン)にすれば良いことがわかります。すなわち、U2ゲートは、Y軸上で90度の回転を伴う回転操作に使用することができると言えます。

そして、式(3)についてはパラメータの指定は無いため、U3ゲートは$\theta,\phi,\lambda$すべてのパラメータを個別に設定して任意の回転操作を得るために使用する回転ゲート、あるいは$\theta=0$、$\theta=90度(\pi/2)$、$\phi=0$のいずれの角度も取れない場合の回転操作に使用する回転ゲートと言うことができます。

## :sailboat: プログラム上で実行し結果を検証する

それでは、上記のU1,U2,U3ゲートを実際にプログラミングして実行し、得られる結果を検証してみます。
今回プログラミングを行う量子コンピュータは、**blueqat**(ブルーキャット)を使用します。
blueqatは、量子コンピュータの動作をシミュレートしたコンピュータで、python言語で書かれていて簡単に使用することができます。

blueqatについての情報はこちらからご覧下さい。

:paperclip:  オンラインですぐに使える量子コンピュータ・シミュレーター blueqat cloud の始め方
https://qiita.com/ttabata/items/201e9b5bad19d5dda45f

####①U1ゲートを実行する

以下の例を考えます。以下の量子状態に対して、Z軸周りに180度(π)回転の操作を実行してみましょう。
回転前の状態は、Hゲート(アダマールゲート)により|0〉及び|1〉ベクトルが重ね合わさった状態です。

```math
回転前の量子状態　　\frac{1}{\sqrt{2}}|0〉+ \frac{1}{\sqrt{2}}|1〉\\
回転後の量子状態　　e^{-i\frac{\pi}{2}}\Big(\frac{1}{\sqrt{2}}|0〉- \frac{1}{\sqrt{2}}|1〉\Big)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/07ddd846-bd5b-b50d-62f8-e78fbcbb2af9.png)
上図のブロッホ球上で、回転前の量子状態を赤矢印、回転後の量子状態を青矢印で表示しています。


この回転操作については、以下のようにU1ゲートのプログラミングを行います。

```ruby:u1_gate
from blueqat import Circuit
import math
import matplotlib.pyplot as plt
%matplotlib inline

# 回転前の状態pを作る
p = Circuit().h[0]

# U1ゲートを適用する(パラメータ:λ=π)
p = p.u1(math.pi)[0]

# 測定を実行
resultSet = p.m[:].run(shots=1000)

# 結果表示
hor = list(resultSet.keys())
ver = list(resultSet.values())
print(ver)
plt.bar(hor, ver)

```

実行後、以下のようなグラフが描画されます。これは測定結果のビットが0となるのか1となるのかの割合を示しています。プログラム中にある**shots=1000**の記述通り、測定が1000回行われ、そのうち0または1が現れる回数を数字で示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d4cc2aab-4f7e-0a37-7857-ecad6e58c2e9.png)
結果とグラフを検証してみましょう。
ここで、0ビットとは結果の状態、つまり青いベクトルの向きが北極点または北極点寄りとなっていることを意味します。1ビットについてもその逆位置で同じ意味となります。

今回の回転後の青矢印の位置はX-Y平面上にあります。これは、ビットが0になる確率と1になる確率がちょうど半分ずつとなる状態を意味します。実際の測定結果によるグラフも同様の結果を示しています。検証結果は以上です。

####②U2ゲートを実行する

回転前の量子状態を以下のように|0〉とし、U2ゲートを適用します。
U2ゲートを適用することでY軸方向に90度(π/2)回転させます。また、パラメータ$\phi$と$\lambda$を0とします。($\lambda$はπでも構いません。結果は同じになります)

```math
回転前の量子状態　　|0〉\\
回転後の量子状態　　\frac{1}{\sqrt{2}}|0〉+ \frac{1}{\sqrt{2}}|1〉
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/8c39c415-f22e-f3c5-05e1-e4d2218e842c.png)

この回転操作については、以下のようにU2ゲートのプログラミングを行います。

```ruby:u2_gate
from blueqat import Circuit
import math
import matplotlib.pyplot as plt
%matplotlib inline

# 回転前の状態pを作る
p = Circuit()

# U2ゲートを適用する(パラメータ:λ=π)
p = p.u2(0, 0)[0]

# 測定を実行
resultSet = p.m[:].run(shots=1000)

# 結果表示
hor = list(resultSet.keys())
ver = list(resultSet.values())
print(ver)
plt.bar(hor, ver)

```

結果は以下のようになりました。
回転後の量子状態は|0〉と|1〉との重ね合わせ、つまりアダマールゲートを適用した際の状態となります。0ビットと1ビットの出現確率は50%対50%です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/92122f3f-b945-394a-6aa5-aa998a7943f2.png)


####③U3ゲートを実行する

最後に、U3ゲートを考えます。
回転前後の量子状態を以下とし、回転角度として$\theta$=-45度(-π/4)、$\phi$=45度(π/4)とします。また、$\lambda$=0とします。

```math
回転前の量子状態　　\frac{1}{\sqrt{2}}|0〉+ \frac{1}{\sqrt{2}}|1〉\\
回転後の量子状態　　\frac{\cos\frac{\frac{\pi}{4}}{2}-\sin\frac{\frac{\pi}{4}}{2}}{\sqrt{2}}\Big(|0〉+e^{i\frac{\pi}{4}}|1〉\Big)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/0827e34f-fa77-10dc-5d83-af4aa7ba5339.png)

U3ゲートのプログラミングを行います。

```ruby:u3_gate
from blueqat import Circuit
import math
import matplotlib.pyplot as plt
%matplotlib inline

# 回転前の状態pを作る
p = Circuit().h[0]

# U3ゲートを適用する(パラメータ:λ=π)
p = p.u3(-math.pi/4, math.pi/4, 0)[0]

# 測定を実行
resultSet = p.m[:].run(shots=1000)

# 結果表示
hor = list(resultSet.keys())
ver = list(resultSet.values())
print(ver)
plt.bar(hor, ver)

```

実行結果は以下です。
回転操作後の結果、ブロッホ球の図の青矢印の位置が結果の量子状態です。
この位置から見て、0ビットとなる確率と1ビットとなる確率の割合がグラフの結果と一致すると言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e6e05e68-35ca-d321-74f1-783b59acd9d0.png)


以上でユニタリ回転ゲートU1,U2,U3とその使い方の解説を終わります。

## :sailboat: 関連情報

:paperclip: 量子コンピュータの基本 - ブロッホ球の数式をしっかり解説
https://qiita.com/ttabata/items/0e839d03963d656551e0

:paperclip: 量子コンピュータの基本 - 回転ゲートについてしっかり学ぶ
https://qiita.com/ttabata/items/ff3970e0c6a4068f1f55

:paperclip: オンラインですぐに使える量子コンピュータ・シミュレーター blueqat cloud の始め方
https://qiita.com/ttabata/items/201e9b5bad19d5dda45f

## :sailboat: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。