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

Распознать одиночную ошибку 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;
        }
    }
}