前回は量子ゲートについて紹介したので,今回はそれによって生成された状態がどのようなものであるかを視覚的に表現する方法について見てみます.
Blochベクトル
まずは1量子ビットの適当な回路を作ってみます.
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
# 1つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(1)
# 量子ビット0にアダマールゲートを適用
circ.h(0)
# 量子回路の描画(matplotlibを使用)
circ.draw('mpl')
この回路によって生成された状態のBlochベクトル表示は,plot_bloch_multivector
を用います.
# 量子回路の状態ベクトルを計算
state = Statevector(circ)
# Bloch球面上に状態ベクトルを可視化
plot_bloch_multivector(state)
確かにアダマールゲートが作用した後の状態になっています.しれっと,QuantumCircuit
であったcirc
をStatevevotr
であるstate
に変えています.
複数の量子ビットが存在する場合についても対応しています.
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
import numpy as np
# 3つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(3)
# 量子ビット0と1に制御Zゲート(CZ)を適用
circ.cz(0, 1)
# 量子ビット1にRXゲートを適用
circ.rx(np.pi / 2, 1)
# 量子ビット1と2にRYYゲートを適用
circ.ryy(np.pi / 6, 1, 2)
# 量子ビット0と2にRZXを適用
circ.rzx(np.pi / 8, 0, 2)
# 量子ビット0と1にRXXを適用
circ.rxx(np.pi / 8, 0, 1)
# 量子ビット0と2にRZXを再度適用
circ.rzx(np.pi / 4, 0, 2)
# 量子ビット0と1にRXXを再度適用
circ.rxx(np.pi / 4, 0, 1)
# 量子回路の状態ベクトルを計算
state = Statevector(circ)
# Bloch球面上に状態ベクトルを可視化
plot_bloch_multivector(state)
ここで,それぞれのブロッホベクトルは部分トレースをとったものに対応していることに注意してください.
$$
\rho_{1} := \operatorname{Tr}_{23} (\rho _ {123})
$$
3量子ビットがエンタングルしているため,部分トレースをとった後の状態が混合状態となってしまっていることが,ブロッホベクトルの長さから理解できます.
密度演算子の成分をヒストグラム表示
これも1量子ビットの場合からコードを見てみます.
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import DensityMatrix
from qiskit.visualization import plot_state_city
# 1つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(1)
# 量子ビット0にアダマールゲートを適用
circ.h(0)
# 量子回路の状態密度行列を計算
state = DensityMatrix(circ)
# 状態の都市プロットを生成し、色を指定
plot_state_city(state, color=['midnightblue', 'crimson'])
以下が出力結果です.
アダマールゲートを作用させた後の密度演算子は,全ての行列要素が$1/2$のため,確かにそれが表現されていることが分かります1.また,ここでもQuantumCircuit
をDensityMatrx
のクラスに変えています.
3量子ビットの場合は,以下のようになります.
# 3つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(3)
# 量子ビット0と1に制御Zゲート(CZ)を適用
circ.cz(0, 1)
# 量子ビット1にRXゲートを適用
circ.rx(np.pi / 2, 1)
# 量子ビット1と2にRYYを適用
circ.ryy(np.pi / 6, 1, 2)
# 量子ビット0と2にRZXを適用
circ.rzx(np.pi / 8, 0, 2)
# 量子ビット0と1にRXXを適用
circ.rxx(np.pi / 8, 0, 1)
# 量子ビット0と2にRZXを再度適用
circ.rzx(np.pi / 4, 0, 2)
# 量子ビット0と1にRXXを再度適用
circ.rxx(np.pi / 4, 0, 1)
# 量子回路の状態密度行列を計算
state = DensityMatrix(circ)
# 状態の都市プロットを生成し、色を指定
plot_state_city(state, color=['midnightblue', 'crimson'])
圧巻ですね.2次元の表示の方が良い方は,plot_state_hinton
を使うことも可能です.
from qiskit.visualization import plot_state_hinton
# 状態のヒントンプロットを生成
plot_state_hinton(state)
終わりに
今回は状態の図示について見ました.他の図示の仕方もあるので,気になる方はドキュメントをご覧ください.
Version Information
Software | Version |
---|---|
qiskit | 1.3.1 |
System information | |
---|---|
Python version | 3.10.12 |
-
都市プロット?洒落てますね. ↩