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.

Realni kvantni sistemi

Do sada smo računali kao da je sve savršeno: kapije deluju tačno, stanje se ne kvari, a merenja u limitu velikog broja uzorkovanja daje precizne verovatnoće.

Pravi kvantni računari su, međutim, pod uticajem šuma (eng. noisy). Kubit stalno „curi" informaciju u okolinu, kapije nisu idealne, a što je kolo dublje, to je greška veća. Ova era računara zove se NISQ (eng. Noisy Intermediate-Scale Quantum) Preskill (2018).

Manja greška.

Manja greška.

Veća greška.

Veća greška.

Primeri nepreciznosti na Blohovoj sferi. Sličice preuzete iz Sales Rodriguez et al. (2025).

U ovoj lekciji uzimamo najjednostavniji model šuma za jedan kubit: depolarizacioni kanal. Pokazaćemo u detalje i korak po korak vidimo šta on radi stanju. Cilj je da steknemo osećaj:

Čista i mešana stanja: matrica gustine

Da bismo uopšte opisali stanje pod uticajem šuma, čist vektor ψ\ket{\psi} nam više nije dovoljan za matematički opišemo stanje kubita. Uvodimo novi matematički objekat i to matricu gustine ρ\rho.

Za čisto stanje ψ\ket{\psi} ona je prosto projektor na to stanje:

ρ=ψ ⁣ψ.\rho = \dyad{\psi}{\psi}.

Na primer, za 0\ket{0} je ρ=0 ⁣0=(1000)\rho = \dyad{0}{0} = \left(\begin{smallmatrix}1&0\\0&0\end{smallmatrix}\right).

Svako stanje jednog kubita (i čisto i pod uticajem šuma) može se zapisati kao:

ρ=12(I+XψX+YψY+ZψZ)=12(I+rσ)\rho = \tfrac{1}{2}\big(I + \langle X \rangle_\psi X + \langle Y \rangle_\psi Y + \langle Z \rangle_\psi Z\big) = \dfrac{1}{2} (I + \mathbf{r} \cdot \mathbf{\sigma} )

gde se Blohov vektor može izraziti kao

r=(Xψ,Yψ,Zψ)=(Tr(ρX),Tr(ρY),Tr(ρZ)).\mathbf{r} = \big(\langle X\rangle_\psi, \langle Y\rangle_\psi, \langle Z\rangle_\psi \big) = \big(\Tr(\rho X),\, \Tr(\rho Y),\, \Tr(\rho Z)\big).

Važna napomena jeste da prema definiciji traga Tr[A]=iiAi{\rm Tr} [A] = \sum\limits_{i} \bra{i} A \ket{i} imamo takodje

Aψ=Tr[ρA]=Tr[ψψA]=ψAψ,\langle A \rangle_{\psi} = {\rm Tr} [\rho A] = {\rm Tr} [\ket{\psi} \bra{\psi} A] = \bra{\psi} A \ket{\psi},

gce u poslednjem koraku smo koristili osobinu cikličnost traga Tr[AB]=Tr[BA]{\rm Tr} [AB] = {\rm Tr} [BA] , za bilo koje A i B koji su neke matrice tj. operatori.

--> Geometrija je jednostavna:

Koliko je stanje „čisto" meri čistoća (eng. purity):

PurTr(ρ2)=12(1+r2),{\rm Pur} \equiv \Tr(\rho^2) = \tfrac{1}{2}\big(1 + |\mathbf{r}|^2\big),

koja ide od 1 (čisto, na površini) do 12\tfrac{1}{2} (maksimalno mešano, u centru).

import numpy as np

# Paulijeve matrice i baza (kao u prethodnim lekcijama)
I2 = np.eye(2, dtype=complex)
X  = np.array([[0, 1], [1, 0]], dtype=complex)
Y  = np.array([[0, -1j], [1j, 0]], dtype=complex)
Z  = np.array([[1, 0], [0, -1]], dtype=complex)
ket0 = np.array([[1], [0]], dtype=complex)
ket1 = np.array([[0], [1]], dtype=complex)

def rho_iz_stanja(psi):
    """Matrica gustine rho = |psi><psi| za čisto stanje."""
    psi = psi.reshape(2, 1)
    return psi @ psi.conj().T

def blohov_vektor(rho):
    """Blohov vektor r = (Tr(rho X), Tr(rho Y), Tr(rho Z))."""
    return np.array([np.trace(rho @ X).real,
                     np.trace(rho @ Y).real,
                     np.trace(rho @ Z).real])

def cistoca(rho):
    return np.trace(rho @ rho).real

# provera: |0> je čisto
rho0 = rho_iz_stanja(ket0)
print("čistoća =", round(cistoca(rho0), 3))            # 1.0

Depolarizacioni kanal

Najjednostavniji model šuma kaže: sa verovatnoćom pp nešto krene po zlu i kubit se zameni potpuno nasumičnim stanjem I/2I/2, a sa verovatnoćom 1p1-p ostane netaknut. Matematički:

E(ρ)=(1p)ρ+pI2,p[0,1].\mathcal{E}(\rho) = (1-p)\,\rho + p\,\frac{I}{2}, \qquad p \in [0, 1].

Parametar pp je jačina šuma:

Primetite kako je ulazna variable ove funkcije matrica gustine a izlazna zapravo matrica gustine. Ovakav tip matematičke operacije se u literaturi još i naziva superoperator i predstavlja dejstvo matrice na matricu.

Računica korak po korak (ulaz 0\ket{0})

Uzmimo ρ=0 ⁣0=(1000)\rho = \dyad{0}{0} = \left(\begin{smallmatrix}1&0\\0&0\end{smallmatrix}\right) i pustimo ga kroz kanal (6):

E(ρ)=(1p)(1000)+p2(1001)=(1p200p2).\mathcal{E}(\rho) = (1-p)\begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix} + \frac{p}{2}\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} 1 - \tfrac{p}{2} & 0 \\[4pt] 0 & \tfrac{p}{2} \end{pmatrix}.

Dijagonala matrice gustine su upravo verovatnoće merenja u računskoj bazi:

p(0)=1p2,p(1)=p2.p(0) = 1 - \dfrac{p}{2}, \qquad p(1) = \frac{p}{2}.

Na primer:

Iako smo pripremili čisto 0\ket{0} (koje bi uvek dalo 0), sada sa verovatnoćom p/2p/2 dobijamo pogrešan ishod 1! To je „greška merenja" koju uvodi šum.

A Blohov vektor? Bio je r=(0,0,1)\mathbf{r} = (0,0,1), a sada je

rz=Tr(ρZ)=(1p2)p2=1p,r_z = \Tr(\rho Z) = \Big(1 - \tfrac{p}{2}\Big) - \tfrac{p}{2} = 1 - p,

tj. r=(0,0,1p)\mathbf{r} = (0, 0, 1-p). Skratio se za faktor (1p)(1-p)!

Opšte pravilo: vektor se smanjuje!

Ovo nije slučajno baš za 0\ket{0}. Ako iskoristimo izraz (2) u kanal (6), dobijamo

E(ρ)=12(I+(1p)rσ)  r    (1p)r  \mathcal{E}(\rho) = \tfrac{1}{2}\Big(I + (1-p)\,\mathbf{r}\cdot\boldsymbol\sigma\Big) \quad\Longrightarrow\quad \boxed{\;\mathbf{r} \;\longmapsto\; (1-p)\,\mathbf{r}\;}

Dakle depolarizacija smanjuje ceo Blohov vektor ka centru za faktor (1p)(1-p), ne menjajući mu pravac. Stanje ostaje na istom „meridijanu", samo klizi ka centru, tj.. postaje sve više mešano.

def depolarizacija(rho, p):
    """Depolarizacioni kanal: E(rho) = (1-p) rho + p I/2."""
    return (1 - p) * rho + p * I2 / 2

p = 0.3
rho_in  = rho_iz_stanja(ket0)          # čisto |0>
rho_out = depolarizacija(rho_in, p)

print("E(|0><0|) =\n", np.round(rho_out, 3))
print("p(0), p(1)      :", np.round(np.diag(rho_out).real, 3))   # [0.85 0.15]
print("Blohov vektor   :", np.round(blohov_vektor(rho_out), 3))  # [0 0 0.7] = (1-p)
print("dužina |r|      :", round(np.linalg.norm(blohov_vektor(rho_out)), 3))  # 0.7
print("čistoća Tr(ρ²)  :", round(cistoca(rho_out), 3))           # 0.745

Za p=0.3p = 0.3: verovatnoća greške je p(1)=0.15p(1) = 0.15, vektor se skratio na 0.7, a čistoća pala sa 1 na 0.745. Sve tri brojke govore istu priču: stanje više nije savršeno i nije ono koje smo očekivali. Naime ovakav tip greške je jedan od glavnih uzroka greške usled nesavršenosti kvantnog hardvera.

Vizuelizacija na Blohovoj sferi

Pošto svako jednokubitno stanje živi na (ili u) Blohovoj sferi, šum je najlakše „videti" upravo tu. Koristimo istu pomoćnu funkciju nacrtaj_sferu kao u lekciji o kapijama, samo sada crtamo vektor pre i posle delovanja šuma.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def nacrtaj_sferu(ax):
    # providna sferična mreža
    u = np.linspace(0, 2*np.pi, 60)
    v = np.linspace(0, np.pi,   60)
    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))
    ax.plot_surface(xs, ys, zs, color="black", alpha=0.06,
                    linewidth=0, rstride=2, cstride=2, antialiased=True, shade=False)
    circ = np.linspace(0, 2*np.pi, 200)
    ax.plot(np.cos(circ), np.sin(circ), 0, color="#555555", lw=0.8, alpha=0.5)
    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,  1.3*dx,  1.3*dy,  1.3*dz, color=col, lw=1.2, arrow_length_ratio=0.05)
        ax.quiver(0,0,0, -1.3*dx, -1.3*dy, -1.3*dz, color=col, lw=1.2, arrow_length_ratio=0.05)
    ax.text(1.45, 0, 0, r"$x$", color="#c0392b")
    ax.text(0, 1.42, 0, r"$y$", color="#27ae60")
    ax.text(0, 0, 1.45, r"$z$", color="#34495e")
    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()

# --- stanje pod uglom (da se lepo vidi), pa depolarizacija ---
def stanje(theta, phi):
    return np.array([[np.cos(theta/2)],
                     [np.exp(1j*phi)*np.sin(theta/2)]], dtype=complex)

p = 0.5
rho_in  = rho_iz_stanja(stanje(np.radians(25), np.radians(150)))
rho_out = depolarizacija(rho_in, p)
r_pre   = blohov_vektor(rho_in)
r_posle = blohov_vektor(rho_out)

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection="3d")
nacrtaj_sferu(ax)
ax.plot(*zip(r_posle, r_pre), color="gray", ls=":", lw=1.3)   # skupljanje
ax.quiver(0,0,0, *r_pre,   color="#8e44ad", lw=3, arrow_length_ratio=0.12)
ax.text(*(1.15*r_pre), r"pre (čisto)", color="#8e44ad", fontsize=13)
ax.quiver(0,0,0, *r_posle, color="#e67e22", lw=3, arrow_length_ratio=0.17)
ax.text(*(1.15*r_posle), r"posle", color="#e67e22", fontsize=13)
ax.scatter([0],[0],[0], color="black", s=15)
ax.set_title(r"Depolarizacija smanjuje Blohov vektor: $\mathbf{r}\to(1-p)\,\mathbf{r}$")
ax.view_init(elev=22, azim=40)
plt.tight_layout()
plt.savefig("sum_depolarizacija.png", dpi=300, bbox_inches="tight")
plt.show()
Blohov vektor se skuplja ka centru posle depolarizacije

Slika 4:Depolarizacija ne menja pravac Blohovog vektora — samo mu skraćuje dužinu za faktor (1p)(1-p). Čisto stanje (ljubičasto, na površini) klizi ka centru u mešano stanje (narandžasto).

Šum koji se ponavlja: put ka centru

Na pravom hardveru šum ne deluje jednom, već posle svake kapije.

depolarizacija

Slika 5:Depolarizacija kad se primeni na svaku kvantnu kapiju.

Ako isti kanal primenimo nn puta, faktori se množe:

r    (1p)nr.\mathbf{r} \;\longmapsto\; (1-p)^n\,\mathbf{r}.

Pošto je 01p10 \le 1-p \le 1, dužina eksponencijalno opada ka nuli: što je kvantno kolo duže (ima više elemenata), to je stanje bliže centru sfere, tj. sve nasumičnije.

p = 0.3
rho = rho_iz_stanja(ket0)
print("n   r_z=(1-p)^n   čistoća   p(1)")
for n in range(15):
    r  = blohov_vektor(rho)
    print(f"{n}      {r[2]:.3f}       {cistoca(rho):.3f}   {rho[0,0].real:.3f} {rho[1,1].real:.3f}")
    rho = depolarizacija(rho, p)   

Za p=0.3p=0.3 dobijamo sledeće vrednosti:

nnrz=(1p)nr_z=(1-p)^nčistoćap(0)p(0)p(1)p(1)
01.0001.0001.0000.000
10.7000.7450.8500.150
20.4900.6200.7450.255
30.3430.5590.6710.329
40.2400.5290.6200.380
50.1680.5140.5840.416
60.1180.5070.5590.441
70.0820.5030.5410.459
80.0580.5020.5290.471
90.0400.5010.5200.480
100.0280.5000.5140.486
110.0200.5000.5100.490
120.0140.5000.5070.493
130.0100.5000.5050.495
140.0070.5000.5030.497
ponavljanje depolarizacije skuplja vektor ka centru sfere

Slika 6:Ponavljanjem šuma (p=0.3p=0.3) Blohov vektor stanja 0\ket{0} se sve više skuplja: rz=(1p)n=1,0.7,0.49,0r_z = (1-p)^n = 1,\,0.7,\,0.49,\dots \to 0. U granici stanje padne u centar. tj. potpuno nasumičan kubit. Kao takav ne nosi nikakvu vrednost i njegov izlaz je ekvivalentan bacanju novčića i dobijanja glava pismo podjednako puta.

Verovatnoća pogrešnog ishoda pritom raste ka 0.5 (čist bacač novčića):

p(1)=1(1p)n2  n  12.p(1) = \frac{1 - (1-p)^n}{2} \;\xrightarrow[n\to\infty]{}\; \frac{1}{2}.

Sledeći grafik sažima sva tri lica istog šuma kao funkciju jačine pp: dužinu vektora, čistoću i grešku merenja.

import numpy as np
import matplotlib.pyplot as plt

pp = np.linspace(0, 1, 200)
plt.figure(figsize=(12, 6))
plt.plot(pp, 1 - pp,                 color="#8e44ad", lw=2.4, label=r"dužina $|\mathbf{r}| = 1-p$")
plt.plot(pp, 0.5*(1 + (1-pp)**2),    color="#e67e22", lw=2.4, label=r"čistoća $\mathrm{Tr}(\rho^2)$")
plt.plot(pp, pp/2,                   color="#2980b9", lw=2.4, label=r"greška merenja $p(1)=p/2$")
plt.axhline(0.5, color="gray", ls="--", lw=1, alpha=0.7)
plt.xlabel("Jačina šuma $p$"); plt.ylabel("Vrednost")
plt.xlim(0, 1); plt.ylim(0, 1.02)
plt.title("Uticaj depolarizacionog šuma na jedan kubit")
plt.grid(alpha=0.2); plt.legend()
plt.tight_layout()
plt.savefig("sum_verovatnoca.png", dpi=300, bbox_inches="tight")
plt.show()
dužina vektora, čistoća i greška merenja kao funkcije jačine šuma

Slika 7:Tri načina da se vidi isti šum. Kako pp raste: dužina vektora i čistoća opadaju ka mešanom stanju, a greška merenja raste ka 50%50\%. Na p=1p=1 kubit je potpuno nasumičan.

Vežbe


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

References
  1. Preskill, J. (2018). Quantum Computing in the NISQ era and beyond. Quantum, 2, 79. 10.22331/q-2018-08-06-79
  2. Sales Rodriguez, P., Robinson, J. M., Jepsen, P. N., He, Z., Duckering, C., Zhao, C., Wu, K.-H., Campo, J., Bagnall, K., Kwon, M., Karolyshyn, T., Weinberg, P., Cain, M., Evered, S. J., Geim, A. A., Kalinowski, M., Li, S. H., Manovitz, T., Amato-Grill, J., … Cantú, S. H. (2025). Experimental demonstration of logical magic state distillation. Nature, 645(8081), 620–625. 10.1038/s41586-025-09367-3