Aplicativo Functor
Os functores são alocadores que permitem o acesso a implementações de especializações específicas de um chamável. No momento, Q# dá suporte a dois functores: Adjoint
e Controlled
. Ambos podem ser aplicados a operações que fornecem as especializações necessárias.
Os funtores Controlled
e Adjoint
comutam; se ApplyUnitary
for uma operação que dá suporte a ambos os funtores, então não há diferença entre Controlled Adjoint ApplyUnitary
e Adjoint Controlled ApplyUnitary
.
Ambos têm o mesmo tipo e, ao invocar, executam a implementação definida para a controlled adjoint
especialização.
Functor adjunto
Se a operação ApplyUnitary
definir uma transformação unitária U do estado do Quantum, Adjoint ApplyUnitary
acessará a implementação de U†. O functor Adjoint
é o inverso dele mesmo, pois (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 que ApplyUnitary
; ela tem o mesmo argumento e o mesmo tipo de retorno e dá suporte aos mesmos funtores. Como qualquer operação, ela pode ser invocada com um argumento do tipo adequado. A seguinte expressão aplica a especialização ajunta 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 do Quantum, Controlled ApplyUnitary
acessa a implementação que aplica U condicional em 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 as mesmas características de operação que ApplyUnitary
, o que significa que dá suporte aos mesmos funtores.
Ele usa um argumento do tipo (Qubit[], <TIn>)
, em que <TIn>
deve ser substituído pelo tipo de argumento ApplyUnitary
, levando em conta a equivalência de tupla singleton.
Operação | Tipo de argumento | Tipo de argumento controlado |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
Concretamente, se cs
contiver uma matriz de qubits, q1
e q2
são dois qubits e a operação SWAP
é conforme definido aqui, a expressão seguinte trocará o estado de q1
e q2
se todos os qubits em cs
estiverem no estado |1⟩:
Controlled SWAP(cs, (q1, q2))
Observação
A aplicação condicional de uma operação com base nos qubits de controle que estão em um estado diferente do estado |1⟩ pode ser obtida aplicando a transformação adjunta apropriada aos qubits de controle antes da invocação e aplicando os inversos depois. O condicionamento da transformação em todos os qubits de controle que estão no estado |0⟩, por exemplo, pode ser obtido aplicando a operação X
antes e depois. Isso pode ser convenientemente expresso usando uma conjugação. No entanto, o detalhamento de tal constructo pode merecer suporte adicional para uma sintaxe mais compacta no futuro.