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 serem invocados, executam a implementação definida para a especializaçãocontrolled adjoint.

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 |1⟩ estado pode ser obtido aplicando a transformação adjacente 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.