Funktionselementanwendung
Functors sind Fabriken, mit denen Sie auf bestimmte Spezialisierungsimplementierungen einer aufrufbaren Anwendung zugreifen können.
Q# unterstützt derzeit zwei Funktoren; die Adjoint
und die Controlled
, die beide auf Vorgänge angewendet werden können, die die erforderlichen Spezialisierungen bieten.
Die Controlled
und Adjoint
Functors pendeln; wenn ApplyUnitary
ein Vorgang ist, der beide Functors unterstützt, gibt es keinen Unterschied zwischen Controlled Adjoint ApplyUnitary
und Adjoint Controlled ApplyUnitary
.
Beide haben denselben Typ und führen bei Aufruf die implementierung aus, die für die controlled adjoint
Spezialisierungdefiniert ist.
Angrenzender Pilz
Wenn die Operation ApplyUnitary
eine einheitliche Transformation U- des Quantenzustands definiert, greift Adjoint ApplyUnitary
auf die Implementierung von U†zu. Der Adjoint
Functor ist eine eigene Umkehrung, da (U†)† = U definitionlich. Beispielsweise ist Adjoint Adjoint ApplyUnitary
mit ApplyUnitary
identisch.
Der Ausdruck Adjoint ApplyUnitary
ist ein Vorgang desselben Typs wie ApplyUnitary
; es hat dasselbe Argument und gibt denselben Rückgabetyp und unterstützt dieselben Functors. Wie jeder Vorgang kann er mit einem Argument vom geeigneten Typ aufgerufen werden. Der folgende Ausdruck wendet die angrenzende SpezialisierungApplyUnitary
auf ein Argument arg
an:
Adjoint ApplyUnitary(arg)
Kontrollierter Functor
Für einen Vorgang ApplyUnitary
, der eine einheitliche Transformation U- des Quantenzustands definiert, greift Controlled ApplyUnitary
auf die Implementierung zu, die U- auf alle Qubits in einem Array von Steuerelement-Qubits anwendet, die im Zustand |1⟩ enthalten sind.
Der Ausdruck Controlled ApplyUnitary
ist ein Vorgang mit demselben Rückgabetyp und Vorgangseigenschaften wie ApplyUnitary
, was bedeutet, dass er dieselben Funktoren unterstützt.
Es wird ein Argument vom Typ (Qubit[], <TIn>)
verwendet, wobei <TIn>
durch den Argumenttyp ApplyUnitary
ersetzt werden sollte, wobei Singleton-Tupel-Äquivalenz berücksichtigt.
Vorgang | Argumenttyp | Kontrollierter Argumenttyp |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
TAUSCHEN | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
Wenn cs
ein Array von Qubits enthält, sind q1
und q2
zwei Qubits, und der Vorgang SWAP
ist wie hier definiert , dann tauscht der folgende Ausdruck den Zustand q1
und q2
aus, wenn 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 Formatierung der Transformation auf allen Steuerelement-Qubits, die sich im Zustand "|0⟩" befinden, kann z. B. durch Anwenden des X
Vorgangs vor und nach erreicht werden. Dies kann bequem mit einer Konjugationausgedrückt werden. Dennoch kann die Ausführlichkeit eines solchen Konstrukts in Zukunft zusätzliche Unterstützung für eine kompaktere Syntax haben.