Coduri CSS
Coduri liniare clasice
Codurile clasice de corectare a erorilor au fost studiate pentru prima dată în anii 1940 și, de atunci, sunt cunoscute multe tipuri diferite de coduri. Cele mai studiate și utilizate coduri se încadrează într-o categorie numită coduri liniare. Vom vedea exact ce înseamnă cuvântul „liniar" în acest context peste puțin timp, dar o modalitate foarte simplă de a descrie codurile liniare la acest punct este că sunt coduri Stabilizer care se întâmplă să fie clasice. Codurile CSS sunt, în esență, perechi de coduri liniare clasice combinate împreună pentru a crea un cod cuantic de corectare a erorilor. Astfel, pentru discuția care urmează, va trebui să înțelegem câteva lucruri de bază despre codurile liniare clasice.
Fie alfabetul binar pentru întreaga discuție de față. Când ne referim la un cod liniar clasic, înțelegem o mulțime nevidă de șiruri binare de lungime pentru un număr întreg pozitiv care trebuie să satisfacă o singură proprietate de bază: dacă și sunt șiruri binare în atunci șirul se află de asemenea în Aici, se referă la SAU-exclusiv pe biți al lui și pe care l-am întâlnit de mai multe ori în cursul „Fundamentele algoritmilor cuantici".
În esență, când ne referim la un cod clasic de corectare a erorilor ca fiind liniar, ne gândim la șirurile binare de lungime ca la vectori -dimensionali ale căror componente sunt fie fie și cerem ca însuși codul să formeze un subspațiu liniar. În loc de adunarea obișnuită a vectorilor peste numerele reale sau complexe, folosim însă adunarea modulo care este pur și simplu SAU-exclusiv. Cu alte cuvinte, dacă avem două cuvinte de cod și adică și sunt șiruri binare în atunci modulo 2, adică trebuie să fie și el un cuvânt de cod în Observă, în special, că această implicație trebuie să fie adevărată chiar și atunci când Aceasta implică faptul că trebuie să conțină șirul format numai din zerouri deoarece SAU-exclusiv pe biți al oricărui șir cu el însuși este șirul format numai din zerouri.
Exemplu: codul de repetiție pe 3 biți
Codul de repetiție pe 3 biți este un exemplu de cod liniar clasic. În particular, avem deci, în ceea ce privește condiția de liniaritate, există doar două alegeri posibile pentru și două alegeri posibile pentru Este un exercițiu trivial să parcurgi cele patru perechi posibile și să verifici că obținem întotdeauna un cuvânt de cod atunci când luăm SAU-exclusiv pe biți:
Exemplu: codul Hamming
Iată un alt exemplu de cod liniar clasic, numit codul Hamming . A fost unul dintre primele coduri clasice de corectare a erorilor descoperite vreodată și constă din aceste 16 șiruri binare de lungime 7. (Uneori codul Hamming este înțeles ca reprezentând codul cu aceste șiruri inversate, dar noi îl vom considera ca fiind codul ce conține șirurile prezentate aici.)
Există o logică foarte simplă în spatele selecției acestor șiruri, dar ea este secundară lecției și nu va fi explicată aici. Deocamdată, este suficient să observi că acesta este un cod liniar clasic: aplicând XOR oricăror două șiruri dintre acestea, vei obține întotdeauna un alt șir din cod.
Notația (cu paranteze drepte simple) are o semnificație analogă cu notația cu paranteze drepte duble pentru codurile Stabilizer menționată în lecția anterioară, dar aici este pentru codurile liniare clasice. În particular, cuvintele de cod au biți, putem codifica biți folosind codul (deoarece există cuvinte de cod), și se întâmplă să fie un cod cu distanța ceea ce înseamnă că oricare două cuvinte de cod distincte trebuie să difere în cel puțin poziții — deci cel puțin biți trebuie inversați pentru a transforma un cuvânt de cod în altul. Faptul că acesta este un cod cu distanța implică faptul că poate corecta până la o eroare de tip inversare a unui bit.
Descrierea codurilor liniare clasice
Exemplele menționate mai sus sunt exemple foarte simple de coduri liniare clasice, dar chiar și codul Hamming pare oarecum misterios atunci când cuvintele de cod sunt pur și simplu enumerate. Există modalități mai bune și mai eficiente de a descrie codurile liniare clasice, inclusiv următoarele două.
-
Generatori. O modalitate de a descrie un cod liniar clasic este cu o listă minimă de cuvinte de cod care generează codul, adică prin luarea tuturor subseturilor posibile ale acestor cuvinte de cod și aplicând XOR asupra lor, obținem întregul cod.
Mai în detaliu, șirurile generează codul liniar clasic dacă
cu înțelegerea că când și când și spunem că această listă este minimală dacă eliminarea unuia dintre șiruri generează un cod mai mic. O modalitate naturală de a gândi o astfel de descriere este că mulțimea formează o bază pentru ca subspațiu, unde ne gândim la șiruri ca la vectori cu componente de valoare binară, ținând cont că lucrăm într-un spațiu vectorial unde aritmetica se face modulo
-
Verificări de paritate. O altă modalitate naturală de a descrie un cod liniar clasic este prin verificări de paritate — adică o listă minimală de șiruri binare pentru care șirurile din cod sunt exact cele al căror produs punct binar cu fiecare dintre aceste șiruri de verificare a parității este zero. (Similar cu SAU-exclusiv pe biți, produsul punct binar a apărut de mai multe ori în „Fundamentele algoritmilor cuantici".)
Adică, șirurile sunt șiruri de verificare a parității pentru codul liniar clasic dacă
și această mulțime de șiruri este minimală dacă eliminarea unuia duce la un cod mai mare. Acestea se numesc șiruri de verificare a parității deoarece are produsul punct binar egal cu zero față de dacă și numai dacă biții lui de pe pozițiile unde are 1 au paritate pară. Deci, pentru a determina dacă un șir se află în codul este suficient să verifici paritatea anumitor submulțimi de biți ai lui
Un lucru important de observat este că produsul punct binar nu este un produs intern în sens formal. În special, atunci când două șiruri au produsul punct binar egal cu zero, asta nu înseamnă că sunt ortogonale în modul în care ne gândim de obicei la ortogonalitate. De exemplu, produsul punct binar al șirului cu el însuși este zero — deci este posibil ca un șir de verificare a parității pentru un cod liniar clasic să se afle el însuși în cod.
Codurile liniare clasice peste alfabetul binar conțin întotdeauna un număr de șiruri care este o putere a lui — și pentru un singur cod liniar clasic descris în cele două moduri tocmai prezentate, va fi întotdeauna adevărat că În particular, dacă avem o mulțime minimală de generatori, atunci codul codifică biți și vom avea în mod necesar cuvinte de cod; și dacă avem o mulțime minimală de șiruri de verificare a parității, atunci vom avea cuvinte de cod. Deci, fiecare generator dublează dimensiunea spațiului codului, în timp ce fiecare șir de verificare a parității înjumătățește dimensiunea spațiului codului.
De exemplu, codul de repetiție pe 3 biți este un cod liniar, deci poate fi descris în ambele moduri. În particular, există o singură alegere pentru un generator care funcționează: Putem descrie alternativ codul cu două șiruri de verificare a parității, cum ar fi și — care ar trebui să fie familiare din discuțiile noastre anterioare despre acest cod — sau am putea lua șirurile de verificare a parității ca și sau și (Generatorii și șirurile de verificare a parității nu sunt în general unici pentru un cod liniar clasic dat.)
Pentru un al doilea exemplu, considerăm codul Hamming . Iată o alegere pentru o listă de generatori care funcționează.
Și iată o alegere pentru o listă de verificări de paritate pentru acest cod.
Observă că, în acest caz, toate șirurile noastre de verificare a parității se află ele însele în cod.
O ultimă remarcă despre codurile liniare clasice, care le conectează la formalismul Stabilizer, este că șirurile de verificare a parității sunt echivalente cu generatorii Stabilizer care constau numai din matricele Pauli și identitate. De exemplu, șirurile de verificare a parității și pentru codul de repetiție pe 3 biți corespund exact generatorilor Stabilizer și ceea ce este consistent cu discuțiile despre observabilele Pauli din lecția anterioară.
Definiția codurilor CSS
Codurile CSS sunt coduri Stabilizer obținute prin combinarea anumitor perechi de coduri liniare clasice. Aceasta nu funcționează pentru două coduri liniare clasice arbitrare — cele două coduri trebuie să aibă o relație anume. Cu toate acestea, această construcție deschide multe posibilități pentru codurile cuantice de corectare a erorilor, bazate în parte pe peste 75 de ani de teorie clasică a codificării.
În formalismul Stabilizer, generatorii Stabilizer care conțin numai matricele Pauli și identitate sunt echivalenți cu verificările de paritate, așa cum am observat tocmai pentru codul de repetiție pe 3 biți. Pentru un alt exemplu, considerăm următoarele șiruri de verificare a parității pentru codul Hamming .
Aceste șiruri de verificare a parității corespund următorilor generatori Stabilizer (scrisi fără simboluri de produs tensorial), pe care îi obținem înlocuind fiecare cu un și fiecare cu un Aceștia sunt trei dintre cei șase generatori Stabilizer pentru codul Steane de 7 qubiți.
Să numim generatori Stabilizer generatorii de acest tip, adică cei care conțin doar Pauli și factori tensoriali identitate — astfel, matricele Pauli și nu apar niciodată în generatorii Stabilizer .
Putem considera și generatori Stabilizer în care apar ca factori tensoriali doar matricele Pauli și identitatea. Generatorii de acest fel pot fi priviți ca analogi ai generatorilor Stabilizer , cu deosebirea că descriu verificări de paritate în baza în loc de baza standard. Generatorii Stabilizer de această formă se numesc generatori Stabilizer — de data aceasta nu sunt permise matricele Pauli sau .
De exemplu, să considerăm ceilalți trei generatori Stabilizer din codul Steane de 7 qubiți.
Urmează exact același tipar din codul -Hamming ca și generatorii Stabilizer , cu excepția că de data aceasta substituim în loc de , în loc de Ceea ce obținem doar din acești trei generatori Stabilizer este un cod care include cele 16 stări prezentate mai jos, pe care le obținem aplicând operații Hadamard stărilor din baza standard ce corespund șirurilor din codul -Hamming. (Desigur, spațiul codului pentru acest cod include și combinații liniare ale acestor stări.)
Putem acum defini codurile CSS în termeni foarte simpli.
Adică, codurile CSS sunt coduri Stabilizer pentru care avem generatori Stabilizer în care nu apar matrice Pauli , și pentru care și nu apar niciodată în același generator Stabilizer.
Pentru a fi clar, conform acestei definiții, un cod CSS este unul pentru care este posibil să alegi doar generatori Stabilizer și — dar trebuie să ținem minte că există libertate în modul în care alegem generatorii Stabilizer pentru codurile Stabilizer. Astfel, în general vor exista diferite alegeri pentru generatorii Stabilizer ai unui cod CSS care nu sunt generatori Stabilizer sau (pe lângă cel puțin o alegere pentru care sunt).
Iată un exemplu foarte simplu de cod CSS care include atât un generator Stabilizer , cât și un generator Stabilizer :
Este clar că acesta este un cod CSS, deoarece primul generator Stabilizer este un generator Stabilizer , iar al doilea este un generator Stabilizer . Desigur, un cod CSS trebuie să fie și un cod Stabilizer valid — adică generatorii Stabilizer trebuie să comute, să formeze o mulțime generatoare minimală și să fixeze cel puțin un vector de stare cuantică. Aceste cerințe sunt ușor de verificat pentru acest cod. Așa cum am menționat în lecția anterioară, spațiul codului pentru acest cod este spațiul unidimensional generat de starea Bell . Faptul că ambii generatori Stabilizer fixează această stare reiese considerând următoarele două expresii ale unui e-bit, împreună cu o interpretare a acestor generatori Stabilizer ca verificări de paritate în bazele și .
Codul Steane de 7 qubiți este un alt exemplu de cod CSS.
Avem aici trei generatori Stabilizer și trei generatori Stabilizer , și am verificat deja că acesta este un cod Stabilizer valid.
Iar codul Shor de 9 qubiți este un alt exemplu.
De data aceasta avem șase generatori Stabilizer și doar doi generatori Stabilizer . Acest lucru este în regulă, nu trebuie să existe un echilibru sau o simetrie între cele două tipuri de generatori (deși adesea există).
Încă o dată, este esențial că codurile CSS sunt coduri Stabilizer valide, și în special fiecare generator Stabilizer trebuie să comute cu fiecare generator Stabilizer . Prin urmare, nu orice colecție de generatori Stabilizer și definește un cod CSS valid.
Detecția și corectarea erorilor
În ceea ce privește detecția și corectarea erorilor, codurile CSS în general au o caracteristică similară cu codul Shor de 9 qubiți, și anume că erorile și pot fi detectate și corectate complet independent; generatorii Stabilizer descriu un cod care protejează împotriva inversărilor de bit, iar generatorii Stabilizer descriu un cod care protejează independent împotriva inversărilor de fază. Acest lucru funcționează deoarece generatorii Stabilizer comută în mod necesar cu erorile , precum și cu operațiile aplicate ca corecții, deci sunt complet insensibili la ambele, și la fel se întâmplă pentru generatorii Stabilizer , erori și corecții.
Ca exemplu, să considerăm codul Steane de 7 qubiți.
Ideea de bază pentru acest cod este acum evidentă: este un cod -Hamming pentru erorile de inversare a bitului și un cod -Hamming pentru erorile de inversare a fazei. Faptul că generatorii Stabilizer și comută este poate o fericită coincidență, deoarece acesta nu ar fi un cod Stabilizer valid dacă nu ar comuta. Dar există, de fapt, multe exemple cunoscute de coduri liniare clasice care produc un cod Stabilizer valid atunci când sunt utilizate într-un mod similar.
În general, să presupunem că avem un cod CSS pentru care generatorii Stabilizer permit corectarea a până la erori de inversare a bitului, iar generatorii Stabilizer permit corectarea a până la erori de inversare a fazei. De exemplu, și pentru codul Steane, dat fiind că codul -Hamming poate corecta o singură inversare de bit. Rezultă, prin discretizarea erorilor, că acest cod CSS poate corecta orice eroare pe un număr de qubiți de cel mult minimul dintre și Aceasta se întâmplă deoarece, atunci când se măsoară sindromul, o eroare arbitrară pe acest număr de qubiți colapsează probabilistic într-o combinație de erori , erori sau ambele — iar apoi erorile și erorile sunt detectate și corectate independent.
Pe scurt, dacă avem două coduri liniare clasice (sau două copii ale unui singur cod liniar clasic) care sunt compatibile, în sensul că definesc generatori Stabilizer și care comută, codul CSS obținut prin combinarea lor moștenește proprietățile de corectare a erorilor ale celor două coduri, în sensul tocmai descris.
Observă că există și un cost, și anume că nu putem codifica la fel de mulți qubiți câte biți am fi putut codifica cu cele două coduri clasice. Aceasta deoarece numărul total de generatori Stabilizer pentru codul CSS este suma numărului de șiruri de verificare a parității pentru cele două coduri liniare clasice, iar fiecare generator Stabilizer înjumătățește dimensiunea spațiului codului. De exemplu, codul -Hamming permite codificarea a patru biți clasici, deoarece are doar trei șiruri de verificare a parității, în timp ce codul Steane de 7 qubiți codifică un singur qubit, deoarece are șase generatori Stabilizer.
Spațiile codului pentru codurile CSS
Ultimul lucru pe care îl vom face în această discuție despre codurile CSS este să analizăm spațiile codului ale acestor coduri. Aceasta ne va oferi ocazia de a examina în mai mare detaliu relația care trebuie să existe între două coduri liniare clasice pentru ca ele să fie compatibile, în sensul că pot fi combinate pentru a forma un cod CSS.
Consideră orice cod CSS pe qubiți și fie șirurile de verificare a parității de biți care corespund generatorilor Stabilizer ai acestui cod. Aceasta înseamnă că codul liniar clasic descris doar de generatorii Stabilizer , pe care îl vom numi are următoarea formă.
Cu alte cuvinte, codul liniar clasic conține fiecare șir al cărui produs scalar binar cu fiecare șir de verificare a parității este zero.
În mod similar, fie șirurile de verificare a parității de biți corespunzătoare generatorilor Stabilizer ai codului nostru. Astfel, codul liniar clasic corespunzător generatorilor Stabilizer are această formă.
Generatorii Stabilizer singuri descriu prin urmare un cod similar cu acesta, dar în baza în loc de baza standard.
Vom introduce acum două noi coduri liniare clasice derivate din aceleași alegeri de șiruri, și dar unde luăm aceste șiruri drept generatori în loc de șiruri de verificare a parității. Obținem în particular aceste două coduri.
Acestea sunt cunoscute drept codurile duale ale codurilor definite anterior: este codul dual al lui , iar este codul dual al lui S-ar putea să nu fie clar în acest moment de ce sunt relevante aceste coduri duale, dar ele se dovedesc a fi destul de relevante din mai multe motive, inclusiv cele două motive explicate în paragrafele următoare.
În primul rând, condițiile care trebuie îndeplinite pentru ca două coduri liniare clasice și să fie compatibile, în sensul că pot fi asociate pentru a forma un cod CSS, pot fi descrise simplu prin referire la codurile duale. Mai precis, trebuie ca sau echivalent, că Cu alte cuvinte, codul dual include șirurile corespunzătoare generatorilor Stabilizer , iar includerea lor în este echivalentă cu faptul că produsul scalar binar al fiecăruia dintre aceste șiruri cu cele corespunzătoare generatorilor Stabilizer este zero. Aceasta, la rândul ei, este echivalentă cu faptul că fiecare generator Stabilizer comută cu fiecare generator Stabilizer . Alternativ, inversând rolurile generatorilor Stabilizer și și pornind de la includerea putem ajunge la aceeași concluzie.
În al doilea rând, prin referire la codurile duale, putem descrie cu ușurință spațiile codului pentru un cod CSS dat. În particular, spațiul codului este generat de vectori de următoarea formă.
Cu alte cuvinte, acești vectori sunt superpoziții uniforme peste șirurile din codul dual al codului corespunzător generatorilor Stabilizer , deplasate cu (cu alte cuvinte, XOR-ate bit cu bit cu) șiruri din codul corespunzător generatorilor Stabilizer . Trebuie precizat că alegeri diferite pentru deplasare — reprezentate de șirul în această expresie — pot produce același vector. Prin urmare, aceste stări nu sunt toate distincte, dar colectiv ele generează întregul spațiu al codului.
Iată o explicație intuitivă pentru motivul pentru care astfel de vectori se află atât în spațiul codului, cât și îl generează. Consideră starea din baza standard pe qubiți pentru un șir arbitrar de biți și presupune că proiectăm această stare pe spațiul codului. Cu alte cuvinte, notând cu proiecția pe spațiul codului al codului nostru CSS, consideră vectorul Există două cazuri:
-
Cazul 1: Aceasta implică faptul că fiecare generator Stabilizer al codului nostru CSS acționează trivial asupra Generatorii Stabilizer , pe de altă parte, inversează pur și simplu unii dintre biții lui Mai precis, pentru fiecare generator al lui generatorul Stabilizer corespunzător lui transformă în Caracterizând proiecția ca media peste elementele stabilizatorului (după cum am văzut în lecția anterioară), obținem această formulă:
-
Cazul 2: Aceasta implică faptul că cel puțin una dintre verificările de paritate corespunzătoare generatorilor Stabilizer eșuează, adică trebuie să fie un vector propriu cu valoarea proprie al cel puțin unuia dintre generatorii Stabilizer . Spațiul codului al codului CSS este intersecția spațiilor proprii cu valoarea proprie ale generatorilor Stabilizer. Astfel, ca vector propriu cu valoarea proprie al cel puțin unuia dintre generatorii Stabilizer , este ortogonal pe spațiul codului:
Și acum, parcurgând toate șirurile de biți , eliminând pe cele pentru care și normalizând pe cele rămase, obținem vectorii descriși anterior, ceea ce demonstrează că ei generează spațiul codului.
Putem folosi și simetria dintre generatorii Stabilizer și pentru a descrie spațiul codului într-un mod similar, dar diferit. Mai precis, este spațiul generat de vectori de forma următoare.
În esență, și au fost interschimbate în fiecare loc în care apar — dar trebuie să interschimbăm și baza standard cu baza , motiv pentru care sunt incluse operațiile Hadamard.
Ca exemplu, să considerăm codul Steane de 7 qubiți. Șirurile de verificare a parității atât pentru generatorii Stabilizer , cât și pentru generatorii Stabilizer sunt aceleași: și Codurile și sunt prin urmare identice; ambele sunt egale cu codul -Hamming.
Codurile duale și sunt prin urmare și ele identice. Avem trei generatori, deci obținem opt șiruri.
Aceste șiruri sunt toate conținute în codul -Hamming, astfel că este îndeplinită condiția CSS: sau echivalent,
Dat fiind că conține jumătate din toate șirurile lui există doar doi vectori diferiți ce pot fi obținuți alegând Aceasta era de așteptat, deoarece codul Steane de 7 qubiți are un spațiu al codului bidimensional. Putem folosi cele două stări obținute astfel pentru a codifica starea logică și după cum urmează.
Ca de obicei, această alegere nu ne este impusă — suntem liberi să folosim spațiul codului pentru a codifica qubiți după cum dorim.