SymPyを使ってget_statevectorで得られたベクトルをケットベクトルに変換する【Qiskit】

Aug. 9, 2019, 6:08 a.m. edited Feb. 23, 2022, 4:41 a.m.

#SymPy  #Qiskit  #シミュレーション  #量子力学  #Python 

量子コンピュータは実機で使うときはもちろん測定結果は確率でしか得られません.

しかし,シミュレーターならば以下のようにして,回路 \(U\) を通したあとの状態をベクトルで得ることができます.ここでは,Pythonで簡単に実行できるQiskit (ver. 0.10.2) を用います.また,回路は
$$ U={\rm CNOT}\cdot (H\otimes \mathbb{I}) $$
つまり,EPR状態を作るものとします.

from qiskit import QuantumCircuit, execute, Aer


simulator = Aer.get_backend('statevector_simulator')
circuit = QuantumCircuit(2)

circuit.h(0)
circuit.cx(0, 1)

statevector = execute(circuit, simulator).result().get_statevector(circuit)

print(statevector)

実行すると,

[0.70710678+0.j 0.        +0.j 0.        +0.j 0.70710678+0.j]

とブラケット表記で出力してくれません.Qiskitに含まれるplot_state_city を使えばグラフで見せてくれますが,別にそこまでは求めていません.

SymPyを使ってブラケット表記に変換する

※SimPyとは別物です.

SymPyにはPhysicsの中にQuantum mechanicsのモジュールが含まれ,ここにはベクトルをケットベクトル表示に変換1してくれる matrix_to_qubit があります.これを使うと,

from qiskit import QuantumCircuit, execute, Aer
import numpy as np
from sympy.physics.quantum.qubit import matrix_to_qubit


simulator = Aer.get_backend('statevector_simulator')
circuit = QuantumCircuit(2)

circuit.h(0)
circuit.cx(0, 1)

statevector = execute(circuit, simulator).result().get_statevector(circuit)

ket_vector = matrix_to_qubit(np.array(statevector)[:, np.newaxis])
print(ket_vector)

実行して,

0.707106781186548*|00> + 0.707106781186547*|11>

と無事にケットベクトルで表示することができました2

(追記 220223) Qiskit ver. 0.34.2 の場合

上に書いたコードは最新の Qiskit (ver. 0.34.2) では動かなくなっている。現在は

from qiskit import QuantumCircuit, Aer, transpile
import numpy as np
from sympy.physics.quantum.qubit import matrix_to_qubit


simulator = Aer.get_backend('aer_simulator_statevector')
circuit = QuantumCircuit(2)

circuit.h(0)
circuit.cx(0, 1)
#circuit = transpile(circuit, simulator) # to_gate() などを使っている場合は transpile を入れないと動かない場合がある
circuit.save_statevector()

job = simulator.run(circuit)
statevector = job.result().get_statevector(circuit)

ket_vector = matrix_to_qubit(np.array(statevector)[:, np.newaxis])
print(ket_vector)

のようになる。


  1. この操作はSchmidtの分解定理によって保証されている. 

  2. 0.707106781186548はWolfram Alphaに入力すればわかるように\(\frac{1}{\sqrt{2}}\)である.