Aplicação functor
Functors são fábricas que permitem que você acesse implementações de especialização específicas de um chamável. Q# atualmente suporta dois functors; o Adjoint
e o Controlled
, ambos podem ser aplicados a operações que forneçam as especializações necessárias.
Os Controlled
functores e Adjoint
deslocam-se, se ApplyUnitary
é uma operação que suporta ambos os functores, então não há diferença entre Controlled Adjoint ApplyUnitary
e Adjoint Controlled ApplyUnitary
.
Ambos têm o mesmo tipo e, após a invocação, executam a implementação definida para a controlled adjoint
especialização.
Functor adjunto
Se a operação ApplyUnitary
define uma transformação unitária U do estado quântico, Adjoint ApplyUnitary
acessa a implementação de U†. O Adjoint
functor é o seu próprio inverso, uma vez que (U†)† = U por definição. Por exemplo, Adjoint Adjoint ApplyUnitary
é o mesmo que ApplyUnitary
.
A expressão Adjoint ApplyUnitary
é uma operação do mesmo tipo ApplyUnitary
que , tem o mesmo argumento e tipo de retorno e suporta os mesmos functores. Como qualquer operação, ela pode ser invocada com um argumento do tipo adequado. A expressão a seguir aplica a especialização adjunta de ApplyUnitary
a um argumento arg
:
Adjoint ApplyUnitary(arg)
Functor controlado
Para uma operação ApplyUnitary
que define uma transformação unitária U do estado quântico, Controlled ApplyUnitary
acessa a implementação que aplica U condicional a todos os qubits em uma matriz de qubits de controle que estão no estado |1⟩.
A expressão Controlled ApplyUnitary
é uma operação com o mesmo tipo de retorno e características de operação que ApplyUnitary
, o que significa que suporta os mesmos functores.
Toma um argumento do tipo (Qubit[], <TIn>)
, onde <TIn>
deve ser substituído pelo tipo de argumento de , tendo em conta a equivalência da tupla singletonApplyUnitary
.
Operação | Tipo de argumento | Tipo de argumento controlado |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
Concretamente, se cs
contém uma matriz de qubits, q1
e q2
são dois qubits, e a operação SWAP
é como definido aqui, então a expressão a seguir troca o estado de q1
e q2
se todos os qubits estão no cs
estado |1⟩:
Controlled SWAP(cs, (q1, q2))
Nota
A aplicação condicional de uma operação baseada no facto de os qubits de controlo estarem num estado diferente do estado |1⟩ pode ser obtida aplicando a transformação adjunta adequada aos qubits de controlo antes da invocação e aplicando os inversos depois. Condicionar a transformação em todos os qubits de controle que estão no estado |0⟩, por exemplo, pode ser alcançado aplicando a X
operação antes e depois. Isso pode ser convenientemente expresso usando uma conjugação. No entanto, a verborragia de tal construção pode merecer apoio adicional para uma sintaxe mais compacta no futuro.