2量子制御ユニタリゲートチートシート

# この記事について
[こちらの記事](https://qiita.com/doiken_/items/fca8929b380bfa489035)で制御ユニタリゲートでは何番目の量子ビットを制御ビットにするのかが重要だということを取り上げました。
具体的には0番目の量子ビットを制御ビットにする場合と、1番目の量子ビットを制御ビットにする場合では、制御ユニタリゲートが少し異なります。
本記事では、0番目、1番目の量子ビットを制御ビットとしたときの制御ユニタリゲートをただひたすらまとめていこうと思います。
チートシートとして使ってください。

また、量子コンピュータ関係の他の記事は、下記で紹介しています。

https://qiita.com/shnchr/items/41fa7fd1284d74007a7c

# 表記方法
[こちらの記事](https://qiita.com/doiken_/items/afaed1012cbba0018935)で述べている通り、量子ビットを数えるとき、二通りの解釈方法があります。

- 最上位ビット (Most Significant Bit - MSB)を左にとる。
- 最上位ビット (Most Significant Bit - MSB)を右にとる。

のどちらかです。
例えば、IBMのQiskitは前者（実装により変更可）で、AmazonBraketは後者です。
古典コンピュータの世界ではビット列表現で示したときに前者と同様に、「最上位ビット (Most Significant Bit - MSB)を左にとる。」という形です。
本記事の読者はおそらく古典からやってきている方もいるかと思いますので

- 最上位ビット (Most Significant Bit - MSB)を左にとる。

を採用しようかと思います。
具体例でいうと、$|01\rangle$で示すと、0ビット目は1、1ビット目は0を表すこととなります。

制御ゲートの考え方などは[こちらの記事](https://qiita.com/doiken_/items/fca8929b380bfa489035)にまとめているので参考にしてください。

今回は以下の2量子制御ユニタリゲートをまとめていきます。

- 制御Xゲート（制御NOTゲート）
- 制御Yゲート
- 制御Zゲート
- 制御アダマールゲート
- 制御回転ゲート
- 制御位相回転ゲート
- 制御u3回転ゲート

では、まとめていきます。

# 0量子ビット目が制御ビットの場合
## 基本形
```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & u_{00} & 0 & u_{01} \\
    0 & 0 & 1 & 0 \\
    0 & u_{10} &0 & u_{11}
        \end{pmatrix}
```

## 制御Xゲート（制御NOTゲート）
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットを反転します。

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

## 制御Yゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにYゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 0 & 0 & -i \\
    0 & 0 & 1 & 0 \\
    0 & i & 0 & 0
        \end{pmatrix}
```

## 制御Zゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットの位相を反転させます。
ただし、Zゲートはもともと$|0\rangle$に対しては何もしないので、$|11\rangle$の状態の場合にのみ作用し、1量子ビット目が制御ビットの時と同じになります。

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


## 制御アダマールゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにアダマールゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\
    0 & 0 & 1 & 0 \\
    0 & \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}}
        \end{pmatrix}
```

## 制御回転ゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにZ軸周りの回転ゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & e^{-i\lambda/2} & 0 & 0 \\
    0 & 0 & 1 & 0 \\
    0 & 0 & 0 & e^{i\lambda/2}
        \end{pmatrix}
```


## 制御位相回転ゲート
制御Zゲートと同様の考え方で $|11\rangle$に状態のときのみ作用し、位相の回転を実行します。
そのため、1量子ビット目が制御ビットの場合と同じになります。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & 1 & 0 \\
    0 & 0 & 0 & e^{i\lambda}
        \end{pmatrix}
```

## 制御u3回転ゲート
制御量子ビットが$|1\rangle$のとき、ターゲットビットを$U_3$回転させます。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0\\
0 & e^{-i(\phi+\lambda)/2}\cos(\theta/2) & 0 & -e^{-i(\phi-\lambda)/2}\sin(\theta/2)\\
0 & 0 & 1 & 0\\
0 & e^{i(\phi-\lambda)/2}\sin(\theta/2) & 0 & e^{i(\phi+\lambda)/2}\cos(\theta/2)
        \end{pmatrix}
```

# 1量子ビット目が制御ビットの場合
## 基本形
```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & u_{00} & u_{01} \\
    0 & 0 & u_{10} & u_{11}
        \end{pmatrix}
```

## 制御Xゲート（制御NOTゲート）
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットを反転します。

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

## 制御Yゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにYゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & 0 & -i \\
    0 & 0 & i & 0
        \end{pmatrix}
```
## 制御Zゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットの位相を反転させます。
ただし、Zゲートはもともと$|0\rangle$に対しては何もしないので、$|11\rangle$の状態の場合にのみ作用し、0量子ビット目が制御ビットの時と同じになります。

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

## 制御アダマールゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにアダマールゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\
    0 & 0 & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}}
        \end{pmatrix}
```

## 制御回転ゲート
制御量子ビットが$|1\rangle$のとき、ターゲット量子ビットにZ軸周りの回転ゲートを適用します。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & e^{-i\lambda/2} & 0 \\
    0 & 0 & 0 & e^{i\lambda/2}
        \end{pmatrix}
```
## 制御位相回転ゲート
制御Zゲートと同様の考え方で $|11\rangle$に状態のときのみ作用し、位相の回転を実行します。
そのため、0量子ビット目が制御ビットの場合と同じになります。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0 \\
    0 & 1 & 0 & 0 \\
    0 & 0 & 1 & 0 \\
    0 & 0 & 0 & e^{i\lambda}
        \end{pmatrix}
```


## 制御u3回転ゲート
制御量子ビットが$|1\rangle$のとき、ターゲットビットを$U_3$回転させます。

```math
    C_U = 
    \begin{pmatrix}
    1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & e^{-i(\phi+\lambda)/2}\cos(\theta/2) & -e^{-i(\phi-\lambda)/2}\sin(\theta/2)\\
0 & 0 & e^{i(\phi-\lambda)/2}\sin(\theta/2) & e^{i(\phi+\lambda)/2}\cos(\theta/2)
        \end{pmatrix}
```

以上が代表的な2量子制御ユニタリゲートとなります。
是非参考にしてみてください。

# 参考
[Qiskitチュートリアル：量子操作の概要](https://qiskit.org/documentation/locale/ja_JP/tutorials/circuits/3_summary_of_quantum_operations.html)