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

Проверить телепортацию шести состояний

Соберите код из предыдущих упражнений, чтобы телепортировать состояния $|0\rangle$, $|1\rangle$ и четыре суперпозиции:

$$|\pm\rangle=(|0\rangle\pm|1\rangle)/\sqrt2,$$

$$|\pm i\rangle=(|0\rangle\pm i|1\rangle)/\sqrt2.$$

Проверьте успешность телепортации каждого состояния. По замечанию автора это открытая задача без автоматической проверки: следуйте комментариям в полной заготовке ниже.

Для каждого из шести состояний предусмотрено 100 повторов. Реализуйте все семь отмеченных шагов: выделение кубитов; подготовку общей запутанной пары; подготовку сообщения и передачу двух классических битов; восстановление кубита Боба; проверку правильности с сообщением о неудаче; сброс кубитов; итоговое сообщение об успехе. Все авторские вспомогательные операции сохранены в заготовке.

Заготовка Q#:

namespace Kata {
    import Std.Diagnostics.*;

    @EntryPoint()
    operation TestTeleportation() : Unit {

        // To define the different states, let us make use of PauliX, PauliY and PauliZ basis
        let messages = [
            (PauliX, Zero, "|+⟩"),
            (PauliX, One, "|-⟩"),
            (PauliY, Zero, "|i⟩"),
            (PauliY, One, "|-i⟩"),
            (PauliZ, Zero, "|0⟩"),
            (PauliZ, One, "|1⟩")
        ];

        // To effectively test the solution, experiment needs to be repeated multiple times
        let numRepetitions = 100;

        // Loop through all the states to test each one of them individually
        for (basis, sentState, stateName) in messages {

            // Loop through multiple iterations for each state
            for j in 1..numRepetitions {
                // 1. Initialize qubits for Alice and Bob
                // ..

                // 2. Prepare the entangled state between Alice and Bob
                // ..

                // 3. Prepare the Message qubit and send classical message
                // ..

                // 4. Reconstruct Bob's qubit using the classical message
                // ..

                // 5. Verify if the state was teleported correctly. If not, indicate failure
                // ..

                // 6. Reset the qubits
                // ..
            }
        }

        // 7. Indicate success if everything went well
        // ..
    }

    // You might find these helper operations from earlier tasks useful.
    operation PrepareAndSendMessage(qAlice : Qubit, basis : Pauli, state : Result) : (Bool, Bool) {
        use qMessage = Qubit();
        if state == One {
            X(qMessage);
        }
        if basis != PauliZ {
            H(qMessage);
        }
        if basis == PauliY {
            S(qMessage);
        }
        let classicalBits = SendMessage(qAlice, qMessage);
        Reset(qMessage);
        return classicalBits;
    }

    operation ReconstructAndMeasureMessage(qBob : Qubit, (b1 : Bool, b2 : Bool), basis : Pauli) : Result {
        ReconstructMessage(qBob, (b1, b2));
        return Measure([basis], [qBob]);
    }

    operation Entangle(qAlice : Qubit, qBob : Qubit) : Unit is Adj + Ctl {
        H(qAlice);
        CNOT(qAlice, qBob);
    }

    operation SendMessage(qAlice : Qubit, qMessage : Qubit) : (Bool, Bool) {
        CNOT(qMessage, qAlice);
        H(qMessage);
        return (M(qMessage) == One, M(qAlice) == One);
    }

    operation ReconstructMessage(qBob : Qubit, (b1 : Bool, b2 : Bool)) : Unit {
        if b1 {
            Z(qBob);
        }
        if b2 {
            X(qBob);
        }
    }
}