Teraz przeanalizujemy algorytm Grovera, aby zrozumieć, jak działa.
Zaczniemy od tego, co można określić jako analizę symboliczną, w której obliczamy, jak operacja Grovera G działa na pewne stany, a następnie powiążemy tę analizę symboliczną z geometrycznym obrazem, który pomaga wizualizować działanie algorytmu.
Zbiór A1 zawiera wszystkie rozwiązania naszego problemu wyszukiwania, natomiast A0 zawiera ciągi, które rozwiązaniami nie są (które możemy dla wygody nazywać nierozwiązaniami).
Te dwa zbiory spełniają warunki A0∩A1=∅ i A0∪A1=Σn, czyli tworzą bipartycjęΣn.
Następnie zdefiniujemy dwa wektory jednostkowe reprezentujące jednorodne superpozycje nad zbiorami rozwiązań i nierozwiązań.
Formalnie rzecz biorąc, każdy z tych wektorów jest zdefiniowany wyłącznie wtedy, gdy odpowiadający mu zbiór jest niepusty, ale od tej chwili skupimy się na przypadku, gdy ani A0, ani A1 nie jest pusty.
Przypadki A0=∅ oraz A1=∅ można łatwo obsłużyć oddzielnie i zrobimy to później.
Na marginesie: używana tu notacja jest powszechna — ilekroć mamy skończony i niepusty zbiór S, możemy napisać ∣S⟩, żeby oznaczyć wektor stanu kwantowego jednorodnego na elementach S.
Zdefiniujmy też ∣u⟩ jako jednorodny stan kwantowy nad wszystkimi n-bitowymi ciągami:
∣u⟩=N1x∈Σn∑∣x⟩.
Zauważ, że
∣u⟩=N∣A0∣∣A0⟩+N∣A1∣∣A1⟩.
Mamy również ∣u⟩=H⊗n∣0n⟩, więc ∣u⟩ reprezentuje stan rejestru Q po inicjalizacji w kroku 1 algorytmu Grovera.
Wynika z tego, że tuż przed iteracjami G w kroku 2 stan rejestru Q należy do dwuwymiarowej przestrzeni wektorowej rozpiętej przez ∣A0⟩ i ∣A1⟩, przy czym współczynniki przy tych wektorach są liczbami rzeczywistymi.
Jak zobaczymy, stan rejestru Q będzie zawsze miał te właściwości — tzn. będzie rzeczywistą kombinacją liniową ∣A0⟩ i ∣A1⟩ — po dowolnej liczbie iteracji operacji G w kroku 2.
Wyobraź sobie na chwilę, że zastąpiliśmy funkcję f złożeniem f z funkcją NOT — czyli innymi słowy, funkcją otrzymaną przez odwrócenie bitu wyjściowego f.
Nazwiemy tę nową funkcję g, i możemy ją wyrazić symbolicznie na kilka równoważnych sposobów.
g(x)=¬f(x)=1⊕f(x)=1−f(x)={10f(x)=0f(x)=1
Zauważmy, że
(−1)g(x)=(−1)1⊕f(x)=−(−1)f(x)
dla każdego ciągu x∈Σn, a zatem
Zg=−Zf.
Oznacza to, że gdybyśmy podstawili funkcję g w miejsce funkcji f, algorytm Grovera działałby dokładnie tak samo — ponieważ stany uzyskiwane przez algorytm w obu przypadkach są z konieczności równoważne z dokładnością do globalnej fazy.
To nie jest problem!
Intuicyjnie rzecz ujmując, algorytm nie dba o to, które ciągi są rozwiązaniami, a które nie — wystarczy mu jedynie umieć odróżniać rozwiązania od nierozwiązań, aby działać poprawnie.
Jak już zauważyliśmy, stan Q tuż przed krokiem 2 zawiera się w dwuwymiarowej przestrzeni rozpiętej przez ∣A0⟩ i ∣A1⟩, a właśnie wykazaliśmy, że G odwzorowuje każdy wektor z tej przestrzeni na inny wektor w tej samej przestrzeni.
Oznacza to, że na potrzeby analizy możemy skupić uwagę wyłącznie na tej podprzestrzeni.
Aby lepiej zrozumieć, co dzieje się w tej dwuwymiarowej przestrzeni, wyrażmy działanie G na tej przestrzeni jako macierz,
której pierwszy i drugi wiersz/kolumna odpowiadają odpowiednio ∣A0⟩ i ∣A1⟩.
Do tej pory w tej serii zawsze łączyliśmy wiersze i kolumny macierzy ze stanami klasycznymi układu, ale macierzy można też używać do opisywania działań odwzorowań liniowych na różnych bazach — tak jak tutaj.
Choć na pierwszy rzut oka wcale nie jest to oczywiste, macierz M otrzymujemy, podnosząc do kwadratu prostszą macierz.
Wynika to z faktu, że dwukrotne obrócenie o kąt θ jest równoważne obrotowi o kąt 2θ.
Innym sposobem, by to zobaczyć, jest skorzystanie z alternatywnego wyrażenia
θ=cos−1(N∣A0∣),
wraz z formułami na kąt podwojony z trygonometrii:
cos(2θ)sin(2θ)=cos2(θ)−sin2(θ)=2sin(θ)cos(θ).
Podsumowując, stan rejestru Q na początku kroku 2 wynosi
Teraz połączmy analizę, którą właśnie przeprowadziliśmy, z obrazem geometrycznym.
Chodzi o to, że operacja G jest iloczynem dwóch odbić,
Zf i H⊗nZORH⊗n.
A efektem złożenia dwóch odbić jest wykonanie obrotu.
Zacznijmy od Zf.
Jak już wcześniej zauważyliśmy, mamy
Zf∣A0⟩Zf∣A1⟩=∣A0⟩=−∣A1⟩.
W dwuwymiarowej przestrzeni wektorowej rozpiętej przez ∣A0⟩ i ∣A1⟩,
jest to odbicie względem prostej równoległej do ∣A0⟩, którą nazwiemy L1.
Oto rysunek ilustrujący działanie tego odbicia na hipotetyczny wektor jednostkowy ∣ψ⟩,
który zakładamy jest rzeczywistą kombinacją liniową ∣A0⟩ i ∣A1⟩.
Następnie mamy operację H⊗nZORH⊗n, którą już widzieliśmy i którą można zapisać jako
H⊗nZORH⊗n=2∣u⟩⟨u∣−I.
Jest to również odbicie, tym razem względem prostej L2 równoległej do wektora ∣u⟩.
Oto rysunek przedstawiający działanie tego odbicia na wektor jednostkowy ∣ψ⟩.
Gdy złożymy te dwa odbicia, otrzymamy obrót — o dwukrotność kąta między prostymi odbicia — co ilustruje ten rysunek.