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; Adjoint e Controlled, entrambi i quali possono essere applicati alle operazioni che forniscono le specializzazioni necessarie.

I funtori Controlled e Adjoint sono commutativi: se ApplyUnitary è un'operazione che supporta entrambi i funtori, non c'è 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 controlled adjoint specializzazione.

Funtore Adjoint

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

L'espressione Adjoint ApplyUnitary è un'operazione dello stesso tipo di ApplyUnitary; ha lo stesso argomento e 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 Controlled

Per un'operazione ApplyUnitary che definisce una trasformazione unitaria U dello stato quantistico, Controlled ApplyUnitary accede all'implementazione che applica la condizionale U 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 le stesse caratteristiche dell'operazione di ApplyUnitary, che significa che supporta gli stessi funtori. Accetta un argomento di tipo (Qubit[], <TIn>), dove <TIn> deve essere sostituito dal tipo di argomento ApplyUnitary, tenendo conto dell'equivalenza di tuple singleton.

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

In sostanza, se cs contiene una matrice di qubit, q1 e q2 sono due qubit e l'operazione SWAP è come definita qui, quindi l'espressione seguente scambia lo stato di q1 e q2 se tutti i qubit in cs sono in 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. Il condizionamento della trasformazione su tutti i qubit di controllo nello stato |0⟩, ad esempio, può essere ottenuto applicando l'operazione X prima e dopo. Questo si può esprimere opportunamente con una coniugazione. Tuttavia, il livello di dettaglio di un costrutto di questo tipo può meritare il supporto aggiuntivo per una sintassi più compatta in futuro.