Codici CSS
Codici lineari classici
I codici classici di correzione degli errori furono studiati per la prima volta negli anni '40, e oggi ne esistono molti tipi diversi. I codici più comunemente studiati e utilizzati appartengono a una categoria nota come codici lineari. Vedremo tra poco esattamente cosa significa la parola "lineare" in questo contesto, ma un modo molto semplice per descrivere i codici lineari è che si tratta di codici stabilizzatori che sono, per l'appunto, classici. I codici CSS sono essenzialmente coppie di codici lineari classici che vengono combinati insieme per creare un codice quantistico di correzione degli errori. Quindi, ai fini della discussione che segue, è necessario capire alcune nozioni di base sui codici lineari classici.
Sia l'alfabeto binario per l'intera discussione. Quando parliamo di codice lineare classico, intendiamo un insieme non vuoto di stringhe binarie di lunghezza per qualche intero positivo che deve soddisfare una sola proprietà fondamentale: se e sono stringhe binarie in allora la stringa è anch'essa in Qui, indica l'OR esclusivo bit a bit di e come abbiamo incontrato più volte nel corso "Fondamenti degli algoritmi quantistici".
In sostanza, quando definiamo lineare un codice classico di correzione degli errori, stiamo considerando le stringhe binarie di lunghezza come vettori -dimensionali con componenti in e richiediamo che il codice stesso formi un sottospazio lineare. Invece della consueta addizione vettoriale sui numeri reali o complessi, utilizziamo però l'addizione modulo che corrisponde semplicemente all'OR esclusivo. Ovvero, se abbiamo due parole di codice e cioè due stringhe binarie in allora modulo 2, ossia deve essere anch'essa una parola di codice in Nota in particolare che questa implicazione deve valere anche nel caso Questo implica che deve contenere la stringa tutta-zero poiché l'OR esclusivo bit a bit di qualsiasi stringa con se stessa è la stringa tutta-zero.
Esempio: il codice a ripetizione a 3 bit
Il codice a ripetizione a 3 bit è un esempio di codice lineare classico. In particolare, quindi, rispetto alla condizione di linearità, ci sono solo due possibili scelte per e due possibili scelte per È banale verificare le quattro coppie possibili per constatare che l'OR esclusivo bit a bit produce sempre una parola di codice:
Esempio: il codice di Hamming
Ecco un altro esempio di codice lineare classico, chiamato codice di Hamming È stato uno dei primissimi codici classici di correzione degli errori mai scoperti, e consiste in queste 16 stringhe binarie di lunghezza 7. (A volte il codice di Hamming è inteso come il codice con queste stringhe invertite, ma qui lo prenderemo come il codice contenente le stringhe mostrate.)
C'è una logica molto semplice dietro la scelta di queste stringhe, ma è secondaria rispetto all'argomento e non verrà spiegata qui. Per ora è sufficiente osservare che si tratta di un codice lineare classico: l'XOR di due qualsiasi di queste stringhe darà sempre un'altra stringa nel codice.
La notazione (tra parentesi quadre singole) ha un significato analogo alla notazione con doppie parentesi quadre per i codici stabilizzatori menzionata nella lezione precedente, ma qui si applica ai codici lineari classici. In particolare, le parole di codice hanno bit, possiamo codificare bit con questo codice (perché ci sono parole di codice), e si tratta di un codice a distanza il che significa che due qualsiasi parole di codice distinte devono differire in almeno posizioni — quindi occorre invertire almeno bit per trasformare una parola di codice in un'altra. Il fatto che sia un codice a distanza implica che può correggere fino a un errore di inversione di bit.
Descrivere i codici lineari classici
Gli esempi appena citati sono esempi molto semplici di codici lineari classici, ma anche il codice di Hamming appare alquanto misterioso quando le parole di codice vengono semplicemente elencate. Esistono modi migliori ed efficaci per descrivere i codici lineari classici, tra cui i seguenti due.
-
Generatori. Un modo per descrivere un codice lineare classico è fornire un elenco minimale di parole di codice che generano il codice, nel senso che prendendo tutti i possibili sottoinsiemi di queste parole di codice e applicando l'XOR tra di esse si ottiene l'intero codice.
In modo più dettagliato, le stringhe generano il codice lineare classico se
con l'intesa che quando e quando e diciamo che questo elenco è minimale se rimuovendo una delle stringhe si genera un codice più piccolo. Un modo naturale di interpretare tale descrizione è che la collezione forma una base per come sottospazio, considerando le stringhe come vettori con componenti binarie, tenendo presente che stiamo lavorando in uno spazio vettoriale dove l'aritmetica è fatta modulo
-
Controlli di parità. Un altro modo naturale per descrivere un codice lineare classico è mediante i controlli di parità — ovvero un elenco minimale di stringhe binarie tali che le stringhe nel codice siano esattamente quelle il cui prodotto scalare binario con ognuna di queste stringhe di controllo di parità è zero. (Come l'OR esclusivo bit a bit, il prodotto scalare binario è apparso più volte in "Fondamenti degli algoritmi quantistici".)
Cioè, le stringhe sono stringhe di controllo di parità per il codice lineare classico se
e questo insieme di stringhe è minimale se rimuovendone una si ottiene un codice più grande. Queste vengono chiamate stringhe di controllo di parità perché ha prodotto scalare binario uguale a zero con se e solo se i bit di nelle posizioni in cui ha un hanno parità pari. Quindi, per determinare se una stringa è nel codice è sufficiente verificare la parità di certi sottoinsiemi dei bit di
Una cosa importante da notare è che il prodotto scalare binario non è un prodotto interno in senso formale. In particolare, quando due stringhe hanno prodotto scalare binario uguale a zero, non significa che siano ortogonali nel senso in cui siamo soliti intendere l'ortogonalità. Per esempio, il prodotto scalare binario della stringa con se stessa è zero — quindi è possibile che una stringa di controllo di parità per un codice lineare classico sia essa stessa nel codice.
I codici lineari classici sull'alfabeto binario contengono sempre un numero di stringhe che è una potenza di — e per un singolo codice lineare classico descritto nei due modi appena descritti, varrà sempre che In particolare, se abbiamo un insieme minimale di generatori, allora il codice codifica bit e avremo necessariamente parole di codice; e se abbiamo un insieme minimale di stringhe di controllo di parità, avremo parole di codice. Quindi, ogni generatore raddoppia la dimensione dello spazio codice mentre ogni stringa di controllo di parità ne dimezza la dimensione.
Per esempio, il codice a ripetizione a 3 bit è un codice lineare, quindi può essere descritto in entrambi questi modi. In particolare, c'è solo una scelta possibile per un generatore che funziona: In alternativa possiamo descrivere il codice con due stringhe di controllo di parità, come e — che dovrebbero sembrare familiari dalle discussioni precedenti su questo codice — oppure potremmo scegliere le stringhe di controllo di parità e o e (I generatori e le stringhe di controllo di parità non sono in generale unici per un dato codice lineare classico.)
Per un secondo esempio, consideriamo il codice di Hamming Ecco una scelta di elenco di generatori che funziona.
Ed ecco una scelta di elenco di controlli di parità per questo codice.
Qui, tra l'altro, notiamo che tutte le nostre stringhe di controllo di parità sono esse stesse nel codice.
Un'ultima osservazione sui codici lineari classici, che li collega al formalismo degli stabilizzatori, è che le stringhe di controllo di parità sono equivalenti ai generatori stabilizzatori composti solo da matrici di Pauli e dall'identità. Per esempio, le stringhe di controllo di parità e per il codice a ripetizione a 3 bit corrispondono esattamente ai generatori stabilizzatori e il che è coerente con le discussioni sulle osservabili di Pauli della lezione precedente.
Definizione dei codici CSS
I codici CSS sono codici stabilizzatori ottenuti combinando insieme certe coppie di codici lineari classici. Questo non funziona per due codici lineari classici arbitrari — i due codici devono avere una certa relazione. Tuttavia, questa costruzione apre molte possibilità per i codici quantistici di correzione degli errori, basandosi in parte su oltre 75 anni di teoria classica dei codici.
Nel formalismo degli stabilizzatori, i generatori stabilizzatori contenenti solo matrici di Pauli e l'identità sono equivalenti ai controlli di parità, come abbiamo appena osservato per il codice a ripetizione a 3 bit. Per un altro esempio, considera le seguenti stringhe di controllo di parità per il codice di Hamming
Queste stringhe di controllo di parità corrispondono ai seguenti generatori stabilizzatori (scritti senza simboli di prodotto tensoriale), che otteniamo sostituendo ogni con e ogni con Questi sono tre dei sei generatori stabilizzatori per il codice di Steane a 7 qubit.
Chiamiamo generatori stabilizzatori i generatori stabilizzatori di questo tipo, ovvero quelli che contengono solo fattori tensoriali di Pauli e identità — quindi le matrici di Pauli e non compaiono mai nei generatori stabilizzatori.
Possiamo anche considerare i generatori stabilizzatori in cui compaiono solo matrici di Pauli e l'identità come fattori tensoriali. Generatori stabilizzatori di questo tipo possono essere visti come analoghi ai generatori stabilizzatori, con la differenza che descrivono controlli di parità nella base anziché nella base standard. I generatori stabilizzatori di questa forma sono chiamati generatori stabilizzatori — stavolta non sono ammesse matrici di Pauli o
Per esempio, considera i restanti tre generatori stabilizzatori del codice di Steane a 7 qubit.
Seguono esattamente lo stesso schema del codice di Hamming dei generatori stabilizzatori, con la differenza che questa volta sostituiamo al posto di anziché Ciò che otteniamo solo da questi tre generatori stabilizzatori è un codice che include i 16 stati mostrati qui, che si ottengono applicando operazioni di Hadamard agli stati della base computazionale corrispondenti alle stringhe nel codice di Hamming (Naturalmente, lo spazio codice per questo codice include anche le combinazioni lineari di questi stati.)
Possiamo ora definire i codici CSS in termini molto semplici.
Ovvero, i codici CSS sono codici stabilizzatori per i quali disponiamo di generatori stabilizzatori in cui non compaiono matrici di Pauli e in cui e non compaiono mai nello stesso generatore stabilizzatore.
Per essere precisi, per questa definizione un codice CSS è un codice per cui è possibile scegliere solo generatori e stabilizzatori — ma dobbiamo tenere presente che c'è libertà nella scelta dei generatori stabilizzatori per i codici stabilizzatori. In generale, ci saranno quindi scelte diverse per i generatori stabilizzatori di un codice CSS che non sono generatori o stabilizzatori (oltre ad almeno una scelta per cui lo sono).
Ecco un esempio molto semplice di codice CSS che include sia un generatore stabilizzatore sia un generatore stabilizzatore:
È chiaro che questo è un codice CSS, perché il primo generatore stabilizzatore è un generatore stabilizzatore e il secondo è un generatore stabilizzatore. Naturalmente, un codice CSS deve anche essere un codice stabilizzatore valido — il che significa che i generatori stabilizzatori devono commutare, formare un insieme generatore minimale e fissare almeno un vettore di stato quantistico. Questi requisiti risultano facili da verificare per questo codice. Come abbiamo notato nella lezione precedente, lo spazio codice per questo codice è lo spazio unidimensionale generato dallo stato di Bell Il fatto che entrambi i generatori stabilizzatori fissino questo stato è evidente considerando le seguenti due espressioni di un e-bit, insieme a un'interpretazione di questi generatori stabilizzatori come controlli di parità nelle basi e
Il codice di Steane a 7 qubit è un altro esempio di codice CSS.
Qui abbiamo tre generatori stabilizzatori e tre generatori stabilizzatori, e abbiamo già verificato che si tratta di un codice stabilizzatore valido.
E il codice di Shor a 9 qubit è un altro esempio.
Questa volta abbiamo sei generatori stabilizzatori e solo due generatori stabilizzatori. Va bene così: non è necessario che ci sia un equilibrio o una simmetria tra i due tipi di generatori (anche se spesso c'è).
Ancora una volta, è fondamentale che i codici CSS siano codici stabilizzatori validi, e in particolare ogni generatore stabilizzatore deve commutare con ogni generatore stabilizzatore. Quindi, non ogni collezione di generatori e stabilizzatori definisce un codice CSS valido.
Rilevamento e correzione degli errori
Per quanto riguarda il rilevamento e la correzione degli errori, i codici CSS in generale hanno una caratteristica simile a quella del codice di Shor a 9 qubit: gli errori e possono essere rilevati e corretti in modo completamente indipendente; i generatori stabilizzatori descrivono un codice che protegge dai bit flip, mentre i generatori stabilizzatori descrivono un codice che protegge in modo indipendente dai phase flip. Questo funziona perché i generatori stabilizzatori commutano necessariamente con gli errori , nonché con le operazioni applicate come correzioni — e sono quindi completamente insensibili a entrambi; lo stesso vale per i generatori stabilizzatori , i loro errori e le relative correzioni.
Come esempio, consideriamo il codice di Steane a 7 qubit.
L'idea di base per questo codice è ora evidente: si tratta di un codice -Hamming per gli errori di bit flip e di un codice -Hamming per gli errori di phase flip. Il fatto che i generatori stabilizzatori e commutino è forse una fortunata coincidenza, perché se non lo facessero il codice non sarebbe un codice stabilizzatore valido. Esistono tuttavia molti esempi noti di codici lineari classici che producono un codice stabilizzatore valido se usati in modo analogo.
In generale, supponiamo di avere un codice CSS per cui i generatori stabilizzatori consentono la correzione di fino a errori di bit flip, e i generatori stabilizzatori consentono la correzione di fino a errori di phase flip. Ad esempio, e per il codice di Steane, dato che il codice -Hamming può correggere un singolo bit flip. Ne consegue, per la discretizzazione degli errori, che questo codice CSS può correggere qualsiasi errore su un numero di qubit pari al minimo tra e . Questo avviene perché, quando viene misurata la sindrome, un errore arbitrario su tale numero di qubit collassa probabilisticamente in una qualche combinazione di errori , errori o entrambi — dopodiché gli errori e gli errori vengono rilevati e corretti in modo indipendente.
In sintesi, a condizione di avere due codici lineari classici (o due copie dello stesso codice lineare classico) compatibili — nel senso che definiscono generatori stabilizzatori e che commutano — il codice CSS ottenuto combinandoli eredita le proprietà di correzione degli errori di quei due codici, nel senso appena descritto.
Occorre però notare che c'è un prezzo da pagare: non è possibile codificare tanti qubit quanti bit si potrebbero codificare con i due codici classici. Questo perché il numero totale di generatori stabilizzatori per il codice CSS è la somma del numero di controlli di parità dei due codici lineari classici, e ogni generatore stabilizzatore dimezza la dimensione dello spazio codice. Ad esempio, il codice -Hamming permette di codificare quattro bit classici, dato che ha solo tre stringhe di controllo di parità, mentre il codice di Steane a 7 qubit codifica un solo qubit, perché ha sei generatori stabilizzatori.
Spazi codice dei codici CSS
L'ultima cosa che faremo in questa trattazione dei codici CSS è considerare gli spazi codice di questi codici. Questo ci darà l'opportunità di esaminare più nel dettaglio la relazione che deve sussistere tra due codici lineari classici affinché siano compatibili, nel senso che possono essere combinati insieme per formare un codice CSS.
Consideriamo un codice CSS qualsiasi su qubit, e siano le stringhe di controllo di parità a bit che corrispondono ai generatori stabilizzatori di questo codice. Ciò significa che il codice lineare classico descritto dai soli generatori stabilizzatori , che chiameremo ha la seguente forma.
In altre parole, il codice lineare classico contiene tutte le stringhe il cui prodotto scalare binario con ciascuna delle stringhe di controllo di parità è zero.
Analogamente, siano le stringhe di controllo di parità a bit corrispondenti ai generatori stabilizzatori del nostro codice. Il codice lineare classico corrispondente ai generatori stabilizzatori ha quindi questa forma.
I soli generatori stabilizzatori descrivono quindi un codice simile a questo, ma nella base invece che nella base standard.
Introduciamo ora due nuovi codici lineari classici derivati dagli stessi insiemi di stringhe, e ma considerando queste stringhe come generatori invece che come stringhe di controllo di parità. In particolare, otteniamo questi due codici.
Questi sono noti come i codici duali dei codici definiti in precedenza: è il codice duale di e è il codice duale di Può non essere chiaro a questo punto perché questi codici duali siano rilevanti, ma risultano esserlo per molteplici ragioni, tra cui le due spiegate nei paragrafi seguenti.
In primo luogo, le condizioni che devono valere affinché due codici lineari classici e siano compatibili — nel senso che possono essere accoppiati per formare un codice CSS — possono essere descritte in termini semplici facendo riferimento ai codici duali. In particolare, deve valere o equivalentemente In altre parole, il codice duale include le stringhe corrispondenti ai generatori stabilizzatori , e il fatto che siano contenute in equivale a dire che il prodotto scalare binario di ciascuna di queste stringhe con quelle corrispondenti ai generatori stabilizzatori è zero. Ciò, a sua volta, equivale al fatto che ogni generatore stabilizzatore commuta con ogni generatore stabilizzatore . In alternativa, scambiando i ruoli dei generatori stabilizzatori e e partendo dalla contenenza si giunge alla stessa conclusione.
In secondo luogo, facendo riferimento ai codici duali, possiamo descrivere facilmente gli spazi codice di un dato codice CSS. In particolare, lo spazio codice è generato da vettori della forma seguente.
In altre parole, questi vettori sono sovrapposizioni uniformi sulle stringhe del codice duale del codice corrispondente ai generatori stabilizzatori , traslate (cioè sottoposte a XOR bit a bit) con le stringhe del codice corrispondente ai generatori stabilizzatori . Per essere precisi, scelte diverse per la traslazione — rappresentata dalla stringa in questa espressione — possono dare luogo allo stesso vettore. Quindi, questi stati non sono tutti distinti, ma nel loro insieme generano l'intero spazio codice.
Ecco una spiegazione intuitiva del perché tali vettori appartengano allo spazio codice e lo generino. Consideriamo lo stato della base standard a qubit per una qualsiasi stringa a bit e supponiamo di proiettare questo stato sullo spazio codice. Ossia, indicando con la proiezione sullo spazio codice del nostro codice CSS, consideriamo il vettore Si presentano due casi:
-
Caso 1: Questo implica che ogni generatore stabilizzatore del nostro codice CSS agisce in modo banale su I generatori stabilizzatori , invece, si limitano ciascuno a invertire alcuni dei bit di In particolare, per ogni generatore di il generatore stabilizzatore corrispondente a trasforma in Caratterizzando la proiezione come la media sugli elementi dello stabilizzatore (come abbiamo visto nella lezione precedente), otteniamo la formula seguente:
-
Caso 2: Questo implica che almeno uno dei controlli di parità corrispondenti ai generatori stabilizzatori fallisce, il che significa che deve essere un autovettore con autovalore di almeno uno dei generatori stabilizzatori . Lo spazio codice del codice CSS è l'intersezione degli autospazi con autovalore dei generatori stabilizzatori. Pertanto, essendo un autovettore con autovalore di almeno uno dei generatori stabilizzatori , è ortogonale allo spazio codice:
Ora, considerando tutte le stringhe a bit , scartando quelle per cui e normalizzando le rimanenti, otteniamo i vettori descritti in precedenza, il che dimostra che generano lo spazio codice.
Possiamo anche sfruttare la simmetria tra i generatori stabilizzatori e per descrivere lo spazio codice in un modo simile ma diverso. In particolare, è lo spazio generato da vettori della forma seguente.
In sostanza, e sono stati scambiati in ogni occorrenza — ma dobbiamo anche scambiare la base standard con la base , motivo per cui sono incluse le operazioni di Hadamard.
Come esempio, consideriamo il codice di Steane a 7 qubit. Le stringhe di controllo di parità per i generatori stabilizzatori e sono le stesse: e I codici e sono quindi uguali; entrambi coincidono con il codice -Hamming.
Anche i codici duali e sono quindi uguali. Abbiamo tre generatori, quindi otteniamo otto stringhe.
Queste stringhe sono tutte contenute nel codice -Hamming, e quindi la condizione CSS è soddisfatta: o equivalentemente
Dato che contiene metà di tutte le stringhe in i vettori distinti ottenibili scegliendo sono solo due. Questo è atteso, poiché il codice di Steane a 7 qubit ha uno spazio codice bidimensionale. Possiamo usare i due stati ottenuti in questo modo per codificare gli stati logici e nel modo seguente.
Come sempre, questa scelta non è obbligata — siamo liberi di usare lo spazio codice per codificare i qubit nel modo che preferiamo. Questa codifica è tuttavia coerente con l'esempio di circuito di codifica per il codice di Steane a 7 qubit presentato nella lezione precedente.