Функция плотного кодирования
Создайте функцию, принимающую 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()