Saltearse al contenido

Oráculos

Los oráculos son operaciones abstractas que generalmente son definidas utilizando la notación de funciones binarias clásicas:

f:{0,1}n{0,1}mf: \{0,1\}^n \rightarrow \{0,1\}^m

Los oráculos actúan como cajas negras y abstraen su implementación, que varía segun el contexto. Notar que si no se pueden encontrar circuitos reales (con puertas) para representar la funcionalidad el oráculo carece de uso práctico.

Los oráculos se utilizan, por ejemplo, en los algoritmos Deutsch-Jozsa y Grover. En el primero se usa para abstraer la función a determinar si es constante o balanceada, y en el segundo caso se utiliza para abstraer el suscinto sobre el cual buscar.

Estos se definen de forma general de la siguiente manera:

Uf(xy)=xyf(x)U_f(\ket{x} \otimes \ket{y}) = \ket{x} \otimes \ket{y \oplus f(x)}

Donde \(x\) es la entrada e \(y\) un registro que se utilizará como salida. La razon de la creación de un nuevo registro para salida es para permitir que la operación sea reversible, es decir que a partir de la salida se pueda saber cuál fue la entrada.

Vale por construcción que \(U_f=U_f^\dag\), permitiendo que para obtener el valor de entrada solo se deba aplicar nuevamente la operación.

Los oráculos son utilizados para verificar el resultado de una entrada, o para poder distinguir (aplicando una fase) aquellos valores que pertenecen a la solución del problema. Utilizando la definicion matemática de oráculo, se puede verificar que la entrada xx sea una solución de ff reemplazando yy con "00" de la siguiente manera:

Uf(x0)=x0f(x)=xf(x)\begin{align} U_f(\ket{x} \otimes \ket{0}) =& \ket{x} \otimes \ket{0 \oplus f(x)}\\ =&\ket{x} \otimes \ket{f(x)} \end{align}

Al leer el segundo cubit se puede verificar si xx es solución o no de ff.

De forma análoga, si se reemplaza yy con "11" se obtiene el complemento de f(x)f(x) en el segundo cubit:

Uf(x1)=x1f(x)=xf(x)\begin{align} U_f(\ket{x} \otimes \ket{1}) =& \ket{x} \otimes \ket{1 \oplus f(x)}\\ =&\ket{x} \otimes \ket{\overline{f(x)}} \end{align}

Se suele utilizar el valor "-" en lugar de yy para distinguir aquellos valores que pertenecen a la solución del problema, con la precondición m=1m=1, es decir que haya un solo bit de solución:

Uf(x)=Uf(x012)=Uf(x0x12)=12Uf(x0x1)=12(Ufx0Ufx1)=12(xf(x)xf(x))={12(x0x1)si f(x)=0=x012=x12(x1x0)si f(x)=1=x12(1+0)=x=(1)f(x)x\begin{align} U_f(\ket{x} \otimes \ket{-}) =& U_f\left(\ket{x} \otimes \frac{\ket{0}-\ket{1}}{\sqrt{2}}\right)\\ =& U_f\left(\frac{\ket{x}\ket{0}-\ket{x}\ket{1}}{\sqrt{2}}\right)\\ =& \frac{1}{\sqrt{2}}U_f\left(\ket{x}\ket{0}-\ket{x}\ket{1}\right)\\ =& \frac{1}{\sqrt{2}}\left(U_f\ket{x}\ket{0}-U_f\ket{x}\ket{1}\right)\\ =& \frac{1}{\sqrt{2}}\left(\ket{x}\ket{f(x)}-\ket{x}\ket{\overline{f(x)}}\right)\\ =&\begin{cases} \frac{1}{\sqrt{2}}\left(\ket{x}\ket{0}-\ket{x}\ket{1}\right) && \text{si }f(x)=0\\ =\ket{x}\frac{\ket{0}-\ket{1}}{\sqrt{2}}=\ket{x}\ket{-}\\ \frac{1}{\sqrt{2}}\left(\ket{x}\ket{1}-\ket{x}\ket{0}\right) && \text{si }f(x)=1\\ =-\ket{x}\frac{1}{\sqrt{2}}\left(-\ket{1}+\ket{0}\right)=-\ket{x}\ket{-}\\ \end{cases}\\ =&(-1)^{f(x)}\ket{x}\ket{-}\\ \end{align}

Este oráculo es conocido como oráculo de fase. El último cubit no cambia nunca por lo que ciertas bibliografías simplifican enunciándolo de la siguiente manera:

Pfx=(1)f(x)xP_f\ket{x}=(-1)^{f(x)}\ket{x}

En ciertas ocasiones se utiliza combinado con el operador de difusión (por ejemplo el Operador de Grover), ya que permite seleccionar la solución al problema (cuando f(x)=1f(x)=1) invirtiendo su fase, para luego amplificar su amplitud.

Por otra parte, en el algoritmo de Deutsch-Jozsa se utiliza para identificar si la función es balanceada o constante.

Bibliografía:
Recomendada
Alternativa
Opcional