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.

Kvantne kapije (quantum gates)

Kako to možemo da utičemo na kvantna stanja? Videli smo da kvantna stanja definišemo pomoću vektora, dok da bismo menjali te vektore zapravo koristimo matrice.

Naime, promenu kvantnog stanja (u slučaju jednog kjubita to je rotacija na Blohovoj sferi) zapisujemo kao

ψnovo=Uψstaro,\ket{\psi^{\rm novo}} = U \ket{\psi^{\rm staro}},

gde je veličina matrice dN×dNd^N \times d^N, pri čemu je za kubite lokalna dimenzija d=2d = 2, a NN broj kubita. U slučaju jednog kjubita N=1N = 1, pa je operator UU zapravo dimenzije 2×22 \times 2.

Među najpoznatijim kvantnim kapijama su zapravo Paulijeve matrice definisane kao

I=(1001),X=(0110),Y=(0ii0),Z=(1001).\begin{aligned} I &= \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}, \\ X &= \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}, \\ Y &= \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}, \\ Z &= \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}. \end{aligned}

Interesantna stvar je da su vektori {0,1}\{ \ket{0}, \ket{1} \} svojstveni vektori ZZ operatora.

Paulijeve kapije

Pogledajmo šta svaka od Paulijevih kapija radi kada deluje na računsku bazu {0,1}\{\ket{0}, \ket{1}\}.

Kapija XX je kvantni NOT (obrtanje bita): ona zamenjuje amplitude uz 0\ket{0} i 1\ket{1},

X0=1,X1=0.X\ket{0} = \ket{1}, \qquad X\ket{1} = \ket{0}.

Kapija ZZ je obrtanje faze (phase flip): ostavlja 0\ket{0} na miru, a stanju 1\ket{1} dodaje znak minus,

Z0=0,Z1=1.Z\ket{0} = \ket{0}, \qquad Z\ket{1} = -\ket{1}.

Kapija YY istovremeno obrće i bit i fazu (do na imaginarnu jedinicu), Y=iXZY = iXZ:

Y0=i1,Y1=i0.Y\ket{0} = i\ket{1}, \qquad Y\ket{1} = -i\ket{0}.

Sve tri Paulijeve matrice dele nekoliko važnih svojstava. One su istovremeno hermitske (P=PP = P^\dagger) i unitarne (PP=IP^\dagger P = I), a pošto su same sebi inverz, kvadrat svake je jedinična matrica,

X2=Y2=Z2=I.X^2 = Y^2 = Z^2 = I.

Dodatno, Paulijeve matrice antikomutiraju i zadovoljavaju ciklične relacije

XY=iZ,YZ=iX,ZX=iY,XY = iZ, \qquad YZ = iX, \qquad ZX = iY,

odakle sledi, na primer, {X,Z}=XZ+ZX=0\{X, Z\} = XZ + ZX = 0.

Hadamardova kapija

Najvažnija kapija koja pravi superpoziciju iz stanja računske baze je Hadamardova kapija

H=12(1111).H = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}.

Njeno dejstvo na bazna stanja daje upravo stanja +\ket{+} i \ket{-} sa Blohovog ekvatora (vidi tabelu specijalnih stanja u ):

H0=12(0+1)=+,H1=12(01)=.H\ket{0} = \frac{1}{\sqrt{2}}\big(\ket{0} + \ket{1}\big) = \ket{+}, \qquad H\ket{1} = \frac{1}{\sqrt{2}}\big(\ket{0} - \ket{1}\big) = \ket{-}.

Hadamardova kapija je i hermitska i unitarna, pa je sama sebi inverz, H2=IH^2 = I.

Fazne kapije: SS i TT

Pored ZZ, često nam trebaju „blaže" rotacije faze, koje stanju 1\ket{1} dodaju fazu manju od π\pi. Uopšteno, fazna kapija P(λ)P(\lambda) deluje kao

P(λ)=(100eiλ),P(λ)0=0,P(λ)1=eiλ1.P(\lambda) = \begin{pmatrix} 1 & 0 \\ 0 & e^{i\lambda} \end{pmatrix}, \qquad P(\lambda)\ket{0} = \ket{0}, \quad P(\lambda)\ket{1} = e^{i\lambda}\ket{1}.

Tri posebna slučaja imaju svoja imena:

Z=P(π),S=P ⁣(π2)=(100i),T=P ⁣(π4)=(100eiπ/4).Z = P(\pi), \qquad S = P\!\left(\tfrac{\pi}{2}\right) = \begin{pmatrix} 1 & 0 \\ 0 & i \end{pmatrix}, \qquad T = P\!\left(\tfrac{\pi}{4}\right) = \begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}.

Kapija SS je „kvadratni koren" iz ZZ, a TT je koren iz SS:

S2=Z,T2=S,T4=Z.S^2 = Z, \qquad T^2 = S, \qquad T^4 = Z.

--> Za razliku od Paulijevih kapija i Hadamarda, kapije SS i TT nisu same sebi inverz (S=S3S^\dagger = S^3, T=T7T^\dagger = T^7); one su prve u nizu kapija koje ćemo koristiti da bismo dosegli proizvoljno stanje na sferi.

Rotacione kapije

Najprirodniji način da napravimo rotaciju za proizvoljan ugao je da eksponenciramo Paulijevu matricu. Za P{X,Y,Z}P \in \{X, Y, Z\} definišemo rotacionu kapiju

RP(θ)=eiθ2P.R_P(\theta) = e^{-i\frac{\theta}{2} P}.

Pošto je P2=IP^2 = I (iz (7)), razvoj eksponencijalne funkcije se „lomi" na paran i neparan deo i sažima u zatvorenu formu

eiθ2P=cos( ⁣θ2)Iisin( ⁣θ2)P,e^{-i\frac{\theta}{2} P} = \cos{\left( \!\frac{\theta}{2}\right)} I - i\sin{\left( \!\frac{\theta}{2} \right)} P,

što je operatorska verzija Ojlerove formule.

Uvrštavanjem P=X,Y,ZP = X, Y, Z dobijamo tri standardne rotacione kapije

Rx(θ)=eiθ2X=(cosθ2isinθ2isinθ2cosθ2),Ry(θ)=eiθ2Y=(cosθ2sinθ2sinθ2cosθ2),Rz(θ)=eiθ2Z=(eiθ/200eiθ/2).\begin{aligned} R_x(\theta) &= e^{-i\frac{\theta}{2}X} = \begin{pmatrix} \cos\frac{\theta}{2} & -i\sin\frac{\theta}{2} \\ -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}, \\[6pt] R_y(\theta) &= e^{-i\frac{\theta}{2}Y} = \begin{pmatrix} \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\ \sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{pmatrix}, \\[6pt] R_z(\theta) &= e^{-i\frac{\theta}{2}Z} = \begin{pmatrix} e^{-i\theta/2} & 0 \\ 0 & e^{i\theta/2} \end{pmatrix}. \end{aligned}

Opšta parametrizovana kapija U(θ,ϕ,λ)U(\theta, \phi, \lambda)

Sve prethodne kapije su specijalni slučajevi jedne opšte jednokubitne kapije. U Qiskit okruženju najopštija jednokjubitna kapija se definiše (do na nebitnu globalnu fazu) sa tri realna ugla θ,ϕ,λ\theta, \phi, \lambda kao

U(θ,ϕ,λ)=(cos(θ/2)eiλsin(θ/2)eiϕsin(θ/2)ei(ϕ+λ)cos(θ/2)).U(\theta, \phi, \lambda) = \begin{pmatrix} \cos{(\theta/2)} & - e^{i \lambda} \sin{(\theta/2)} \\ e^{i \phi} \sin{ (\theta/2)} & e^{i (\phi + \lambda)} \cos{ (\theta/2)} \end{pmatrix}.

Broj parametara se lepo slaže sa geometrijom: matrica USU(2)U \in SU(2) (specijalna unitarna grupa) ima tačno tri realna slobodna parametra, a U(θ,ϕ,λ)U(\theta,\phi,\lambda) zapravo nije ništa drugo do Ojlerova dekompozicija na tri rotacije, U(θ,ϕ,λ)=Rz(ϕ)Ry(θ)Rz(λ)U(\theta,\phi,\lambda) = R_z(\phi)\,R_y(\theta)\,R_z(\lambda) (do na globalnu fazu).

Sada je lako proveriti da su sve dosadašnje kapije samo posebni izbori uglova. Paulijeve matrice se dobijaju kao

X=(0110)=U(π,0,π),Y=(0ii0)=U ⁣(π,π2,π2),Z=(1001)=U(0,0,π),\begin{aligned} X &= \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} = U(\pi,\, 0,\, \pi), \\[4pt] Y &= \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} = U\!\left(\pi,\, \tfrac{\pi}{2},\, \tfrac{\pi}{2}\right), \\[4pt] Z &= \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} = U(0,\, 0,\, \pi), \end{aligned}

dok se rotacione kapije zapisuju kao

Rx(θ)=U ⁣(θ,π2,π2),Ry(θ)=U(θ,0,0),Rz(θ)=eiθ/2U(0,0,θ).\begin{aligned} R_x(\theta) &= U\!\left(\theta,\, -\tfrac{\pi}{2},\, \tfrac{\pi}{2}\right), \\[4pt] R_y(\theta) &= U(\theta,\, 0,\, 0), \\[4pt] R_z(\theta) &= e^{-i\theta/2}\, U(0,\, 0,\, \theta). \end{aligned}

Kapije su predstavljene u sledećoj tabeli.

KapijaMatricaKao U(θ,ϕ,λ)U(\theta,\phi,\lambda)
II(1001)\left(\begin{smallmatrix} 1 & 0 \\ 0 & 1 \end{smallmatrix}\right)U(0,0,0)U(0,\,0,\,0)
XX(0110)\left(\begin{smallmatrix} 0 & 1 \\ 1 & 0 \end{smallmatrix}\right)U(π,0,π)U(\pi,\,0,\,\pi)
YY(0ii0)\left(\begin{smallmatrix} 0 & -i \\ i & 0 \end{smallmatrix}\right)U(π,π2,π2)U(\pi,\,\tfrac{\pi}{2},\,\tfrac{\pi}{2})
ZZ(1001)\left(\begin{smallmatrix} 1 & 0 \\ 0 & -1 \end{smallmatrix}\right)U(0,0,π)U(0,\,0,\,\pi)
HH12(1111)\tfrac{1}{\sqrt2}\left(\begin{smallmatrix} 1 & 1 \\ 1 & -1 \end{smallmatrix}\right)U(π2,0,π)U(\tfrac{\pi}{2},\,0,\,\pi)
SS(100i)\left(\begin{smallmatrix} 1 & 0 \\ 0 & i \end{smallmatrix}\right)U(0,0,π2)U(0,\,0,\,\tfrac{\pi}{2})
TT(100eiπ/4)\left(\begin{smallmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{smallmatrix}\right)U(0,0,π4)U(0,\,0,\,\tfrac{\pi}{4})
Rx(θ)R_x(\theta)(cosθ2isinθ2isinθ2cosθ2)\left(\begin{smallmatrix} \cos\frac{\theta}{2} & -i\sin\frac{\theta}{2} \\ -i\sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{smallmatrix}\right)U(θ,π2,π2)U(\theta,\,-\tfrac{\pi}{2},\,\tfrac{\pi}{2})
Ry(θ)R_y(\theta)(cosθ2sinθ2sinθ2cosθ2)\left(\begin{smallmatrix} \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\ \sin\frac{\theta}{2} & \cos\frac{\theta}{2} \end{smallmatrix}\right)U(θ,0,0)U(\theta,\,0,\,0)
Rz(θ)R_z(\theta)(eiθ/200eiθ/2)\left(\begin{smallmatrix} e^{-i\theta/2} & 0 \\ 0 & e^{i\theta/2} \end{smallmatrix}\right)eiθ/2U(0,0,θ)e^{-i\theta/2}\,U(0,\,0,\,\theta)

Vaš kvantni kod: kapije u Python-u

Kao i u prošloj lekciji, sve možemo direktno da proverimo u nekoliko linija koda. Prvo definišemo Paulijeve matrice i osnovne kapije.

import numpy as np

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

# --- Paulijeve matrice i osnovne kapije ---
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)
H  = (1/np.sqrt(2)) * np.array([[1, 1], [1, -1]], dtype=complex)
S  = np.array([[1, 0], [0, 1j]], dtype=complex)
T  = np.array([[1, 0], [0, np.exp(1j*np.pi/4)]], dtype=complex)

# dejstvo kapija na baznim stanjima
print("X|0> =\n", X @ ket0)      # -> |1>
print("Z|1> =\n", Z @ ket1)      # -> -|1>
print("H|0> =\n", H @ ket0)      # -> |+>

Proverimo ključna algebarska svojstva iz lekcije — unitarnost, involutivnost i to da su SS i TT koreni iz ZZ:

# unitarnost: U^dagger U = I (npr. za Hadamard)
print("H unitarno? ", np.allclose(H.conj().T @ H, I2))

# involutivnost Paulijevih kapija i Hadamarda: P^2 = I
print("X^2 = I? ", np.allclose(X @ X, I2))
print("H^2 = I? ", np.allclose(H @ H, I2))

# koreni: S^2 = Z i T^2 = S
print("S^2 = Z? ", np.allclose(S @ S, Z))
print("T^2 = S? ", np.allclose(T @ T, S))

# Hadamard kao (X + Z)/sqrt(2)
print("H = (X+Z)/sqrt(2)? ", np.allclose(H, (X + Z)/np.sqrt(2)))

Rotacione kapije i opštu U(θ,ϕ,λ)U(\theta,\phi,\lambda) kapiju najlakše je zapisati kao funkcije uglova:

def Rx(theta):
    return np.array([[np.cos(theta/2), -1j*np.sin(theta/2)],
                     [-1j*np.sin(theta/2), np.cos(theta/2)]], dtype=complex)

def Ry(theta):
    return np.array([[np.cos(theta/2), -np.sin(theta/2)],
                     [np.sin(theta/2),  np.cos(theta/2)]], dtype=complex)

def Rz(theta):
    return np.array([[np.exp(-1j*theta/2), 0],
                     [0, np.exp(1j*theta/2)]], dtype=complex)

def U(theta, phi, lam):
    return np.array([
        [np.cos(theta/2),               -np.exp(1j*lam)*np.sin(theta/2)],
        [np.exp(1j*phi)*np.sin(theta/2), np.exp(1j*(phi+lam))*np.cos(theta/2)]
    ], dtype=complex)

# svaka poznata kapija je specijalan slučaj opšte U(theta, phi, lam):
print("X = U(pi,0,pi)?        ", np.allclose(X, U(np.pi, 0, np.pi)))
print("Y = U(pi,pi/2,pi/2)?   ", np.allclose(Y, U(np.pi, np.pi/2, np.pi/2)))
print("Z = U(0,0,pi)?         ", np.allclose(Z, U(0, 0, np.pi)))
print("H = U(pi/2,0,pi)?      ", np.allclose(H, U(np.pi/2, 0, np.pi)))
print("S = U(0,0,pi/2)?       ", np.allclose(S, U(0, 0, np.pi/2)))
print("T = U(0,0,pi/4)?       ", np.allclose(T, U(0, 0, np.pi/4)))
print("Rx = U(t,-pi/2,pi/2)?  ", np.allclose(Rx(0.7), U(0.7, -np.pi/2, np.pi/2)))
print("Ry = U(t,0,0)?         ", np.allclose(Ry(0.7), U(0.7, 0, 0)))
print("Rz = e^{-it/2}U(0,0,t)?", np.allclose(Rz(0.7), np.exp(-1j*0.7/2)*U(0, 0, 0.7)))

Vizuelizacija dejstva kapija na Blohovoj sferi

Pošto svaka jednokjubitna kapija odgovara rotaciji Blohove sfere, najbolji način da je „osetimo" jeste da nacrtamo stanje pre i posle dejstva kapije. Prvo nam treba funkcija koja iz vektora stanja ψ\ket{\psi} računa Blohov vektor r=(X,Y,Z)\mathbf{r} = (\langle X\rangle, \langle Y\rangle, \langle Z\rangle):

def bloch_vector(psi):
    """Blohov vektor r = (<X>, <Y>, <Z>) za stanje jednog kjubita."""
    psi = psi.reshape(2, 1)
    rx = (psi.conj().T @ X @ psi).item().real
    ry = (psi.conj().T @ Y @ psi).item().real
    rz = (psi.conj().T @ Z @ psi).item().real
    return np.array([rx, ry, rz])

# provera: |0> je na severnom polu (0,0,1), |+> na +x osi (1,0,0)
print("r(|0>) =", np.round(bloch_vector(ket0), 3))          # [0 0 1]
print("r(H|0>) =", np.round(bloch_vector(H @ ket0), 3))     # [1 0 0]  -> |+>

Sledeći blok crta providnu sferu sa koordinatnim osama (pomoćna funkcija), a zatim iscrtava stanje pre (ljubičasto) i posle (narandžasto) delovanja izabrane kapije:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D     # 3D projekcija

%matplotlib inline

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)
    # ekvator
    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)
    # tri ose (oba smera)
    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()

# --- IZABERI kapiju i početno stanje ---
kapija = H                     # probaj i X, Z, S, T, Rx(np.pi/2), Ry(np.pi/3) ...
psi_pre   = ket0               # početno stanje
psi_posle = kapija @ psi_pre   # stanje posle dejstva kapije

r_pre   = bloch_vector(psi_pre)
r_posle = bloch_vector(psi_posle)

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

ax.quiver(0,0,0, *r_pre,   color="#8e44ad", lw=3, arrow_length_ratio=0.12)
ax.text(*(1.15*r_pre),   r"pre", color="#8e44ad", fontsize=13)
ax.quiver(0,0,0, *r_posle, color="#e67e22", lw=3, arrow_length_ratio=0.12)
ax.text(*(1.15*r_posle), r"posle", color="#e67e22", fontsize=13)

ax.set_title("Dejstvo kapije na Blohovoj sferi", fontsize=13, pad=8)
ax.view_init(elev=18, azim=35)
plt.tight_layout()
plt.savefig("dejstvo_kapije.png", dpi=300, bbox_inches="tight")
plt.show()

Menjajući promenljivu kapija (na primer u X, Z, S, T, Rx(np.pi/2), Ry(np.pi/3)) i početno stanje psi_pre, možeš da vidiš kako svaka kapija rotira Blohov vektor: Paulijeve i Hadamardova za ugao π\pi, a rotacione za proizvoljan ugao koji sam biraš.

Univerzalnost: HH, SS i TT

Prirodno pitanje je: koliko kapija nam zaista treba da bismo mogli da izvedemo bilo koje kvantno računanje? Neće nam trebati beskonačna riznica kapija — dovoljan je mali, konačan skup.

Za jedan kjubit, opšta kapija U(θ,ϕ,λ)U(\theta,\phi,\lambda) pokriva sve rotacije, ali na pravom hardveru ne možemo da podesimo uglove savršeno precizno. Zato tražimo konačan (diskretan) skup kapija čijim kombinovanjem možemo da se proizvoljno blizu približimo svakoj željenoj kapiji. Ključne su dve grupe:

Da ta aproksimacija bude i efikasna, garantuje Solovej–Kitajeva teorema: svaku željenu jednokjubitnu kapiju možemo aproksimirati sa greškom ε\varepsilon koristeći samo O ⁣(logc(1/ε))\mathcal{O}\!\big(\log^{c}(1/\varepsilon)\big) kapija iz skupa {H,T}\{H, T\} (uz malu konstantu cc). Drugim rečima, cena veće preciznosti raste tek poli-logaritamski, što je izuzetno povoljno.

Vežbe


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

References
  1. Gottesman, D. (1998). The Heisenberg Representation of Quantum Computers. arXiv Preprint arXiv:Quant-Ph/9807006. 10.48550/arXiv.quant-ph/9807006
  2. Nielsen, M. A., & Chuang, I. L. (2010). Quantum Computation and Quantum Information: 10th Anniversary Edition. Cambridge University Press. 10.1017/CBO9780511976667