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 ApplyUnitary
krotki.
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.