Kurz: Prozkoumání kvantového propletení pomocí Q#
V tomto kurzu napíšete Q# program, který manipuluje s qubity a měří je a demonstruje účinky superpozice a propletení. Připravíte dva qubity v konkrétním kvantovém stavu, naučíte se pracovat s qubity Q# , abyste změnili jejich stav, a předvedete účinky superpozice a propletení. Sestavíte program Q# kus po kusu, abyste představili stavy, operace a měření qubitu.
Tady je několik klíčových konceptů, které je potřeba pochopit před tím, než začnete:
- Pokud klasické bity obsahují jednu binární hodnotu, například 0 nebo 1, může být stav qubitu v superpozici dvou kvantových stavů, 0 a 1. Každý možný kvantový stav má přidruženou amplitudu pravděpodobnosti.
- Měření qubitu vytvoří binární výsledek s určitou pravděpodobností a změní stav qubitu z superpozice.
- Více qubitů může být propletené tak, že je nelze popsat nezávisle na sobě. To znamená, že cokoli se stane s jedním qubitem v propleteném páru, stane se také s druhým qubitem.
V tomto kurzu se naučíte:
- Vytvořte Q# operace pro inicializaci qubitu do požadovaného stavu.
- Umístěte qubit do superpozice.
- Propletení páru qubitů.
- Změřte qubit a sledujte výsledky.
Tip
Pokud chcete urychlit cestu k kvantovému computingu, podívejte se na kód s Využitím Azure Quantum, která je jedinečnou funkcí webu Azure Quantum. Tady můžete spouštět předdefinované Q# ukázky nebo vlastní Q# programy, vygenerovat nový Q# kód z výzev, otevřít a spustit kód ve VS Code pro web jedním kliknutím a pokládat Copilot jakékoli otázky týkající se kvantového computingu.
Požadavky
Pokud chcete spustit vzorový kód v Copilotu pro Azure Quantum, potřebujete:
- E-mailový účet Microsoft (MSA).
Další informace o copilotu najdete v tématu Prozkoumání Azure Quantum.
Inicializace qubitu do známého stavu
Prvním krokem je definování Q# operace, která inicializuje qubit do známého stavu. Tuto operaci lze volat k nastavení qubitu na klasický stav, což znamená, že při měření vrátí Zero
buď 100 % času, nebo vrátí One
100 % času. Měření qubitu Q# vrátí typ Result
, který může mít pouze hodnotu Zero
nebo One
.
Otevřete Copilot pro Azure Quantum a zkopírujte následující kód do okna editoru kódu. Ještě neklikejte na Spustit . Kód spustíte později v kurzu.
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
Příklad kódu představuje dvě standardní operace a M
X
, které transformují stav qubitu.
Operace SetQubitState
:
- Přebírá dva parametry: typ
Result
, pojmenovanýdesired
, který představuje požadovaný stav qubitu být v (Zero
neboOne
) a typQubit
. - Provede měrnou operaci,
M
která měří stav qubitu (Zero
neboOne
) a porovná výsledek s hodnotou zadanou vdesired
. - Pokud měření neodpovídá porovnávané hodnotě, spustí
X
operaci, která překlopí stav qubitu na místo, kde se pravděpodobnosti měrnéhoZero
vrácení aOne
jsou obrácené. Tímto způsobemSetQubitState
vždy umístí cílový qubit do požadovaného stavu.
Napsání testovací operace pro otestování stavu zvonu
Dále, chcete-li předvést účinek SetQubitState
operace, vytvořte další operaci s názvem Main
. Tato operace přidělí dva qubity, zavolá SetQubitState
první qubit do známého stavu a pak změří qubity, aby se zobrazily výsledky.
Zkopírujte následující kód do okna editoru SetQubitState
kódu pod operací.
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 {
set numOnesQ1 += 1;
}
if resultQ2 == One {
set 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 );
}
V kódu count
jsou proměnné initial
nastavené na 1000
a One
v uvedeném pořadí. Tím se inicializuje první qubit a One
měří každý qubit 1000krát.
Operace Main
:
- Nastaví proměnné pro čítač a počáteční stav qubitu.
- Zavolá příkaz
use
, který inicializuje dva qubity. - Smyčky iterací
count
Pro každou smyčku- Volání
SetQubitState
, která nastaví zadanouinitial
hodnotu na prvním qubitu. - Voláním
SetQubitState
znovu nastavíte druhý qubit doZero
stavu. M
Použije operaci k měření jednotlivých qubitů.- Ukládá počet měření pro každý qubit, který vrací
One
.
- Volání
- Po dokončení smyčky se znovu zavolá
SetQubitState
k resetování qubitů do známého stavu (Zero
), aby ostatní mohli přidělit qubity ve známém stavu. Příkaz vyžadujeuse
resetování. - Nakonec pomocí
Message
funkce vytiskne výsledky do výstupních oken Copilot před vrácením výsledků.
Spuštění kódu v Copilotu pro Azure Quantum
Než přejdete k postupům superpozice a propletení, můžete kód otestovat až do tohoto okamžiku, abyste viděli inicializaci a měření qubitů.
Aby bylo možné spustit kód jako samostatný program, Q# kompilátor v Copilotu musí vědět , kde program spustit. Vzhledem k tomu, že není zadán žádný obor názvů, kompilátor rozpozná jako operaci výchozí vstupní bod Main
. Další informace naleznete v tématu Projekty a implicitní obory názvů.
Až do tohoto okamžiku by váš Q# program měl vypadat takto:
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 {
set numOnesQ1 += 1;
}
if resultQ2 == One {
set 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 );
}
Zkopírujte a vložte kompletní vzorový kód do okna copilotu pro kód Azure Quantum , nastavte snímek pro počet snímků na 1 a klikněte na Spustit. Výsledky se zobrazí v histogramu a v polích Výsledky .
Q1 - Zeros: 0
Q1 - Ones: 1000
Q2 - Zeros: 1000
Q2 - Ones: 0
Vzhledem k tomu, že qubity ještě nebyly manipulovány, zachovají si počáteční hodnoty: první qubit se vrátí One
pokaždé a druhý qubit vrátí Zero
.
Pokud změníte hodnotu initial
na Zero
a spustíte program znovu, měli byste vidět, že první qubit se Zero
vrátí také pokaždé.
Q1 - Zeros: 1000
Q1 - Ones: 0
Q2 - Zeros: 1000
Q2 - Ones: 0
Tip
Vyberte Ctrl-Z nebo Upravit > zpět a soubor uložte pokaždé, když do kódu před opětovným spuštěním znovu zavedete testovací změnu.
Vložení qubitu do superpozice
V současné době jsou qubity v programu všechny v klasickém stavu, tj. jsou buď 1, nebo 0. Víte to, protože program inicializuje qubity do známého stavu a nepřidali jste žádné procesy pro manipulaci s nimi. Před propletení qubitů vložíte první qubit do stavu superpozice, kde měření qubitu vrátí Zero
~50 % času a One
~50 % času. Qubit lze koncepčně považovat za stejnou pravděpodobnost měření nebo Zero
One
.
Chcete-li umístit qubit do superpozice, Q# poskytuje H
operaci , nebo Hadamard. Vzpomeňte si, že operace z inicializace qubitu do známé procedury stavu dříve překlopila qubit z 0 na 1 (nebo naopak), H
operace překlopí qubit na polovinu stavu se stejnými pravděpodobnostmi Zero
nebo One
.X
Při měření by měl qubit v superpozici vrátit zhruba stejný počet Zero
a One
výsledky.
Upravte kód v Main
operaci resetováním počáteční hodnoty One
a vložením řádku operace H
:
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);
...
Když teď program spustíte, uvidíte výsledky prvního qubitu v superpozici.
Q1 - Zeros: 523 // results vary
Q1 - Ones: 477
Q2 - Zeros: 1000
Q2 - Ones: 0
Při každém spuštění programu se výsledky prvního qubitu mírně liší, ale budou blízko 50 % One
a 50 % Zero
, zatímco výsledky druhého qubitu zůstanou Zero
po celou dobu.
Q1 - Zeros: 510
Q1 - Ones: 490
Q2 - Zeros: 1000
Q2 - Ones: 0
Inicializace prvního qubitu tak, aby Zero
vrátila podobné výsledky.
Q1 - Zeros: 504
Q1 - Ones: 496
Q2 - Zeros: 1000
Q2 - Ones: 0
Poznámka:
Přesunutím posuvníku v Copilotu pro Azure Quantum a zvýšením počtu snímků můžete vidět, jak se výsledky superpozice mírně liší nad rozdělením snímků.
Propletení dvou qubitů
Jak už bylo zmíněno dříve, propletené qubity jsou propojené tak, že je nelze popsat nezávisle na sobě. To znamená, že jakákoli operace se stane s jedním qubitem, stane se také propleteným qubitem. Díky tomu můžete zjistit výsledný stav jednoho qubitu, aniž byste ho změřili, a to pouhým měřením stavu druhého qubitu. (Tento příklad používá dva qubity, ale je také možné propletit tři nebo více qubitů).
Chcete-li povolit propletení, Q# poskytuje CNOT
operace, což je zkratka pro Controlled-NOT. Výsledkem spuštění této operace na dvou qubitech je překlopit druhý qubit, pokud je One
první qubit .
CNOT
Přidejte operaci do programu ihned po H
operaci. Celý program by měl vypadat takto:
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 {
set numOnesQ1 += 1;
}
if resultQ2 == One {
set 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 );
}
Když teď spustíte program, měl by se zobrazit něco takového:
Q1 - Zeros: 502 // results will vary
Q1 - Ones: 498
Q2 - Zeros: 502
Q2 - Ones: 498
Všimněte si, že statistika prvního qubitu se nezměnila (stále existuje přibližně 50/50 šance Zero
na měření nebo One
po měření), ale výsledky měření pro druhý qubit jsou vždy stejné jako měření prvního qubitu bez ohledu na to, kolikrát program spustíte. Operace CNOT
propletla dva qubity, takže cokoli se stane s jedním z nich, stane se druhé.
Požadavky
Vývoj a spuštění ukázky kódu v místním vývojovém prostředí:
- Nejnovější verze editoru Visual Studio Code nebo otevření editoru VS Code na webu
- Nejnovější verze rozšíření Azure Quantum Development Kit. Podrobnosti o instalaci najdete v tématu Instalace sady QDK ve VS Code.
Vytvoření nového Q# souboru
- Otevřete Visual Studio Code a výběrem možnosti Soubor > nový textový soubor vytvořte nový soubor.
- Uložte soubor jako
CreateBellStates.qs
. Tento soubor bude obsahovat Q# kód pro váš program.
Inicializace qubitu do známého stavu
Prvním krokem je definování Q# operace, která inicializuje qubit do známého stavu. Tuto operaci lze volat k nastavení qubitu na klasický stav, což znamená, že vrátí Zero
100 % času nebo vrátí One
100 % času. Zero
a One
představují Q# pouze dva možné výsledky měření qubitu.
Otevřete CreateBellStates.qs
a zkopírujte následující kód:
import Microsoft.Quantum.Intrinsic.*;
import Microsoft.Quantum.Canon.*;
operation SetQubitState(desired : Result, target : Qubit) : Unit {
if desired != M(target) {
X(target);
}
}
Příklad kódu představuje dvě standardní operace a M
X
, které transformují stav qubitu.
Operace SetQubitState
:
- Přebírá dva parametry: typ
Result
, pojmenovanýdesired
, který představuje požadovaný stav qubitu být v (Zero
neboOne
) a typQubit
. - Provede měrnou operaci,
M
která měří stav qubitu (Zero
neboOne
) a porovná výsledek s hodnotou zadanou vdesired
. - Pokud měření neodpovídá porovnávané hodnotě, spustí
X
operaci, která překlopí stav qubitu na místo, kde se pravděpodobnosti měrnéhoZero
vrácení aOne
jsou obrácené. Tímto způsobemSetQubitState
vždy umístí cílový qubit do požadovaného stavu.
Napsání testovací operace pro otestování stavu zvonu
Dále, chcete-li předvést účinek SetQubitState
operace, vytvořte další operaci s názvem Main
. Tato operace přidělí dva qubity, volání SetQubitState
pro nastavení prvního qubitu do známého stavu a pak změří qubity, aby se zobrazily výsledky.
Za SetQubitState
operaci přidejte do CreateBellStates.qs
souboru následující operaci:
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 {
set numOnesQ1 += 1;
}
if resultQ2 == One {
set 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 );
}
V kódu count
jsou proměnné initial
nastavené na 1000
a One
v uvedeném pořadí. Tento krok inicializuje první qubit a One
měří každý qubit 1000krát.
Operace Main
:
- Přebírá dva parametry:
count
počet spuštění měření ainitial
požadovaný stav inicializace qubitu. - Zavolá příkaz
use
, který inicializuje dva qubity. - Smyčky iterací
count
Pro každou smyčku- Volání
SetQubitState
, která nastaví zadanouinitial
hodnotu na prvním qubitu. - Voláním
SetQubitState
znovu nastavíte druhý qubit doZero
stavu. M
Použije operaci k měření jednotlivých qubitů.- Ukládá počet měření pro každý qubit, který vrací
One
.
- Volání
- Po dokončení smyčky se znovu zavolá
SetQubitState
k resetování qubitů do známého stavu (Zero
), aby ostatní mohli přidělit qubity ve známém stavu. Příkaz vyžaduje resetování qubituuse
. - Nakonec pomocí
Message
funkce vytiskne zprávu do konzoly před vrácením výsledků.
Spuštění kódu
Než přejdete k postupům superpozice a propletení, otestujte kód až do tohoto bodu, abyste viděli inicializaci a měření qubitů.
Aby mohl kód spustit jako samostatný program, kompilátor musí vědět, Q# kde program spustit. Vzhledem k tomu, že není zadán žádný obor názvů, kompilátor rozpozná jako operaci výchozí vstupní bod Main
. Další informace naleznete v tématu Projekty a implicitní obory názvů.
Soubor
CreateBellStates.qs
by teď měl vypadat takto: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 { set numOnesQ1 += 1; } if resultQ2 == One { set 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 ); }
Před spuštěním programu se ujistěte, že je cílový profil nastavený na Neomezený. Vyberte Zobrazit –> Paleta příkazů, vyhledejte QIR, vyberte Q#: Nastavte cílový profil Azure Quantum QIR a pak vyberte Q#: neomezený.
Poznámka:
Pokud cílový profil není nastavený na Neomezený, při spuštění programu se zobrazí chyba.
Pokud chcete program spustit, vyberte v rozevíracím seznamu Ikona přehrávání v pravém horním rohu možnost Spustit Q# soubor, v seznamu příkazů předcházejících operaci
Main
vyberte Spustit nebo stiskněte Kombinaci kláves Ctrl+F5. Program spustíMain
operaci na výchozím simulátoru.Výstup se zobrazí v konzole ladění.
Q1 - Zeros: 0 Q1 - Ones: 1000 Q2 - Zeros: 1000 Q2 - Ones: 0
Vzhledem k tomu, že qubity ještě nebyly manipulovány, zachovají si počáteční hodnoty: první qubit se vrátí
One
pokaždé a druhý qubit vrátíZero
.Pokud změníte hodnotu
initial
naZero
a spustíte program znovu, měli byste vidět, že první qubit seZero
vrátí také pokaždé.Q1 - Zeros: 1000 Q1 - Ones: 0 Q2 - Zeros: 1000 Q2 - Ones: 0
Tip
Vyberte Ctrl-Z nebo Upravit > zpět a soubor uložte pokaždé, když do kódu před opětovným spuštěním znovu zavedete testovací změnu.
Vložení qubitu do superpozice
V současné době jsou qubity v programu všechny v klasickém stavu, tj. jsou buď 1, nebo 0. Víte to, protože program inicializuje qubity do známého stavu a nepřidali jste žádné procesy pro manipulaci s nimi. Před propletení qubitů vložíte první qubit do stavu superpozice, kde měření qubitu vrátí Zero
50 % času a One
50 % času. Qubit lze koncepčně považovat za půl cesty mezi a Zero
One
.
Chcete-li umístit qubit do superpozice, Q# poskytuje H
operaci , nebo Hadamard. Vzpomeňte si, že X
operace z inicializace qubitu do známého stavu dříve, která překlopila qubit z Zero
One
do (nebo naopak), H
operace překlopí qubit na polovinu stavu se stejnými pravděpodobnostmi Zero
nebo One
. Při měření by měl qubit v superpozici vrátit zhruba stejný počet Zero
a One
výsledky.
Upravte kód v
Main
operaci tak, aby zahrnovalH
operaci: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); ...
Když teď program spustíte, uvidíte výsledky prvního qubitu v superpozici:
Q1 - Zeros: 523 // results will vary Q1 - Ones: 477 Q2 - Zeros: 1000 Q2 - Ones: 0
Při každém spuštění programu se výsledky prvního qubitu mírně liší, ale budou blízko 50 %
One
a 50 %Zero
, zatímco výsledky druhého qubitu zůstanouZero
po celou dobu.Q1 - Zeros: 510 Q1 - Ones: 490 Q2 - Zeros: 1000 Q2 - Ones: 0
Inicializace prvního qubitu tak, aby
Zero
vrátila podobné výsledky.Q1 - Zeros: 504 Q1 - Ones: 496 Q2 - Zeros: 1000 Q2 - Ones: 0
Propletení dvou qubitů
Jak už bylo zmíněno dříve, propletené qubity jsou propojené tak, že je nelze popsat nezávisle na sobě. To znamená, že jakákoli operace se stane s jedním qubitem, stane se také propleteným qubitem. Díky tomu můžete zjistit výsledný stav jednoho qubitu, aniž byste ho změřili, a to pouhým měřením stavu druhého qubitu. (Tento příklad používá dva qubity, ale je také možné propletit tři nebo více qubitů).
Chcete-li povolit propletení, Q# poskytuje CNOT
operace, což je zkratka pro Controlled-NOT. Výsledkem spuštění této operace na dvou qubitech je překlopit druhý qubit, pokud je One
první qubit .
CNOT
Přidejte operaci do programu ihned poH
operaci. Celý program by měl vypadat takto: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 { set numOnesQ1 += 1; } if resultQ2 == One { set 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)"
Statistika prvního qubitu se nezměnila (pravděpodobnost 50/50 měření Zero
nebo One
po měření), ale výsledky měření pro druhý qubit jsou vždy stejné jako měření prvního qubitu. Operace CNOT
propletla dva qubity, takže cokoli se stane s jedním z nich, stane se druhým.
Vykreslení histogramu četnosti
Pojďme vizualizovat distribuci výsledků získaných z vícenásobného spuštění kvantového programu. Histogram četnosti pomáhá vizualizovat rozdělení pravděpodobnosti těchto výsledků.
Vyberte Zobrazení –> Paleta příkazů nebo stiskněte Kombinaci kláves Ctrl+Shift+P a zadejte "histogram", který by měl zobrazit Q#soubor : Spustit a zobrazit možnost histogramu . Histogram můžete vybrat také ze seznamu příkazů předcházejících
Main
. Tuto možnost vyberte, pokud chcete otevřít okno histogramu Q# .Zadejte počet snímků pro spuštění programu, například 100 snímků, a stiskněte Enter. Histogram se zobrazí v okně histogramu Q# .
Každý pruh v histogramu odpovídá možnému výsledku a jeho výška představuje počet pozorovaných výsledků. V tomto případě existuje 50 různých jedinečných výsledků. Všimněte si, že u každého výsledku jsou výsledky měření pro první a druhý qubit vždy stejné.
Tip
Histogram můžete přiblížit pomocí kolečka myši nebo gesta trackpadu. Při přiblížení můžete graf posouvat stisknutím klávesy Alt při posouvání.
Výběrem pruhu zobrazíte procento tohoto výsledku.
Výběrem ikony nastavení vlevo nahoře zobrazíte možnosti. Můžete zobrazit 10 nejlepších výsledků, prvních 25 výsledků nebo všechny výsledky. Výsledky můžete také seřadit od vysokých po nízké nebo nízké až vysoké.
Související obsah
Prozkoumejte další Q# kurzy:
- Groverův vyhledávací algoritmus ukazuje, jak napsat Q# program, který používá Groverův vyhledávací algoritmus.
- Quantum Fourier Transform zkoumá, jak napsat Q# program, který přímo řeší konkrétní qubity.
- Kvantové katy jsou kurzy a programovací cvičení zaměřená na výuku prvků kvantového computingu a Q# programování současně.