common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

Superdense codingを実装

Yuichiro Minato

2021/01/16 05:49

#量子ゲート

はじめに

「Cirq で Superdense coding を実装」 https://qiita.com/ymurata/items/65b9d80a965cae2d64e8

この記事を見てやってみたくなったので、やってみます。

Superdense codingとは?

1量子ビットを共有するだけで古典の00,01,10,11の2ビット分の情報を送ることができるようです。(個人的には結局二量子ビット使ってるとは思いますが、、、) https://en.wikipedia.org/wiki/Superdense_coding

いちいち名前がかっこいいのでテンションが上がります。

手順

上記のリファレンスに書いてあるのであんまり詳しく書いても仕方なさそうですが、、、

1、量子ビットを準備 2、量子ビットをもつれさせる 3、片方の量子ビットをBob、もう片方をAliceが持つ 4、Aliceが送りたい情報に対応して操作する

送りたいビット操作
00なし
01X
10Z
11XZ

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})

となり、正しくコーディングされました。以上です。

© 2024, blueqat Inc. All rights reserved