$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$
密度行列のミスがあったので,再掲載です.
参考
Qiskitのドキュメント
Nielsen & Chuang
Fidelityとは
注意1: 定義の違い
Nielsen & Chuangの定義: $$F(\rho, \sigma ) \equiv \mathrm{Tr} \sqrt{\rho^{1/2}\sigma\rho^{1/2}} $$
Qiskitの定義:
$$
F(\rho, \sigma ) \equiv \mathrm{Tr}\left[\rho^{1/2}\sigma\rho^{1/2}\right]
$$
ルートの有無の違いがあるので注意.最近はQiskitの定義が多いらしい.参考: Fidelity convention
以後,Qiskitの定義を使用する.
注意2: 密度行列のルート
対角行列の場合
各要素のルートをとる.例えば,
A = \begin{pmatrix}
a_1 & 0 & 0 & 0 \\
0 & a_2 & 0 & 0 \\
0 & 0 & a_3 & 0 \\
0 & 0 & 0 & a_4
\end{pmatrix}
のとき,($a_i\ge0$)
A^{1/2} = \begin{pmatrix}
\sqrt{a_1} & 0 & 0 & 0 \\
0 & \sqrt{a_2} & 0 & 0 \\
0 & 0 & \sqrt{a_3} & 0 \\
0 & 0 & 0 & \sqrt{a_4}
\end{pmatrix}
混合状態の場合
FidelityにはUnitary変換に対して不変という性質がある.(cf. Nielsen & Chuang, 式(9.61) )
F( U\rho U^{\dagger}, U\sigma U^{\dagger} ) = F( \rho, \sigma )
ゆえに,対角化したのちに計算すれば良い.(対角化不可能な場合はどうすれば良いのか?)
実装
まずは必要なライブラリをimport
%matplotlib inline
# Importing standard Qiskit libraries and configuring account
from qiskit import QuantumCircuit, execute, Aer, IBMQ
from qiskit.compiler import transpile, assemble
from qiskit.tools.jupyter import *
from qiskit.visualization import *
# Loading your IBM Q account(s)
provider = IBMQ.load_account()
from qiskit.aqua import run_algorithm
from qiskit.aqua.input import LinearSystemInput
from qiskit.quantum_info import state_fidelity
from qiskit.aqua.algorithms.classical import ExactLSsolver
import numpy as np
純粋状態同士
cf. 純粋状態と混合状態
ベクトルの内積と同じようにかける.
$$
F( |\psi_1\rangle, |\psi_2\rangle ) = \left| \langle \psi_1 \left. \right|\psi_2 \rangle \right|^2
$$
psi1 = np.array([ 1, 0, 0, 0 ])
psi2 = np.array([ 0.5, 0.5, 0.5, 0.5 ])
state_fidelity( psi1, psi2 )
>> 0.25
純粋状態と混合状態の場合
$$
F( \ket{\psi_1}, \rho_2) = \bra{\psi_1} \rho_2 \ket{\psi_1}
$$
rho1 = np.array([[ 0.5, 0, 0, 0],
[ 0, 0.5, 0, 0],
[ 0, 0, 0, 0],
[ 0, 0, 0, 0]])
state_fidelity( psi1, rho1 )
>> 0.5
混合状態同士
$$
F( \rho_1, \rho_2 ) = \mathrm{Tr}\left[ \sqrt{ \sqrt{ \rho_1 } \rho_2 \sqrt{ \rho_2 } } \right] ^2
$$
rho2 = np.array([[ 0.5, 0, 0, 0],
[ 0, 0, 0, 0 ],
[ 0 , 0, 0, 0 ],
[0, 0, 0, 0.5]])
state_fidelity( rho1, rho2 )
>> 0.25