Hva er hovedkomponentene i et Q#-program?
Før du skriver dine egne kvanteprogrammer, er det viktig å forstå strukturen og komponentene i programmeringsspråket Q#.
I denne enheten lærer du om de grunnleggende komponentene i et Q#-program.
Operasjonen Main
Hvert Q#-program må inneholde minst én operasjon. Q#-kompilatoren begynner å kjøre et program fra inngangspunktoperasjonen, som er operasjonen Main som standard. Følgende Q#-program inneholder for eksempel en operasjon kalt Main som oppretter en kvantebit og returnerer en måling av kvantebitens tilstand:
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
Q#-koden kan ikke kjøres uten en inngangspunktoperasjon. Hvis du vil bruke en annen operasjon enn Main som inngangspunkt, bruker du attributtet @EntryPoint() . Følgende kode gir for eksempel den foregående operasjonen et mer beskrivende navn, MeasureOneQubitog definerer denne operasjonen som inngangspunktet til Q#-programmet:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
Typer
Q# inneholder mange innebygde datatyper som du kanskje allerede er kjent med, for eksempel Int, Double, Bool, og String. Q# inneholder også typer som er spesifikke for kvantedatabehandling, for eksempel Qubit og Result.
Operasjonen MeasureOneQubit returnerer for eksempel en Result typeverdi. Typen Result representerer tilstanden til en kvantebit når kvantebiten måles, og kan ha en verdi på enten Zero eller One.
Kvantebiblioteker
Q# leveres med flere biblioteker som inneholder funksjoner og operasjoner for å hjelpe deg med å skrive kvanteprogrammer. Hvis du vil kalle opp en funksjon eller operasjon fra et bibliotek, bruker du import nøkkelordet og angir bibliotekets navneområde. Hvis du for eksempel vil bruke Message funksjonen fra Std.Intrinsic navneområdet i standard kvantebibliotek, bruker du følgende kode:
// import all functions and operations from Std.Intrinsic
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Stjernen betyr at du importerer alle funksjonene fra Std.Intrinsic navneområdet. Alternativt kan du bare importere Message funksjonen:
// import only the Message function from Std.Intrinsic
import Std.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Note
I Q# betyr typen Unit at funksjonen eller operasjonen ikke returnerer en verdi. Hvis du vil ha mer informasjon om typer i Q#, kan du se Type System.
Hvis du vil utforske Q#-standardbiblioteket, kan du se API-referansen.
Tildeling av kvantebiter
Hvis du vil tildele en kvantebit i Q#, bruker du use nøkkelordet og typen Qubit . Qubits som du tildeler med nøkkelordet, use starter alltid i $\ket{0}$-tilstanden.
Du kan tildele én enkelt kvantebit eller flere kvantebiter i en kvantebitmatrise. Her er et eksempel som tildeler en enkelt kvantebit i variabelen q1 og en matrise med fem kvantebiter i q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
Qubit-måling
I Q#utfører Measure-operasjonen et felles mål på én eller flere qubits i de angitte Pauli-basene, som kan være PauliX, PauliYeller PauliZ. Operasjonen Measure returnerer en Result type som har en verdi på enten Zero eller One.
Hvis du vil utføre en måling i beregningsgrunnlaget $\lbrace\ket{0},\ket{1}\rbrace$, kan du også bruke operasjonen M . Operasjonen M tilsvarer operasjonen Measure i Pauli-Z basis, så M([qubit]) oppfører seg nøyaktig på samme måte som Measure([PauliZ], [qubit]). Operasjonen M godtar imidlertid bare enkle qubits som inndata, ikke qubit-matriser.
Tilbakestill kvantebiter
I Q# må kvantebiter være i $\ket{0}$ tilstand for å frigi dem. Når du er ferdig med å bruke en kvantebit, kaller du operasjonen Reset for å tilbakestille kvantebiten til tilstanden $\ket{0}$. Følgende kode tildeler for eksempel en kvantebit, måler kvantebitens tilstand og tilbakestiller deretter kvantebiten:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}