Hvad er hovedkomponenterne i et Q#-program?
Før du skriver dine egne kvanteprogrammer, er det vigtigt at forstå strukturen og komponenterne i programmeringssproget Q#.
I denne enhed lærer du om de grundlæggende komponenter i et Q#-program.
Handlingen Main
Hvert Q#-program skal indeholde mindst én handling. Q#-kompilatoren begynder at køre et program fra entry-point-handlingen, som er handlingen Main som standard. Følgende Q#-program indeholder f.eks. en handling, der kaldes Main , der opretter en qubit og returnerer en måling af qubittens 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);
}
Din Q#-kode kan ikke køre uden en entrypoint-handling. Hvis du vil bruge en anden handling end Main som indgangspunkt, skal du bruge attributten @EntryPoint() . Følgende kode giver f.eks. den foregående handling et mere beskrivende navn MeasureOneQubitog definerer denne handling som indgangspunktet til dit Q#-program:
// 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# indeholder mange indbyggede datatyper, som du måske allerede kender, f.eks Int. , Double, Bool, og String. Q# indeholder også typer, der er specifikke for kvanteberegning, f.eks Qubit . og Result.
Handlingen MeasureOneQubit returnerer f.eks. en Result typeværdi. Typen Result repræsenterer tilstanden af en qubit, når qubitten måles, og kan have en værdi på enten Zero eller One.
Kvantebiblioteker
Q# leveres med flere biblioteker, der indeholder funktioner og handlinger, der kan hjælpe dig med at skrive kvanteprogrammer. Hvis du vil kalde en funktion eller handling fra et bibliotek, skal du bruge import nøgleordet og angive bibliotekets navneområde. Hvis du f.eks. vil bruge Message funktionen fra Std.Intrinsic navneområdet i standardkvantebiblioteket, skal du bruge 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 betyder, at du importerer alle funktionerne fra Std.Intrinsic navneområdet. Alternativt kan du kun importere funktionen Message :
// 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!");
}
Notat
I Q# betyder typen Unit , at funktionen eller handlingen ikke returnerer en værdi. Du kan finde flere oplysninger om typer i Q# under Type System.
Hvis du vil udforske Q#-standardbiblioteket, skal du se API-referencen.
Tildeling af kvantbit
Hvis du vil tildele en qubit i Q#, skal du bruge use nøgleordet og typen Qubit . Quinbits, som du allokerer med nøgleordet, use starter altid i tilstanden $\ket{0}$.
Du kan tildele en enkelt qubit eller flere qubit i en qubit-matrix. Her er et eksempel, der allokerer en enkelt qubit i variablen q1 og en matrix på fem qubits i q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
Qubit-måling
I Q#udfører handlingen Measure en fælles måling af en eller flere qubits i de angivne Pauli-baser, som kan være PauliX, PauliYeller PauliZ. Handlingen Measure returnerer en Result type, der har værdien enten Zero eller One.
Hvis du vil udføre en måling i beregningsgrundlaget $\lbrace\ket{0},\ket{1}\rbrace$, kan du også bruge handlingen M . Operationen M svarer til operationen Measure i Pauli-Z basis, så M([qubit]) den opfører sig nøjagtigt på samme måde som Measure([PauliZ], [qubit]). Handlingen M accepterer dog kun enkelte qubits som input, ikke qubit-arrays.
Nulstil qubits
I Q# skal qubits være i tilstanden $\ket{0}$ for at frigive dem. Når du er færdig med at bruge en qubit, skal du kalde Reset handlingen for at nulstille qubitten til tilstanden $\ket{0}$. Følgende kode tildeler f.eks. en qubit, måler qubittens tilstand og nulstiller derefter qubitten:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}