Saltar al contenido principal

Código tórico

A continuación discutimos un código CSS específico, el código tórico, descubierto en 1997 por Alexei Kitaev. En realidad, el código tórico no es un solo código, sino una familia de códigos — uno para cada entero positivo a partir de 2. Estos códigos poseen algunas propiedades importantes:

  • Los generadores de estabilizador tienen bajo peso, en particular todos tienen peso 4. En la teoría de codificación, el código tórico es un ejemplo de un código cuántico de verificación de paridad de baja densidad, o código cuántico LDPC (donde baja en este caso significa 4). Esto es ventajoso porque la medición de cada generador de estabilizador no requiere demasiados qubits.

  • El código tórico tiene localidad geométrica. Esto significa que los generadores de estabilizador no solo tienen bajo peso, sino que también es posible disponer los qubits espacialmente de manera que cada una de las mediciones de generadores de estabilizador solo involucre qubits que estén cerca unos de otros. Esto hace que estas mediciones sean, en principio, más fáciles de implementar que si involucraran qubits espacialmente distantes.

  • Los miembros de la familia de códigos tóricos tienen una distancia cada vez mayor y pueden tolerar una tasa de error relativamente alta.

Descripción del código tórico

Sea L2L\geq 2 un entero positivo, y consideremos una cuadrícula de L×LL\times L con los llamados bordes periódicos. Este diagrama muestra, por ejemplo, una cuadrícula de L×LL\times L para L=9.L=9.

Una cuadrícula de 9x9 con bordes periódicos

Nótese que las líneas del lado derecho y del borde inferior son líneas discontinuas. Esto indica que la línea discontinua de la derecha es la misma línea que la del extremo izquierdo, y del mismo modo, la línea discontinua del borde inferior es la misma que la del extremo superior.

Para realizar físicamente una configuración así, se requieren tres dimensiones. En particular, se podría formar un cilindro con la cuadrícula uniendo primero los lados izquierdo y derecho, y luego doblando el cilindro de modo que los círculos de los extremos — que antes eran los bordes superior e inferior de la cuadrícula — se encuentren. O se puede unir primero la parte superior con la inferior y luego los lados; ambas opciones funcionan y no importa cuál se haga primero para esta discusión.

Lo que obtenemos es un toro — o, en otras palabras, un dónut (aunque la imagen de una cámara de aire puede ser más adecuada, ya que esto no es un sólido: la cuadrícula es solo la superficie de un toro). De ahí viene el nombre "código tórico".

Una cuadrícula de 9x9 formada como un toro

La forma en que uno puede moverse entre puntos adyacentes de la cuadrícula en un toro así probablemente resulte familiar para quienes hayan jugado videojuegos clásicos: si se sale por el borde superior de la pantalla, se reaparece abajo, y lo mismo para los bordes izquierdo y derecho. Así es como consideraremos esta cuadrícula con bordes periódicos, en lugar de hablar concretamente de un toro en el espacio tridimensional.

A continuación, se colocan qubits en las aristas de esta cuadrícula, como se muestra en la siguiente figura, donde los qubits se indican mediante círculos azules rellenos.

Qubits en las aristas de una cuadrícula periódica de 9x9

Nótese que los qubits colocados en las líneas discontinuas no están rellenos, ya que ya están representados por los qubits en las líneas más a la izquierda y más arriba de la cuadrícula. En total hay 2L22L^2 qubits: L2L^2 qubits en líneas horizontales y L2L^2 qubits en líneas verticales.

Para describir el propio código tórico, quedan por especificar los generadores de estabilizador:

  • Para cada casilla formada por las líneas de la cuadrícula, hay un generador de estabilizador ZZ, que se obtiene tensorizando matrices ZZ en los cuatro qubits que tocan la casilla junto con matrices identidad en todos los demás qubits.

  • Para cada vértice formado por las líneas de la cuadrícula, hay un generador de estabilizador XX, que se obtiene tensorizando matrices XX en los cuatro qubits adyacentes al vértice junto con matrices identidad en todos los demás qubits.

En ambos casos, obtenemos una operación de Pauli con peso 4. Individualmente, estos generadores de estabilizador se pueden representar de la siguiente manera.

Tipos de generadores de estabilizador para el código tórico

Aquí hay una figura con algunos ejemplos de generadores de estabilizador en el contexto de la propia cuadrícula. Nótese que se incluyen los generadores de estabilizador que se extienden alrededor de los bordes periódicos. Estos generadores que rodean los bordes periódicos no son especiales ni diferentes de ninguna manera de los demás.

Ejemplos de generadores de estabilizador en una cuadrícula

Los generadores de estabilizador deben conmutar para que esto sea un código estabilizador válido. Como es habitual, los generadores de estabilizador ZZ conmutan todos entre sí porque ZZ conmuta consigo mismo y la identidad conmuta con todo, y lo mismo para los generadores de estabilizador XX. Los generadores de estabilizador ZZ y XX conmutan obviamente cuando actúan de forma no trivial sobre conjuntos disjuntos de qubits, como en los ejemplos de la figura anterior. La posibilidad restante es que un generador de estabilizador ZZ y un generador de estabilizador XX se solapen en los qubits sobre los que actúan de forma no trivial, y siempre que esto ocurre, los generadores se solapan siempre en dos qubits, como se muestra en la siguiente figura.

Generadores de estabilizador superpuestos para el código tórico

Por consiguiente, dos generadores de estabilizador de este tipo conmutan, al igual que ZZZ\otimes Z y XXX\otimes X conmutan. Los generadores de estabilizador conmutan, por tanto, todos entre sí.

La segunda condición requerida para los generadores de estabilizador de un código estabilizador es que formen un conjunto generador mínimo. Esta condición en realidad no se cumple para esta colección: al multiplicar todos los generadores de estabilizador ZZ entre sí se obtiene la operación identidad, y lo mismo para los generadores de estabilizador XX. Por lo tanto, cada generador de estabilizador ZZ puede expresarse como producto de todos los restantes, y correspondientemente, cada generador de estabilizador XX puede expresarse como producto de los restantes generadores de estabilizador XX. Sin embargo, si eliminamos uno de los generadores de estabilizador ZZ y uno de los generadores de estabilizador XX, obtenemos un conjunto generador mínimo.

Para ser claros: en realidad nos interesan por igual todos los generadores de estabilizador, y estrictamente hablando no hay necesidad operativa de eliminar un generador de estabilizador de cada tipo. Pero para el análisis del código — en particular para contar los generadores — podemos imaginar que se ha eliminado un generador de estabilizador de cada tipo para obtener un conjunto generador mínimo, teniendo en cuenta que siempre podríamos deducir los resultados de estos generadores eliminados (que pueden considerarse como observables) a partir de los resultados de todos los demás observables de generadores de estabilizador del mismo tipo.

Esto deja L21L^2 - 1 generadores de estabilizador de cada tipo, es decir, 2L222L^2 - 2 en total, en un conjunto generador mínimo (hipotético). Dado que hay 2L22L^2 qubits en total, esto significa que el código tórico codifica 2L22(L21)=22L^2 - 2(L^2 - 1) = 2 qubits.

La última condición requerida para los generadores de estabilizador es que al menos un vector de estado cuántico sea fijado por todos los generadores de estabilizador. Veremos que este es el caso cuando continuemos con el análisis del código, pero también se puede argumentar que no hay forma de generar 1-1 veces la identidad en todos los 2L22L^2 qubits a partir de los generadores de estabilizador.

Detección de errores

El código tórico tiene una descripción simple y elegante, pero sus propiedades de corrección de errores cuánticos pueden no ser evidentes a primera vista. ¡Es un código asombroso! Para entender por qué y cómo funciona, comenzamos examinando diversos errores y los síndromes que generan.

El código tórico es un código CSS porque todos nuestros generadores de estabilizador son generadores de estabilizador ZZ o XX. Esto significa que los errores XX y los errores ZZ pueden detectarse (y posiblemente corregirse) por separado. De hecho, existe una simetría simple entre los generadores de estabilizador ZZ y XX que nos permite analizar los errores XX y ZZ esencialmente de la misma manera. Nos concentraremos, por tanto, en los errores XX, que pueden ser detectados por los generadores de estabilizador ZZ — pero toda la discusión siguiente puede trasladarse de errores XX a errores ZZ, que son detectados de forma análoga por los generadores de estabilizador XX.

El siguiente diagrama muestra el efecto de un error XX en un solo qubit. Aquí se asume que nuestros 2L22L^2 qubits estaban previamente en un estado contenido en el espacio de código del código tórico, de modo que todas las mediciones de generadores de estabilizador dan +1+1. Los generadores de estabilizador ZZ detectan errores XX, y hay uno de estos generadores de estabilizador para cada casilla en la figura, por lo que podemos indicar el resultado de medición del generador de estabilizador correspondiente mediante el color de esa casilla: los resultados +1+1 se indican con casillas blancas y los resultados 1-1 con casillas grises. Cuando ocurre un error de inversión de bit en uno de los qubits, provoca que las mediciones de los generadores de estabilizador para las dos casillas que tocan el qubit afectado ahora den 1-1.

El efecto de un solo error de inversión de bit en el código tórico

Esto es intuitivo si consideramos los generadores de estabilizador ZZ y su comportamiento. En esencia, cada generador de estabilizador ZZ mide la paridad de los cuatro qubits que tocan la casilla correspondiente (respecto a la base estándar). Un resultado +1+1 indica, por tanto, no que no hayan ocurrido errores XX en esos cuatro qubits, sino que ha ocurrido un número par de errores XX, mientras que un resultado 1-1 indica que ha ocurrido un número impar de errores XX. Un solo error XX invierte, por tanto, la paridad de los cuatro bits en ambas casillas que toca, haciendo que las mediciones de los generadores de estabilizador den 1-1.

Consideremos ahora múltiples errores XX para ver qué sucede. En particular, consideremos una cadena de errores XX adyacentes, donde dos errores XX son adyacentes si afectan a qubits que tocan la misma casilla.

El efecto de una cadena de errores de inversión de bit en el código tórico

Los dos generadores de estabilizador ZZ en los extremos de la cadena dan ambos el resultado 1-1 en este caso, ya que en esas dos casillas correspondientes ha ocurrido un número impar de errores XX. Todos los demás generadores de estabilizador ZZ, en cambio, dan el resultado +1+1, incluyendo los que tocan la cadena pero no están en los extremos, porque en los qubits que tocan las casillas correspondientes ha ocurrido un número par de errores XX.

Siempre que tengamos una cadena de errores XX que tiene extremos, el código tórico detecta que han ocurrido errores — y los resultados de medición 1-1 para los generadores de estabilizador ZZ muestran los extremos de la cadena. Nótese que la cadena de errores real no se revela, ¡solo los extremos! Esto está bien — en la siguiente subsección veremos que no necesitamos saber exactamente qué qubits han sido afectados por errores XX para corregirlos. (El código tórico es un ejemplo de un código altamente degenerado, en el sentido de que generalmente no identifica de forma unívoca los errores que se corrigen.)

Sin embargo, es posible que una cadena de errores XX adyacentes no tenga extremos — es decir, que una cadena de errores forme un bucle cerrado, como en la siguiente figura.

Un bucle cerrado de errores de inversión de bit para el código tórico

En tal caso, en cada casilla ha ocurrido un número par de errores XX, por lo que cada medición de generador de estabilizador da un resultado +1+1. Los bucles cerrados de errores XX adyacentes no son, por tanto, detectados por el código.

Esto podría parecer decepcionante, ya que solo se necesitan cuatro errores XX para formar un bucle cerrado (y esperamos algo significativamente mejor que un código de distancia 4). Sin embargo, un bucle cerrado de errores XX como el de la figura anterior en realidad no es un error — porque está en el estabilizador. Recuérdese: además de los generadores de estabilizador ZZ, también tenemos un generador de estabilizador XX para cada vértice de la cuadrícula. Y cuando multiplicamos generadores de estabilizador XX adyacentes entre sí, obtenemos bucles cerrados de operaciones XX. El bucle cerrado de la figura anterior, por ejemplo, puede obtenerse multiplicando los generadores de estabilizador XX indicados en la siguiente figura.

Un bucle cerrado de errores de inversión de bit generado por generadores de estabilizador X

Sin embargo, este no es el único tipo de bucle cerrado de errores XX — y no es cierto que todo bucle cerrado de errores XX esté contenido en el estabilizador. En particular, los diferentes tipos de bucles pueden caracterizarse de la siguiente manera.

  1. Bucles cerrados de errores XX con un número par de errores XX en cada línea horizontal y vertical de qubits. (El ejemplo anterior entra en esta categoría.) Los bucles de esta forma siempre están en el estabilizador, ya que pueden reducirse a nada multiplicando con generadores de estabilizador XX.

  2. Bucles cerrados de errores XX con un número impar de errores XX en al menos una línea horizontal o al menos una línea vertical de qubits. Los bucles de esta forma nunca están en el estabilizador y por tanto representan errores no triviales que el código no detecta.

Un ejemplo de un bucle cerrado de errores XX de la segunda categoría se muestra en el siguiente diagrama.

Un bucle cerrado de errores de inversión de bit, no en el estabilizador

Una cadena de errores de este tipo no está en el estabilizador porque cada generador de estabilizador XX coloca un número par de operaciones XX en cada línea horizontal y vertical de qubits. Este es, por tanto, un ejemplo real de un error no trivial que el código no detecta.

La clave está en que la única forma de formar un bucle del segundo tipo es rodeando el toro — ya sea a través del agujero en el centro del toro, a través de él, o ambas cosas. Intuitivamente, una cadena de errores XX de este tipo no puede reducirse a nada multiplicando con generadores de estabilizador XX porque la topología de un toro lo impide. El código tórico se categoriza a veces como un código corrector de errores cuánticos topológico por esta razón. La longitud más corta posible de un bucle así es LL, y esa es por tanto la distancia del código tórico: cualquier bucle cerrado de errores XX con longitud menor que LL debe pertenecer a la primera categoría y está por tanto en el estabilizador; y cualquier cadena de errores XX con extremos es detectada por el código.

Dado que el código tórico utiliza 2L22L^2 qubits para codificar 22 qubits y tiene distancia LL, es un código estabilizador [[2L2,2,L]][[2L^2,2,L]].

Corrección de errores

Hemos discutido la detección de errores para el código tórico y ahora nos dirigimos brevemente a la corrección de errores. El código tórico es un código CSS, por lo que los errores XX y los errores ZZ pueden detectarse y corregirse de forma independiente. Centrándonos en los generadores de estabilizador ZZ, que detectan errores XX, consideremos cómo puede corregirse una cadena de errores XX. (Los errores ZZ se corrigen de forma simétrica.)

Cuando aparece un síndrome diferente de (+1,,+1)(+1,\ldots,+1) al medir los generadores de estabilizador ZZ, los resultados 1-1 muestran los extremos de una o más cadenas de errores XX. Podemos intentar corregir estos errores emparejando los resultados 1-1 de dos en dos y formando una cadena de correcciones XX entre ellos. Al hacerlo, es sensato elegir caminos más cortos para las correcciones.

Consideremos, por ejemplo, el siguiente diagrama, que muestra un síndrome con dos resultados 1-1 (indicados por casillas grises), causados por una cadena de errores XX representada por la línea y los círculos magenta. Como ya se señaló, la cadena en sí no es revelada por el síndrome; solo los extremos son visibles.

Corrección de errores X con un camino más corto

Para corregir esta cadena de errores, se selecciona un camino más corto entre los resultados de medición 1-1 y se aplican puertas XX como correcciones a los qubits a lo largo de este camino (marcados en amarillo en la figura). Aunque las correcciones pueden no coincidir con la cadena de errores real, los errores y las correcciones juntos forman un bucle cerrado de operaciones XX que está contenido en el estabilizador del código. La corrección es, por tanto, exitosa en esta situación, ya que el efecto combinado de errores y correcciones no cambia nada en el estado codificado.

Esta estrategia no siempre será exitosa. Otra explicación para el mismo síndrome que en la figura anterior se muestra en la siguiente figura.

Completando un error lógico con correcciones

Esta vez, la misma cadena de correcciones que antes falla, porque el efecto combinado de errores y correcciones resulta en un bucle cerrado de operaciones XX que rodea el toro y por tanto tiene un efecto no trivial sobre el espacio de código. Así que no hay garantía de que la estrategia descrita — elegir un camino más corto de correcciones XX entre dos resultados de síndrome 1-1 — corrija adecuadamente el error que causó ese síndrome.

Sin embargo, es más probable, dependiendo del modelo de ruido, que se mida un síndrome con más de dos entradas 1-1, como sugiere la siguiente figura.

Múltiples cadenas de corrección

En tal caso, se conocen diversas estrategias de corrección. Una estrategia natural es emparejar los resultados de medición 1-1 de dos en dos y realizar correcciones a lo largo de los caminos más cortos entre los pares, como se muestra en amarillo en la figura. En particular, se puede calcular un emparejamiento perfecto de peso mínimo entre los resultados de medición 1-1, y luego se conectan los pares mediante caminos más cortos de correcciones XX. El cálculo de un emparejamiento perfecto de peso mínimo puede realizarse de forma eficiente con un algoritmo clásico, el algoritmo Blossom, descubierto por Edmonds en la década de 1960.

Este enfoque no es óptimo en general para los modelos de ruido más estudiados, pero basándose en simulaciones numéricas funciona muy bien en la práctica para tasas de error de hasta aproximadamente el 10%, bajo la suposición de errores de Pauli independientes donde X,X, YY y ZZ son igualmente probables. Aumentar LL no influye significativamente en el punto de equilibrio a partir del cual el código comienza a ayudar, pero conduce a una disminución más rápida de la probabilidad de un error lógico cuando la tasa de error cae por debajo del punto de equilibrio.