Ejercicio: Uso del entrelazamiento para teletransportar con Q#
En la unidad anterior, ha revisado los pasos del protocolo de teletransportación cuántica. ¡Ahora es tu turno para ayudar a Alice y Bob con su experimento de teletransportación cuántica!
En esta unidad creará un programa de teletransportación cuántica en Q# que usa el protocolo de teletransportación cuántica para enviar el estado de un cúbit de Alice a Bob.
Creación de un programa de teletransportación cuántica en Q#
- Abra Visual Studio Code.
- Seleccione Archivo > Nuevo archivo de texto y guárdelo como Main.qs.
- Seleccione Ver> - Paleta de comandos y escriba Q#: Establezca el targetperfil de QIR de Azure Quantum. Presione ENTRAR.
- Seleccione Q#: Sin restricciones.
Importación de las bibliotecas necesarias
En primer lugar, debe importar las bibliotecas necesarias para usar las operaciones y funciones de Q#. Copie y pegue el siguiente código en el archivo Main.qs.
import Microsoft.Quantum.Diagnostics.*; // Aka Std.Diagnostics.*;
import Microsoft.Quantum.Intrinsic.*; // Aka Std.Intrinsic.*;
import Microsoft.Quantum.Measurement.*; // Aka Std.Measurement.*;
Definición de la operación Teleport
En primer lugar, debe definir la Teleport
operación que implementa el protocolo de teletransportación cuántica. La operación toma dos cúbits como entrada: el message
cúbit que contiene el estado cuántico que se va a teletransportar y el bob
cúbit que recibirá el estado.
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);
}
Vamos a desglosar la Teleport
operación:
La operación usa el
alice
cúbit y crea un entrelazamiento entrealice
cúbits ybob
. A continuación, elmessage
cúbit se entrelazará con elalice
cúbit, por lo que los dos cúbits están entrelazados con elbob
cúbit y semessage
codifican.A continuación, debe medir
alice
ymessage
cúbits en la base de Bell. ¿Cómo puede expresar una medida en la base bell en Q#? No puede. O al menos no directamente. En Q# usted tiene laM
operación, que realiza una medición en la base Z $o en la$base computacional. Por lo tanto, para usar correctamente laM
operación, debe transformar los estados de Bell en los estados de base computacional. Para ello, aplique unaH
operación almessage
cúbit. En la tabla siguiente se muestra la correspondencia entre los estados de Bell y los estados de base computacional.Estado de Bell Estado de base computacional $\ket{\phi^+}$ $\ket{00}$ $\ket{\phi^-}$ $\ket{01}$ $\ket{\psi^+}$ $\ket{10}$ $\ket{\psi^-}$ $\ket{11}$ Sugerencia
Un buen ejercicio es comprobar la equivalencia de los estados de Bell y los estados de base computacional después de aplicar la operación Hadamard al primer cúbit. Buena suerte.
Por último, las
if
instrucciones comprueban los resultados de la medición y aplican correcciones albob
cúbit en consecuencia. Si elmessage
cúbit se mide enOne
, aplique la puerta Z albob
cúbit. Si elalice
cúbit también se mide enOne
, aplique la puerta X albob
cúbit.
Definición de las operaciones SetToPlus
y SetToMinus
En caso de que quiera teletransportar cúbits en diferentes estados, como |0⟩, |1⟩, |+⟩ y |-⟩, debe definir los estados inicializados. Ya tiene la Teleport
operación para teletransportar el cúbit, pero debe preparar el cúbit en el estado correcto antes de teletransportarlo.
Debe definir dos operaciones más y SetToPlus
SetToMinus
, para establecer un cúbit en el estado |0⟩ en |+⟩ y |-⟩, respectivamente.
/// 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);
}
Definición de la operación Main
Cada programa Q# debe tener una operación Main
que actúa como punto de entrada para el programa. La operación Main
ejecuta el protocolo de teletransportación para distintos estados cuánticos, $\ket{{0}$, $\ket{1}$, $\ket{+}$ y $\ket{-}$.
Vamos a desglosar la Main
operación:
- La operación asigna dos cúbits,
message
ybob
. - Define una lista de tuplas que contienen el estado cuántico, la operación del inicializador necesaria para inicializar el cúbit en este estado y la base para la teletransportación. Las operaciones del inicializador son
I
para $\ket{0}$,X
para $\ket{1}$,SetToPlus
para $\ket{+}$ ySetToMinus
para $\ket{-}$. Las operacionesSetToPlus
ySetToMinus
se definen en los pasos anteriores. - La operación recorre en iteración la lista de tuplas e inicializa el cúbit
message
en el estado correspondiente y usaDumpMachine
para mostrar el estado. A continuación, teletransporta el estado del cúbitmessage
al cúbitbob
mediante la operaciónTeleport
definida en los pasos anteriores. - Después de teletransportar el estado, la operación mide el cúbit
bob
en la base correspondiente y restablece los cúbits para seguir teletransportando más mensajes. - Por último, la operación devuelve los resultados de medición de cada teletransporte.
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;
}
Ejecución del programa
El programa de teletransportación cuántica está listo. Puede ejecutar el programa para ver cómo funciona la teletransportación cuántica para diferentes estados cuánticos. El programa inicializa el message
cúbit en diferentes estados y teletransporta el estado al bob
cúbit.
El código siguiente contiene la Teleport
operación, las SetToPlus
operaciones y SetToMinus
la Main
operación que ejecuta el protocolo de teletransportación para diferentes estados cuánticos.
El archivo Main.qs debe tener este aspecto:
/// 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); }
Para ejecutar el programa en el simulador integrado, haga clic en Ejecutar encima de la operación
Main
o presione Ctrl+F5. La salida aparecerá en la consola de depuración.Compruebe que los estados recibidos coinciden con los estados de teletransporte. Por ejemplo:
Teleporting state |0〉 DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |00⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Received state |0〉