Przejdź do głównej treści

Model obliczeniowy zapytań

Kiedy modelujemy obliczenia w kategoriach matematycznych, mamy zwykle na myśli rodzaj procesu przedstawionego na poniższym rysunku: informacja jest dostarczana jako wejście, odbywa się obliczenie i produkowane jest wyjście.

Ilustracja standardowego obliczenia.

Choć prawdą jest, że komputery, których dziś używamy, nieustannie odbierają dane wejściowe i produkują wyjście – wchodząc w interakcję zarówno z nami, jak i z innymi komputerami w sposób nieodzwierciedlony przez rysunek – intencją nie jest tu przedstawienie ciągłego działania komputerów. Chodzi raczej o stworzenie prostej abstrakcji obliczeń, skupiającej się na izolowanych zadaniach obliczeniowych. Na przykład wejście może kodować liczbę, wektor, macierz, graf, opis cząsteczki lub coś bardziej złożonego, podczas gdy wyjście koduje rozwiązanie rozważanego zadania obliczeniowego.

Kluczową kwestią jest to, że wejście jest dostarczane do obliczenia – zwykle w postaci ciągu binarnego – i żadna jego część nie jest ukryta.

Opis modelu

W modelu obliczeniowym zapytań całe wejście nie jest dostarczane do obliczenia tak jak w bardziej standardowym modelu sugerowanym powyżej. Zamiast tego wejście jest udostępniane w postaci funkcji, do której obliczenie uzyskuje dostęp, wykonując zapytania. Alternatywnie możemy postrzegać obliczenia w modelu zapytań jako mające dostęp swobodny do bitów (lub segmentów bitów) wejścia.

Ilustracja obliczenia w modelu zapytań.

W kontekście modelu zapytań często mówimy, że wejście jest dostarczane przez oracle lub czarną skrzynkę. Oba terminy sugerują, że pełny opis wejścia jest ukryty przed obliczeniem, a jedynym sposobem uzyskania do niego dostępu jest zadawanie pytań. To jakbyśmy konsultowali się z Wyrocznią w Delfach w sprawie wejścia: nie powie nam wszystkiego, co wie, odpowiada jedynie na konkretne pytania. Termin czarna skrzynka nabiera sensu zwłaszcza wtedy, gdy myślimy o wejściu jako reprezentowanym przez funkcję; nie możemy zajrzeć do środka funkcji i zrozumieć, jak działa – możemy ją jedynie obliczać dla argumentów, które sami wybieramy.

Będziemy w tej lekcji pracować wyłącznie z ciągami binarnymi, a nie z ciągami zawierającymi różne symbole, dlatego zapiszmy Σ={0,1}\Sigma = \{0,1\} i od tej pory będziemy używać tej notacji dla wygody, odnosząc się do alfabetu binarnego. Będziemy rozważać różne problemy obliczeniowe – kilka prostych przykładów zostanie opisanych wkrótce – ale dla wszystkich nich wejście będzie reprezentowane przez funkcję postaci

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

dla dwóch dodatnich liczb całkowitych nn i m.m. Oczywiście moglibyśmy wybrać inną nazwę zamiast f,f, ale przez całą lekcję będziemy trzymać się f.f.

Powiedzieć, że obliczenie wykonuje zapytanie, oznacza, że wybierany jest pewien ciąg xΣn,x \in \Sigma^n, a następnie ciąg f(x)Σmf(x)\in\Sigma^m jest udostępniany obliczeniu przez oracle. Dokładny sposób, w jaki to działa dla algorytmów kwantowych, zostanie omówiony wkrótce – musimy upewnić się, że jest to możliwe do wykonania za pomocą unitarnej operacji kwantowej pozwalającej na wykonywanie zapytań w superpozycji – ale na razie możemy myśleć o tym intuicyjnie na wysokim poziomie abstrakcji.

Na koniec, sposób, w jaki będziemy mierzyć efektywność algorytmów zapytań, jest prosty: będziemy liczyć liczbę zapytań, których wymagają. Jest to związane z czasem potrzebnym do wykonania obliczeń, ale nie jest dokładnie tym samym, ponieważ pomijamy czas operacji innych niż zapytania, a ponadto traktujemy zapytania tak, jakby każde z nich miało koszt jednostkowy. Możemy uwzględnić operacje inne niż zapytania, jeśli chcemy (i czasem się to robi), ale ograniczenie uwagi wyłącznie do liczby zapytań pomaga zachować prostotę.

Przykłady problemów zapytań

Oto kilka prostych przykładów problemów zapytań.

  • OR. Funkcja wejściowa ma postać f:ΣnΣf:\Sigma^n \rightarrow \Sigma (czyli m=1m=1 dla tego problemu). Zadanie polega na zwróceniu 1,1, jeśli istnieje ciąg xΣn,x\in\Sigma^n, dla którego f(x)=1,f(x) = 1, i na zwróceniu 0,0, jeśli taki ciąg nie istnieje. Jeśli myślimy o funkcji ff jako o reprezentacji ciągu 2n2^n bitów, do których mamy dostęp swobodny, problem sprowadza się do obliczenia sumy logicznej OR tych bitów.

  • Parzystość. Funkcja wejściowa znowu ma postać f:ΣnΣ.f:\Sigma^n \rightarrow \Sigma. Zadanie polega na ustaleniu, czy liczba ciągów xΣn,x\in\Sigma^n, dla których f(x)=1,f(x) = 1, jest parzysta czy nieparzysta. Dokładniej mówiąc, wymaganym wyjściem jest 0,0, jeśli zbiór {xΣn:f(x)=1}\{x\in\Sigma^n : f(x) = 1\} ma parzystą liczbę elementów, i 1,1, jeśli ma nieparzystą liczbę elementów. Jeśli myślimy o funkcji ff jako o reprezentacji ciągu 2n2^n bitów, do których mamy dostęp swobodny, problem sprowadza się do obliczenia parzystości (czyli sumy modulo 2) tych bitów.

  • Minimum. Funkcja wejściowa ma postać f:ΣnΣmf:\Sigma^n \rightarrow \Sigma^m dla dowolnych dodatnich liczb całkowitych nn i m.m. Wymaganym wyjściem jest ciąg y{f(x):xΣn},y \in \{f(x) : x\in\Sigma^n\}, który pojawia się jako pierwszy w leksykograficznym (czyli słownikowym) porządku Σm.\Sigma^m. Jeśli myślimy o funkcji ff jako o reprezentacji ciągu 2n2^n liczb całkowitych zakodowanych jako ciągi długości mm w notacji binarnej, do których mamy dostęp swobodny, problem sprowadza się do znalezienia minimum tych liczb całkowitych.

Rozważamy też problemy zapytań, w których mamy obietnicę dotyczącą wejścia. Oznacza to, że dysponujemy pewnego rodzaju gwarancją dotyczącą wejścia i nie odpowiadamy za to, co się dzieje, gdy ta gwarancja nie jest spełniona. Innym sposobem opisania tego rodzaju problemu jest stwierdzenie, że niektóre funkcje wejściowe (te, dla których obietnica nie jest spełniona) są traktowane jako wejścia „nie obchodzi nas". Wobec algorytmów, które otrzymują wejścia „nie obchodzi nas", nie są stawiane żadne wymagania.

Oto jeden przykład problemu z obietnicą:

  • Unikalne wyszukiwanie. Funkcja wejściowa ma postać f:ΣnΣ,f:\Sigma^n \rightarrow \Sigma, i obiecane jest, że istnieje dokładnie jeden ciąg zΣn,z\in\Sigma^n, dla którego f(z)=1,f(z) = 1, przy czym f(x)=0f(x) = 0 dla wszystkich ciągów xz.x\neq z. Zadanie polega na znalezieniu tego unikalnego ciągu z.z.

Wszystkie cztery opisane właśnie przykłady są naturalne w tym sensie, że są łatwe do opisania i można sobie wyobrazić różnorodne sytuacje lub konteksty, w których mogłyby się pojawić.

W odróżnieniu od nich, niektóre problemy zapytań nie są w ogóle „naturalne" w ten sposób. W rzeczywistości w badaniu modelu zapytań czasami tworzymy bardzo skomplikowane i wysoce sztuczne problemy, co do których trudno sobie wyobrazić, żeby ktokolwiek chciał je kiedykolwiek rozwiązywać w praktyce. Nie oznacza to jednak, że problemy te nie są interesujące! To, co początkowo może wydawać się sztuczne lub nienaturalne, może dostarczyć niespodziewanych wskazówek lub zainspirować nowe pomysły. Kwantowy algorytm Shora do faktoryzacji, zainspirowany algorytmem Simona, jest świetnym przykładem. Ważną częścią badania modelu zapytań jest też szukanie skrajnych przypadków, które mogą rzucić światło zarówno na potencjalne zalety, jak i na ograniczenia obliczeń kwantowych.

Gate'y zapytań

Kiedy opisujemy obliczenia za pomocą Circuit, zapytania są wykonywane przez specjalne Gate'y zwane gate'ami zapytań.

Najprostszym sposobem zdefiniowania gate'ów zapytań dla klasycznych Circuit Boolowskich jest po prostu zezwolenie im na bezpośrednie obliczanie funkcji wejściowej f,f, jak sugeruje poniższy rysunek.

Klasyczny gate zapytania.

Kiedy tworzony jest Circuit Boolowski dla problemu zapytania, funkcja wejściowa ff jest dostępna przez te gate'y, a liczba zapytań wykonywanych przez Circuit to po prostu liczba gate'ów zapytań pojawiających się w Circuit. Przewody wejściowe samego Circuit Boolowskiego są inicjalizowane do stałych wartości, które należy traktować jako część algorytmu (w odróżnieniu od bycia wejściami do problemu).

Na przykład oto Circuit Boolowski z klasycznymi gate'ami zapytań, który rozwiązuje opisany powyżej problem parzystości dla funkcji postaci f:ΣΣf:\Sigma\rightarrow\Sigma:

Klasyczny algorytm zapytań dla parzystości.

Ten algorytm wykonuje dwa zapytania, ponieważ zawiera dwa gate'y zapytań. Działa w następujący sposób: funkcja ff jest odpytywana dla dwóch możliwych wejść, 00 i 1,1, a wyniki są wprowadzane do Circuit Boolowskiego obliczającego XOR. (Ten konkretny Circuit pojawił się jako przykład Circuit Boolowskiego w lekcji Kwantowe Circuit kursu Podstawy informacji kwantowej.)

W przypadku Circuit kwantowych ta definicja gate'ów zapytań nie działa, ponieważ gate'y te byłyby nieunitarne dla niektórych wyborów funkcji f.f. Dlatego zamiast tego definiujemy unitarne gate'y zapytań, które działają na standardowych stanach bazowych zgodnie z tym rysunkiem:

Unitarny gate zapytania.

Tutaj zakładamy, że xΣnx\in\Sigma^n i yΣmy\in\Sigma^m są dowolnymi ciągami. Notacja yf(x)y\oplus f(x) odnosi się do bitowego alternatywnego sumy wyłączającej (XOR) dwóch ciągów, które mają długość mm w tym przypadku. Na przykład 001101=100.001 \oplus 101 = 100.

Mówiąc intuicyjnie, to, co robi gate UfU_f (dla dowolnie wybranej funkcji ff), to odwzorowywanie wejściowego ciągu xx na wyjście i dodawanie wartości funkcji f(x)f(x) poprzez XOR do dolnego ciągu wejściowego y,y, co jest operacją unitarną dla każdego wyboru funkcji f.f. W rzeczywistości jest to operacja deterministyczna, będąca swoją własną odwrotnością. Wynika z tego, że jako macierz UfU_f jest zawsze macierzą permutacji, czyli macierzą z pojedynczą 11 w każdym wierszu i każdej kolumnie, przy czym wszystkie pozostałe elementy wynoszą 0.0. Zastosowanie macierzy permutacji do wektora po prostu przestawia elementy tego wektora (stąd termin macierz permutacji) i dlatego nie zmienia normy euklidesowej tego wektora – co ujawnia, że macierze permutacji są zawsze unitarne.

Warto podkreślić, że kiedy analizujemy algorytmy zapytań, po prostu licząc liczbę zapytań wykonywanych przez algorytm, całkowicie ignorujemy trudność fizycznej konstrukcji gate'ów zapytań – zarówno w klasycznej, jak i kwantowej wersji, którą właśnie opisaliśmy. Mówiąc intuicyjnie, budowa gate'ów zapytań jest częścią przygotowania wejścia, a nie częścią znajdowania rozwiązania.

Może się to wydawać nieuzasadnione, ale musimy pamiętać, że nie staramy się opisywać praktycznych obliczeń ani w pełni rozliczać wymaganych zasobów. Zamiast tego definiujemy model teoretyczny, który pomaga rzucić światło na potencjalne zalety obliczeń kwantowych. Więcej do powiedzenia na ten temat będziemy mieli w następnej lekcji, gdy skupimy uwagę na bardziej standardowym modelu obliczeniowym, w którym wejścia są dostarczane do Circuit wprost jako ciągi binarne.