Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Qubit (Kubit)

Kubit je osnovna jedinica građe i funkcije kvantne informatike i predstavlja analogon klasičnim bit-ovima. Klasični bitovi mogu da imaju vrednosti 0 i 1, qubit može biti u linearnoj superpoziciji ova dva stanja!

Kvantno stanje kubita

Kubit predstavlja vektor u dvodimenzionalnom kompleksnom Hilbertovom prostoru H=C2\Hilb = \CC^2. Ovaj Hilbertov prostor je razapet ortonormiranom računskom bazom 0\ket{0} i 1\ket{1}. Ove vektore zapisujemo kao

0=(10),1=(01).\ket{0} = \begin{pmatrix}1\\0\end{pmatrix}, \qquad \ket{1} = \begin{pmatrix}0\\1\end{pmatrix}.

Generalno, stanje kubita (ket vektor) možemo zapisati kao

ψ=α0+β1,α,βC,\ket{\psi} = \alpha \ket{0} + \beta \ket{1}, \qquad \alpha, \beta \in \CC,

gde kompleksne amplitude zadovoljavaju uslov normalizacije

ψ|ψ=α2+β2=1.\braket{\psi}{\psi} = |\alpha|^2 + |\beta|^2 = 1 .

Gde smo već koristili i uveli Dirakovu bra-ket notaciju.

Sledeće pokušajmo sada da izvedemo jednačinu (3) direktno.

Blohova sfera

Koristeći sledeća dva ugla:

svako jednokubitno stanje se do na globalnu fazu može zapisati u obliku

ψ=cos(θ2)0+eiφsin(θ2)1,\ket{\psi} = \cos{\left( \tfrac{\theta}{2} \right)} \,\ket{0} + e^{i\varphi}\sin{ \left( \tfrac{\theta}{2} \right)}\,\ket{1},

gde svako moguće stanje i odabrani ugao pokazuje na površinu sfere radijusa 1. Kao što je prikazano na slici Slika 2.

Bloh

Slika 2:Blohova sfera sa severnim i južnim polom 0\ket{0} i 1\ket{1}, pritom gde je jednokubitno stanje ψ\ket{\psi} iz jednačine (5) prikazano sa ljubičastom bojom sa primerom dva ugla (θ,φ)(\theta, \varphi). Ostale relevantne tačke na sferi poput ±\ket{\pm} i ±i\ket{\pm i} su takođe date. Za ukazane vrednosti uglova potrebno je konvertovati vrednosti uglova koristeći π180\frac{\pi}{180}, i to za dati primer cos(452)=cos(45π1802)=0.92388\cos{(\frac{45^{\circ}}{2})} = \cos{(\frac{45 \frac{\pi}{180}}{2})} = 0.92388, φ=45=45π180=0.785398\varphi = 45^{\circ} = 45 \frac{\pi}{180} = 0.785398, i sin(452)=0.382683\sin{(\frac{45^{\circ}}{2})} = 0.382683.

Vaš prvi ‘kvantni’ kod u Python-u!

Hajde da generišemo jednokubitna stanja, kao i napravimo vizuelizaciju Blohove sfere.

# za numeričku manipulaciju nizova, vektori, matrice, tenzori
import numpy as np             

# Računska baza |0> and |1> kao ket vektori (vektori kolone)
ket0 = np.array([[1], [0]], dtype=complex)
ket1 = np.array([[0], [1]], dtype=complex)

# prikaži definicije stanja 
print("Stanje nula: ")
print(ket0)
print("Stanje jedan: ")
print(ket1)

Hajde sad da definišemo stanje plus +\ket{+} kao: θ=π2\theta = \frac{\pi}{2} i φ=0\varphi = 0 (vidi Slika 2) i to

+=12(0+1),\ket{+} = \dfrac{1}{\sqrt{2}} ( \ket{0} + \ket{1} ),

stanje koje možemo da definišemo u Python-u kao

# Definisanje linearna superpozicija stanja: |+> = (|0> + |1>)/sqrt(2)
alpha = 1/np.sqrt(2)
beta  = 1/np.sqrt(2)
psi = alpha * ket0 + beta * ket1

# prikaži definiciju stanja
print("|psi> =")
print(psi)

Sada možemo da proverimo normalizaciju vektora (3) za ovaj primer direktno izračunajući ψ|ψ\braket{\psi}{\psi} što je u kodu: psi.conj().T @ psi:

# <psi|psi> što bi trebalo da nam da 1
norm = (psi.conj().T @ psi).item().real
print("norm =", round(norm, 6))

Kod za vizuelizaciju Blohove sfere

Sada ćemo predstaviti kod koji vizualizuje različite vektore na Blohovoj sferi i generiše samu Slika 2. Kod se sastoji od više elemenata i sledećih:

import numpy as np                          
import matplotlib.pyplot as plt             # vizuelizacija
from mpl_toolkits.mplot3d import Axes3D     # vizuelizacija za 3D 

%matplotlib inline                          # pomoćna funkcija za vizuelizaciju unutar Jupyter notebook okruženja

Moguće je automatski uraditi konverziju uglova iz stepeni u radijane i to:

# Biranje parametara ugla: po promeni potrebno je promeniti i ponoviti egzekuciju ovog i sledećih blokova 
THETA = np.radians(45)   # polarni ugao:   0 -> |0>,  180 deg -> |1>
PHI   = np.radians(45)   # azimutalni ugao oko z ose

# --- Uglovi -> Blohov vektor  r = (sin th cos ph, sin th sin ph, cos th) -
x = np.sin(THETA) * np.cos(PHI)
y = np.sin(THETA) * np.sin(PHI)
z = np.cos(THETA)
r = np.array([x, y, z])

# prikaži vrednosti
print("Blohov Vektor r =", np.round(r, 3))
print("Dužina |r|      =", round(float(np.linalg.norm(r)), 3), " (= 1 za čista stanja)")

Grafičke konverzije u cilju iscrtavanja:

# Grafično generisanje sferične mreže 
u = np.linspace(0, 2*np.pi, 60)     # azimutalna mreža
v = np.linspace(0, np.pi,   60)     # polarna mreža

xs = np.outer(np.cos(u), np.sin(v))
ys = np.outer(np.sin(u), np.sin(v))
zs = np.outer(np.ones_like(u), np.cos(v))

# Kružnica za Ekvator i dva meridijana
circ = np.linspace(0, 2*np.pi, 200)

Poslednji blok koji generiše sliku:

# krajnje generisanje grafika (celokupan kod je dosta tehnički i nije neophodno razumeti ga u detalje za ovaj kurs)

fig = plt.figure(figsize=(7.5, 7.5))
ax = fig.add_subplot(111, projection="3d")

ax.plot_surface(xs, ys, zs, color="black", alpha=0.08,
                linewidth=0, rstride=2, cstride=2, antialiased=True, shade=False)


ax.plot(np.cos(circ), np.sin(circ), 0, color="#555555", lw=0.8, alpha=0.6)   # equator
ax.plot(np.cos(circ), 0*circ, np.sin(circ), color="#bbbbbb", lw=0.6)         # xz meridian
ax.plot(0*circ, np.cos(circ), np.sin(circ), color="#bbbbbb", lw=0.6)         # yz meridian


L = 1.3
axis_kw = dict(lw=1.3, arrow_length_ratio=0.05)
for d, col in [((1,0,0), "#c0392b"), ((0,1,0), "#27ae60"), ((0,0,1), "#34495e")]:
    dx, dy, dz = d
    ax.quiver(0,0,0,  L*dx,  L*dy,  L*dz, color=col, **axis_kw)   # positive
    ax.quiver(0,0,0, -L*dx, -L*dy, -L*dz, color=col, **axis_kw)   # negative
# small axis letters at the positive tips
ax.text(1.45, 0, 0, r"$x$", color="#c0392b", fontsize=11, alpha=0.7)
ax.text(0, 1.42, 0, r"$y$", color="#27ae60", fontsize=11, alpha=0.7)
ax.text(0, 0, 1.45, r"$z$", color="#34495e", fontsize=11, alpha=0.7)


poles = [
    (( 0, 0, 1), r"$|0\rangle$",    "#34495e", ( 0.1, -0.1,  0.10)),
    (( 0, 0,-1), r"$|1\rangle$",    "#34495e", ( 0.1, -0.1, -0.12)),
    (( 1, 0, 0), r"$|{+}\rangle$",  "#c0392b", (0.14,-0.02,  0.10)),
    ((-1, 0, 0), r"$|{-}\rangle$",  "#c0392b", (-0.30,0.00,  0.10)),
    (( 0, 1, 0), r"$|{+}i\rangle$", "#27ae60", (0.02, 0.14,  0.10)),
    (( 0,-1, 0), r"$|{-}i\rangle$", "#27ae60", (0.02,-0.28,  0.10)),
]
for (px,py,pz), lab, col, (ox,oy,oz) in poles:
    ax.scatter(px, py, pz, color=col, s=55, edgecolors="white", linewidths=0.8, zorder=5)
    ax.text(px+ox, py+oy, pz+oz, lab, color=col, fontsize=13, ha="center")


ax.quiver(0,0,0, r[0], r[1], r[2], color="#8e44ad", lw=3.0, arrow_length_ratio=0.12, zorder=6)
ax.scatter(*r, color="#8e44ad", s=45, zorder=6)
ax.text(r[0]*1.12, r[1]*1.12, r[2]*1.12+0.06, r"$|\psi\rangle$", color="#8e44ad", fontsize=14)


ax.plot([r[0], r[0]], [r[1], r[1]], [0, r[2]], color="#8e44ad", ls=":", lw=1)
ax.plot([0, r[0]], [0, r[1]], [0, 0], color="#8e44ad", ls=":", lw=1.2)


ARC = "#e67e22"
nx, ny = np.cos(PHI), np.sin(PHI)            # xy-plane direction of the projection


tp = np.linspace(0, PHI, 40)
ax.plot(0.32*np.cos(tp), 0.32*np.sin(tp), 0, color=ARC, lw=1.8)
ax.text(0.46*np.cos(PHI/2), 0.46*np.sin(PHI/2), 0.0, r"$\varphi$",
        color=ARC, fontsize=14, ha="center")


tt = np.linspace(0, THETA, 40)
ax.plot(0.40*np.sin(tt)*nx, 0.40*np.sin(tt)*ny, 0.40*np.cos(tt), color=ARC, lw=1.8)
tm = THETA/2
ax.text(0.52*np.sin(tm)*nx, 0.52*np.sin(tm)*ny, 0.52*np.cos(tm), r"$\theta$",
        color=ARC, fontsize=14, ha="center")


a, b = np.cos(THETA/2), np.sin(THETA/2)
ax.set_title(rf"$|\psi\rangle = {a:.2f}\,|0\rangle + e^{{i\,{PHI:.2f}}}\,{b:.2f}\,|1\rangle$"
             + f"\n$\\theta={np.degrees(THETA):.0f}^\\circ,\\ \\varphi={np.degrees(PHI):.0f}^\\circ$",
             fontsize=13, pad=8)


ax.set_box_aspect([1, 1, 1])
ax.set_xlim(-1.1, 1.1); ax.set_ylim(-1.1, 1.1); ax.set_zlim(-1.1, 1.1)
ax.set_axis_off()
ax.view_init(elev=18, azim=35)

plt.tight_layout()
plt.savefig("blohova_sfera.png", dpi=300, bbox_inches="tight")
plt.show()

Izlaz ova 4 bloka koda je zapravo Slika 2.

Specijalna stanja na Blohovoj sferi

Najčešće izdvajamo šest posebnih čistih stanja koja leže na koordinatnim osama Blohove sfere. Zovemo ih stabilizatorska stanja i ona su temena oktaedra upisanog u sferu:

StanjeDefinicijaθ\thetaφ\varphi
0\ket{0}severni pol0bilo koje
1\ket{1}južni polπ\pibilo koje
+\ket{+}12(0+1)\dfrac{1}{\sqrt 2}(\ket{0}+\ket{1})π2\dfrac{\pi}{2}0
\ket{-}12(01)\dfrac{1}{\sqrt 2}(\ket{0}-\ket{1})π2\dfrac{\pi}{2}π\pi
+i\ket{+i}12(0+i1)\dfrac{1}{\sqrt 2}(\ket{0}+i\ket{1})π2\dfrac{\pi}{2}π2\dfrac{\pi}{2}
i\ket{-i}12(0i1)\dfrac{1}{\sqrt 2}(\ket{0}-i\ket{1})π2\dfrac{\pi}{2}3π2\dfrac{3\pi}{2}

Za polarne tačke 0\ket{0} i 1\ket{1} izbor za φ\varphi je proizvoljan, jer svi azimutalni uglovi opisuju isti pol.

Magična stanja

U literaturi se pod imenom „T stanje" ili „magično stanje" najčešće sreću tri predstavnika, koje je lako pomešati. Zato ih ovde izdvajamo zajedno:

StanjeDefinicijaBlohov vektorθ, φ\theta,\ \varphip(0)p(0)
T\ket{T}cosθT20+eiπ/4sinθT21\cos\tfrac{\theta_T}{2}\ket{0} + e^{i\pi/4}\sin\tfrac{\theta_T}{2}\ket{1}, cosθT=13\cos\theta_T=\tfrac{1}{\sqrt3}13(1,1,1)\tfrac{1}{\sqrt3}(1,1,1)54.7, π454.7^\circ,\ \tfrac{\pi}{4}0.789
H\ket{H}cosπ80+sinπ81\cos\tfrac{\pi}{8}\ket{0} + \sin\tfrac{\pi}{8}\ket{1}12(1,0,1)\tfrac{1}{\sqrt2}(1,0,1)45, 045^\circ,\ 00.854
A=T+\ket{A}=T\ket{+}12(0+eiπ/41)\tfrac{1}{\sqrt2}\big(\ket{0} + e^{i\pi/4}\ket{1}\big)12(1,1,0)\tfrac{1}{\sqrt2}(1,1,0)90, π490^\circ,\ \tfrac{\pi}{4}0.5
Bloh

Slika 3:Šest stabilizatorskih stanja čine temena oktaedra upisanog u Blohovu sferu. Tri magična stanja su takođe prikazana: T\ket{T} (zlatna) probija sferu kroz centar + ⁣+ ⁣++\!+\!+ strane, dok H\ket{H} (ljubičasta) i A\ket{A} (tirkizna) leže na sredinama ivica oktaedra.

Interpretacija stanja kao verovatnoća

Naposletku, hajde da damo definiciju koja daje verovatnoću nekog ishoda kk

p(k)=k|ψ2,p(k) = |\braket{k}{\psi}|^2,

kao kvadrat modula kompleksnog skalarnog broja

Za recimo:

Izračunajmo primer za stanje +\ket{+}.

Pomoću sledećeg koda možemo uraditi račun numerički:

# Računska baza |0> and |1> kao ket vektori (vektori kolone)
ket0 = np.array([[1], [0]], dtype=complex)
ket1 = np.array([[0], [1]], dtype=complex)

# Definisanje linearna superpozicija stanja: |+> = (|0> + |1>)/sqrt(2)
alpha = 1/np.sqrt(2)
beta  = 1/np.sqrt(2)
psi = alpha * ket0 + beta * ket1

# Verovatnoća da izmerimo ishod k u računskoj bazi
p0 = abs((ket0.conj().T @ psi).item())**2
p1 = abs((ket1.conj().T @ psi).item())**2
print("p(0) =", round(p0, 3))
print("p(1) =", round(p1, 3))

Očekivani rezultat bi trebalo da bude 1/21/2 i 1/21/2 za oba slučaja. Ukoliko saberemo ove verovatnoće, one bi trebalo da izađu na 0.5+0.5=10.5 + 0.5 = 1.

Kao što vidimo, kvantna mehanika je u stvari neka vrsta generalizovane teorije verovatnoće sa posebnim pravilima gde kvadrati koeficijenata linearne superpozicije svi treba da se saberu na 1, što predstavlja zakon očuvanja ukupne verovatnoće.

Vežbe

Reši sledeće zadatke koristeći samo gradivo iz ove lekcije: definiciju kubita i normalizaciju (3), Dirakovu bra-ket notaciju, Blohovu sferu (5), tabelu specijalnih stanja i Bornovo pravilo (11).

Zagrevanje: normalizacija i verovatnoće

Blohova sfera: uglovi, vektori, stanja

Faze, geometrija i opšte formule


Jovan Odavić · dzovan90 [at] gmail [dot] com · www.jovanodavic.com