Övning – Skapa olika superpositionstillstånd med Q#
I de föregående lektionerna lärde du dig om superposition och dirac-notation. Det räcker med teori för tillfället! Nu ska vi utforska superpositionen i Q# genom att skriva lite kod.
I den här lektionen DumpMachine
skapar du kvantsuperposition och undersöker sannolikheter med Q# med hjälp av funktionen . Funktionen DumpMachine
dumpar information om kvantsystemets aktuella status vid den punkt där det anropas.
Skapa en ny Q#-fil
- Öppna Visual Studio Code.
- I Visual Studio Code väljer du Fil > Ny textfil och sparar filen som Main.qs.
- Välj Visa –> Kommandopalett och skriv Q#: Ange Azure Quantum QIR-målprofilen. Tryck på Retur.
- Välj Q#: Obegränsad.
Kom igång med superposition
Vi börjar med ett enkelt program som genererar en slumpmässig bit med hjälp av en qubit i superposition. Du använder DumpMachine
funktionen för att se qubitens tillstånd vid olika tidpunkter i programmet.
Lägg till följande kod i filen Main.qs :
import Microsoft.Quantum.Diagnostics.*; operation Main() : Result { use q = Qubit(); Message("Initialized qubit:"); DumpMachine(); // First dump Message(" "); H(q); Message("Qubit after applying H:"); DumpMachine(); // Second dump Message(" "); let randomBit = M(q); Message("Qubit after the measurement:"); DumpMachine(); // Third dump Message(" "); Reset(q); Message("Qubit after resetting:"); DumpMachine(); // Fourth dump Message(" "); return randomBit; }
Här anropar du
DumpMachine
fyra gånger:- Efter att qubit har allokerats.
- När du har lagt qubiten i superposition.
- När du har mätt kvantbitens tillstånd.
- När du har återställt kvantbiten.
Du delar upp åtgärden
MResetZ
i två åtgärder:M
ochReset
. Du gör det eftersom du vill kontrollera tillståndet efter mätningen.Om du vill köra programmet i den inbyggda simulatorn klickar du på Kör ovanför
Main
åtgärden eller trycker på Ctrl+F5. Dina utdata visas i felsökningskonsolen.Funktionen
DumpMachine
skapar en tabell med information som beskriver qubitregistrets tillstånd. Mer specifikt ger det sannolikhetsamplituden, sannolikheten och fasen i radianer för varje grundtillstånd.I slutet av programmet får du ett resultat på
Zero
ellerOne
. Nu ska vi titta på varje steg.Initierad qubit: Varje qubit som allokeras med instruktionen
use
startar i tillståndet $|0\rangle$. Därmed skaparDumpMachine
den information som motsvarar ett register för en enskild qubit i tillståndet $|0\rangle$.Initialized qubit: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Qubit efter att ha tillämpat H: När vi har tillämpat
H
förbereder vi kvantbiten i superpositionstillståndet $|\psi\rangle=\frac1{\sqrt2} |0\rangle + \frac1{\sqrt2} |1\rangle$.Qubit after applying H: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |1⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Qubit efter mätningen: När vi har mätt och lagrat resultatet, som kan vara en
Zero
ellerOne
. Om det resulterande tillståndet till exempel ärOne
komprimeras tillståndet för register till $|1\rangle$ och är inte längre i superposition.Qubit after the measurement: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |1⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Qubit efter återställning: Åtgärden
Reset
återställer kvantbiten till tillståndet $|0\rangle$. Kom ihåg att du för varje Q#-åtgärd behöver alltid behöver låta de qubitar du använder vara kvar i tillståndet $|0\rangle$ så att den kan användas av andra åtgärder.Qubit after resetting: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Kommentar
Dina utdata kan skilja sig eftersom slumptalsgeneratorn är probabilistisk. Sannolikheten för utfallen är inte deterministisk.
Utforska andra typer av superpositionstillstånd
Nu när du vet hur du inspekterar tillståndet för ett register kan du se fler åtgärder som ändrar tillståndet för dina kvantbitar och placerar dem i en superposition.
Den aktuella slumptalsgeneratorn ger antingen Zero
eller One
med en sannolikhet på 50 %. Nu ska vi titta på ett andra exempel som genererar slumpmässiga tal med olika sannolikheter.
Förskjuten slumpmässig bit-generator
Anta att du vill skapa en slumpmässig bitgenerator som är skev, det vill säga sannolikheten för att få Zero
skiljer sig från sannolikheten att få One
.
Du vill till exempel ha utfallet Zero
med sannolikheten $P$ och resultatet One
med sannolikheten $1-P$. Här är ett giltigt qubit-tillstånd som genererar en sådan slumpmässig bitgenerator:
$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1-P}|1\rangle$$
Här är $\alpha=\sqrt{P}$ och $\beta=\sqrt{1-P}$ amplituderna för bastillstånden $|0\rangle$ respektive $|1\rangle$.
Det här tillståndet kan erhållas genom att sekventiellt tillämpa operatorn $R_y(2\arccos\sqrt{P})$ på en qubit i tillståndet $|0\rangle.$ Du kan uppnå det här resultatet i Q# med hjälp av åtgärden Ry i standardbiblioteket.
Dricks
Mer information om matematiken bakom enkla kvantbitsåtgärder finns i självstudien Single-Qubit Gates i Quantum Katas.
Ändra Main.qs som i följande exempel och spara sedan filen. Det här exemplet väljer $\alpha$ för att vara ungefär $\frac13$.
import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.Math.*; operation Main() : Result { use q = Qubit(); let P = 0.333333; // P is 1/3 Ry(2.0 * ArcCos(Sqrt(P)), q); Message("The qubit is in the desired state."); Message(""); DumpMachine(); // Dump the state of the qubit Message(""); Message("Your skewed random bit is:"); let skewedrandomBit = M(q); Reset(q); return skewedrandomBit; }
Om du vill köra programmet i den inbyggda simulatorn klickar du på Kör ovanför
Main
åtgärden eller trycker på Ctrl+F5. Dina utdata visas i felsökningskonsolen.Du kan se hur
DumpMachine
visar det förväntade tillståndet efter att det har tillämpat åtgärderna och visar de associerade sannolikheterna. Observera att sannolikheten för att fåZero
är cirka 33,33 % och sannolikheten för att fåOne
är cirka 66,67 %. Därför är den slumpmässiga bitgeneratorn skev.The qubit is in the desired state. DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0⟩ | 0.5773+0.0000𝑖 | 33.3333% | 0.0000 |1⟩ | 0.8165+0.0000𝑖 | 66.6667% | 0.0000 Your skewed random bit is: Result: "One"
Kommentar
Dina utdata kan skilja sig eftersom slumptalsgeneratorn är probabilistisk. Sannolikheten för utfallen är inte deterministisk.
Superposition för flera qubitsar
Nu ska vi utforska superpositioner för ett register som omfattar många qubitar. Om ditt register till exempel består av tre qubitar har du åtta bastillstånd:
$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle, |110\rangle,|111\rangle $$
Du kan därför uttrycka ett godtyckligt tillstånd för tre qubitar som:
$$|\psi\rangle=\alpha_0|000\rangle+\alpha_1|001\rangle+\alpha_2|010\rangle+\alpha_3|011\\rangle+\alpha_4|100\rangle+\alpha_5|101\rangle+\alpha_6 |110\rangle+\alpha_7|111\rangle$$
Här är $\alpha_i$ komplexa tal som uppfyller $\sum|\alpha_i|^2=1$.
Du kan till exempel placera kvantbitar i en enhetlig superposition genom att tillämpa på H
varje qubit. Du kan använda den här enhetliga superpositionen för att skapa en annan version av den kvantslumptalsgenerator som genererar tre-bittal genom att mäta tre qubitar i superposition i stället för att mäta en qubit tre gånger.
Bas | Antal |
---|---|
$\ket{000}$ | 0 |
$\ket{001}$ | 1 |
$\ket{010}$ | 2 |
$\ket{011}$ | 3 |
$\ket{100}$ | 4 |
$\ket{101}$ | 5 |
$\ket{110}$ | 6 |
$\ket{111}$ | 7 |
Ändra Main.qs som i följande exempel och spara sedan filen.
import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.Math.*; import Microsoft.Quantum.Convert.*; import Microsoft.Quantum.Arrays.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); let result = ForEach(M, qubits); Message("Measuring the qubits collapses the superposition to a basis state."); DumpMachine(); ResetAll(qubits); return BoolArrayAsInt(ResultArrayAsBoolArray(result)); }
Här ser du tre begrepp:
- Variabeln
qubits
representerar nu enQubit
-matris som har längden tre. - Åtgärderna
ApplyToEach
ochForEach
är användbara för att mäta och agera på flera kvantbitar, och de använder mindre kod. Q#-bibliotek erbjuder många typer av åtgärder och funktioner som gör det mer effektivt att skriva kvantprogram. - Funktionerna
BoolArrayAsInt
ochResultArrayAsBoolArray
frånMicrosoft.Quantum.Convert
biblioteket omvandlar den binäraResult
matris som returneras avForEach(M, qubits)
till ett heltal.
- Variabeln
Om du vill köra programmet klickar du på Kör ovanför åtgärden
Main
eller trycker på Ctrl+F5. Dina utdata visas i felsökningskonsolen.Med hjälp av
DumpMachine
ser du hur mätningen av tre qubitar kollapsar registrets tillstånd till ett av de åtta möjliga bastillstånden. Om du till exempel får resultatet3
innebär det att registrets tillstånd har minimerats till $|110\rangle$.The qubit register in a uniform superposition: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 Measuring the qubits collapses the superposition to a basis state. DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |110⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Result: "3"
Kommentar
Dina utdata kan skilja sig eftersom slumptalsgeneratorn är probabilistisk. Sannolikheten för utfallen är inte deterministisk.
Åtgärden
ForEach(M, qubit)
mäter varje qubit i turordning och kollapsar gradvis tillståndet. Du kan också dumpa mellanliggande tillstånd efter varje mätning. Om du vill göra det ändrar du Main.qs som i följande exempel och sparar sedan filen.import Microsoft.Quantum.Diagnostics.*; import Microsoft.Quantum.Measurement.*; import Microsoft.Quantum.Math.*; import Microsoft.Quantum.Convert.*; operation Main() : Int { use qubits = Qubit[3]; ApplyToEach(H, qubits); Message("The qubit register in a uniform superposition: "); DumpMachine(); mutable results = []; for q in qubits { Message(" "); set results += [M(q)]; DumpMachine(); } Message(" "); Message("Your random number is: "); ResetAll(qubits); return BoolArrayAsInt(ResultArrayAsBoolArray(results)); }
Här använder du en
for
-slinga för att agera på varje qubit sekventiellt. Q# har klassiska flödeskontrollfunktioner, till exempelfor
loopar ochif
instruktioner, som du kan använda för att styra flödet i ditt program.Om du vill köra programmet klickar du på Kör från listan med kommandon ovanför
Main
åtgärden eller trycker på Ctrl+F5.Du kan se hur varje efterföljande mätning ändrar kvanttillståndet och därmed sannolikheten att få varje resultat. Om resultatet till exempel är nummer fem får du följande utdata. Vi tittar kort på varje steg:
Tillståndsförberedelse: När vi har tillämpat
H
på varje kvantbit i registret får vi en enhetlig superposition.The qubit register in a uniform superposition: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |000⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |001⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |010⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |011⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |100⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |101⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |110⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000 |111⟩ | 0.3536+0.0000𝑖 | 12.5000% | 0.0000
Första mätningen: I den första mätningen blev
One
resultatet . Därför är alla amplituder för de tillstånd vars qubit längst till höger ärZero
inte längre tillgängliga. Amplituderna är $|0\rangle=|000\rangle, |2\rangle=|010\rangle, |4\rangle=|100\rangle$ och $|6\rangle= |110\rangle$. Resten av amplituderna ökar för att uppfylla normaliseringsvillkoret.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |001⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |011⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |101⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000 |111⟩ | 0.5000+0.0000𝑖 | 25.0000% | 0.0000
Andra mätningen: I den andra mätningen blev
Zero
resultatet . Därför försvinner alla amplituder för de tillstånd vars qubit näst längst till höger (i mitten) ärOne
. Amplituderna är $|3\rangle=|011\rangle$ and $|7\rangle=|111\rangle$. Resten av amplituderna ökar för att uppfylla normaliseringsvillkoret.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |001⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000 |101⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Tredje mätningen: I den tredje mätningen blev
One
resultatet . Därför rensas alla amplituder i de tillstånd vars vänstra qubit ärZero
klar. Det enda kompatibla tillståndet är $|5\rangle=|101\rangle$. Det här tillståndet får en amplitudsannolikhet på $1$.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |101⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000 Your random number is: Result: "5"
Kommentar
Dina utdata kan skilja sig eftersom slumptalsgeneratorn är probabilistisk. Sannolikheten för utfallen är inte deterministisk.