№ 2083Квантовые вычисленияУровень 3

Трёхкубитные коды от 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))

Предложить решение

Войти, чтобы отправить материал.