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

Aug. 9, 2019, 6:08 a.m. edited Aug. 12, 2019, 7:18 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


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

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