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 qubitech.
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í a a pomocí metody tensor vytvoříme nový vektor,
Všimni si, že zde používáme metodu from_label k definování stavů a místo abychom je definovali sami.
zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))
Další povolené štítky zahrnují "+" a "-" pro stavy plus a minus, stejně jako "r" a "l" (zkratka pro "right" a "left") pro stavy
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 a
plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))
Alternativou je použití operátoru ^ pro tenzorové součiny, který přirozeně dává stejné výsledky.
display((plus ^ minus_i).draw("latex"))
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"))
Opět, stejně jako u vektorů, operátor ^ je ekvivalentní.
display((H ^ Id ^ X).draw("latex"))
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 pro (který byl již definován výše).
display(phi.evolve(H ^ Id).draw("latex"))
Zde je kód, který definuje operaci a vypočítá pro Pro upřesnění, jedná se o operaci , ve které je qubit na levé straně řídicí a qubit na pravé straně je cílový. Výsledkem je Bellův stav
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"))
Čá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 qubity ve stavovém vektoru.
Alternativně můžeme jako argument poskytnout seznam celých čísel, což způsobí, že budou měřeny pouze qubity s danými indexy.
Pro demonstraci kód níže vytvoří stav
a změří qubit číslo 0, což je qubit nejvíce vpravo. (Qiskit čísluje qubity 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"))
Measured: 0
State after measurement:
Measured: 00
State after measurement: