Udostępnij za pośrednictwem


Aplikacja funktora

Functors to fabryki, które umożliwiają dostęp do określonych implementacji specjalizacji wywoływania. Q# obecnie obsługuje dwie funktory; i Adjoint Controlled, które można zastosować do operacji zapewniających niezbędne specjalizacje.

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

Adjoint functor

Jeśli operacja ApplyUnitary definiuje unitarne przekształcenie U stanu kwantowego, Adjoint ApplyUnitary uzyskuje dostęp do implementacji U†. Functor Adjoint jest własnym 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 funktory. Podobnie jak każda operacja, można ją wywołać za pomocą argumentu odpowiedniego typu. Następujące wyrażenie stosuje przyleganą specjalizację argumentu ApplyUnitary arg:

Adjoint ApplyUnitary(arg) 

Kontrolowany funktor

W przypadku operacjiApplyUnitary, która definiuje unitarne przekształcenie U stanu kwantowego, uzyskuje dostęp do implementacji, Controlled ApplyUnitary która stosuje U warunkowe dla wszystkich kubitów w tablicy kubitów kontrolnych 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 funktory. Przyjmuje argument typu (Qubit[], <TIn>), gdzie <TIn> należy zastąpić typem argumentu , biorąc pod uwagę równoważność pojedynczej ApplyUnitarykrotki.

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 q1 i q2 jeśli wszystkie kubity znajdują cs się w stanie |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ąć przez zastosowanie odpowiedniego przylegającego przekształcenia do kubitów kontrolnych przed wywołaniem i zastosowanie odwrotnych elementów po. Skonfigurowanie 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 sprzężenia. Niemniej jednak szczegółowość takiej konstrukcji może mieć dodatkowe wsparcie dla bardziej kompaktowej składni w przyszłości.