Plot quantum states
Package versions
このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。
qiskit[all]~=2.3.0
量子コンピューターの状態を可視化することが役立つ場面は多くあります。たとえば、学習やデバッグの際などです。ここでは、シミュレーションや状態トモグラフィーによって特定の状態がすでに得られているものとします。可視化できるのは、小規模な量子システムの状態に限られます。
このページのすべての関数は リッチオブジェクトを返します。コードセルの最終行でこれらのオブジェクトを出力すると、Jupyterノートブックではセルの下に表示されます。他の環境やスクリプトからこれらの関数を呼び出す場合は、出力を明示的に表示または保存する必要があります。
ほとんどの関数は画像(matplotlib.Figure オブジェクト)を返します。主な選択肢は次の2つです。
- 返されたオブジェクトに対して
.show()を呼び出すと、新しいウィンドウで画像が開きます(設定済みのmatplotlibバックエンドがインタラクティブな場合)。 .savefig("out.png")を呼び出すと、現在の作業ディレクトリにout.pngとしてfigureが保存されます。savefig()メソッドはパスを受け取るため、保存先の場所やファイル名を調整できます。例:plot_state_city(psi).savefig("out.png")。
LaTeX出力は IPython.display.Latex オブジェクトです。Jupyter以外の環境でのベストな選択肢は、この出力を避けることです。状態をテキスト表現として印刷するか、latex_source drawerに切り替えてLaTeXのソース文字列を返すようにしてください。
量子状態は、密度行列 (エルミート行列)またはstatevector (複素ベクトル)のいずれかです。密度行列はstatevectorと次の関係にあります。
密度行列はより一般的であり、混合状態(statevectorの正の重み付き和)を表すことができます。
Qiskitは Statevector クラスと DensityMatrix クラスを通じて量子状態を表現し、多くの可視化関数を提供しています。以下のコードセルの後のセクションでは、Qiskitのさまざまな可視化関数が次の量子状態をどのようにプロットするかを説明します。
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from math import pi
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
# Create a Bell state for demonstration
qc = QuantumCircuit(2)
qc.h(0)
qc.crx(pi / 2, 0, 1)
psi = Statevector(qc)
- LaTeX
- City
- Hinton
- Pauli vector
- Qsphere
- Bloch
厳密には「プロット」ではありませんが、Qiskitは Statevector オブジェクトと DensityMatrix オブジェクトの両方について、Jupyterノートブックで見やすいLaTeX表現をレンダリングできます。これらは量子状態を記述するための標準的な数学的記法に従っています。詳細は 量子情報の基礎:単一システム をご覧ください。
Statevectorはデフォルトで「ket記法」を使用し、密度行列は2×2行列として表示されます。
"latex" を "latex_source" に置き換えると、生のLaTeXソース文字列を取得できます。
このプロットは、密度行列の各要素の実部と虚部を2つの3次元棒グラフで表示します。棒が都市の高層ビルに似ていることから「city」プロットと呼ばれています。プロットする状態の密度行列は以下の通りです。
詳細については APIドキュメント をご覧ください。
このプロットは「city」プロットに非常に似ていますが、各要素の大きさを棒の高さではなく正方形のサイズで表します。白い正方形は正の値を持つ要素を表し、黒い正方形は負の値を持つ要素を表します。プロットする状態の密度行列は以下の通りです。
詳細については APIドキュメント をご覧ください。
オブザーバブルとは、量子状態を測定する方法であり、可能な測定結果が実数となるものです。測定結果の期待値はオブザーバブルの期待値とも呼ばれ、その状態を無限に観測した場合の平均値と考えることができます。
Pauli行列のテンソル積はすべて、+1または-1を返すオブザーバブルです。 このプロットは、異なるPauli演算子に対する状態の期待値を棒グラフで表示します。すべての密度行列は、これらのPauli行列を期待値で重み付けした和として記述できます。
たとえば、この状態は次の項の和として書けます。
これらの係数は SparsePauliOp を使って計算することもできます。
詳細については APIドキュメント をご覧ください。
「QSphere」はQiskit独自の量子状態ビューであり、statevectorの各要素の振幅と位相が球面上にプロットされます。各点の太さは振幅を表し、色は位相を表します。混合状態の場合は、各成分に対して球が表示されます。
詳細については APIドキュメント をご覧ください。
qubit状態のBlochベクトルは、X、Y、Z Pauliオブザーバブルにおける期待値を3次元空間のX、Y、Z軸に対応させたものです。このプロットは多qubit量子状態を単一qubit空間に投影し、各qubitをBloch球上にプロットします。この可視化は個々のqubitの期待値のみを示します。qubit間の相関を示すことはできないため、もつれた量子状態を完全に記述することはできません。
詳細については APIドキュメント をご覧ください。
psi.draw("latex") # psi is a Statevector object
from qiskit.quantum_info import DensityMatrix
DensityMatrix(psi).draw("latex") # convert to a DensityMatrix and draw
from qiskit.visualization import plot_state_city
plot_state_city(psi)
# Alternative: psi.draw("city")
from qiskit.visualization import plot_state_hinton
plot_state_hinton(psi)
# Alternative: psi.draw("hinton")
from qiskit.visualization import plot_state_paulivec
plot_state_paulivec(psi)
# Alternative: psi.draw("paulivec")
from qiskit.quantum_info import SparsePauliOp
SparsePauliOp.from_operator(psi)
SparsePauliOp(['II', 'IX', 'XY', 'YI', 'YX', 'YZ', 'ZI', 'ZX', 'ZZ'],
coeffs=[ 0.25 +0.j, 0.1767767+0.j, -0.1767767+0.j, -0.125 +0.j,
-0.1767767+0.j, 0.125 +0.j, 0.125 +0.j, 0.1767767+0.j,
0.125 +0.j])
from qiskit.visualization import plot_state_qsphere
plot_state_qsphere(psi)
# Alternative: psi.draw("qsphere")
from qiskit.visualization import plot_bloch_multivector
plot_bloch_multivector(psi)
# Alternative: psi.draw("bloch")
Options for state-plotting functions
すべての状態プロット関数は以下の引数を受け付けます(LaTeX drawerはMatplotlibのfigureを返さないため対象外で、plot_state_qsphere は figsize のみ受け付けます)。
- title (str): プロットのタイトルとなる文字列。プロットの上部に表示されます。
- figsize (tuple): figureのサイズ(インチ単位)(幅, 高さ)
plot_state_city 関数と plot_state_paulivec 関数は、棒の色を指定する color 引数(文字列のリスト)も受け付けます。詳細については APIドキュメント をご覧ください。
Next steps
- 量子情報の知識をおさらいしたい場合は、IBM Quantum Learningの 量子情報の基礎 コースをご確認ください。
- オープンソースのQiskit SDKにコントリビュートしたい場合は、コントリビューションガイドライン をお読みください。