Трёхкубитные коды от X и Z
Постройте трёхкубитные коды и схемы проверки чётности для обнаружения и локализации одиночной ошибки X или Z.
1. Код для ошибки X.
A. Закодируйте $|\psi\rangle=(|0\rangle+i|1\rangle)/\sqrt2$ в $(|000\rangle+i|111\rangle)/\sqrt2$.
B. Постройте QSphere состояния и проверьте кодирование до общей фазы.
C. Данная apply_err(3,'bit') случайно применяет один X и возвращает which_qubit. Добавьте необходимое число вспомогательных кубитов и классических битов синдрома; примените проверки чётности для локализации ошибки. Автор напоминает, что состояний синдрома должно хватать на три одиночные ошибки и отсутствие ошибки.
D. Заполните таблицу syndrome→ошибка: даны 00→I и 11→X на среднем кубите; дополните 01 и 10.
E. Найдите ошибку по измеренному синдрому и сравните с which_qubit. В заголовке автора упомянуты «single bit-error and two bit-error», хотя данная apply_err создаёт только одну ошибку; сохраните эту разницу при интерпретации.
F. Найдите логический X_L, переводящий 000 в 111, создайте схему и проверьте симуляцией. Найдите логический Z_L минимального веса, переводящий $|+\rangle_L$ в $|-\rangle_L$, где $|\pm\rangle_L=|000\rangle\pm|111\rangle$ (здесь автор опускает общий нормирующий множитель). Автор указывает четыре эквивалентных Z_L. Каково расстояние кода? Может ли он обнаружить или исправить одиночную ошибку Z? Вес оператора — число кубитов, на которых он не равен I.
2. Код для ошибки Z.
A. Закодируйте то же исходное состояние при $|0\rangle_L=|+++\rangle$, $|1\rangle_L=|---\rangle$.
B. Добавьте вспомогательные регистры и проверки чётности для локализации одной ошибки Z; данная apply_err(3,'phase') выбирает её случайно.
C. Выполните схему на aer_simulator, найдите кубит по синдрому и сравните с which_qubit.
Сохранены все подпункты обеих задач первой части и полные исходные заготовки. В исходной заметке расстояние также описано как «maximum number of errors that can be detected»; эту формулировку следует сопоставить со стандартным смыслом расстояния, разобранным в решении.
Исходные определения и заготовки (код сохранён без исполнения):
from qiskit import *
from qiskit.visualization import plot_histogram
from qiskit.visualization import plot_state_qsphere, plot_bloch_vector
from qiskit.quantum_info import Statevector
import numpy as np
sim = Aer.get_backend('aer_simulator')
qc_3qx = QuantumCircuit(3)
### your code goes here. ###
#######
qc_3qx.draw('mpl')
### your code goes here ###
def apply_err(n, err):
qc = QuantumCircuit(int(n), name='Error')
which_qubit = np.random.randint(n)
if err=='bit':
qc.x(which_qubit)
elif err=='phase':
qc.z(which_qubit)
else:
pass
err = qc.to_gate()
return err, which_qubit
err, which_qubit = apply_err(3, 'bit')
qc_3qx.append(err,range(3))
qc_3qx.draw('mpl')
# Execute this cell to add the extra registers
k = int(input('number of auxiliary qubits ( / syndrome bits): '))
qc_3qx.add_register(QuantumRegister(k, 'auxiliary'))
qc_3qx.add_register(ClassicalRegister(k, 'syndrome'))
# Apply the parity check gates and measure the parities on the syndrome bits to localize a single bit-flip ( X ) error on the code.
### your code goes here. ###
######
qc_3qx.draw('mpl')
#### complete the dictionary ###
table_syndrome = {'00': 'I[0]I[1]I[2]', '01':' your answer ',
'10':' your answer ', '11':' I[0]X[1]I[2] '}
######
print(table_syndrome)
qc_3qx_trans = transpile(qc_3qx, sim)
syndrome = sim.run(qc_3qx_trans, shots=1, memory=True).result().get_memory()
print(syndrome)
your_answer = input('Enter the index of the code qubit that underwent bit-flip error: ')
print('\n')
print(which_qubit == int(your_answer))
### your code goes here ###
qc_XL = QuantumCircuit(3)
qc_XL.x(range(3))
qc_XL.measure_all()
bits_out = sim.run(qc_XL, shots=1, memory=True).result().get_memory()
print(bits_out)
qc_3qz = QuantumCircuit(3)
### your code goes here. ###
########
qc_3qz.draw('mpl')
err, which_qubit = apply_err(3, 'phase')
qc_3qz.append(err, range(3))
### your code goes here ###
##########
qc_3qz.draw('mpl')
qc_3qz_trans = transpile(qc_3qz, sim)
syndrome = sim.run(qc_3qz_trans, shots=1, memory=True).result().get_memory()
print(syndrome)
your_answer = input('Enter the index of the code qubit that underwent phase-flip error: ')
print('\n')
print(which_qubit == int(your_answer))