Создание телепортации с помощью Q#

Завершено

В предыдущем уроке описаны шаги протокола квантового телепортации. Теперь это ваш поворот, чтобы помочь Алисе и Бобу с их квантовым экспериментом телепортации!

В этом уроке вы создадите программу квантового телепортации, которая Q# использует протокол квантового телепортации для отправки состояния кубита из Алисы в Боб.

Создание программы квантового телепортации в Q#

  1. Откройте Visual Studio Code.
  2. > Выберите новый текстовый файл и сохраните его в качестве Main.qs.
  3. Выберите представление —> палитра команд и типQ#: задайте профиль QIR target Azure Quantum. Нажмите ВВОД.
  4. Выберите Q#: Неограниченно.

Импорт необходимых библиотек

Сначала необходимо импортировать необходимые библиотеки для использования Q# операций и функций. Скопируйте и вставьте следующий код в файл Main.qs .

import Microsoft.Quantum.Diagnostics.*; // Aka Std.Diagnostics.*;
import Microsoft.Quantum.Intrinsic.*; // Aka Std.Intrinsic.*;
import Microsoft.Quantum.Measurement.*; // Aka Std.Measurement.*;

Teleport Определение операции

Сначала необходимо определить Teleport операцию, реализующую протокол квантового телепортации. Операция принимает два кубита в качестве входных данных: message кубит, содержащий квантовое состояние, которое должно быть телепортировано, и bob кубит, который получит состояние.

operation Teleport(message : Qubit, bob : Qubit) : Unit {
        // Allocate an alice qubit.
        use alice = Qubit();

        // Create some entanglement that we can use to send our message.
        H(alice);
        CNOT(alice, bob);

        // Encode the message into the entangled pair.
        CNOT(message, alice);
        H(message);

        // Measure the qubits to extract the classical data we need to decode
        // the message by applying the corrections on the bob qubit
        // accordingly.
        if M(message) == One {
            Z(bob);
        }
        if M(alice) == One {
            X(bob);
        }

        // Reset alice qubit before releasing.
        Reset(alice);
    }

Давайте разберем Teleport операцию:

  1. Операция использует alice кубит и создает запутанность между alice кубитами и bob кубитами. Затем message кубит запутан с alice кубитом, поэтому два кубита запутаны с bob кубитом, и message кодируется.

  2. Затем необходимо измерять alice и message кубиты в основе Колокола. Как вы можете выразить измерение в основе Колокола в Q#? Это невозможно. Или, по крайней мере, не напрямую. У Q# вас есть M операция, которая выполняет измерение на $основе Z$ или вычислительной основе. Поэтому для правильного M использования операции необходимо преобразовать состояния Bell в вычислительные базовые состояния. Это можно сделать, применив H операцию к message кубите. В следующей таблице показано соответствие между состояниями Bell и вычислительными состояниями.

    Двухкубитовое состояние Состояние вычислительной основы
    $\ket{\phi^+}$ $\ket{00}$
    $\ket{\phi^-}$ $\ket{01}$
    $\ket{\psi^+}$ $\ket{10}$
    $\ket{\psi^-}$ $\ket{11}$

    Совет

    Хорошее упражнение заключается в проверке эквивалентности состояний Bell и вычислительных базовых состояний после применения операции Hadamard к первому кубите. Удачи!

  3. Наконец, if инструкции проверяют результаты измерения и применяют исправления к bob кубитам соответствующим образом. message Если кубит измеряется, Oneпримените шлюз Z к кубитамbob. alice Если кубит также измеряется при One применении ворот X к bob кубите.

SetToPlus Определение и SetToMinus операции

Если вы хотите телепортировать кубиты в разных состояниях, например |0⟩, |1⟩, |+⟩ и «⟩», необходимо определить инициализированные |состояния. У вас уже есть Teleport операция телепорта кубита, но необходимо подготовить кубит в правильном состоянии, прежде чем телепортировать его.

Необходимо определить еще две операции и SetToPlus SetToMinusзадать кубит в состоянии |0⟩ значение |+⟩ и |−⟩ соответственно.

    /// Sets a qubit in state |0⟩ to |+⟩.
    operation SetToPlus(q : Qubit) : Unit is Adj + Ctl {
        H(q);
    }

    /// Sets a qubit in state |0⟩ to |−⟩.
    operation SetToMinus(q : Qubit) : Unit is Adj + Ctl {
        X(q);
        H(q);
    }

Main Определение операции

Каждая Q# программа должна иметь Main операцию, которая служит точкой входа для программы. Операция Main выполняет протокол телепортации для различных квантовых состояний, $\ket{{0}$, +$\ket{$\ket{1}$}$и.$\ket{-}$

Давайте разберем Main операцию:

  1. Операция выделяет два кубита message и bob.
  2. Он определяет список кортежей, содержащих квантовое состояние, операцию инициализатора, необходимую для инициализации кубита в таком состоянии, и основу телепортации. Операции инициализатора предназначены I для $\ket{0}$, SetToPlus X для $\ket{$\ket{1}$+}$и SetToMinus для $\ket{-}$. SetToMinus Операции SetToPlus определяются на предыдущих шагах.
  3. Операция выполняет итерацию по списку кортежей и инициализирует message кубит в соответствующем состоянии и использует DumpMachine для отображения состояния. Затем он телепортирует состояние message кубита bob к кубите с помощью Teleport операции, определенной на предыдущих шагах.
  4. После телепортирования состояния операция измеряет bob кубит в соответствующей основе и сбрасывает кубиты, чтобы продолжить телепортирование большего объема сообщений.
  5. Наконец, операция возвращает результаты измерения для каждой телепортации.
operation Main() : Result[] {
    // Allocate the message and bob qubits.
    use (message, bob) = (Qubit(), Qubit());

    // Use the `Teleport` operation to send different quantum states.
    let stateInitializerBasisTuples = [
        ("|0〉", I, PauliZ),
        ("|1〉", X, PauliZ),
        ("|+〉", SetToPlus, PauliX),
        ("|-〉", SetToMinus, PauliX)
    ];

    mutable results = [];
    for (state, initializer, basis) in stateInitializerBasisTuples {
        // Initialize the message and show its state using the `DumpMachine`
        // function.
        initializer(message);
        Message($"Teleporting state {state}");
        DumpMachine();

        // Teleport the message and show the quantum state after
        // teleportation.
        Teleport(message, bob);
        Message($"Received state {state}");
        DumpMachine();

        // Measure bob in the corresponding basis and reset the qubits to
        // continue teleporting more messages.
        let result = Measure([basis], [bob]);
        set results += [result];
        ResetAll([message, bob]);
    }

    return results;
}

Запуск программы

Ваша программа квантового телепортации готова! Вы можете запустить программу, чтобы узнать, как работает квантовая телепортация для различных квантовых состояний. Программа инициализирует message кубит в разных состояниях и телепортирует состояние в bob кубите.

Следующий код содержит Teleport операцию, SetToPlus операции и SetToMinus Main операции, которые выполняют протокол телепортации для различных квантовых состояний.

  1. Файл Main.qs должен выглядеть следующим образом:

    /// This Q# program implements quantum teleportation.
    import Microsoft.Quantum.Diagnostics.*;
    import Microsoft.Quantum.Intrinsic.*;
    import Microsoft.Quantum.Measurement.*;
    
    operation Main() : Result[] {
        // Allocate the message and bob qubits.
        use (message, bob) = (Qubit(), Qubit());
    
        // Use the `Teleport` operation to send different quantum states.
        let stateInitializerBasisTuples = [
            ("|0〉", I, PauliZ),
            ("|1〉", X, PauliZ),
            ("|+〉", SetToPlus, PauliX),
            ("|-〉", SetToMinus, PauliX)
        ];
    
        mutable results = [];
        for (state, initializer, basis) in stateInitializerBasisTuples {
            // Initialize the message and show its state using the `DumpMachine`
            // function.
            initializer(message);
            Message($"Teleporting state {state}");
            DumpMachine();
    
            // Teleport the message and show the quantum state after
            // teleportation.
            Teleport(message, bob);
            Message($"Received state {state}");
            DumpMachine();
    
            // Measure bob in the corresponding basis and reset the qubits to
            // continue teleporting more messages.
            let result = Measure([basis], [bob]);
            set results += [result];
            ResetAll([message, bob]);
        }
    
        return results;
    }
    
    /// # Summary
    /// Sends the state of one qubit to a bob qubit by using teleportation.
    ///
    /// Notice that after calling Teleport, the state of `message` is collapsed.
    ///
    /// # Input
    /// ## message
    /// A qubit whose state we wish to send.
    /// ## bob
    /// A qubit initially in the |0〉 state that we want to send
    /// the state of message to.
    operation Teleport(message : Qubit, bob : Qubit) : Unit {
        // Allocate an alice qubit.
        use alice = Qubit();
    
        // Create some entanglement that we can use to send our message.
        H(alice);
        CNOT(alice, bob);
    
        // Encode the message into the entangled pair.
        CNOT(message, alice);
        H(message);
    
        // Measure the qubits to extract the classical data we need to decode
        // the message by applying the corrections on the bob qubit
        // accordingly.
        if M(message) == One {
            Z(bob);
        }
        if M(alice) == One {
            X(bob);
        }
    
        // Reset alice qubit before releasing.
        Reset(alice);
    }
    
    /// # Summary
    /// Sets a qubit in state |0⟩ to |+⟩.
    operation SetToPlus(q : Qubit) : Unit is Adj + Ctl {
        H(q);
    }
    
    /// # Summary
    /// Sets a qubit in state |0⟩ to |−⟩.
    operation SetToMinus(q : Qubit) : Unit is Adj + Ctl {
        X(q);
        H(q);
    }
    
  2. Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над Main операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

  3. Убедитесь, что полученные состояния соответствуют состояниям телепортирования. Например:

    Teleporting state |0〉
    
    DumpMachine:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
      |00⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
    Received state |0〉