Manuale dell'utente del Q# linguaggio di programmazione quantistica
Il Q# linguaggio di programmazione quantistico fa parte di Microsoft, che fornisce supporto e strumenti avanzati per la visualizzazione e l'analisi del Quantum Development Kitprogramma. Con Q# e Quantum Development Kit (QDK) è possibile scrivere i programmi quantistici ed eseguirli su hardware quantistico reale usando Azure Quantum.
Per altre informazioni, vedere come configurare l'ambiente di sviluppo quantistico e come inviare Q# processi ad Azure Quantum.
Il manuale dell'utente di Q# contiene:
Modalità di esecuzione di un programma Q#: un programma Q# può essere eseguito come applicazione autonoma o con un programma host aggiuntivo, scritto in Python o in un linguaggio .NET.
Test e debug dei programmi Q#: come per la programmazione classica, è essenziale essere in grado di verificare che i programmi quantistici agiscano come previsto e di diagnosticare un comportamento non corretto. Oggetto Quantum Development Kit per il test e il debug di programmi quantistici.
Guida al linguaggio Q#: Q# è un linguaggio autonomo che offre un elevato livello di astrazione. Non occorre alcuna nozione di stato quantistico o circuito. Q# implementa invece i programmi in termini di istruzioni ed espressioni, in modo molto simile ai linguaggi di programmazione classici. La guida al linguaggio Q# include le specifiche complete e la documentazione del linguaggio di programmazione quantistico Q#.
Documentazione sui simulatori quantistici: i simulatori quantistici sono programmi software eseguiti in computer classici e fungono da target computer per un Q# programma, rendendo possibile l'esecuzione e il test dei programmi quantistici nei computer classici.
La Q# documentazione della libreria: Quantum Development Kit fornisce funzionalità aggiuntive specifiche del dominio tramite pacchetti NuGet che possono essere aggiunti ai Q# progetti. La documentazione include operazioni, funzioni, tipi definiti dall'utente, esempi e concetti che costituiscono la libreria standard Q#, nonché le librerie di chimica quantistica, Machine Learning quantistico e per calcoli numerici quantistici.
Quali elementi compongono un programma Q#?
Di seguito verranno presentati i componenti generali inclusi in un programma Q#. Si consideri il programma Q# seguente:
namespace HelloQuantum {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
}
EntryPoint
indica al compilatore Q# di iniziare a eseguire il programma. Il programma stampa il messaggio seguente:
Hello quantum world!
Spazi dei nomi
Ogni file Q# inizia in genere con uno spazio dei nomi. Ecco un esempio:
namespace HelloQuantum {
// Your code goes here.
}
Gli spazi dei nomi consentono di organizzare le funzionalità correlate. Il loro uso diventa importante quando si usano librerie Q# nei programmi e quando si scrivono librerie personalizzate.
Librerie
Q# fa ampio uso di librerie. Una libreria è un pacchetto che contiene funzioni e operazioni che è possibile usare nei programmi quantistici.
Ad esempio, la libreria Microsoft.Quantum.Chemistry consente di eseguire calcoli quantistici correlati alla chimica. Ci sono diverse librerie standard, che includono tutti i tipi di operazioni di base.
Quando si chiama una funzione o un'operazione da una libreria, si specifica lo spazio dei nomi della libreria. Di seguito è riportato un esempio che chiama la funzione Message
dalla libreria Microsoft.Quantum.Intrinsic per stampare un messaggio nella console:
namespace HelloQuantum {
@EntryPoint()
operation SayHelloQ() : Unit {
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
}
}
Più comunemente, si usa la direttiva open
per rendere il codice più conciso e più semplice da leggere.
Questo esempio fa la stessa cosa dell'esempio precedente, ma usa la direttiva open
per inserire lo spazio dei nomi Microsoft.Quantum.Intrinsic
nel programma:
namespace HelloQuantum {
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
}
Qui si specifica semplicemente Message
e il compilatore riconosce lo spazio dei nomi a cui appartiene.
La documentazione di Q# fornisce informazioni di riferimento complete per ogni libreria predefinita. Per altre informazioni, vedere la documentazione delle librerie Q#.
Tipi
Q# fornisce diversi tipi predefiniti con cui si ha già familiarità, tra cui Int
, Double
, Bool
e String
, oltre a tipi specifici del calcolo quantistico. Il tipo Result
, ad esempio, rappresenta il risultato della misurazione di un qubit e può avere uno dei due valori possibili: One
e Zero
. Q# include anche tipi che definiscono intervalli, matrici e tuple. Si possono persino definire tipi personalizzati.
In generale, il sistema dei tipi di Q# è piuttosto minimale, nel senso che non esiste una nozione esplicita di classi o interfacce come quella a cui si potrebbe essere abituati come utenti di linguaggi classici come C# o Java.
Allocazione di qubit
In Q# i qubit vengono allocati tramite la parola chiave use
. È possibile allocare uno o più qubit alla volta.
Nell'esempio seguente viene allocato un qubit:
// Allocate a qubit.
use q = Qubit();
// Do something with q here.
Per impostazione predefinita, ogni qubit allocato con la parola chiave use
inizia con lo stato zero.
Operazioni quantistice
Una volta allocato, un qubit può essere passato a operazioni e funzioni, definite anche elementi chiamabili. In un certo senso, questo è tutto ciò che un programma Q# può fare con un qubit. Le operazioni sono i blocchi predefiniti di base di un programma Q#. Un'operazione Q# è una subroutine quantistica. Ovvero, una routine chiamabile che contiene operazioni quantistiche che modificano lo stato del registro qubit.
Per definire un'operazione Q#, è necessario specificare un nome per l'operazione insieme ai relativi input e output. Ecco un esempio di base:
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
In questo caso, il nome dell'operazione è SayHelloQ
. Accetta zero argomenti come input e restituisce il tipo Unit
, che significa che l'operazione non restituisce alcuna informazione.
Le Q# librerie forniscono anche operazioni che è possibile usare nei programmi, ad esempio l'operazione o H
Hadamard. Dato un qubit in Z, l'operazione H
inserisce il qubit in una sovrapposizione uniforme . Una volta in sovrapposizione, il qubit ha una probabilità del 50% di essere misurata come zero o uno.
Tutte le azioni dirette sullo stato di un qubit sono tutte definite da chiamabili intrinseci , ad esempio X
e H
, ovvero callable le cui implementazioni non sono definite all'interno Q# , ma sono definite dal target computer. Le operazioni eseguite in realtà sono rese concrete solo dal target computer scelto per eseguire il programma specifico Q# . Per altre informazioni, vedere Implementazione dei programmi Q#.
Ad esempio, se si esegue il programma nel simulatore di stato completo, il simulatore esegue le operazioni matematiche corrispondenti al sistema quantistico simulato. Tuttavia, guardando verso il futuro, quando la target macchina è un computer quantistico reale, la chiamata di tali operazioni in Q# indirizza il computer quantistico per eseguire le operazioni reali corrispondenti sull'hardware quantistico reale. Ad esempio, in un computer quantistico a ioni intrappolati, le operazioni quantistiche vengono eseguite da impulsi laser temporizzati con precisione.
Un Q# programma ricombina queste operazioni come definito da un target computer per creare nuove operazioni di livello superiore per esprimere il calcolo quantistico. In questo modo, Q# consente di esprimere facilmente la logica sottostante algoritmi quantistici e ibridi quantistici classici, pur essendo generale rispetto alla struttura di un computer o di un target simulatore.
Misurazione dei qubit
Esistono molti tipi di misurazioni quantistiche, ma Q# si concentra sulle misurazioni proiettative su singoli qubit, note anche come misurazioni Pauli. In base a una determinata misura (ad esempio, la base di calcolo $\ket{0},\ket{1}$) lo stato del qubit viene proiettato su qualsiasi stato di base misurato, di conseguenza distruggendo qualsiasi sovrapposizione tra i due.
In Q#le misurazioni Pauli vengono eseguite applicando Measure
l'operazione, che esegue una misurazione congiunta di uno o più qubit nelle basi Pauli specificate. Measure
l'operazione restituisce un Result
tipo.
Nota
Se la matrice di base e la matrice di qubit sono lunghezze diverse, l'operazione Measure
avrà esito negativo.
Per implementare una misura nella base di calcolo $\ket{0},\ket{1}$, è anche possibile usare l'operazioneM
, il quale esegue una misurazione di un singolo qubit nella base Pauli Z. Pertanto M
, l'operazione equivale all'applicazione di Measure([PauliZ], [qubit])
.
Un semplice esempio è il programma seguente, che alloca un qubit nello stato $\ket{0}$, quindi vi applica un'operazione Hadamard H
e misura il risultato nella base PauliZ
.
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit, by default it is in zero state
use q = Qubit();
// We apply a Hadamard operation H to the state
// It now has a 50% chance of being measured 0 or 1
H(q);
// Now we measure the qubit in Z-basis.
let result = M(qubit);
// We reset the qubit before releasing it.
if result == One { X(qubit); }
// Finally, we return the result of the measurement.
return result;
}
Per eseguire misurazioni oltre una singola misura congiunta, lo Microsoft.Quantum.Measurement
spazio dei nomi include operazioni più specifiche. Ad esempio, l'operazioneMultiM
accetta una matrice di qubit e restituisce una matrice di risultati di misurazione nella base di calcolo.