Přeskočit na hlavní obsah

Implementace v Qiskitu

V předchozí lekci jsme se poprvé podívali na třídy Statevector a Operator v Qiskitu a použili jsme je k simulaci operací a měření na jednotlivých Qubit​ech. V této sekci tyto třídy využijeme k prozkoumání chování více Qubit​ů.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__

print(__version__)
2.1.1

Začneme importem tříd Statevector a Operator a také funkce odmocniny z NumPy. Od teď se obecně budeme starat o všechny potřebné importy na začátku každé lekce.

from qiskit.quantum_info import Statevector, Operator
from numpy import sqrt

Tenzorové součiny

Třída Statevector má metodu tensor, která vrací tenzorový součin daného Statevector s jiným, předaným jako argument. Argument je interpretován jako tenzorový faktor na pravé straně.

Například níže vytvoříme dva stavové vektory reprezentující 0\vert 0\rangle a 1,\vert 1\rangle, a pomocí metody tensor vytvoříme nový vektor, ψ=01.\vert \psi\rangle = \vert 0\rangle \otimes \vert 1\rangle. Všimni si, že zde používáme metodu from_label k definování stavů 0\vert 0\rangle a 1,\vert 1\rangle, místo abychom je definovali sami.

zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))

01 |01\rangle

Další povolené štítky zahrnují "+" a "-" pro stavy plus a minus, stejně jako "r" a "l" (zkratka pro "right" a "left") pro stavy

+i=120+i21andi=120i21.\vert {+i} \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{i}{\sqrt{2}} \vert 1 \rangle \qquad\text{and}\qquad \vert {-i} \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle - \frac{i}{\sqrt{2}} \vert 1 \rangle.

Zde "+", "-" nebo "right" a "left" pocházejí z kontextu kvantově mechanického spinu, ve kterém může složka spinu v experimentu ukazovat doleva nebo doprava; neodkazuje se tím na Qubit nejvíce vpravo nebo nejvíce vlevo v systémech více Qubit​ů. Zde je příklad tenzorového součinu +\vert {+} \rangle a i.\vert {-i} \rangle.

plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))

1200i201+1210i211\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

Alternativou je použití operátoru ^ pro tenzorové součiny, který přirozeně dává stejné výsledky.

display((plus ^ minus_i).draw("latex"))

1200i201+1210i211\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

Třída Operator má rovněž metodu tensor (stejně jako metodu from_label), jak vidíme v následujících příkladech.

H = Operator.from_label("H")
Id = Operator.from_label("I")
X = Operator.from_label("X")
display(H.tensor(Id).draw("latex"))
display(H.tensor(Id).tensor(X).draw("latex"))
[220220022022220220022022] \begin{bmatrix} \frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & 0 & - \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & - \frac{\sqrt{2}}{2} \\ \end{bmatrix} [02200022002200022000000220002200220002200220002200220002200000022000220022000220] \begin{bmatrix} 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 \\ \end{bmatrix}

Opět, stejně jako u vektorů, operátor ^ je ekvivalentní.

display((H ^ Id ^ X).draw("latex"))
[02200022002200022000000220002200220002200220002200220002200000022000220022000220] \begin{bmatrix} 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 \\ 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 \\ \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} \\ 0 & 0 & \frac{\sqrt{2}}{2} & 0 & 0 & 0 & - \frac{\sqrt{2}}{2} & 0 \\ \end{bmatrix}

Složené stavy mohou být vyvíjeny pomocí složených operací, jak bychom očekávali — stejně jako jsme to viděli pro jednotlivé systémy v předchozí lekci. Například následující kód vypočítá stav (HI)ϕ(H\otimes I)\vert\phi\rangle pro ϕ=+i\vert\phi\rangle = \vert + \rangle \otimes \vert {-i}\rangle (který byl již definován výše).

display(phi.evolve(H ^ Id).draw("latex"))

22002i201\frac{\sqrt{2}}{2} |00\rangle- \frac{\sqrt{2} i}{2} |01\rangle

Zde je kód, který definuje operaci CXCX a vypočítá CXψCX \vert\psi\rangle pro ψ=+0.\vert\psi\rangle = \vert + \rangle \otimes \vert 0 \rangle. Pro upřesnění, jedná se o operaci CXCX, ve které je Qubit na levé straně řídicí a Qubit na pravé straně je cílový. Výsledkem je Bellův stav ϕ+.\vert\phi^{+}\rangle.

CX = Operator([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])
psi = plus.tensor(zero)
display(psi.evolve(CX).draw("latex"))

2200+2211\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Částečná měření

V předchozí lekci jsme použili metodu measure k simulaci měření kvantového stavového vektoru. Tato metoda vrací dvě položky: simulovaný výsledek měření a nový Statevector odpovídající tomuto měření.

Ve výchozím nastavení measure měří všechny Qubit​y ve stavovém vektoru. Alternativně můžeme jako argument poskytnout seznam celých čísel, což způsobí, že budou měřeny pouze Qubit​y s danými indexy. Pro demonstraci kód níže vytvoří stav

w=001+010+1003\vert w\rangle = \frac{\vert 001\rangle + \vert 010\rangle + \vert 100\rangle}{\sqrt{3}}

a změří Qubit číslo 0, což je Qubit nejvíce vpravo. (Qiskit čísluje Qubit​y od 0, zprava doleva. K této konvenci číslování se vrátíme v příští lekci.)

w = Statevector([0, 1, 1, 0, 1, 0, 0, 0] / sqrt(3))
display(w.draw("latex"))

result, state = w.measure([0])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))

result, state = w.measure([0, 1])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))

33001+33010+33100\frac{\sqrt{3}}{3} |001\rangle+\frac{\sqrt{3}}{3} |010\rangle+\frac{\sqrt{3}}{3} |100\rangle

Measured: 0
State after measurement:

22010+22100\frac{\sqrt{2}}{2} |010\rangle+\frac{\sqrt{2}}{2} |100\rangle

Measured: 00
State after measurement:

100 |100\rangle