Códigos CSS
Códigos lineales clásicos
Los códigos correctores de errores clásicos se estudiaron por primera vez en la década de 1940, y desde entonces se conocen muchos códigos diferentes. Los códigos más estudiados y utilizados pertenecen a la categoría de los llamados códigos lineales. Lo que significa exactamente la palabra "lineal" en este contexto quedará claro enseguida. En términos simples, los códigos lineales son códigos estabilizadores, pero de naturaleza clásica. Los códigos CSS son esencialmente pares de códigos lineales clásicos que se combinan para formar un código corrector de errores cuánticos. Para comprender la siguiente discusión, necesitamos conocer algunas propiedades básicas de los códigos lineales clásicos.
Sea el alfabeto binario para toda esta discusión. Cuando hablamos de un código lineal clásico, nos referimos a un conjunto no vacío de cadenas binarias de longitud (para un entero positivo ) que debe satisfacer exactamente una propiedad fundamental: si y son cadenas binarias en , entonces también debe estar en . Aquí, denota el OR exclusivo bit a bit de y , como lo hemos encontrado varias veces en el curso "Fundamentos de los algoritmos cuánticos".
En esencia, en los códigos lineales clásicos consideramos las cadenas binarias de longitud como vectores -dimensionales con entradas de y requerimos que el código mismo forme un subespacio lineal. En lugar de la suma vectorial ordinaria sobre los números reales o complejos, usamos la suma módulo , es decir, el OR exclusivo. Es decir: si y son dos palabras código en , entonces módulo 2, es decir, , también debe ser una palabra código en . Nótese en particular que esto también es cierto cuando . De esto se deduce que debe contener la cadena nula , ya que el OR exclusivo bit a bit de cualquier cadena consigo misma es la cadena nula.
Ejemplo: el código de repetición de 3 bits
El código de repetición de 3 bits es un ejemplo de un código lineal clásico. Concretamente, , y para la condición de linealidad hay exactamente dos opciones para y dos para . Es fácil verificar que para los cuatro pares posibles, el OR exclusivo bit a bit siempre da una palabra código:
Ejemplo: el código de Hamming
Aquí hay otro ejemplo de un código lineal clásico: el código de Hamming . Fue uno de los primeros códigos correctores de errores clásicos jamás descubiertos y consta de estas 16 cadenas binarias de longitud 7. (A veces se entiende por código de Hamming el código con las cadenas invertidas, pero aquí consideramos el código con las cadenas que se muestran a continuación.)
Hay una lógica simple detrás de la selección de estas cadenas, pero es secundaria para esta lección y no se explica aquí. Basta con señalar que este es un código lineal clásico: el XOR de cualesquiera dos de estas cadenas siempre da otra cadena en el código.
La notación (entre corchetes simples) tiene un significado similar a la notación de doble corchete para códigos estabilizadores de la lección anterior, pero aplicada a códigos lineales clásicos. Concretamente significa: las palabras código tienen bits, se pueden codificar bits (ya que hay palabras código), y se trata de un código con distancia , es decir, dos palabras código diferentes difieren en al menos posiciones — por lo que se necesitan invertir al menos bits para transformar una palabra código en otra. El hecho de que sea un código con distancia implica que puede corregir hasta un error de inversión de bit.
Descripción de códigos lineales clásicos
Los ejemplos mencionados son códigos lineales clásicos muy simples, pero incluso en el código de Hamming , la mera enumeración de las palabras código resulta algo enigmática. Hay formas mejores y más eficientes de describir códigos lineales clásicos, entre ellas las dos siguientes.
-
Generadores. Una forma de describir un código lineal clásico es una lista mínima de palabras código que generan el código, es decir, seleccionando todos los subconjuntos posibles de estas palabras código y aplicando XOR se obtiene el código completo.
Más precisamente, las cadenas generan el código lineal clásico si
donde para y para , y esta lista se denomina mínima si la eliminación de cualquiera de las cadenas genera un código más pequeño. Una forma natural de ver esta descripción es que forma una base para como subespacio — consideramos las cadenas como vectores con entradas binarias y trabajamos en un espacio vectorial donde la aritmética se realiza módulo .
-
Verificaciones de paridad. Otra descripción natural de un código lineal clásico son las verificaciones de paridad — es decir, una lista mínima de cadenas binarias tales que exactamente las cadenas del código son aquellas cuyo producto escalar binario con cada una de estas cadenas de verificación de paridad es cero. (Al igual que el OR exclusivo bit a bit, el producto escalar binario ha aparecido varias veces en el curso "Fundamentos de los algoritmos cuánticos".)
Es decir: las cadenas son cadenas de verificación de paridad para el código lineal clásico si
y este conjunto de cadenas es mínimo si la eliminación de cualquiera de ellas conduce a un código más grande. Se llaman cadenas de verificación de paridad porque tiene producto escalar binario cero con exactamente cuando los bits de en las posiciones donde tiene un 1 tienen paridad par. Para verificar si una cadena está en el código , basta entonces con comprobar la paridad de ciertos subconjuntos de los bits de .
Una nota importante: el producto escalar binario no es un producto interno en el sentido formal. En particular, que el producto escalar binario de dos cadenas sea cero no significa que sean ortogonales en el sentido habitual. Por ejemplo, el producto escalar binario de la cadena consigo misma es cero — una cadena de verificación de paridad de un código lineal clásico puede pertenecer al propio código.
Los códigos lineales clásicos sobre el alfabeto binario siempre contienen una cantidad de cadenas que es una potencia de — y para un código lineal clásico representado de ambas formas descritas, siempre se cumple . Concretamente: si tenemos un conjunto mínimo de generadores, el código codifica bits y tiene exactamente palabras código; si tenemos un conjunto mínimo de cadenas de verificación de paridad, hay palabras código. Cada generador duplica el tamaño del espacio de código, mientras que cada cadena de verificación de paridad lo divide a la mitad.
Por ejemplo, el código de repetición de 3 bits es un código lineal que puede describirse de ambas formas. Hay exactamente un generador que funciona: . Alternativamente, el código puede describirse mediante dos cadenas de verificación de paridad, por ejemplo y — que deberían resultar familiares de discusiones anteriores de este código — o también y o y . (Los generadores y las cadenas de verificación de paridad no son, en general, únicos para un código lineal clásico dado.)
Como segundo ejemplo, consideremos el código de Hamming . Aquí hay una posible lista de generadores:
Y aquí hay una posible lista de verificaciones de paridad para este código:
Aquí vemos, por cierto, que todas las cadenas de verificación de paridad pertenecen al propio código.
Una observación final sobre los códigos lineales clásicos que los conecta con el formalismo de estabilizadores: las cadenas de verificación de paridad corresponden a generadores de estabilizador que contienen solo matrices de Pauli e identidad. Las cadenas de verificación de paridad y del código de repetición de 3 bits, por ejemplo, corresponden exactamente a los generadores de estabilizador y , lo cual es consistente con las discusiones sobre observables de Pauli de la lección anterior.
Definición de los códigos CSS
Los códigos CSS son códigos estabilizadores que se obtienen combinando ciertos pares de códigos lineales clásicos. Esto no funciona para cualesquiera dos códigos lineales clásicos — los dos códigos deben tener una relación particular entre sí. Sin embargo, esta construcción abre muchas posibilidades para códigos correctores de errores cuánticos, que se basan en parte en más de 75 años de teoría de codificación clásica.
En el formalismo de estabilizadores, los generadores de estabilizador que contienen solo matrices de Pauli e identidad son equivalentes a verificaciones de paridad, como acabamos de ver con el código de repetición de 3 bits. Como otro ejemplo, consideremos las siguientes cadenas de verificación de paridad para el código de Hamming :
Estas cadenas de verificación de paridad corresponden a los siguientes generadores de estabilizador (sin símbolos de producto tensorial), que se obtienen reemplazando cada por y cada por . Estos son tres de los seis generadores de estabilizador del código de Steane de 7 qubits.
Los generadores de estabilizador de este tipo — en los que solo aparecen factores tensoriales de Pauli e identidad (no aparecen matrices de Pauli ni ) — los llamamos generadores de estabilizador .
Además, existen generadores de estabilizador en los que solo aparecen matrices de Pauli e identidad como factores tensoriales. Tales generadores son análogos a los generadores de estabilizador , pero describen verificaciones de paridad en la base en lugar de la base estándar. Los generadores de esta forma se llaman generadores de estabilizador — aquí no se permiten matrices de Pauli ni .
Como ejemplo, consideremos los tres generadores de estabilizador restantes del código de Steane de 7 qubits:
Siguen exactamente el mismo patrón del código de Hamming que los generadores de estabilizador , pero esta vez se usa en lugar de para cada . Solo con estos tres generadores de estabilizador se obtiene un código que contiene los 16 estados que se muestran aquí — se obtienen aplicando operaciones de Hadamard a los estados de la base estándar correspondientes a las cadenas del código de Hamming . (Por supuesto, el espacio de código también contiene combinaciones lineales de estos estados.)
Los códigos CSS pueden definirse ahora en términos muy simples.
Es decir, los códigos CSS son códigos estabilizadores para los cuales existen generadores de estabilizador en los que no aparecen matrices de Pauli y en los que y nunca ocurren en el mismo generador de estabilizador.
Para ser claros: según esta definición, un código CSS es aquel en el que es posible elegir exclusivamente generadores de estabilizador y — pero debemos tener en cuenta que en los códigos estabilizadores hay libertad en la elección de los generadores. Por lo tanto, en general habrá diferentes elecciones de generadores de estabilizador para un código CSS que no son generadores de estabilizador o (además de al menos una elección en la que sí lo son).
Aquí hay un ejemplo muy simple de un código CSS que contiene tanto un generador de estabilizador como un generador de estabilizador :
Es obvio que este es un código CSS: el primer generador de estabilizador es un generador de estabilizador y el segundo es un generador de estabilizador . Por supuesto, un código CSS también debe ser un código estabilizador válido — es decir, los generadores de estabilizador deben conmutar, formar un conjunto generador mínimo y fijar al menos un vector de estado cuántico. Estos requisitos son fáciles de verificar para este código. Como se menciónó en la lección anterior, el espacio de código de este código es el espacio unidimensional generado por el estado de Bell . Que ambos generadores de estabilizador fijan este estado se deduce de las dos expresiones siguientes para un e-bit y de una interpretación de estos generadores de estabilizador como verificaciones de paridad en la base y en la base .
El código de Steane de 7 qubits es otro ejemplo de un código CSS.
Aquí tenemos tres generadores de estabilizador y tres generadores de estabilizador , y ya hemos verificado que se trata de un código estabilizador válido.
Y el código de Shor de 9 qubits es otro ejemplo:
Esta vez tenemos seis generadores de estabilizador y solo dos generadores de estabilizador . Esto está bien — no tiene por qué haber equilibrio o simetría entre los dos tipos de generadores (aunque frecuentemente la hay).
Una vez más, los códigos CSS deben ser códigos estabilizadores válidos; en particular, cada generador de estabilizador debe conmutar con cada generador de estabilizador . No toda combinación de generadores de estabilizador y define, por tanto, un código CSS válido.
Detección y corrección de errores
En cuanto a la detección y corrección de errores, los códigos CSS tienen, en general, una propiedad similar a la del código de Shor de 9 qubits: los errores y pueden detectarse y corregirse de forma completamente independiente. Los generadores de estabilizador describen un código que protege contra inversiones de bit, y los generadores de estabilizador describen un código que protege independientemente contra inversiones de fase. Esto funciona porque los generadores de estabilizador necesariamente conmutan con los errores y las correcciones — son por tanto completamente invisibles para ambos — y lo mismo ocurre recíprocamente con los generadores de estabilizador , errores y correcciones.
Como ejemplo, consideremos el código de Steane de 7 qubits:
La idea básica de este código es ahora clara: es un código de Hamming para errores de inversión de bit y un código de Hamming para errores de inversión de fase. Que los generadores de estabilizador y conmuten es, en cierto modo, una circunstancia afortunada — si no fuera así, no sería un código estabilizador válido. De hecho, sin embargo, hay muchos ejemplos conocidos de códigos lineales clásicos que conducen a un código estabilizador válido de manera similar.
Supongamos que tenemos un código CSS en el que los generadores de estabilizador permiten la corrección de hasta errores de inversión de bit y los generadores de estabilizador permiten la corrección de hasta errores de inversión de fase. Para el código de Steane, por ejemplo, y , ya que el código de Hamming puede corregir una inversión de bit. Por la discretización de errores, se deduce que este código CSS puede corregir errores arbitrarios en un número de qubits hasta el mínimo de y . Pues al medir el síndrome, un error arbitrario en ese número de qubits colapsa probabilísticamente en una combinación de errores , errores o ambos — y luego los errores y los errores se detectan y corrigen de forma independiente.
En resumen: si tenemos dos códigos lineales clásicos (o dos copias de un solo código lineal clásico) que son compatibles — es decir, definen generadores de estabilizador y que conmutan — entonces el código CSS que obtenemos al combinarlos hereda las propiedades de corrección de errores de esos dos códigos en el sentido descrito.
Sin embargo, hay un precio que pagar: no podemos codificar tantos qubits como bits en los dos códigos clásicos. Esto se debe a que el número total de generadores de estabilizador del código CSS es la suma de las verificaciones de paridad de los dos códigos lineales clásicos, y cada generador de estabilizador reduce a la mitad la dimensión del espacio de código. Por ejemplo, el código de Hamming permite la codificación de cuatro bits clásicos (ya que solo tiene tres cadenas de verificación de paridad), mientras que el código de Steane de 7 qubits codifica solo un qubit (ya que tiene seis generadores de estabilizador).
Espacios de código de los códigos CSS
Para concluir nuestra discusión sobre los códigos CSS, consideremos los espacios de código de estos códigos. Esto nos da la oportunidad de examinar más de cerca la relación que debe existir entre dos códigos lineales clásicos para que sean compatibles y puedan combinarse en un código CSS.
Consideremos un código CSS arbitrario sobre qubits y sea el conjunto de las cadenas de verificación de paridad de bits correspondientes a los generadores de estabilizador de este código. El código lineal clásico descrito solo por los generadores de estabilizador , al que llamamos , tiene entonces la siguiente forma:
En otras palabras, el código lineal clásico contiene exactamente las cadenas cuyo producto escalar binario con cada una de las cadenas de verificación de paridad es cero.
Correspondientemente, sea el conjunto de las cadenas de verificación de paridad de bits correspondientes a los generadores de estabilizador de nuestro código. El código lineal clásico de los generadores de estabilizador tiene entonces esta forma:
Los generadores de estabilizador solos describen, por tanto, un código similar a este, pero en la base en lugar de la base estándar.
Ahora introducimos dos nuevos códigos lineales clásicos que se derivan de las mismas cadenas y , pero esta vez usadas como generadores en lugar de cadenas de verificación de paridad. Obtenemos los siguientes dos códigos:
Estos se denominan códigos duales de los códigos definidos anteriormente: es el código dual de y es el código dual de . Puede que no sea obvio por el momento por qué estos códigos duales son relevantes, pero desempeñan un papel importante por varias razones, incluyendo las dos explicadas en los párrafos siguientes.
En primer lugar, las condiciones que dos códigos lineales clásicos y deben satisfacer para ser compatibles (es decir, poder combinarse en un código CSS) pueden describirse de forma simple usando los códigos duales. Concretamente, debe cumplirse: , lo cual es equivalente a . En otras palabras: el código dual contiene las cadenas de los generadores de estabilizador , y su inclusión en es equivalente a que el producto escalar binario de cada una de estas cadenas con las de los generadores de estabilizador sea cero. Esto, a su vez, es equivalente a que cada generador de estabilizador conmute con cada generador de estabilizador . Alternativamente, se puede llegar a la misma conclusión intercambiando los roles de los generadores de estabilizador y y partiendo de la inclusión .
En segundo lugar, usando los códigos duales se pueden describir fácilmente los espacios de código de un código CSS dado. En particular, el espacio de código está generado por vectores de la siguiente forma:
En otras palabras, estos vectores son superposiciones equiponderadas sobre las cadenas del código dual del código correspondiente a los generadores de estabilizador , desplazadas (es decir, XOR bit a bit) con cadenas del código de los generadores de estabilizador . Para aclarar: diferentes elecciones del desplazamiento — representado por la cadena en esta expresión — pueden conducir al mismo vector. Estos estados no son, por tanto, todos distintos, pero juntos generan todo el espacio de código.
Aquí hay una explicación intuitiva de por qué tales vectores están en el espacio de código y lo generan. Consideremos el estado de la base estándar de qubits para una cadena de bits arbitraria y proyectemos este estado sobre el espacio de código. Sea la proyección sobre el espacio de código de nuestro código CSS y consideremos el vector . Hay dos casos:
-
Caso 1: Esto significa que cada generador de estabilizador de nuestro código CSS actúa trivialmente sobre . Los generadores de estabilizador , en cambio, invierten ciertos bits de . En particular, para cada generador de , el generador de estabilizador correspondiente transforma en . Caracterizando la proyección como el promedio sobre los elementos del estabilizador (como se vio en la lección anterior), obtenemos la siguiente fórmula:
-
Caso 2: Esto significa que al menos una de las verificaciones de paridad correspondientes a los generadores de estabilizador falla, es decir, es un vector propio con valor propio de al menos un generador de estabilizador . El espacio de código del código CSS es la intersección de los espacios propios de valor propio de los generadores de estabilizador. Como vector propio de valor propio de al menos un generador de estabilizador , es por tanto ortogonal al espacio de código:
Si ahora recorremos todas las cadenas de bits , descartamos los casos con y normalizamos los restantes, obtenemos los vectores descritos anteriormente — lo que demuestra que generan el espacio de código.
Usando la simetría entre los generadores de estabilizador y , el espacio de código también puede describirse de una forma similar pero diferente. Está generado por vectores de la siguiente forma:
En esencia, se han intercambiado y en cada aparición — pero también debemos intercambiar la base estándar por la base , razón por la cual aparecen las operaciones de Hadamard.
Como ejemplo, consideremos el código de Steane de 7 qubits. Las cadenas de verificación de paridad para los generadores de estabilizador y son las mismas: , y . Los códigos y son por tanto iguales; ambos son el código de Hamming .
Los códigos duales y también son por tanto iguales. Tenemos tres generadores y obtenemos ocho cadenas:
Todas estas cadenas están contenidas en el código de Hamming , por lo que se satisface la condición CSS: o, equivalentemente, .
Dado que contiene la mitad de todas las cadenas en , solo hay dos vectores distintos que surgen al elegir . Esto es de esperar, ya que el código de Steane de 7 qubits tiene un espacio de código bidimensional. Podemos usar los dos estados así obtenidos para codificar los estados lógicos y de la siguiente manera:
Como de costumbre, esta elección no es obligatoria — podemos usar el espacio de código a voluntad para codificar qubits. Sin embargo, esta codificación es consistente con el ejemplo de un circuito de codificación para el código de Steane de 7 qubits de la lección anterior.