Saltar al contenido
El bit perdido
Newsletter

Lección 12 de 13

Códigos CSS sobre cuerpos finitos: códigos cuánticos para qudits

La construcción CSS con dos códigos clásicos sobre un cuerpo de p elementos: estabilizadores, estados lógicos, síndromes y un código de 13 cútrits que corrige un error.

Al terminar sabrás:

  • Construir un código CSS de qudits a partir de dos códigos sobre F_p con C2⊥ ⊆ C1
  • Escribir sus estados lógicos como clases laterales y contar k = dim C1 − dim C2⊥
  • Calcular el síndrome de un error X^a Z^b y leer en él la posición y el valor
  • Saber cómo se adapta todo a F_q con q = p^m usando la traza

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 cambiamos el cúbit por un qudit de pp niveles y vimos que el código de 3 cútrits ⟨XXX,ZZZ⟩\langle XXX, ZZZ\rangle funciona justo porque 1+1+1≡0(mod3)1+1+1\equiv 0 \pmod 3. Y en la lección 9 aprendimos a fabricar un código cuántico con dos códigos binarios. Hoy juntamos las dos ideas. El relato iba así: se dudaba de que fuera posible, Shor lo hizo con 9 cúbits y Calderbank, Shor y Steane enseñaron a construir códigos cuánticos con códigos clásicos. Ahora damos el paso que lleva al final del curso: ¿funciona la receta CSS con códigos sobre Fp\mathbb{F}_p? Funciona casi palabra por palabra, y abre la puerta a usar cualquier código lineal del curso de códigos para proteger qudits.

La idea

En la versión binaria había dos códigos. Uno vigilaba los errores XX (los cambios de bit) y el otro los errores ZZ (los cambios de fase). La única condición era que las comprobaciones de los dos tipos conmutaran, y eso se traducía en una inclusión entre códigos: C2⊥⊆C1C_2^\perp\subseteq C_1.

Con qudits pasa lo mismo. Un error XaX^a en un qudit suma aa al símbolo, como un error de valor aa en un código clásico sobre Fp\mathbb{F}_p. Un error ZbZ^b multiplica por una fase que depende del símbolo. Las comprobaciones de tipo ZZ leen los errores XX con la matriz de paridad de C1C_1; las de tipo XX leen los errores ZZ con la de C2C_2. Lo único nuevo son los coeficientes: ahora un error tiene posición y valor, y aparecen algunos signos menos.

Repaso Producto escalar y dual sobre F_p

Para u,v∈Fpnu,v\in\mathbb{F}_p^n, el producto escalar es u⋅v=u1v1+⋯+unvnu\cdot v=u_1v_1+\dots+u_nv_n calculado módulo pp. El dual de un código CC es C⊥={v:v⋅c=0 para toda c∈C}C^\perp=\{v: v\cdot c=0 \text{ para toda } c\in C\} y tiene dimensión n−dim⁡Cn-\dim C. Las filas de una matriz de paridad de CC generan C⊥C^\perp (lección del curso de códigos). Sobre Fp\mathbb{F}_p un vector puede ser ortogonal a sí mismo: (1,1,1)⋅(1,1,1)=3=0(1,1,1)\cdot(1,1,1)=3=0 en F3\mathbb{F}_3.

Los ingredientes

Trabajamos con nn qudits de pp niveles, pp primo, y ω=e2πi/p\omega=e^{2\pi i/p}. Para vectores a,b∈Fpna,b\in\mathbb{F}_p^n:

X(a)∣x⟩=∣x+a⟩,Z(b)∣x⟩=ω b⋅x∣x⟩.X(a)\ket{x}=\ket{x+a},\qquad Z(b)\ket{x}=\omega^{\,b\cdot x}\ket{x}.

Es decir, X(a)=Xa1⊗⋯⊗XanX(a)=X^{a_1}\otimes\cdots\otimes X^{a_n} suma el vector aa y Z(b)=Zb1⊗⋯⊗ZbnZ(b)=Z^{b_1}\otimes\cdots\otimes Z^{b_n} pone la fase ωb⋅x\omega^{b\cdot x}. La regla de conmutación es:

Z(b)X(a)∣x⟩=ω b⋅(x+a)∣x+a⟩=ω b⋅a X(a)Z(b)∣x⟩.Z(b)X(a)\ket{x}=\omega^{\,b\cdot(x+a)}\ket{x+a}=\omega^{\,b\cdot a}\,X(a)Z(b)\ket{x}.

Así que X(a)X(a) y Z(b)Z(b) conmutan si y solo si a⋅b=0a\cdot b=0. Es el producto simpléctico de la lección anterior aplicado a (a∣0)(a\mid 0) y (0∣b)(0\mid b).

La construcción CSS sobre Fp\mathbb{F}_p

Toma dos códigos lineales C1,C2⊆FpnC_1, C_2\subseteq\mathbb{F}_p^n con

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

Sea H1H_1 una matriz de paridad de C1C_1 (sus filas generan C1⊥C_1^\perp) y H2H_2 una de C2C_2 (sus filas generan C2⊥C_2^\perp). Los estabilizadores son:

  • Z(h)Z(h) para cada fila hh de H1H_1: detectan los errores XX;
  • X(g)X(g) para cada fila gg de H2H_2: detectan los errores ZZ.

Dos de tipo ZZ conmutan siempre, y dos de tipo XX también. Un X(g)X(g) y un Z(h)Z(h) conmutan porque g∈C2⊥⊆C1g\in C_2^\perp\subseteq C_1 y h∈C1⊥h\in C_1^\perp, así que g⋅h=0g\cdot h=0. Esa es toda la razón de la condición C2⊥⊆C1C_2^\perp\subseteq C_1.

Hay (n−dim⁡C1)+dim⁡C2⊥(n-\dim C_1)+\dim C_2^\perp generadores, así que el código guarda

k=n−[(n−dim⁡C1)+dim⁡C2⊥]=dim⁡C1−dim⁡C2⊥k=n-\big[(n-\dim C_1)+\dim C_2^\perp\big]=\dim C_1-\dim C_2^\perp

qudits lógicos. Si C1C_1 y C2C_2 tienen parámetros [n,k1]p[n,k_1]_p y [n,k2]p[n,k_2]_p, sale k=k1+k2−nk=k_1+k_2-n.

Estados lógicos: uno por clase lateral

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 de todas las palabras de la clase lateral x+C2⊥x+C_2^\perp, la misma idea de la decodificación por síndrome. Las comprobaciones de la lección 9 valen igual: X(g)X(g) solo reordena la suma; Z(h)Z(h) da la fase ωh⋅(x+y)=ω0=1\omega^{h\cdot(x+y)}=\omega^0=1, porque x+y∈C1x+y\in C_1 y h∈C1⊥h\in C_1^\perp; y el estado depende solo de la clase. Dos clases distintas no comparten ningún ket, así que sus estados son ortogonales.

Hay ∣C1∣/∣C2⊥∣=pdim⁡C1−dim⁡C2⊥=pk|C_1|/|C_2^\perp|=p^{\dim C_1-\dim C_2^\perp}=p^k clases: justo la dimensión del código. Si k=1k=1, se elige xˉ∈C1\bar x\in C_1 fuera de C2⊥C_2^\perp y se llama ∣jL⟩=∣jxˉ+C2⊥⟩\ket{j_L}=\ket{j\bar x+C_2^\perp}. Entonces Xˉ=X(xˉ)\bar X=X(\bar x) cumple Xˉ∣jL⟩=∣j+1L⟩\bar X\ket{j_L}=\ket{j+1_L}. Para Zˉ\bar Z basta un zˉ∈C2\bar z\in C_2 con zˉ⋅xˉ=1\bar z\cdot\bar x=1: como zˉ⋅y=0\bar z\cdot y=0 para todo y∈C2⊥y\in C_2^\perp, se tiene Zˉ∣jL⟩=Z(zˉ)∣jL⟩=ωj∣jL⟩\bar Z\ket{j_L}=Z(\bar z)\ket{j_L}=\omega^{j}\ket{j_L}.

Síndromes y distancia

Un error E=X(a)Z(b)E=X(a)Z(b) tiene vector (a∣b)(a\mid b). Con el producto simpléctico del curso, ⟨(u∣v),(a∣b)⟩s=v⋅a−u⋅b\langle (u\mid v),(a\mid b)\rangle_s=v\cdot a-u\cdot b:

  • el estabilizador Z(h)Z(h), de vector (0∣h)(0\mid h), da s=h⋅as=h\cdot a: es el síndrome clásico H1aTH_1a^T de la parte XX del error;
  • el estabilizador X(g)X(g), de vector (g∣0)(g\mid 0), da s=−g⋅bs=-g\cdot b: es menos el síndrome clásico H2bTH_2b^T de la parte ZZ.

Al medir el generador sale el valor propio ωs\omega^{s}. En binario el signo menos no se nota; sobre F3\mathbb{F}_3 sí.

La distancia es el menor peso de un error indetectable que no sea un estabilizador. Para un código CSS,

d=min⁡{wt(c):c∈(C1∖C2⊥)∪(C2∖C1⊥)},d=\min\{\mathrm{wt}(c): c\in (C_1\setminus C_2^\perp)\cup(C_2\setminus C_1^\perp)\},

y en particular d≥min⁡(d(C1),d(C2))d\ge\min(d(C_1),d(C_2)). Es el lema de la construcción CSS de Ketkar, Klappenecker, Kumar y Sarvepalli (2006), que lo enuncian para cualquier Fq\mathbb{F}_q. Un artículo de referencia sobre códigos estabilizadores no binarios, sobre cualquier Fq\mathbb{F}_q, es el de Ashikhmin y Knill (2001).

El código de 3 cútrits, releído

Toma p=3p=3, C2⊥=⟨111⟩C_2^\perp=\langle 111\rangle y C1=⟨111⟩⊥={x:x1+x2+x3=0}C_1=\langle 111\rangle^\perp=\{x: x_1+x_2+x_3=0\}. Como (1,1,1)⋅(1,1,1)=3=0(1,1,1)\cdot(1,1,1)=3=0, se cumple C2⊥⊆C1C_2^\perp\subseteq C_1. Aquí C2=C1C_2=C_1, y la única fila de H1H_1 y de H2H_2 es (1,1,1)(1,1,1): los estabilizadores son Z(111)=ZZZZ(111)=ZZZ y X(111)=XXXX(111)=XXX. Y k=2−1=1k=2-1=1.

C1C_1 tiene 9 palabras, repartidas en 3 clases de ⟨111⟩\langle 111\rangle. Con xˉ=(0,1,2)\bar x=(0,1,2):

∣0L⟩=13(∣000⟩+∣111⟩+∣222⟩),∣1L⟩=13(∣012⟩+∣120⟩+∣201⟩),∣2L⟩=13(∣021⟩+∣102⟩+∣210⟩).\ket{0_L}=\tfrac{1}{\sqrt3}\big(\ket{000}+\ket{111}+\ket{222}\big),\quad \ket{1_L}=\tfrac{1}{\sqrt3}\big(\ket{012}+\ket{120}+\ket{201}\big),\quad \ket{2_L}=\tfrac{1}{\sqrt3}\big(\ket{021}+\ket{102}+\ket{210}\big).

Son exactamente los de la lección 11. La receta da Xˉ=X(xˉ)=X2X32\bar X=X(\bar x)=X_2X_3^2, pero en la lección 11 usamos X1X22=X(1,2,0)X_1X_2^2=X(1,2,0). Las dos sirven: (1,2,0)=(0,1,2)+(1,1,1)(1,2,0)=(0,1,2)+(1,1,1) está en la misma clase, así que los dos operadores solo difieren en el estabilizador XXXXXX y hacen lo mismo sobre el código, ∣jL⟩↦∣j+1L⟩\ket{j_L}\mapsto\ket{j+1_L}. Nos quedamos con los de la lección 11: Xˉ=X1X22\bar X=X_1X_2^2 y Zˉ=Z(2,1,0)=Z12Z2\bar Z=Z(2,1,0)=Z_1^2Z_2, que vale porque (2,1,0)∈C2(2,1,0)\in C_2 y (2,1,0)⋅(0,1,2)=1(2,1,0)\cdot(0,1,2)=1. La distancia es 2: (1,2,0)(1,2,0) está en C1C_1, no en ⟨111⟩\langle 111\rangle y pesa 2.

Ejemplo resuelto: el Hamming ternario

El código de Steane nacía del Hamming binario. Su primo ternario es el código de Hamming [13,10,3]3[13,10,3]_3: su matriz de paridad tiene como columnas un representante de cada recta de F33\mathbb{F}_3^3 (el primer símbolo no nulo es 1). Hay (27−1)/2=13(27-1)/2=13:

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

Ninguna columna es nula ni múltiplo de otra, así que d≥3d\ge3, y la columna 3 es la suma de la 1 y la 2, así que d=3d=3.

Paso 1: ¿contiene a su dual? Las filas de HH generan C⊥C^\perp, el código símplex [13,3][13,3]. Basta comprobar que las filas son ortogonales entre sí y consigo mismas. Con enteros, los productos son 99, 1818 y 2121 (cada fila consigo misma) y 99, 99 y 1212 (las parejas): todos múltiplos de 3. Así que C⊥⊆CC^\perp\subseteq C. (De hecho, las 26 palabras no nulas de C⊥C^\perp pesan 9.)

Paso 2: el código cuántico. Tomamos C1=C2=CC_1=C_2=C y H1=H2=HH_1=H_2=H. Los seis generadores son Z(h1),Z(h2),Z(h3)Z(h_1),Z(h_2),Z(h_3) y X(h1),X(h2),X(h3)X(h_1),X(h_2),X(h_3), con hih_i las filas de HH. Por ejemplo, Z(h1)=Z5Z6⋯Z13Z(h_1)=Z_5Z_6\cdots Z_{13} y X(h3)=X1X3X42X6X72X9X102X12X132X(h_3)=X_1X_3X_4^2X_6X_7^2X_9X_{10}^2X_{12}X_{13}^2. Queda

k=dim⁡C−dim⁡C⊥=10−3=7.k=\dim C-\dim C^\perp=10-3=7.

Las palabras de C∖C⊥C\setminus C^\perp pesan al menos 3 y hay alguna de peso 3. Por tanto es un [[13,7,3]]3[[13,7,3]]_3: 7 cútrits lógicos en 13 físicos, y corrige cualquier error en un cútrit. Ketkar et al. obtienen así toda una familia a partir de los Hamming que contienen a su dual.

Paso 3: estados lógicos. Hay 37=21873^7=2187 clases, cada una con 27 kets. El de todo ceros es

∣0⋯0L⟩=127∑y∈C⊥∣y⟩,\ket{0\cdots0_L}=\frac{1}{\sqrt{27}}\sum_{y\in C^\perp}\ket{y},

con términos como ∣0000000000000⟩\ket{0000000000000} o ∣0000111111111⟩\ket{0000111111111} (la fila h1h_1). Para el primer cútrit lógico tomamos xˉ=(1,1,2,0,…,0)\bar x=(1,1,2,0,\dots,0), que está en CC porque la columna 1 más la 2 más dos veces la 3 da (0,3,3)=0(0,3,3)=0. Y zˉ=(1,0,0,0,1,2,0,…,0)\bar z=(1,0,0,0,1,2,0,\dots,0), que también está en CC y cumple zˉ⋅xˉ=1\bar z\cdot\bar x=1. Así, Xˉ=X1X2X32\bar X=X_1X_2X_3^2 y Zˉ=Z1Z5Z62\bar Z=Z_1Z_5Z_6^2 son lógicos de peso 3, y ∣jL⟩=∣jxˉ+C⊥⟩\ket{j_L}=\ket{j\bar x+C^\perp} (con los otros seis cútrits lógicos a 0).

Paso 4: un error y su síndrome. Sobre el cútrit 6 actúa E=X2ZE=X^2Z, es decir, a=2e6a=2e_6 y b=e6b=e_6. La columna 6 es (1,0,1)(1,0,1).

  • Generadores de tipo ZZ: s=HaT=2⋅(1,0,1)=(2,0,2)s=H a^T=2\cdot(1,0,1)=(2,0,2).
  • Generadores de tipo XX: s=−HbT=−(1,0,1)=(2,0,2)s=-H b^T=-(1,0,1)=(2,0,2).

Se miden los valores propios ω2,1,ω2\omega^2,1,\omega^2 y otra vez ω2,1,ω2\omega^2,1,\omega^2.

Paso 5: leer el síndrome. Como en el Hamming binario, el síndrome señala la columna, pero ahora además da el valor. En (2,0,2)(2,0,2) el primer símbolo no nulo es 2: el error XX tiene valor a=2a=2 y está en la columna (2,0,2)/2=(1,0,1)(2,0,2)/2=(1,0,1), la 6. En la otra mitad, −b⋅(columna)=(2,0,2)-b\cdot(\text{columna})=(2,0,2) da b=1b=1 y otra vez la columna 6. Se aplica E−1=(X2Z)−1E^{-1}=(X^2Z)^{-1} al cútrit 6 y el estado vuelve a ser el original.

Los 104 errores de peso 1 (1313 posiciones por 88 errores no triviales) dan 104 síndromes no nulos y distintos.

Más allá de los primos: q=pmq=p^m

La lección 13 necesita F8\mathbb{F}_8, así que conviene saber qué cambia cuando q=pmq=p^m. Cada símbolo de Fq\mathbb{F}_q es ahora un qudit de qq niveles, con base ∣x⟩\ket{x} para x∈Fqx\in\mathbb{F}_q, y X(a)∣x⟩=∣x+a⟩X(a)\ket{x}=\ket{x+a} suma en Fq\mathbb{F}_q. Pero ωb⋅x\omega^{b\cdot x} ya no tiene sentido, porque b⋅xb\cdot x es un elemento de Fq\mathbb{F}_q y no un número entre 00 y p−1p-1. La solución es la traza del cuerpo (no la de una matriz) Tr⁡(c)=c+cp+cp2+⋯+cpm−1\operatorname{Tr}(c)=c+c^p+c^{p^2}+\dots+c^{p^{m-1}}, que lleva Fq\mathbb{F}_q a Fp\mathbb{F}_p y respeta la suma. Se define Z(b)∣x⟩=ωTr⁡(b⋅x)∣x⟩Z(b)\ket{x}=\omega^{\operatorname{Tr}(b\cdot x)}\ket{x}, con ω=e2πi/p\omega=e^{2\pi i/p} (en F8\mathbb{F}_8, ω=−1\omega=-1). Es el convenio de Ketkar et al. La condición CSS sigue siendo C2⊥⊆C1C_2^\perp\subseteq C_1 con el producto escalar usual de Fq\mathbb{F}_q: si g⋅h=0g\cdot h=0, entonces Tr⁡(g⋅h)=0\operatorname{Tr}(g\cdot h)=0 y X(g)X(g), Z(h)Z(h) conmutan. Un detalle: los estabilizadores son ahora X(g)X(g) y Z(h)Z(h) para todos los g∈C2⊥g\in C_2^\perp y h∈C1⊥h\in C_1^\perp, no solo para las filas de las matrices de paridad, porque un múltiplo βg\beta g con β∈Fq\beta\in\mathbb{F}_q fuera de Fp\mathbb{F}_p no es una potencia de X(g)X(g). El código sigue teniendo k=dim⁡C1−dim⁡C2⊥k=\dim C_1-\dim C_2^\perp, ahora contando qudits de qq niveles.

Ejercicios

Ejercicio 1

¿Sirve C2⊥=⟨1111⟩C_2^\perp=\langle 1111\rangle, C1=⟨1111⟩⊥C_1=\langle1111\rangle^\perp sobre F3\mathbb{F}_3? ¿Y C2⊥=⟨11111⟩C_2^\perp=\langle 11111\rangle, C1=⟨11111⟩⊥C_1=\langle11111\rangle^\perp sobre F5\mathbb{F}_5? En el caso que funcione, da kk y dd.

Ver la solución

Sobre F3\mathbb{F}_3, (1,1,1,1)⋅(1,1,1,1)=4=1≠0(1,1,1,1)\cdot(1,1,1,1)=4=1\neq0, así que (1,1,1,1)∉C1(1,1,1,1)\notin C_1 y no se cumple C2⊥⊆C1C_2^\perp\subseteq C_1: X(1111)X(1111) y Z(1111)Z(1111) no conmutan.

Sobre F5\mathbb{F}_5, (1,1,1,1,1)⋅(1,1,1,1,1)=5=0(1,1,1,1,1)\cdot(1,1,1,1,1)=5=0: sí funciona. C1={x:x1+⋯+x5=0}C_1=\{x: x_1+\dots+x_5=0\} tiene dimensión 4, así que k=4−1=3k=4-1=3. Ninguna palabra de peso 1 suma cero, pero (1,4,0,0,0)(1,4,0,0,0) sí, y no está en ⟨11111⟩\langle11111\rangle. Como C2=C1C_2=C_1, d=2d=2: es un [[5,3,2]]5[[5,3,2]]_5, el hermano del código de 3 cútrits.

Ejercicio 2

El tetracódigo T⊆F34T\subseteq\mathbb{F}_3^4, de matriz generatriz con filas (1,0,1,1)(1,0,1,1) y (0,1,1,2)(0,1,1,2), cumple T⊥=TT^\perp=T. ¿Qué código cuántico da con C1=C2=TC_1=C_2=T? Escribe su estado.

Ver la solución

Como T⊥=TT^\perp=T, se cumple C2⊥=T⊆T=C1C_2^\perp=T\subseteq T=C_1, pero k=dim⁡T−dim⁡T⊥=2−2=0k=\dim T-\dim T^\perp=2-2=0. No guarda ningún cútrit: es un [[4,0]]3[[4,0]]_3, un único estado fijado por los cuatro generadores X(1011)X(1011), X(0112)X(0112), Z(1011)Z(1011) y Z(0112)Z(0112). Hay una sola clase lateral, la del 0:

13(∣0000⟩+∣1011⟩+∣2022⟩+∣0112⟩+∣0221⟩+∣1120⟩+∣2210⟩+∣1202⟩+∣2101⟩).\tfrac13\big(\ket{0000}+\ket{1011}+\ket{2022}+\ket{0112}+\ket{0221}+\ket{1120}+\ket{2210}+\ket{1202}+\ket{2101}\big).

Por ejemplo, (1,0,1,1)+2(0,1,1,2)=(1,2,3,5)=(1,2,0,2)(1,0,1,1)+2(0,1,1,2)=(1,2,3,5)=(1,2,0,2). Para guardar información hace falta que C2⊥C_2^\perp sea estrictamente menor que C1C_1, como en el Hamming [13,10,3]3[13,10,3]_3.

Ejercicio 3

En el [[13,7,3]]3[[13,7,3]]_3 del ejemplo: (a) halla el síndrome de Z92Z_9^2 y comprueba que se lee bien; (b) ocurre X2X5X_2X_5. ¿Qué hace el decodificador de peso mínimo?

Ver la solución

(a) La parte XX del error es nula, así que los generadores de tipo ZZ dan (0,0,0)(0,0,0). Con b=2e9b=2e_9 y la columna 9, (1,1,1)(1,1,1), los de tipo XX dan −2⋅(1,1,1)=(1,1,1)-2\cdot(1,1,1)=(1,1,1). Entonces −b⋅(columna)=(1,1,1)-b\cdot(\text{columna})=(1,1,1), es decir, b⋅(columna)=(2,2,2)=2⋅(1,1,1)b\cdot(\text{columna})=(2,2,2)=2\cdot(1,1,1): valor b=2b=2 en la columna 9. Se corrige con Z9−2=Z9Z_9^{-2}=Z_9.

(b) Los generadores de tipo ZZ dan la suma de las columnas 2 y 5: (0,1,0)+(1,0,0)=(1,1,0)(0,1,0)+(1,0,0)=(1,1,0), que es la columna 8. El decodificador cree que hubo un X8X_8 y aplica X8−1=X82X_8^{-1}=X_8^2. En total queda X2X5X82X_2X_5X_8^2, de vector (0,1,0,0,1,0,0,2,0,0,0,0,0)(0,1,0,0,1,0,0,2,0,0,0,0,0). Está en CC (columna 2 + columna 5 + 2·columna 8 =(3,3,0)=0=(3,3,0)=0) y no en C⊥C^\perp, porque pesa 3 y no 9. Es un operador lógico: el dato queda estropeado sin que salte ninguna alarma. Dos errores superan lo que corrige un código de distancia 3, igual que en el Hamming clásico.

En resumen

  • Con C1,C2⊆FpnC_1,C_2\subseteq\mathbb{F}_p^n y C2⊥⊆C1C_2^\perp\subseteq C_1, los estabilizadores Z(h)Z(h) (filas de H1H_1) y X(g)X(g) (filas de H2H_2) conmutan porque g⋅h=0g\cdot h=0.
  • Los estados lógicos son ∣x+C2⊥⟩\ket{x+C_2^\perp}, uno por clase lateral de C1/C2⊥C_1/C_2^\perp, y hay pkp^k con k=dim⁡C1−dim⁡C2⊥k=\dim C_1-\dim C_2^\perp.
  • Un error X(a)Z(b)X(a)Z(b) da el síndrome clásico H1aTH_1a^T y menos el síndrome H2bTH_2b^T; ambos señalan posición y valor.
  • El código de 3 cútrits es CSS con C2⊥=⟨111⟩C_2^\perp=\langle111\rangle, y el Hamming ternario da un [[13,7,3]]3[[13,7,3]]_3 que corrige un error.
  • Para q=pmq=p^m se usa Z(b)∣x⟩=ωTr⁡(b⋅x)∣x⟩Z(b)\ket{x}=\omega^{\operatorname{Tr}(b\cdot x)}\ket{x} y la condición sigue siendo C2⊥⊆C1C_2^\perp\subseteq C_1.

Siguiente lección: Reed-Solomon cuánticos

Para profundizar