Självstudier: Implementera en kvantgenerator för slumptal i Q#
I den här självstudien skriver du ditt första kvantprogram med hjälp av Quantum Development Kit (QDK). Ett enkelt exempel på en kvantalgoritm som skrivits i Q# är en kvantgenerator för slumptal. Den här algoritmen använder kvantmekanik till att generera ett slumptal.
Krav
- Installera Quantum Development Kit (QDK) med önskat språk och utvecklingsmiljö.
- Om du redan har installerat QDK kontrollerar du att du har uppdaterat till den senaste versionen.
I den här självstudien får du lära dig att:
- Skapa ett Q# projekt.
- Förbered utvecklingsmiljön för att skriva kvantprogram i Q# .
- Förstå hur Q# program är strukturerade.
- Arbeta med qubitar och superposition för att skapa en slumpgenerator för kvanttal.
Skapa ett Q# projekt
Det första du behöver göra är att skapa ett nytt Q# projekt. I den här självstudien används miljön Q# baserat på program med VS Code,men du kan använda önskad IDE.
Skapa ett nytt projekt i VS Code:
- Klicka på Visa -> Kommandopalett och välj Q#: Skapa nytt projekt.
- Klicka på Fristående konsolprogram.
- Gå till platsen där du vill spara projektet och klicka på Skapa projekt.
- När projektet har skapats klickar du på Öppna nytt projekt... längst ned till höger.
I det här fallet kallas projektet Qrng . Detta genererar två filer: Qrng.csproj , projektfilen och Program.qs , en mall för ett program som vi ska använda för att skriva Q# programmet. Innehållet i Program.qs ska vara:
namespace Qrng {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation HelloQ() : Unit {
Message("Hello quantum world!");
}
}
Skriva en # Q-åtgärd
Ersätt innehållet i filen Program.qs med följande kod:
namespace Qrng {
open Microsoft.Quantum.Convert;
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation GenerateRandomBit() : Result {
use q = Qubit(); // Allocate a qubit.
H(q); // Put the qubit to superposition. It now has a 50% chance of being 0 or 1.
return MResetZ(q); // Measure the qubit value.
}
}
Låt oss ta en titt på den här koden. Du definierar GenerateRandomBit åtgärden, som inte tar några indata och genererar ett värde av typen Result . Typen Result representerar resultatet av en mätning och kan ha två möjliga värden: Zero och One. EntryPoint talar om Q# för kompilatorn att börja köra programmet här. I Q# allokeras qubitar via use nyckelordet . Åtgärden H placerar qubiten i superposition. Åtgärden M mäter qubiten och returnerar det uppmätta värdet (noll eller ett).
Som vi nämnde i artikeln Förstå kvantberäkning är en kvantbit en enhet med kvantinformation som kan vara i superposition. När den mäts kan kvantbiten endast vara antingen 0 eller 1. Men innan mätningen representerar tillståndet för qubiten sannolikheten att läsa antingen ett 0 eller ett 1 med en mätning. Detta sannolikhetstillstånd kallas för superposition. Du kan använda den här sannolikheten för att generera slumpmässiga tal.
Den Q# här åtgärden introducerar Qubit datatypen som är inbyggd i Q# . Vi kan bara allokera en Qubit med en use-instruktion. När den tilldelas är kvantbiten alltid i Zero-tillståndet.
Genom att placera i superposition med -åtgärden och mäta den med den inbyggda -åtgärden blir resultatet ett annat värde varje gång Qubit H koden M anropas.
När en Qubit har frigjorts måste den försättas i Zero-tillståndet igen. Annars rapporteras ett körningsfel i simulatorn. Ett enkelt sätt att göra detta på är att anropa Reset.
Visualisera koden med Bloch-sfären
I Bloch-sfären representerar nordpolen det klassiska värdet 0 och sydpolen det klassiska värdet 1. Alla superpositioner kan representeras av en punkt på sfären (visas med en pil). Ju närmare pilen är en pol, desto högre är sannolikheten att kvantbiten minimeras till det klassiska värde som tilldelades till polen när den mättes. Kvantbitstillståndet som representeras av den röda pilen nedan har till exempel en högre sannolikhet att ge värdet 0 om vi mäter det.
Vi kan använda den här representationen till att visualisera vad koden gör:
- Först börjar vi med en kvantbit som initierats i tillståndet 0. Vi använder
Htill att skapa en superposition där sannolikheten för 0 och 1 är densamma.
- Sedan mäter vi kvantbiten och sparar utdatan:
Eftersom resultatet av mätningen är helt slumpmässigt har vi fått en slumpmässig bit. Vi kan anropa den här åtgärden flera gånger för att skapa heltal. Om vi till exempel anropar åtgärden tre gånger för att få tre slumpmässiga bitar, kan vi bygga slumpmässiga 3-bitarstal (det vill säga ett slumptal mellan 0 och 7).
Skapa en komplett slumptalsgenerator
Nu när du har en åtgärd som genererar slumpmässiga bitar kan du kombinera flera slumpmässiga bitar för att skapa en komplett Q# kvantgenerator för slumptal. Du kan använda ett Q# program eller ett värdprogram för att göra det.
Definiera logiken för slumptalsgeneratorn
Först ska vi beskriva logiken för en slumptalsgenerator, förutsatt att det redan finns en generator för slumpmässiga bitar:
- Definiera
maxsom det maximala tal som du vill generera. - Definiera antalet slumpmässiga bitar som du behöver generera. Detta görs genom att beräkna hur många bitar,
nBits, som vi behöver för att uttrycka heltal upp till max. - Generera en slumpmässig bitsträng som
nBitsär i längd. - Om bitsträngen representerar ett tal som är större än
maxgår du tillbaka till steg tre. - I annat fall är processen slutförd. Returnera det genererade talet som ett heltal.
Definiera åtgärden
Definiera SampleRandomNumberInRange åtgärden, som upprepade gånger anropar GenerateRandomBit åtgärden för att skapa en sträng med bitar.
Ändra Program.qs så här:
namespace Qrng {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Convert;
operation GenerateRandomBit() : Result {
// Allocate a qubit.
use q = Qubit();
// Put the qubit to superposition.
H(q);
// It now has a 50% chance of being measured 0 or 1.
// Measure the qubit value.
return M(q);
}
operation SampleRandomNumberInRange(max : Int) : Int {
mutable output = 0;
repeat {
mutable bits = new Result[0];
for idxBit in 1..BitSizeI(max) {
set bits += [GenerateRandomBit()];
}
set output = ResultArrayAsInt(bits);
} until (output <= max);
return output;
}
}
Vi tar och går igenom den nya koden.
För att kunna beräkna antalet bitar som behövs för att uttrycka heltal upp till max, tillhandahåller biblioteket funktionen för Microsoft.Quantum.Math att utföra den här BitSizeI uppgiften.
Åtgärden SampleRandomNumberInRange använder en loop för att generera repeat slumpmässiga tal tills den genererar ett som är lika med eller mindre än max.
for-loopen i fungerar exakt likadant som en repeat for-loop i andra programmeringsspråk.
I det här exemplet är output och bits föränderliga variabler. Föränderliga variabler kan ändras under beräkningen. Du använder set-direktivet för att ändra värdet för en föränderlig variabel.
Funktionen ResultArrayAsInt kommer från Microsoft.Quantum.Convert library . Den här funktionen konverterar bitsträngen till ett positivt heltal.
Programmet Qrng kan nu generera slumpmässiga tal. Ändra Program.qs så här för att definiera startpunkten.
- Q#program med Visual Studio eller Visual Studio Code
- Python med Visual Studio Code eller kommandotolken
- C# med Visual Studio Code eller Visual Studio
Om du vill skapa Q# det fullständiga programmet lägger du till följande startpunkt i Q# programmet:
namespace Qrng {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Math;
open Microsoft.Quantum.Convert;
operation GenerateRandomBit() : Result {
// Allocate a qubit.
use q = Qubit();
// Put the qubit to superposition.
H(q);
// It now has a 50% chance of being measured 0 or 1.
// Measure the qubit value.
return M(q);
}
operation SampleRandomNumberInRange(max : Int) : Int {
mutable output = 0;
repeat {
mutable bits = new Result[0];
for idxBit in 1..BitSizeI(max) {
set bits += [GenerateRandomBit()];
}
set output = ResultArrayAsInt(bits);
} until (output <= max);
return output;
}
@EntryPoint()
operation SampleRandomNumber() : Int {
let max = 50;
Message($"Sampling a random number between 0 and {max}: ");
return SampleRandomNumberInRange(max);
}
}
Programmet kör åtgärden eller funktionen som är markerad med attributet på en simulator eller resursberäknare, beroende på @EntryPoint() projektkonfigurationen och kommandoradsalternativen.
I Visual Studio trycker du bara på Ctrl + F5 för att köra skriptet.
Skapa Program.qs första gången genom att skriva följande i terminalfönstret i VS Code:
dotnet build
För efterföljande körningar behöver du inte bygga det igen. Du kör det bara genom att skriva följande kommando och trycka på Retur:
dotnet run --no-build
Anteckning
Det här kodfragmentet körs för närvarande inte på några tillgängliga Azure Quantum maskinvarumål, eftersom anropsbar kräver en ResultArrayAsInt QPU med fullständig beräkningsprofil.
Nästa steg
I självstudien Q# Utforska sammanbrott med visas hur du skriver ett program som manipulerar och mäter qubits och visar effekterna av Q# superposition och sammanskar.
Konfigurera Azure Quantum fler sätt att lära sig Q# och kvantprogrammering.