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.