Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 functores; o Adjoint e o Controlled, que podem ser aplicados a operações que forneçam as especializações necessárias.
Os Controlled e Adjoint functores deslocam-se para o trabalho; 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 o controlled adjointespecializaçã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 functor Adjoint é 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 que ApplyUnitary; ele 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 o de 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 se aplica U condicional a todos os qubits em uma matriz de qubits de controle estarem no estado |1⟩.
A expressão Controlled ApplyUnitary é uma operação com o mesmo tipo de retorno e características de operação como 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 ApplyUnitary, tendo em conta equivalência de tupla de tonelada única em conta.
| Funcionamento | Tipo de argumento | Tipo de argumento controlado |
|---|---|---|
| X | Qubit |
(Qubit[], Qubit) |
| TROCA | (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 em cs estão no estado |1⟩:
Controlled SWAP(cs, (q1, q2))
Observação
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 operação X 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.