Przejdź do głównej treści

Klasyczne obliczenia na komputerach kwantowych

Teraz skupimy się na implementowaniu klasycznych algorytmów na komputerach kwantowych. Zobaczymy, że każde obliczenie, które można wykonać za pomocą klasycznego obwodu boolowskiego, może być również wykonane przez obwód kwantowy o podobnym asymptotycznym koszcie obliczeniowym. Co więcej, można to zrobić w „czysty" sposób, który zostanie wkrótce opisany — jest to ważny wymóg przy stosowaniu tych obliczeń jako podprogramów wewnątrz większych obliczeń kwantowych.

Symulowanie obwodów boolowskich za pomocą obwodów kwantowych

Obwody boolowskie składają się z bramek AND, OR, NOT i FANOUT. Aby symulować obwody boolowskie za pomocą obwodów kwantowych, zaczniemy od pokazania, jak każdą z tych czterech bramek można zasymulować przez bramki kwantowe. Gdy to zostanie zrobione, zamiana danego obwodu boolowskiego na obwód kwantowy jest prostą kwestią symulowania jednej bramki na raz. Do tego celu potrzebujemy jedynie bramek NOT, kontrolowanych-NOT oraz Toffoli — wszystkie są operacjami deterministycznymi, a zarazem unitarnymi.

Bramki Toffoli

Bramki Toffoli można alternatywnie opisać jako bramki kontrolowane-kontrolowane-NOT, których działanie na stanach bazy standardowej przedstawia poniższy rysunek.

Toffoli gate

Pamiętając, że stosujemy konwencję kolejności Qiskit, w której kubity są uporządkowane rosnąco według znaczenia od góry do dołu, macierzowa reprezentacja tej bramki jest następująca.

(1000000001000000001000000000000100001000000001000000001000010000)\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \end{pmatrix}

Innym sposobem myślenia o bramkach Toffoli jest traktowanie ich jako bramek zapytaniowych dla funkcji AND — w tym sensie, że realizują wzorzec, który widzieliśmy w poprzedniej lekcji dla unitarnych implementacji bramek zapytaniowych dowolnych funkcji o wejściach i wyjściach będących ciągami binarnymi.

Bramki Toffoli nie są zawarte w domyślnym zestawie bramek omówionym wcześniej w tej lekcji, ale możliwe jest zbudowanie bramki Toffoli z bramek H,H, T,T, TT^{\dagger} i CNOT w następujący sposób.

Quantum circuit for a Toffoli gate

Symulowanie bramek boolowskich za pomocą Toffoli, kontrolowanych-NOT i NOT

Pojedyncza bramka Toffoli, użyta w połączeniu z kilkoma bramkami NOT, może zaimplementować bramkę AND i OR, a bramki FANOUT można łatwo zaimplementować przy użyciu bramek CNOT, co sugerują poniższe diagramy.

Simulating AND and OR gates with Toffoli gates

We wszystkich trzech przypadkach kubity, na które działają bramki AND, OR i FANOUT, wchodzą z lewej strony jako wejścia, a dla każdej z nich potrzebujemy jeszcze jednego kubitu przestrzeni roboczej zainicjalizowanego do stanu zero. Te kubity przestrzeni roboczej są pokazane wewnątrz prostokątów reprezentujących implementacje bramek, co sugeruje, że są nowe, a zatem stanowią część kosztu tych implementacji.

W przypadku bramek AND i OR mamy również dwa nadmiarowe kubity, poza kubitem wyjściowym. Na przykład wewnątrz prostokąta na diagramie reprezentującego symulację bramki AND, dwa górne kubity pozostają w stanach a\vert a\rangle i b.\vert b\rangle. Kubity te są pokazane jako pozostające wewnątrz prostokątów, ponieważ nie są już potrzebne i nie są częścią wyjścia. Na razie można je zignorować, choć wkrótce do nich wrócimy.

Pozostała bramka boolowska, NOT, jest zawarta w naszym domyślnym zestawie bramek kwantowych, więc nie potrzebujemy dla niej symulacji.

Symulowanie obwodów boolowskich bramka po bramce

Załóżmy teraz, że mamy zwykły obwód boolowski o nazwie C,C, złożony z bramek AND, OR, NOT i FANOUT, mający nn bitów wejściowych i mm bitów wyjściowych. Niech t=size(C)t = \operatorname{size}(C) będzie liczbą bramek w C,C, a funkcję obliczaną przez CC nazwijmy ff — przyjmuje ona postać

f:ΣnΣmf:\Sigma^n\rightarrow\Sigma^m

dla Σ={0,1}.\Sigma = \{0,1\}.

Teraz zastanówmy się, co się dzieje, gdy przechodzimy kolejno przez bramki AND, OR i FANOUT obwodu C,C, zastępując każdą z nich odpowiednią symulacją opisaną powyżej, w tym dodając wymagane kubity przestrzeni roboczej. Nazwijmy wynikowy obwód RR i uporządkujmy kubity RR tak, aby nn bitów wejściowych CC odpowiadało górnym nn kubitom R,R, a kubity przestrzeni roboczej znajdowały się na dole.

Reversible circuit simulation

Tutaj kk to liczba wymaganych kubitów przestrzeni roboczej — po jednym dla każdej bramki AND, OR i FANOUT obwodu CC — a gg to funkcja postaci g:ΣnΣn+kmg:\Sigma^n \rightarrow \Sigma^{n+k-m} opisująca stany nadmiarowych kubitów tworzonych przez symulacje bramek po uruchomieniu RR. Na rysunku kubity odpowiadające wyjściu f(x)f(x) znajdują się na górze, a pozostałe, nadmiarowe kubity przechowujące g(x)g(x) — na dole. Możemy to wymusić, jeśli chcemy, poprzez przestawienie kubitów za pomocą bramek SWAP, które można zaimplementować przy użyciu trzech bramek CNOT w następujący sposób:

Swapping with cNOT gates

Jak zobaczymy w następnej sekcji, przestawianie kubitów wyjściowych w ten sposób nie jest tak naprawdę konieczne, ale wystarczająco łatwe do wykonania, jeśli zdecydujemy się na to.

Funkcja gg opisująca klasyczne stany nadmiarowych kubitów jest wyznaczona przez obwód C,C, ale w zasadzie nie musimy się nią zbytnio przejmować; nie interesuje nas konkretny stan tych kubitów po zakończeniu obliczeń. Litera gg następuje po f,f, więc jest rozsądną nazwą dla tej funkcji z tego powodu, ale jest lepszy powód, żeby wybrać nazwę gg — jest skrótem od garbage (ang. śmieci).

Sprzątanie śmieci

Jeśli naszym jedynym celem jest obliczenie funkcji ff wyliczanej przez dany obwód boolowski CC za pomocą obwodu kwantowego, nie musimy iść dalej niż symulacja bramka po bramce opisana powyżej. Oznacza to, że oprócz wyjścia funkcji, zostanie nam sporo śmieci.

Jednak to nie wystarczy, jeśli chcemy wykonywać klasyczne obliczenia jako podprogramy w ramach większych obliczeń kwantowych, ponieważ te nadmiarowe kubity będą powodować problemy. Zjawisko interferencji ma kluczowe znaczenie dla algorytmów kwantowych, a nadmiarowe kubity mogą niszczyć wzorce interferencji niezbędne do prawidłowego działania algorytmów kwantowych.

Na szczęście nie jest trudno posprzątać te śmieci. Kluczem jest skorzystanie z faktu, że ponieważ RR jest obwodem kwantowym, możemy uruchomić go w odwrotnej kolejności — po prostu zastępując każdą bramkę jej odwrotnością i stosując je w odwrotnej kolejności, uzyskując tym samym obwód kwantowy dla operacji R.R^{\dagger}. Bramki Toffoli, CNOT i NOT są w rzeczywistości swoimi własnymi odwrotnościami, więc uruchomienie RR w odwrotnej kolejności sprowadza się do zastosowania bramek w odwrotnej kolejności — ale ogólnie każdy obwód kwantowy można odwrócić w sposób właśnie opisany.

Konkretnie możemy dodać mm kolejnych kubitów (przypominając, że funkcja ff ma mm bitów wyjściowych), użyć bramek CNOT do skopiowania wyjścia RR na te kubity, a następnie odwrócić R,R, aby posprzątać śmieci. Poniższy rysunek ilustruje wynikowy obwód i opisuje jego działanie na stanach bazy standardowej.

Garbage-free computation

Jeśli obudujemy cały obwód w prostokąt i nazwiemy go Q,Q, wygląda to następująco:

Simulation as a query gate

Przy założeniu, że CC ma tt bramek, obwód QQ będzie miał O(t)O(t) bramek.

Jeśli pominiemy kk dodatkowych kubitów przestrzeni roboczej, otrzymujemy obwód Q,Q, który działa dokładnie jak bramka zapytaniowa dla funkcji f.f. Jeśli chcemy po prostu obliczyć funkcję ff dla pewnego ciągu x,x, możemy ustawić y=0my = 0^m i wynikowa wartość f(x)f(x) pojawi się na dolnych mm kubitach — lub możemy podać inny stan dla dolnych mm kubitów, jeśli chcemy (być może, żeby skorzystać z efektu phase kickback, jak w algorytmie Deutscha lub Deutscha-Jozsy).

Oznacza to, że dla dowolnego algorytmu zapytaniowego, jeśli mamy obwód boolowski obliczający funkcję wejściową, możemy zastąpić każdą bramkę zapytaniową jej implementacją w postaci obwodu — i algorytm zapytaniowy będzie działał poprawnie.

Zauważ, że kubity przestrzeni roboczej są potrzebne do prawidłowego działania tego procesu, ale po wykonaniu całego obwodu są przywracane do swoich początkowych stanów. Pozwala to ponownie używać tych kubitów jako kubitów przestrzeni roboczej do innych celów. Znane są również strategie zmniejszania liczby wymaganych kubitów przestrzeni roboczej (które kosztują zwiększenie rozmiarów obwodów), ale nie będziemy tutaj omawiać tych strategii.

Implementowanie funkcji odwracalnych

Opisana powyżej konstrukcja pozwala nam symulować dowolny obwód boolowski za pomocą obwodu kwantowego w sposób wolny od śmieci. Jeśli CC jest obwodem boolowskim implementującym funkcję f:ΣnΣm,f:\Sigma^n \rightarrow \Sigma^m, to otrzymujemy obwód kwantowy Q,Q, który działa następująco na stanach bazy standardowej.

Q(y0kx)=yf(x)0kxQ \bigl( \vert y \rangle \vert 0^k \rangle \vert x\rangle\bigr) = \vert y \oplus f(x) \rangle \vert 0^k \rangle \vert x\rangle

Liczba kk wskazuje, ile kubitów przestrzeni roboczej jest łącznie wymaganych. Dla celów tego kursu to wystarczy, ale możliwe jest posunięcie tej metodologii o krok dalej, gdy sama funkcja ff jest odwracalna.

Ściślej, załóżmy, że funkcja ff ma postać f:ΣnΣn,f:\Sigma^n \rightarrow \Sigma^n, i załóżmy, że istnieje funkcja f1f^{-1} taka, że f1(f(x))=xf^{-1}(f(x)) = x dla każdego xΣnx\in\Sigma^n (która jest jednoznacznie wyznaczona, gdy istnieje). Oznacza to, że operacja przekształcająca x\vert x \rangle w f(x)\vert f(x) \rangle dla każdego xΣnx\in\Sigma^n jest unitarna, więc możemy mieć nadzieję na zbudowanie obwodu kwantowego implementującego operację unitarną zdefiniowaną przez

Ux=f(x)U \vert x \rangle = \vert f(x) \rangle

dla każdego xΣn.x\in\Sigma^n.

Żeby było jasne, unitarność tej operacji opiera się na odwracalności ff — nie jest unitarna, gdy ff nie jest odwracalna. Pomijając kubity przestrzeni roboczej, UU różni się od operacji implementowanej przez obwód Q,Q, ponieważ nie zachowujemy kopii wejścia i nie XORujemy go z dowolnym ciągiem — zastępujemy xx przez f(x).f(x).

Pytanie brzmi: gdy ff jest odwracalna, czy możemy to zrobić?

Odpowiedź brzmi: tak, pod warunkiem że możemy używać kubitów przestrzeni roboczej, a oprócz obwodu boolowskiego obliczającego f,f, mamy też taki, który oblicza f1.f^{-1}. Nie jest to więc skrót do obliczeniowego odwracania funkcji, gdy nie wiemy jak to zrobić! Poniższy diagram ilustruje, jak można to osiągnąć poprzez złożenie dwóch obwodów kwantowych, QfQ_f i Qf1,Q_{f^{-1}}, uzyskanych indywidualnie dla funkcji ff i f1f^{-1} opisaną powyżej metodą, razem z nn bramkami swap, przyjmując kk jako maksimum liczb kubitów przestrzeni roboczej wymaganych przez QfQ_f i Qf1.Q_{f^{-1}}.

Simulation of an invertible function