Создание телепортации с помощью Q#
В предыдущем уроке описаны шаги протокола квантового телепортации. Теперь это ваш поворот, чтобы помочь Алисе и Бобу с их квантовым экспериментом телепортации!
В этом уроке вы создадите программу квантового телепортации, которая Q# использует протокол квантового телепортации для отправки состояния кубита из Алисы в Боб.
Создание программы квантового телепортации в Q#
- Откройте Visual Studio Code.
- > Выберите новый текстовый файл и сохраните его в качестве Main.qs.
- Выберите представление —> палитра команд и типQ#: задайте профиль QIR target Azure Quantum. Нажмите ВВОД.
- Выберите 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
операцию:
Операция использует
alice
кубит и создает запутанность междуalice
кубитами иbob
кубитами. Затемmessage
кубит запутан сalice
кубитом, поэтому два кубита запутаны сbob
кубитом, иmessage
кодируется.Затем необходимо измерять
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 к первому кубите. Удачи!
Наконец,
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
операцию:
- Операция выделяет два кубита
message
иbob
. - Он определяет список кортежей, содержащих квантовое состояние, операцию инициализатора, необходимую для инициализации кубита в таком состоянии, и основу телепортации. Операции инициализатора предназначены
I
для $\ket{0}$,SetToPlus
X
для $\ket{$\ket{1}$+}$иSetToMinus
для $\ket{-}$.SetToMinus
ОперацииSetToPlus
определяются на предыдущих шагах. - Операция выполняет итерацию по списку кортежей и инициализирует
message
кубит в соответствующем состоянии и используетDumpMachine
для отображения состояния. Затем он телепортирует состояниеmessage
кубитаbob
к кубите с помощьюTeleport
операции, определенной на предыдущих шагах. - После телепортирования состояния операция измеряет
bob
кубит в соответствующей основе и сбрасывает кубиты, чтобы продолжить телепортирование большего объема сообщений. - Наконец, операция возвращает результаты измерения для каждой телепортации.
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
операции, которые выполняют протокол телепортации для различных квантовых состояний.
Файл 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); }
Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над
Main
операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.Убедитесь, что полученные состояния соответствуют состояниям телепортирования. Например:
Teleporting state |0〉 DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |00⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Received state |0〉