Saltar al contenido
El bit perdido
Newsletter

Lección 9 de 13

Códigos CSS: un código cuántico hecho con dos clásicos

Cómo dos códigos binarios con C2⊥ ⊆ C1 dan un código cuántico: estabilizadores, estados lógicos como clases laterales, síndromes clásicos y distancia.

Al terminar sabrás:

  • Construir los estabilizadores de un código CSS a partir de H1 y H2
  • Escribir los estados lógicos como sumas sobre clases laterales de C1/C2⊥
  • Calcular k = dim C1 − dim C2⊥ y acotar la distancia
  • Leer los errores X y Z con los síndromes clásicos de C1 y C2

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 cerramos el marco general: un código estabilizador, sus operadores lógicos, su distancia y sus estados lógicos. Ya sabemos qué es un buen código cuántico, pero todavía no sabemos fabricarlos. Shor encontró el suyo casi a mano. En 1996, Calderbank y Shor, y también Steane, dieron una receta que convierte códigos clásicos en códigos cuánticos. Es el puente que estaba anunciado desde la lección 1: lo que sabes del curso de códigos sirve aquí casi tal cual. La pregunta de hoy: ¿cómo se hace un código cuántico con dos clásicos?

La idea

Mira otra vez los estabilizadores del código de Shor: Z1Z2,…,Z8Z9Z_1Z_2,\dots,Z_8Z_9 por un lado y X1⋯X6X_1\cdots X_6, X4⋯X9X_4\cdots X_9 por otro. Ninguno mezcla XX y ZZ. Los de tipo ZZ vigilan los errores XX; los de tipo XX vigilan los errores ZZ. Son dos detectores independientes.

Un detector de errores de bit ya lo conoces: es una matriz de paridad clásica. Un Z(h)Z(h) ve un error X(e)X(e) exactamente cuando h⋅e=1h\cdot e=1, que es lo que calcula una fila de HH en el síndrome HeTHe^T. Así que la idea es usar un código clásico para los errores XX y otro para los errores ZZ. La única condición es que los dos detectores conmuten.

La construcción

Toma dos códigos binarios lineales de longitud nn:

  • C1C_1, con matriz de paridad H1H_1, que se encargará de los errores XX;
  • C2C_2, con matriz de paridad H2H_2, que se encargará de los errores ZZ;

con la condición

C2⊥⊆C1.C_2^\perp\subseteq C_1.

Recuerda de matriz generatriz y matriz de paridad que las filas de H2H_2 generan el dual C2⊥C_2^\perp y las de H1H_1 generan C1⊥C_1^\perp. El código CSS (por Calderbank, Shor y Steane) tiene estos estabilizadores:

  • de tipo ZZ: Z(h)Z(h) para cada fila hh de H1H_1 (así h∈C1⊥h\in C_1^\perp);
  • de tipo XX: X(g)X(g) para cada fila gg de H2H_2 (así g∈C2⊥g\in C_2^\perp).

Por qué conmutan. Sus vectores son (0∣h)(0\mid h) y (g∣0)(g\mid 0), con producto simpléctico h⋅gh\cdot g. Como g∈C2⊥⊆C1g\in C_2^\perp\subseteq C_1 y h∈C1⊥h\in C_1^\perp, es h⋅g=0h\cdot g=0. Los de un mismo tipo conmutan siempre. Eso es todo: la condición C2⊥⊆C1C_2^\perp\subseteq C_1 es justo la que hace falta.

Cuántos cúbits lógicos. Si H1H_1 y H2H_2 tienen rango completo, hay (n−dim⁡C1)+dim⁡C2⊥(n-\dim C_1)+\dim C_2^\perp generadores, y k=n−rk=n-r da

k=dim⁡C1−dim⁡C2⊥.k=\dim C_1-\dim C_2^\perp.
Repaso Provisional: el código de Hamming [7,4,3]

Es el ejemplo clásico que usaremos en la lección 10. Su matriz de paridad «de manual» tiene como columna ii el número ii escrito en binario:

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 24=162^4=16 palabras son las soluciones de HcT=0Hc^T=0:

00000000000000, 11100001110000, 10011001001100, 01111000111100, 01010100101010, 10110101011010, 11001101100110, 00101100010110, 11010011101001, 00110010011001, 01001010100101, 10101011010101, 10000111000011, 01100110110011, 00011110001111, 11111111111111.

Hay una de peso 0, siete de peso 3, siete de peso 4 y una de peso 7: la distancia mínima es d=3d=3 y corrige un error. Lo mejor: si el error está en la posición ii, el síndrome HrTHr^T es la columna ii, es decir, ii escrito en binario. Por ejemplo, 10110101011010 con un error en la posición 6 llega como 10110001011000, y HrT=(1,1,0)THr^T=(1,1,0)^T, que es el 6. Esta misma matriz sale de ejemplo en matriz generatriz y matriz de paridad, y la familia entera, en su sección «Códigos de Hamming».

Los estados lógicos son clases laterales

Para cada x∈C1x\in C_1 definimos

∣x+C2⊥⟩=1∣C2⊥∣∑y∈C2⊥∣x+y⟩.\ket{x+C_2^\perp}=\frac{1}{\sqrt{|C_2^\perp|}}\sum_{y\in C_2^\perp}\ket{x+y}.

Es la suma, con el mismo peso, de todas las palabras de la clase lateral x+C2⊥x+C_2^\perp (la noción de decodificación por síndrome). Tres cosas, cada una con su razón de una línea:

  1. Solo depende de la clase. Si x′=x+y0x'=x+y_0 con y0∈C2⊥y_0\in C_2^\perp, al recorrer yy se recorren las mismas palabras.
  2. Está en el código. X(g)X(g) con g∈C2⊥g\in C_2^\perp cambia ∣x+y⟩\ket{x+y} por ∣x+y+g⟩\ket{x+y+g}: solo reordena la suma. Y Z(h)∣x+y⟩=(−1)h⋅(x+y)∣x+y⟩Z(h)\ket{x+y}=(-1)^{h\cdot(x+y)}\ket{x+y} con x+y∈C1x+y\in C_1 y h∈C1⊥h\in C_1^\perp: el signo es +1+1.
  3. Clases distintas dan estados ortogonales, porque no comparten ninguna palabra.

Hay ∣C1∣/∣C2⊥∣=2dim⁡C1−dim⁡C2⊥=2k|C_1|/|C_2^\perp|=2^{\dim C_1-\dim C_2^\perp}=2^k clases: tantas como estados de una base del código. Cada clase es un estado lógico.

Codificar es elegir la clase. En el curso clásico, el mensaje mm elige la palabra c=mGc=mG; en un cíclico, c(x)=m(x)g(x)c(x)=m(x)g(x) o su versión sistemática (codificación de códigos cíclicos). Aquí el mensaje j=(j1,…,jk)j=(j_1,\dots,j_k) elige un representante xj=j1u1+⋯+jkukx_j=j_1u_1+\dots+j_ku_k, con u1,…,uk∈C1u_1,\dots,u_k\in C_1 que completan una base de C2⊥C_2^\perp hasta una de C1C_1, y el estado es la clase entera: ∣jL⟩=∣xj+C2⊥⟩\ket{j_L}=\ket{x_j+C_2^\perp}.

Operadores lógicos. X(ui)X(u_i) suma uiu_i a todas las palabras: lleva la clase de xjx_j a la de xj+uix_j+u_i, así que cambia el bit lógico jij_i. Es un Xˉi\bar X_i. Para Zˉi\bar Z_i se toma Z(z)Z(z) con z∈C2z\in C_2, de modo que z⋅y=0z\cdot y=0 para todo y∈C2⊥y\in C_2^\perp y la fase (−1)z⋅(x+y)=(−1)z⋅x(-1)^{z\cdot(x+y)}=(-1)^{z\cdot x} es la misma en toda la clase; se elige zz con z⋅ui=1z\cdot u_i=1 y z⋅ul=0z\cdot u_l=0 para l≠il\neq i (existe siempre, porque los ulu_l junto con una base de C2⊥C_2^\perp son linealmente independientes, así que esas ecuaciones en zz son compatibles).

Errores y síndromes: dos problemas clásicos

Un error de Pauli es, salvo fase, X(e)Z(f)X(e)Z(f). Midiendo Z(h)Z(h) para cada fila hh de H1H_1 sale el valor propio (−1)h⋅e(-1)^{h\cdot e}: los bits son

H1eT,H_1e^T,

el síndrome clásico de ee en C1C_1. La parte Z(f)Z(f) no influye, porque conmuta con Z(h)Z(h). Del mismo modo, los X(g)X(g) con gg fila de H2H_2 dan

H2fT,H_2f^T,

el síndrome clásico de ff en C2C_2. Así que corregir un código CSS es resolver dos problemas de decodificación por síndrome por separado: uno con C1C_1 para la parte XX y otro con C2C_2 para la parte ZZ. Un Y=iXZY=iXZ aparece en los dos.

Distancia. Un X(e)X(e) que pasa sin ser visto tiene e∈C1e\in C_1, y es un operador lógico si además e∉C2⊥e\notin C_2^\perp; su peso es al menos d(C1)d(C_1). Igual con Z(f)Z(f), f∈C2∖C1⊥f\in C_2\setminus C_1^\perp, de peso al menos d(C2)d(C_2). Por eso

d≥min⁡(d(C1), d(C2)).d\ge\min\big(d(C_1),\,d(C_2)\big).

Un lógico mixto X(e)Z(f)X(e)Z(f) pesa al menos lo que X(e)X(e) y lo que Z(f)Z(f), así que la distancia exacta es

d=min⁡(min⁡{wt(e):e∈C1∖C2⊥}, min⁡{wt(f):f∈C2∖C1⊥}).d=\min\big(\min\{\mathrm{wt}(e): e\in C_1\setminus C_2^\perp\},\ \min\{\mathrm{wt}(f): f\in C_2\setminus C_1^\perp\}\big).

La cota se queda corta solo si todas las palabras de C1C_1 y de C2C_2 con ese peso mínimo son estabilizadores (degeneración); basta con que una no lo sea para que la cota sea exacta. Lo verás en el ejercicio 2.

Ejemplo resuelto

Toma C1=C2=CC_1=C_2=C, el código de paridad [4,3,2][4,3,2] (las 8 palabras de peso par), con H1=H2=(1 1 1 1)H_1=H_2=(1\ 1\ 1\ 1).

Paso 1: la condición. C⊥={0000,1111}C^\perp=\{0000,1111\}, y 11111111 tiene peso par: C2⊥⊆C1C_2^\perp\subseteq C_1.

Paso 2: estabilizadores. Z1Z2Z3Z4Z_1Z_2Z_3Z_4 y X1X2X3X4X_1X_2X_3X_4. Conmutan porque 1111⋅1111=4≡0(mod2)1111\cdot1111=4\equiv0\pmod2.

Paso 3: kk. k=dim⁡C1−dim⁡C2⊥=3−1=2k=\dim C_1-\dim C_2^\perp=3-1=2. Codifica dos cúbits en cuatro.

Paso 4: clases y estados. Tomamos u1=1100u_1=1100 y u2=1010u_2=1010, y xj=j1u1+j2u2x_j=j_1u_1+j_2u_2. Las cuatro clases dan:

∣00L⟩=12(∣0000⟩+∣1111⟩),∣01L⟩=12(∣1010⟩+∣0101⟩),∣10L⟩=12(∣1100⟩+∣0011⟩),∣11L⟩=12(∣0110⟩+∣1001⟩).\begin{aligned} \ket{00_L}&=\tfrac{1}{\sqrt2}(\ket{0000}+\ket{1111}), & \ket{01_L}&=\tfrac{1}{\sqrt2}(\ket{1010}+\ket{0101}),\\ \ket{10_L}&=\tfrac{1}{\sqrt2}(\ket{1100}+\ket{0011}), & \ket{11_L}&=\tfrac{1}{\sqrt2}(\ket{0110}+\ket{1001}). \end{aligned}

Entre las cuatro aparecen las 8 palabras de CC, cada una exactamente una vez, así que los cuatro estados son ortonormales. Compruébalo en uno: X1X2X3X4X_1X_2X_3X_4 cambia ∣1010⟩\ket{1010} por ∣0101⟩\ket{0101} y al revés, así que deja fijo ∣01L⟩\ket{01_L}; y Z1Z2Z3Z4Z_1Z_2Z_3Z_4 da signo (−1)2=+1(-1)^2=+1 a los dos términos.

Paso 5: operadores lógicos. Xˉ1=X(1100)=X1X2\bar X_1=X(1100)=X_1X_2 y Xˉ2=X(1010)=X1X3\bar X_2=X(1010)=X_1X_3. Para los Zˉ\bar Z buscamos palabras de peso par: z=0101z=0101 cumple z⋅u1=1z\cdot u_1=1, z⋅u2=0z\cdot u_2=0, y z=0011z=0011 cumple lo contrario. Así Zˉ1=Z2Z4\bar Z_1=Z_2Z_4 y Zˉ2=Z3Z4\bar Z_2=Z_3Z_4. Por ejemplo, Zˉ1∣10L⟩=−∣10L⟩\bar Z_1\ket{10_L}=-\ket{10_L}, porque 11001100 y 00110011 tienen, cada una, un solo 1 en las posiciones 2 y 4.

Paso 6: síndromes. En el orden (Z1Z2Z3Z4, X1X2X3X4)(Z_1Z_2Z_3Z_4,\ X_1X_2X_3X_4):

  • X3X_3 sobre ∣01L⟩\ket{01_L} da 12(∣1000⟩+∣0111⟩)\tfrac{1}{\sqrt2}(\ket{1000}+\ket{0111}): pesos impares, síndrome (1,0)(1,0). Es el síndrome clásico H1eT=1H_1e^T=1.
  • Z1Z_1 sobre ∣01L⟩\ket{01_L} da 12(−∣1010⟩+∣0101⟩)\tfrac{1}{\sqrt2}(-\ket{1010}+\ket{0101}), que X1X2X3X4X_1X_2X_3X_4 cambia de signo: síndrome (0,1)(0,1).
  • Y4Y_4 da (1,1)(1,1).

Pero X1X_1, X2X_2, X3X_3 y X4X_4 dan todos (1,0)(1,0): el código detecta cualquier error en un cúbit, pero no sabe dónde está. Y X1X2=Xˉ1X_1X_2=\bar X_1 tiene peso 2 y conmuta con todo, así que d=2d=2: es un [[4,2,2]][[4,2,2]], y la cota d≥min⁡(2,2)d\ge\min(2,2) es exacta.

Ejercicios

Ejercicio 1

El código de repetición de bit de la lección 3 tiene estabilizadores Z1Z2Z_1Z_2 y Z2Z3Z_2Z_3. Escríbelo como CSS: ¿quiénes son C1C_1, C2C_2 y C2⊥C_2^\perp? Calcula kk, los estados lógicos y la cota de la distancia.

Ver la solución

No hay estabilizadores de tipo XX, así que H2H_2 no tiene filas: C2⊥={000}C_2^\perp=\{000\} y C2=F23C_2=\mathbb{F}_2^3. Las filas de H1H_1 son 110110 y 011011, luego C1={000,111}C_1=\{000,111\}, el código de repetición [3,1,3][3,1,3]. La condición se cumple porque 000∈C1000\in C_1.

k=1−0=1k=1-0=1. Cada clase tiene una sola palabra: ∣0L⟩=∣000⟩\ket{0_L}=\ket{000} y ∣1L⟩=∣111⟩\ket{1_L}=\ket{111}. La cota es d≥min⁡(3,1)=1d\ge\min(3,1)=1, y d=1d=1: Zˉ=Z1\bar Z=Z_1 tiene peso 1. Corrige un XX (el síndrome H1eTH_1e^T de la repetición: X1→(1,0)X_1\to(1,0), X2→(1,1)X_2\to(1,1), X3→(0,1)X_3\to(0,1)) y ningún ZZ, porque C2C_2 no corrige nada.

Ejercicio 2

El código de Shor también es CSS. (a) Halla C1C_1 y C2⊥C_2^\perp a partir de sus 8 estabilizadores, comprueba C2⊥⊆C1C_2^\perp\subseteq C_1 y calcula kk. (b) Compara min⁡(d(C1),d(C2))\min(d(C_1),d(C_2)) con su distancia d=3d=3. (c) Escribe ∣000000000+C2⊥⟩\ket{000000000+C_2^\perp} y relaciónalo con los ∣0L⟩\ket{0_L}, ∣1L⟩\ket{1_L} de la lección 4.

Ver la solución

(a) Las filas de H1H_1 son los vectores de Z1Z2,…,Z8Z9Z_1Z_2,\dots,Z_8Z_9. Una palabra cumple esas seis ecuaciones si es constante en cada bloque: C1={aaa bbb ccc}C_1=\{aaa\,bbb\,ccc\}, un [9,3,3][9,3,3]. Las filas de H2H_2 son 111111000111111000 y 000111111000111111, constantes por bloques: C2⊥⊆C1C_2^\perp\subseteq C_1, con dim⁡C2⊥=2\dim C_2^\perp=2. Así k=3−2=1k=3-2=1.

(b) d(C1)=3d(C_1)=3. C2C_2 son las palabras ortogonales a 111111000111111000 y 000111111000111111: las paridades de los tres bloques son iguales. Contiene 110000000110000000, así que d(C2)=2d(C_2)=2 y la cota da solo d≥2d\ge2. Pero Z1Z2Z_1Z_2 es un estabilizador: no estropea nada. El código es degenerado y su distancia real es 3. Con la fórmula exacta: en C2C_2 no hay palabras de peso 1, y las de peso 2 tienen sus dos unos en un mismo bloque (si no, las paridades de los bloques no serían iguales), así que están en C1⊥C_1^\perp (peso par en cada bloque); así que los lógicos de tipo ZZ pesan al menos 3, y los de tipo XX también, porque d(C1)=3d(C_1)=3. Es el argumento corto que anunciaba la lección 8.

(c) La clase de 000000000000000000 da

∣000000000+C2⊥⟩=12(∣000000000⟩+∣111111000⟩+∣000111111⟩+∣111000111⟩).\ket{000000000+C_2^\perp}=\tfrac12\big(\ket{000000000}+\ket{111111000}+\ket{000111111}+\ket{111000111}\big).

Desarrollando (∣000⟩±∣111⟩)⊗3(\ket{000}\pm\ket{111})^{\otimes3} se ve que es (∣0L⟩+∣1L⟩)/2(\ket{0_L}+\ket{1_L})/\sqrt2 con los estados de Shor, y la otra clase, la de 111000000111000000, es (∣0L⟩−∣1L⟩)/2(\ket{0_L}-\ket{1_L})/\sqrt2. La base CSS es la base «girada» de Shor: por eso allí Xˉ\bar X y Zˉ\bar Z salían «cruzados».

Ejercicio 3

Toma C1=C2={000,111}C_1=C_2=\{000,111\}, con H1=H2H_1=H_2 de filas 110110 y 011011. ¿Se cumple la condición? Comprueba que Z1Z2Z_1Z_2 y X2X3X_2X_3 no conmutan. ¿Qué daría la fórmula de kk?

Ver la solución

C2⊥C_2^\perp está generado por 110110 y 011011: {000,110,011,101}\{000,110,011,101\}, que no cabe en C1={000,111}C_1=\{000,111\}. Falla la condición.

Z1Z2↔(000∣110)Z_1Z_2\leftrightarrow(000\mid110) y X2X3↔(011∣000)X_2X_3\leftrightarrow(011\mid000) tienen producto simpléctico 110⋅011=1110\cdot011=1: anticonmutan (solo se solapan en el cúbit 2). No generan un grupo estabilizador. La fórmula daría k=1−2=−1k=1-2=-1, un sinsentido que avisa de lo mismo.

En resumen

  • Un código CSS sale de dos códigos binarios con C2⊥⊆C1C_2^\perp\subseteq C_1: estabilizadores Z(h)Z(h) con hh fila de H1H_1 y X(g)X(g) con gg fila de H2H_2. Conmutan justo por esa condición.
  • Los estados lógicos son clases laterales: ∣x+C2⊥⟩=1∣C2⊥∣∑y∈C2⊥∣x+y⟩\ket{x+C_2^\perp}=\frac{1}{\sqrt{|C_2^\perp|}}\sum_{y\in C_2^\perp}\ket{x+y}, uno por clase de C1/C2⊥C_1/C_2^\perp, y k=dim⁡C1−dim⁡C2⊥k=\dim C_1-\dim C_2^\perp.
  • Los errores XX dan el síndrome clásico de C1C_1 y los ZZ el de C2C_2: corregir es decodificar dos códigos clásicos.
  • d≥min⁡(d(C1),d(C2))d\ge\min(d(C_1),d(C_2)); la distancia solo es mayor si hay degeneración, como en Shor.
  • Con C1=C2=C_1=C_2= Hamming [7,4,3][7,4,3], cuyo dual está dentro, sale el código de Steane: es la próxima lección.

Siguiente lección: El código de Steane

Para profundizar