Saltar al contenido
El bit perdido
Newsletter

Lección 10 de 13

El código de Steane: siete cúbits y el truco de Hamming

El código CSS [[7,1,3]] hecho con el Hamming [7,4,3]: sus estados lógicos escritos enteros, sus seis generadores y un síndrome que lee en binario dónde está el error.

Al terminar sabrás:

  • Escribir los estados lógicos del código de Steane como suma de las palabras de Hamming de peso par e impar
  • Listar los seis generadores y comprobar que fijan los estados lógicos
  • Leer en el síndrome la posición de un error X o Z, y la de un Y en las dos mitades
  • Comparar Steane con Shor: 7 cúbits frente a 9 y sin degeneración en los errores de peso 1

Si sabes multiplicar matrices, operar con números complejos y calcular un síndrome con una matriz de paridad (lo tienes en el curso de códigos correctores), puedes seguirlo. La física imprescindible (estado, medida, producto tensorial) se explica desde cero.

En la lección anterior construimos códigos cuánticos a partir de dos códigos clásicos C1C_1 y C2C_2 con C2⊥⊆C1C_2^\perp\subseteq C_1. Falta ver esa receta funcionando con un código de verdad. Hoy usamos el mejor candidato: el Hamming [7,4,3][7,4,3] en los dos lugares. Sale un código de 7 cúbits que protege 1 cúbit y corrige cualquier error en uno de ellos, como el de Shor pero con dos cúbits menos. Y tiene una gracia que Shor no tiene: el síndrome dice en binario qué cúbit falla.

En el relato del curso, es el segundo código que responde a los tres obstáculos del principio, y el primero hecho con un código clásico concreto. Steane dio sus dos palabras ya en su artículo de Phys. Rev. Lett. 77, 793 (recibido en octubre de 1995, publicado en julio de 1996) y describió la codificación y la corrección en Proc. R. Soc. A 452, 2551 (1996); el artículo de Phys. Rev. A 54, 4741 (1996) lo generaliza a más códigos.

La idea

Tomamos C1=C2=C_1=C_2= Hamming [7,4,3][7,4,3], con la matriz de paridad «de manual» del curso de códigos (columna ii = ii en binario). Para el recuadro de repaso sobre Hamming, mira la lección 9.

H=(000111101100111010101).H=\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\end{pmatrix}.

Sus filas h1,h2,h3h_1,h_2,h_3 generan el dual del Hamming, el código símplex [7,3,4][7,3,4]. Cumple C⊥⊆CC^\perp\subseteq C: cada fila es palabra de Hamming (pesa 4 y cada dos filas coinciden en 2 posiciones, así que HhT=0Hh^T=0). Por tanto la construcción CSS vale con C1=C2=CC_1=C_2=C. Los parámetros:

k=dim⁡C1−dim⁡C2⊥=4−3=1,n=7.k=\dim C_1-\dim C_2^\perp=4-3=1,\qquad n=7.

Un solo cúbit lógico, con n−k=6n-k=6 generadores: dos por cada fila de HH, uno de tipo ZZ y otro de tipo XX.

Los seis generadores

Generador de tipo ZZ o de tipo XX de una fila hh: el Pauli Z(h)Z(h) (o X(h)X(h)), que actúa con ZZ (o con XX) en las posiciones donde hh tiene un 1. En orden, tipo ZZ primero, como en Shor y en la lección 9:

g1=Z4Z5Z6Z7,g4=X4X5X6X7,g2=Z2Z3Z6Z7,g5=X2X3X6X7,g3=Z1Z3Z5Z7,g6=X1X3X5X7.\begin{aligned} g_1&=Z_4Z_5Z_6Z_7, & g_4&=X_4X_5X_6X_7,\\ g_2&=Z_2Z_3Z_6Z_7, & g_5&=X_2X_3X_6X_7,\\ g_3&=Z_1Z_3Z_5Z_7, & g_6&=X_1X_3X_5X_7. \end{aligned}

Conmutan todos entre sí. Dos del mismo tipo conmutan siempre. Uno de tipo ZZ con otro de tipo XX también conmutan, porque comparten un número par de posiciones (las filas de HH son ortogonales entre sí, y cada una consigo misma por pesar 4). En la matriz (A∣B)(A\mid B) de la lección 7:

(A∣B)=(0HH0),(A\mid B)=\left(\begin{array}{c|c}0&H\\H&0\end{array}\right),

con HH de 3×73\times7 y 00 de 3×73\times7: seis filas y 14 columnas.

Los estados lógicos, enteros

Las palabras de Hamming son 16: 8 de peso par (el símplex, con la palabra 00000000000000 y siete de peso 4) y 8 de peso impar (cada una de las anteriores sumada con 11111111111111: siete de peso 3 y la propia 11111111111111). Los estados lógicos de la lección 9 son ∣x+C2⊥⟩\ket{x+C_2^\perp} con xx en C1C_1. Aquí hay dos clases, la de 00000000000000 y la de 11111111111111:

∣0L⟩=18(∣0000000⟩+∣0001111⟩+∣0110011⟩+∣0111100⟩+∣1010101⟩+∣1011010⟩+∣1100110⟩+∣1101001⟩),\begin{aligned} \ket{0_L}=\tfrac{1}{\sqrt8}\big(&\ket{0000000}+\ket{0001111}+\ket{0110011}+\ket{0111100}\\ +&\ket{1010101}+\ket{1011010}+\ket{1100110}+\ket{1101001}\big), \end{aligned} ∣1L⟩=18(∣0010110⟩+∣0011001⟩+∣0100101⟩+∣0101010⟩+∣1000011⟩+∣1001100⟩+∣1110000⟩+∣1111111⟩).\begin{aligned} \ket{1_L}=\tfrac{1}{\sqrt8}\big(&\ket{0010110}+\ket{0011001}+\ket{0100101}+\ket{0101010}\\ +&\ket{1000011}+\ket{1001100}+\ket{1110000}+\ket{1111111}\big). \end{aligned}

Son ortogonales (no comparten ningún ket de la base) y de norma 1 (ocho términos, cada uno con amplitud 1/81/\sqrt8). Y los seis generadores los fijan:

  • Tipo ZZ. Z(hj)∣x⟩=(−1)hj⋅x∣x⟩Z(h_j)\ket{x}=(-1)^{h_j\cdot x}\ket{x}, y hj⋅x=0h_j\cdot x=0 para toda palabra xx de Hamming (las filas de HH son ortogonales al código). Cada ket queda con signo +1+1.
  • Tipo XX. X(hj)X(h_j) lleva ∣x⟩\ket{x} a ∣x+hj⟩\ket{x+h_j}. Como hjh_j es una de las 8 palabras pares (el símplex, que se cierra por sumas), sumar hjh_j permuta esas 8 palabras entre sí, y las 8 impares entre sí. La suma no cambia.

Los operadores lógicos

Sumar 11111111111111 lleva las palabras pares a las impares y las impares a las pares. Por tanto

Xˉ=X⊗7=X1X2⋯X7,Xˉ∣0L⟩=∣1L⟩,Xˉ∣1L⟩=∣0L⟩.\bar X=X^{\otimes7}=X_1X_2\cdots X_7,\qquad \bar X\ket{0_L}=\ket{1_L},\quad \bar X\ket{1_L}=\ket{0_L}.

Para Zˉ=Z⊗7\bar Z=Z^{\otimes7}, el signo de ∣x⟩\ket{x} es (−1)wt(x)(-1)^{\mathrm{wt}(x)}: +1+1 en las pares y −1-1 en las impares. Así Zˉ∣0L⟩=∣0L⟩\bar Z\ket{0_L}=\ket{0_L} y Zˉ∣1L⟩=−∣1L⟩\bar Z\ket{1_L}=-\ket{1_L}. A diferencia de Shor, aquí no están «cruzados»: XX con XX y ZZ con ZZ.

Se pueden rebajar a peso 3 multiplicando por estabilizadores. Xˉ′=X1X2X3\bar X'=X_1X_2X_3 sirve, porque Xˉ′g4=X⊗7\bar X'g_4=X^{\otimes7} (el producto X1X2X3⋅X4X5X6X7X_1X_2X_3\cdot X_4X_5X_6X_7). Y Zˉ′=Z1Z2Z3\bar Z'=Z_1Z_2Z_3 sirve, porque Zˉ′g1=Z⊗7\bar Z'g_1=Z^{\otimes7}. No hay ninguno de peso menor, porque la cota de la lección 9 da d≥min⁡(3,3)=3d\ge\min(3,3)=3. Así que d=3d=3.

El síndrome lee la posición en binario

Un error XiX_i anticonmuta con el generador Z(hj)Z(h_j) exactamente cuando hjh_j tiene un 1 en la posición ii. Es decir, los tres generadores de tipo ZZ dan −1-1 justo en las filas de HH donde la columna ii tiene un 1: el síndrome es la columna ii de HH, que es ii en binario. Es el mismo truco de la decodificación por síndrome, pero ahora con valores propios ±1\pm1.

Del mismo modo, ZiZ_i anticonmuta con los generadores de tipo XX cuya fila tiene un 1 en ii: la mitad de tipo XX del síndrome lee también ii en binario. Escribimos el síndrome como (s1s2s3∣s4s5s6)(s_1s_2s_3\mid s_4s_5s_6), un bit por generador en el orden de arriba (00 si sale +1+1, 11 si sale −1-1):

errorsíndrome (tipo ZZ ∣\mid tipo XX)lee
XiX_i(i∣000)(i\mid 000)ii en binario, en la mitad de tipo ZZ
ZiZ_i(000∣i)(000\mid i)ii en binario, en la mitad de tipo XX
YiY_i(i∣i)(i\mid i)ii en las dos mitades

Los 21 errores de peso 1 (Xi,Zi,YiX_i,Z_i,Y_i para i=1,…,7i=1,\dots,7) tienen 21 síndromes distintos y no nulos. Es decir, el código no es degenerado para peso 1: cada error tiene su propio síndrome y no hay dos que se confundan. De los 64 síndromes posibles, 22 están ocupados (uno por «sin error» y 21 por los errores de peso 1); los otros 42 quedan para errores de peso mayor.

Compara con Shor (lección 4 y lección 5): allí 27 errores compartían 21 síndromes, porque Z1Z_1, Z2Z_2 y Z3Z_3 dejaban la misma huella y daba igual cuál corregir. Shor es degenerado; Steane, para peso 1, no. Y gasta 7 cúbits en lugar de 9.

Como un error general es combinación de I,X,Y,ZI,X,Y,Z y medir el síndrome elige uno, la discusión de la lección 5 vale tal cual: Steane corrige cualquier error en un cúbit.

Ejemplo resuelto

Codificamos ∣ψ⟩=α∣0L⟩+β∣1L⟩\ket\psi=\alpha\ket{0_L}+\beta\ket{1_L} y se produce el error X6X_6.

Qué le hace al estado. X6X_6 cambia el bit 6 de cada palabra. A ∣0L⟩\ket{0_L} le da

18(∣0000010⟩+∣0001101⟩+∣0110001⟩+∣0111110⟩+∣1010111⟩+∣1011000⟩+∣1100100⟩+∣1101011⟩),\tfrac{1}{\sqrt8}\big(\ket{0000010}+\ket{0001101}+\ket{0110001}+\ket{0111110}+\ket{1010111}+\ket{1011000}+\ket{1100100}+\ket{1101011}\big),

y algo análogo a ∣1L⟩\ket{1_L}.

Síndrome. Medimos g1,g2,g3g_1,g_2,g_3, que dan el signo (−1)hj⋅x(-1)^{h_j\cdot x} de cada ket (todos los kets de arriba dan lo mismo, porque difieren por palabras de Hamming). Con el primero, ∣0000010⟩\ket{0000010}:

  • g1g_1: h1=0001111h_1=0001111 tiene un 1 en la posición 6, así que h1⋅x=1h_1\cdot x=1: sale −1-1.
  • g2g_2: h2=0110011h_2=0110011 también: −1-1.
  • g3g_3: h3=1010101h_3=1010101 tiene un 0 en la posición 6: sale +1+1.

Síndrome de tipo ZZ: (1,1,0)(1,1,0), que es 110110, el número 6 en binario. Los de tipo XX dan +1+1 (g4,g5,g6g_4,g_5,g_6 fijan el estado). El síndrome es (110∣000)(110\mid000).

Corregir. Aplicamos X6X_6 y queda α∣0L⟩+β∣1L⟩\alpha\ket{0_L}+\beta\ket{1_L}. Las medidas no dependen de α\alpha ni de β\beta: no hemos aprendido nada del dato.

Un ZZ en otro sitio. Si además hubiera un Z3Z_3 (en otro cúbit), el síndrome de tipo XX sería (011)(011), el 3 en binario, y corregiríamos con Z3Z_3. Las dos mitades no se estorban: Steane arregla un XX en un cúbit y un ZZ en otro a la vez. Por ejemplo, X2Z7X_2Z_7 da (010∣111)(010\mid111): posición 2 por un lado y 7 por otro.

Esto no contradice d=3d=3. La distancia garantiza corregir cualquier error de peso 1, y X2Z7X_2Z_7 pesa 2. Pero Steane es un CSS: corrige la parte XX y la parte ZZ por separado, y cada mitad es un Hamming que arregla un error. Un XX y un ZZ caen en mitades distintas y se corrigen los dos. Dos XX a la vez, en cambio, no se corrigen (ejercicio 2).

Ejercicios

Ejercicio 1

Al medir el código de Steane sale −1-1 en g1g_1 y en g3g_3, y +1+1 en el resto. ¿Qué error ha ocurrido?

Ver la solución

El síndrome es (101∣000)(101\mid000). La mitad de tipo XX es 000000, así que no hay ZZ. La de tipo ZZ es 101101, que es 5 en binario: el error es X5X_5. Se corrige aplicando X5X_5.

Ejercicio 2

Se producen a la vez X1X_1 y X2X_2 (dos errores de tipo XX). ¿Qué síndrome sale, qué corrige el decodificador y qué le pasa al dato?

Ver la solución

Las columnas 1 y 2 de HH son 001001 y 010010 y se suman: 001+010=011001+010=011, el síndrome es (011∣000)(011\mid000). Eso es X3X_3, así que el decodificador aplica X3X_3. En total queda X1X2X3X_1X_2X_3, que es el operador lógico Xˉ′\bar X' de peso 3: ∣0L⟩\ket{0_L} pasa a ∣1L⟩\ket{1_L} y nadie se entera, porque el síndrome del resultado es nulo. Es lo esperable con d=3d=3: dos errores superan lo que el código corrige, igual que en el Hamming clásico (la lección de síndrome mostraba lo mismo con la posición 3).

Ejercicio 3

Comprueba que Z1Z2Z3Z_1Z_2Z_3 actúa como Zˉ\bar Z sobre ∣1L⟩\ket{1_L}: calcula su signo en cada uno de los 8 kets de ∣1L⟩\ket{1_L}.

Ver la solución

Z1Z2Z3∣x⟩=(−1)x1+x2+x3∣x⟩Z_1Z_2Z_3\ket{x}=(-1)^{x_1+x_2+x_3}\ket{x}. Los primeros tres bits de las ocho palabras impares son: 001001, 001001, 010010, 010010, 100100, 100100, 111111 y 111111 (las de 00101100010110, 00110010011001, 01001010100101, 01010100101010, 10000111000011, 10011001001100, 11100001110000 y 11111111111111). Todos tienen un número impar de unos (1, 1, 1, 1, 1, 1, 3, 3), así que el signo es −1-1 en los ocho kets y Z1Z2Z3∣1L⟩=−∣1L⟩Z_1Z_2Z_3\ket{1_L}=-\ket{1_L}. En ∣0L⟩\ket{0_L}, los primeros tres bits tienen siempre un número par de unos (0 o 2), y el signo es +1+1: se comporta como Zˉ\bar Z.

En resumen

  • Steane [[7,1,3]][[7,1,3]] es el CSS con C1=C2=C_1=C_2= Hamming [7,4,3][7,4,3]: ∣0L⟩\ket{0_L} es la suma (con 1/81/\sqrt8) de las 8 palabras de peso par y ∣1L⟩\ket{1_L} la de las 8 de peso impar.
  • Tiene 6 generadores, Z(hj)Z(h_j) y X(hj)X(h_j) con hjh_j las filas de HH, y operadores lógicos Xˉ=X⊗7\bar X=X^{\otimes7} y Zˉ=Z⊗7\bar Z=Z^{\otimes7} (o sus versiones de peso 3).
  • El síndrome lee en binario la posición de un XX (mitad de tipo ZZ) o de un ZZ (mitad de tipo XX); un YY se ve en las dos.
  • Los 21 errores de peso 1 tienen 21 síndromes distintos y no nulos, y d=3d=3. Frente a Shor: 7 cúbits en vez de 9 y sin degeneración en peso 1.

Siguiente lección: Qudits: del cúbit a p niveles

Para profundizar