Codul Toric
În continuare vom discuta despre un cod CSS specific, cunoscut sub numele de codul Toric, descoperit de Alexei Kitaev în 1997. De fapt, codul Toric nu este un singur cod, ci mai degrabă o familie de coduri, câte unul pentru fiecare număr întreg pozitiv începând de la 2. Aceste coduri au câteva proprietăți cheie:
-
Generatorii Stabilizer au pondere mică și, în special, toți au ponderea 4. În limbajul teoriei codurilor, codul Toric este un exemplu de cod cuantic de verificare a parității cu densitate scăzută, sau cod cuantic LDPC (unde scăzut înseamnă 4 în acest caz). Acest lucru este avantajos deoarece fiecare măsurare a unui generator Stabilizer nu trebuie să implice prea mulți qubiți.
-
Codul Toric are localitate geometrică. Aceasta înseamnă că nu numai că generatorii Stabilizer au pondere mică, dar este posibil și să aranjezi qubiții spațial astfel încât fiecare măsurare a generatorului Stabilizer să implice doar qubiți aflați în apropiere. În principiu, acest lucru face aceste măsurări mai ușor de implementat decât dacă ar implica qubiți aflați la distanță în spațiu.
-
Membrii familiei de coduri Toric au o distanță din ce în ce mai mare și pot tolera o rată de eroare relativ ridicată.
Descrierea codului Toric
Fie un număr întreg pozitiv și considerăm o rețea cu așa-numite frontiere periodice. De exemplu, această figură ilustrează o rețea pentru
Observi că liniile din dreapta și de jos sunt linii punctate. Aceasta indică faptul că linia punctată din dreapta este aceeași linie cu linia din stânga extremă, iar similar, linia punctată de jos este aceeași cu cea din partea de sus.
Pentru a realiza fizic acest tip de configurație sunt necesare trei dimensiuni. În particular, am putea forma rețeaua într-un cilindru potrivind mai întâi laturile stângă și dreaptă, iar apoi să îndoim cilindrul astfel încât cercurile de la capete, care erau anterior marginile de sus și de jos ale rețelei, să se întâlnească. Sau am putea potrivi mai întâi sus și jos și apoi laturile; funcționează în ambele sensuri și nu contează pe care îl alegem în scopul acestei discuții.
Ceea ce obținem este un tor — sau, cu alte cuvinte, un covrig (deși a-l gândi ca pe camera unui pneu este poate o imagine mai potrivită, deoarece nu este un solid: rețeaua a devenit doar suprafața unui tor). De aici vine numele „codul Toric".
Modul în care te poți „deplasa" pe un tor ca acesta, între puncte adiacente ale rețelei, va fi probabil familiar celor care au jucat jocuri video retro, unde deplasarea în afara marginii de sus a ecranului te face să apari în jos, și la fel pentru marginile stângă și dreaptă ale ecranului. Astfel vom privi această rețea cu frontiere periodice, în loc să vorbim specific despre un tor în spațiul tridimensional.
În continuare, qubiții sunt aranjați pe muchiile acestei rețele, după cum ilustrează figura de mai jos, unde qubiții sunt indicați prin cercuri albastre pline.
Observă că qubiții plasați pe liniile punctate nu sunt plini deoarece sunt deja reprezentați pe liniile cele mai de sus și cele mai din stânga ale rețelei. În total există qubiți: qubiți pe linii orizontale și qubiți pe linii verticale.
Pentru a descrie codul Toric în sine, mai rămâne de descris generatorii Stabilizer:
-
Pentru fiecare celulă formată de liniile din rețea există un generator Stabilizer , obținut prin tensorizarea matricelor pe cei patru qubiți care ating acea celulă, împreună cu matricele identitate pe toți ceilalți qubiți.
-
Pentru fiecare vârf format de liniile din rețea există un generator Stabilizer , obținut prin tensorizarea matricelor pe cei patru qubiți adiacenți acelui vârf, împreună cu matricele identitate pe toți ceilalți qubiți.
În ambele cazuri obținem o operație Pauli de pondere 4. Individual, acești generatori Stabilizer pot fi ilustrați după cum urmează.
Iată o ilustrație care arată câteva exemple de generatori Stabilizer în contextul rețelei în sine. Observă că sunt incluși și generatorii Stabilizer care se înfășoară în jurul frontierelor periodice. Acești generatori care se înfășoară în jurul frontierelor periodice nu sunt speciali și nu se disting în niciun fel de cei care nu o fac.
Generatorii Stabilizer trebuie să comute pentru ca acesta să fie un cod Stabilizer valid. Ca de obicei, toți generatorii Stabilizer comută între ei, deoarece comută cu el însuși și identitatea comută cu orice, și la fel pentru generatorii Stabilizer . Generatorii Stabilizer și comută evident atunci când acționează netrivial pe seturi disjuncte de qubiți, ca în exemplele din figura anterioară. Posibilitatea rămasă este că un generator Stabilizer și un generator Stabilizer se suprapun pe qubiții pe care acționează netrivial, și de fiecare dată când se întâmplă aceasta, generatorii trebuie să se suprapună întotdeauna pe doi qubiți, ca în figura următoare.
În consecință, doi generatori Stabilizer ca aceștia comută, la fel cum și comută. Generatorii Stabilizer comută, prin urmare, toți între ei.
A doua condiție necesară pentru generatorii Stabilizer ai unui cod Stabilizer este că aceștia formează un set minimal de generatori. Această condiție nu este satisfăcută de această colecție: dacă înmulțim toți generatorii Stabilizer împreună, obținem operația identitate, și la fel pentru generatorii Stabilizer . Astfel, oricare dintre generatorii Stabilizer poate fi exprimat ca produsul tuturor celorlalți, și similar, oricare dintre generatorii Stabilizer poate fi exprimat ca produsul generatorilor Stabilizer rămași. Dacă eliminăm oricare unul dintre generatorii Stabilizer și oricare unul dintre generatorii Stabilizer , obținem totuși un set minimal de generatori.
Pentru a fi clar în privința aceasta, ne pasă în egală măsură de toți generatorii Stabilizer și, dintr-un punct de vedere strict operațional, nu este nevoie să selectăm un generator Stabilizer de fiecare tip pentru a-l elimina. Dar, pentru a analiza codul — și a număra generatorii în particular — putem imagina că un generator Stabilizer de fiecare tip a fost eliminat, pentru a obține un set minimal de generatori, ținând cont că am putea întotdeauna deduce rezultatele acestor generatori eliminați (gândindu-ne la ei ca la observabile) din rezultatele tuturor celorlalte observabile ale generatorilor Stabilizer de același tip.
Aceasta lasă generatori Stabilizer de fiecare tip, sau în total, într-un set minimal de generatori (ipotetic). Dat fiind că există qubiți în total, aceasta înseamnă că codul Toric codifică qubiți.
Condiția finală cerută generatorilor Stabilizer este că cel puțin un vector de stare cuantică este fixat de toți generatorii Stabilizer. Vom vedea că acesta este cazul pe măsură ce continuăm analiza codului, dar este de asemenea posibil să argumentăm că nu există nicio modalitate de a genera înmulțit cu identitatea pe toți qubiții din generatorii Stabilizer.
Detectarea erorilor
Codul Toric are o descriere simplă și elegantă, dar proprietățile sale de corectare a erorilor cuantice pot să nu fie deloc clare la prima vedere. Se dovedește că este un cod uimitor! Pentru a înțelege de ce și cum funcționează, să începem prin a considera diferite erori și sindroamele pe care le generează.
Codul Toric este un cod CSS, deoarece toți generatorii noștri Stabilizer sunt fie generatori Stabilizer , fie . Aceasta înseamnă că erorile și erorile pot fi detectate (și posibil corectate) separat. De fapt, există o simetrie simplă între generatorii Stabilizer și care ne permite să analizăm erorile și erorile în esență în același mod. Deci, ne vom concentra pe erorile , care sunt posibil detectate de generatorii Stabilizer — dar întreaga discuție care urmează poate fi tradusă de la erorile la erorile , care sunt detectate în mod analog de generatorii Stabilizer .
Diagrama de mai jos ilustrează efectul unei erori pe un singur qubit. Ipoteza este că cei qubiți ai noștri se aflau anterior într-o stare conținută în spațiul codului Toric, determinând toate măsurările generatorilor Stabilizer să producă Generatorii Stabilizer detectează erorile și există câte un astfel de generator Stabilizer pentru fiecare celulă din figură, deci putem indica rezultatul măsurării generatorului Stabilizer corespunzător prin culoarea acelei celule: Rezultatele sunt indicate prin celule albe, iar rezultatele sunt indicate prin celule gri. Dacă apare o eroare de inversare a biților pe unul dintre qubiți, efectul este că măsurările generatorilor Stabilizer corespunzătoare celor două celule care ating qubit-ul afectat produc acum
Aceasta este intuitivă atunci când considerăm generatorii Stabilizer și comportamentul lor. În esență, fiecare generator Stabilizer măsoară paritatea celor patru qubiți care ating celula corespunzătoare (față de baza standard). Deci, un rezultat nu indică faptul că nu au avut loc erori pe acești patru qubiți, ci mai degrabă indică faptul că a avut loc un număr par de erori pe acești qubiți, în timp ce un rezultat indică faptul că a avut loc un număr impar de erori . O singură eroare inversează, prin urmare, paritatea celor patru biți de pe ambele celule pe care le atinge, determinând măsurările generatorilor Stabilizer să producă
Să introducem acum mai multe erori pentru a vedea ce se întâmplă. În particular, vom considera un lanț de erori adiacente, unde două erori sunt adiacente dacă afectează qubiți care ating aceeași celulă.
Cei doi generatori Stabilizer de la capetele lanțului produc ambii rezultatul în acest caz, deoarece a avut loc un număr impar de erori pe acele două celule corespunzătoare. Toți ceilalți generatori Stabilizer , pe de altă parte, produc rezultatul inclusiv cei care ating lanțul, dar nu la capete, deoarece a avut loc un număr par de erori pe qubiții care ating celulele corespunzătoare.
Astfel, atât timp cât avem un lanț de erori cu capete, codul Toric va detecta că au avut loc erori, rezultând în rezultate de măsurare pentru generatorii Stabilizer corespunzătoare capetelor lanțului. Observă că lanțul real de erori nu este dezvăluit, ci doar capetele! Aceasta este în regulă — în subsecțiunea următoare vom vedea că nu avem nevoie să știm exact care qubiți au fost afectați de erori pentru a le corecta. (Codul Toric este un exemplu de cod foarte degenerat, în sensul că în general nu identifică în mod unic erorile pe care le corectează.)
Cu toate acestea, este posibil ca un lanț de erori adiacente să nu aibă capete, adică un lanț de erori ar putea forma o buclă închisă, ca în figura de mai jos.
Într-un astfel de caz, a avut loc un număr par de erori pe fiecare celulă, deci fiecare măsurare a generatorului Stabilizer produce un rezultat . Buclele închise de erori adiacente nu sunt, prin urmare, detectate de cod.
Acest lucru poate părea dezamăgitor, deoarece avem nevoie de doar patru erori pentru a forma o buclă închisă (și sperăm la ceva mult mai bun decât un cod de distanță 4). Cu toate acestea, o buclă închisă de erori de forma ilustrată în figura anterioară nu este de fapt o eroare — deoarece se află în Stabilizer! Amintește-ți că, pe lângă generatorii Stabilizer , avem și un generator Stabilizer pentru fiecare vârf al rețelei. Și dacă înmulțim generatorii Stabilizer adiacenți împreună, rezultatul este că obținem bucle închise de operații . De exemplu, bucla închisă din figura anterioară poate fi obținută prin înmulțirea generatorilor Stabilizer indicați în figura de mai jos.
Acesta nu este, totuși, singurul tip de buclă închisă de erori pe care le putem avea — și nu este adevărat că fiecare buclă închisă de erori este inclusă în Stabilizer. În particular, diferitele tipuri de bucle pot fi caracterizate după cum urmează.
-
Bucle închise de erori cu un număr par de erori pe fiecare linie orizontală și fiecare linie verticală de qubiți. (Exemplul arătat mai sus se încadrează în această categorie.) Buclele de această formă sunt întotdeauna conținute în Stabilizer, deoarece pot fi reduse la nimic în mod efectiv prin înmulțirea lor cu generatorii Stabilizer .
-
Bucle închise de erori cu un număr impar de erori pe cel puțin o linie orizontală sau cel puțin o linie verticală de qubiți. Buclele de această formă nu sunt niciodată conținute în Stabilizer și reprezintă, prin urmare, erori netriviale care trec nedetectate de cod.
Un exemplu de buclă închisă de erori din a doua categorie este prezentat în diagrama de mai jos.
Un astfel de lanț de erori nu este conținut în Stabilizer deoarece fiecare generator Stabilizer plasează un număr par de operații pe fiecare linie orizontală și fiecare linie verticală de qubiți. Acesta este, prin urmare, un exemplu real de eroare netrivială pe care codul nu reușește să o detecteze.
Cheia este că singurul mod de a forma o buclă de al doilea tip este să treci în jurul torului, adică fie în jurul găurii din mijlocul torului, prin ea, sau ambele. Intuitiv vorbind, un lanț de erori ca acesta nu poate fi redus la nimic prin înmulțirea lui cu generatorii Stabilizer deoarece topologia unui tor o interzice. Codul Toric este uneori categorisit ca un cod cuantic topologic de corectare a erorilor din acest motiv. Cea mai scurtă lungime a unei astfel de bucle este și prin urmare aceasta este distanța codului Toric: orice buclă închisă de erori cu lungime mai mică decât trebuie să se încadreze în prima categorie și este, prin urmare, conținută în Stabilizer; și orice lanț de erori cu capete este detectat de cod.
Dat fiind că codul Toric utilizează qubiți pentru a codifica qubiți și are distanța rezultă că este un cod Stabilizer .
Corectarea erorilor
Am discutat detectarea erorilor pentru codul Toric, și acum vom discuta pe scurt cum să corectăm erorile. Codul Toric este un cod CSS, deci erorile și erorile pot fi detectate și corectate independent. Menținând atenția pe generatorii Stabilizer , care detectează erorile , să considerăm cum poate fi corectat un lanț de erori . (Erorile sunt corectate într-un mod simetric.)
Dacă apare un sindrom diferit de sindromul atunci când generatorii Stabilizer sunt măsurați, rezultatele dezvăluie capetele unuia sau mai multor lanțuri de erori . Putem încerca să corectăm aceste erori asociind în perechi rezultatele și formând un lanț de corecții între ele. Când facem aceasta, are sens să alegem cele mai scurte căi de-a lungul cărora au loc corecțiile.
De exemplu, consideră diagrama de mai jos, care ilustrează un sindrom cu două rezultate , indicate prin celule gri, cauzate de un lanț de erori ilustrat prin linia și cercurile magenta. Cum am remarcat deja, lanțul în sine nu este dezvăluit de sindrom; numai capetele sunt vizibile.
Pentru a încerca să corectăm acest lanț de erori, se selectează cea mai scurtă cale între rezultatele de măsurare și se aplică Gate-uri ca și corecții qubiților de-a lungul acestei căi (indicate în galben în figură). Deși corecțiile pot să nu corespundă cu lanțul real de erori, erorile și corecțiile împreună formează o buclă închisă de operații care este conținută în Stabilizer-ul codului. Corecția este, prin urmare, reușită în această situație, deoarece efectul combinat al erorilor și corecțiilor este să nu schimbe nimic la o stare codificată.
Această strategie nu va fi întotdeauna reușită. De exemplu, o explicație diferită pentru același sindrom ca în figura anterioară este prezentată în figura de mai jos.
De data aceasta, același lanț de corecții ca înainte nu reușește să corecteze acest lanț de erori, deoarece efectul combinat al erorilor și corecțiilor este că obținem o buclă închisă de operații care se înfășoară în jurul torului și, prin urmare, are un efect netrivial asupra spațiului codului. Deci, nu există nicio garanție că strategia tocmai descrisă, de a alege cea mai scurtă cale de corecții între două rezultate de măsurare a sindromului , va corecta corect eroarea care a cauzat acest sindrom.
Poate mai probabil, în funcție de modelul de zgomot, este că se măsoară un sindrom cu mai mult de două intrări , cum sugerează figura de mai jos.
Într-un astfel de caz, există diferite strategii de corecție cunoscute. O strategie naturală este să încerci să asociezi în perechi rezultatele de măsurare și să efectuezi corecții de-a lungul celor mai scurte căi care conectează perechile, după cum este indicat în figură cu galben. În particular, se poate calcula o potrivire perfectă de greutate minimă între rezultatele de măsurare , iar apoi perechile sunt conectate prin cele mai scurte căi de corecții . Calculul unei potriviri perfecte de greutate minimă poate fi realizat eficient cu un algoritm clasic cunoscut sub numele de algoritmul blossom, descoperit de Edmonds în anii 1960.
Această abordare nu este în general optimă pentru cele mai frecvent studiate modele de zgomot, dar pe baza simulărilor numerice funcționează foarte bine în practică sub o rată de zgomot de aproximativ 10%, presupunând erori Pauli independente unde și sunt la fel de probabile.