Qiskit でエンタングルメント・エントロピーを計算する

March 12, 2022, 9:59 a.m. edited March 13, 2022, 12:36 a.m.

#量子情報  #Qiskit  #Python 

$$ \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 の API を用いて計算する。もしも量子アルゴリズムで求めたいならば [arXiv:1908.05251] とか参照すると良いかもしれない。

エンタングルメント・エントロピー

量子エンタングルメントの強さを定量化する量としてエンタングルメント・エントロピーがある。ただし定量化できるのは純粋状態のときのみであるので、今回は純粋状態しか考えない。

ある 2 つの部分系 A, B からなる量子状態 \(\ket{\psi}_{AB}\) を考えると、密度演算子は \(\rho_{AB}=\ket{\psi}_{AB}\bra{\psi}\) と表される。この密度演算子を部分系 B についてトレースアウトした縮約密度演算子 \(\rho_A=\mathrm{Tr}_B\rho_{AB}\) を用いて、エンタングルメント・エントロピーは

$$S_A=-\mathrm{Tr}\rho_A \log \rho_A$$

と表される。

エンタングルメント・エントロピーの計算例

2 つの量子ビット A, B を用いた

$$\ket{\psi}_{AB}=c\ket{0}_A\ket{0}_B+\sqrt{1-c^2}\ket{1}_A\ket{1}_B\tag{1}$$

を考える(\(0\leq c\leq 1\))。この密度演算子は

$$ \begin{align} \rho_{AB}=&c^2\ket{0}_A\ket{0}_B\bra{0}_A\bra{0}_B+c\sqrt{1-c^2}\ket{0}_A\ket{0}_B\bra{1}_A\bra{1}_B\\ +&c\sqrt{1-c^2}\ket{1}_A\ket{1}_B\bra{0}_A\bra{0}_B+(1-c^2)\ket{1}_A\ket{1}_B\bra{1}_A\bra{1}_B \end{align} $$

であるので、部分系 B についてトレースアウトした縮約密度演算子は

$$ \begin{align} \rho_{A}&=\mathrm{Tr}_B\rho_{AB}\\ &=\bra{0}_B\rho_{AB}\ket{0}_B+\bra{1}_B\rho_{AB}\ket{1}_B\\ &=c^2\ket{0}_A\bra{0}_A+(1-c^2)\ket{1}_A\bra{1}_A \end{align} $$

となる。ゆえに、エンタングルメント・エントロピーは

$$ \begin{align} S_A&=-\mathrm{Tr}\rho_A\log\rho_A\\ &=-\mathrm{Tr}\{(c^2\log c^2)\ket{0}_A\bra{0}_A+((1-c^2)\log(1-c^2))\ket{1}_A\bra{1}_A\}\\ &=-c^2\log c^2-(1-c^2)\log(1-c^2) \end{align} $$

となる。このとき、 \(S_A\) は \(c=0,1\) のときに最小の \(0\)、\(c=\frac{1}{\sqrt{2}}\) のときに最大の \(\log 2=1\) となる。

Qiskit で計算

前節で手計算したエンタングルメント・エントロピーを Qiskit で計算してみる。状態 (1) は RYGate を用いることで作成できる。環境としては qiskit==0.34.2, qiskit-aer==0.10.3 にて実験している。部分トレースをおこなう関数として partial_trace、 von Neumann entropy を計算する関数として entropy があるので、この 2 つを組み合わせることで以下のようにエンタングルメント・エントロピーを計算できる。

import numpy as np
from qiskit import QuantumCircuit, Aer, transpile
from qiskit.quantum_info import partial_trace, entropy

c = 1 / np.sqrt(2)

def main():
    qc = QuantumCircuit(2)
    qc.ry(2 * np.arccos(c), 0)
    qc.cx(0, 1)

    backend = Aer.get_backend('aer_simulator_statevector')
    qc = transpile(qc, backend)
    qc.save_statevector()

    job = backend.run(qc)
    statevector = job.result().get_statevector(qc)

    reduced_state = partial_trace(statevector, [1]) # 1 (つまり部分系 B) について部分トレース
    print(np.array(reduced_state))
    print(entropy(reduced_state))


if __name__ == '__main__':
    main()

5 行目の c に \(\frac{1}{\sqrt{2}}\) を入れて実行すると、

[[0.5+0.j 0. +0.j]
 [0. +0.j 0.5+0.j]]
1.0

となり、正しい縮約密度演算子および最大のエンタングルメント・エントロピーが得られたことを確認できた。