Implementación con Qiskit
En esta lección implementamos algunas de las ideas de la lección sobre entrelazamiento en acción, usando Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import __version__
print(__version__)
2.1.1
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram, array_to_latex
from qiskit.result import marginal_distribution
from qiskit.circuit.library import UGate
from numpy import pi, random
A continuación se muestra una implementación del protocolo de teleportación mediante un circuito cuántico.
qubit = QuantumRegister(1, "Q")
ebit0 = QuantumRegister(1, "A")
ebit1 = QuantumRegister(1, "B")
a = ClassicalRegister(1, "a")
b = ClassicalRegister(1, "b")
protocol = QuantumCircuit(qubit, ebit0, ebit1, a, b)
# Prepare ebit used for teleportation
protocol.h(ebit0)
protocol.cx(ebit0, ebit1)
protocol.barrier()
# Alice's operations
protocol.cx(qubit, ebit0)
protocol.h(qubit)
protocol.barrier()
# Alice measures and sends classical bits to Bob
protocol.measure(ebit0, a)
protocol.measure(qubit, b)
protocol.barrier()
# Bob uses the classical bits to conditionally apply gates
with protocol.if_test((a, 1)):
protocol.x(ebit1)
with protocol.if_test((b, 1)):
protocol.z(ebit1)
display(protocol.draw(output="mpl"))

El circuito utiliza algunas características de Qiskit que aún no habíamos visto en lecciones anteriores, como las funciones barrier e if_test.
La función barrier crea una separación visual que hace el diagrama del circuito más legible, y además impide que Qiskit aplique diversas simplificaciones y optimizaciones a través de la barrera durante la compilación cuando los circuitos se ejecutan en hardware real.
La función if_test aplica una operación de forma condicional dependiendo de un bit o registro clásico.
El circuito primero inicializa en el estado (lo cual no forma parte del protocolo en sí), seguido de las operaciones de Alice, luego sus mediciones y, finalmente, las operaciones de Bob. Para verificar que el protocolo funciona correctamente, aplicaremos una compuerta de un solo qubit generada aleatoriamente al estado inicializado de , con el fin de obtener un vector de estado cuántico aleatorio para teleportar. Al aplicar la inversa (es decir, la transpuesta conjugada) de esa compuerta a después de ejecutar el protocolo, podemos verificar que el estado fue teleportado midiendo para comprobar que ha vuelto al estado .
Primero elegiremos aleatoriamente una compuerta unitaria de un qubit.
random_gate = UGate(
theta=random.random() * 2 * pi,
phi=random.random() * 2 * pi,
lam=random.random() * 2 * pi,
)
display(array_to_latex(random_gate.to_matrix()))
Ahora crearemos un nuevo circuito de prueba que primero aplica nuestra compuerta aleatoria a luego ejecuta el circuito de teleportación y, finalmente, aplica la inversa de nuestra compuerta aleatoria al qubit y mide. El resultado debería ser con certeza.
# Create a new circuit including the same bits and qubits used in the
# teleportation protocol.
test = QuantumCircuit(qubit, ebit0, ebit1, a, b)
# Start with the randomly selected gate on Q
test.append(random_gate, qubit)
test.barrier()
# Append the entire teleportation protocol from above.
test = test.compose(protocol)
test.barrier()
# Finally, apply the inverse of the random unitary to B and measure.
test.append(random_gate.inverse(), ebit1)
result = ClassicalRegister(1, "Result")
test.add_register(result)
test.measure(ebit1, result)
display(test.draw(output="mpl"))

Por último, ejecutemos el simulador Aer en este circuito y grafiquemos un histograma de las salidas. Veremos las estadísticas de los tres bits clásicos: el bit inferior/más a la izquierda siempre debería ser lo que indica que el qubit fue teleportado exitosamente a mientras que los otros dos bits deberían ser aproximadamente uniformes.
result = AerSimulator().run(test).result()
statistics = result.get_counts()
display(plot_histogram(statistics))
También podemos filtrar las estadísticas para centrarnos únicamente en el qubit de resultado de la prueba si lo deseamos, de esta manera:
filtered_statistics = marginal_distribution(statistics, [2])
display(plot_histogram(filtered_statistics))
Codificación superdensa
La codificación superdensa es un protocolo que, en cierto sentido, persigue un objetivo complementario al de la teletransportación. En lugar de permitir la transmisión de un qubit usando dos bits clásicos de comunicación (al costo de un e-bit de entrelazamiento), permite la transmisión de dos bits clásicos usando un qubit de comunicación cuántica (también al costo de un e-bit de entrelazamiento).
En detalle, tenemos un emisor (Alicia) y un receptor (Bob) que comparten un e-bit de entrelazamiento. Según las convenciones de la lección, esto significa que Alicia tiene un qubit Bob tiene un qubit y juntos el par se encuentra en el estado Alicia desea transmitirle a Bob dos bits clásicos, que denotaremos como y y lo logrará enviándole un qubit.
Es razonable considerar esta hazaña como menos impresionante que la de la teletransportación. Enviar qubits seguirá siendo mucho más difícil que enviar bits clásicos en el futuro previsible, así que intercambiar un qubit de comunicación cuántica por dos bits de comunicación clásica, con el costo de un e-bit encima, no parece valer la pena. Sin embargo, esto no implica que la codificación superdensa no sea interesante, porque sin duda lo es.
Siguiendo el tema de la lección, una razón por la que la codificación superdensa es interesante es que demuestra un uso concreto y (en el contexto de la teoría de la información) bastante llamativo del entrelazamiento. Un famoso teorema de la teoría de la información cuántica, conocido como el teorema de Holevo, implica que sin el uso de un estado entrelazado compartido, es imposible comunicar más de un bit de información clásica enviando un único qubit. (El teorema de Holevo es más general que esto. Su enunciado preciso es técnico y requiere explicación, pero esta es una de sus consecuencias.) Así, mediante la codificación superdensa, el entrelazamiento compartido permite efectivamente duplicar la capacidad de transmisión de información clásica al enviar qubits.
Protocolo
El siguiente diagrama de circuito cuántico describe el protocolo de codificación superdensa:

En palabras, esto es lo que hace Alicia:
-
Si Alicia aplica una compuerta a su qubit (y si no hace nada).
-
Si Alicia aplica una compuerta a su qubit (y si no hace nada).
Luego, Alicia le envía su qubit a Bob.
Cuando Bob recibe el qubit , primero aplica una compuerta NOT controlada, con como control y como objetivo, y luego aplica una compuerta de Hadamard a Después mide para obtener y para obtener usando mediciones en la base estándar en ambos casos.
Análisis
La idea detrás de este protocolo es sencilla: Alicia elige efectivamente qué estado de Bell quiere compartir con Bob, le envía su qubit, y Bob mide para determinar cuál estado de Bell eligió Alicia.
Es decir, inicialmente comparten y dependiendo de los bits y Alicia deja ese estado intacto o lo transforma en uno de los otros estados de Bell aplicando o a su qubit
Las acciones de Bob producen los siguientes efectos sobre los cuatro estados de Bell:
Esto puede verificarse directamente calculando los resultados de las operaciones de Bob sobre cada uno de estos estados por separado.
Así, cuando Bob realiza sus mediciones, puede determinar cuál estado de Bell eligió Alicia. Verificar que el protocolo funciona correctamente consiste en revisar cada caso:
-
Si entonces el estado de cuando Bob recibe es Él transforma este estado en y obtiene
-
Si entonces el estado de cuando Bob recibe es Él transforma este estado en y obtiene
-
Si entonces el estado de cuando Bob recibe es Él transforma este estado en y obtiene
-
Si entonces el estado de cuando Bob recibe es Él transforma este estado en y obtiene (El factor de fase negativo no tiene ningún efecto aquí.)
Implementación de codificación superdensa
A continuación se presenta una implementación simple de la codificación superdensa donde se especifica el circuito en función de los bits a transmitir. Primero elegiremos dos bits para transmitir. (Más adelante los elegiremos de forma aleatoria, pero por ahora simplemente haremos una elección arbitraria.)
c = "1"
d = "0"
Ahora construiremos el circuito correspondiente. Aquí le dejaremos a Qiskit usar los nombres por defecto para los qubits: para el qubit superior y para el inferior.
protocol = QuantumCircuit(2)
# Prepare ebit used for superdense coding
protocol.h(0)
protocol.cx(0, 1)
protocol.barrier()
# Alice's operations
if d == "1":
protocol.z(0)
if c == "1":
protocol.x(0)
protocol.barrier()
# Bob's actions
protocol.cx(0, 1)
protocol.h(0)
protocol.measure_all()
display(protocol.draw(output="mpl"))

Aquí no hay mucho de nuevo, excepto la función measure_all, que mide todos los qubits y coloca los resultados en un único registro clásico (que en este caso contiene dos bits).
Al ejecutar el simulador Aer se obtiene la salida esperada.
result = AerSimulator().run(protocol).result()
statistics = result.get_counts()
for outcome, frequency in statistics.items():
print(f"Measured {outcome} with frequency {frequency}")
display(plot_histogram(statistics))
Measured 10 with frequency 1024
Ahora usaremos un qubit adicional como generador de bits aleatorios — esencialmente para lanzar monedas justas. Lo utilizaremos para elegir y de forma aleatoria, y luego ejecutaremos el protocolo de codificación superdensa.
rbg = QuantumRegister(1, "coin")
ebit0 = QuantumRegister(1, "A")
ebit1 = QuantumRegister(1, "B")
Alice_c = ClassicalRegister(1, "Alice c")
Alice_d = ClassicalRegister(1, "Alice d")
test = QuantumCircuit(rbg, ebit0, ebit1, Alice_d, Alice_c)
# Initialize the ebit
test.h(ebit0)
test.cx(ebit0, ebit1)
test.barrier()
# Use the 'coin' qubit twice to generate Alice's bits c and d.
test.h(rbg)
test.measure(rbg, Alice_c)
test.h(rbg)
test.measure(rbg, Alice_d)
test.barrier()
# Now the protocol runs, starting with Alice's actions, which depend
# on her bits.
with test.if_test((Alice_d, 1), label="Z"):
test.z(ebit0)
with test.if_test((Alice_c, 1), label="X"):
test.x(ebit0)
test.barrier()
# Bob's actions
test.cx(ebit0, ebit1)
test.h(ebit0)
test.barrier()
Bob_c = ClassicalRegister(1, "Bob c")
Bob_d = ClassicalRegister(1, "Bob d")
test.add_register(Bob_d)
test.add_register(Bob_c)
test.measure(ebit0, Bob_d)
test.measure(ebit1, Bob_c)
display(test.draw(output="mpl"))

Al ejecutar el simulador Aer se muestran los resultados: los bits clásicos de Alicia y Bob siempre coinciden.
result = AerSimulator().run(test).result()
statistics = result.get_counts()
display(plot_histogram(statistics))

El juego CHSH
El último ejemplo que veremos en esta lección no es un protocolo, sino un juego conocido como el juego CHSH.
Cuando hablamos de un juego en este contexto, no nos referimos a algo pensado para divertirse o competir, sino a una abstracción matemática en el sentido de la teoría de juegos. Las abstracciones matemáticas de juegos se estudian en economía y ciencias de la computación, por ejemplo, y son a la vez fascinantes y útiles.
Las letras CHSH hacen referencia a los autores — John Clauser, Michael Horne, Abner Shimony y Richard Holt — de un artículo de 1969 donde se describió el ejemplo por primera vez. Ellos no lo describieron como un juego, sino como un experimento. Sin embargo, su descripción como juego es natural e intuitiva.
El juego CHSH pertenece a una clase de juegos conocidos como juegos no locales. Los juegos no locales son increíblemente interesantes y tienen conexiones profundas con la física, las ciencias de la computación y las matemáticas — guardando misterios que aún permanecen sin resolver. Comenzaremos la sección explicando qué son los juegos no locales y luego nos centraremos en el juego CHSH y en lo que lo hace interesante.
Juegos no locales
Un juego no local es un juego cooperativo donde dos jugadores, Alice y Bob, trabajan juntos para lograr un resultado particular. El juego está dirigido por un árbitro, que actúa según reglas estrictas conocidas por Alice y Bob.
Alice y Bob pueden prepararse para el juego como deseen, pero una vez que comienza, tienen prohibido comunicarse. Podemos imaginar el juego tomando lugar en algún tipo de instalación segura — como si el árbitro jugara el papel de un detective y Alice y Bob fueran sospechosos siendo interrogados en habitaciones separadas. Pero otra forma de pensar en la configuración es que Alice y Bob están separados por una gran distancia, y la comunicación está prohibida porque la velocidad de la luz no lo permite dentro del tiempo de ejecución del juego. Es decir, si Alice intenta enviar un mensaje a Bob, el juego habrá terminado antes de que él lo reciba, y viceversa.
La forma en que funciona un juego no local es que el árbitro primero le hace una pregunta a cada uno. Usaremos la letra para referirnos a la pregunta de Alice e para referirnos a la de Bob. Aquí estamos pensando en e como estados clásicos, y en el juego CHSH e son bits.
El árbitro usa aleatoriedad para seleccionar estas preguntas. Para ser precisos, existe una probabilidad asociada con cada par posible de preguntas, y el árbitro se ha comprometido a elegir las preguntas aleatoriamente, en el momento del juego, de esta manera. Todos, incluyendo Alice y Bob, conocen estas probabilidades — pero nadie sabe específicamente qué par será elegido hasta que comience el juego.
Después de que Alice y Bob reciben sus preguntas, deben proporcionar respuestas: la respuesta de Alice es y la de Bob es De nuevo, estos son estados clásicos en general, y bits en el juego CHSH.
En este punto el árbitro toma una decisión: Alice y Bob ganan o pierden dependiendo de si el par de respuestas es considerado correcto para el par de preguntas según un conjunto fijo de reglas. Distintas reglas significan distintos juegos, y las reglas del juego CHSH en particular se describen en la sección siguiente. Como ya se sugirió, las reglas son conocidas por todos.
El siguiente diagrama ofrece una representación gráfica de las interacciones.

La incertidumbre sobre qué preguntas se harán, y específicamente el hecho de que cada jugador desconoce la pregunta del otro, es lo que hace que los juegos no locales sean un desafío para Alice y Bob — igual que sospechosos que conspiran en habitaciones separadas intentando mantener una historia coherente.
Una descripción precisa del árbitro define una instancia de un juego no local. Esto incluye una especificación de las probabilidades para cada par de preguntas junto con las reglas que determinan si cada par de respuestas gana o pierde para cada par de preguntas posible
Veremos el juego CHSH en un momento, pero antes reconozcamos brevemente que también es interesante considerar otros juegos no locales. De hecho, es extremadamente interesante; hay algunos juegos no locales bastante simples para los cuales actualmente se desconoce qué tan bien pueden jugar Alice y Bob usando entrelazamiento. La configuración es sencilla, pero hay complejidad en juego — y para algunos juegos puede ser imposiblemente difícil calcular las mejores estrategias o estrategias cercanas a las óptimas para Alice y Bob. Esta es la naturaleza sorprendentemente contraintuitiva del modelo de juegos no locales.
Descripción del juego CHSH
Aquí está la descripción precisa del juego CHSH, donde (como antes) es la pregunta de Alice, es la pregunta de Bob, es la respuesta de Alice y es la respuesta de Bob:
-
Las preguntas y respuestas son todas bits:
-
El árbitro elige las preguntas uniformemente al azar. Es decir, cada una de las cuatro posibilidades, y se selecciona con probabilidad
-
Las respuestas ganan para las preguntas si y pierden en caso contrario. La siguiente tabla expresa esta regla listando las condiciones de victoria y derrota sobre las respuestas para cada par de preguntas
Limitación de las estrategias clásicas
Ahora consideremos estrategias para Alice y Bob en el juego CHSH, comenzando con las estrategias clásicas.
Estrategias deterministas
Empezaremos con las estrategias deterministas, donde la respuesta de Alice es una función de la pregunta que recibe, y del mismo modo la respuesta de Bob es una función de la pregunta que él recibe. Así, por ejemplo, podemos escribir para representar la respuesta de Alice cuando su pregunta es y para representar su respuesta cuando su pregunta es
Ninguna estrategia determinista puede ganar el juego CHSH todas las veces. Una manera de entender esto es simplemente ir uno por uno a través de todas las estrategias deterministas posibles y verificar que cada una pierde para al menos uno de los cuatro pares de preguntas posibles. Alice y Bob pueden elegir entre cuatro funciones posibles de un bit a un bit — que encontramos en la lección sobre Sistemas individuales — y por eso hay estrategias deterministas diferentes en total que verificar.
También podemos razonarlo analíticamente. Si la estrategia de Alice y Bob gana cuando entonces debe ser que si su estrategia gana cuando entonces y del mismo modo, si la estrategia gana para entonces Así, si su estrategia gana para las tres posibilidades, entonces
Esto implica que la estrategia pierde en el caso final donde ganar requiere que Por lo tanto, no puede existir una estrategia determinista que gane siempre.
Por otro lado, es fácil encontrar estrategias deterministas que ganen en tres de los cuatro casos, como De esto concluimos que la probabilidad máxima de que Alice y Bob ganen usando una estrategia determinista es
Estrategias probabilistas
Como acabamos de concluir, Alice y Bob no pueden hacer mejor que ganar el juego CHSH el 75% de las veces usando una estrategia determinista. ¿Pero qué pasa con una estrategia probabilista? ¿Podría ayudar a Alice y Bob usar aleatoriedad — incluyendo la posibilidad de aleatoriedad compartida, donde sus elecciones aleatorias están correlacionadas?
Resulta que las estrategias probabilistas no ayudan en absoluto a aumentar la probabilidad de que Alice y Bob ganen. Esto se debe a que toda estrategia probabilista puede verse alternativamente como una selección aleatoria de una estrategia determinista, igual que (como se menciónó en la lección de Sistemas individuales) las operaciones probabilistas pueden verse como selecciones aleatorias de operaciones deterministas. El promedio nunca es mayor que el máximo, por lo que se sigue que las estrategias probabilistas no ofrecen ninguna ventaja en términos de su probabilidad global de victoria.
Así, ganar con probabilidad es lo mejor que Alice y Bob pueden hacer usando cualquier estrategia clásica, ya sea determinista o probabilista.
Estrategia para el juego CHSH
Una pregunta natural en este punto es si Alice y Bob pueden hacerlo mejor usando una estrategia cuántica. En particular, si comparten un estado cuántico entrelazado como sugiere la siguiente figura, que podrían haber preparado antes de jugar el juego, ¿pueden aumentar su probabilidad de victoria?

La respuesta es sí, y ese es el punto principal del ejemplo y la razón por la que es tan interesante. Así que veamos exactamente cómo Alice y Bob pueden hacerlo mejor en este juego usando entrelazamiento.
Vectores y matrices necesarios
Lo primero que debemos hacer es definir un vector de estado de qubit para cada número real (que pensaremos como un ángulo medido en radianes) de la siguiente forma.
Aquí hay algunos ejemplos simples:
También tenemos los siguientes ejemplos, que aparecen en el análisis de más adelante:
Al observar la forma general, vemos que el producto interno entre dos cualesquiera de estos vectores tiene esta fórmula:
En detalle, como las entradas de estos vectores son solo números reales, no hay conjugados complejos de los cuales preocuparse: el producto interno es el producto de los cosenos más el producto de los senos. Usar una de las fórmulas de adición de ángulos de trigonometría conduce a la simplificación anterior. Esta fórmula revela la interpretación geométrica del producto interno entre vectores unitarios reales como el coseno del ángulo entre ellos.
Si calculamos el producto interno del producto tensorial de dos cualesquiera de estos vectores con el estado , obtenemos una expresión similar, excepto que tiene un en el denominador:
Nuestro interés en este producto interno en particular quedará claro en breve, pero por ahora simplemente lo observamos como una fórmula.
A continuación, definamos una matriz unitaria para cada ángulo de la siguiente manera.
Intuitivamente, esta matriz transforma en y en Para verificar que es una matriz unitaria, una observación clave es que los vectores y son ortogonales para todo ángulo :
Así, encontramos que
También podemos escribir esta matriz explícitamente como
Este es un ejemplo de una matriz de rotación, y específicamente rota vectores bidimensionales con entradas de números reales en un ángulo de alrededor del origen. Si seguimos una convención estándar para nombrar y parametrizar rotaciones de diversas formas, tenemos donde
Descripción de la estrategia
Ahora podemos describir la estrategia cuántica.
-
Configuración: Alice y Bob comienzan el juego compartiendo un e-bit: Alice tiene un qubit Bob tiene un qubit y juntos los dos qubits están en el estado .
-
Acciones de Alice:
- Si Alice recibe la pregunta aplica a su qubit
- Si Alice recibe la pregunta aplica a su qubit
La operación que Alice realiza sobre puede describirse alternativamente así:
Después de aplicar esta operación, Alice mide con una medición en la base estándar y establece su respuesta como el resultado de la medición.
-
Acciones de Bob:
- Si Bob recibe la pregunta aplica a su qubit
- Si Bob recibe la pregunta aplica a su qubit
Al igual que hicimos con Alice, podemos expresar la operación de Bob sobre así:
Después de aplicar esta operación, Bob mide con una medición en la base estándar y establece su respuesta como el resultado de la medición.
Aquí hay un diagrama de circuito cuántico que describe esta estrategia:

En este diagrama vemos dos compuertas controladas ordinarias, una para en la parte superior y otra para en la parte inferior. También tenemos dos compuertas que parecen compuertas controladas, una para arriba y otra para abajo, excepto que el círculo que representa el control no está relleno. Esto denota un tipo diferente de compuerta controlada donde la compuerta se ejecuta si el control está en (en lugar de como en una compuerta controlada ordinaria). Entonces, efectivamente, Bob aplica a su qubit si y si y Alice aplica a su qubit si y si lo cual es consistente con la descripción del protocolo en palabras anterior.
Ahora queda determinar qué tan bien funciona esta estrategia para Alice y Bob. Lo haremos repasando los cuatro pares de preguntas posibles individualmente.
Análisis caso por caso
-
Caso 1:
En este caso Alice aplica a su qubit y Bob aplica al suyo, por lo que el estado de los dos qubits después de que realizan sus operaciones es
Las probabilidades para los cuatro pares de respuestas posibles son entonces las siguientes.