Quantum Katas で始める量子コンピュータ入門 |7⟩: Teleportation


## 前書き

本記事では、[Quantum Katas の Teleportation](https://github.com/Microsoft/QuantumKatas/tree/master/Teleportation) について解説します。Q# や Quantum Katas って何よという方は [Quantum Katas で始める量子コンピュータ入門 |0⟩](https://qiita.com/stwhabout/items/195b93a194c24ba5fb73) をご参照ください。

これまで、基本的な量子ゲートや重ね合わせ、量子もつれ、観測について学び、ドイチェ・ジョザのアルゴリズムやサイモンのアルゴリズムでは具体的な問題解決が効率的に行えることを学んできました。今回は量子テレポーテーションです。おそらくですが、この記事を見ている方で聞いたことがないという方はいらっしゃらないのではないかと思います。[Q# の公式ドキュメント](https://docs.microsoft.com/en-us/quantum/techniques/putting-it-all-together?view=qsharp-preview) などでも詳しく紹介されている内容なので、今回は軽めに進めます。

### 概要

量子テレポーテーションは 3 つのパートに分かれており、この Kata も同じように 3 つのパートそれぞれで問題を解くように構成されています。

1. 準備; Alice と Bob がエンタングルされた量子ビットを共有します。
2. 送信; Alice は送信したい量子ビット (メッセージと呼ばれます) を自分の量子ビットに作用させ、観測した結果を古典ビットとして Bob に送信します。
3. 受信; Bob は受信した古典ビットを用いて自分の量子ビットを操作し、Alice が送信したメッセージを再構成します。

上記を頭の片隅にとどめていただけると、各 Task がスムーズに進められるかと思います。

## 各 Task の解説

### Task 1.1. Entangled pair

#### 問題

> 入力: Alice と Bob の量子ビット、初期状態 $|0⟩$ 

> ゴール: ベル状態 $|\phi^+⟩ = \frac{|00⟩ + |11⟩ }{\sqrt 2}$ を作る。

#### 解説

概要に記した共有のための事前準備として、まずはエンタングルされた状態を作ります。これまでの Kata で何度もやったとおり、アダマールゲートと CNOT ゲートで実現可能です。

```cs
operation Entangle (qAlice : Qubit, qBob : Qubit) : ()
{
    body {
        H(qAlice);
        CNOT(qAlice, qBob);
    }
}
```

### Task 1.2. Send the message (Alice's task)

#### 問題

> 入力: Alice の量子ビット $q_{Alice}$ と送信したいメッセージ $q_{message}$

> 出力: Bob に送信する古典ビット (2 ビット)

#### 解説

まずは Alice の Task です。公式ドキュメントでも記載されている通り、量子テレポーテーションを行うときは、送信者は "送信したいメッセージを制御ビットとして自分の量子ビットを反転し、その後メッセージをアダマール ゲートで処理する" という手続きが必要となります。また、このオペレーションではゴールとして量子ビットの状態を変えるのではなく、Bob に送信する古典ビットを出力する必要があることに注意しましょう。

古典ビット自体は `M()` で観測した結果を Bool に直せば良いので、回答は以下になります。

```cs
operation SendMessage (qAlice : Qubit, qMessage : Qubit) : (Bool, Bool)
{
    body {
        CNOT(qMessage, qAlice);
        H(qMessage);

        return(BoolFromResult(M(qMessage)), BoolFromResult(M(qAlice)));

    }
}

```

###  Task 1.3. Reconstruct the message (Bob's task)

#### 問題

> 入力: Bob の量子ビット $q_{Bob}$ と Alice から受信した古典ビット (2 ビット)

> ゴール: Bob の量子ビットをメッセージと同じになるように再構成する

#### 解説

続いて古典ビットを受信した Bob のタスクです。量子テレポーテーションを実行するためには、Bob 側では受信した古典ビットを利用して、X ゲートおよび Z ゲートで処理を行うことが必要となります。回路図的には `Controlled` ファンクタで指定すればよさそうに見えますが、これは古典ビットなので `if` 文での指定が必要です。
回答は以下となります。

```cs
operation ReconstructMessage (qBob : Qubit, (b1 : Bool, b2 : Bool)) : ()
{
    body {
        if(b2) {X(qBob);}
        if(b1) {Z(qBob);}
    }
}
```

###  Task 1.4. Standard teleportation protocol

#### 問題

> 入力: Alice と Bob の量子ビット(初期状態 $|0⟩$)、およびメッセージ $|\psi⟩$

> ゴール: 量子テレポーテーションの一連の処理を実施し、メッセージ $|\psi⟩$ を Bob が再構成する

#### 解説

これまでの Task で各パートは作成したので、一連のパートをまとめて最初から最後まで量子テレポーテーションを実行せよという Task です。すでに Operation は各 Task 作成済みなので、それを呼び出せば終了ですね。

```cs
operation StandardTeleport (qAlice : Qubit, qBob : Qubit, qMessage : Qubit) : ()
{
    body {
        Entangle(qAlice, qBob);
        let result = SendMessage(qAlice, qMessage);
        ReconstructMessage(qBob, result);
    }
}
```


### Task 2.1. Reconstruct the message if the entangled qubits were in the state |Φ⁻⟩ = (|00⟩ - |11⟩) / sqrt(2).

#### 問題

> 入力: Bob の量子ビット $q_{Bob}$ と Alice から受信した古典ビット (2 ビット)

> ゴール: Bob の量子ビットをメッセージと同じになるように再構成する。ただし、$q_{Alice}$ と $q_{Bob}$ は $|\phi^{-}⟩ = \frac{1}{\sqrt 2}(|00⟩ - |11⟩)$ でエンタングルメント状態となっていたとする。

#### 解説

エンタングルメント状態が変わったときに、Bob はどのように再構成を行えばよいかという問題です。念の為真面目に計算してみましょう。 Alice と Bob の量子ビットをそれぞれ$q_a, q_b$、およびメッセージを $q_m$ とすると


$$
    |q_a, q_b⟩ = |\phi^{-}⟩ = \frac{1}{\sqrt 2}(|00⟩ - |11⟩)
$$

なので、$q_m$ を含めた状態は以下の通りに記述されます。

$$
    |q_m⟩|q_a, q_b⟩ = \frac{1}{\sqrt 2}(\alpha|000⟩ -\alpha|011⟩ + \beta|100⟩ - \beta|111⟩)
$$

Alice は同じように操作を行うことになりますので、$q_m$ を制御ビットとして `CNOT` で $q_a$ を処理し、

$$
    \frac{1}{\sqrt 2}(\alpha|000⟩ -\alpha|011⟩ + \beta|110⟩ - \beta|101⟩)
$$


続いて $q_m$ をアダマールゲートで処理します。

```math
\begin{align}
    \frac{1}{2}( &\alpha|000⟩ - \beta|001⟩ \\
                 - &\alpha|011⟩ + \beta|010⟩ \\
                 + &\alpha|100⟩ + \beta|101⟩ \\
                 - &\alpha|111⟩ - \beta|110⟩)
\end{align}
```

Bob は上記の状態から $|\psi⟩ = \alpha|0⟩ + \beta|1⟩$ を作成するわけです。さて、どうすれば実現できるでしょうか。

まず、位相を直しましょう。$q_a = 0$ なら、$q_b$ の位相を Flip します。

```math
\begin{align}
      \frac{1}{2}( &\alpha|000⟩ + \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ - \beta|101⟩ \\
                 + &\alpha|110⟩ - \beta|111⟩)
\end{align}
```

続いて、$q_a$ が 1 なら $q_b$ を反転してみましょう。

```math
\begin{align}
      \frac{1}{2}( &\alpha|000⟩ - \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ + \beta|101⟩ \\
                 + &\alpha|110⟩ - \beta|111⟩)
\end{align}
```

$|q_m, q_a⟩$が $|00⟩$ もしくは $|11⟩$ なら、$q_b$ の位相を Flip する。

```math
\begin{align}

      \frac{1}{2}( &\alpha|000⟩ + \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ + \beta|101⟩ \\
                 + &\alpha|110⟩ + \beta|111⟩)
\end{align}
```

そもそも最初の反転は必要なかったかもしれませんね。。。いずれにせよ、上記の手順で実現は可能です。
回答は以下となります。

```cs
operation ReconstructMessage_PhiMinus (qBob : Qubit, (b1 : Bool, b2 : Bool)) : ()
{
    body {
        if(b2) {Z(qBob);X(qBob);}
        if((b1 && b2) || (!b1 && !b2)) {Z(qBob);}
    }
}
```



###  Task 2.2. Reconstruct the message if the entangled qubits were in the state |Ψ⁺⟩ = (|01⟩ + |10⟩) / sqrt(2).

#### 問題

> 入力: Bob の量子ビット $q_{Bob}$ と Alice から受信した古典ビット (2 ビット)

> ゴール: Bob の量子ビットをメッセージと同じになるように再構成する。ただし、$q_{Alice}$ と $q_{Bob}$ は $|\psi^{+}⟩ = \frac{1}{\sqrt 2}(|01⟩ + |10⟩)$ でエンタングルメント状態となっていたとする。

#### 解説

先のタスクの亜種です。同じように計算すれば良さそうですね。

Alice が送信したあとの状態は

```math
\begin{align}
      \frac{1}{2}( &\alpha|001⟩ + \beta|000⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|101⟩ - \beta|100⟩ \\
                 + &\alpha|110⟩ - \beta|111⟩)
\end{align}
```

となります。
$q_a = 0$ なら、$q_b$ を反転して、

```math
\begin{align}
    = \frac{1}{2}( &\alpha|000⟩ + \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ - \beta|101⟩ \\
                 + &\alpha|110⟩ - \beta|111⟩)
\end{align}
```


その後 $q_m = 1$ なら、$q_b$ の位相を Flip すれば良さそうです。


```math
\begin{align}
    = \frac{1}{2}( &\alpha|000⟩ + \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ + \beta|101⟩ \\
                 + &\alpha|110⟩ + \beta|111⟩)
\end{align}
```

なので回答は以下となります。

```cs

operation ReconstructMessage_PsiPlus (qBob : Qubit, (b1 : Bool, b2 : Bool)) : ()
{
    body {
        if(!b2) {X(qBob);}
        if(b1)  {Z(qBob);}
    }
}

```



### Task 2.3. Reconstruct the message if the entangled qubits were in the state |Ψ⁻⟩ = (|01⟩ - |10⟩) / sqrt(2).

#### 問題

> 入力: Bob の量子ビット $q_{Bob}$ と Alice から受信した古典ビット (2 ビット)

> ゴール: Bob の量子ビットをメッセージと同じになるように再構成する。ただし、$q_{Alice}$ と $q_{Bob}$ は $|\psi^{-}⟩ = \frac{1}{\sqrt 2}(|01⟩ - |10⟩)$ でエンタングルメント状態となっていたとする。

#### 解説

これも亜種ですね。

```math
\begin{align}
\frac{1}{2}( &\alpha|001⟩ - \beta|000⟩ \\
                 - &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|101⟩ + \beta|100⟩ \\
                 - &\alpha|110⟩ - \beta|111⟩)
\end{align}
```


$q_a = 1$ なら、$q_b$ を 反転して位相も反転しましょう。

```math
\begin{align}
    = \frac{1}{2}( &\alpha|001⟩ - \beta|000⟩ \\
                 + &\alpha|011⟩ + \beta|010⟩ \\
                 + &\alpha|101⟩ + \beta|100⟩ \\
                 + &\alpha|111⟩ - \beta|110⟩)
\end{align}
```

さらに $q_b$ を反転します。


```math
\begin{align}
    = \frac{1}{2}( &\alpha|000⟩ - \beta|001⟩ \\
                 + &\alpha|010⟩ + \beta|011⟩ \\
                 + &\alpha|100⟩ + \beta|101⟩ \\
                 + &\alpha|110⟩ - \beta|111⟩)
\end{align}
```

最後に $q_a = 1, q_m = 1$ なら $q_b$ の位相を反転すれば良さそうです。

回答は以下になります。

```cs

operation ReconstructMessage_PsiMinus (qBob : Qubit, (b1 : Bool, b2 : Bool)) : ()
{
    body {
        if(b2) {X(qBob);Z(qBob);}
        X(qBob);
        if((b1 && b2) || (!b1 && !b2)) {Z(qBob);}
    }
}

```



### Task 3.1. Measurement-free teleportation.

#### 問題

> 入力: $|\phi^+⟩$ でエンタングルされた Alice と Bob の量子ビットと、メッセージ $|\psi⟩$。

> ゴール: 観測を行わずにテレポーテーションを行うこと。

#### 解説

これまでは Alice が Bob に量子ビットを送る際には観測を行い、古典ビットとして情報を送付していました。この問題では観測を行うことなくテレポーテーションを実施します。

`if` で古典ビットに対して判定していた内容を `Controlled` ファンクタに置き換えるだけなので問題としては楽勝です。


```cs

operation MeasurementFreeTeleport (qAlice : Qubit, qBob : Qubit, qMessage : Qubit) : ()
{
    body {
        CNOT(qMessage, qAlice);
        H(qMessage);

        CNOT(qAlice, qBob);
        (Controlled Z)([qMessage], qBob);
    }
}

```

ただ、個人的にはこの問題の意義がよく理解できていません。量子テレポーテーションは量子ビットの状態を伝えるためのものなので、そもそも観測せずに直接作用できるなら意味がないのではと思うのですが、どういうときに使えるのでしょうか。

### まとめ


この記事では Quantum Katas の量子テレポーテーションを解説しました。次回は誤り訂正か Joint Measurement でお会いしましょう。