Aplikacja funktora

Functors to fabryki, które umożliwiają dostęp do określonych implementacji specjalizacji wywoływanego. Q# obecnie obsługuje dwa functory; i AdjointControlled, z których oba mogą być stosowane do operacji, które zapewniają niezbędne specjalizacje.

Adjoint I Controlled functors dojazdy; jeśli ApplyUnitary jest operacją, która obsługuje oba functors, nie ma różnicy między Controlled Adjoint ApplyUnitary i Adjoint Controlled ApplyUnitary. Oba typy mają ten sam typ, a po wywołaniu wykonaj implementację zdefiniowaną controlled adjoint dla specjalizacji.

Adjoint functor

Jeśli operacja ApplyUnitary definiuje unitary przekształcenia U stanu kwantowego, Adjoint ApplyUnitary uzyskuje dostęp do implementacji U†. Functor Adjoint jest własną odwrotnością, ponieważ (U†)† = U według definicji. Na przykład kod Adjoint Adjoint ApplyUnitary jest taki sam jak kod ApplyUnitary.

Wyrażenie Adjoint ApplyUnitary jest operacją tego samego typu co ApplyUnitary; ma ten sam argument i zwracany typ i obsługuje te same functory. Podobnie jak każda operacja, można ją wywołać argumentem odpowiedniego typu. Następujące wyrażenie stosuje specjalizację adjoint argumentu ApplyUnitaryarg:

Adjoint ApplyUnitary(arg) 

Kontrolowany functor

W przypadku operacji ApplyUnitary definiującej unitarne przekształcenie U stanu Controlled ApplyUnitary kwantowego uzyskuje dostęp do implementacji, która stosuje U warunkowe dla wszystkich kubitów w tablicy kubitów sterujących będących w stanie |1⟩.

Wyrażenie Controlled ApplyUnitary jest operacją o tym samym typie zwracanym i cechach operacji co ApplyUnitary, co oznacza, że obsługuje te same functory. Przyjmuje argument typu (Qubit[], <TIn>), gdzie <TIn> należy zastąpić typem argumentu ApplyUnitary, biorąc pod uwagę równoważność krotki pojedynczej .

Operacja Typ argumentu Kontrolowany typ argumentu
X Qubit (Qubit[], Qubit)
SWAP (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

Jeśli konkretnie cs zawiera tablicę kubitów q1 i q2 są dwoma kubitami, a operacja SWAP jest zdefiniowana w tym miejscu, następujące wyrażenie wymienia stan i q2 jeśli wszystkie kubity znajdują cs się w stanie q1 |1⟩:

Controlled SWAP(cs, (q1, q2))

Uwaga

Warunkowe zastosowanie operacji na podstawie kubitów kontrolnych będących w stanie innym niż |1⟩ można osiągnąć, stosując odpowiednie przylegające przekształcenia do kubitów kontrolnych przed wywołaniem i stosując odwrotność po. Wyliczenie przekształcenia wszystkich kubitów sterujących w stanie |0⟩ można na przykład osiągnąć, stosując operację X przed i po. Można to wygodnie wyrazić przy użyciu połączenia. Niemniej jednak szczegółowość takiej konstrukcji może mieć dodatkowe wsparcie dla bardziej kompaktowej składni w przyszłości.