Kody CSS
Klasyczne kody liniowe
Klasyczne kody korekcji błędów były po raz pierwszy badane w latach 40. XX wieku i od tamtej pory poznano wiele różnych kodów. Najczęściej studiowane i stosowane kody należą do kategorii zwanej kodami liniowymi. Za chwilę zobaczymy dokładnie, co słowo „liniowy" oznacza w tym kontekście, ale bardzo prosto można to wyrazić już teraz: kody liniowe to kody stabilizatorowe, które akurat są klasyczne. Kody CSS to w istocie pary klasycznych kodów liniowych, łączone razem w celu stworzenia kwantowego kodu korekcji błędów. Żeby dobrze zrozumieć omawiane dalej zagadnienia, musimy najpierw poznać kilka podstawowych faktów o klasycznych kodach liniowych.
Niech będzie binarnym alfabetem w całej tej dyskusji. Przez klasyczny kod liniowy rozumiemy niepusty zbiór binarnych ciągów długości dla pewnej dodatniej liczby całkowitej który musi spełniać jedną podstawową własność: jeśli i są binarnymi ciągami należącymi do to ciąg również należy do Tutaj oznacza bitowe XOR ciągów i z którym spotykaliśmy się wielokrotnie w kursie „Fundamentals of quantum algorithms".
Mówiąc wprost: gdy klasyczny kod korekcji błędów nazywamy liniowym, traktujemy binarne ciągi długości jako -wymiarowe wektory o wpisach przyjmujących wartości lub i wymagamy, by sam kod tworzył podprzestrzeń liniową. Zamiast zwykłego dodawania wektorów nad liczbami rzeczywistymi lub zespolonymi stosujemy jednak dodawanie modulo czyli po prostu XOR. Oznacza to, że jeśli mamy dwa słowa kodowe i czyli i są binarnymi ciągami należącymi do to modulo 2, czyli musi być również słowem kodowym w Warto zauważyć, że ten warunek musi zachodzić nawet wtedy, gdy Wynika z tego, że musi zawierać ciąg samych zer ponieważ bitowe XOR dowolnego ciągu z samym sobą daje ciąg samych zer.
Przykład: 3-bitowy repetition code
3-bitowy repetition code jest przykładem klasycznego kodu liniowego. W szczególności mamy więc pod względem warunku liniowości są tylko dwie możliwe wartości i dwie możliwe wartości Łatwo sprawdzić wszystkie cztery możliwe pary i przekonać się, że bitowe XOR zawsze daje słowo kodowe:
Przykład: kod -Hamming
Oto kolejny przykład klasycznego kodu liniowego — kod -Hamming. Był jednym z pierwszych kiedykolwiek odkrytych klasycznych kodów korekcji błędów i składa się z tych 16 binarnych ciągów długości 7. (Czasami kod -Hamming rozumiany jest jako kod z tymi ciągami odwróconymi, ale tutaj przyjmujemy, że jest to kod zawierający ciągi pokazane poniżej.)
Za doborem tych ciągów stoi bardzo prosta logika, ale jest ona drugorzędna wobec tematu lekcji i nie będziemy jej tu wyjaśniać. Na razie wystarczy stwierdzić, że jest to klasyczny kod liniowy: XOR dowolnych dwóch spośród tych ciągów zawsze da inny ciąg należący do kodu.
Notacja (w pojedynczych nawiasach kwadratowych) oznacza coś analogicznego do notacji z podwójnymi nawiasami kwadratowymi dla kodów stabilizatorowych wspomnianej w poprzedniej lekcji, lecz dotyczy klasycznych kodów liniowych. W szczególności: słowa kodowe mają bitów, za pomocą kodu możemy zakodować bity (ponieważ istnieje słów kodowych), a odległość kodu wynosi , co oznacza, że dowolne dwa różne słowa kodowe muszą różnić się na co najmniej pozycjach — zatem co najmniej bity muszą zostać przekłamane, by zamienić jedno słowo kodowe w inne. Fakt, że jest to kod o odległości , oznacza, że może on korygować maksymalnie jeden błąd przekłamania bitu.
Opisywanie klasycznych kodów liniowych
Wspomniane przykłady są bardzo prostymi przykładami klasycznych kodów liniowych, jednak nawet kod -Hamming wygląda dość tajemniczo, gdy słowa kodowe są po prostu wypisane. Istnieją lepsze, bardziej efektywne sposoby opisywania klasycznych kodów liniowych, w tym dwa następujące.
-
Generatory. Jednym ze sposobów opisania klasycznego kodu liniowego jest minimalna lista słów kodowych, które generują kod, tzn. biorąc wszystkie możliwe podzbiory tych słów kodowych i wykonując na nich XOR, otrzymujemy cały kod.
Dokładniej, ciągi generują klasyczny kod liniowy jeśli
przy czym gdy oraz gdy i mówimy, że lista jest minimalna, jeśli usunięcie jednego z ciągów generuje mniejszy kod. Naturalny sposób myślenia o takim opisie to traktowanie zbioru jako bazy dla jako podprzestrzeni, gdzie ciągi traktujemy jako wektory o binarnych wpisach, pamiętając, że pracujemy w przestrzeni wektorowej, w której arytmetyka jest wykonywana modulo
-
Parity checks. Innym naturalnym sposobem opisania klasycznego kodu liniowego są parity checks — czyli minimalna lista binarnych ciągów, dla których ciągi należące do kodu to dokładnie te, których binarne iloczyny skalarne z każdym z tych ciągów parity check wynoszą zero. (Podobnie jak bitowe XOR, binarne iloczyny skalarne pojawiały się kilkakrotnie w kursie „Fundamentals of quantum algorithms".)
Oznacza to, że ciągi są ciągami parity check dla klasycznego kodu liniowego jeśli
a zbiór tych ciągów jest minimalny, gdy usunięcie jednego skutkuje większym kodem. Ciągi te nazywane są ciągami parity check, ponieważ ma binarny iloczyn skalarny równy zero z wtedy i tylko wtedy, gdy bity na pozycjach, gdzie ma jedynki, mają parzysty parity. Tak więc, aby sprawdzić, czy ciąg należy do kodu wystarczy sprawdzić parity pewnych podzbiorów bitów ciągu
Ważną rzeczą do zauważenia jest to, że binarny iloczyn skalarny nie jest iloczynem wewnętrznym w formalnym sensie. W szczególności, gdy dwa ciągi mają binarny iloczyn skalarny równy zero, nie oznacza to, że są ortogonalne w zwykłym sensie. Na przykład binarny iloczyn skalarny ciągu z samym sobą wynosi zero — możliwe jest zatem, że ciąg parity check dla klasycznego kodu liniowego sam należy do tego kodu.
Klasyczne kody liniowe nad binarnym alfabetem zawsze zawierają liczbę ciągów będącą potęgą — i dla pojedynczego klasycznego kodu liniowego opisanego na dwa opisane powyżej sposoby zawsze zachodzi W szczególności, jeśli mamy minimalny zbiór generatorów, kod koduje bitów i będziemy mieć słów kodowych; a jeśli mamy minimalny zbiór ciągów parity check, będziemy mieć słów kodowych. Tak więc każdy generator podwaja rozmiar przestrzeni kodu, podczas gdy każdy ciąg parity check ją o połowę zmniejsza.
Na przykład, 3-bitowy repetition code jest kodem liniowym, więc można go opisać na obydwa te sposoby. W szczególności, istnieje tylko jeden wybór generatora, który działa: Alternatywnie możemy opisać kod za pomocą dwóch ciągów parity check, takich jak i — które powinny być znajome z poprzednich dyskusji o tym kodzie — albo możemy wziąć ciągi parity check i bądź i (Generatory i ciągi parity check są na ogół niejednoznaczne dla danego klasycznego kodu liniowego.)
Jako drugi przykład rozważmy kod -Hamming. Oto jeden z możliwych wyborów listy generatorów, który działa.
A oto jeden z możliwych wyborów ciągów parity check dla tego kodu.
Warto przy okazji zauważyć, że wszystkie nasze ciągi parity check same należą do kodu.
Na koniec jedna uwaga dotycząca klasycznych kodów liniowych, która łączy je z formalizmem stabilizatorów: ciągi parity check są równoważne generatorom stabilizatorów składającym się wyłącznie z macierzy Pauli i macierzy jednostkowych. Na przykład ciągi parity check i dla 3-bitowego repetition code odpowiadają dokładnie generatorom stabilizatorów oraz co jest spójne z omówieniami obserwabli Pauli z poprzedniej lekcji.
Definition of CSS codes
Kody CSS to kody stabilizatorowe otrzymywane przez łączenie ze sobą określonych par klasycznych kodów liniowych. Nie działa to dla dowolnych dwóch klasycznych kodów liniowych — oba kody muszą spełniać pewien wzajemny warunek. Niemniej to podejście otwiera wiele możliwości w zakresie kwantowych kodów korekcji błędów, częściowo czerpiąc z ponad 75 lat klasycznej teorii kodowania.
W formalizmie stabilizatorowym generatory stabilizatora zawierające tylko macierze Pauli oraz tożsamościowe są równoważne parity check, co właśnie zaobserwowaliśmy na przykładzie 3-bitowego kodu repetycyjnego. Jako kolejny przykład rozważ następujące ciągi parity check dla kodu -Hamming.
Te ciągi parity check odpowiadają następującym generatorom stabilizatora (zapisanym bez symboli iloczynu tensorowego), które otrzymujemy, zastępując każde przez , a każde przez Są to trzy z sześciu generatorów stabilizatora dla 7-qubitowego kodu Steane'a.
Nadajmy generatorom stabilizatora tego rodzaju nazwę generatorów stabilizatora , co oznacza, że zawierają one wyłącznie czynniki tensorowe Pauli i tożsamości — a zatem macierze Pauli i nigdy nie występują w generatorach stabilizatora .
Możemy też rozważyć generatory stabilizatora, w których jako czynniki tensorowe pojawiają się tylko macierze i tożsamościowe. Takie generatory stabilizatora można traktować jako analogiczne do generatorów stabilizatora , z tą różnicą, że opisują parity check w bazie , a nie w bazie standardowej. Generatory stabilizatora tej postaci nazywane są generatorami stabilizatora — tym razem nie są dozwolone macierze Pauli ani .
Jako przykład rozważ pozostałe trzy generatory stabilizatora z 7-qubitowego kodu Steane'a.
Podążają dokładnie tym samym wzorcem z kodu -Hamming co generatory stabilizatora , z tą różnicą, że tym razem wstawiamy zamiast , a nie To, co otrzymujemy wyłącznie z tych trzech generatorów stabilizatora, to kod obejmujący 16 stanów pokazanych poniżej, które uzyskujemy, stosując operacje Hadamarda do stanów bazy standardowej odpowiadających ciągom w kodzie -Hamming. (Oczywiście przestrzeń kodu dla tego kodu obejmuje także kombinacje liniowe tych stanów.)
Możemy teraz zdefiniować kody CSS w bardzo prostych słowach.
Oznacza to, że kody CSS to kody stabilizatorowe, dla których mamy generatory stabilizatora, w których nie pojawiają się macierze Pauli , oraz w których i nigdy nie występują w tym samym generatorze stabilizatora.
Dla jasności, według tej definicji kod CSS to taki, dla którego możliwy jest wybór wyłącznie generatorów stabilizatora i — należy jednak pamiętać, że wybór generatorów stabilizatora dla kodów stabilizatorowych nie jest jednoznaczny. W związku z tym będą na ogół istnieć różne wybory generatorów stabilizatora kodu CSS, które nie są generatorami stabilizatora ani (oprócz co najmniej jednego wyboru, dla którego nimi są).
Oto bardzo prosty przykład kodu CSS zawierającego zarówno generator stabilizatora , jak i generator stabilizatora :
Jasno widać, że jest to kod CSS, ponieważ pierwszy generator stabilizatora jest generatorem stabilizatora , a drugi — generatorem stabilizatora . Oczywiście kod CSS musi być też poprawnym kodem stabilizatorowym — co oznacza, że generatory stabilizatora muszą komutować, tworzyć minimalny zbiór generujący i ustalać co najmniej jeden wektor stanu kwantowego. Te wymagania są łatwe do sprawdzenia w przypadku tego kodu. Jak zauważyliśmy w poprzedniej lekcji, przestrzeń kodu dla tego kodu to jednowymiarowa przestrzeń rozpiętana przez stan Bella . Fakt, że oba generatory stabilizatora ustalają ten stan, jest oczywisty po rozważeniu dwóch poniższych wyrażeń e-bitu wraz z interpretacją tych generatorów stabilizatora jako parity check w bazach i .
7-qubitowy kod Steane'a to kolejny przykład kodu CSS.
Mamy tutaj trzy generatory stabilizatora i trzy generatory stabilizatora , a poprawność tego kodu stabilizatorowego już zweryfikowaliśmy.
9-qubitowy kod Shora to kolejny przykład.
Tym razem mamy sześć generatorów stabilizatora i tylko dwa generatory stabilizatora . To jest w porządku — nie musi istnieć równowaga ani symetria między oboma typami generatorów (choć często tak jest).
Jeszcze raz warto podkreślić, że kody CSS muszą być poprawnymi kodami stabilizatorowymi, a w szczególności każdy generator stabilizatora musi komutować z ka żdym generatorem stabilizatora . A zatem nie każda kolekcja generatorów stabilizatora i definiuje poprawny kod CSS.
Wykrywanie i korekcja błędów
Jeśli chodzi o wykrywanie i korekcję błędów, kody CSS mają ogólnie podobną właściwość do 9-qubitowego kodu Shora — mianowicie błędy i można wykrywać i korygować całkowicie niezależnie; generatory stabilizer dla opisują kod chroniący przed przerzuceniami bitów, a generatory stabilizer dla opisują kod niezależnie chroniący przed przerzuceniami fazy. Działa to dlatego, że generatory stabilizer dla koniecznie komutują zarówno z błędami , jak i z operacjami stosowanymi jako korekty — są więc na nie całkowicie obojętne; analogicznie dzieje się z generatorami stabilizer dla , błędami i korektami .
Jako przykład rozważmy 7-qubitowy kod Steane'a.
Podstawowa idea tego kodu jest teraz wyraźna: to kod Hamminga dla błędów przerzucenia bitu oraz kod Hamminga dla błędów przerzucenia fazy. To, że generatory stabilizer dla i komutują, można uznać za szczęśliwy zbieg okoliczności — gdyby tak nie było, nie mielibyśmy poprawnego kodu stabilizer. Istnieje jednak wiele znanych przykładów klasycznych kodów liniowych, które użyte w analogiczny sposób dają poprawny kod stabilizer.
Ogólnie rzecz biorąc, przyjmijmy, że mamy kod CSS, w którym generatory stabilizer dla pozwalają korygować do błędów przerzucenia bitu, a generatory stabilizer dla pozwalają korygować do błędów przerzucenia fazy. Na przykład dla kodu Steane'a i , gdyż kod Hamminga potrafi skorygować jedno przerzucenie bitu. Wynika z tego, na mocy dyskretyzacji błędów, że ten kod CSS może korygować dowolny błąd na liczbie kubitów nieprzekraczającej minimum z i Dzieje się tak dlatego, że podczas pomiaru syndrome arbitralny błąd na takiej liczbie kubitów probabilistycznie zapada się do pewnej kombinacji błędów , błędów lub obu — a następnie błędy i są wykrywane i korygowane niezależnie.
Podsumowując: o ile dysponujemy dwoma klasycznymi kodami liniowymi (lub dwoma kopiami jednego klasycznego kodu liniowego), które są ze sobą zgodne w tym sensie, że definiują generatory stabilizer dla i komutujące ze sobą, to uzyskany przez ich połączenie kod CSS dziedziczy własności korekcji błędów obu tych kodów w opisany właśnie sposób.
Należy jednak zauważyć, że wiąże się z tym pewna cena: nie możemy kodować tylu kubitów, ile bitów dałoby się zakodować za pomocą tych dwóch kodów klasycznych. Wynika to stąd, że całkowita liczba generatorów stabilizer kodu CSS jest sumą liczby parity check obu klasycznych kodów liniowych, a każdy generator stabilizer zmniejsza wymiar przestrzeni kodu o połowę. Na przykład kod Hamminga pozwala kodować cztery klasyczne bity, bo ma tylko trzy łańcuchy parity check, natomiast 7-qubitowy kod Steane'a koduje tylko jeden qubit, gdyż ma sześć generatorów stabilizer.
Przestrzenie kodowe kodów CSS
Ostatnią rzeczą, którą zrobimy w tym omówieniu kodów CSS, jest rozważenie przestrzeni kodowych tych kodów. Da nam to możliwość bardziej szczegółowego zbadania relacji, która musi zachodzić między dwoma klasycznymi kodami liniowymi, aby były one kompatybilne w tym sensie, że można je połączyć w kod CSS.
Rozważmy dowolny kod CSS na kubitach i niech będą -bitowymi ciągami parity check odpowiadającymi generatorom stabilizatora tego kodu. Oznacza to, że klasyczny kod liniowy opisany wyłącznie przez generatory stabilizatora , który nazwiemy przyjmuje następującą postać.
Innymi słowy, klasyczny kod liniowy zawiera każdy ciąg, którego binarny iloczyn skalarny z każdym z ciągów parity check wynosi zero.
Analogicznie, niech będą -bitowymi ciągami parity check odpowiadającymi generatorom stabilizatora naszego kodu. Zatem klasyczny kod liniowy odpowiadający generatorom stabilizatora przyjmuje następującą postać.
Same generatory stabilizatora opisują zatem kod podobny do tego kodu, ale w bazie zamiast w bazie standardowej.
Teraz wprowadzimy dwa nowe klasyczne kody liniowe, które są wyprowadzone z tych samych wyborów ciągów, oraz ale gdzie traktujemy te ciągi jako generatory zamiast ciągów parity check. W szczególności otrzymujemy te dwa kody.
Są one znane jako kody dualne kodów zdefiniowanych wcześniej: jest kodem dualnym do a jest kodem dualnym do W tym miejscu może nie być jasne, dlaczego te kody dualne są istotne, ale okazują się one być dość istotne z wielu powodów, w tym z dwóch powodów wyjaśnionych w następnych akapitach.
Po pierwsze, warunki, które muszą być spełnione, aby dwa klasyczne kody liniowe i były kompatybilne, w tym sensie, że można je połączyć w kod CSS, można opisać w prostych słowach, odwołując się do kodów dualnych. Mówiąc dokładniej, musi zachodzić lub równoważnie, Innymi słowy, kod dualny zawiera ciągi odpowiadające generatorom stabilizatora a ich zawieranie się w jest równoważne temu, że binarny iloczyn skalarny każdego z tych ciągów z ciągami odpowiadającymi generatorom stabilizatora jest zerowy. To z kolei jest równoważne temu, że każdy generator stabilizatora komutuje z każdym generatorem stabilizatora Alternatywnie, zamieniając role generatorów stabilizatorów i oraz wychodząc od zawierania możemy dojść do tego samego wniosku.
Po drugie, odwołując się do kodów dualnych, możemy łatwo opisać przestrzenie kodowe danego kodu CSS. W szczególności przestrzeń kodowa jest rozpinana przez wektory następującej postaci.
Innymi słowy, wektory te są jednorodnymi superpozycjami ciągów z kodu dualnego kodu odpowiadającego generatorom stabilizatora przesuniętymi przez (innymi słowy, zXORowanymi bitowo z) ciągi z kodu odpowiadającego generatorom stabilizatora Dla jasności, różne wybory przesunięcia — reprezentowanego przez ciąg w tym wyrażeniu — mogą prowadzić do tego samego wektora. Zatem te stany nie są wszystkie różne, ale razem rozpinają całą przestrzeń kodową.
Oto intuicyjne wyjaśnienie, dlaczego takie wektory znajdują się w przestrzeni kodowej i ją rozpinają. Rozważmy -kubitowy stan bazy standardowej dla dowolnego -bitowego ciągu i załóżmy, że rzutujemy ten stan na przestrzeń kodową. To znaczy, oznaczając przez rzutowanie na przestrzeń kodową naszego kodu CSS, rozważmy wektor Są dwa przypadki:
-
Przypadek 1: To oznacza, że każdy generator stabilizatora naszego kodu CSS działa trywialnie na Z kolei generatory stabilizatora po prostu odwracają niektóre bity W szczególności, dla każdego generatora z generator stabilizatora odpowiadający przekształca w Charakteryzując rzutowanie jako średnią po elementach stabilizatora (jak widzieliśmy w poprzedniej lekcji), otrzymujemy następujący wzór:
-
Przypadek 2: To oznacza, że co najmniej jeden z parity checków odpowiadających generatorom stabilizatora nie jest spełniony, czyli musi być wektorem własnym o wartości własnej co najmniej jednego z generatorów stabilizatora Przestrzeń kodowa kodu CSS jest przecięciem podprzestrzeni własnych o wartości własnej generatorów stabilizatora. Zatem, jako wektor własny o wartości własnej co najmniej jednego z generatorów stabilizatora jest ortogonalny do przestrzeni kodowej:
A teraz, przechodząc po wszystkich -bitowych ciągach odrzucając te, dla których i normalizując pozostałe, otrzymujemy wektory opisane wcześniej, co pokazuje, że rozpinają one przestrzeń kodową.
Możemy również wykorzystać symetrię między generatorami stabilizatorów i aby opisać przestrzeń kodową w podobny, ale inny sposób. W szczególności jest to przestrzeń rozpinana przez wektory o następującej postaci.
Zasadniczo, i zostały zamienione w każdym przypadku, w którym występują — ale musimy również zamienić bazę standardową na bazę dlatego uwzględniono operacje Hadamarda.
Jako przykład rozważmy 7-kubitowy kod Steane'a. Ciągi parity check zarówno dla generatorów stabilizatora jak i są takie same: oraz Kody i są zatem takie same; oba są równe kodowi Hamminga
Kody dualne i są zatem również takie same. Mamy trzy generatory, więc otrzymujemy osiem ciągów.
Wszystkie te ciągi zawierają się w kodzie Hamminga więc warunek CSS jest spełniony: lub równoważnie,
Biorąc pod uwagę, że zawiera połowę wszystkich ciągów z istnieją tylko dwa różne wektory które można uzyskać, wybierając Jest to oczekiwane, ponieważ 7-kubitowy kod Steane'a ma dwuwymiarową przestrzeń kodową. Możemy użyć dwóch stanów, które otrzymujemy w ten sposób, aby zakodować stany logiczne i w następujący sposób.
Jak zwykle, ten wybór nie jest nam narzucony — możemy dowolnie korzystać z przestrzeni kodowej do kodowania kubitów według własnego uznania.