Qiskit だんだんエンタングルさせて,コンカレンスと相互情報量を計算

公開:2020/10/29
更新:2020/11/02
2 min読了の目安(約2500字TECH技術記事

やること:

QiskitでBell状態のCNOTを変更して,少しづつエンタングルさせたときのコンカレンスを計算してみる.少しづつエンタングルさせるために,(\text{CNOT})^{1/n}の演算子に相当する回路を用いる.

やらないこと:

  • Bell状態とは?
  • Qiskitでの回路の作り方
  • コンカレンスとは?
  • 相互情報量とは?

Qiskitのinstallとimport

!pip install qiskit
import qiskit

# Needed for functions
import numpy as np

# Import Qiskit classes
from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister, Aer
from qiskit.quantum_info import *

普通のBell状態

# Create the state vector
q = QuantumRegister(2)
bell = QuantumCircuit(q)
bell.h(q[0])
bell.cx(q[0], q[1])
print(bell)

job = qiskit.execute(bell, Aer.get_backend('statevector_simulator'))
outputstate = job.result().get_statevector(bell)
print("concurrence: ", concurrence(outputstate))

Bell状態の回路は以下にようになる,

また,コンカレンスは,concurrence: 1.0 が得られる.

だんだんエンタングルさせるBell状態

(\text{CNOT})^{1/2}の演算子でBell状態のようなもの

参考: Square root of CNOT and spectral decomposition of the Hadamard gate

https://quantumcomputing.stackexchange.com/questions/5997/square-root-of-cnot-and-spectral-decomposition-of-the-hadamard-gate
アダマールゲート:hとControlled-Phase Gate:cu1の組み合わせで作成可能.
例えば,Bell状態のCNOTを(\text{CNOT})^{1/2}に置き換えたいときは,Controlled-Phase Gateで\theta=\pi/2として以下の回路で作成できる.
q = QuantumRegister(2)
bell_half = QuantumCircuit(q)
bell_half.h(q[0])
bell_half.h(q[1])
bell_half.cu1(np.pi/2, q[0], q[1])
bell_half.h(q[1])
print(bell_half)

(\text{CNOT})^{1/n}の演算子でBell状態のようなもの

\theta=\pi/nとすれば,回路ができる.

def bell(theta):
  q = QuantumRegister(2)
  circ = QuantumCircuit(q)
  circ.h(q[0])
  circ.h(q[1])
  circ.cu1(theta, q[0], q[1])
  circ.h(q[1])
  job = qiskit.execute(circ, Aer.get_backend('statevector_simulator'))
  outputstate = job.result().get_statevector(circ)
  return concurrence(outputstate) , mutual_information(outputstate)

import matplotlib.pyplot as plt
thetas = np.linspace(0, np.pi, 100)
conc = [bell(theta)[0] for theta in thetas]
plt.xlabel('theta')
plt.ylabel('concurrence')
plt.plot(thetas, conc)
plt.savefig("concurrece.png", format="png", dpi=300)
plt.show()

info = [bell(theta)[1] for theta in thetas]
plt.ylabel('mutual_information')
plt.plot(thetas, info)
plt.savefig("mutual_information.png", format="png", dpi=300)
plt.show()

グラフは以下のようになる.