Lumaktaw sa pangunahing nilalaman

Implementasyon sa Qiskit

Sa nakaraang aralin, unang tinuklas ang mga klase na Statevector at Operator sa Qiskit, at ginamit ang mga ito para mag-simulate ng mga operasyon at sukat sa mga single qubit. Sa seksyong ito, gagamitin natin ang mga klaseng ito para tuklasin ang gawi ng maramihang qubit.

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

print(__version__)
2.1.1

Magsisimula tayo sa pag-import ng mga klase na Statevector at Operator, pati na rin ang square root function mula sa NumPy. Sa susunod, sa pangkalahatan, uunahin nating ayusin ang lahat ng kinakailangang import sa simula ng bawat aralin.

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

Mga tensor product​

Ang klase na Statevector ay may tensor na method, na nagbabalik ng tensor product ng Statevector na iyon kasama ang isa pa, na ibinibigay bilang argumento. Ang argumento ay itinuturing bilang tensor factor sa kanan.

Halimbawa, sa ibaba ay gumagawa tayo ng dalawang state vector na kumakatawan sa ∣0⟩\vert 0\rangle at ∣1⟩,\vert 1\rangle, at ginagamit ang tensor method para gumawa ng bagong vector, ∣ψ⟩=∣0βŸ©βŠ—βˆ£1⟩.\vert \psi\rangle = \vert 0\rangle \otimes \vert 1\rangle. Pansinin dito na ginagamit natin ang from_label method para tukuyin ang mga estado na ∣0⟩\vert 0\rangle at ∣1⟩,\vert 1\rangle, sa halip na tukuyin ang mga ito nang ating sarili.

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

∣01⟩ |01\rangle

Kasama sa ibang pinahihintulutang label ang "+" at "-" para sa plus at minus states, at "r" at "l" (maikli para sa "right" at "left") para sa mga estado

∣+i⟩=12∣0⟩+i2∣1⟩andβˆ£βˆ’i⟩=12∣0βŸ©βˆ’i2∣1⟩.\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.

Dito, ang "+", "-" o "right" at "left" ay nagmumula sa konteksto ng quantum mechanical spin, kung saan ang bahagi ng spin ay maaaring tumuro sa kaliwa o kanan sa isang eksperimento; hindi ito tumutukoy sa pinaka-kanan o pinaka-kaliwang qubit sa mga sistema ng maramihang qubit. Narito ang isang halimbawa ng tensor product ng ∣+⟩\vert {+} \rangle at βˆ£βˆ’i⟩.\vert {-i} \rangle.

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

12∣00βŸ©βˆ’i2∣01⟩+12∣10βŸ©βˆ’i2∣11⟩\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

Isa pang alternatibo ay ang paggamit ng operasyong ^ para sa mga tensor product, na natural na nagbibigay ng parehong resulta.

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

12∣00βŸ©βˆ’i2∣01⟩+12∣10βŸ©βˆ’i2∣11⟩\frac{1}{2} |00\rangle- \frac{i}{2} |01\rangle+\frac{1}{2} |10\rangle- \frac{i}{2} |11\rangle

Ang klase na Operator ay mayroon ding tensor method (pati na rin ang from_label method), tulad ng makikita sa mga sumusunod na halimbawa.

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"))
[220220022022220βˆ’2200220βˆ’22] \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} [0220002200220002200000022000220022000220022000βˆ’220022000βˆ’2200000022000βˆ’220022000βˆ’220] \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}

Muli, tulad ng sa kaso ng vector, katumbas ang operasyong ^.

display((H ^ Id ^ X).draw("latex"))
[0220002200220002200000022000220022000220022000βˆ’220022000βˆ’2200000022000βˆ’220022000βˆ’220] \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}

Ang mga compound state ay maaaring i-evolve gamit ang mga compound na operasyon tulad ng inaasahan β€” katulad ng nakita natin para sa mga single system sa nakaraang aralin. Halimbawa, kinakalkula ng sumusunod na code ang estado (HβŠ—I)βˆ£Ο•βŸ©(H\otimes I)\vert\phi\rangle para sa βˆ£Ο•βŸ©=∣+βŸ©βŠ—βˆ£βˆ’i⟩\vert\phi\rangle = \vert + \rangle \otimes \vert {-i}\rangle (na tinukoy na sa itaas).

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

22∣00βŸ©βˆ’2i2∣01⟩\frac{\sqrt{2}}{2} |00\rangle- \frac{\sqrt{2} i}{2} |01\rangle

Narito ang ilang code na nagtatakda ng CXCX na operasyon at kinakalkula ang CX∣ψ⟩CX \vert\psi\rangle para sa ∣ψ⟩=∣+βŸ©βŠ—βˆ£0⟩.\vert\psi\rangle = \vert + \rangle \otimes \vert 0 \rangle. Para maging malinaw, ito ay isang CXCX na operasyon kung saan ang qubit sa kaliwa ang kontrol at ang qubit sa kanan ang target. Ang resulta ay ang Bell state na βˆ£Ο•+⟩.\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"))

22∣00⟩+22∣11⟩\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Mga partial measurement​

Sa nakaraang aralin, ginamit natin ang measure method para mag-simulate ng sukat ng isang quantum state vector. Ang method na ito ay nagbabalik ng dalawang bagay: ang na-simulate na resulta ng sukat, at ang bagong Statevector batay sa sukat na iyon.

Sa default, sinusukat ng measure ang lahat ng qubit sa state vector. Maaari naman tayong magbigay ng listahan ng mga integer bilang argumento, na nagiging dahilan upang ang mga qubit index na iyon lamang ang masuri. Para ipakita ito, ang code sa ibaba ay gumagawa ng estado

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

at sinusukat ang qubit number 0, na siyang pinakakanang qubit. (Binibilang ng Qiskit ang mga qubit simula sa 0, mula kanan hanggang kaliwa. Babalik tayo sa convention na ito ng numbering sa susunod na aralin.)

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"))

33∣001⟩+33∣010⟩+33∣100⟩\frac{\sqrt{3}}{3} |001\rangle+\frac{\sqrt{3}}{3} |010\rangle+\frac{\sqrt{3}}{3} |100\rangle

Measured: 0
State after measurement:

22∣010⟩+22∣100⟩\frac{\sqrt{2}}{2} |010\rangle+\frac{\sqrt{2}}{2} |100\rangle

Measured: 00
State after measurement:

∣100⟩ |100\rangle