Oktatóanyag: A kvantum-összefonódás felfedezése Q#
Ebben az oktatóanyagban egy Q# olyan programot ír, amely manipulálja és méri a qubiteket, és bemutatja a szuperpozíció és az összefonódás hatásait. Két qubitet készíthet elő egy adott kvantumállapotban, megtanulhatja, hogyan lehet a qubiteken Q# működni az állapotuk megváltoztatásához, és bemutatja a szuperpozíció és az összefonódás hatásait. A program összeállításával bemutathatja a Q# qubitállapotokat, a műveleteket és a méréseket.
Az alábbiakban néhány fontos fogalmat érdemes megismerni a kezdés előtt:
- Ha a klasszikus bitek egyetlen bináris értéket, például 0-t vagy 1-et tartanak, a qubit állapota két kvantumállapot szuperpozíciójában lehet, 0 és 1. Minden lehetséges kvantumállapothoz tartozik egy valószínűségi amplitúdó.
- A qubit mérése egy bizonyos valószínűségű bináris eredményt hoz létre, és szuperpozícióból módosítja a qubit állapotát.
- Több qubit is összefonódhat, így egymástól függetlenül nem írhatók le. Vagyis bármi is történik az egyik qubit egy összefonódott párban, az a másik qubitel is megtörténik.
Az oktatóanyag segítségével megtanulhatja a következőket:
- Hozzon létre Q# műveleteket a qubit kívánt állapotba való inicializálásához.
- Helyezzen egy qubitet szuperpozícióba.
- Fonjon össze egy pár qubitet.
- Mérje meg a qubitet, és figyelje meg az eredményeket.
Tipp.
Ha fel szeretné gyorsítani a kvantum-számítástechnika folyamatát, tekintse meg az Azure Quantum-webhely egyedi funkcióját, az Azure Quantum-ot. Itt futtathat beépített mintákat vagy saját Q# programokat, új Q# kódot hozhat létre az üzeneteiből, megnyithatja és futtathatja a kódot a WEBES VS Code-ban Q#egy kattintással, és kérdéseket tehet fel a Copilotnak a kvantum-számítástechnikával kapcsolatban.
Előfeltételek
A kódmintát az Azure Quantum Copilot-ban való futtatásához a következőkre van szüksége:
- Egy Microsoft (MSA) e-mail-fiók.
A Copilotról további információt az Azure Quantum felfedezése című témakörben talál.
Qubit inicializálása ismert állapotba
Az első lépés egy Q# olyan művelet definiálása, amely inicializál egy qubitet egy ismert állapotba. Ez a művelet meghívható úgy, hogy egy qubitet klasszikus állapotra állítson be, ami azt jelenti, hogy méréskor az idő 100%-át adja vissza Zero
, vagy az idő 100%-át adja vissza One
. A qubit mérése olyan típust Q#Result
ad vissza, amelynek értéke vagy Zero
értéke One
csak .
Nyissa meg az Azure Quantum Copilotját, és másolja a következő kódot a kódszerkesztő ablakába. Még ne válassza a Futtatás lehetőséget; a kódot majd az oktatóanyag későbbi részében fogja futtatni.
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
A példakód két szabványos műveletet mutat be, M
amelyek X
átalakítják a qubit állapotát.
A SetQubitState
művelet:
- Két paramétert vesz fel: egy névvel ellátott típust
Result
, amely a qubit kívánt állapotát jelöli (desired
vagyZero
), és egy típustOne
.Qubit
- Olyan mérési műveletet hajt végre, amely méri a qubit (
M
vagyZero
) állapotát,One
és összehasonlítja az eredményt a megadottdesired
értékkel. - Ha a mérés nem egyezik az összehasonlított értékkel, egy műveletet futtat
X
, amely a qubit állapotát oda fordítja, ahol a mérés valószínűségei visszatérnekZero
, ésOne
fordítottak lesznek. ÍgySetQubitState
mindig a kívánt állapotba helyezi a cél qubitet.
Tesztművelet írása a Bell állapotának teszteléséhez
Ezután a művelet hatásának SetQubitState
bemutatásához hozzon létre egy másik műveletet.Main
Ez a művelet két qubitet foglal le, meghívja SetQubitState
az első qubitet egy ismert állapotra, majd méri a qubiteket az eredmények megtekintéséhez.
Másolja a következő kódot a kódszerkesztő ablakába a SetQubitState
művelet alatt.
operation Main() : (Int, Int, Int, Int) {
mutable numOnesQ1 = 0;
mutable numOnesQ2 = 0;
let count = 1000;
let initial = One;
// allocate the qubits
use (q1, q2) = (Qubit(), Qubit());
for test in 1..count {
SetQubitState(initial, q1);
SetQubitState(Zero, q2);
// measure each qubit
let resultQ1 = M(q1);
let resultQ2 = M(q2);
// Count the number of 'Ones' returned:
if resultQ1 == One {
numOnesQ1 += 1;
}
if resultQ2 == One {
numOnesQ2 += 1;
}
}
// reset the qubits
SetQubitState(Zero, q1);
SetQubitState(Zero, q2);
// Display the times that |0> is returned, and times that |1> is returned
Message($"Q1 - Zeros: {count - numOnesQ1}");
Message($"Q1 - Ones: {numOnesQ1}");
Message($"Q2 - Zeros: {count - numOnesQ2}");
Message($"Q2 - Ones: {numOnesQ2}");
return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 );
}
A kódban a változók és a count
változók initial
értéke és 1000
One
értéke. Ez inicializálja az első qubitet, One
és 1000-szer méri az egyes qubiteket.
A Main
művelet:
- Beállítja a számláló és a kezdeti qubit állapot változóit.
- Meghívja az
use
utasítást két qubit inicializálására. - Ciklusok iterációkhoz
count
. Minden ciklushoz- Az első qubit megadott értékének megadására
SetQubitState
irányuló hívásokinitial
. - Ismét meghívja
SetQubitState
a második qubit állapotátZero
. - A művelettel
M
méri az egyes qubiteket. - A visszaadott
One
qubitek számát tárolja.
- Az első qubit megadott értékének megadására
- A ciklus befejeződése után ismét meghívja
SetQubitState
a qubiteket egy ismert állapotra (Zero
), hogy mások is lefoglalják a qubiteket egy ismert állapotban. Az utasítás alaphelyzetbe állításárause
van szükség. - Végül a függvény használatával nyomtatja ki az
Message
eredményeket a Copilot kimeneti ablakaiba, mielőtt visszaadja az eredményeket.
A kód futtatása az Azure Quantum Copilotjában
Mielőtt továbblépne a szuperpozíciós és összefonódási eljárásokra, addig tesztelheti a kódot, hogy lássa a qubitek inicializálását és mérését.
A kód önálló programként való futtatásához a Copilot fordítójának Q# tudnia kell, hol kezdje a programot. Mivel nincs megadva névtér, a fordító felismeri az alapértelmezett belépési pontot műveletként Main
. További információ: Projektek és implicit névterek.
A Q# programnak eddig a pontig a következőképpen kell kinéznie:
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
operation Main() : (Int, Int, Int, Int) {
mutable numOnesQ1 = 0;
mutable numOnesQ2 = 0;
let count = 1000;
let initial = One;
// allocate the qubits
use (q1, q2) = (Qubit(), Qubit());
for test in 1..count {
SetQubitState(initial, q1);
SetQubitState(Zero, q2);
// measure each qubit
let resultQ1 = M(q1);
let resultQ2 = M(q2);
// Count the number of 'Ones' returned:
if resultQ1 == One {
numOnesQ1 += 1;
}
if resultQ2 == One {
numOnesQ2 += 1;
}
}
// reset the qubits
SetQubitState(Zero, q1);
SetQubitState(Zero, q2);
// Display the times that |0> is returned, and times that |1> is returned
Message($"Q1 - Zeros: {count - numOnesQ1}");
Message($"Q1 - Ones: {numOnesQ1}");
Message($"Q2 - Zeros: {count - numOnesQ2}");
Message($"Q2 - Ones: {numOnesQ2}");
return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 );
}
Másolja és illessze be a teljes kódmintát az Copilot for Azure Quantum kódablakába, állítsa a csúszkát az "1" értékre, és válassza a Futtatáslehetőséget. Az eredmények a hisztogramban és az Eredmények mezőkben jelennek meg.
Q1 - Zeros: 0
Q1 - Ones: 1000
Q2 - Zeros: 1000
Q2 - Ones: 0
Mivel a qubiteket még nem manipulálták, megtartották a kezdeti értékeket: az első qubit minden alkalommal visszatér One
, a második qubit pedig visszaadja Zero
őket.
Ha módosítja initial
Zero
a program értékét, és újra futtatja a programot, vegye figyelembe, hogy az első qubit is minden alkalommal visszatér Zero
.
Q1 - Zeros: 1000
Q1 - Ones: 0
Q2 - Zeros: 1000
Q2 - Ones: 0
Tipp.
Válassza a Ctrl-Z billentyűkombinációt vagy > szerkesztése lehetőséget, és mentse a fájlt, amikor tesztmódosítást vezet be a kódon, mielőtt újra futtatja.
Qubit elhelyezése szuperpozícióba
Jelenleg a program qubitjei mind klasszikus állapotban vannak, vagyis 1 vagy 0. Ezt azért tudja, mert a program inicializálja a qubiteket egy ismert állapotba, és nem adott hozzá semmilyen folyamatot a módosításukhoz. A qubitek összefonódása előtt az első qubitet szuperpozíciós állapotba kell helyeznie, ahol a qubit mérése az idő ~50%-át, az Zero
idő ~50%-át adja vissza One
. Fogalmilag a qubitet úgy lehet elképzelni, hogy egyenlő a mérés valószínűsége, Zero
vagy One
.
A qubit szuperpozícióba Q# helyezéséhez adja meg a hadamard vagy hadamard H
műveletet. Emlékezzen vissza a X
qubit inicializálásáról egy korábban ismert állapotműveletre, amely 0-ról 1-re tükrözte a qubitet (vagy fordítva); a H
művelet félúton megfordítja a qubitet egyenlő valószínűségű Zero
vagy One
. Méréskor a szuperpozícióban lévő qubitnek nagyjából azonos számú Zero
és One
eredményt kell visszaadnia.
Módosítsa a kódot a műveletben úgy Main
, hogy One
visszaállítja a kezdeti értéket, és beszúr egy sort a H
művelethez:
for test in 1..count {
use (q1, q2) = (Qubit(), Qubit());
for test in 1..count {
SetQubitState(initial, q1);
SetQubitState(Zero, q2);
H(q1); // Add the H operation after initialization and before measurement
// measure each qubit
let resultQ1 = M(q1);
let resultQ2 = M(q2);
...
Most, amikor futtatja a programot, láthatja az első qubit eredményeit a szuperpozícióban.
Q1 - Zeros: 523 // results vary
Q1 - Ones: 477
Q2 - Zeros: 1000
Q2 - Ones: 0
Minden alkalommal, amikor futtatja a programot, az első qubit eredményei kissé eltérnek, de közel 50% One
és 50% Zero
lesz, míg a második qubit eredményei mindig megmaradnak Zero
.
Q1 - Zeros: 510
Q1 - Ones: 490
Q2 - Zeros: 1000
Q2 - Ones: 0
Az első qubit Zero
inicializálása hasonló eredményeket ad vissza.
Q1 - Zeros: 504
Q1 - Ones: 496
Q2 - Zeros: 1000
Q2 - Ones: 0
Feljegyzés
Az Azure Quantum Copilot csúszkája mozgatásával és a felvételek számának növelésével láthatja, hogy a szuperpozíciós eredmények hogyan változnak kissé a felvételek eloszlásához képest.
Két qubit összefonódása
Ahogy korábban említettük, az összekapcsolt qubitek úgy vannak csatlakoztatva, hogy egymástól függetlenül nem írhatók le. Vagyis bármilyen művelet is történik egy qubittel, az összefonódott qubittel is. Ez lehetővé teszi az egyik qubit eredményül kapott állapotát mérés nélkül, csak a másik qubit állapotának mérésével. (Ez a példa két qubitet használ, de három vagy több qubitet is össze lehet fonni).
Az összefonódás Q# engedélyezéséhez adja meg a műveletet, amely a CNOT
Controlled-NOT nevet jelenti. A művelet két qubiten való futtatásának eredménye a második qubit tükrözése, ha az első qubit az One
.
Közvetlenül a művelet után adja hozzá a CNOT
műveletet a programhoz H
. A teljes programnak így kell kinéznie:
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
operation Main() : (Int, Int, Int, Int) {
mutable numOnesQ1 = 0;
mutable numOnesQ2 = 0;
let count = 1000;
let initial = Zero;
// allocate the qubits
use (q1, q2) = (Qubit(), Qubit());
for test in 1..count {
SetQubitState(initial, q1);
SetQubitState(Zero, q2);
H(q1);
CNOT(q1, q2); // Add the CNOT operation after the H operation
// measure each qubit
let resultQ1 = M(q1);
let resultQ2 = M(q2);
// Count the number of 'Ones' returned:
if resultQ1 == One {
numOnesQ1 += 1;
}
if resultQ2 == One {
numOnesQ2 += 1;
}
}
// reset the qubits
SetQubitState(Zero, q1);
SetQubitState(Zero, q2);
// Display the times that |0> is returned, and times that |1> is returned
Message($"Q1 - Zeros: {count - numOnesQ1}");
Message($"Q1 - Ones: {numOnesQ1}");
Message($"Q2 - Zeros: {count - numOnesQ2}");
Message($"Q2 - Ones: {numOnesQ2}");
return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 );
}
A program futtatásakor a következőhöz hasonlót kell látnia:
Q1 - Zeros: 502 // results will vary
Q1 - Ones: 498
Q2 - Zeros: 502
Q2 - Ones: 498
Figyelje meg, hogy az első qubit statisztikái nem változtak (még mindig ~50/50 esély van egy Zero
vagy egy One
mérés után), de a második qubit mérési eredményei mindig megegyeznek az első qubit mérésével, függetlenül attól, hogy hányszor futtatja a programot. A CNOT
művelet összefonta a két qubitet, így bármi is történjen az egyikvel, a másikat is.
Előfeltételek
A kódminta fejlesztése és futtatása a helyi fejlesztési környezetben:
- A Visual Studio Code legújabb verziója, vagy nyissa meg a VS Code-ot a weben.
- Az Azure Quantum Development Kit bővítmény legújabb verziója. A telepítés részleteiért lásd: QDK-bővítmény beállítása.
Új Q# fájl létrehozása
- Nyissa meg a Visual Studio Code-ot, és válassza a Fájl > új szövegfájlja lehetőséget egy új fájl létrehozásához.
- Mentse a fájlt
CreateBellStates.qs
néven. Ez a fájl tartalmazza a Q# program kódját.
Qubit inicializálása ismert állapotba
Az első lépés egy Q# olyan művelet definiálása, amely inicializál egy qubitet egy ismert állapotba. Ez a művelet meghívható úgy, hogy egy qubitet klasszikus állapotra állítson be, ami azt jelenti, hogy az idő 100%-át adja vissza Zero
, vagy az idő 100%-át adja vissza One
.
Zero
és One
olyan Q# értékek, amelyek a qubit mérésének csak két lehetséges eredményét jelölik.
Nyissa meg CreateBellStates.qs
és másolja ki a következő kódot:
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
A példakód két szabványos műveletet mutat be, M
amelyek X
átalakítják a qubit állapotát.
A SetQubitState
művelet:
- Két paramétert vesz fel: egy névvel ellátott típust
Result
, amely a qubit kívánt állapotát jelöli (desired
vagyZero
), és egy típustOne
.Qubit
- Olyan mérési műveletet hajt végre, amely méri a qubit (
M
vagyZero
) állapotát,One
és összehasonlítja az eredményt a megadottdesired
értékkel. - Ha a mérés nem egyezik az összehasonlított értékkel, egy műveletet futtat
X
, amely a qubit állapotát oda fordítja, ahol a mérés valószínűségei visszatérnekZero
, ésOne
fordítottak lesznek. ÍgySetQubitState
mindig a kívánt állapotba helyezi a cél qubitet.
Tesztművelet írása a Bell állapotának teszteléséhez
Ezután a művelet hatásának SetQubitState
bemutatásához hozzon létre egy másik műveletet.Main
Ez a művelet két qubitet foglal le, az SetQubitState
első qubitet egy ismert állapotba állítja, majd méri a qubiteket az eredmények megtekintéséhez.
A művelet után adja hozzá a következő műveletet CreateBellStates.qs
a fájlhoz SetQubitState
:
operation Main() : (Int, Int, Int, Int) {
mutable numOnesQ1 = 0;
mutable numOnesQ2 = 0;
let count = 1000;
let initial = One;
// allocate the qubits
use (q1, q2) = (Qubit(), Qubit());
for test in 1..count {
SetQubitState(initial, q1);
SetQubitState(Zero, q2);
// measure each qubit
let resultQ1 = M(q1);
let resultQ2 = M(q2);
// Count the number of 'Ones' returned:
if resultQ1 == One {
numOnesQ1 += 1;
}
if resultQ2 == One {
numOnesQ2 += 1;
}
}
// reset the qubits
SetQubitState(Zero, q1);
SetQubitState(Zero, q2);
// Display the times that |0> is returned, and times that |1> is returned
Message($"Q1 - Zeros: {count - numOnesQ1}");
Message($"Q1 - Ones: {numOnesQ1}");
Message($"Q2 - Zeros: {count - numOnesQ2}");
Message($"Q2 - Ones: {numOnesQ2}");
return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 );
}
A kódban a változók és a count
változók initial
értéke és 1000
One
értéke. Ez a lépés inicializálja az első qubitet One
, és 1000-szer méri az egyes qubiteket.
A Main
művelet:
- Két paramétert vesz fel:
count
a mérések futtatásának számát, valamintinitial
a qubit inicializálásához szükséges állapotot. - Meghívja az
use
utasítást két qubit inicializálására. - Ciklusok iterációkhoz
count
. Minden ciklushoz- Az első qubit megadott értékének megadására
SetQubitState
irányuló hívásokinitial
. - Ismét meghívja
SetQubitState
a második qubit állapotátZero
. - A művelettel
M
méri az egyes qubiteket. - A visszaadott
One
qubitek számát tárolja.
- Az első qubit megadott értékének megadására
- A ciklus befejeződése után ismét meghívja
SetQubitState
a qubiteket egy ismert állapotra (Zero
), hogy mások is lefoglalják a qubiteket egy ismert állapotban. A qubit alaphelyzetbe állítására azuse
utasításnak van szüksége. - Végül a függvény használatával
Message
kinyomtat egy üzenetet a konzolra az eredmények visszaadása előtt.
A kód futtatása
Mielőtt továbblépne a szuperpozíciós és összefonódási eljárásokra, tesztelje a kódot addig a pontig, hogy megtekintse a qubitek inicializálását és mérését.
A kód önálló programként való futtatásához a Q# fordítónak tudnia kell, hol kezdje a programot. Mivel nincs megadva névtér, a fordító felismeri az alapértelmezett belépési pontot műveletként Main
. További információ: Projektek és implicit névterek.
Az
CreateBellStates.qs
eddig a pontig létrehozott fájlnak a következőképpen kell kinéznie:import Microsoft.Quantum.Intrinsic.*; import Microsoft.Quantum.Canon.*; operation SetQubitState(desired : Result, target : Qubit) : Unit { if desired != M(target) { X(target); } } operation Main() : (Int, Int, Int, Int) { mutable numOnesQ1 = 0; mutable numOnesQ2 = 0; let count = 1000; let initial = One; // allocate the qubits use (q1, q2) = (Qubit(), Qubit()); for test in 1..count { SetQubitState(initial, q1); SetQubitState(Zero, q2); // measure each qubit let resultQ1 = M(q1); let resultQ2 = M(q2); // Count the number of 'Ones' returned: if resultQ1 == One { numOnesQ1 += 1; } if resultQ2 == One { numOnesQ2 += 1; } } // reset the qubits SetQubitState(Zero, q1); SetQubitState(Zero, q2); // Display the times that |0> is returned, and times that |1> is returned Message($"Q1 - Zeros: {count - numOnesQ1}"); Message($"Q1 - Ones: {numOnesQ1}"); Message($"Q2 - Zeros: {count - numOnesQ2}"); Message($"Q2 - Ones: {numOnesQ2}"); return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 ); }
A program futtatása előtt győződjön meg arról, hogy a célprofil korlátlan értékre van állítva. Válassza a Nézet –> Parancskatalógus lehetőséget, keresse meg a QIR-t, válassza Q# beállítása, majd válassza aQ# lehetőséget.
Feljegyzés
Ha a célprofil nincs korlátozva, hibaüzenet jelenik meg a program futtatásakor.
A program futtatásához válassza Q# lehetőséget a lejátszás ikon jobb felső részén, válassza a Futtatás lehetőséget a művelet előtti parancsok listájából, vagy nyomja le a
Main
Ctrl+F5 billentyűkombinációt. A program azMain
alapértelmezett szimulátoron futtatja a műveletet.A kimenet megjelenik a hibakeresési konzolon.
Q1 - Zeros: 0 Q1 - Ones: 1000 Q2 - Zeros: 1000 Q2 - Ones: 0
Mivel a qubiteket még nem manipulálták, megtartották a kezdeti értékeket: az első qubit minden alkalommal visszatér
One
, a második qubit pedig visszaadjaZero
őket.Ha módosítja
initial
Zero
a program értékét, és újra futtatja a programot, vegye figyelembe, hogy az első qubit is minden alkalommal visszatérZero
.Q1 - Zeros: 1000 Q1 - Ones: 0 Q2 - Zeros: 1000 Q2 - Ones: 0
Tipp.
Válassza a Ctrl-Z billentyűkombinációt vagy > szerkesztése lehetőséget, és mentse a fájlt, amikor tesztmódosítást vezet be a kódon, mielőtt újra futtatja.
Qubit elhelyezése szuperpozícióba
Jelenleg a program qubitjei mind klasszikus állapotban vannak, vagyis 1 vagy 0. Ezt azért tudja, mert a program inicializálja a qubiteket egy ismert állapotba, és nem adott hozzá semmilyen folyamatot a módosításukhoz. A qubitek összefonódása előtt az első qubitet szuperpozíciós állapotba helyezi, ahol a qubit mérése az idő 50%-át és Zero
az idő 50%-át adja visszaOne
. Elméletileg a qubit úgy gondolható, hogy félúton a és Zero
a One
.
A qubit szuperpozícióba Q# helyezéséhez adja meg a hadamard vagy hadamard H
műveletet. Emlékezzen vissza a műveletre a X
qubit inicializálásától egy korábbi ismert állapotműveletigOne
Méréskor a szuperpozícióban lévő qubitnek nagyjából azonos számú Zero
és One
eredményt kell visszaadnia.
Módosítsa a művelet kódját úgy, hogy az
Main
tartalmazza aH
műveletet:for test in 1..count { use (q1, q2) = (Qubit(), Qubit()); for test in 1..count { SetQubitState(initial, q1); SetQubitState(Zero, q2); H(q1); // Add the H operation after initialization and before measurement // measure each qubit let resultQ1 = M(q1); let resultQ2 = M(q2); ...
Most, amikor futtatja a programot, láthatja az első qubit eredményeit a szuperpozícióban:
Q1 - Zeros: 523 // results will vary Q1 - Ones: 477 Q2 - Zeros: 1000 Q2 - Ones: 0
Minden alkalommal, amikor futtatja a programot, az első qubit eredményei kissé eltérnek, de közel 50%
One
és 50%Zero
lesz, míg a második qubit eredményei mindig megmaradnakZero
.Q1 - Zeros: 510 Q1 - Ones: 490 Q2 - Zeros: 1000 Q2 - Ones: 0
Az első qubit
Zero
inicializálása hasonló eredményeket ad vissza.Q1 - Zeros: 504 Q1 - Ones: 496 Q2 - Zeros: 1000 Q2 - Ones: 0
Két qubit összefonódása
Ahogy korábban említettük, az összekapcsolt qubitek úgy vannak csatlakoztatva, hogy egymástól függetlenül nem írhatók le. Vagyis bármilyen művelet is történik egy qubittel, az összefonódott qubittel is. Ez lehetővé teszi az egyik qubit eredményül kapott állapotát mérés nélkül, csak a másik qubit állapotának mérésével. (Ez a példa két qubitet használ, de három vagy több qubitet is össze lehet fonni).
Az összefonódás Q# engedélyezéséhez adja meg a műveletet, amely a CNOT
Controlled-NOT nevet jelenti. A művelet két qubiten való futtatásának eredménye a második qubit tükrözése, ha az első qubit az One
.
Közvetlenül a művelet után adja hozzá a
CNOT
műveletet a programhozH
. A teljes programnak így kell kinéznie:import Microsoft.Quantum.Intrinsic.*; import Microsoft.Quantum.Canon.*; operation SetQubitState(desired : Result, target : Qubit) : Unit { if desired != M(target) { X(target); } } operation Main() : (Int, Int, Int, Int) { mutable numOnesQ1 = 0; mutable numOnesQ2 = 0; let count = 1000; let initial = Zero; // allocate the qubits use (q1, q2) = (Qubit(), Qubit()); for test in 1..count { SetQubitState(initial, q1); SetQubitState(Zero, q2); H(q1); CNOT(q1, q2); // Add the CNOT operation after the H operation // measure each qubit let resultQ1 = M(q1); let resultQ2 = M(q2); // Count the number of 'Ones' returned: if resultQ1 == One { numOnesQ1 += 1; } if resultQ2 == One { numOnesQ2 += 1; } } // reset the qubits SetQubitState(Zero, q1); SetQubitState(Zero, q2); // Display the times that |0> is returned, and times that |1> is returned Message($"Q1 - Zeros: {count - numOnesQ1}"); Message($"Q1 - Ones: {numOnesQ1}"); Message($"Q2 - Zeros: {count - numOnesQ2}"); Message($"Q2 - Ones: {numOnesQ2}"); return (count - numOnesQ1, numOnesQ1, count - numOnesQ2, numOnesQ2 ); }
Q1 - Zeros: 502 Q1 - Ones: 498 // results will vary Q2 - Zeros: 502 Q2 - Ones: 498 Result: "(502, 498, 502, 498)"
Az első qubit statisztikái nem változtak (50/50 esély egy Zero
vagy egy One
mérés után), de a második qubit mérési eredményei mindig megegyeznek az első qubit mérésével. A CNOT
művelet összefonta a két qubitet, hogy bármi is történjen az egyikvel, a másik történjen.
A frekvencia hisztogram ábrázolása
Vizualizáljuk a kvantumprogram többszöri futtatásából nyert eredmények eloszlását. A gyakorisági hisztogram segít ezeknek az eredményeknek a valószínűségi eloszlásának megjelenítésében.
Válassza a Nézet –> Parancskatalógus lehetőséget, vagy nyomja le a Ctrl+Shift+P billentyűkombinációt, és írja be a Q#"hisztogram" kifejezést, amely a következőt jeleníti meg: Fájl futtatása és hisztogram megjelenítése lehetőség. Az előző parancsok listájából is kiválaszthatja
Main
. Ezzel a beállítással megnyithatja a Q# hisztogramablakot.Adjon meg több lövést a program végrehajtásához, például 100 lövést, és nyomja le az Enter billentyűt. A hisztogram megjelenik a Q# hisztogram ablakban.
A hisztogram minden sávja egy lehetséges eredménynek felel meg, magassága pedig az eredmény megfigyelésének hányszorosát jelöli. Ebben az esetben 50 különböző egyedi eredmény érhető el. Vegye figyelembe, hogy minden eredménynél az első és a második qubit mérési eredményei mindig azonosak.
Tipp.
A hisztogramot az egér görgetőkerekével vagy egy trackpad-kézmozdulattal nagyíthatja. Nagyításkor görgetés közben az Alt billentyűt lenyomva pásztázhatja a diagramot.
Jelöljön ki egy sávot az eredmény százalékos arányának megjelenítéséhez.
A beállítások megjelenítéséhez válassza a bal felső beállítások ikont . Megjelenítheti az első 10 találatot, a 25 legjobb eredményt vagy az összes találatot. Az eredményeket a magasról az alacsonyra vagy az alacsonyról a magasra is rendezheti.
Kapcsolódó tartalom
További Q# oktatóanyagok:
- A Grover keresési algoritmusa bemutatja, hogyan írhat olyan Q# programot, amely a Grover keresési algoritmusát használja.
- A Quantum Fourier Transform azt vizsgálja, hogyan írhat olyan Q# programot, amely közvetlenül kezeli az adott qubiteket.
- A Quantum Katas öngyors oktatóanyagok és programozási gyakorlatok, amelyek célja a kvantum-számítástechnika és Q# a programozás elemeinek egyidejű tanítása.