Acum vom analiza algoritmul lui Grover pentru a înțelege cum funcționează.
Vom începe cu ceea ce s-ar putea descrie ca o analiză simbolică, în care calculăm cum acționează operația Grover G asupra anumitor stări, după care vom lega această analiză simbolică de o imagine geometrică ce ajută la vizualizarea modului în care funcționează algoritmul.
Să începem prin definirea a două mulțimi de șiruri.
A0A1={x∈Σn:f(x)=0}={x∈Σn:f(x)=1}
Mulțimea A1 conține toate soluțiile problemei noastre de căutare, iar A0 conține șirurile care nu sunt soluții (pe care le putem numi non-soluții atunci când este convenabil).
Aceste două mulțimi satisfac A0∩A1=∅ și A0∪A1=Σn, adică formează o bipartiție a lui Σn.
Vom defini în continuare doi vectori unitari care reprezintă superpozițiile uniforme peste mulțimile de soluții și non-soluții.
Formal vorbind, fiecare dintre acești vectori este definit doar când mulțimea corespunzătoare este nevidă, dar de acum înainte ne vom concentra pe cazul în care nici A0 nici A1 nu sunt vide.
Cazurile A0=∅ și A1=∅ se tratează ușor separat, și le vom aborda mai târziu.
Ca notă, notația folosită aici este comună: ori de câte ori avem o mulțime finită și nevidă S, putem scrie ∣S⟩ pentru a denota vectorul de stare cuantică uniform distribuit peste elementele lui S.
Să definim și ∣u⟩ ca starea cuantică uniformă peste toate șirurile de n biți:
∣u⟩=N1x∈Σn∑∣x⟩.
Observă că
∣u⟩=N∣A0∣∣A0⟩+N∣A1∣∣A1⟩.
Avem de asemenea că ∣u⟩=H⊗n∣0n⟩, deci ∣u⟩ reprezintă starea registrului Q după inițializarea din pasul 1 al algoritmului lui Grover.
Aceasta implică faptul că, chiar înainte ca iterațiile lui G să aibă loc în pasul 2, starea lui Q este conținută în spațiul vectorial bidimensional generat de ∣A0⟩ și ∣A1⟩, iar coeficienții acestor vectori sunt numere reale.
Așa cum vom vedea, starea lui Q va păstra întotdeauna aceste proprietăți — adică starea este o combinație liniară reală a lui ∣A0⟩ și ∣A1⟩ — după orice număr de iterații ale operației G din pasul 2.
începând cu o observație interesantă despre aceasta.
Imaginează-ți pentru un moment că am înlocui funcția f cu compoziția lui f cu funcția NOT — sau, cu alte cuvinte, funcția obținută prin negarea bitului de ieșire al lui f.
Vom numi această funcție nouă g și o putem exprima în simboluri în câteva moduri alternative.
g(x)=¬f(x)=1⊕f(x)=1−f(x)={10f(x)=0f(x)=1
Observă că
(−1)g(x)=(−1)1⊕f(x)=−(−1)f(x)
pentru orice șir x∈Σn, și prin urmare
Zg=−Zf.
Aceasta înseamnă că, dacă am substitui funcția f cu funcția g, algoritmul lui Grover nu ar funcționa diferit — deoarece stările obținute din algoritm în cele două cazuri sunt în mod necesar echivalente la o fază globală.
Aceasta nu este o problemă!
Intuitiv vorbind, algoritmului nu îi pasă care șiruri sunt soluții și care nu — trebuie doar să poată distinge soluțiile de non-soluții pentru a funcționa corect.
Acum să analizăm acțiunea lui G asupra vectorilor de stare cuantică ∣A0⟩ și ∣A1⟩.
Mai întâi, să observăm că operația Zf are o acțiune foarte simplă asupra lui ∣A0⟩ și ∣A1⟩.
Zf∣A0⟩Zf∣A1⟩=∣A0⟩=−∣A1⟩
În al doilea rând, avem operația H⊗nZORH⊗n.
Operația ZOR este definită ca
ZOR∣x⟩=⎩⎨⎧∣x⟩−∣x⟩x=0nx=0n,
din nou pentru orice șir x∈Σn, iar o modalitate alternativă convenabilă de a exprima această operație este următoarea:
ZOR=2∣0n⟩⟨0n∣−I.
O modalitate simplă de a verifica că această expresie este în concordanță cu definiția lui ZOR este să evaluăm acțiunea sa asupra stărilor din baza standard.
Operația H⊗nZORH⊗n poate fi astfel scrisă:
H⊗nZORH⊗n=2H⊗n∣0n⟩⟨0n∣H⊗n−I=2∣u⟩⟨u∣−I,
folosind aceeași notație, ∣u⟩, pe care am folosit-o mai sus pentru superpozița uniformă peste toate șirurile de n biți.
Acum avem tot ce ne trebuie pentru a calcula acțiunea lui G asupra lui ∣A0⟩ și ∣A1⟩.
Să calculăm mai întâi acțiunea lui G asupra lui ∣A0⟩.
Așa cum am notat deja, starea lui Q imediat înainte de pasul 2 este conținută în spațiul bidimensional generat de ∣A0⟩ și ∣A1⟩, și tocmai am stabilit că G mapează orice vector din acest spațiu la un alt vector din același spațiu.
Aceasta înseamnă că, în scopul analizei, ne putem concentra atenția exclusiv pe acest subspațiu.
Pentru a înțelege mai bine ce se întâmplă în cadrul acestui spațiu bidimensional, să exprimăm acțiunea lui G pe acest spațiu ca o matrice,
ale cărei prime și a doua rânduri/coloane corespund respectiv lui ∣A0⟩ și ∣A1⟩.
Până acum în această serie, am conectat întotdeauna rândurile și coloanele matricelor cu stările clasice ale unui sistem, dar matricele pot fi folosite și pentru a descrie acțiunile aplicațiilor liniare pe baze diferite, cum avem aici.
Deși nu este deloc evident la prima vedere, matricea M este ceea ce obținem ridicând la pătrat o matrice cu un aspect mai simplu.
Acest unghi θ va juca un rol foarte important în analiza care urmează, deci merită să subliniem importanța sa aici, când îl întâlnim pentru prima dată.
Ținând cont de această expresie a matricei, observăm că
Acest lucru se datorează faptului că a roti cu unghiul θ de două ori este echivalent cu a roti cu unghiul 2θ.
O altă modalitate de a vedea acest lucru este să folosim expresia alternativă
θ=cos−1(N∣A0∣),
împreună cu formulele unghiului dublu din trigonometrie:
cos(2θ)sin(2θ)=cos2(θ)−sin2(θ)=2sin(θ)cos(θ).
În rezumat, starea registrului Q la începutul pasului 2 este
Acum să conectăm analiza prin care tocmai am trecut la o imagine geometrică.
Ideea este că operația G este produsul a două reflecții,
Zf și H⊗nZORH⊗n.
Iar efectul net al compunerii a două reflecții este de a efectua o rotație.
Să începem cu Zf.
Așa cum am observat deja anterior, avem
Zf∣A0⟩Zf∣A1⟩=∣A0⟩=−∣A1⟩.
În spațiul vectorial bidimensional generat de ∣A0⟩ și ∣A1⟩,
aceasta este o reflecție față de dreapta paralelă cu ∣A0⟩, pe care o vom numi L1.
Iată o figură care ilustrează acțiunea acestei reflecții asupra unui vector unitar ipotetic ∣ψ⟩,
pe care îl presupunem a fi o combinație liniară reală a lui ∣A0⟩ și ∣A1⟩.
În al doilea rând, avem operația H⊗nZORH⊗n, pe care am văzut deja că o putem scrie ca
H⊗nZORH⊗n=2∣u⟩⟨u∣−I.
Aceasta este tot o reflecție, de data aceasta față de dreapta L2 paralelă cu vectorul ∣u⟩.
Iată o figură care descrie acțiunea acestei reflecții asupra unui vector unitar ∣ψ⟩.
Când compunem aceste două reflecții, obținem o rotație — cu dublul unghiului dintre dreptele de reflecție — după cum ilustrează această figură.
Aceasta explică, în termeni geometrici, de ce efectul operației Grover este de a roti combinațiile liniare ale lui ∣A0⟩ și ∣A1⟩ cu un unghi de 2θ.