Přeskočit na hlavní obsah

Začínáme s Qiskitem ve třídě

Pro tento modul Qiskit ve třídě musí mít studenti funkční prostředí Python s nainstalovanými těmito balíčky:

  • qiskit v2.1.0 nebo novější
  • qiskit-ibm-runtime v0.40.1 nebo novější
  • qiskit-aer v0.17.0 nebo novější
  • qiskit.visualization
  • numpy
  • pylatexenc

Postup instalace a nastavení výše uvedených balíčků najdeš v průvodci Instalace Qiskitu. Aby studenti mohli spouštět úlohy na skutečných kvantových počítačích, musí si vytvořit účet u IBM Quantum® podle kroků popsaných v průvodci Nastavení účtu IBM Cloud®.

Tento modul byl otestován a využil 2 sekundy času QPU na procesoru Heron v2. Jde pouze o odhad. Skutečné využití se může lišit.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

Úvod

V modulech Qiskit ve třídě budeš mít příležitost použít kvantový počítač k prozkoumání různých konceptů v oborech blízkých kvantovému počítání, jako jsou kvantová mechanika, informatika, chemie a další. Tento modul slouží jako předpoklad pro všechny ostatní — uvádí základy kvantového počítání a způsob, jak používat Qiskit ke spouštění kvantových Circuitů.

Nejprve ti stručně představíme, jak funguje klasický počítač, a pak ukážeme, jak jsou tyto koncepty přizpůsobeny paradigmatu kvantového počítání. Nakonec ti ukážeme, jak tyto koncepty propojit a sestavit a spustit svůj první kvantový Circuit.

Klasické počítače

Pravděpodobně znáš základy fungování klasických počítačů, ale zde zdůrazníme několik klíčových vlastností, abychom je pak mohli srovnat s kvantovými počítači.

Základní jednotky informace: bity

Klasické počítače zpracovávají klasické informace a základní jednotkou klasické informace je bit. Jeden bit dokáže uložit odpověď na jednu otázku ano/ne. Dva binární stavy bitu obvykle označujeme jako „0" a „1".

Přehled binárních čísel

Kombinováním bitů umožňuješ uložit více informací. Chceš-li například uložit číslo od 0 do 15, lze to udělat se čtyřmi bity takto:

0 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

Obecně platí, že při převodu binárního čísla o NN bitech na běžné číslo o základu 10 násobíš nejméně významný (nejpravější) bit hodnotou 20=12^0 = 1, další bit vlevo hodnotou 21=22^1 = 2, pak 22=42^2 = 4 a tak dále, až dosáhneš nejvýznamnějšího (nejlevějšího) bitu, který násobíš hodnotou 2N12^{N-1}.

To znamená, že NN bitů může být v jednom z 2N2^N různých možných stavů.

Ověř si porozumění

Přečti si otázku/otázky níže, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil řešení.

Kolik bitů bys potřeboval k reprezentaci čísla 86? Zapiš bitový řetězec, který toto číslo kóduje v binární soustavě.

Odpověď:

Pamatuj, že NN bitů ti umožňuje reprezentovat čísla 002N12^N - 1, takže šest bitů by nás dostalo až na 261=632^6 - 1 = 63. To nestačí. Přidáme ještě jeden bit, abychom se dostali na 271=1272^7 - 1 = 127. Nyní rozložme 86 na mocniny 2:

86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

Základní operace: Gate

Počítač musí být schopen s bity něco dělat, aby mohl, no, počítat. Binární Gate jsou operace tvořící základní stavební kameny všech složitějších algoritmů a kódů.

Gate pro jeden bit:

NOT

Máš-li jen jeden bit, existuje jediný způsob, jak jeho stav transformovat: překlopit stav z 0 na 1 nebo z 1 na 0. Tuto operaci nazýváme Gate „NOT". Účinek tohoto Gate — a dalších Gate, které probereme níže — lze znázornit takzvanou „tabulkou pravdivosti" se sloupci pro vstupní a výstupní stavy Qubitů. Tabulka pravdivosti Gate NOT je:

VstupVýstup
01
10

Gate pro více bitů:

AND

AND je dvoubitový Gate, který přijme dva vstupní bity a vydá jeden výstupní bit. Výstup je 1, pokud jsou oba vstupní bity 1, jinak 0:

VstupVýstup
000
010
100
111

OR

OR je další dvoubitový Gate s jedním výstupním bitem. Výstup je 1, pokud je alespoň jeden z bitů roven 1:

VstupVýstup
000
011
101
111

XOR

XOR je zkratka pro „exclusive OR" (výlučné OR) a funguje jako Gate OR, ale výstup je 1, pouze pokud je právě jeden ze vstupních bitů roven 1. Výstup je 0, pokud jsou oba 1 nebo oba 0:

VstupVýstup
000
011
101
110

Měření:

Při výuce klasického počítání se procesu čtení stavu bitů obvykle nevěnuje příliš pozornosti. Je to proto, že z konceptuálního hlediska není příliš složitý. Bity lze měřit kdykoli před, během nebo po výpočtu, aniž by to ovlivnilo výsledek. V kvantovém počítání to tak není, jak si probereme níže.

Circuity:

Kombinováním výše uvedených Gate lze provádět libovolné operace na počítači. Vezměme si jednoduchý příklad: pomocí Gate AND a XOR lze sestavit Circuit polovičního sčítačky, který vypočítá součet dvou bitů. Je znázorněn v diagramu logického Circuitu, kde dráty představují bity a Gate operující na bitech jsou zobrazeny jako symboly na příslušných drátech:

Diagram klasického Circuitu pro Circuit polovičního sčítačky. Gate XOR generuje výstupní bit Součet a Gate AND generuje výstupní bit Přenos.

Oba bity jsou tedy zkopírovány a přivedeny jak do Gate AND, tak do Gate XOR. Výsledek Gate XOR je „součtový bit" (S), který zůstává na místě jedniček binárního čísla, a výsledek Gate AND je „přenosový bit" (C), což je hodnota dalšího nejvýznamnějšího číslice binárního čísla. Tabulka pravdivosti:

AABBSoučet (ABA \oplus B)Přenos (ABA \wedge B)
0000
0110
1010
1101

Ověř si porozumění

Přečti si otázku/otázky níže, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil řešení.

Ověř, že výše uvedená tabulka pravdivosti dává správný výsledek pro Circuit sčítačky. To znamená, pro každou ze čtyř kombinací A a B ověř, že A+B=S+2×CA+B=S+2 \times C.

Odpověď:

0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

Kvantové počítače

Bity \rightarrow Qubity

Stejně jako jsou bity základními jednotkami klasické informace, kvantové bity neboli „Qubity" jsou základními jednotkami kvantové informace. Podobně jako klasický bit může být stav Qubitu 0 nebo 1, což obvykle označujeme jako 0\vert 0\rangle a 1\vert 1\rangle. Na rozdíl od klasického bitu však může být kvantový bit zároveň v superpozici stavů 0\vert 0\rangle a 1\vert 1\rangle. Obecně může být Qubit v libovolném stavu ψ\vert \psi\rangle tvaru:

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

kde c0c_0 a c1c_1 jsou komplexní amplitudy splňující c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

Kvantová fáze

Protože c0c_0 a c1c_1 jsou komplexní, lze každou z nich zapsat jako ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i}, kde ϕi\phi_i se nazývá fáze. Pokud celý stav vynásobíme stejným faktorem globální fáze, fyzikálně se nic nezmění — tato situace se nazývá globální fáze a nemá žádné pozorovatelné důsledky.

Z tohoto důvodu je zvykem „vytknout" eiϕ0e^{i\phi_0}, čímž dostaneme:

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

kde ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 je relativní fáze kvantového stavu, která pozorovatelné důsledky.

Tato fáze hraje v kvantovém počítání velmi důležitou roli a její různé důsledky prozkoumáš v navazujících modulech Qiskit ve třídě.

Více Qubitů

Zatímco stav více bitů lze jednoduše vyjádřit jako řetězec 0 a 1, stav více Qubitů je o něco složitější kvůli principům superpozice a provázání.

Připomeň si, že NN bitů může být v jednom z 2N2^N možných stavů od binárního čísla 000...000 do 111...111. Ale teď, díky principu superpozice, může být NN Qubitů v superpozici všech těchto stavů najednou!

Lze to vyjádřit jako

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

kde, stejně jako v klasickém případě, stav i\vert i\rangle odpovídá stavu, ve kterém je každý Qubit ve správné kombinaci 0 a 1, aby dal binární číslo ii. Tyto stavy jsou označovány jako „výpočetní bázové stavy" kvantového systému. Tříqubitový stav například lze zapsat jako superpozici jeho osmi výpočetních bázových stavů:

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

Každý Qubit v systému je označen indexem 00N1N-1. Konvence je číst stavy Qubitů zprava doleva, takže stav Qubitu 00 je zcela vpravo a stav Qubitu N1N-1 zcela vlevo. Toto se nazývá „little-endian" notace a ze začátku se může zdát neintuitivní, protože jsme zvyklí číst zleva doprava.

Ověř si porozumění

Přečti si otázku/otázky níže, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil řešení.

Na první pohled se může zdát neintuitivní řadit Qubity zprava doleva jako v little-endian notaci, ale ve skutečnosti je to velmi logické! Vysvětli proč. (Vzpomeň si na naši diskuzi výše o převodu binárních čísel na čísla o základu 10.)

Odpověď:

Pokud řadíme Qubity zprava doleva, takže Qubit 0 je zcela vpravo a Qubit N-1 zcela vlevo, je logické přiřadit Qubit 00 k nejméně významnému bitu, který se násobí hodnotou 202^0, a Qubit N1N-1 k nejvýznamnějšímu bitu, který se násobí hodnotou 2N12^{N-1}.

Provázání

Jak jsme zmínili dříve, další klíčovou vlastností Qubitů je, že mohou být navzájem provázány. Vezměme příklad dvouqubitového stavu, kde c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} a c1=c2=0c_1 = c_2 = 0:

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

Stav Qubitu 0 tak může být 0\vert 0\rangle nebo 1\vert 1\rangle se stejnou pravděpodobností, stejně jako stav Qubitu 1. Tyto pravděpodobnosti ale již nejsou na sobě nezávislé. Pokud zjistíme, že stav Qubitu 0 je 0\vert 0\rangle, víme, že Qubit 1 bude také ve stavu 0\vert 0\rangle. To platí bez ohledu na vzdálenost mezi nimi, a proto se akt měření provázaného stavu někdy označuje jako „strašidelné působení na dálku".

Provázání může mít i jiné podoby. Například stav

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

vždy produkuje opačné výsledky: pokud je jeden Qubit naměřen ve stavu 0\vert 0\rangle, druhý bude zaručeně nalezen ve stavu 1\vert 1\rangle.

Ověř si porozumění

Přečti si otázku/otázky níže, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil řešení.

Je stav ψ=11\vert \psi\rangle = \vert 11\rangle provázaný? Proč ano nebo proč ne?

Odpověď:

Provázaný není. I když jsou výsledky při měření obou Qubitů vždy stejné, je to jen proto, že každý Qubit je vždy fixován ve stavu 1\vert 1\rangle. Výsledek měření jednoho Qubitu ve skutečnosti nezávisí na druhém — oba jsou prostě vždy 1\vert 1\rangle.

Obecně platí, že pokud lze stav každého Qubitu popsat samostatně a pak je takto vynásobit:

ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

Pak se jedná o „produktový stav" a není provázaný.

Vektorová notace

Pro zobrazení transformace kvantového stavu při různých operacích je často užitečné používat vektory a matice. V tomto znázornění budou naše kvantové stavy vektory a naše kvantové Gate (probírané v další části) budou matice, které tyto vektory transformují.

Pro jeden Qubit jsou vektorové formy stavů zvoleny takto: 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} Tímto způsobem lze libovolný stav ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle zapsat jako ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Pro obecný nn-qubitový stav potřebujeme vektor dimenze 2n2^n, s bázovými stavy uspořádanými tak, jak bys očekával, ve vzestupné binární hodnotě:

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

S touto vektorovou notací na paměti můžeme představit potřebné kvantové Gate, jejich účinky na kvantové stavy a jejich maticové formy.

Ověř si porozumění

Přečti si otázku/otázky níže, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil řešení.

Pro dvouqubitový systém existují čtyři výpočetní bázové stavy. Zapiš každý z nich jak v braketové, tak ve vektorové notaci.

Odpověď:

00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

Gate \rightarrow kvantové Gate

Stejně jako klasické Gate NOT, AND, OR a XOR lze kombinovat a sestavovat libovolné klasické Circuity, hrají kvantové Gate v kvantovém počítání stejnou roli. Protože Qubity mají další kvantově mechanické vlastnosti, jsou kvantové Gate odpovídajícím způsobem bohatší. I když jejich působení na bázové stavy 0|0\rangle a 1|1\rangle lze stále popsat tabulkou pravdivosti, tato neposkytuje úplný obraz. Pro kvantové Gate je přirozenější používat maticovou reprezentaci, protože působí také na superpozice bázových stavů.

Níže představíme nejběžnější kvantové Gate a způsob, jakým transformují Qubity, se kterými interagují. Kde je to relevantní, propojíme je s klasickými Gate, které znáš.

Jednoqubitové Gate

Gate XX: Toto je kvantový ekvivalent operace NOT. Jeho pravdivostní tabulka vypadá úplně stejně jako klasický Gate NOT:

VstupVýstup
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

A maticová reprezentace:

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

V Qiskitu vytvoření Circuit s Gate XX vypadá takto:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Výstup předchozí buňky kódu

V tomto velmi jednoduchém diagramu Circuit je Qubit reprezentován drátem – černou vodorovnou čárou – a Gate se zobrazuje jako obdélník na tomto drátu.

Hadamardův Gate: Vytváří stav superpozice. Pravdivostní tabulka:

VstupVýstup
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

Maticová reprezentace: H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Circuit s Hadamardovým Gate se vytvoří takto:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Výstup předchozí buňky kódu

Gate ZZ: Přidává fázový posun Δϕ=π\Delta \phi = \pi ke stavu 1|1\rangle:

VstupVýstup
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

V Qiskitu vytvoření Circuit s Gate ZZ vypadá takto:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Výstup předchozí buňky kódu

Gate TT: Přidává fázový posun Δϕ=π/4\Delta \phi = \pi/4 ke stavu 1|1\rangle:

VstupVýstup
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

V Qiskitu vytvoření Circuit s Gate TT vypadá takto:

qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")

Výstup předchozí buňky kódu

Vícequbitové Gate

Dvouqubitové Gate mohou připomínat klasické dvoubiotové Gate, ale s jednou důležitou výhradou: všechny kvantové Gate musí být reverzibilní. V pojmech lineární algebry to znamená, že jsou reprezentovány unitárními maticemi. Dva vstupní Qubity se tedy vždy zobrazí na dva výstupní Qubity a operaci lze v zásadě vrátit zpět. To je v kontrastu s klasickými Gate, jako je AND nebo OR, které ztrácejí informace a jsou ireverzibilní – ze zadaného výstupu nemůžeš jednoznačně určit vstup.

Gate CNOT (Controlled-NOT): Dva vstupní Qubity se nazývají „řídicí" (control) a „cílový" (target) Qubit. Řídicí Qubit zůstává nezměněn, ale jeho stav určuje, co se stane s cílovým Qubitem. Pokud je řídicí Qubit ve stavu 1\vert 1\rangle, aplikuje se na cílový Gate XX; pokud je stav řídicího Qubitu 0\vert 0\rangle, žádná změna se neprovede. V níže uvedeném zápisu předpokládejme, že Qubit AA (krajní pravý Qubit) je řídicí a Qubit BB (krajní levý Qubit) je cílový. Níže je použit zápis CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})\vert BA\rangle.

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

VstupVýstup
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

Matice reprezentující tuto operaci je tedy:

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Výstup předchozí buňky kódu

Toto je první diagram Circuit, který vidíme se dvěma Qubity, reprezentovanými dvěma dráty. Gate CNOT je implementován mezi oběma Qubity, přičemž q0q_0 je řídicí a q1q_1 je cílový.

Otestuj své porozumění

Přečti si níže uvedené otázky, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil/a řešení.

Většina Gate má v Qiskitu stejnou maticovou formu jako všude jinde. Gate CNOT však působí na dva Qubity, a najednou se stává problémem konvence pořadí Qubitů. Texty, které řadí Qubity q0,q1,...\vert q_0,q_1,...\rangle, ukážou odlišnou maticovou formu svých Gate CNOT. Ověř explicitním maticovým násobením, že výše uvedená matice CNOT má správný účinek na stav 01.\vert 01\rangle.

Odpověď:

CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = \vert 11\rangle

Gate SWAP: Tento Gate prohodí stavy dvou Qubitů. Pravdivostní tabulka:

VstupVýstup
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

Matice reprezentující tuto operaci je tedy:

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")

Výstup předchozí buňky kódu

Gate SWAP lze ve skutečnosti sestavit ze tří Gate CNOT. Abychom viděli jak, můžeme gate decompose() v Qiskitu:

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")

Výstup předchozí buňky kódu

Zde poprvé vidíme, jak jsou v diagramu Circuit zobrazeny různé Gate. Čteme ho zleva doprava, takže první se aplikuje krajní levý Gate.

Otestuj své porozumění

Přečti si níže uvedené otázky, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil/a řešení.

Ověř, že výše uvedená kombinace Gate CNOT tvoří dohromady Gate SWAP. Můžeš k tomu použít maticové násobení nebo jakoukoli jinou metodu.

Odpověď:

S maticovým násobením:

(1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

Pomocí pravdivostní tabulky lze sledovat, jak se stavy mění s každým Gate CNOT. V posledním sloupci by stavy měly odpovídat sloupci „výstup" pravdivostní tabulky Gate SWAP:

VstupCNOT(A,B)CNOT(B,A)CNOT(A,B)
00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

Gate Toffoli (neboli „controlled-controlled-NOT" (CCNOT)): Jde o tříqubitový Gate. Název „controlled-controlled-NOT" ti možná napoví, jak funguje: jsou tu dva řídicí Qubity a jeden cílový Qubit, přičemž stav cílového Qubitu se překlopí pouze tehdy, jsou-li oba řídicí Qubity ve stavu 1\vert 1\rangle. Zachováváme konvenci pořadí, kterou jsme použili u Gate CNOT:

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

Pravdivostní tabulka je tedy:

VstupVýstup
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

A matice reprezentující tuto operaci je:

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Výstup předchozí buňky kódu

Gate Toffoli lze také rozložit na Gate CNOT spolu s dalšími Gate. Je to však výrazně složitější než rozklad Gate SWAP, takže ho necháme jako volitelné cvičení na konci modulu k prozkoumání a ověření.

Měření

Měření hrají v kvantových výpočtech zvláštní roli – takovou, která nemá analogii v klasických výpočtech. Zatímco v klasických výpočtech můžeš zkontrolovat své bity v libovolném okamžiku algoritmu, v kvantových výpočtech musíš být velmi opatrný/á s tím, kdy se podíváš na své Qubity, protože měření způsobí kolaps jejich stavu a zničí superpozici, která Qubitům dává jejich výpočetní složitost.

Konkrétně platí, že u NN-qubitového kvantového stavu ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle měření způsobí kolaps stavu do jedné ze základních funkcí i\vert i\rangle s pravděpodobností rovnou ci2\vert c_i\vert ^2.

Tento destruktivní účinek měření však není vždy překážkou. Ve skutečnosti je to klíčový zdroj v určitých algoritmech a protokolech, jako je kvantová teleportace a kvantová distribuce klíčů.

V Qiskitu je výsledek měření odeslán do klasického registru, kde je uložen jako klasický bit. Vytvoření Circuit s měřením vypadá takto:

qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")

Výstup předchozí buňky kódu

Circuit

Teď, když víme, jak fungují Qubity, Gate a měření, pojďme vytvořit a spustit vlastní kvantový Circuit! K tomu tě musíme seznámit s užitečným pracovním postupem zvaným Qiskit patterns.

Framework Qiskit patterns

Framework Qiskit patterns je obecný postup pro přístup k problémům a jejich řešení pomocí kvantového počítače. Skládá se ze čtyř kroků:

  1. Mapování našeho problému na kvantové Circuit a operátory
  2. Optimalizace Circuit pro cílový hardware
  3. Spuštění na cílovém hardware
  4. Postprocesing výsledků

Pro ilustraci těchto kroků implementujeme kvantovou verzi výše popsaného obvodu polovičního sčítače.

1. Mapování

Klasický obvod sčítače používá Gate XOR a AND pro výpočet bitů součtu a přenosu. Tyto Gate můžeme přizpůsobit kvantovému kontextu a vytvořit tak kvantový poloviční sčítač. Nejprve si připomeňme, že kvantové Gate jsou reverzibilní, takže nemůžeme jednoduše přepsat vstupy. Místo toho zavedeme dva pomocné Qubity inicializované na 0\vert 0\rangle pro uložení výstupů součtu a přenosu. Náš úplný kvantový stav se tedy bude skládat z Qubitů AA a BB a Qubitů součtu a přenosu, které označíme SS a CC:

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

Nyní potřebujeme kvantové Gate, které splní to, co Gate XOR a AND v klasickém obvodu.

Součet:

Pro XOR aplikujeme dva Gate CNOT, každý s řídicími Qubity AA a BB a cílovým Qubitem SS pro oba. Pokud jsou AA a BB různé, jeden z Gate CNOT překlopí SS do stavu 1\vert 1\rangle. Pokud jsou AA i BB oba ve stavu 0\vert 0\rangle, nic se se SS nestane a zůstane ve stavu 0\vert 0\rangle. Pokud jsou AA i BB oba ve stavu 1\vert 1\rangle, stav SS se překlopí dvakrát a vrátí zpět do stavu 0\vert 0\rangle.

Přenos:

Pro bit přenosu potřebujeme něco, co funguje jako klasický Gate AND.

Otestuj své porozumění

Přečti si níže uvedené otázky, zamysli se nad odpovědí a pak klikni na trojúhelník, abys odhalil/a řešení.

Projdi si znovu Gate, které jsme probrali, a zkus odhadnout, který kvantový Gate použijeme místo klasického Gate AND:

Odpověď:

Je to Gate Toffoli! Pamatuj, Gate Toffoli neboli controlled-controlled-NOT překlopí cílový stav tehdy a jen tehdy, jsou-li řídicí Qubit 0 i řídicí Qubit 1 oba ve stavu 1\vert 1\rangle. Pokud tedy cílový Qubit začíná ve stavu 0\vert 0\rangle, má stejnou funkci jako Gate AND.

Nyní tedy máme všechny ingredience potřebné k sestavení kvantového Circuit:

# qubits: a, b, sum, carry
qc = QuantumCircuit(4)

# Choose values for A and B:
a = 0
b = 0

# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)

# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)

# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b

# measure
qc.measure_all()

qc.draw("mpl")

Výstup předchozí buňky kódu

Výše je diagram Circuit kvantového polovičního sčítače. Jak bylo zmíněno dříve, dráty reprezentují Qubity 0033 seřazené shora dolů a registr klasických bitů je spodní dvojlinkový drát. Při čtení zleva doprava pak vidíme, jak jsou Gate aplikovány na každý Qubit podle toho, kde se na příslušných drátech zobrazují obdélníky. Na konci jsou zobrazena měření. Měření způsobí kolaps stavů Qubitů do určitých hodnot 00 nebo 11 a výsledky jsou odeslány do klasického registru.

Jedna jemnost: přestože se diagram Circuit kreslí zleva doprava, při zápisu odpovídajícího maticového výrazu ho musíme číst zprava doleva. Je to proto, že při maticovém násobení operátor nejblíže vektoru stavu působí jako první. Výše uvedený Circuit (bez měření) by se tedy zapsal jako:

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

2. Optimalizace:

Dále musíme Circuit optimalizovat pro spuštění na kvantovém hardwaru. Tato optimalizace se provádí pomocí Transpileru, který přeloží abstraktní Circuit zobrazený výše do instrukcí, kterým kvantový počítač rozumí. Přiřadí logické Qubity výše ke skutečným fyzickým Qubitům na procesoru a přepíše Gate pomocí vlastní nativní sady Gate, které byly optimalizovány pro spuštění na kvantovém počítači. Nakonec Transpiler implementuje také tzv. „potlačení a zmírnění chyb", aby minimalizoval vliv chyb na výsledek. Pro náš velmi jednoduchý Circuit to není tak podstatné, ale pokud budeš ve svém kvantovém dobrodružství pokračovat a spouštět složitější Circuity, brzy pochopíš hodnotu potlačení a zmírnění chyb. Pokud se o tom chceš dozvědět více, podívej se na kurz Olivie Laneové Quantum Computing in Practice.

Nejprve načteme balíčky potřebné ke komunikaci s kvantovými počítači IBM® a vybereme Backend, na kterém poběžíme. Můžeme buď zvolit nejméně vytížený Backend, nebo vybrat konkrétní Backend, jehož vlastnosti známe.

Níže je kód pro uložení přihlašovacích údajů při prvním použití. Po uložení do svého prostředí tyto informace z notebooku určitě smaž, aby nebyly tvé přihlašovací údaje náhodně sdíleny při sdílení notebooku. Další pokyny najdeš v článcích Set up your IBM Cloud account a Initialize the service in an untrusted environment.

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Qiskit Runtime service

# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_fez

Nyní použijeme Transpiler k optimalizaci Circuitu. Úroveň optimalizace můžeme zvolit od 0 (žádná optimalizace) do 3 (nejvyšší optimalizace). Chceš-li zjistit, co každá úroveň obnáší, navštiv průvodce Set transpiler optimization level. Výsledný Circuit bude vypadat výrazně jinak než logický Circuit, který jsme vytvořili v kroku mapování.

# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

qc_isa.draw("mpl")

Output of the previous code cell

„Sampler" je primitiv navržený k vzorkování možných stavů vznikajících z kvantového Circuitu a ke sběru statistik o tom, jaké stavy mohou být naměřeny a s jakou pravděpodobností. Zde importujeme Qiskit Runtime Sampler:

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

Pokud jsi vyčerpal/a svůj přidělený čas na skutečných kvantových počítačích nebo nemáš připojení k internetu, možná budeš chtít použít simulátor. K tomu spusť níže uvedenou buňku a odkomentuj příslušný řádek v kroku „Execute".

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)

3. Spuštění

Po přípravě Circuitu ho nyní můžeme spustit na kvantovém počítači!

job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()

4. Následné zpracování

Teď jsme připraveni zobrazit výsledky! Zobrazíme histogram 100 vzorků Circuitu.

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)
counts =  {'0000': 90, '0100': 4, '1100': 3, '0010': 3}

Output of the previous code cell

Výše uvedený histogram zobrazuje výsledky měření všech čtyř Qubitů na konci Circuitu. Ideální kvantový počítač s nulovým šumem by pokaždé naměřil Qubity se stejnými hodnotami, ale ve skutečnosti šum způsobí, že některé běhy produkují chyby.

Ověř své porozumění

Přečti si otázku (otázky) níže, přemýšlej o své odpovědi a pak klikni na trojúhelník pro zobrazení řešení.

Použij bitový řetězec s nejvyšším počtem výskytů jako hodnoty AA, BB, SS a CC a ověř, že kvantový sčítací Circuit fungoval.

Odpověď:

Musíme ověřit, že A+B=S+2×CA+B = S+2 \times C. Pamatuj, že pořadí bitových řetězců odpovídá notaci little-endian, takže se čte jako CSBA.

Z histogramu výše vidíme, že dominantní je bitový řetězec 0000.

0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

Vrať se a změň hodnoty AA a BB na A=1A=1 a B=1B=1 a projdi znovu kroky Qiskit patterns pro opětovné spuštění Circuitu. Ověř, že sčítací Circuit znovu fungoval.

Odpověď:

Měl/a bys získat histogram s dominantním bitovým řetězcem 1011:

1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

Jednou z přidaných vlastností kvantového polovičního sčítačky oproti klasickému polovičnímu sčítači je, že může pracovat s kvantovými vstupy. To znamená, že může „sčítat" Qubity AA a BB, i když jsou v superpozičních stavech. V sekci Výzvy níže budeš požádán/a, abys Qubity připravil/a v superpozicích a zjistil/a, co se stane!

Závěr

Tento modul byl navržen tak, aby ti poskytl pevný základní přehled o základních principech kvantového výpočetnictví srovnáním s klasickým výpočetnictvím. Podívali jsme se na klasický poloviční sčítač a ukázali jsme ti, jak přizpůsobit Circuit pro spuštění s Qubity na kvantovém počítači. Teď jsi připraven/a prozkoumávat ostatní moduly Qiskit ve třídě!

Klíčové pojmy:

  • Na rozdíl od klasických bitů, které mohou nabývat pouze hodnot 0 a 1, mohou být Qubity také ve stavech superpozice obou hodnot 0 a 1.
  • Více Qubitů může být v superpozici nad klasicky přípustnými bitovými řetězci nazývanými výpočetní bázové stavy.
  • Více Qubitů může být provázáno (entanglováno) tak, že stav jednoho závisí na stavu druhého.
  • Konvence Qiskit používá notaci little-endian, která umísťuje nejméně významný Qubit, q0q_0, na úplně pravou pozici a nejvýznamnější Qubit, qNq_N, na úplně levou pozici.
  • Kvantové Gate jsou reverzibilní operace reprezentované unitárními maticemi, které působí na vektory kvantových stavů. V tomto zápisu matice nejbližší vektoru (která je nejvíce vpravo) působí jako první.
  • Měření zhroutí kvantový superpozicový stav do jednoho z jeho klasicky přípustných stavů, přičemž pravděpodobnost odpovídá druhé mocnině amplitudy příslušného výpočetního bázového stavu v superpozici.
  • Kvantové Circuity jsou často reprezentovány pomocí diagramů kvantových Circuitů, kde jsou Qubity zobrazeny jako horizontální dráty a kvantové Gate se na těchto drátech objevují zleva doprava.
  • Pro spuštění kvantového Circuitu používáme čtyři kroky v pracovním postupu Qiskit patterns: Map (mapování), Optimize (optimalizace), Execute (spuštění), Post-process (následné zpracování).

Otázky

Otázky pravda/nepravda

  1. Jeden bit v klasickém počítači může obsahovat pouze hodnotu 0 nebo 1.

  2. Entanglování znamená, že stav jednoho Qubitu je nezávislý na stavu druhého.

  3. Kvantové Gate jsou obecně nevratné operace.

  4. Konvence Qiskit umísťuje nejméně významný Qubit, q0q_0, na úplně levou pozici.

  5. Měření kvantového stavu při opakování vždy dává úplně stejný výsledek.

  6. Hadamardova Gate vytváří superpozici v jednom Qubitu.

  7. Kvantové Circuity mohou obsahovat operace měření, které zhroutí superpozicový stav do jednoho z klasicky přípustných stavů.

  8. Počet možných klasických stavů pro NN bitů je 2N2N.

  9. Pravděpodobnosti výsledků kvantových měření jsou dány druhými mocninami amplitud klasicky měřitelných bázových stavů.

Otázky s krátkou odpovědí

  1. Jaké jsou hlavní rozdíly mezi bitem a Qubitem?

  2. Co se stane s kvantovým stavem při jeho měření?

  3. Proč v Qiskit používáme notaci little-endian?

  4. Jaké jsou čtyři kroky v pracovním postupu Qiskit patterns?

Výzvy:

  1. V modulu jsme použili sčítač pouze pro sčítání klasicky přípustných stavů pro AA a BB. Ale můžeme také připravit AA a BB v superpozicích! Uprav kód tak, aby byl každý Qubit připraven v rovnoměrné superpozici 0 a 1, pak spusť nový Circuit a získej nový histogram. Co vidíš? Vysvětli, co se děje.

  2. Rozklad Toffoliho Gate. Pomocí decompose() ukaž, jak je Toffoliho Gate rozložena na jednoqubitové a dvouqubitové Gate, a pak tuto konstrukci ověř maticovým násobením. Měj na paměti, že ačkoli se diagramy Circuitů čtou zleva doprava, matice se na kvantové stavy aplikují zprava doleva!