Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.