Sari la conținutul principal

Implementare Qiskit

În lecția anterioară, am aruncat o primă privire asupra claselor Statevector și Operator din Qiskit și le-am folosit pentru a simula operații și măsurători pe qubiți individuali. În această secțiune, vom folosi aceste clase pentru a explora comportamentul mai multor qubiți.

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

print(__version__)
2.1.1

Vom începe prin a importa clasele Statevector și Operator, precum și funcția de radical pătrat din NumPy. De acum înainte, în general, vom importa toate pachetele necesare la începutul fiecărei lecții.

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

Produse tensoriale

Clasa Statevector are o metodă tensor, care returnează produsul tensorial al acelui Statevector cu un altul, furnizat ca argument. Argumentul este interpretat ca factorul tensorial din dreapta.

De exemplu, mai jos creăm doi vectori de stare care reprezintă 0\vert 0\rangle și 1,\vert 1\rangle, și folosim metoda tensor pentru a crea un nou vector, ψ=01.\vert \psi\rangle = \vert 0\rangle \otimes \vert 1\rangle. Observă că folosim metoda from_label pentru a defini stările 0\vert 0\rangle și 1,\vert 1\rangle, în loc să le definim manual.

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

01 |01\rangle

Alte etichete permise includ "+" și "-" pentru stările plus și minus, precum și "r" și "l" (prescurtări pentru "right" și "left") pentru stările

+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.

Aici, "+", "-" sau "right" și "left" provin din contextul spinului mecanic cuantic, în care o componentă a spinului poate indica spre stânga sau spre dreapta într-un experiment; nu se referă la cel mai din dreapta sau cel mai din stânga qubit în sistemele cu mai mulți qubiți. Iată un exemplu de produs tensorial al lui +\vert {+} \rangle și 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

O alternativă este folosirea operației ^ pentru produse tensoriale, care produce, în mod firesc, aceleași rezultate.

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

Clasa Operator are, de asemenea, o metodă tensor (și o metodă from_label), după cum vedem în exemplele de mai jos.

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}

Din nou, ca și în cazul vectorilor, operația ^ este echivalentă.

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}

Stările compuse pot fi evoluate folosind operații compuse, exact cum ne-am aștepta — la fel cum am văzut pentru sistemele individuale în lecția anterioară. De exemplu, codul următor calculează starea (HI)ϕ(H\otimes I)\vert\phi\rangle pentru ϕ=+i\vert\phi\rangle = \vert + \rangle \otimes \vert {-i}\rangle (care a fost deja definită mai sus).

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

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

Iată un cod care definește o operație CXCX și calculează CXψCX \vert\psi\rangle pentru ψ=+0.\vert\psi\rangle = \vert + \rangle \otimes \vert 0 \rangle. Pentru claritate, aceasta este o operație CXCX în care qubitul din stânga este controlul, iar qubitul din dreapta este ținta. Rezultatul este starea Bell ϕ+.\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

Măsurători parțiale

În lecția anterioară, am folosit metoda measure pentru a simula o măsurătoare a unui vector de stare cuantică. Această metodă returnează două elemente: rezultatul simulat al măsurătorii și noul Statevector corespunzător acestei măsurători.

În mod implicit, measure măsoară toți qubiții din vectorul de stare. Alternativ, putem furniza o listă de numere întregi ca argument, ceea ce face ca doar acei indici de qubiți să fie măsurați. Pentru a demonstra acest lucru, codul de mai jos creează starea

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

și măsoară qubitul numărul 0, care este cel mai din dreapta qubit. (Qiskit numerotează qubiții începând de la 0, de la dreapta la stânga. Vom reveni la această convenție de numerotare în lecția următoare.)

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