簡単な使用例 ============ まず、簡単な使用例を示します。 >>> 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 | 以上