№ 2093Квантовая связьУровень 3

Функция плотного кодирования

Создайте функцию, принимающую QuantumCircuit и двухбитную строку и применяющую вентили, кодирующие строку на запутанном состоянии так, чтобы Боб мог её декодировать. Проверьте все входы.

В исходном протоколе Чарли готовит $(|00\rangle+|11\rangle)/\sqrt2$ операциями H(1),CX(1,0), отправляет q0 Бобу и q1 Алисе. Алиса может менять только свой q1, затем передаёт его Бобу. Боб выполняет CX(1,0),H(1) и измеряет оба кубита. Вывод должен совпасть с двухбитной строкой в порядке q1q0. Полная исходная подготовка, пример кодирования и декодирование сохранены ниже.

Исходная программа (сохранена без исполнения):

from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit import Aer
backend = Aer.get_backend('aer_simulator')

qc_bob = QuantumCircuit(2,2)
# Bob disentangles
qc_bob.cx(1,0)
qc_bob.h(1)
# Then measures
qc_bob.measure([0,1],[0,1])

qc_bob.draw()

MESSAGE = '00'

qc_alice = QuantumCircuit(2,2)
qc_alice.h(1)
qc_alice.cx(1,0)

if MESSAGE[-2]=='1':
    qc_alice.z(1)
if MESSAGE[-1]=='1':
    qc_alice.x(1)

ket = Statevector(qc_alice)
ket.draw()

qc_charlie = QuantumCircuit(2,2)

qc_charlie.h(1)
qc_charlie.cx(1,0)

qc_charlie.draw()

MESSAGE = '01'

qc_alice = QuantumCircuit(2,2)

if MESSAGE[-2]=='1':
    qc_alice.z(1)
if MESSAGE[-1]=='1':
    qc_alice.x(1)

complete_qc = qc_charlie.compose(qc_alice.compose(qc_bob))
backend.run(complete_qc).result().get_counts()