量子ゲートテレポーテーション

# この記事について
**量子** テレポーテーションでは、**量子状態**を遠隔地に転送しました。
では、**量子ゲート** テレポーテーションでは、何を転送するでしょうか。

そうです。**量子ゲート**（**の作用**）です。

分かるようで分からない、ゲートテレポーテーションについて見ていきたいと思います。

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

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

$$
% basic braket 
\newcommand{\bra}[1]{\left\langle #1 \right|}
\newcommand{\ket}[1]{\left| #1 \right\rangle}
\newcommand{\bracket}[2]{\left\langle #1 \middle| #2 \right\rangle}
\newcommand{\ketbra}[2]{\left| #1 \right\rangle \left\langle #2 \right|}
\newcommand{\ketbraket}[3]{\left| #1 \right\rangle \left\langle #2 \middle| #3 \right\rangle}
% small-size
\newcommand{\bras}[1]{\left\langle {\scriptsize #1}  \right|}
\newcommand{\kets}[1]{\left| {\scriptsize #1}  \right\rangle}
\newcommand{\brackets}[2]{\left\langle {\scriptsize #1} \middle| {\scriptsize #2} \right\rangle}
\newcommand{\ketbras}[2]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \right|}
\newcommand{\ketbrakets}[3]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \middle| {\scriptsize #3} \right\rangle}
% Matrix
\newcommand{\tate}[2]{\begin{bmatrix} #1 \\ #2 \end{bmatrix}}
\newcommand{\yoko}[2]{\begin{bmatrix} #1 & #2 \end{bmatrix}}
\newcommand{\mtrx}[4]{\begin{bmatrix} #1 & #2 \\ #3 & #4 \end{bmatrix}}
$$

# 量子ゲートを転送するとは？
## 量子ビットにユニタリゲートを適用したい
突然ですが、状態が$\ket{\psi}$である量子ビットに、任意のユニタリゲート$U$を適用したい時どうするでしょうか。
きっと、その量子ビットに対して、ユニタリーゲート$U$を適用し下記の様な回路を組むのでは無いでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/3441c642-88db-132c-f81a-6af907912544.png)

## ちょっと意地悪な状況
では、ちょっと意地悪な状況を考えます。

* 上述のように、状態$\ket{\psi}$に対して、ユニタリーゲート$U$を適用し、$U\ket{\psi}$を作ってください。
* ただし、**その量子状態を持つ量子ビットに対して直接ゲートを適用してはいけません。**

つまり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/1ef4a8c9-8ecc-8124-bb1a-49db865ac8fa.png)

といった状況ですが、こんな魔法の様なことは、さすがにてきません。
そこで、補助量子ビットを１ビット追加して、上記を達成出来ないかを考えてみます。

## 補助量子ビットを追加する
補助量子ビットを１本追加しました。（下の線）この状況で、

* **補助量子ビット側に、ユニタリゲート$U$を適用**するのだが、その**ゲート適用の作用や効果を**
* **$\ket{\psi}$のビットに転送し**、この２ビットにより、$U\ket{\psi}$の状態を作り出す
* そのために、破線の周辺に対して、少し操作を行う。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/73f7e7b3-b1c0-9895-5c1f-570ac2a27e4c.png)

こんなことができるのでしょうか？
答えはYes。で、**できるんです**。これが、**ゲートテレポーテーション**です。
なぜ、こんな周りくどいことをするのかというと、**量子誤り訂正符号**にて間接的にゲート適用を行いたいシーンがあります。
ただ、それは本記事の説明の範囲を超えるので、最後に少しだけ触れる程度としたいと思います。

# ゲートの作用を転送する
## 左の破線の中を埋めてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/e16e7fc3-9694-f178-ec38-56ce249587a9.png)

左側の破線の中ですが、どういった回路を構成すれば良いでしょうか？
実を言うと、Bell回路を構成することで、$\ket{\psi}$に対して、間接的にゲート$U$を適用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/c562cdbf-2dfc-f0e9-b601-673a7ba42ecf.png)

## 計算で確認
実際に、$U\ket{\psi}$を上記回路でつくりさせるか？を確認しておきましょう。

$$
\ket{\psi} = a\ket{0} + b\ket{1}
$$

としたときに、$H\ket{0} = \ket{+}$の状態を数式で表現すると

```math
\displaylines{
\ket{\psi}\kets{+} = (a\ket{0} + b\ket{1}) \otimes \frac{1}{\sqrt{2}} \left( \ket{0} + \ket{1} \right)
\\
= \frac{1}{\sqrt{2}} \left( a\ket{00} + a\ket{01} + b\ket{10} + b\ket{11} \right)
}
```

これに、$Cnot_{21}$を適用するので

```math
\displaylines{
Cnot_{21}\ket{\psi}\kets{+}
= \frac{1}{\sqrt{2}} \left( a\ket{00} + a\ket{11} + b\ket{10} + b\ket{01} \right)
\\
= \frac{1}{\sqrt{2}} \left( \ket{0} \otimes ( a\ket{0} + b\ket{1}) + \ket{1} \otimes ( a\ket{1} + b\ket{0}) \right)
\\
= \frac{1}{\sqrt{2}} \left( \ket{0} \otimes \ket{\psi} + \ket{1} \otimes X\ket{\psi} \right)
}
```

この状態にて、補助ビットである２ビット目にユニタリゲート$U$を適用します。

```math
U_{2}Cnot_{21}\ket{\psi}\kets{+}
= \frac{1}{\sqrt{2}} \left( \ket{0} \otimes U\ket{\psi} + \ket{1} \otimes UX\ket{\psi} \right)
```

上記のユニタリーゲートがかかった項に着目すると、たしかに、$U\ket{\psi}$の状態ができています。

```math
U_{2}Cnot_{21}\ket{\psi}\kets{+}
= \frac{1}{\sqrt{2}} \left( \ket{0} \otimes \color{red}{U\ket{\psi}} + \ket{1} \otimes \color{red}{UX\ket{\psi}} \right)
```

## ここまでの結果を整理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/c562cdbf-2dfc-f0e9-b601-673a7ba42ecf.png)

この回路に従い、計算を進めた結果を整理しておきます。
上記は、元々、$\ket{\psi}$の状態であったメインのビットの観測結果に従い、補助ビット側に異なる状態を出力します。
具体的には、下記の様な関係です。

|#|1ビット目の観測結果|そのときの、2ビット目がとる状態|
|:-:|:-:|:-:|
|1|$0$を観測|$U\ket{\psi}$|
|2|$1$を観測|$UX\ket{\psi}$|

上記を見ると、所望の状態の$U\ket{\psi}$に対して、
1ビット目で、$1$を観測したときには、余計な$Not(X)$がついてしまっています。

## 右の破線の中を埋めてみる
この余計な、$Not(X)$をキャンセルするためにはどうすれば良いでしょうか？
そうです。右の破線の中に、
1ビット目で$1$を観測したときに2ビット目に作用する、$Controlled \ Unitary$を考えましょう。

$UX\ket{\psi}$ を所望の状態である $U\ket{\psi}$にするには、下記のようなゲートを適用してはいかがでしょう?

```math
UXU^\dagger
```

計算で確認してみると

```math
U^\dagger U = XX = I より
\ \ \ 
UXU^\dagger \ UX\ket{\psi} = \color{red}{U\ket{\psi}}
```

つまり、右の枠にはこんな$Controlled \ Unitary$を入れておけば、つじつま合わせができるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/c1718f77-0af4-a9e9-becc-b9d31bdceeda.png)

# 一般化しておく
上記では、少し込み入った感じがするので、整理し一般化しておきましょう。修正点は下記２点です。

* $H\ket{0} = \kets{+}$を補助ビットの初期状態とする
* 辻褄合わせのゲートを$X' = UXU^\dagger$とおいておく

上記で整理するとこんな回路になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/7e971473-df5f-882e-154a-37b51d214561.png)

これで、ゲートテレポーテーションの完成です。
$\ket{\psi}$の量子ビットに直接触れることなく、ユニタリーゲート$U$を適用することができました。

# U = ゲートT のテレポーテーション
最後に、量子誤り訂正符号の論理量子ビットの操作にて、論理$T$ゲートを適用するために、ゲート$T$のテレポーテーションを確認しておきたいと思います。なぜ、ゲート$T$なのかというと、$T$は、ユニバーサルゲートセットの構成要素の為、ゲート$T$が使えると、何かと便利な状況がある。だから、ゲート$T$のテレポーテーションを確認しておく。と理解頂ければと思います。[^1]

上記で、一般化した回路に$U=T$を代入すると下記となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/5b53a85f-94ca-8919-7d6a-f9d98c5aaed1.png)

なぜ、$X'=SX$となるかは、計算で確認しておきましょう。
適用するゲート$U$に対して、$X'=UXU^\dagger$なので、$U=T$では、$X'=UXU^\dagger=TXT^\dagger$
これを計算すると、

```math
TXT^\dagger = \begin{bmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{bmatrix}\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}\begin{bmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{bmatrix} = e^{-i\pi/4}\begin{bmatrix} 0 & 1 \\ i & 0 \end{bmatrix}
```

と、グローバル位相以外は$SX$と等しくなります。
そのうえで、$T$の適用タイミングですが、$Cnot$ゲートの前に持ってきて下記のようにしても計算結果が一致します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/09f9be63-fa44-0109-831d-50f95578d315.png)

これで、補助ビットとして$T\ket{+}$を準備することで、任意の１量子状態$\ket{\psi}$に対して、直接的にゲートを作用させる事なく、ゲート$T$を作用させることができる。**ゲートの作用を転送できること**　が確認できました。

# まとめ
量子ゲートのテレポーテーションである、ゲートテレポーテーションについて扱いました。
仕掛けとしては理解できたのですが、上述の量子誤り訂正符号のシーン以外でも何らか活用の機会があるのでは？
と思うものの、こういうときにゲートテレポーテーションって便利だよね。
という応用例はまだ理解できていないので、お詳しい方いらっしゃればコメント等頂ければと思います。
なお、よろしければ**LTGM**頂ければ嬉しいです。

# 参考
* [量子コンピューティング：基本アルゴリズムから量子機械学習まで](https://www.amazon.co.jp/dp/4274226212/)

[^1]: ${CNOT,H,T}$でユニバーサルゲートセットが構成できるのでTゲートについて触れています。ゲートテレポーテーションにおいて$T$を扱っている理由としては、計算中に発生する誤り対応すべくスタビライザー符号等の誤り耐性符号上での演算を想定するのですが、スタビライザー符号上での演算は、スタビライザーを破壊しないようにクリフォード演算に閉じる必要があります。一方で、${CNOT,H,T}$のうち、$T$はクリフォード演算では無いため、$T$を符号上の演算で利用しようとすると、$T$の効果を事前に準備して、適用するような操作が必要となります。この背景で、$T$のゲートテレポーテーションを扱っています。