Oefening: verschillende superpositiestatussen maken met Q#
In de vorige lessen hebt u geleerd over superpositie en Dirac-notatie. Dat is genoeg theorie voor nu! Laten we de superpositie in Q# verkennen door wat code te schrijven.
In deze les maakt u kwantumsuperpositie en duikt u in kansen met Q# met behulp van de DumpMachine
functie. De DumpMachine
functie dumpt informatie over de huidige status van het kwantumsysteem op het punt waar het wordt aangeroepen.
Een nieuw Q#-bestand maken
- Open Visual Studio Code.
- Selecteer in Visual Studio Code Bestand > nieuw tekstbestand en sla het bestand op als Main.qs.
- Selecteer Weergave -> Opdrachtpalet en typ Q#: Stel het Azure Quantum QIR-doelprofiel in. Druk op Enter.
- Selecteer Q#: Onbeperkt.
Aan de slag met superpositie
Laten we beginnen met een eenvoudig programma dat een willekeurige bit genereert met behulp van een qubit in superpositie. U gebruikt de DumpMachine
functie om de status van de qubit op verschillende punten in het programma te zien.
Voeg de volgende code toe aan het bestand 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; }
Hier roept u
DumpMachine
vier keer aan:- Nadat de qubit is toegewezen.
- Nadat u de qubit in superpositie hebt geplaatst.
- Nadat u de status van de qubit hebt gemeten.
- Nadat u de qubit opnieuw hebt ingesteld.
U splitst de bewerking
MResetZ
in twee bewerkingen:M
enReset
. U doet dit omdat u de status na de meting wilt inspecteren.Als u uw programma wilt uitvoeren op de ingebouwde simulator, klikt u op Uitvoeren boven de bewerking of drukt u op
Main
. Uw uitvoer wordt weergegeven in de console voor foutopsporing.De functie
DumpMachine
maakt een tabel met de informatie die de status van het qubitregister beschrijft. Concreet geeft het de waarschijnlijkheidsamplitude, de waarschijnlijkheid en de fase in radialen voor elke basistoestand.Aan het eind van het programma krijgt u een resultaat van
Zero
ofOne
. Laten we eens kijken naar elke stap.GeΓ―nitialiseerde qubit: elke qubit die met de
use
instructie wordt toegewezen, begint in de status $|0\rangle$.DumpMachine
produceert dus de informatie die overeenkomt met een enkelvoudig qubitregister met de status $|0\rangle$.Initialized qubit: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0β© | 1.0000+0.0000π | 100.0000% | 0.0000
Qubit na het toepassen van H: Na het toepassen
H
bereiden we de qubit voor in de superpositiestatus $|\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 na de meting: Nadat we het resultaat hebben gemeten en opgeslagen, wat een
Zero
ofOne
. Als de resulterende status bijvoorbeeld is, wordtOne
de status van de registers samengevouwen tot $|1\rangle$ en bevindt deze zich niet meer in superpositie.Qubit after the measurement: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |1β© | 1.0000+0.0000π | 100.0000% | 0.0000
Qubit na het opnieuw instellen: met de bewerking
Reset
wordt de qubit opnieuw ingesteld op de status $|0\rangle$. Onthoud dat u voor elke Q#-bewerking altijd de qubits die u gebruikt in de status $|0\rangle$ moet laten, andere bewerkingen deze kunnen gebruiken.Qubit after resetting: DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |0β© | 1.0000+0.0000π | 100.0000% | 0.0000
Notitie
Uw uitvoer kan verschillen omdat de generator voor willekeurige getallen probabilistisch is. De waarschijnlijkheden van de resultaten zijn niet deterministisch.
Andere typen superpositiestatussen verkennen
Nu u weet hoe u de status van een register moet inspecteren, kunt u meer bewerkingen zien die de status van uw qubits wijzigen en deze in een superpositie plaatsen.
De huidige randomgetalgenerator produceert Zero
of One
met een waarschijnlijkheid van 50%. Laten we eens kijken naar een tweede voorbeeld waarmee random getallen met een andere waarschijnlijkheid worden gegenereerd.
Asymmetrische random-bitgenerator
Stel dat u een willekeurige bitgenerator wilt maken die scheef is, dat wil zeggen dat de waarschijnlijkheid van het ophalen Zero
verschilt van de waarschijnlijkheid van het ophalen One
.
U wilt bijvoorbeeld het resultaat Zero
met waarschijnlijkheid $P$ en het resultaat One
met waarschijnlijkheid $1-P$. Hier volgt een geldige qubitstatus die een dergelijke willekeurige bitgenerator produceert:
$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1-P}|1\rangle$$
Hier zijn $\alpha=\sqrt{P}$ en $\beta=\sqrt{1-P}$ respectievelijk de amplitudes van de basisstatussen $|0\rangle$ en $|1\rangle$.
Deze status kan worden verkregen door de operator sequentieel toe te passen $R_y(2\arccos\sqrt{P})$ op een qubit in de toestand $|0\rangle.$ U kunt dit resultaat in Q# bereiken met behulp van de bewerking Ry in de standaardbibliotheek.
Tip
Raadpleeg de zelfstudie Single Qubit Gates in Quantum Katas voor meer informatie over de wiskunde achter bewerkingen met één qubit.
Wijzig Main.qs zoals in het volgende voorbeeld en sla het bestand op. In dit voorbeeld wordt $\alpha$ gekozen als ongeveer $\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; }
Als u uw programma wilt uitvoeren op de ingebouwde simulator, klikt u op Uitvoeren boven de bewerking of drukt u op
Main
. Uw uitvoer wordt weergegeven in de console voor foutopsporing.U kunt zien hoe
DumpMachine
de verwachte status weergeeft nadat u de bewerkingen hebt toegepast en de bijbehorende waarschijnlijkheden weergeeft. U ziet dat de kans op het verkrijgenZero
ongeveer 33,33% is en dat de kans op het verkrijgenOne
ongeveer 66,67% is. De random-bitgenerator is dus scheef.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"
Notitie
De uitvoer kan verschillen omdat de generator voor willekeurige getallen probabilistisch is. De waarschijnlijkheden van de resultaten zijn niet deterministisch.
Superpositie van meerdere qubits
We gaan nu de superposities verkennen van een register dat vele qubits bevat. Als een register bijvoorbeeld uit drie qubits bestaat, hebt u acht basisstatussen:
$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle, |110\rangle,|111\rangle $$
U kunt de status van een willekeurige status met drie qubits dus als volgt uitdrukken:
$$|\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$$
Hier zijn $\alpha_i$ complexe getallen die voldoen aan $\sum|\alpha_i|^2=1$.
U kunt bijvoorbeeld qubits in een uniforme superpositie plaatsen door deze toe te passen op H
elke qubit. U kunt deze uniforme superpositie gebruiken om een andere versie van de kwantum-randomgetalgenerator te maken waarmee 3-bits getallen worden gegenereerd door drie qubits in superpositie te meten in plaats van één qubit drie keer te meten.
Basis | Aantal |
---|---|
$\ket{000}$ | 0 |
$\ket{001}$ | 1 |
$\ket{010}$ | 2 |
$\ket{011}$ | 3 |
$\ket{100}$ | 4 |
$\ket{101}$ | 5 |
$\ket{110}$ | 6 |
$\ket{111}$ | 7 |
Wijzig Main.qs zoals in het volgende voorbeeld en sla het bestand op.
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)); }
Hier ziet u drie concepten:
- De variabele
qubits
vertegenwoordigt nu een matrixQubit
die een lengte van drie heeft. - De bewerkingen
ApplyToEach
enForEach
zijn handig om meerdere qubits te meten en erop te reageren en ze gebruiken minder code. Q#-bibliotheken bieden verschillende soorten bewerkingen en functies die het schrijven van kwantumprogramma's efficiΓ«nter maken. - De
BoolArrayAsInt
enResultArrayAsBoolArray
functies uit deMicrosoft.Quantum.Convert
bibliotheek transformeren de binaireResult
matrix die wordt geretourneerd inForEach(M, qubits)
een geheel getal.
- De variabele
Als u het programma wilt uitvoeren, klikt u op Uitvoeren boven de bewerking of drukt u op
Main
. Uw uitvoer wordt weergegeven in de console voor foutopsporing.Door
DumpMachine
te gebruiken, ziet u hoe het meten van de drie qubits de status van het register doet instorten tot een van de acht mogelijke basisstatussen. Als u bijvoorbeeld het resultaat3
krijgt, betekent dit dat de status van het register is samengevouwen tot $|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"
Notitie
De uitvoer kan verschillen omdat de generator voor willekeurige getallen probabilistisch is. De waarschijnlijkheden van de resultaten zijn niet deterministisch.
De bewerking
ForEach(M, qubit)
meet elk qubit op zijn beurt, waardoor de status geleidelijk instort. U kunt de tussenliggende toestanden ook dumpen na elke meting. Hiervoor wijzigt u Main.qs zoals in het volgende voorbeeld en slaat u het bestand op.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)); }
Hier gebruikt u een
for
-lus om op elke qubit sequentieel te reageren. Q# heeft klassieke mogelijkheden voor stroombeheer, zoalsfor
lussen enif
instructies, die u kunt gebruiken om de stroom van uw programma te beheren.Als u het programma wilt uitvoeren, klikt u op Uitvoeren
Main
Ctrl+F5.U kunt zien hoe elke opeenvolgende meting de kwantumstatus wijzigt, en daardoor de waarschijnlijkheid van het verkrijgen van elke uitkomst. Als uw resultaat bijvoorbeeld nummer vijf is, krijgt u de volgende uitvoer. Laten we kort naar elke stap kijken:
Statusvoorbereiding: Na het toepassen
H
op elke qubit van het register, verkrijgen we een uniforme superpositie.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
Eerste meting: In de eerste meting was
One
het resultaat . Daarom zijn alle amplitudes van de statussen waarvan het meest rechtse qubitZero
is niet meer aanwezig. De amplitudes zijn $|0\rangle=|000\rangle, |2\rangle=|010\rangle, |4\rangle=|100\rangle$ en $|6\rangle= |110\rangle$. De overige amplitudes nemen toe om te voldoen aan de normalisatievoorwaarde.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
Tweede meting: In de tweede meting was
Zero
het resultaat . Daarom verdwijnen alle amplitudes van de statussen waarvan de op een na rechtse (middelste) qubitOne
is. De amplitudes zijn $|3\rangle=|011\rangle$ en $|7\rangle=|111\rangle$. De overige amplitudes nemen toe om te voldoen aan de normalisatievoorwaarde.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |001β© | 0.7071+0.0000π | 50.0000% | 0.0000 |101β© | 0.7071+0.0000π | 50.0000% | 0.0000
Derde meting: In de derde meting was
One
het resultaat . Daarom zijn alle amplitudes van de toestanden waarvan de meest linkse qubit duidelijk isZero
. De enige compatibele status is $|5\rangle=|101\rangle$. Deze status bereikt een waarschijnlijkheidsamplitude van $1$.DumpMachine: Basis | Amplitude | Probability | Phase ----------------------------------------------- |101β© | 1.0000+0.0000π | 100.0000% | 0.0000 Your random number is: Result: "5"
Notitie
De uitvoer kan verschillen omdat de generator voor willekeurige getallen probabilistisch is. De waarschijnlijkheden van de resultaten zijn niet deterministisch.