Application de foncteur
Les foncteurs sont des fabriques qui vous permettent d’accéder à des implémentations de spécialisation particulières d’un callable. Q# prend actuellement en charge deux foncteurs, Adjoint
et Controlled
, qui peuvent tous les deux être appliqués à des opérations qui fournissent les spécialisations nécessaires.
Les functors Controlled
et Adjoint
s’inversent. Si ApplyUnitary
est une opération qui prend en charge les deux functors, il n’y a aucune différence entre Controlled Adjoint ApplyUnitary
et Adjoint Controlled ApplyUnitary
.
Les deux ont le même type et, lors de l’appel, exécutez l’implémentation définie pour la controlled adjoint
spécialisation.
Foncteur Adjoint
Si l’opération ApplyUnitary
définit un u de transformation unitaire de l’état quantique, Adjoint ApplyUnitary
accède à l’implémentation de U†. Le foncteur Adjoint
est son propre inverse, puisque (U†)† = U par définition. Par exemple, Adjoint Adjoint ApplyUnitary
est identique à ApplyUnitary
.
L’expression Adjoint ApplyUnitary
est une opération du même type que ApplyUnitary
. Elle a le même argument et le même type de retour et prend en charge les mêmes functors. Comme toute opération, elle peut être appelée avec un argument de type approprié. L’expression suivante applique la spécialisation jointe de ApplyUnitary
à un argument arg
:
Adjoint ApplyUnitary(arg)
Foncteur Controlled
Pour une opération ApplyUnitary
qui définit une transformation unitaire U de l’état quantique, Controlled ApplyUnitary
accède à l’implémentation qui applique U conditionnelle sur tous les qubits d’un tableau de qubits de contrôle qui sont dans l’état |1⟩.
L’expression Controlled ApplyUnitary
est une opération avec le même type de retour et les mêmes caractéristiques d’opération que ApplyUnitary
, ce qui signifie qu’elle prend en charge les mêmes functors.
Elle accepte un argument de type (Qubit[], <TIn>)
, où <TIn>
doit être remplacé par le type d’argument de ApplyUnitary
, en prenant en compte l’équivalence des tuples singleton.
Operation | Type d’argument | Type d’argument contrôlé |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
Concrètement, si cs
contient un tableau de qubits, q1
et q2
sont deux qubits, et que l’opération SWAP
est définie ici, l’expression suivante échange l’état de q1
et q2
si tous les qubits dans cs
sont dans l’état |1⟩ :
Controlled SWAP(cs, (q1, q2))
Remarque
L’application conditionnelle d’une opération basée sur les qubits de contrôle dans un état autre que l’état |1⟩ peut être obtenue en appliquant la transformation pouvant être adjointe appropriée aux qubits de contrôle avant l’appel et en appliquant les inverses après. Le conditionnement de la transformation sur tous les qubits de contrôle qui sont dans l’état |0⟩, par exemple, peut être obtenu en appliquant l’opération X
avant et après. Cela peut être exprimé facilement à l’aide d’une conjugaison. Néanmoins, le niveau de détail d’une telle construction peut mériter une prise en charge supplémentaire pour une syntaxe plus compacte à l’avenir.