@yuichirominato 2018.11.23更新 191views

Blueqatで1+1と1+0と0+1と0+0を同時に計算してみた

Blueqat 加算 量子ゲート 量子コンピュータ

はじめに

別の記事でD-Wave社の量子コンピュータを使って1+1と1+0と0+1と0+0を一緒に計算してみました。

「D-Waveで1+1と1+0と0+1と0+0を一緒に計算してみた結果、、、」
http://blog.mdrft.com/post/108

今回はQiitaでこのような記事を見つけました。
「量子コンピュータで1+1を計算する」
https://qiita.com/kjtnk/items/8385052a50e3154d1022

IBMQで1+1をしています。ということで自社製のBlueqatでやってみたいと思います。

実はここで加算をやってますが、今回は4パターン同時にやってみたいと思います。
http://blog.mdrft.com/post/294

足し算について

今回はトフォリゲートとCNOTを使って、足し算をします。トフォリで桁上がりを、CNOTで0のくらいを計算します。
回路表現は、a+b = dcという感じです。

また、今回はa+bの数字を決めないで計算します。その場合には、aとbをsuperpositionに持っていけばいいのでHゲートをかけてそれぞれ重ね合わせ状態にします。その上で加算回路をすることで、0+0,0+1,1+0,1+1を同時に表現できます。


a--H---*-------*---
b--H---*---*---|---
c------|---X---X---
d------X-----------

Blueqatのコードで書くと、


from blueqat import Circuit 
import math  
c = Circuit() 

h = Circuit().h[:2] 

tof = Circuit().h[3].cx[1,3].rz(-math.pi/4)[3].cx[0,3].rz(math.pi/4)[3].cx[1,3].rz(-math.pi/4)[3].cx[0,3].rz(-math.pi/4)[1].rz(math.pi/4)[3].cx[0,1].h[3].rz(math.pi/4)[0].rz(-math.pi/4)[1].cx[0,1]  

after = Circuit().cx[0,2].cx[1,2] 
measure = Circuit().m[:] 

e = h+ tof + after 
e.run()                                                                                                                                 

array([5.00000000e-01+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j,
       0.00000000e+00+0.00000000e+00j, 5.55111512e-17-6.16297582e-33j,
       0.00000000e+00+0.00000000e+00j, 5.00000000e-01+0.00000000e+00j,
       5.55111512e-17-5.00000000e-01j, 0.00000000e+00+0.00000000e+00j,
       0.00000000e+00+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j,
       0.00000000e+00+0.00000000e+00j, 0.00000000e+00-5.00000000e-01j,
       0.00000000e+00+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j,
       0.00000000e+00+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j])

これにより計算ができました。見辛いですが、0,5,6,11番目の状態ベクトルがそれぞれ0.5となっています。
これはそれぞれの計算結果が等確率で出ているということで、それぞれを展開してみると、


In [19]: bin(0)                                                                                                                                  
Out[19]: '0b0'
#0+0=0に対応

In [20]: bin(5)                                                                                                                                  
Out[20]: '0b101'
#1+0=1に対応

In [21]: bin(6)                                                                                                                                  
Out[21]: '0b110'
#0+1=1に対応

In [22]: bin(11)                                                                                                                                 
Out[22]: '0b1011'
#1+1=2に対応

ということで計算ができました。実際の計算結果を取り出したい場合には、上記の回路に測定を入れてサンプリングをします。

(中略)
e = h+ tof + after + measure 
e.run() 
e.last_result()                                                                                                                         

(0, 1, 1, 0)

これは毎回計算するごとに結果が異なります。何回か計算してみると計算するごとに異なる上記の足し算を満たす答えが出てきます。
以上です。

あわせて読みたい

SERVICE

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

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

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

詳しく見る

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

詳しく見る

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

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

COMMUNITY

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

CONNPASS SLACK

CONTACT

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

ブログトップに戻る

Recent Posts