簡単な使用例¶
まず、簡単な使用例を示します。
>>> from qlazy import QState
>>>
>>> # 2つの量子ビットを|0>に初期化
>>> qs = QState(2)
>>>
>>> # 量子ゲート実行
>>> qs.h(0)
>>> qs.cx(0,1)
>>> qs.show() # 量子状態の表示
>>>
>>> # 測定
>>> md = qs.m(shots=100)
>>> md.show() # 測定結果の表示
>>> print(md.frequency) # 頻度リスト(python標準のCounter形式)
>>> print(md.last) # 最後の結果(0または1からなるの文字列)
何をやっているか順に説明します。まず、QState()で量子ビットを各々|0>に 初期化します。初期化した量子状態に対して、次々に量子ゲートを作用させ、 最後に測定して結果を表示する、というのが典型的な使用方法です。上の例で は、0番目の量子ビットにアダマールゲートをかけ、0番目と1番目の量子ビッ トに制御NOTゲートをかけています。qlazyのQStateではh()やcx()などの量子 ゲートに対応したメソッドを呼び出した時点で、量子状態を変更させる計算を 内部で行っています。
また、連続して適用したい場合、
>>> qs.h(0).cx(0,1)
のような書き方(メソッド・チェーン)も可能です。
量子状態は、show()メソッドで確認できます。上の例では、以下のような表示 がなされます。
c[00] = +0.7071+0.0000*i : 0.5000 |++++++
c[01] = +0.0000+0.0000*i : 0.0000 |
c[10] = +0.0000+0.0000*i : 0.0000 |
c[11] = +0.7071+0.0000*i : 0.5000 |++++++
2量子ビットで実行しているので、量子状態は|00>,|01>,|10>,|11>の重ね合 わせです。各々に対応した係数(複素数)をc[00],c[01],c[10],c[11]と定義 しており、それを表示しています。量子ビットオーダーは左から右に向かって 0番目,1番目…と定義しています。複素数の右に表示されている実数値 (0.5000とか0.0000)は各々の絶対値の2乗、すなわちその状態が観測される 確率を表しています。一番右に表示されている「++++++」は、その確率の大き さを視覚的にわかりやすくするための、棒グラフです。
量子ゲートの操作が終わったら、m()メソッドで測定します。m()メソッドなど の測定系のメソッドは他のゲート演算メソッドと違い、測定データクラス MDataのインスタンスをリターンします。それを適当な変数で受けてshow()メ ソッドで表示します。上の例では、例えば以下のように表示されます。
direction of measurement: z-axis
frq[00] = 49
frq[11] = 51
last state => 00
はじめの行「direction of measurement: z-axis」は、Z軸方向の測定をして います、ということ表しています。デフォルトの測定の方向はZ軸方向です。 他の大抵のシミュレータと違い、qlazyでは任意方向の測定もオプション等で 簡単に実行できるので、区別できるように測定方向を一応表示するようにして います。frq[xx]は、測定の結果、|xx>だった回数を表しています。測定の回 数は、何も指定しなければ、デフォルトで1回です。上の例では、|00>だった 回数は49回、|11>だった回数は51回だったということを表しています。内部で 乱数を発生させることで確率的な測定をシミュレートしていますので、実行の たびにこの回数は変わります。last stateは、最後の測定の結果が何だったか を表しています。
測定結果の頻度のリストをpython標準のコンテナデータ型のサブクラス Counter形式で取得したい場合はfrequencyプロパティを、最後の測定値をバイ ナリの文字列で取得したい場合はlastプロパティを使うこともできます。
>>> print(md.frequency) # 頻度リスト
Counter({'00':53,'11':47})
>>> print(md.last) # 最後の結果
00
さて、上の例では最後の測定値は|00>でした。qlazyでは、測定後の状態変化 もシミュレーションしていますので、この測定後の状態に対して、
>>> qs.show()
をすると、以下のように、波束が収縮している様子も確認することができます。
c[00] = +1.0000+0.0000*i : 1.0000 |+++++++++++
c[01] = +0.0000+0.0000*i : 0.0000 |
c[10] = +0.0000+0.0000*i : 0.0000 |
c[11] = +0.0000+0.0000*i : 0.0000 |
以上