Quali sono i componenti principali di un programma Q#?

Completato

Prima di iniziare a scrivere programmi quantistici, è importante comprendere la struttura e i componenti di un programma Q#.

In questa unità verranno esaminati i componenti principali di un programma Q#.

L’operazione Main

Ogni programma Q# deve contenere almeno un'operazione, che in genere è l'operazione Main. L'operazione Main è il punto di ingresso del programma. Per impostazione predefinita, il compilatore Q# avvia l'esecuzione di un programma dall'operazione Main(). Facoltativamente, è possibile usare l'attributo @EntryPoint() per specificare qualsiasi operazione nel programma come punto di esecuzione.

Ad esempio, il codice seguente definisce un'operazione del punto di ingresso, MeasureOneQubit:

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...
}

Tuttavia, è anche possibile scrivere tale codice senza l'attributo @EntryPoint() rinominando l'operazione MeasureOneQubit() in Main():

// The Q# compiler automatically detects the Main() operation as the entry point. 
operation Main() : Result {
    ...
}

Tipi

Il linguaggio Q# offre molti tipi predefiniti con cui si potrebbe già avere familiarità, tra cui Int, Double, Bool e String. Q# fornisce anche tipi specifici per il calcolo quantistico, ad esempio Qubit e Result.

In questo esempio l'operazione MeasureOneQubit restituisce un tipo Result. Il tipo Result è il risultato della misurazione di un qubit e può essere sia One che Zero.

operation MeasureOneQubit() : Result {
    ...
}

Librerie quantistiche

Le librerie di Q# contengono funzioni e operazioni che è possibile usare nei programmi quantistici. Quando si chiama una funzione o un'operazione da una libreria, si usa la direttiva import e si specifica lo spazio dei nomi della libreria. Ad esempio, per usare la funzione Message dallo spazio dei nomi Microsoft.Quantum.Intrinsic nella libreria quantistica Standard, eseguire le operazioni seguenti:

// imports all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;
    Message("Hello quantum world!");


// imports just the `Message` function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
    Message("Hello quantum world!");

Gli spazi dei nomi nella libreria Standard possono essere importati usando Std invece di Microsoft.Quantum. Ad esempio:

// imports all functions and operations from Microsoft.Quantum.Intrinsic == Std.Intrinsic
import Std.Intrinsic.*;
    Message("Hello quantum world!");

Allocazione di qubit

In Q#, per allocare un qubit, usare la parola chiave use e il tipo Qubit. Ogni qubit allocato con la parola chiaveuse inizia con lo stato $\ket{0}$.

È possibile allocare uno o più qubit alla volta. Nell'esempio seguente vengono allocati uno e cinque qubit:

use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

Misurazione dei qubit

In Q#, l'operazione Measure esegue una misurazione congiunta di uno o più qubit nelle basi di Pauli specificate, che possono essere PauliX, PauliY o PauliZ. L'operazione Measure restituisce un tipo Result, ovvero One o Zero.

Per implementare una misurazione nella base computazionale $\lbrace\ket{0},\ket{1}\rbrace$, è anche possibile usare l’operazione M operation, che esegue una misurazione nella base Z di Pauli. L'operazione M equivale quindi all'applicazione di Measure([PauliZ], [qubit]).

Reimpostazione dei qubit

In Q#, i qubit devono trovarsi nello stato $\ket{0}$ nel momento in cui vengono rilasciati. Al termine dell'uso di un qubit, si utilizza l'operazione Reset per reimpostare il qubit su $\ket{0}$.

    // Reset the qubit so it can be safely released.
    Reset(qubit);