blueqatによる量子プログラミング超入門[01]1ビットを生成してグラフにしてみる
§ blueqatとは
blueqatは、量子コンピューターの挙動を古典コンピューター(以後、現在私たちが日常に用いているコンピューターを指します)で模倣(シミュレーション)したコンピューターです。
blueqatはOSS(オープン・ソース・ソフトウェア)として株式会社blueqat(東京・本郷)から提供されています。
§ 量子コンピューターの挙動と量子力学
量子コンピューターは、物理学の分野の一つである量子力学の原理を応用したコンピューターです。
特に、電子が固有にもっているスピン角運動量について、上向きスピンと下向きスピンの二値が同時に存在することができる性質を応用し、それぞれの状態をコンピューターのビットである0と1に割り当て、この0と1が混在した状態から測定によりビット値がどらちかに確定する際の物理的な作用(自然原理)と結果を引用します。
この0と1が混在することができる性質を重ね合わせの原理と言います。
§ 量子ビットの取り扱い
古典コンピューターの計算処理の最小単位はビットで、1ビットの値は0または1のどちらかに固定されています。
量子コンピューターにおいても同様にビットを計算処理の単位として扱いますが、古典コンピューターとの違いは、上記のスピン角運動量の性質を用いて、0と1の両方の値を保持することができる点です。
これは一見すると計算が複雑になり矛盾しているように感じますが、実際に量子コンピューターを用いて計算処理を実行すると、物理的な自然原理により量子ビット(0あるいは1のいずれか)の値が最適値として出現し、処理結果上で観測されます。
一つの量子ビットをギリシャ文字記号
量子ビットは0ビットと1ビットの重ね合わせとして以下のように表現します。
さらに、0ビットと1ビットの重ね合わせにおいてそれぞれの割合を加味します。0ビットには
ここで、
この確率は以下の式で表現します。
この
§ 1量子ビットを生成する
では上記の性質を利用し、さっそくプログラミングしてみましょう。
実行環境はblueqat cloudを使用します。blueqat.comのサイトからアカウント登録を行うと、同サイトから実行環境を呼び出すことができます。
blueqatは基本的にpython言語をベースに書かれます。
プログラムの冒頭でblueqatライブラリをインポートします。
from blueqat import Circuit
1量子ビットを生成するには、たとえば以下のように実行します。
q = Circuit(1)
数字の1はビット数を意味します。ここでは、1量子ビットを生成することになります。
量子ビットを生成した後、以下のm[:]により測定を行います。
q.m[:]
さらに、run(shots=1000)で測定を1000回繰り返し行います。その結果をresultに格納します。
result = q.run(shots=1000)
量子コンピューターの処理では、複数回の測定を行う必要があります。
特に実機では測定エラーが発生したり、量子の挙動が確率のもとで出現するため、なるべく多く測定を行い、より高い精度を取得できるように複数回実行します。
複数回の測定実行後に、以下のメソッドで結果を出力しています。
resultはpythonのCollection型で返却されます。測定結果として、どのような量子ビットが何個ずつ含まれるかが表示されます。
print(result)
これまでの処理をまとめたソースが以下です。
# blueqatのインポート
from blueqat import Circuit
# 1量子ビットを生成
q = Circuit(1)
# 量子ビットを測定
q.m[:]
# 回数を設定して実行
result = q.run(shots=1000)
# 測定結果を出力
print(result)
Counter({'0': 1000})
§ 結果をグラフで描画する
測定結果を可視化しやすいように、グラフを用いて描画します。
ここではpythonのグラフライブラリmatplotlibの中から、棒グラフを選択しました。
x軸に量子ビットの値を、y軸に測定結果の出現回数を描画します。
これらの処理をまとめたソースが以下です。
# グラフに描画する
%matplotlib inline
import matplotlib.pyplot as plt
# 量子ビットの値を取得
x = list(result.keys())
# 量子ビットの出現回数を取得
y = list(result.values())
# x軸ラベルを設定
plt.xlabel('value of 1-quantum bit')
# y軸ラベルを設定
plt.ylabel('number of appearances')
# 棒グラフを描画
plt.bar(x, y)
plt.show()
<Figure size 432x288 with 1 Axes>
グラフの内容からわかる通り、1量子ビットを生成して測定を行った結果、量子ビットの値は0であり、1000回の測定で全ての結果が0であることがわかりました。
実は量子コンピューターでは、量子ビットを生成する際にはその値を0に初期化して生成することが基本となっています。
量子コンピューターを使用した計算では、この初期値0に対して様々な操作や演算を適用して、その計算結果を測定し最終的な解を得ることになります。
今回の記事では、blueqatを使用した基本的な操作を解説しました。
より詳しい情報は、blueqatの公式ドキュメントがありますので、以下からご参照下さいますようお願い申し上げます。