Functor-toepassing
Functors zijn factory's waarmee u toegang krijgt tot bepaalde specialisatie-implementaties van een aanroepbare implementatie. Q#ondersteunt momenteel twee functors; Controlled
de Adjoint
en de , beide kunnen worden toegepast op bewerkingen die de nodige specialisaties bieden.
De Controlled
en Adjoint
functors pendelen; als ApplyUnitary
het een bewerking is die beide functors ondersteunt, is er geen verschil tussen Controlled Adjoint ApplyUnitary
en Adjoint Controlled ApplyUnitary
.
Beide hebben hetzelfde type en voeren bij aanroep de implementatie uit die is gedefinieerd voor de controlled adjoint
specialisatie.
Aangrenzende functor
Als de bewerking ApplyUnitary
een eenheidstransformatie U van de kwantumstatus definieert, Adjoint ApplyUnitary
toegangscontrolet u de implementatie van U†. De Adjoint
functor is een eigen inverse, omdat (U†)† = U per definitie. Is bijvoorbeeld Adjoint Adjoint ApplyUnitary
hetzelfde als ApplyUnitary
.
De expressie Adjoint ApplyUnitary
is een bewerking van hetzelfde type als ApplyUnitary
; het heeft hetzelfde argument en retourtype en ondersteunt dezelfde functors. Net als elke bewerking kan deze worden aangeroepen met een argument van geschikt type. Met de volgende expressie wordt de aangrenzende specialisatie van ApplyUnitary
een argument arg
toegepast:
Adjoint ApplyUnitary(arg)
Gecontroleerde functor
Voor een bewerking ApplyUnitary
die een eenheidstransformatie-U van de kwantumstatus definieert, Controlled ApplyUnitary
krijgt u toegang tot de implementatie die U toepast op alle qubits in een matrix met controle-qubits die de status |1⟩ hebben.
De expressie Controlled ApplyUnitary
is een bewerking met hetzelfde retourtype en dezelfde bewerkingskenmerken als ApplyUnitary
, wat betekent dat deze dezelfde functors ondersteunt.
Hierbij wordt een argument van het type (Qubit[], <TIn>)
gebruikt, waarbij <TIn>
moet worden vervangen door het argumenttype ApplyUnitary
, waarbij rekening moet worden gehouden met de gelijkwaardigheid van singleton tuple.
Operation | Argumenttype | Type beheerd argument |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
Concreet: als cs
dit een matrix van qubits bevat en q2
twee qubits q1
zijn en de bewerking SWAP
hier is gedefinieerd, wordt met de volgende expressie de status q1
van en q2
als alle qubits cs
zich in de toestand |1⟩ bevinden:
Controlled SWAP(cs, (q1, q2))
Notitie
Voorwaardelijk een bewerking toepassen op basis van de controle-qubits die een andere status hebben dan de status |1⟩ kan worden bereikt door de juiste aangrenzende transformatie toe te passen op de controle-qubits vóór aanroepen en de inverses erna toe te passen. De transformatie van alle controle-qubits die zich in de toestand |0⟩ bevinden, kan bijvoorbeeld worden bereikt door de bewerking vóór en na toe X
te passen. Dit kan gemakkelijk worden uitgedrukt met behulp van een conjugatie. Niettemin kan de uitgebreidheid van een dergelijke constructie in de toekomst extra ondersteuning bieden voor een compactere syntaxis.