Funktorprogram
Functors är fabriker som gör att du kan komma åt specifika specialiseringsimplementeringar av en anropsbar. Q# stöder för närvarande två kultorer; och Adjoint
Controlled
, som båda kan tillämpas på åtgärder som tillhandahåller nödvändiga specialiseringar.
Och Controlled
Adjoint
functors pendlar; om ApplyUnitary
är en operation som stöder båda functors, så finns det ingen skillnad mellan Controlled Adjoint ApplyUnitary
och Adjoint Controlled ApplyUnitary
.
Båda har samma typ och kör vid anrop den implementering som definierats för controlled adjoint
specialiseringen.
Adjoint-kultor
Om åtgärden ApplyUnitary
definierar en enhetstransformering U av kvanttillståndet kommer Adjoint ApplyUnitary
du åt implementeringen av U†. Functoren Adjoint
är dess egna inverse, sedan (U†)† = U per definition. Är till exempel Adjoint Adjoint ApplyUnitary
samma som ApplyUnitary
.
Uttrycket Adjoint ApplyUnitary
är en åtgärd av samma typ som ApplyUnitary
. Det har samma argument och returtyp och stöder samma functors. Precis som alla åtgärder kan den anropas med ett argument av lämplig typ. Följande uttryck tillämpar den angränsande specialiseringen av ApplyUnitary
på ett argument arg
:
Adjoint ApplyUnitary(arg)
Kontrollerad kultor
För en åtgärd ApplyUnitary
som definierar en enhetstransformering U av kvanttillståndet kommer Controlled ApplyUnitary
du åt implementeringen som tillämpar U villkorat av att alla kvantbitar i en matris med kontrollkvabitar är i tillståndet |1⟩.
Uttrycket Controlled ApplyUnitary
är en åtgärd med samma returtyp och åtgärdsegenskaper som ApplyUnitary
, vilket innebär att det stöder samma functors.
Det tar ett argument av typen (Qubit[], <TIn>)
, där <TIn>
bör ersättas med argumenttypen ApplyUnitary
, med hänsyn till singleton tuppel ekvivalens .
Åtgärd | Argumenttyp | Kontrollerad argumenttyp |
---|---|---|
X | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
cs
Om innehåller en matris med kvantbitar q1
och q2
är två kvantbitar, och åtgärden SWAP
är som definierad här, byter följande uttryck ut tillståndet q1
för och q2
om alla kvantbitar i cs
är i tillståndet |1⟩:
Controlled SWAP(cs, (q1, q2))
Kommentar
Villkorsstyrd tillämpning av en åtgärd som baseras på att kontrollkvabitarna är i ett annat tillstånd än tillståndet |1⟩ kan uppnås genom att lämplig angränsande transformering tillämpas på kontrollkvabitarna före anropet och tillämpa inverserna efter. Du kan till exempel utföra omvandlingen på alla kontrollkvämbitar som är i tillståndet |0⟩ genom att tillämpa X
åtgärden före och efter. Detta kan enkelt uttryckas med hjälp av en konjugation. En sådan konstruktions verbositet kan dock behöva ytterligare stöd för en mer kompakt syntax i framtiden.