@yuichirominato 2018.11.16更新 48views

Blueqatで汎用型量子ゲートの量子テレポーテーション実装

Blueqat 量子ゲート 量子コンピュータ 量子もつれ

はじめに

以前連続量プログラミングで量子テレポーテーションを紹介しました。

光連続量量子テレポーテーションプログラミング
http://blog.mdrft.com/post/208

今回は汎用型量子ゲートマシンでのBlueqatSDKを利用して量子テレポーテーションを実装したいと思います。

量子テレポーテーション

テレポーテーションという名前であるものの、粒子が空間の別の場所に瞬間移動するわけではない。量子もつれの関係にある2つの粒子のうち一方の状態を観測すると瞬時にもう一方の状態が確定的に判明することからこのような名前がついた。また、この際に粒子間で情報の伝達や物理的作用は起こっていない。

量子テレポーテーションはEPRペアという量子もつれの関係にある2つの粒子の間に起こる。

引用:https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%83%86%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

以前上記の量子テレポーテーションで紹介したように、量子もつれを生成し、それを測定し、測定結果を持って、最終的な転送先の量子ビットの操作をすることで量子状態を写すことができます。

今回は量子状態を追っての数式は細かくは確認しませんが、主には各量子ビットの状態をゲートごとに変換して状態の係数をみていくことで量子テレポーテーションの内部の量子状態を追うことができます。こちらが詳しいので、勉強したい方はこちらを参照ください。

吾輩は量子プログラミング言語である。名前はまだ無い。 Microsoftで生れ量子テレポーテーションした事だけは記憶している。
https://qiita.com/piyo7/items/0c80181c567b3075c00f

回路を見てみる

最初にq0の状態を決めます。ここでは?にしています。次に、最初に量子もつれを作るのはq1とq2です。q1にHゲート、q1,q2にCNOTをかけることで、EPRペアと呼ばれる量子もつれ状態を実現できます。そして、ベル測定という部分ですが、q0,q1にもつれを発生させ、q0にHゲートをかけてから測定をします。今回は測定の代わりにCX/CZ回路で代替します。本来はCX/CZの代わりに測定をして、Xゲート、Zゲートを適用させます。


q0 -?-----*-H---*-------
q1 ---H-*-X---*-|-------
q2 -----X-----X-Z-------

CZゲートはあるようですが、せっかくなのでCXを使って下記のように表現します。


q0 -?-----*-H-----*-------
q1 ---H-*-X---*---|-------
q2 -----X-----X-H-X-H-----

コードを見てみます。


from blueqat import Circuit
import math

#量子テレポーテーション回路
Circuit().h[1].cx[1,2].cx[0,1].h[0].cx[1,2].h[2].cx[0,2].h[2]

このように通常のコードで実現できました。状態を少しだけ確認してみます。
$\mid 0 \rangle$は何もしなければいいので、


for i in range(20): 
    c = Circuit().h[1].cx[1,2].cx[0,1].h[0].cx[1,2].h[2].cx[0,2].h[2].m[:] 
    c.run() 
    print(c.last_result()) 

(0, 0, 0)
(0, 1, 0)
(0, 1, 0)
(1, 1, 0)
(0, 1, 0)
(0, 0, 0)
(0, 0, 0)
(0, 1, 0)
(0, 0, 0)
(1, 1, 0)
(0, 1, 0)
(0, 1, 0)
(1, 0, 0)
(1, 1, 0)
(1, 0, 0)
(1, 0, 0)
(0, 1, 0)
(1, 1, 0)
(1, 0, 0)
(1, 1, 0)

q0とq1の測定結果によらずq2にq0の元の状態の0が移っています。次に$\mid 1 \rangle$は、


for i in range(20): 
    c = Circuit().x[0].h[1].cx[1,2].cx[0,1].h[0].cx[1,2].h[2].cx[0,2].h[2].m[:] 
    c.run() 
    print(c.last_result()) 

(1, 1, 1)
(0, 0, 1)
(0, 1, 1)
(1, 0, 1)
(1, 0, 1)
(1, 1, 1)
(1, 1, 1)
(0, 1, 1)
(1, 0, 1)
(0, 1, 1)
(1, 1, 1)
(1, 0, 1)
(1, 1, 1)
(1, 1, 1)
(1, 0, 1)
(0, 1, 1)
(0, 1, 1)
(1, 1, 1)
(0, 1, 1)
(1, 0, 1)

同様にq0とq1の測定結果によらず、q0の状態の1が移ってます。最後にHゲートをq0にかけてみると、


for i in range(20): 
    c = Circuit().h[0].h[1].cx[1,2].cx[0,1].h[0].cx[1,2].h[2].cx[0,2].h[2].m[:] 
    c.run() 
    print(c.last_result())
                                                                                                          
(1, 1, 0)
(0, 1, 0)
(0, 0, 1)
(0, 1, 1)
(1, 1, 1)
(0, 1, 1)
(1, 1, 0)
(1, 1, 0)
(1, 0, 0)
(0, 0, 0)
(1, 0, 1)
(0, 1, 0)
(1, 0, 1)
(1, 0, 0)
(0, 0, 1)
(1, 1, 0)
(0, 1, 0)
(1, 1, 0)
(0, 0, 1)
(0, 0, 1)

約半々でq2に0と1がでるようになって重ね合わせ状態が移っています。以上です。

あわせて読みたい

SERVICE

汎用量子コンピュータ向けアプリケーション開発SDK

詳しく見る Githubで入手する(無料)

汎用量子コンピュータ向け高速シミュレータ

詳しく見る

量子コンピュータ向けクラウドサービス(準備中)

詳しく見る

イジングマシン向けアプリケーション開発SDK

詳しく見る Githubで入手する(無料)

COMMUNITY

量子コンピュータのことを学びたい、仕事としたいなどの情報交換の場を設け、コミュニティの形成を進めています。オフラインの勉強会と、オンラインのチャットコミュニティの2種類あります。オフラインのConnpassは1400名、オンラインのSlackは880名を超える参加があります。どちらも無料ですのでお気軽にご参加ください。

CONNPASS SLACK

CONTACT

弊社あての連絡はinfo@mdrft.comより用件を明記の上、メールで連絡を頂けますと幸いです。

ブログトップに戻る

Recent Posts