Quali sono i componenti principali di un programma Q#?

Completato

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;
    }