Teilen über


Funktionselementanwendung

Funktionselemente sind Factorys, die den Zugriff auf bestimmte Spezialisierungsimplementierungen einer aufrufbaren Komponente ermöglichen. Q# unterstützt derzeit zwei Funktionselemente: Adjoint und Controlled. Beide können auf Vorgänge angewendet werden, die die erforderlichen Spezialisierungen bereitstellen.

Die Funktoren Controlled und Adjoint sind vertauschbar, wenn ApplyUnitary eine Operation beide Funktoren unterstützt, dann gibt es keinen Unterschied zwischen Controlled Adjoint ApplyUnitary und Adjoint Controlled ApplyUnitary. Beide verfügen haben den gleichen Typ, und führen bei Aufruf die für die controlled adjoint-Spezialisierung definierte Implementierung aus.

Adjoint-Funktionselement

Wenn der Vorgang ApplyUnitary eine unitäre Transformation U des Quantenzustands definiert, Adjoint ApplyUnitary greifen Sie auf die Implementierung von U†. Das Adjoint-Funktionselement ist seine eigene Umkehrung, da definitionsgemäß gilt: (U†)† = U. Adjoint Adjoint ApplyUnitary entspricht beispielsweise ApplyUnitary.

Der Ausdruck Adjoint ApplyUnitary ist ein Vorgang desselben Typs wie ApplyUnitary; er verfügt über das gleiche Argument und denselben Rückgabetyp und unterstützt dieselben Funktoren. Wie jeder Vorgang kann er mit einem Argument des geeigneten Typs aufgerufen werden. Der folgende Ausdruck wendet die adjungierte Spezialisierung von ApplyUnitary auf ein Argument (arg) an:

Adjoint ApplyUnitary(arg) 

Controlled-Funktionselement

Für einen Vorgang ApplyUnitary, der eine unitäre Transformation U des Quantenzustands definiert, greifen Sie auf die Implementierung zu, Controlled ApplyUnitary die U bedingt auf alle Qubits in einem Array von Steuerungs-qubits im Zustand |1⟩ wendet.

Der Ausdruck Controlled ApplyUnitary ist ein Vorgang mit demselben Rückgabetyp und den gleichen Vorgangsmerkmalen wieApplyUnitary. Das bedeutet, dass er dieselben Funktoren unterstützt. Es wird ein Argument vom Typ (Qubit[], <TIn>) verwendet, wobei <TIn> durch den Argumenttyp von ApplyUnitary ersetzt werden soll, wobei die Singleton-Tupel-Äquivalenz berücksichtigt wird.

Vorgang Argumenttyp Kontrollierter Argumenttyp
X Qubit (Qubit[], Qubit)
SWAP (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

Konkret, wenn cs ein Array von Qubits enthält und q1 und q2 zwei Qubits sind und der Vorgang SWAP wie hier definiert ist, tauscht der folgende Ausdruck den Zustand von q1 und q2 aus, wenn sich alle Qubits in cs im Zustand |1⟩ befinden:

Controlled SWAP(cs, (q1, q2))

Hinweis

Das bedingte Anwenden eines Vorgangs basierend auf den Kontrollqubits, die sich in einem anderen Zustand als dem |1⟩-Zustand befinden, kann erreicht werden, indem die entsprechende angrenzende Transformation auf die Kontrollqubits vor dem Aufruf angewendet und die Umgekehrten nach angewendet werden. Die Transformation für alle Steuerelement-Qubits im Zustand |0⟩ X kann z.B. durch Anwenden des Vorgangs vor und nach dem Vorgang durchgeführt werden. Dies kann bequem mithilfe einer Konjugation ausgedrückt werden. Trotzdem kann die Ausführlichkeit eines solchen Konstrukts in Zukunft zusätzliche Unterstützung für eine kompaktere Syntax konstruieren.