量子ゲームQLANETで量子テレポーテーションする (IBM Quantum Challenge Spring 2023 Lab 2)

## 目次
[1. はじめに](#1-はじめに)
[2. 量子テレポーテーション](#2-量子テレポーテーション)
[3. QLANET での実行](#3-qlanet-での実行)
[4. おわりに](#4-おわりに)


# 1. はじめに

こんにちは。
ohkenです。

量子コンピュータにおけるプログラミングツールとして、IBM社の **qiskit** は最も大きな量子計算コミュニティを形成するOSSライブラリとなっています。

IBM は、年2回春と秋に **IBM Quantum Challenge** という qiskit を通した量子計算を普及する教育イベントを開催しています。

2023年春のイベントは 5/17-24 の日程で開催され、参加者は3000人を超える今までで**最大規模**となったとのことです。

今回の Quantum Challenge のテーマは「動的回路」でした。
動的回路とは何ぞや？という方は、とても面白いので、ぜひ内容にアクセスしてみてください！
開催終了後でも、↓の github リポジトリやIBM Quantum プラットフォームで問題や解説にアクセスできます。

https://github.com/qiskit-community/ibm-quantum-challenge-spring-2023

https://challenges.quantum-computing.ibm.com/spring-2023


さて、

今回の記事では、
Quantum Challenge で扱われた題材の一つである **量子テレポーテーション** をqiskitではなく **量子ゲーム QLANET** の上で実行してみよう！
ということでやってみたいと思います。


QLANET は、著者(ohken)が友人数名と共同で開発した **スマホアプリで遊べる量子ボードゲーム** です。
開発にはunityが使用されています。

QLANETは、二人対戦ボードゲームとして以下のような特徴を持っています。

1. マルバツゲーム (3目並べ) をベースにしたルールなので馴染みやすく、だれでも簡単に遊べる
2. プレイヤーの行動は量子的な演算に対応し、ゲームの盤面は9bitの量子コンピュータのシミュレータに従って遷移する
3. プレイヤーの行動順は交互に回ってくるわけではなく、行動内容に応じたコストで重みづけされる

開発者としてボードゲームとしての面白さを宣伝したいところですがグッとこらえつつ…

今回は2に挙げた特徴を使って、
**Quantum Challenge の問題を QLANET でシミュレートする**
というのをやってみます。

# 2. 量子テレポーテーション

量子テレポーテーションというのは、
- 二者(アリスとボブ)間の通信において、
- 古典通信 (i.e., 量子状態を直接移動できない) のみが使えるとき、
- アリスの持つ量子状態をボブに「転送」する

ような方法です。

そもそもこれが困難である理由は、
- 量子状態がどんなものかを伝えるために量子状態の「データ」を直接取得しようとすると、測定により量子状態が変化する（元の量子状態が使えなくなる）
- 量子状態を複製することは理論的に不可能である

というところに由来します。


量子テレポーテーションでは、**もつれ状態(エンタングルメント)** を使用することでこの困難を解決します。

つまり、上記の問題設定において
- アリスとボブは最大にエンタングルした2bitの量子状態(ベル状態)を1bitずつ分け合っている

という前提を導入することで量子状態の転送を可能にするプロトコルが構築されます。

より具体的な解説と (qiskitによる) 実装については [イベントの問題ページ](https://github.com/qiskit-community/ibm-quantum-challenge-spring-2023/blob/main/content/lab_2/lab2-ja.ipynb) をご覧ください。

量子回路としては次のように書けます。
(実際の問題を解いて出てくる出力図を転載)

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/862b69cc-c71c-17a3-7ba6-bc0637528262.png)


ここで
- $q_0$ : アリスが転送したい量子状態 (1量子ビット)
- $q_1$ : アリスが保持するもつれ状態の片方 (1量子ビット)
- $q_2$ : ボブが保持するもつれ状態の片方 (1量子ビット)
- $c_0, c_1$ : アリスがボブに送信する古典情報 (2ビット)

です。
量子回路で書くと通信してる感がないですが、シナリオとしては次のような想定です。
なお、量子回路は左から右に読みます。
また、「バリア」と表現するのは、量子回路の中で区切りになっている縦線とグレーのバーを指します。

1. 一つ目のバリアまで：最初、2量子ビット $q_1, q_2$ は近くにある。HとCXでこの2量子ビットをもつれ状態にする。$q_0$ はアリス、$q_1$ はボブが保持し、二人は離れる。
2. 二つ目のバリアまで：アリスは量子ビット $q_0$ をボブに転送したくなったので、分け合ったもつれ状態の量子ビット $q_1$ と $q_0$ をさらにもつれさせる。
3. 三つ目のバリアまで：アリスは自分の持ってる二量子ビットを両方測定する。測定結果をボブに送信する (つまり $c_0, c_1$ はアリスとボブ間で共有されている)。このとき、もつれ状態の測定によってボブの持つ量子状態 $q_2$ が既に変化していることに注意。
4. 最後の if_else ブロック：ボブは転送された量子状態 $q_2$ を受信した測定結果に基づいて補正する。

上記のステップ4における「補正」の内容については詳細は省きますが、
場合によっては $q_2$ がもとの $q_0$ と異なる量子状態になっている可能性がありますが、測定結果 $c_0, c_1$ を使うことでどのように異なっているかを検知することができるため、それに応じた補正をする、という流れになります。

また、ステップ4では今回の Quantum Challenge のテーマである「動的回路」が使用されています。
つまり、「測定結果に基づいてその後の演算を決める」ということが qiskit での実装上のポイントになっています。

# 3. QLANET での実行

上記のプロトコルを、量子ボードゲーム QLANET のアプリ版上でシミュレートします。

ボードゲームでは本来プレイヤーの手番が変わっていくため一人で狙った操作をし続けることはできないですが、アプリ上で「れんしゅうモード」として遊ぶことで2プレイヤーの両方を一人で操作できるので、この機能を使っていきます。


<img width="300" alt="android_画像1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/0596b36d-1f8e-7950-8144-ac123df9069e.png">

QLANET では9量子ビットが画面の中央に表示されます。

今回は、上一段の量子ビットを $q_2, q_1, q_0$ として解釈しながらシミュレートしてみます。
つまり、ボブの量子ビットが左上、アリスが送りたい量子ビットが右上です。


<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/dd8b08a6-387e-6d9e-424d-9069c9effe84.jpeg">

右上の量子ビットは「-」状態なのでこれをボブに送信することが目標です。


それでは、まずは $q_2,q_1$ (左上と真ん中上) の量子ビットをもつれさせます。 

QLANETでは初期状態が通常の量子回路のように0状態で初期化されていないので、必要な操作が多少変わってきます。

まず $q_2$ を H ゲート 
![H.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/ad6e1de6-52ed-648c-2b66-94d425f70b75.png)
 で0状態にしておいて、


<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/d3c454f2-f6fe-1814-247f-79dab8976832.jpeg">


CX ゲートを $q_1, q_2$ に適用してもつれ状態を作ります。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/f59dfecf-26b7-415e-b294-d2701bdb1ff9.jpeg">

↑CXゲートのカードと適用する量子ビットを選択

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/317f7e0e-2b59-1dd6-58aa-7da22254abca.jpeg">

もつれ状態ができました！[^1]

[^1]: 右側の数字が急にたくさん増えていることや手持ちのカードがガラッと変わっていることが気になった読者がいるかもしれません。この数字は使ったゲートの総コストを表しています。つまり、前の画像からこの画像までに実はたくさんのゲートを消費しました。理由はこの後使う CX ゲートがなかなか手札に回ってこなかったためです…


次は、アリスが送信したい右上の量子ビット $q_0$ と真ん中上の $q_1$ をさらにもつれさせます。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/6e990c05-8edf-d362-70a7-f928f644b425.jpeg">

うまくもつれた[^2]ので、$q_0$ にさらに H ゲートを適用します。

[^2]: QLANETではもつれた状態は全て同じ画像で表示されますが、内部的には実際のもつれ方を忠実に保持しています。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/8eb8db8b-53b1-fc1c-2f98-3d131aa03df3.jpeg">


そして、$q_1, q_0$ を測定していきます。
QLANETでは、測定された量子ビットには土星の輪のようなわっかがつきます。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/4b0fa9c6-e1e0-6b82-fa06-4ac091af03e9.jpeg">
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968333/f608d03d-14d8-c7ca-5e77-7e6522bd4ca1.jpeg">

見事に、ボブの量子ビット $q_2$ (左上) にアリスがもともと持っていた量子状態の「-」状態が移動しました！

ここでは偶然測定結果が「00」になったため、この後の補正処理は不要でした。
「00」以外の結果が出た場合はその結果に応じて $q_2$ に適切に追加のゲートを適用すればやはり「-」状態が得られます。

以上で、量子テレポーテーションの QLANET でのシミュレーションが完了しました🎉

# 4. おわりに

量子ボードゲーム QLANET でうまく量子テレポーテーションのシミュレーションを実行できました。

なお、今回扱った量子回路は(動的回路の部分も含め) QLANET 上で実行することができますが、一般の動的回路を QLANET 上で実行できるとは限りません。
なぜなら、QLANET では一度測定した量子ビット(わっかがついた状態)はその後もう使用することができないからです。

今回のシミュレーションをしてみて、動的回路への理解が深まると同時に、これをゲームの要素としてどんな風に扱えるかなーといった想像をするきっかけになりました！

それでは、今回の内容は以上です。
またお会いしましょう！


PS: QLANETに興味を持った方は、ぜひアプリDL、Twitterフォローしてみてください！
Android: https://play.google.com/store/apps/details?id=com.QLANET.QLANET
iOS: https://apps.apple.com/jp/app/qlanet/id6448213346
Twitter: https://twitter.com/qlanet_game