Nobisuke
Dekisugi
RAG
Privacy policy
2021/01/16 05:49
「Cirq で Superdense coding を実装」 https://qiita.com/ymurata/items/65b9d80a965cae2d64e8
この記事を見てやってみたくなったので、やってみます。
1量子ビットを共有するだけで古典の00,01,10,11の2ビット分の情報を送ることができるようです。(個人的には結局二量子ビット使ってるとは思いますが、、、) https://en.wikipedia.org/wiki/Superdense_coding
いちいち名前がかっこいいのでテンションが上がります。
上記のリファレンスに書いてあるのであんまり詳しく書いても仕方なさそうですが、、、
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でもつれデコード
で対応できます。
コードは上記回路の通りにやれば大丈夫そうです。
Copy 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})
Copy (encode + ope01 + decode).m[:].run(shots=100) #Counter({'01': 100})
Counter({'01': 100})
Copy (encode + ope10 + decode).m[:].run(shots=100) #Counter({'10': 100})
Counter({'10': 100})
Copy (encode + ope11 + decode).m[:].run(shots=100) #Counter({'11': 100})
Counter({'11': 100})
となり、正しくコーディングされました。以上です。
© 2024, blueqat Inc. All rights reserved