♨️
Qiskit だんだんエンタングルさせて,コンカレンスと相互情報量を計算
やること:
QiskitでBell状態のCNOTを変更して,少しづつエンタングルさせたときのコンカレンスを計算してみる.少しづつエンタングルさせるために,
やらないこと:
- 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 gateh
とControlled-Phase Gate:cu1
の組み合わせで作成可能.
例えば,Bell状態のCNOTを
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状態のようなもの
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()
グラフは以下のようになる.
Discussion