前回は量子コンピュータに実際にジョブを投げて実行結果を取得したが、毎回3時間も待たされていては貴重な余暇がもったいない。そこで、量子回路シミュレータを用いてQiskitを使った疑似量子計算を行う。今回はそのライブラリのひとつ、Qiskit-aer について紹介する。
Qiskit-aer のインストール
pip install qiskit-aer
ちなみにQiskit-aerはGPUにも対応しており、CUDAに対応したグラボならGPUでシミュレートできる。その場合、
pip install qiskit-aer-gpu
でインストールできる。
ベル状態の生成
量子回路シミュレータでベル状態を生成してみる。
ベル状態 (Bell state) とは2つの量子ビットが絡み合った状態のことである。厳密にはただ絡み合った、というよりは と がそれぞれ理論上50%の確率で観測されるような状態のことを指す。
量子計算において重要な操作のひとつにアダマール変換 (Hadamard transformation) というものが存在する。アダマール変換を行う量子ゲート、アダマールゲートは量子回路上では以下のような図で示される。
行列表現は次式で表される。
また、基底状態 と に対して作用する式は
で表される。
さらにこれにCNOTゲート(CXゲートとも表記する)を作用させるような量子回路を考える。
この図中の+で示されているところがCNOTゲートになる。
と量子ビットを初期化した状態から、アダマールゲートを作用させると
となる。さらにこれにCNOTゲートを作用させると、
という状態が得られる。これがベル状態であり、もつれを表している。量子力学で必ず学ぶベルの不等式で有名なJohn Stewart Bellにちなんでいる。
(自分の整理のための)前置きが長くなったが、これをQiskit-aerで量子回路シミュレートしてやる。
from qiskit_aer.primitives import Sampler
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
# ベル状態を生成する量子回路
bell = QuantumCircuit(2)
bell.h(0) # 量子ビット0にアダマールゲートを適用
bell.cx(0, 1) # 量子ビット0と量子ビット1の間にCNOTゲートを適用
bell.measure_all() # すべての量子ビットを測定
# 量子回路の実行
quasi_dists = Sampler().run(bell, shots=1000).result().quasi_dists[0]
# 結果の表示
print(quasi_dists)
これは自分のコンピュータ上で行われる計算なので、すぐに結果が出てくる。
{0: 0.507, 3: 0.493}
ほぼ理論値通り。
また、先程あげたような量子回路の図もこのQiskitの機能で簡単に描ける。
bell.draw(output='mpl')
とりあえず、これでもつれを扱ったので、量子コンピュータぽいHello worldについては終了。
これからはより複雑な量子計算について深めていく。