Partilhar via


Aplicação functor

Os functores são fábricas que lhe permitem aceder a implementações de especialização específicas de um callable. Q# atualmente suporta dois functores; e Adjoint os Controlled, ambos podem ser aplicados a operações que fornecem as especializações necessárias.

Os Controlled functores e Adjoint deslocam-se; se ApplyUnitary for uma operação que suporte ambos os functores, não há diferença entre Controlled Adjoint ApplyUnitary e Adjoint Controlled ApplyUnitary. Ambos têm o mesmo tipo e, após invocação, executam a implementação definida para a controlled adjointespecialização.

Functor adjacente

Se a operação ApplyUnitary definir uma transformação unitária U do estado quântico, Adjoint ApplyUnitary acede à 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 ApplyUnitaryque .

A expressão Adjoint ApplyUnitary é uma operação do mesmo tipo ApplyUnitaryque ; tem o mesmo argumento e tipo de retorno e suporta os mesmos functores. Como qualquer operação, pode ser invocada com um argumento de tipo adequado. A expressão seguinte aplica a especialização adjacente 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 acede à implementação que aplica a condição U em todos os qubits numa matriz de qubits de controlo 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. É necessário um argumento do tipo (Qubit[], <TIn>), em que <TIn> deve ser substituído pelo tipo de argumento de , tendo em conta a equivalência da ApplyUnitarycadeia de identificação 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 forem dois qubits e a operação SWAP estiver definida aqui, a seguinte expressão trocará o estado de q1 e q2 se todos os qubits no cs estão no estado |1⟩:

Controlled SWAP(cs, (q1, q2))

Nota

A aplicação condicional de uma operação com base nos qubits de controlo que estão num estado diferente do estado |1⟩ pode ser alcançado ao aplicar a transformação adjacente adequada aos qubits de controlo antes da invocação e ao aplicar as inversas após. Condicionar a transformação em todos os qubits de controlo no estado |0⟩, por exemplo, pode ser alcançado ao aplicar a X operação antes e depois. Isto pode ser expressa convenientemente através de uma conjugação. No entanto, a verbosidade de tal construção pode merecer suporte adicional para uma sintaxe mais compacta no futuro.