Saltearse al contenido

Descomputación

Existen ocasiones en las que el procesamiento cuántico produce cubits “basura”. Esto puede afectar los resultados de cómputo debido a que los bits basura, cuyo valor depende del estado de entrada, generalmente destruirán las propiedades de interferencia que son tan importantes para la computación cuántica. Por ejemplo, podría requerirse trabajar con el entrelazamiento y el mismo se efectuaría con cubits que se encuentran en estados inservibles. Es por esto que en estos casos es buena práctica aplicar descomputación, una técnica que permite dejar los cubits auxiliares en 0\ket{0} para que no interfieran durante el entrelazamiento. La idea consiste en revertir las operaciones que entrelazaron los cubits basura, retornándolos a su estado inicial 0\ket{0}, con un pequeño costo en el tiempo de procesamiento.

A continuación se explicará el funcionamiento de esta técnica, aplicada sobre un ejemplo de procesamiento cuántico.

El proceso de descomputación involucra tres pasos:

  • Computar 00xw(x)s(x)x\ket{0}\ket{0}\ket{x} \rightarrow \ket{w(x)}\ket{s(x)}\ket{x}, donde xx es el estado inicial, s(x)s(x) el resultado de aplicar una operación sobre xx y w(x)w(x) el estado “basura” resultante tras haber ejecutado s(x)s(x). Se utiliza el enfoque estándar que consiste en convertir puertas clásicas ANDAND y NOTNOT en puertas cuánticas ToffoliToffoli y NOTNOT, respectivamente.
  • Agregar un cubit extra en el estado 0\ket{0}, y aplicar la puerta CNOTCNOT sobre s(x)\ket{s(x)} como el control. Esto permitirá copiar el resultado y se obtendrá: s(x)w(x)s(x)x\ket{s(x)}\ket{w(x)}\ket{s(x)}\ket{x}
  • Ahora aplicar todas las puertas del primer paso pero en orden inverso, y aplicando en cada paso la puerta inversa. El resultado deshará lo ocurrido en el paso 1, resultando en s(x)00x\ket{s(x)}\ket{0}\ket{0}\ket{x}

Se puede ignorar el estado 00\ket{0}\ket{0}, el cual no es modificado durante todo el proceso. Así, el resultado de estos pasos es la transformación deseada:

0xs(x)x\ket{0}\ket{x} \rightarrow \ket{s(x)}\ket{x}

Resumiendo, si se tiene un circuito clásico para computar una función s()s(\cdot), se puede pensar en las tres etapas del circuito cuántico limpio como: computar s()s(\cdot), convirtiendo puertas clásicas en cuánticas; copiar la respuesta usando CNOTCNOT; y finalmente aplicar descomputación, revirtiendo las puertas e invirtiéndolas.

Suponiendo que se intenta computar s(x)=x1x2x3s(x) = x_1 \land x_2 \land x_3, es decir, la operación ANDAND de tres bits, se usará una puerta ToffoliToffoli para computar el ANDAND de los primeros dos bits, x1x2x_1 \land x_2:

Operación AND sobre x1 y x2 usando puertas Toffoli

Figura (1): Operación ANDAND sobre x1x_1 y x2x_2 usando puertas ToffoliToffoli

Luego se usaría otra puerta ToffoliToffoli para aplicar la operación ANDAND entre el resultado de la operación previa y x3x_3:

Operación AND entre el resultado previo y x3 usando puertas Toffoli

Figura (2): Operación ANDAND entre el resultado previo y x3x_3 usando puertas ToffoliToffoli

Hasta este punto se ha computado s(x)=x1x2x3s(x) = x_1 \land x_2 \land x_3, pero durante el proceso se ha generado también un cubit intermedio en el estado x1x2\ket{x_1 \land x_2}. Este estado no era parte de la especificación original.

Se quería computar

0x3,x2,x1x1x2x3x3,x2,x1\ket{0}\ket{x_3, x_2, x_1} \rightarrow \ket{x_1 \land x_2 \land x_3}\ket{x_3, x_2, x_1}

pero se terminó computando

00x3,x2,x1x1x2x3x1x2x3,x2,x1\ket{0}\ket{0}\ket{x_3, x_2, x_1} \rightarrow \ket{x_1 \land x_2 \land x_3}\ket{x_1 \land x_2}\ket{x_3, x_2, x_1}

Esto puede evitarse fácilmente aplicando descomputación. Siguiendo los pasos mencionados previamente, y recordando que la puerta ToffoliToffoli es inversa de sí misma:

Aplicación de descomputación sobre la operación x1 AND x2 AND x3 usando puertas Toffoli

Figura (3): Aplicación de descomputación sobre la operación x1x2x3x_1 \land x_2 \land x_3 usando puertas ToffoliToffoli

El costo de aplicar descomputación es lineal en relación a los números de cubits involucrados en el circuito, ya que deben aplicarse las operaciones inversas a las utilizadas inicialmente. Además, el número de cubits auxiliares escala a lo sumo linealmente para guardar los resultados de las operaciones intermedias. Por lo tanto, es posible aplicar descomputación sobre los circuitos de forma eficiente, utilizando dicha práctica cuando sea requerida con el objetivo de mantener estados de cómputo limpios.

Bibliografía:
Recomendada
Alternativa
Opcional