@yuichirominato 2018.10.08更新 76views

量子コンピュータの国産シミュレータblueqatをつかってゲート操作の基本

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

はじめに

Blueqatという量子ゲートモデルの量子コンピュータシミュレータを使って見たいとおもいます。海外製のシミュレータ運用が多い中、国産で海外と同じような機能が搭載されているので仕組みを質問したり組み込みしやすいという利点があります。量子コンピュータを学ぶために何からという話もありますが、ここでは量子コンピュータの3つの操作を覚えることで、演算の全てができます。

入手

入手方法はgithubというところにあるか、もしくはpipというpythonのパッケージ管理の仕組みから導入できます。

githubはこちら
https://github.com/mdrft/Blueqat

pipインストールは、

pip install blueqat

これだけです。

量子コンピュータの計算の基礎

量子コンピュータもただの計算機ですから、計算できることが基本です。大きくは私たちの使用しているPCなどとは変わりません。そのかわりまだ計算回路が初歩的なので少しルールがあります。

1、量子ビットの初期化
2、量子ゲート回路の作成
3、量子ビットの測定

大きく分けて上記の手順がありますが、1の初期化に関しては最初はビットは全て0で初期化されるのが普通なので、特に明示的な何かを行う必要はありません。また、測定もほぼ自動的に行われるので、実際はプログラムの準備をして2番目の量子ゲート回路という物を作れば済むという話になります。

チュートリアル

Blueqatにはチュートリアルが用意されています。
https://github.com/mdrft/Blueqat/tree/master/tutorial_ja

この中に今回のゲート操作の基本などのチュートリアルも含まれています。
https://github.com/mdrft/Blueqat/blob/master/tutorial_ja/tutorial001_basic_circuit.ipynb

回路の準備

回路を描く準備をします。Blueqatでは、準備は下記の通りです。

from blueqat import Circuit
c = Circuit()

ライブラリを読み込み、インスタンスの生成というものをして終わりです。
量子ビットを複雑に用意したりという必要はありません。

ゲート回路をかく

量子ゲートの計算にはゲート回路を書きます。この部分は今後もっと具体的に行なっていきますが、今回は書き方だけ確認します。書き方はメソッドチェーンと呼ばれる、数珠つなぎの記述で行います。インスタンスを作成して、そのまま数珠つなぎに繋いで最後にrun()すると実行できます。下記の計算は、

Circuit().x[0].cnot[0,1].run()                                                             

結果として、

array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])

このような答えが出てきました。

答えを確認する

答えは状態関数と呼ばれる量子コンピュータ特有の形で出てきました(シミュレータのみ)。通常は量子ビットの01で表現されますが、上記は関数の形で答えが出てきました。最後に量子ビットの形で表現する必要があります。

c = Circuit().h[0].cx[0,1].m[0]
c.run() # array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])
c.last_result() # (1, 0)

こんな感じになります。結局私たちが書けばいいのは、Circuit()以降のゲートの部分だけです。これを工夫して描くことで量子コンピュータでの計算を行うことができます。

回路を作ってみる

チュートリアルの通りまずは普通の量子ゲートモデルのゲート回路を作って見ます。2量子ビットのGroverのアルゴリズムです。Groverのアルゴリズムは検索に利用されるとても有名な回路です。

from circuit import Circuit
c = Circuit().h[:2].cz[0,1].h[:].x[:].cz[0,1].x[:].h[:].m[:]
c.run()
print(c.last_result())

(1, 1)

答えが出ました。

QAOAやってみる

ポイントはQAOAと呼ばれる組み合わせ最適化問題です。blueqatではこのmaxcutか自然数分割問題を解く機能が搭載されています。

参考:NP問題のイジング
http://blog.mdrft.com/post/42

QAOAはハミルトニアンと呼ばれる組合せ最適化問題の問題をゲート回路に分解し、そして様々な探索を通じて最適なパラメータを探すアルゴリズムです。

実行はBlueqatから簡単です。

from examples_maxcut_qaoa import *
result = maxcut_qaoa(2, [(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2), (4, 0), (4, 3)])
print("""
       {4}
      / \\
     {0}---{3}
     | x |
     {1}---{2}
""".format(*result))

これを行うことで、答えとなる下記の回答を得ることができます。


       0
      / \
     1---1
     | x |
     0---0

また、途中計算は、このように繰り返し計算が実装されています。

params: [4.7711306  0.39475882 2.27695518 0.62962004]
val: 0.6442464501941702
params: [4.7711306  0.39475882 2.27695518 0.62962004]
val: 0.6442464501941702
params: [5.7711306  0.39475882 2.27695518 0.62962004]
val: -0.6741378938317857
params: [7.3891646  0.39475882 2.27695518 0.62962004]
val: 1.033344739502799
params: [5.7711306  0.39475882 2.27695518 0.62962004]
val: -0.6741378938317857
params: [5.7711306  0.39475882 2.27695518 0.62962004]
val: -0.6741378938317857
params: [5.7711306  1.39475882 2.27695518 0.62962004]
val: 0.03621892552658165
params: [ 5.7711306  -1.22327518  2.27695518  0.62962004]
val: 1.3907931830213847
params: [5.7711306  0.39475882 2.27695518 0.62962004]
val: -0.6741378938317857
params: [ 5.7711306  -0.22327515  2.27695518  0.62962004]
val: -0.2416134394522073
params: [5.7711306  0.77672482 2.27695518 0.62962004]
val: 0.27976768289294374
params: [5.7711306  0.1951876  2.27695518 0.62962004]
val: -1.2395894132693093
params: [5.7711306  0.1951876  2.27695518 0.62962004]
val: -1.2395894132693093
params: [5.7711306  0.1951876  3.27695518 0.62962004]
val: 0.5330217065071192
params: [5.7711306  0.1951876  0.65892118 0.62962004]
val: -1.4180241050905202
params: [5.7711306  0.1951876  1.38109833 0.62962004]
val: 2.8473804304210715
params: [5.7711306  0.1951876  2.27695518 0.62962004]
val: -1.2395894132693093
params: [5.7711306  0.1951876  2.65892118 0.62962004]
val: 1.8699704968237367
params: [5.7711306  0.1951876  1.93476832 0.62962004]
val: -1.0955906019458146
params: [5.7711306  0.1951876  2.12365819 0.62962004]
val: -1.5776061708004299
params: [5.7711306  0.1951876  2.12365819 0.62962004]
val: -1.5776061708004299
params: [5.7711306  0.1951876  2.12365819 1.62962004]
val: 2.5832701565419853
params: [ 5.7711306   0.1951876   2.12365819 -0.98841396]
val: -1.5351383963881253
params: [5.7711306  0.1951876  2.12365819 0.62962004]
val: -1.5776061708004299
params: [5.7711306  0.1951876  2.12365819 0.01158606]
val: 2.9141965853592917
params: [5.7711306  0.1951876  2.12365819 1.01158604]
val: 0.8491086007432418
params: [5.7711306  0.1951876  2.12365819 0.58739073]
val: -1.5438768573129749
params: [5.7711306  0.1951876  2.12365819 0.63219214]
val: -1.5773401002883256
params: [5.7711306  0.1951876  2.12365819 0.62833755]
val: -1.5776390965621958
params: [5.7711306  0.1951876  2.12365819 0.62577258]
val: -1.577505830379183
params: [ 6.77113060e+00 -4.38361802e-03  1.97036120e+00  6.27055064e-01]
val: 2.9336669833782616
params: [5.7711306  0.1951876  2.12365819 0.62833755]
val: -1.5776390965621958
params: [6.7711306  0.1951876  2.12365819 0.62833755]
val: 1.2838239481816343
params: [4.1530966  0.1951876  2.12365819 0.62833755]
val: -0.1728652910476403
params: [5.7711306  0.1951876  2.12365819 0.62833755]
val: -1.5776390965621958
params: [5.15309662 0.1951876  2.12365819 0.62833755]
val: -0.35206597411840085
params: [6.1530966  0.1951876  2.12365819 0.62833755]
val: -0.7268864531430241
params: [5.69760874 0.1951876  2.12365819 0.62833755]
val: -1.6053893620556652
params: [5.55056502 0.1951876  2.12365819 0.62833755]
val: -1.4932920580455191
params: [5.69760874 0.1951876  2.12365819 0.62833755]
val: -1.6053893620556652
params: [5.69760874 1.1951876  2.12365819 0.62833755]
val: 0.28354079394804016
params: [ 5.69760874 -1.4228464   2.12365819  0.62833755]
val: -0.0767857229075124
params: [5.69760874 0.1951876  2.12365819 0.62833755]
val: -1.6053893620556652
params: [ 5.69760874 -0.42284637  2.12365819  0.62833755]
val: 2.5409683218632306
params: [5.69760874 0.5771536  2.12365819 0.62833755]
val: -0.0553567636133373
params: [5.69760874 0.19772241 2.12365819 0.62833755]
val: -1.604203742076398
params: [5.69760874 0.17173935 2.12365819 0.62833755]
val: -1.6071453720214819
params: [ 5.69760874 -0.05537218  2.12365819  0.62833755]
val: -0.7333042718589586
params: [5.69760874 0.12484285 2.12365819 0.62833755]
val: -1.5592299932637985
params: [5.69760874 0.17173935 2.12365819 0.62833755]
val: -1.6071453720214819
params: [5.69760874 0.17173935 3.12365819 0.62833755]
val: 2.4316422831284763
params: [5.69760874 0.17173935 0.50562419 0.62833755]
val: -1.5167684127007026
params: [5.69760874 0.17173935 2.12365819 0.62833755]
val: -1.6071453720214819
params: [5.69760874 0.17173935 1.50562421 0.62833755]
val: 2.767219785764853
params: [5.69760874 0.17173935 2.50562419 0.62833755]
val: 0.28844748711018864
params: [5.69760874 0.17173935 2.10855813 0.62833755]
val: -1.5857659399004995
params: [5.69760874 0.17173935 2.16017649 0.62833755]
val: -1.62874564317356
params: [5.69760874 0.17173935 2.29212576 0.62833755]
val: -1.3353383536792864
params: [5.69760874 0.17173935 2.16017649 0.62833755]
val: -1.62874564317356
params: [5.69760874 0.17173935 2.16017649 1.62833755]
val: 2.7012476619831522
params: [ 5.69760874  0.17173935  2.16017649 -0.98969645]
val: -1.572094611156126
params: [5.69760874 0.17173935 2.16017649 0.62833755]
val: -1.62874564317356
params: [5.69760874 0.17173935 2.16017649 0.01030358]
val: 3.0320378566952386
params: [5.69760874 0.17173935 2.16017649 1.01030355]
val: 0.7969701038809374
params: [5.69760874 0.17173935 2.16017649 0.59074849]
val: -1.5911164779034124
params: [5.69760874 0.17173935 2.16017649 0.63810813]
val: -1.6289505133879172
params: [5.69760874 0.17173935 2.16017649 0.65764928]
val: -1.6174853302772605
params: [5.62408688 0.1482911  2.19669479 0.6478787 ]
val: -1.6107708273131665
params: [5.69760874 0.17173935 2.16017649 0.63810813]
val: -1.6289505133879172
params: [6.69760874 0.17173935 2.16017649 0.63810813]
val: 1.0687057288547024
params: [4.07957474 0.17173935 2.16017649 0.63810813]
val: -0.13398710034865835
params: [5.69760874 0.17173935 2.16017649 0.63810813]
val: -1.6289505133879172
params: [5.07957476 0.17173935 2.16017649 0.63810813]
val: -0.2432305641488321
params: [6.07957474 0.17173935 2.16017649 0.63810813]
val: -0.896434069212672
params: [5.65808677 0.17173935 2.16017649 0.63810813]
val: -1.6368270057386503
params: [5.57904283 0.17173935 2.16017649 0.63810813]
val: -1.6026281699249436
params: [5.65808677 0.17173935 2.16017649 0.63810813]
val: -1.6368270057386503
params: [5.65808677 1.17173935 2.16017649 0.63810813]
val: 0.27592509383340436
params: [ 5.65808677 -1.44629465  2.16017649  0.63810813]
val: -0.052887625164805
params: [5.65808677 0.17173935 2.16017649 0.63810813]
val: -1.6368270057386503
params: [ 5.65808677 -0.44629462  2.16017649  0.63810813]
val: 2.5574663430394007
params: [5.65808677 0.55370535 2.16017649 0.63810813]
val: -0.16998160964094255
params: [5.65808677 0.18203459 2.16017649 0.63810813]
val: -1.6349221156139735
params: [5.65808677 0.16748004 2.16017649 0.63810813]
val: -1.6366925698733246
params: [5.65808677 0.17067019 2.16017649 0.63810813]
val: -1.6368442915951875
params: [5.65808677 0.17067019 2.16017649 0.63810813]
val: -1.6368442915951875
params: [5.65808677 0.17067019 3.16017649 0.63810813]
val: 2.287312095439514
params: [5.65808677 0.17067019 0.54214249 0.63810813]
val: -1.5974407779504944
params: [5.65808677 0.17067019 2.16017649 0.63810813]
val: -1.6368442915951875
params: [5.65808677 0.17067019 1.54214251 0.63810813]
val: 2.6813172666337795
params: [5.65808677 0.17067019 2.54214249 0.63810813]
val: 0.7144580204353475
params: [5.65808677 0.17067019 2.11696944 0.63810813]
val: -1.603663906692841
params: [5.65808677 0.17067019 2.16215181 0.63810813]
val: -1.6368712359043376
params: [5.65808677 0.17067019 2.16610244 0.63810813]
val: -1.6365284861833365
params: [5.65808677 0.17067019 2.16215181 0.63810813]
val: -1.6368712359043376
params: [5.65808677 0.17067019 2.16215181 1.63810813]
val: 2.7046442245838076
params: [ 5.65808677  0.17067019  2.16215181 -0.97992587]
val: -1.5761186594259178
params: [5.65808677 0.17067019 2.16215181 0.63810813]
val: -1.6368712359043376
params: [5.65808677 0.17067019 2.16215181 0.02007415]
val: 3.032005664392093
params: [5.65808677 0.17067019 2.16215181 1.02007413]
val: 0.7637011252457333
params: [5.65808677 0.17067019 2.16215181 0.6020264 ]
val: -1.5987197585565194
params: [5.65808677 0.17067019 2.16215181 0.65016939]
val: -1.637622193034288
params: [5.65808677 0.17067019 2.16215181 0.6742919 ]
val: -1.6210514123140278
Optimization terminated successfully.
         Current function value: -1.637622
         Iterations: 3
         Function evaluations: 103
initial   params: [4.7711306  0.39475882 2.27695518 0.62962004]
optimized params: [5.65808677 0.17067019 2.16215181 0.65016939]
Most significant index: 10010

回路1:CNOT Reverse

CNOTゲートはコントロールゲートとターゲットゲートからなり、コントロールゲートが1の時に、ターゲットゲートを反転させます。ここでは、アダマールゲートHを使ってターゲットとコントロールゲートを逆転させることをします。

まずは読みこみ

import numpy as np
from blueqat import Circuit

次に回路

c = Circuit().x[0].h[:].cnot[1,0].h[:]
c.run()

実行して、

array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])

左から数えて0から4番目なので、

bin(3)

として、

0b11

11が取り出せましたので、両方の量子ビットが1となり、CNOTが動いています。

回路2:SWAP

こちらはCNOT三回で。下記には実機対応でCNOT reverseがありますが、CNOT3つでやります。

c = Circuit().x[0].cnot[1,0].cnot[0,1].cnot[1,0]
c.run()

実行結果は、

array([0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j])

状態ベクトルを2進数に変換して、

bin(2)

0b10

こちらも10となり、入れ替わっていることが確認できました。

回路3:Toffoliゲート

コントロールゲートが2つあり、両方とも1の時だけターゲットビットを反転させます。

Tゲートがないので、RZで代用します。

c = Circuit().x[1:].h[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[:1].h[0].cnot[1,0].cnot[0,1].cnot[1,0].cnot[2,0].rz(-np.pi/4)[0].rz(np.pi/4)[2].cnot[2,0]
c.run()

結果は、

array([0.+0.00000000e+00j, 0.+0.00000000e+00j, 0.+0.00000000e+00j,
       0.+0.00000000e+00j, 0.+0.00000000e+00j, 0.+1.57009246e-16j,
       0.+0.00000000e+00j, 1.+0.00000000e+00j])

2進数に直して、

bin(7)

0b111

きちんとすべて1になりました。また、念のため2番目だけを1にしてみます。

c = Circuit().x[2].h[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[:1].h[0].cnot[1,0].cnot[0,1].cnot[1,0].cnot[2,0].rz(-np.pi/4)[0].rz(np.pi/4)[2].cnot[2,0]
c.run()

結果は、

array([0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j])

二進数に直して、

bin(4)

結果として、変化はありませんでした。

0b100

きちんとToffoliゲートが実現できています。

回路4:反復符号

簡単なビット反転の反復符号も実装してみます。
誤り検出に使えるパリティビットをセットします。

最初のHTHの代わりにXを設定してみます。CNOTもCNOT reverseを使う必要はないので、そのまま使ってみます。コードは、

c = Circuit().x[1].cnot[1,0].cnot[1,2]
c.run()

結果は、

array([0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])

二進数に直すと

bin(7)

全てのビットがコピーされているのがわかります。

0b111

0でやっても同じ、

c = Circuit().cnot[1,0].cnot[1,2]
c.run()

結果は、

array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j])

二進数に直して、

bin(0)

0b0

となりました。000となり確認できました。

回路5:ビット反転誤り検出

パリティチェックではエラーが起きているかどうかを余剰ビットを活用して判断します。

上記の最初のHTHの代わりにXを用いて1にしてみました。

c = Circuit().x[2].cnot[2,1].cnot[2,0].cnot[2,3].cnot[3,2].cnot[0,2].cnot[1,2].cnot[2,4].cnot[4,2].cnot[1,2].cnot[3,2]
c.run()

結果は、

array([0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j])

二進法にして、

bin(11)

結果は、

0b1011

となり、5量子ビットの場合には、01011となり、量子ビット0,1,3番目が1となってコピーされ。エラーがないのでパリティビットは0のままです。

エラーを作ってみる

q0にエラーを意図的に作ってみます。

回路は途中に意図的にエラーを入れるXゲートが差し込まれています。

c = Circuit().x[2].cnot[2,1].cnot[2,0].cnot[2,3].cnot[3,2].x[0].cnot[0,2].cnot[1,2].cnot[2,4].cnot[4,2].cnot[1,2].cnot[3,2]
c.run()

結果は、

array([0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,
       0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j])

二進法にして、

bin(26)

結果は、

0b11010

となり、パリティビットの量子ビット4番目が1となってエラーのあることが確認できました。

あわせて読みたい

SERVICE

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

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

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

詳しく見る

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

詳しく見る

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

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

COMMUNITY

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

CONNPASS SLACK

CONTACT

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

ブログトップに戻る

Recent Posts