前にも作ったかもしれませんが、IBMQのQiskitと呼ばれるツールを使って、最初の一歩をしてみましょう。
量子重ね合わせと呼ばれる現象と、量子もつれと呼ばれる現象を覚えるのが量子コンピュータのプログラミングの一歩目です。
まずはインストール
IBMのqiskitはpythonから利用できます。pipのインストールは、
pip install qiskit pylatexenc
回路の書き出しを豊富にするためにちょっとpylatexencを入れています。
ツールの読み込み
まずはツールの読み込みです。
import numpy as np
from qiskit import *
%matplotlib inline
数値ライブラリのnumpyも一緒に読み込みます。jupyternotebook環境で実行しています。
回路の初期化
まずは量子回路を準備しましょう。量子回路というものを書いていきます。
#1量子ビットの回路を作成する
circ1 = QuantumCircuit(1)
今回は量子ビットを1つだけ利用するので、カッコの中に1を入れて実行します。これで回路が初期化できました。
次に量子回路を記述
こちらがプログラミングに相当します。
#量子回路を適用
circ1.h(0)
今回はHゲート、アダマールゲートと呼ばれるものを0番目の量子ビットに適用しました。0は量子ビットの番号で、0,1,2,...というように0から数えます。
一旦回路を確認
回路を実行する前にいったん作った回路を確認してみましょう。
#量子回路を描画
circ1.draw()
こうなりました。もうちょっとリッチな表現を使ってみます。
circ1.draw('mpl')
きれいになりました。計算は量子ビットが0からスタートし、Hゲートが計算されます。
測定
計算だけでは終わりません。量子コンピュータでは、測定と呼ばれる操作が必要です。測定回路を作り、それをくっつけましょう。ここでもいったん描画して確認してみます。
# 量子回路に測定を入れる
meas1 = QuantumCircuit(1, 1)
meas1.measure(range(1), range(1))
# 測定込みの回路にする
qc1 = circ1 + meas1
#量子回路を描画
qc1.draw('mpl')
こうなりました。先ほどの回路にメーターのような記号がつきました。これで全て準備が整いました。初期化された量子ビットにHゲートの計算をして、計算結果を取り出す準備ができました。
計算する
実際に計算をします。今回はシミュレータを利用します。qasm simulatorというものを呼び出します。そして、計算回数を指定します。ここでは、1024回同じ計算をするということになります。そして、計算を実行し、計算結果を取り出します。
#シミュレータを準備
backend_sim = Aer.get_backend('qasm_simulator')
#計算を1024回行う
job_sim = execute(qc1, backend_sim, shots=1024)
#計算結果を取り出す
result_sim = job_sim.result()
計算を複数回する理由は後で見てましょう。
計算結果をカウントする
計算結果を表示してみましょう。
#計算結果をカウントする
counts = result_sim.get_counts(qc1)
print(counts)
計算結果はこのようになりました。
{'0': 510, '1': 514}
0と1が約半分ずつ出ています。Hゲートは0と1を半分ずつ出す計算でした。これは1024回計算する必要は約半分ずつ出るのを確認するためでした。
もつれ
続いて簡単にもつれ回路を作ってみます。こちらは、2量子ビットを準備し、Hゲートを0番目に、CXゲートを0と1番目にかけます。CXゲートは、0番目の量子ビットが0の時には何もせず、1の時にのみ1番目の量子ビットを反転させます。
#2量子ビットの回路を作成する
circ2 = QuantumCircuit(2)
#量子ゲートを適用
circ2.h(0)
circ2.cx(0,1)
# 量子回路に測定を入れる
meas2 = QuantumCircuit(2, 2)
meas2.measure(range(2), range(2))
# 測定込みの回路にする
qc2 = circ2 + meas2
#量子回路を描画
qc2.draw('mpl')
量子ビットが増えたので多少記述が変わりましたが、基本的な流れは同じです。回路を確認してみると、
このようになりました。いい感じです。Hゲートを適用し、CXゲートを適用し、両方の量子ビットを測定して結果を取り出します。
結果の取り出し
計算をします。先ほどと同じように、シミュレータを準備し、1000回計算します。
#シミュレータを準備
backend_sim = Aer.get_backend('qasm_simulator')
#計算を1024回行う
job_sim = execute(qc2, backend_sim, shots=1000)
#計算結果を取り出す
result_sim = job_sim.result()
#計算結果をカウントする
counts = result_sim.get_counts(qc2)
print(counts)
計算結果は、今回も約半々になりました。
{'00': 495, '11': 505}
前回と違うところは、2量子ビット使っていることと、計算結果に特徴があることです。
まず、重ね合わせを使っただけでは計算結果が増えてしまいます。2量子ビットあるときの答えの可能性は、00,01,10,11の4通りです。両方の量子ビットを重ね合わせにするだけだと、4通り答えが出て、どれが答えかわからなくなります。
そして、答えを見ると、0番目の量子ビットが0の時には1番目も0、0番目の量子ビットが1の時には、1番目も1になっています。このように2つの量子ビットに関連性を持たせることでもつれが実現できました。
ヒストグラムで確認
計算結果を目で確認しましょう。
#ヒストグラムへ落とし込む
from qiskit.visualization import plot_histogram
plot_histogram(counts)
今後はよりこのようなもつれを複雑に活用することで、多くの計算ができるようになります。ぜひ学習を進めてみてください。