Compartir a través de


Aplicación de funtor

Los functors son fábricas que permiten acceder a implementaciones de especialización concretas de un invocable. Q# actualmente admite dos funtores; el Adjoint y el Controlled, ambos se pueden aplicar a las operaciones que proporcionan las especializaciones necesarias.

Los funtores Controlled y Adjoint conmutan; 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, ejecute la implementación definida para la especialización de controlled adjoint.

Functor adyacente

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 igual 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. Al igual que cualquier operación, se puede invocar con un argumento de tipo adecuado. La expresión siguiente aplica la especialización adyacente de ApplyUnitary a un argumento arg:

Adjoint ApplyUnitary(arg) 

Functor controlado

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 en todos los cúbits de una matriz de cúbits de control que se encuentra en el estado |1⟩.

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

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

Concretamente, si cs contiene una matriz de cúbits, q1 y q2 son dos cúbits, y la operación SWAP es la definida aquí, la expresión siguiente 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. Al condicionar la transformación en todos los cúbits de control que se encuentra en el estado |0⟩, por ejemplo, se puede lograr aplicando la operación de X antes y después. Esto se puede expresar convenientemente mediante una conjugación . Sin embargo, el detalle de dicha construcción puede merecer compatibilidad adicional con una sintaxis más compacta en el futuro.