Compartir a través de


Aplicación de funtor

Los functores son factorías que permiten acceder a implementaciones de especialización determinadas de un elemento invocable. Actualmente, Q# admite dos functores, Adjoint y Controlled, que se pueden aplicar a operaciones que proporcionan las especializaciones necesarias.

Los functores Controlled y Adjoint se desplazan; si ApplyUnitary es una operación que admite ambos functores, no hay ninguna diferencia entre Controlled Adjoint ApplyUnitary y Adjoint Controlled ApplyUnitary. Ambos tienen el mismo tipo y, tras la invocación, ejecutan la implementación definida para la controlled adjoint especialización.

Functor Adjoint

Si la operación ApplyUnitary define una transformación unitaria U del estado cuántico, Adjoint ApplyUnitary accede a la implementación de U†. El functor Adjoint es su propio inverso, ya que (U†)† = U por definición. Por ejemplo, Adjoint Adjoint ApplyUnitary es lo mismo que ApplyUnitary.

La expresión Adjoint ApplyUnitary es una operación del mismo tipo que ApplyUnitary; tiene el mismo argumento y tipo de valor devuelto y admite los mismos functores. Como cualquier operación, se puede invocar con un argumento de tipo adecuado. La siguiente expresión aplica la especialización adjunta de ApplyUnitary a un argumento arg:

Adjoint ApplyUnitary(arg) 

Functor Controlled

Para una operación ApplyUnitary que define una transformación unitaria U del estado cuántico, Controlled ApplyUnitary accede a la implementación que aplica U condicional a todos los cúbits de una matriz de cúbits de control que están en el estado |1⟩.

La expresión Controlled ApplyUnitary es una operación con las mismas características de tipo de valor devuelto y operación que ApplyUnitary, lo que significa que admite los mismos functores. Toma un argumento de tipo (Qubit[], <TIn>), donde <TIn> se debe reemplazar por el tipo de argumento de ApplyUnitary, teniendo en cuenta la equivalencia de tupla singleton.

Operación Tipo de argumento Tipo de argumento controlado
X Qubit (Qubit[], Qubit)
SWAP (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

En concreto, si cs contiene una matriz de cúbits, q1 y q2 son dos cúbits, y la operación SWAP es como se define aquí, entonces la siguiente expresión intercambia el estado de q1 y q2 si todos los cúbits de cs están en el estado |1⟩:

Controlled SWAP(cs, (q1, q2))

Nota:

La aplicación condicional de una operación basada en los cúbits de control que se encuentren en un estado distinto del |1⟩ se puede lograr aplicando la transformación adyacente adecuada a los cúbits de control antes de la invocación y aplicando los inversos después. Condicionar la transformación a que todos los cúbits de control estén en el estado |0⟩, por ejemplo, se puede lograr aplicando la operación X antes y después. Esto se puede expresar cómodamente mediante una conjugación. Sin embargo, el nivel de detalle de este tipo de construcción puede requerir soporte adicional para una sintaxis más compacta en el futuro.