量子ビットをイメージでつかむ（量子テレポテーション編）

　本記事は[量子もつれ編](https://qiita.com/sin-gee/items/35df4e0939cd40912da5)、[量子振幅増幅編](https://qiita.com/sin-gee/items/f17d6d6e4585cec11323)の続きとなります。引き続き[こちら](https://www.amazon.co.jp/IBM-Quantum%E3%81%A7%E5%AD%A6%E3%81%B6%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF-%E6%B9%8A%E9%9B%84%E4%B8%80%E9%83%8E/dp/4798062804/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3FF2DREBY73NG&dib=eyJ2IjoiMSJ9.wrsK9ZUNyNK8MZsBL-TISgTccLv1cAvI4B1Cod6a_lV22-PF0N_7w5FCMsrvDT4iCn5PepoKccEV4hDfNk9PD5_a5-nDAYJGT6zF1U_Kd3RBXApKuwgG1i3Fx4YW1P4dOVZyzKADIsfm_V_mD9VbFg.hZkSyHN2vXn8hLd2yiUhLpwA921WZWzvTDwSbDmpytA&dib_tag=se&keywords=IBMQ&qid=1740563210&sprefix=ibmq%2Caps%2C173&sr=8-1)を教科書としています。Jupyter notebookを https://github.com/sin-gee/ImageOfQuantumBit/blob/main/ImageOfTeleportation.ipynb に置いておきますのでよろしければ試してみてください。
***
　初めに、この記事を読まれる方に、量子テレポテーション自体の説明するのは「釈迦に説法」でしょう。とはいえ、[量子複製不可能定理](https://www.youtube.com/watch?v=QM0wn95D8hU)は押さえておいた方が、この面白さが伝わるのではないか、と思います。
***
では始めましょう。今回の（量子）回路は次のとおり（例によって左から右に流れます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/b53480c2-f637-4e55-8bf7-4b6e27a21b73.png)
（量子である）$q_2$と、（単に$0or1$となる）$q_0$と$q_1$の測定結果を相手に送ることで、（$q_0$を直接送らずに）$q_0$をリモートで再現させるものです。$q_2$に$q_0$が複製されたような気になってしまいますが、（元の）$q_0$は測定により破壊されるため、量子複製不可能定理には違反しない訳です。
***
１．$q_0$を生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/2540a9f5-0211-4023-b040-c2e460ae9e45.png)
といっても$\lvert0\rangle$では面白みに欠けるので、$\lvert0\rangle$と$\lvert1\rangle$で振幅と位相に差をもたせてあげます。
```python:
#量子bit0
Q1 = Qbit(math.pi*0.2,math.pi*0.5)
#q0の生成
qzero,qone = createBy1bit(Q1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29303570-dcc6-4438-b0e8-7d2a1cd3221b.png)

２．$q_1$と$q_2$を生成して、量子もつれ状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/26843bc0-f2c7-4e1d-ac37-447f8bb53ea2.png)
```python:
#量子bit1
Q2 = Qbit(math.pi*0,math.pi*0)
#量子bit2
Q3 = Qbit(math.pi*0,math.pi*0)

#cx(Highをコントロールビット、lowを標的ビットとした場合)
def cx_high_control(q00,q01,q10,q11):
    q10_,q11_ = x_gate(q10,q11)
    return q00,q01,q10_,q11_

#q1にアダマールゲートを作用後、q2をターゲットビットとしてcxゲートを作用させる（Bell状態にする）
q00,q10 = h_gate(q00,q10)
q01,q11 = h_gate(q01,q11)
q00,q01,q10,q11 = cx_high_control(q00,q01,q10,q11)
```
３．$q_0$をコントロール、$q_1$をターゲットとして、CNOTを働かせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/7dceeb9d-b483-4ac1-931d-f497522371c7.png)
```python:
def merge1to2(q0,q1,q00,q01,q10,q11):
    # 初期の各量子bit列の波の軸
    q000 = np.roll(q0*max(q00),phase(q00))
    q001 = np.roll(q0*max(q01),phase(q01))
    q010 = np.roll(q0*max(q10),phase(q10))
    q011 = np.roll(q0*max(q11),phase(q11))
    q100 = np.roll(q1*max(q00),phase(q00))
    q101 = np.roll(q1*max(q01),phase(q01))
    q110 = np.roll(q1*max(q10),phase(q10))
    q111 = np.roll(q1*max(q11),phase(q11))
    return q000,q001,q010,q011,q100,q101,q110,q111

#q0をコントロールビット、q1をターゲットビットとしてCXゲートを作用させる
q000,q001,q010,q011,q100,q101,q110,q111 = merge1to2(q0,q1,q00,q01,q10,q11)
q000,q010,q100,q110 = cx_high_control(q000,q010,q100,q110)
q001,q011,q101,q111 = cx_high_control(q001,q011,q101,q111)
```

４．最後に、$q_0$にアダマールを作用させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/8a95d38d-9fb6-4101-8216-4a85910a9fe9.png)

```python:
#q0にアダマールゲートを作用させる
q000,q100 = h_gate(q000,q100)
q001,q101 = h_gate(q001,q101)
q010,q110 = h_gate(q010,q110)
q011,q111 = h_gate(q011,q111)
```
***
最後（測定直前）の波の状態を見てみると、こんな感じになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29420b0c-320a-4724-9fdb-30b3e87738b1.png)

では、先ほど見た$q_0$の状態と見比べてみます。
まず、$q_0$の測定結果が$0$、$q_1$の測定結果が$0$であった場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29303570-dcc6-4438-b0e8-7d2a1cd3221b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/d23f93a1-05a8-4c62-a2ce-ce5d7bebc28d.png)
$q_2$はそのままで元の$q_0$の状態を再現できることがわかります。
次に、$q_0$の測定結果が$0$、$q_1$の測定結果が$1$であった場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29303570-dcc6-4438-b0e8-7d2a1cd3221b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/e3482061-9936-4c19-97ef-09bf3a2d271e.png)
$q_2$の$\lvert0\rangle$と$\lvert1\rangle$を入れ替える（$X$ゲートを作用させる）ことで元の$q_0$の状態を再現できることがわかります。
そして、$q_0$の測定結果が$1$、$q_1$の測定結果が$0$であった場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29303570-dcc6-4438-b0e8-7d2a1cd3221b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/432e0e09-69f8-47d5-adba-0ca9b9c122a0.png)
$q_2$の$\lvert1\rangle$を反転させる（$Z$ゲートを作用させる）ことで元の$q_0$の状態を再現できることがわかります。
最後に、$q_0$の測定結果が$1$、$q_1$の測定結果も$1$であった場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/29303570-dcc6-4438-b0e8-7d2a1cd3221b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/34171568-b8a4-4f1b-a976-ec323ed54138.png)
$q_2$の$\lvert0\rangle$と$\lvert1\rangle$を入れ替え（$X$ゲートを作用させ）た後に、$\lvert1\rangle$を反転させる（$Z$ゲートを作用させる）ことで元の$q_0$の状態を再現できることがわかります。
***
量子テレポテーションの回路を見てきましたが、どうだったでしょうか？
「量子テレポテーション」のタイトルだけでここにいらした方にとっては、”拍子抜け”、”コレじゃない”だったことでしょう。ごめんちゃい。