Condividi tramite


Applicazione functor

I funtori sono factory che consentono di accedere a specifiche implementazioni di specializzazione di un chiamabile. Q# attualmente supporta due funtori; il Adjoint e il Controlled, entrambi i quali possono essere applicati alle operazioni che forniscono le specializzazioni necessarie.

I funtori Controlled e Adjoint pendolari; se ApplyUnitary è un'operazione che supporta entrambi i funtori, non esiste alcuna differenza tra Controlled Adjoint ApplyUnitary e Adjoint Controlled ApplyUnitary. Entrambi hanno lo stesso tipo e, al momento della chiamata, eseguire l'implementazione definita per la specializzazione controlled adjoint.

Funtore adiacente

Se l'operazione ApplyUnitary definisce una trasformazione unitaria U dello stato quantistico, Adjoint ApplyUnitary accede all'implementazione di U†. Il funtore Adjoint è il proprio inverso, poiché (U†)† = U per definizione. Ad esempio, Adjoint Adjoint ApplyUnitary è uguale a ApplyUnitary.

L'espressione Adjoint ApplyUnitary è un'operazione dello stesso tipo di ApplyUnitary; ha lo stesso argomento e il tipo restituito e supporta gli stessi funtori. Come qualsiasi operazione, può essere richiamata con un argomento di tipo appropriato. L'espressione seguente applica la specializzazione adiacente di ApplyUnitary a un argomento arg:

Adjoint ApplyUnitary(arg) 

Funtore controllato

Per un'operazione ApplyUnitary che definisce una trasformazione unitaria U dello stato quantistico, Controlled ApplyUnitary accede all'implementazione che applica U condizionale su tutti i qubit in una matrice di qubit di controllo nello stato |1⟩.

L'espressione Controlled ApplyUnitary è un'operazione con lo stesso tipo restituito e caratteristiche dell'operazioneApplyUnitary, ovvero supporta gli stessi functor. Accetta un argomento di tipo (Qubit[], <TIn>), dove <TIn> deve essere sostituito con il tipo di argomento di ApplyUnitary, prendendo in considerazione di equivalenza della tupla singleton.

Operazione Tipo di argomento Tipo di argomento controllato
X Qubit (Qubit[], Qubit)
BARATTARE (Qubit, Qubit) (Qubit[], (Qubit, Qubit))

In concreto, se cs contiene una matrice di qubit, q1 e q2 sono due qubit e l'operazione SWAP è definita qui, l'espressione seguente scambia lo stato di q1 e q2 se tutti i qubit in cs si trovano nello stato |1⟩:

Controlled SWAP(cs, (q1, q2))

Nota

L'applicazione condizionale di un'operazione basata sui qubit di controllo in uno stato diverso da |1⟩ può essere ottenuta applicando la trasformazione adiacente appropriata ai qubit di controllo prima della chiamata e applicando gli inverse dopo. È possibile impostare la trasformazione su tutti i qubit di controllo nello stato |0⟩, ad esempio, applicando l'operazione di X prima e dopo. Questa operazione può essere espressa in modo pratico usando un coniugazione. Tuttavia, il dettaglio di tale costrutto può meritare ulteriore supporto per una sintassi più compatta in futuro.