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 haben denselben 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 Steuerelementqubits, die sich in einem anderen Zustand als dem Zustand |1 befinden⟩ kann erreicht werden, indem die entsprechende angrenzende Transformation auf die Kontroll qubits vor dem Aufruf angewendet und die Umkehrungen 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.