Распознать одиночную ошибку X, Y или Z в коде Шора
Вход — девять кубитов либо в корректном кодовом состоянии Шора $|\psi_L\rangle=\alpha|0_L\rangle+\beta|1_L\rangle$, либо в состоянии с одной ошибкой X, Y или Z на одном из кубитов.
Обозначим нормированные состояния тройки
$$|g_\pm\rangle=\frac{|000\rangle\pm|111\rangle}{\sqrt2}.$$
Кодовые состояния Шора:
$$|0_L\rangle=|g_+\rangle^{\otimes3},$$
$$|1_L\rangle=|g_-\rangle^{\otimes3}.$$
Это произведения трёх указанных троек; общий нормировочный множитель в каждом равен $1/(2\sqrt2)$.
Напишите операцию на языке Q#, определяющую наличие, тип и положение ошибки. Верните кортеж (Int,Pauli):
1. Первый элемент — индекс ошибочного кубита либо -1, если ошибки нет.
2. Второй элемент — PauliX, PauliY или PauliZ. При отсутствии ошибки допускается любое значение второго элемента, источник его не проверяет.
3. Для одиночной Z-ошибки точный кубит однозначно определить нельзя. В этом случае первый элемент должен быть индексом тройки: 0 для кубитов 0–2, 1 для 3–5, 2 для 6–8.
Примеры: без ошибки — (-1,PauliI); X на кубите 0 — (0,PauliX); Y на кубите 4 — (4,PauliY); Z на кубите 8 — (2,PauliZ).
Состояние всех кубитов после операции должно полностью сохраниться. В заготовке целиком дана вспомогательная операция BitflipDetectError.
Заготовка Q#:
namespace Kata {
operation ShorDetectError (qs : Qubit[]) : (Int, Pauli) {
// Implement your solution here...
return (-2, PauliI);
}
// You might find this helper operation from an earlier task useful.
operation BitflipDetectError (qs : Qubit[]) : Int {
let m1 = Measure([PauliZ, PauliZ], qs[0 .. 1]);
let m2 = Measure([PauliZ, PauliZ], qs[1 .. 2]);
if m1 == One and m2 == Zero {
return 0;
} elif m1 == One and m2 == One {
return 1;
} elif m1 == Zero and m2 == One {
return 2;
} else {
return -1;
}
}
}