Implementace v Qiskitu
V teto sekci se podivame na nektere implementace v Qiskitu pro koncepty predstavene v teto lekci. Pokud si chces tyto implementace spustit sam/sama, coz vrele doporucujeme, podivej se na stranku Instalace Qiskitu v dokumentaci IBM Quantum, kde najdes podrobnosti o nastaveni Qiskitu.
Je dulezite mit na pameti, ze Qiskit je neustale vyvijen a je primarne zameren na maximalizaci vykonu kvantovych pocitacu, ktere pomoci nej ovladas a ktere se samy stale vyviji. V dusledku toho se Qiskit meni, coz muze obcas vest k zastaravani kodu. S ohledem na to vzdy pred ukazkami kodu v Qiskitu v tomto kurzu spustime nasledujici prikazy, aby bylo jasne, ktera verze Qiskitu byla pouzita. Od verze Qiskit v1.0 je to jednoduchy zpusob, jak zjistit aktualne nainstalovanu verzi Qiskitu.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.1.1
Pokud to spoustis v cloudovem prostredi Pythonu, muzes potrebovat nainstalovat nektere z nasledujicich balicku:
#!pip install qiskit
#!pip install jupyter
#!pip install sympy
#!pip install matplotlib
#!pip install pylatexenc
Vektory a matice v Pythonu
Qiskit pouziva programovaci jazyk Python, takze nez budeme mluvit konkretne o Qiskitu, muze byt uzitecne si velmi strucne projit vypocty s maticemi a vektory v Pythonu.
V Pythonu lze vypocty s maticemi a vektory provadet pomoci tridy array z knihovny NumPy, ktera poskytuje funkcionalitu pro mnoho numerickych a vedeckych vypoctu.
Nasledujici kod nacte tuto knihovnu, definuje dva sloupcove vektory, ket0 a ket1, odpovidajici stavovym vektorum Qubit a a pote vypise jejich prumer.
import numpy as np
ket0 = np.array([[1], [0]])
ket1 = np.array([[0], [1]])
print(ket0 / 2 + ket1 / 2)
[[0.5]
[0.5]]
Pomoci array muzeme take vytvaret matice reprezentujici operace.
M1 = np.array([[1, 1], [0, 0]])
M2 = np.array([[1, 0], [0, 1]])
M = M1 / 2 + M2 / 2
print(M)
[[1. 0.5]
[0. 0.5]]
Vezmi prosim na vedomi, ze veskerý kod v dane lekci tohoto kurzu se ocekava, ze bude spousten postupne.
Proto zde nemusime znovu importovat NumPy, protoze uz byl naimportovan.
Nasobeni matic, vcetne nasobeni matice vektorem jako specialniho pripadu, lze provadet pomoci funkce matmul z NumPy.
print(np.matmul(M1, ket1))
print(np.matmul(M1, M2))
print(np.matmul(M, M))
[[1]
[0]]
[[1 1]
[0 0]]
[[1. 0.75]
[0. 0.25]]
Toto formatovani vystupu neni vizualne uplne idealni.
Jednim resenim pro situace, kdy potrebujes neco hezciho, je pouziti funkce array_to_latex v Qiskitu z modulu qiskit.visualization.
Vsimni si, ze v nasledujicim kodu pouzivame obecnou funkci Pythonu display.
Naproti tomu konkretni chovani print muze zaviset na tom, co se tiskne, jako je tomu u poli definovanych pomoci NumPy.
from qiskit.visualization import array_to_latex
display(array_to_latex(np.matmul(M1, ket1)))
display(array_to_latex(np.matmul(M1, M2)))
display(array_to_latex(np.matmul(M, M)))
Stavy, mereni a operace
Qiskit obsahuje nekolik trid, ktere umoznuji vytvaret a manipulovat se stavy, merenimi a operacemi -- takze neni treba programovat vse potrebne pro simulaci kvantovych stavu, mereni a operaci v Pythonu od nuly. Nize jsou uvedeny nektere priklady, ktere ti pomohou zacit.
Definice a zobrazeni stavovych vektoru
Trida Statevector v Qiskitu poskytuje funkcionalitu pro definovani a manipulaci s kvantovymi stavovymi vektory.
V nasledujicim kodu je naimportovana trida Statevector a definovano nekolik vektoru.
(Take importujeme funkci sqrt z knihovny NumPy pro vypocet odmocniny.
Tuto funkci lze alternativne volat jako np.sqrt za predpokladu, ze NumPy jiz byl naimportovan, jak tomu bylo vyse; jde pouze o jiny zpusob importu a pouziti teto konkretni funkce.)
from qiskit.quantum_info import Statevector
from numpy import sqrt
u = Statevector([1 / sqrt(2), 1 / sqrt(2)])
v = Statevector([(1 + 2.0j) / 3, -2 / 3])
w = Statevector([1 / 3, 2 / 3])
Trida Statevector obsahuje metodu draw pro zobrazeni stavovych vektoru ruznymi zpusoby, vcetne
text pro cisty text, latex pro vykresleny LaTeX a latex_source pro zdrojovy kod LaTeXu, coz se muze hodit pro kopirovani do dokumentu.
(Pro zobrazeni LaTeX kodu pouzij print misto display pro nejlepsi vysledky.)
display(u.draw("text"))
display(u.draw("latex"))
print(u.draw("latex_source"))
[0.70710678+0.j,0.70710678+0.j]