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écutent l’implémentation définie pour la controlled adjointspé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.

Opération 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))

Notes

L’application conditionnelle d’une opération basée sur le fait que les qubits de contrôle se trouvant 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.