Ora analizzeremo l'algoritmo di Grover per capire come funziona.
Partiremo da quella che potrebbe essere descritta come un'analisi simbolica, in cui calcoliamo come l'operazione di Grover G agisce su certi stati, e poi collegheremo questa analisi simbolica a un'immagine geometrica che è utile per visualizzare il funzionamento dell'algoritmo.
L'insieme A1 contiene tutte le soluzioni al nostro problema di ricerca, mentre A0 contiene le stringhe che non sono soluzioni (che possiamo chiamare non-soluzioni quando è conveniente).
Questi due insiemi soddisfano A0∩A1=∅ e A0∪A1=Σn, il che significa che questa è una bipartizione di Σn.
Definiamo ora due vettori unitari che rappresentano sovrapposizioni uniformi sugli insiemi di soluzioni e non-soluzioni.
Formalmente, ciascuno di questi vettori è definito solo quando il corrispondente insieme è non vuoto, ma d'ora in poi ci concentreremo sul caso in cui né A0 né A1 sia vuoto.
I casi in cui A0=∅ e A1=∅ si trattano facilmente separatamente, e lo faremo più avanti.
Come nota a margine, la notazione usata qui è comune: ogni volta che abbiamo un insieme finito e non vuoto S, possiamo scrivere ∣S⟩ per indicare il vettore di stato quantistico che è uniforme sugli elementi di S.
Definiamo anche ∣u⟩ come lo stato quantistico uniforme su tutte le stringhe di n bit:
∣u⟩=N1x∈Σn∑∣x⟩.
Nota che
∣u⟩=N∣A0∣∣A0⟩+N∣A1∣∣A1⟩.
Abbiamo anche che ∣u⟩=H⊗n∣0n⟩, quindi ∣u⟩ rappresenta lo stato del registro Q dopo l'inizializzazione nel passo 1 dell'algoritmo di Grover.
Questo implica che appena prima che le iterazioni di G avvengano nel passo 2, lo stato di Q è contenuto nello spazio vettoriale bidimensionale generato da ∣A0⟩ e ∣A1⟩, e i coefficienti di questi vettori sono numeri reali.
Come vedremo, lo stato di Q avrà sempre queste proprietà — ovvero lo stato sarà una combinazione lineare reale di ∣A0⟩ e ∣A1⟩ — dopo un qualsiasi numero di iterazioni dell'operazione G nel passo 2.
Volgiamo ora la nostra attenzione all'operazione di Grover
G=H⊗nZORH⊗nZf,
partendo da un'interessante osservazione su di essa.
Immagina per un momento di sostituire la funzione f con la composizione di f con la funzione NOT — ovvero la funzione ottenuta invertendo il bit di output di f.
Chiameremo questa nuova funzione g, e possiamo esprimerla simbolicamente in alcuni modi alternativi.
g(x)=¬f(x)=1⊕f(x)=1−f(x)={10f(x)=0f(x)=1
Nota che
(−1)g(x)=(−1)1⊕f(x)=−(−1)f(x)
per ogni stringa x∈Σn, e quindi
Zg=−Zf.
Ciò significa che se sostituissimo la funzione f con la funzione g, l'algoritmo di Grover non funzionerebbe in modo diverso — perché gli stati ottenuti dall'algoritmo nei due casi sono necessariamente equivalenti a meno di una fase globale.
Questo non è un problema!
Intuitivamente, l'algoritmo non si preoccupa di quali stringhe siano soluzioni e quali non lo siano — ha solo bisogno di essere in grado di distinguere soluzioni e non-soluzioni per funzionare correttamente.
Come già osservato, lo stato di Q appena prima del passo 2 è contenuto nello spazio bidimensionale generato da ∣A0⟩ e ∣A1⟩, e abbiamo appena dimostrato che G mappa qualsiasi vettore in questo spazio in un altro vettore nello stesso spazio.
Ciò significa che, ai fini dell'analisi, possiamo concentrare la nostra attenzione esclusivamente su questo sottospazio.
Per capire meglio cosa accade in questo spazio bidimensionale, esprimiamo l'azione di G su questo spazio come una matrice,
le cui prime e seconde righe/colonne corrispondono rispettivamente a ∣A0⟩ e ∣A1⟩.
Finora in questa serie, abbiamo sempre collegato le righe e le colonne delle matrici agli stati classici di un sistema, ma le matrici possono essere usate anche per descrivere le azioni di mappature lineari su basi diverse come nel nostro caso.
Sebbene non sia affatto ovvio a prima vista, la matrice M è ciò che si ottiene elevando al quadrato una matrice dall'aspetto più semplice.
Questo angolo θ avrà un ruolo molto importante nell'analisi che segue, quindi vale la pena sottolinearne l'importanza la prima volta che lo incontriamo.
Alla luce di questa espressione della matrice, osserviamo che
e l'effetto dell'applicazione di G a questo stato è quello di ruotarlo di un angolo 2θ all'interno dello spazio generato da ∣A0⟩ e ∣A1⟩.
Così, ad esempio, abbiamo
Colleghiamo ora l'analisi appena svolta a un'immagine geometrica.
L'idea è che l'operazione G è il prodotto di due riflessioni,
Zf e H⊗nZORH⊗n.
E l'effetto netto dell'esecuzione di due riflessioni è quello di eseguire una rotazione.
Iniziamo con Zf.
Come abbiamo già osservato in precedenza, abbiamo
Zf∣A0⟩Zf∣A1⟩=∣A0⟩=−∣A1⟩.
All'interno dello spazio vettoriale bidimensionale generato da ∣A0⟩ e ∣A1⟩,
questa è una riflessione rispetto alla retta parallela a ∣A0⟩, che chiameremo L1.
Ecco una figura che illustra l'azione di questa riflessione su un ipotetico vettore unitario ∣ψ⟩,
che assumiamo essere una combinazione lineare reale di ∣A0⟩ e ∣A1⟩.
In secondo luogo abbiamo l'operazione H⊗nZORH⊗n, che abbiamo già visto potersi scrivere come
H⊗nZORH⊗n=2∣u⟩⟨u∣−I.
Anche questa è una riflessione, questa volta rispetto alla retta L2 parallela al vettore ∣u⟩.
Ecco una figura che mostra l'azione di questa riflessione su un vettore unitario ∣ψ⟩.
Quando componiamo queste due riflessioni, otteniamo una rotazione — di un angolo doppio rispetto all'angolo tra le rette di riflessione — come illustra questa figura.
Questo spiega, in termini geometrici, perché l'effetto dell'operazione di Grover è quello di ruotare le combinazioni lineari di ∣A0⟩ e ∣A1⟩ di un angolo 2θ.