Códigos CSS
Códigos lineares clássicos
Os códigos de correção de erros clássicos foram estudados pela primeira vez na década de 1940, e hoje se conhecem muitos códigos diferentes. Os mais amplamente estudados e utilizados pertencem a uma categoria conhecida como códigos lineares. Vamos entender em breve o que a palavra "linear" significa nesse contexto, mas uma forma muito simples de descrever os códigos lineares é que eles são códigos estabilizadores que, por acaso, são clássicos. Os códigos CSS são, essencialmente, pares de códigos lineares clássicos combinados para criar um código de correção de erros quânticos. Portanto, para a discussão a seguir, precisamos entender alguns conceitos básicos sobre códigos lineares clássicos.
Seja o alfabeto binário para toda esta discussão. Quando nos referimos a um código linear clássico, queremos dizer um conjunto não vazio de strings binárias de comprimento para algum inteiro positivo que deve satisfazer apenas uma propriedade básica: se e são strings binárias em então a string também está em Aqui, denota o OU exclusivo bit a bit de e como vimos várias vezes no curso "Fundamentos de algoritmos quânticos".
Em essência, quando nos referimos a um código de correção de erros clássico como linear, estamos pensando em strings binárias de comprimento como vetores de dimensões, onde as entradas são ou e exigindo que o próprio código forme um subespaço linear. Em vez da adição vetorial ordinária sobre os reais ou os complexos, utilizamos a adição módulo que é simplesmente o OU exclusivo. Ou seja, se temos duas palavras-código e significando que e são strings binárias em então módulo 2, isto é, também deve ser uma palavra-código em Note, em particular, que essa implicação deve ser verdadeira mesmo quando Isso implica que deve incluir a string de zeros pois o OU exclusivo bit a bit de qualquer string consigo mesma é a string de zeros.
Exemplo: o código de repetição de 3 bits
O código de repetição de 3 bits é um exemplo de código linear clássico. Em particular, temos portanto, com relação à condição de linearidade, há apenas duas escolhas possíveis para e duas para É simples verificar os quatro pares possíveis e confirmar que sempre obtemos uma palavra-código ao calcular o OU exclusivo bit a bit:
Exemplo: o código de Hamming
Aqui está outro exemplo de código linear clássico chamado código de Hamming . Foi um dos primeiros códigos de correção de erros clássicos já descobertos, e consiste nestas 16 strings binárias de comprimento 7. (Às vezes, o código de Hamming é entendido como o código com essas strings invertidas, mas vamos considerá-lo como o código contendo as strings mostradas aqui.)
Há uma lógica muito simples por trás da seleção dessas strings, mas ela é secundária ao conteúdo da lição e não será explicada aqui. Por enquanto, basta observar que este é um código linear clássico: calcular o XOR de quaisquer duas dessas strings sempre resultará em outra string do código.
A notação (entre colchetes simples) tem um significado análogo à notação de colchetes duplos para códigos estabilizadores mencionada na lição anterior, mas aqui se aplica a códigos lineares clássicos. Em particular, as palavras-código têm bits, podemos codificar bits usando o código (pois há palavras-código), e esse é um código de distância , o que significa que quaisquer duas palavras-código distintas diferem em pelo menos posições — ou seja, pelo menos bits precisam ser invertidos para transformar uma palavra-código em outra. O fato de ser um código de distância implica que ele pode corrigir até um erro de inversão de bit.
Descrevendo códigos lineares clássicos
Os exemplos mencionados são exemplos muito simples de códigos lineares clássicos, mas mesmo o código de Hamming parece um pouco misterioso quando as palavras-código são simplesmente listadas. Existem formas melhores e mais eficientes de descrever códigos lineares clássicos, incluindo as duas a seguir.
-
Geradores. Uma forma de descrever um código linear clássico é com uma lista mínima de palavras-código que geram o código, significando que, ao considerar todos os subconjuntos possíveis dessas palavras-código e calcular seus XORs, obtemos o código inteiro.
Em maior detalhe, as strings geram o código linear clássico se
com o entendimento de que quando e quando e dizemos que essa lista é mínima se a remoção de uma das strings gera um código menor. Uma forma natural de pensar nessa descrição é que a coleção forma uma base para como subespaço, onde pensamos nas strings como vetores com entradas binárias, lembrando que estamos trabalhando em um espaço vetorial onde a aritmética é feita módulo
-
Verificações de paridade. Outra forma natural de descrever um código linear clássico é por meio de verificações de paridade — ou seja, uma lista mínima de strings binárias tais que as strings no código são precisamente aquelas cujo produto escalar binário com cada uma dessas strings de verificação de paridade é zero. (Similar ao OU exclusivo bit a bit, o produto escalar binário apareceu várias vezes em "Fundamentos de algoritmos quânticos".)
Ou seja, as strings são strings de verificação de paridade para o código linear clássico se
e esse conjunto de strings é mínimo se a remoção de uma resulta em um código maior. Essas são chamadas de strings de verificação de paridade porque tem produto escalar binário igual a zero com se e somente se os bits de nas posições onde tem 1s têm paridade par. Portanto, para determinar se uma string está no código basta verificar a paridade de certos subconjuntos dos bits de
Uma coisa importante a observar é que o produto escalar binário não é um produto interno no sentido formal. Em particular, quando duas strings têm produto escalar binário igual a zero, isso não significa que elas são ortogonais da forma que normalmente pensamos em ortogonalidade. Por exemplo, o produto escalar binário da string consigo mesma é zero — portanto, é possível que uma string de verificação de paridade de um código linear clássico esteja ela própria no código.
Os códigos lineares clássicos sobre o alfabeto binário sempre incluem um número de strings que é uma potência de — e para um único código linear clássico descrito das duas formas acima, sempre teremos Em particular, se temos um conjunto mínimo de geradores, então o código codifica bits e necessariamente teremos palavras-código; e se temos um conjunto mínimo de strings de verificação de paridade, então teremos palavras-código. Portanto, cada gerador dobra o tamanho do espaço do código enquanto cada string de verificação de paridade reduz o tamanho à metade.
Por exemplo, o código de repetição de 3 bits é um código linear, portanto pode ser descrito de ambas as formas. Em particular, há apenas uma escolha de gerador que funciona: Como alternativa, podemos descrever o código com duas strings de verificação de paridade, como e — que devem parecer familiares das nossas discussões anteriores sobre esse código — ou poderíamos escolher as strings de verificação de paridade e ou e (Geradores e strings de verificação de paridade geralmente não são únicos para um dado código linear clássico.)
Para um segundo exemplo, considere o código de Hamming . Aqui está uma escolha de lista de geradores que funciona.
E aqui está uma escolha de lista de verificações de paridade para esse código.
Aqui, aliás, observamos que todas as nossas strings de verificação de paridade estão elas próprias no código.
Uma observação final sobre os códigos lineares clássicos, que os conecta ao formalismo estabilizador, é que as strings de verificação de paridade são equivalentes a geradores estabilizadores compostos apenas por matrizes de Pauli e identidade. Por exemplo, as strings de verificação de paridade e para o código de repetição de 3 bits correspondem precisamente aos geradores estabilizadores e o que é consistente com as discussões sobre observáveis de Pauli da lição anterior.
Definição de códigos CSS
Os códigos CSS são códigos estabilizadores obtidos pela combinação de certos pares de códigos lineares clássicos. Isso não funciona para dois códigos lineares clássicos arbitrários — os dois códigos devem ter uma certa relação. Ainda assim, essa construção abre muitas possibilidades para códigos de correção de erros quânticos, com base em mais de 75 anos de teoria de codificação clássica.
No formalismo estabilizador, os geradores estabilizadores contendo apenas matrizes de Pauli e identidade são equivalentes a verificações de paridade, como acabamos de observar para o código de repetição de 3 bits. Para outro exemplo, considere as seguintes strings de verificação de paridade para o código de Hamming .
Essas strings de verificação de paridade correspondem aos seguintes geradores estabilizadores (escritos sem símbolos de produto tensorial), que obtemos substituindo cada por um e cada por um Esses são três dos seis geradores estabilizadores para o código de Steane de 7 qubits.
Vamos dar o nome de geradores estabilizadores a geradores estabilizadores como esse, ou seja, aqueles que possuem apenas fatores tensoriais Pauli e identidade — portanto, as matrizes de Pauli e nunca ocorrem em geradores estabilizadores .
Também podemos considerar geradores estabilizadores nos quais apenas matrizes de Pauli e identidade aparecem como fatores tensoriais. Geradores estabilizadores como esse podem ser vistos como análogos aos geradores estabilizadores , exceto que descrevem verificações de paridade na base em vez da base padrão. Geradores estabilizadores dessa forma são chamados de geradores estabilizadores — portanto, matrizes de Pauli ou não são permitidas desta vez.
Por exemplo, considere os três geradores estabilizadores restantes do código de Steane de 7 qubits.
Eles seguem exatamente o mesmo padrão do código de Hamming que os geradores estabilizadores , exceto que desta vez substituímos por em vez de O que obtemos apenas com esses três geradores estabilizadores é um código que inclui os 16 estados mostrados aqui, que obtemos aplicando operações de Hadamard aos estados da base padrão que correspondem às strings no código de Hamming . (É claro que o espaço do código para este código também inclui combinações lineares desses estados.)
Agora podemos definir os códigos CSS em termos muito simples.
Ou seja, os códigos CSS são códigos estabilizadores para os quais temos geradores estabilizadores nos quais nenhuma matriz de Pauli aparece, e nos quais e nunca aparecem no mesmo gerador estabilizador.
Para ser claro, por essa definição, um código CSS é aquele para o qual é possível escolher apenas geradores estabilizadores e — mas devemos ter em mente que há liberdade na escolha dos geradores estabilizadores para códigos estabilizadores. Portanto, geralmente haverá diferentes escolhas para os geradores estabilizadores de um código CSS que não são geradores estabilizadores ou (além de pelo menos uma escolha para a qual são).
Aqui está um exemplo muito simples de um código CSS que inclui tanto um gerador estabilizador quanto um gerador estabilizador :
É evidente que este é um código CSS, pois o primeiro gerador estabilizador é um gerador estabilizador e o segundo é um gerador estabilizador . Claro, um código CSS também deve ser um código estabilizador válido — o que significa que os geradores estabilizadores devem comutar, formar um conjunto gerador mínimo e fixar pelo menos um vetor de estado quântico. Esses requisitos são simples de verificar para este código. Como observamos na lição anterior, o espaço do código para este código é o espaço unidimensional gerado pelo estado de Bell . O fato de que ambos os geradores estabilizadores fixam esse estado é evidente considerando as duas expressões a seguir de um e-bit, juntamente com uma interpretação desses geradores estabilizadores como verificações de paridade nas bases e .
O código de Steane de 7 qubits é outro exemplo de código CSS.
Aqui temos três geradores estabilizadores e três geradores estabilizadores , e já verificamos que este é um código estabilizador válido.
E o código de Shor de 9 qubits é outro exemplo.
Desta vez, temos seis geradores estabilizadores e apenas dois geradores estabilizadores . Isso é válido — não precisa haver equilíbrio ou simetria entre os dois tipos de geradores (embora frequentemente haja).
Mais uma vez, é fundamental que os códigos CSS sejam códigos estabilizadores válidos e, em particular, cada gerador estabilizador deve comutar com cada gerador estabilizador . Portanto, nem toda coleção de geradores estabilizadores e define um código CSS válido.
Detecção e correção de erros
Com relação à detecção e correção de erros, os códigos CSS em geral têm uma característica semelhante à do código de Shor de 9 qubits: os erros e podem ser detectados e corrigidos de forma completamente independente; os geradores estabilizadores descrevem um código que protege contra inversões de bit, e os geradores estabilizadores descrevem um código que protege independentemente contra inversões de fase. Isso funciona porque os geradores estabilizadores necessariamente comutam com os erros , bem como com as operações aplicadas como correções, portanto são completamente alheios a ambos, e o mesmo vale para os geradores estabilizadores , erros e correções.
Como exemplo, vamos considerar o código de Steane de 7 qubits.
A ideia básica para este código é agora evidente: é um código de Hamming para erros de inversão de bit e um código de Hamming para erros de inversão de fase. O fato de que os geradores estabilizadores e comutam é talvez uma boa sorte, pois se não comutassem, este não seria um código estabilizador válido. Mas, de fato, existem muitos exemplos conhecidos de códigos lineares clássicos que produzem um código estabilizador válido quando usados de forma semelhante.
Em geral, suponha que temos um código CSS para o qual os geradores estabilizadores permitem a correção de até erros de inversão de bit, e os geradores estabilizadores permitem a correção de até erros de inversão de fase. Por exemplo, e para o código de Steane, dado que o código de Hamming pode corrigir uma inversão de bit. Segue-se então, pela discretização de erros, que este código CSS pode corrigir qualquer erro em um número de qubits até o mínimo de e Isso ocorre porque, quando a síndrome é medida, um erro arbitrário nesse número de qubits colapsa probabilisticamente em alguma combinação de erros , erros , ou ambos — e então os erros e são detectados e corrigidos independentemente.
Em resumo, desde que tenhamos dois códigos lineares clássicos (ou duas cópias de um único código linear clássico) que sejam compatíveis, no sentido de que definem geradores estabilizadores e que comutam, o código CSS que obtemos ao combiná-los herda as propriedades de correção de erros desses dois códigos, no sentido acabado de descrever.
Note que há um preço a ser pago, porém: não podemos codificar tantos qubits quanto poderíamos codificar bits com os dois códigos clássicos. Isso ocorre porque o número total de geradores estabilizadores para o código CSS é a soma do número de verificações de paridade dos dois códigos lineares clássicos, e cada gerador estabilizador reduz a dimensão do espaço do código pela metade. Por exemplo, o código de Hamming permite a codificação de quatro bits clássicos, pois temos apenas três strings de verificação de paridade para esse código, enquanto o código de Steane de 7 qubits codifica apenas um qubit, pois tem seis geradores estabilizadores.
Espaços de código dos códigos CSS
A última coisa que faremos nesta discussão sobre códigos CSS é considerar os espaços de código desses códigos. Isso nos dará a oportunidade de examinar em maior detalhe a relação que deve existir entre dois códigos lineares clássicos para que sejam compatíveis, no sentido de que podem ser combinados para formar um código CSS.
Considere qualquer código CSS em qubits, e seja as strings de verificação de paridade de bits que correspondem aos geradores estabilizadores deste código. Isso significa que o código linear clássico descrito apenas pelos geradores estabilizadores , que chamaremos de tem a seguinte forma.
Em palavras, o código linear clássico contém todas as strings cujo produto escalar binário com cada uma das strings de verificação de paridade é zero.
De forma análoga, tomemos como as strings de verificação de paridade de bits correspondentes aos geradores estabilizadores do nosso código. Assim, o código linear clássico correspondente aos geradores estabilizadores tem esta forma.
Os geradores estabilizadores por si sós descrevem, portanto, um código semelhante a este, mas na base em vez da base padrão.
Agora introduziremos dois novos códigos lineares clássicos derivados das mesmas escolhas de strings, e mas onde tomamos essas strings como geradores em vez de strings de verificação de paridade. Em particular, obtemos estes dois códigos.
Esses são conhecidos como os códigos duais dos códigos definidos anteriormente: é o código dual de e é o código dual de Pode não estar claro neste ponto por que esses códigos duais são relevantes, mas eles se mostram bastante relevantes por múltiplas razões, incluindo as duas razões explicadas nos parágrafos a seguir.
Primeiro, as condições que devem ser satisfeitas para que dois códigos lineares clássicos e sejam compatíveis, no sentido de que podem ser combinados para formar um código CSS, podem ser descritas em termos simples referindo-se aos códigos duais. Especificamente, deve ser que ou equivalentemente, que Em palavras, o código dual inclui as strings correspondentes aos geradores estabilizadores , e sua contenção em é equivalente ao produto escalar binário de cada uma dessas strings com as correspondentes aos geradores estabilizadores ser zero. Isso, por sua vez, é equivalente a cada gerador estabilizador comutar com cada gerador estabilizador . Alternativamente, invertendo os papéis dos geradores estabilizadores e e partindo da contenção podemos chegar à mesma conclusão.
Segundo, referindo-nos aos códigos duais, podemos descrever facilmente os espaços de código de um dado código CSS. Em particular, o espaço de código é gerado por vetores da seguinte forma.
Em palavras, esses vetores são superposições uniformes sobre as strings no código dual do código correspondente aos geradores estabilizadores , deslocadas por (em outras palavras, com XOR bit a bit com) strings no código correspondente aos geradores estabilizadores . Para ser claro, diferentes escolhas para o deslocamento — representado pela string nesta expressão — podem resultar no mesmo vetor. Portanto, esses estados não são todos distintos, mas coletivamente geram todo o espaço de código.
Aqui está uma explicação intuitiva de por que tais vetores estão no espaço de código e o geram. Considere o estado da base padrão de qubits para alguma string arbitrária de bits e suponha que projetamos esse estado no espaço de código. Ou seja, denotando por a projeção no espaço de código do nosso código CSS, considere o vetor Há dois casos:
-
Caso 1: Isso implica que cada gerador estabilizador do nosso código CSS age trivialmente sobre Os geradores estabilizadores , por outro lado, simplesmente invertem alguns dos bits de Em particular, para cada gerador de o gerador estabilizador correspondente a transforma em Caracterizando a projeção como a média sobre os elementos do estabilizador (como vimos na lição anterior), obtemos esta fórmula:
-
Caso 2: Isso implica que pelo menos uma das verificações de paridade correspondentes aos geradores estabilizadores falha, ou seja, deve ser um autovetor de de pelo menos um dos geradores estabilizadores . O espaço de código do código CSS é a interseção dos autoespaços de dos geradores estabilizadores. Portanto, como autovetor de de pelo menos um dos geradores estabilizadores , é ortogonal ao espaço de código:
E agora, ao percorrermos todas as strings de bits, descartarmos aquelas para as quais e normalizarmos as demais, obtemos os vetores descritos anteriormente, o que demonstra que eles geram o espaço de código.
Também podemos usar a simetria entre os geradores estabilizadores e para descrever o espaço de código de uma forma semelhante, mas diferente. Em particular, é o espaço gerado por vetores da seguinte forma.
Em essência, e foram trocados em cada instância em que aparecem — mas também devemos trocar a base padrão pela base , razão pela qual as operações de Hadamard estão incluídas.
Como exemplo, vamos considerar o código de Steane de 7 qubits. As strings de verificação de paridade para os geradores estabilizadores e são as mesmas: e Os códigos e são, portanto, os mesmos; ambos são iguais ao código de Hamming .
Os códigos duais e são, portanto, também os mesmos. Temos três geradores, portanto obtemos oito strings.
Essas strings estão todas contidas no código de Hamming , portanto a condição CSS é satisfeita: ou equivalentemente,
Dado que contém metade de todas as strings em há apenas dois vetores distintos que podem ser obtidos escolhendo Isso é esperado, pois o código de Steane de 7 qubits tem um espaço de código bidimensional. Podemos usar os dois estados que obtemos dessa forma para codificar o estado lógico e da seguinte maneira.
Como de costume, essa escolha não é obrigatória — somos livres para usar o espaço de código para codificar qubits como quisermos. Essa codificação é, no entanto, consistente com o exemplo de um circuito de codificação para o código de Steane de 7 qubits apresentado na lição anterior.