現在勉強中のQiskitについて、ドキュメントを読んでいまいち理解出来なかった部分を自分なりにまとめてみます。
間違いに気づいた方は、是非ご指摘ください!
目次
Qiskit におけるビット順序: LSB (Least Significant Bit)
Qiskit では、LSB (Least Significant Bit) 順序を採用しており、右端のビットがインデックスの小さい量子ビットに対応します。
Qiskit のビット列順序
- $|100\rangle$のようなビット列は、次のように解釈されます。
- 最上位ビット(左端)$\to$ インデックス2の量子ビット
- 中央の量子ビット $\to$ インデックス1の量子ビット
- 最下位ビット(右端)$\to$ インデックス0の量子ビット
状態ベクトルの例
次の状態ベクトルを考えます:
Statevector: [0.707+0.j, 0+0.j, 0+0.j, 0+0.j, 0.707+0.j, 0+0.j, 0+0.j, 0+0.j]
LSB 順序での解釈
- 長さ8の配列は3量子ビット系を表します($2^3=8$)。
- 配列のインデックスと基底状態は次のように対応します:
- インデックス0 $\to$ $|000\rangle$
- インデックス1 $\to$ $|001\rangle$
- インデックス4 $\to$ $|100\rangle$
- 上記の状態ベクトルは、次の量子状態を表しています:
$$|\psi\rangle = \frac{1}{\sqrt{2}}\left( |000\rangle + |100\rangle \right)$$
Qiskit における状態ベクトルの生成と解析
Qiskit では、状態ベクトルをシミュレーションで計算する方法と、数学的に直接生成する方法の2つがあります。
1. Statevector Simulator を用いた回路のシミュレーション
以下の例は、量子回路を実行して状態ベクトルを計算します。
import qiskit
from qiskit import QuantumCircuit, transpile
from qiskit_aer import Aer
# 量子回路の作成
qc =QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
# シミュレータを指定
simulator = Aer.get_backend('statevector_simulator')
transpile_qc = transpile(qc, simulator)
result = simulator.run(transpile_qc).result()
# 結果を取得
statevector = result.get_statevector()
# 結果を表示
print(f"Statevector: {statevector}")
display(statevector.draw("latex"))
Statevector: Statevector([0.70710678+0.j, 0. +0.j, 0. +0.j,
0.70710678+0.j],
dims=(2, 2))
$$\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle$$
.Statevector
を用いた直接計算
以下は、.Statevector
を使って量子回路の状態ベクトルを直接計算する例です。
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0,1)
# 状態ベクトルを生成
statevector = Statevector.from_instruction(qc)
print("Statevector:", statevector)
display(statevector.draw("latex"))
Statevector: Statevector([0.70710678+0.j, 0. +0.j, 0. +0.j,
0.70710678+0.j],
dims=(2, 2))
$$\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle$$
期待値計算
得られた状態ベクトルを使って、特定の演算子に対する期待値を計算できます。
例: $Z_0Z_1$の期待値を計算
from qiskit.quantum_info import Operator
# 演算子の定義
operator = Operator.from_label('ZZ')
# 期待値を計算
expectation_value = statevector.expectation_value(operator)
print("期待値", expectation_value)
期待値 (0.9999999999999998+0j)
$$|\psi\rangle = \frac{1}{\sqrt{2}}\left( |00\rangle + |11\rangle \right)$$
の場合、
$$\langle Z_0Z_1\rangle = 1$$
となり、理論値とほぼ一致します。
まとめ
- Qiskit の LSB 順序により、状態ベクトルやビット列の解釈は右端がインデックス0の量子ビットに対応します。
- 状態ベクトルは、
Statevector Simulator
または.Statevector
を使って計算可能です。 - 状態ベクトルを使えば、期待値や測定確率の解析を効率よく行えます。
このように、量子回路の状態をシミュレーション・解析する際には、ビット列の順序と状態ベクトルの対応に注意する必要があります。
※ バックエンドとは
Qiskitで量子回路を実行するための環境(実機やシミュレーター)。