はじめに
「Cirq で Superdense coding を実装」
この記事を見てやってみたくなったので、やってみます。
Superdense codingとは?
1量子ビットを共有するだけで古典の00,01,10,11の2ビット分の情報を送ることができるようです。(個人的には結局二量子ビット使ってるとは思いますが、、、)
いちいち名前がかっこいいのでテンションが上がります。
手順
上記のリファレンスに書いてあるのであんまり詳しく書いても仕方なさそうですが、、、
1、量子ビットを準備
2、量子ビットをもつれさせる
3、片方の量子ビットをBob、もう片方をAliceが持つ
4、Aliceが送りたい情報に対応して操作する
送りたいビット | 操作 |
---|---|
00 | なし |
01 | X |
10 | Z |
11 | XZ |
5、AliceからBobに量子ビット送る
6、Bobがもつれをデコードして測定
これによって2ビット分の情報が得られます。最初に共有した時点では、Bobが持っている量子ビットはなんの操作もされていないので、実質的に操作した1量子ビットの情報で2ビット分の情報が得られるのがキモではないでしょうか。
回路
回路は、
1、もつれエンコード
2、古典情報に対応した操作
3、もつれデコード
の3ステップで実現できるようです。
alice |0> --H--*----operation----*--H--
| |
bob |0> -----X-----------------X-----
H-CXでもつれエンコード
古典情報に対応した操作
CX-Hでもつれデコード
で対応できます。
コード
コードは上記回路の通りにやれば大丈夫そうです。
from blueqat import Circuit
encode = Circuit().h[0].cx[0,1]
decode = Circuit().cx[0,1].h[0]
ope00 = Circuit()
ope01 = Circuit().x[0]
ope10 = Circuit().z[0]
ope11 = Circuit().x[0].z[0]
(encode + ope00 + decode).m[:].run(shots=100)
#Counter({'00': 100})
Counter({'00': 100})
(encode + ope01 + decode).m[:].run(shots=100)
#Counter({'01': 100})
Counter({'01': 100})
(encode + ope10 + decode).m[:].run(shots=100)
#Counter({'10': 100})
Counter({'10': 100})
(encode + ope11 + decode).m[:].run(shots=100)
#Counter({'11': 100})
Counter({'11': 100})
となり、正しくコーディングされました。以上です。