Quali sono i componenti principali di un programma Q#?
Prima di scrivere programmi quantistici personalizzati, è importante comprendere la struttura e i componenti del linguaggio di programmazione Q#.
In questa unità vengono illustrati i componenti di base di un programma Q#.
L’operazione Main
Ogni programma Q# deve contenere almeno un'operazione. Il compilatore Q# inizia a eseguire un programma dall'operazione del punto di ingresso, ovvero l'operazione Main per impostazione predefinita. Ad esempio, il programma Q# seguente contiene un'operazione denominata Main che crea un qubit e restituisce una misura dello stato del qubit:
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
Il codice Q# non può essere eseguito senza un'operazione del punto di ingresso. Se si vuole usare un'operazione diversa da Main come punto di ingresso, usare l'attributo @EntryPoint() . Ad esempio, il codice seguente fornisce all'operazione precedente un nome più descrittivo, MeasureOneQubite definisce tale operazione come punto di ingresso al programma Q#:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
Tipi
Q# offre molti tipi di dati predefiniti con cui si potrebbe già avere familiarità, ad esempio Int, DoubleBool, e String. Q# fornisce anche tipi specifici per il calcolo quantistico, ad esempio Qubit e Result.
Ad esempio, l'operazione MeasureOneQubit restituisce un Result valore di tipo. Il Result tipo rappresenta lo stato di un qubit quando viene misurato il qubit e può avere un valore di Zero o One.
Librerie quantistiche
Q# include diverse librerie che contengono funzioni e operazioni che consentono di scrivere programmi quantistici. Per chiamare una funzione o un'operazione da una libreria, usare la import parola chiave e specificare lo spazio dei nomi della libreria. Ad esempio, per utilizzare la funzione Message dallo spazio dei nomi Microsoft.Quantum.Intrinsic nella libreria quantistica standard, utilizzare il codice seguente:
// import all functions and operations from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
L'asterisco significa che tutte le funzioni vengono importate dallo spazio dei nomi Microsoft.Quantum.Intrinsic. In alternativa, è possibile importare solo la Message funzione :
// import only the Message function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
Annotazioni
In Q#, il Unit tipo indica che la funzione o l'operazione non restituisce un valore. Per altre informazioni sui tipi in Q#, vedere Type System.
Puoi importare namespace nella libreria standard con Std anziché Microsoft.Quantum. Ad esempio, il codice seguente importa tutte le funzioni e le operazioni dallo Microsoft.Quantum.Intrinsic spazio dei nomi:
// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Per esplorare la libreria standard Q#, vedere le informazioni di riferimento sulle API.
Allocazione di qubit
Per allocare un qubit in Q#, usare la use parola chiave e il Qubit tipo . I qubit allocati con la use parola chiave iniziano sempre nello stato $\ket{0}$.
È possibile allocare un singolo qubit o più qubit in una matrice di qubit. Ecco un esempio che alloca un singolo qubit nella variabile q1 e una matrice di cinque qubit in q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
Misurazione del 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 valore di tipo Result che può essere Zero o One.
Per eseguire una misurazione nella base di calcolo $\lbrace\ket{c0}, \ket{c1}\rbrace$, è anche possibile usare l'operazione M. L'operazione M equivale all'operazione Measure nella base Pauli-Z, quindi M([qubit]) si comporta esattamente come Measure([PauliZ], [qubit]). Tuttavia, l'operazione M accetta solo qubit singoli come input, ma non array di qubit.
Reimpostare i qubit
In Q#, i qubit devono trovarsi nello stato $\ket{0}$ per rilasciarli. Al termine dell'uso di un qubit, chiamare l'operazione Reset per reimpostare il qubit allo stato $\ket{0}$. Ad esempio, il codice seguente alloca un qubit, misura lo stato del qubit e quindi reimposta il qubit:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}