Udostępnij przez


Aplikacja funktora

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

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

Adjoint functor

Jeśli operacja ApplyUnitary definiuje unitarne przekształcenie U stanu kwantowego, Adjoint ApplyUnitary uzyskuje dostęp do implementacji U†. Functor Adjoint jest jego odwrotnością, ponieważ (U†)† = U według definicji. Na przykład Adjoint Adjoint ApplyUnitary jest taka sama jak 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 specjalizacji ApplyUnitary do argumentu arg:

Adjoint ApplyUnitary(arg) 

Kontrolowany funktor

W przypadku operacji ApplyUnitary definiującej przekształcenie jednostkowe U stanu kwantowego, Controlled ApplyUnitary uzyskuje dostęp do implementacji, 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 właściwości operacji co ApplyUnitary, co oznacza, że obsługuje te same funktory. Przyjmuje argument typu (Qubit[], <TIn>), gdzie <TIn> należy zastąpić typem argumentu ApplyUnitary, biorąc pod uwagę równoważn ość jednotonowej krotki.

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

Jeśli cs zawiera tablicę kubitów, q1 i q2 są dwoma kubitami, a operacja SWAP jest zdefiniowana tutaj, następujące wyrażenie wymienia stan q1 i q2, jeśli wszystkie kubity w cs znajdują 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ąć przez zastosowanie operacji 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.