Quali sono i componenti principali di un programma Q#?
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);