Ahora analizamos el algoritmo de Grover para entender cómo funciona.
Comenzamos con lo que podría describirse como un análisis simbólico, en el que calculamos cómo la operación de Grover G actúa sobre ciertos estados, y luego conectamos este análisis simbólico con una imagen geométrica que ayuda a visualizar el funcionamiento del algoritmo.
El conjunto A1 contiene todas las soluciones de nuestro problema de búsqueda, mientras que A0 contiene las cadenas que no son soluciones (a las que nos referiremos como no soluciones cuando sea conveniente).
Estos dos conjuntos satisfacen A0∩A1=∅ y A0∪A1=Σn, es decir, esto es una bipartición de Σn.
A continuación, definimos dos vectores unitarios que representan superposiciones uniformes sobre los conjuntos de soluciones y no soluciones.
Formalmente, cada uno de estos vectores solo está definido si el conjunto correspondiente no está vacío, pero a continuación nos enfocamos en el caso en que ni A0 ni A1 están vacíos.
Los casos A0=∅ y A1=∅ pueden tratarse fácilmente por separado, lo cual haremos más adelante.
Como nota al margen: la notación utilizada aquí es común — siempre que tenemos un conjunto finito y no vacío S, podemos escribir ∣S⟩ para denotar el vector de estado cuántico distribuido uniformemente sobre los elementos de S.
Definamos además ∣u⟩ como el estado cuántico uniforme sobre todas las cadenas de n bits:
∣u⟩=N1x∈Σn∑∣x⟩.
Observa que
∣u⟩=N∣A0∣∣A0⟩+N∣A1∣∣A1⟩.
También tenemos que ∣u⟩=H⊗n∣0n⟩, por lo que ∣u⟩ representa el estado del registro Q después de la inicialización en el paso 1 del algoritmo de Grover.
Esto implica que el estado de Q inmediatamente antes de las iteraciones de G en el paso 2 se encuentra en el espacio vectorial bidimensional generado por ∣A0⟩ y ∣A1⟩, y que los coeficientes de estos vectores son números reales.
Como veremos, estas propiedades del estado — que es una combinación lineal real de ∣A0⟩ y ∣A1⟩ — se preservarán después de cualquier número de iteraciones de la operación G en el paso 2.
comenzando con una observación interesante al respecto.
Imaginemos brevemente que reemplazamos la función f por la composición de f con la función NOT — o dicho de otra manera, por la función que obtenemos al invertir el bit de salida de f.
Llamamos a esta nueva función g y podemos expresarla simbólicamente de varias formas alternativas.
g(x)=¬f(x)=1⊕f(x)=1−f(x)={10f(x)=0f(x)=1
Observa que
(−1)g(x)=(−1)1⊕f(x)=−(−1)f(x)
para cada cadena x∈Σn y, por lo tanto,
Zg=−Zf.
Esto significa que si reemplazáramos la función f por la función g, el algoritmo de Grover no funcionaría de manera diferente — porque los estados que obtenemos del algoritmo en ambos casos son necesariamente equivalentes salvo una fase global.
¡Esto no es un problema!
Intuitivamente hablando, al algoritmo no le importa qué cadenas son soluciones y cuáles no — solo necesita poder distinguir las soluciones de las no soluciones para funcionar correctamente.
Como se señaló anteriormente, el estado de Q inmediatamente antes del paso 2 se encuentra en el espacio bidimensional generado por ∣A0⟩ y ∣A1⟩, y acabamos de demostrar que G envía cada vector en este espacio a otro vector en el mismo espacio.
Esto significa que para el análisis podemos enfocarnos exclusivamente en este subespacio.
Para comprender mejor lo que ocurre en este espacio bidimensional, expresamos la acción de G en este espacio como una matriz,
cuya primera y segunda fila/columna corresponden respectivamente a ∣A0⟩ y ∣A1⟩.
Hasta ahora en esta serie hemos asociado las filas y columnas de las matrices siempre con los estados clásicos de un sistema, pero las matrices también pueden usarse para describir las acciones de aplicaciones lineales en otras bases, como hacemos aquí.
Aunque a primera vista no es para nada evidente, la matriz M es lo que obtenemos al elevar al cuadrado una matriz de aspecto más simple.
Este ángulo θ desempeñará un papel muy importante en el análisis siguiente, por lo que vale la pena enfatizar su significado cuando lo vemos aquí por primera vez.
Esto se debe a que rotar dos veces por el ángulo θ equivale a una rotación por el ángulo 2θ.
Otra forma de verificar esto es usando la expresión alternativa
θ=cos−1(N∣A0∣),
junto con las fórmulas del ángulo doble de la trigonometría:
cos(2θ)sin(2θ)=cos2(θ)−sin2(θ)=2sin(θ)cos(θ).
En resumen, el estado del registro Q al comienzo del paso 2 es
Conectemos ahora el análisis que acabamos de realizar con una imagen geométrica.
La idea es que la operación G es el producto de dos reflexiones:
Zf y H⊗nZORH⊗n.
Y el efecto neto de dos reflexiones es una rotación.
Comencemos con Zf.
Como ya observamos anteriormente,
Zf∣A0⟩Zf∣A1⟩=∣A0⟩=−∣A1⟩.
En el espacio vectorial bidimensional generado por ∣A0⟩ y ∣A1⟩, esto es una reflexión respecto a la recta paralela a ∣A0⟩, que llamaremos L1.
Aquí hay una figura que ilustra la acción de esta reflexión sobre un vector unitario hipotético ∣ψ⟩,
que se asume como una combinación lineal real de ∣A0⟩ y ∣A1⟩.
Segundo, tenemos la operación H⊗nZORH⊗n, que ya sabemos que puede escribirse como
H⊗nZORH⊗n=2∣u⟩⟨u∣−I
Esto también es una reflexión, esta vez respecto a la recta L2 paralela al vector ∣u⟩.
Aquí hay una figura que muestra la acción de esta reflexión sobre un vector unitario ∣ψ⟩.
Cuando componemos estas dos reflexiones, obtenemos una rotación — por el doble del ángulo entre las rectas de reflexión — como muestra esta figura.
Esto explica en términos geométricos por qué el efecto de la operación de Grover es rotar combinaciones lineales de ∣A0⟩ y ∣A1⟩ por un ángulo de 2θ.