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.

Kvantno merenje (quantum measurement)

U prethodnoj lekciji svako kolo se završavalo merenjem, tj. trećim i poslednjim korakom svakog kvantnog procesa. Sada se fokusiramo baš na taj korak:

Merenje u računskoj bazi

Merenje kubita u računskoj bazi {0,1}\{\ket{0}, \ket{1}\} vraća jedan klasičan bit:

Merenje je nepovratno: superpozicija „kolabira" u izmereno bazno stanje, pa jedno kolo daje tačno jedan bit.

Zato do verovatnoća dolazimo tek ponavljanjem: isto kolo pokrenemo mnogo puta tj. kreiramo uzorake (eng. shots) i prebrojimo ishode. Za stanje

+=H0=12(0+1)\ket{+} = H\ket{0} = \dfrac{1}{\sqrt{2}} \left( \ket{0} + \ket{1} \right)

očekujemo otprilike pola-pola raspodelu zastupljenosti na svakom od računskih stanja.

Python kod

osnovni kod
import numpy as np

# Korak 1: definisanje stanja  
amplitudes = np.array([1/np.sqrt(2), 1/np.sqrt(2)], dtype=complex)

# Korak 2: Dobijanje verovatnoća 
probs = np.abs(amplitudes) ** 2          # [0.5, 0.5]

# Korak 3: uzorkovanje
shots = 20
basis_states = np.array([0,1])  # [0, 1]
outcomes = np.random.choice(basis_states, size=shots, p=probs)

# Korak 4: sakupi sva uzorkovanja
counts = np.bincount(outcomes, minlength=len(amplitudes))
probabilities = counts / shots

# Korak 5: prikaži
print('Pojedinačni uzorci: ',counts)
print('Verovatnoće: ',probabilities)
Vizuelizacija
import matplotlib.pyplot as plt

# kod za procesiranje pre prikazivanje histograma
qubit_number = len(bin(len(probabilities) - 1)) - 2 if len(probabilities) > 0 else 0
bit_strings = [bin(i)[2:].zfill(qubit_number) for i in range(len(probabilities))]

# Kreiranje histogram
plt.figure(figsize=(12, 6))
plt.bar(bit_strings, probabilities)

# Ose i naziv
plt.xlabel("Bit Stringovi")
plt.ylabel("Verovatnoća")
plt.title("Histogram verovatnoća")

plt.tight_layout()
plt.show()
vizuelizacija histograma

Slika 1:Primer vizuelizacije histograma merenja. Ovo je izlaz za 20 uzoraka na primeru +\ket{+} stanju. Pojedinačni uzorci: [11 9], Verovatnoće: [0.55 0.45].

Ekvivalent u QisKit

import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector, Pauli
from qiskit.primitives import StatevectorSampler

# lokalni "simulator"; kasnije ga menjamo pravim hardverom
sampler = StatevectorSampler()   

# priprema stanja |+> (bez merenja) 
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0,0)                       # kubit -> klasični bit
counts = sampler.run([qc], shots=1000).result()[0].data.c.get_counts()
print("Ishodi 1000 merenja:", counts)  # ~ {'0': 500, '1': 500}

Kako se broj ponavljanja povećava, tako se vrednosti približavaju tačnim verovatnoćama p(0),p(1)p(0), p(1)!

Sa sledećim kodom možemo da vidimo kako!

import numpy as np
import matplotlib.pyplot as plt

# Stanje: |+> = (|0> + |1>)/sqrt(2)
amplitudes = np.array([1/np.sqrt(2), 1/np.sqrt(2)], dtype=complex)
true_probs = np.abs(amplitudes) ** 2          # [0.5, 0.5]

# Menjaj broj uzorkovanja na logaritomskoj skali (logaritamska zbog bolje vizuelizacije kasnije)
shot_counts = np.unique(np.logspace(0, 5, 60).astype(int))  # 1 ... 100000

p0, p1 = [], []
rng = np.random.default_rng()
for shots in shot_counts:
    outcomes = rng.choice(2, size=shots, p=true_probs)
    counts = np.bincount(outcomes, minlength=2) / shots
    p0.append(counts[0])
    p1.append(counts[1])

# Grafik
plt.figure(figsize=(12, 6))
plt.plot(shot_counts, p0, color="blue", marker="o", markersize=4,
         linewidth=1.2, label="P(0)")
plt.plot(shot_counts, p1, color="red", marker="o", markersize=4,
         linewidth=1.2, label="P(1)")


plt.axhline(0.5, color="black", linestyle="--", linewidth=1, alpha=0.7,
            label="Očekivane vrednosti (0.5)")

plt.xscale("log")
plt.xlabel("Broj uzorkovanja")
plt.ylabel("Verovatnoća")
plt.title(r"Kako merenja konvergiraju?")
plt.grid(True, alpha=0.2)
plt.legend()
plt.ylim(0, 1)

plt.tight_layout()
plt.show()
vizuelizacija konvergencije

Slika 2:Primer vizuelizacije konvergencije ka očekivanim verovatnoćama sa povećavanjem broja uzoraka.

Koliko je kvantna mehanika zapravo nasumična?!

Vratimo se na stanje +\ket{+}. Ono nam je davalo raspodelu pola-pola, pa deluje kao da je „slučajnost" ugrađena u sam kubit. Ali to nije sasvim tačno:

Setimo se Blohove sfere. Bazna stanja u kojima čitamo rezultat, 0\ket{0} i 1\ket{1}, sede na polovima (+z+z i z-z). Stanje +\ket{+} leži na ekvatoru (duž +x+x), tačno podjednako udaljeno od oba pola. Otud i savršeno neodlučnih 50%50\%50%50\%. Ako želimo deterministički ishod, dovoljno je da stanje zarotiramo tako da njegov Blohov vektor pokazuje pravo na jedan od polova.

rotacija Blohovog vektora sa ekvatora na pol

Slika 3:+\ket{+} (crveno, +x+x) leži na ekvatoru: merenje u računskoj bazi je maksimalno neodlučno. Rotacijom oko yy-ose za π/2-\pi/2 vektor dovodimo na pol 0\ket{0} (+z+z), gde merenje postaje deterministično.

Rotacija oko yy-ose

Za tako nešto koristimo rotacionu kapiju Ry(θ)R_y(\theta), koji rotira Blohov vektor u xxzz ravni:

Ry(θ)=(cosθ2sinθ2sinθ2cosθ2).R_y(\theta) = \begin{pmatrix} \cos\frac{\theta}{2} & -\sin\frac{\theta}{2} \\[4pt] \sin\frac{\theta}{2} & \phantom{-}\cos\frac{\theta}{2} \end{pmatrix}.

Primenimo ga na +=12(0+1)\ket{+} = \tfrac{1}{\sqrt{2}}\big(\ket{0} + \ket{1}\big):

Ry(θ)+=12(cosθ2sinθ2sinθ2+cosθ2).R_y(\theta)\ket{+} = \frac{1}{\sqrt{2}}\begin{pmatrix} \cos\frac{\theta}{2} - \sin\frac{\theta}{2} \\[4pt] \sin\frac{\theta}{2} + \cos\frac{\theta}{2} \end{pmatrix}.

Verovatnoća ishoda 0 je kvadrat gornje amplitude, što se lepo izrazi (koristeći trigonometrijski identitet sin(2θ)=2sin(θ)cos(θ)\sin{(2 \theta)} = 2 \sin{(\theta)} \cos{(\theta)})

p(0)=12(cosθ2sinθ2)2=1sinθ2,p(1)=1+sinθ2.p(0) = \frac{1}{2}\Big(\cos\tfrac{\theta}{2} - \sin\tfrac{\theta}{2}\Big)^2 = \frac{1 - \sin\theta}{2}, \qquad p(1) = \frac{1 + \sin\theta}{2}.

Sada samo tražimo ugao koji daje p(0)=1p(0) = 1. To je sinθ=1\sin\theta = -1, tj. θ=π/2\theta = -\pi/2. Uvrstimo:

Ry ⁣(π2)+=12(cosπ4+sinπ4sinπ4+cosπ4)=(10)=0.R_y\!\left(-\tfrac{\pi}{2}\right)\ket{+} = \frac{1}{\sqrt{2}}\begin{pmatrix} \cos\frac{\pi}{4} + \sin\frac{\pi}{4} \\[4pt] -\sin\frac{\pi}{4} + \cos\frac{\pi}{4} \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \end{pmatrix} = \ket{0}.

Dakle Ry(π/2)R_y(-\pi/2) vodi +0\ket{+} \to \ket{0}, i merenje sada uvek vraća 0. Analogno, Ry(+π/2)R_y(+\pi/2) vodi +1\ket{+} \to \ket{1} (uvek 1).

Python kod (samo NumPy)

import numpy as np

# Korak 1: polazno stanje |+> = (|0> + |1>)/sqrt(2)
plus = np.array([1/np.sqrt(2), 1/np.sqrt(2)], dtype=complex)

# Korak 2: rotacioni gejt R_y(theta) oko y-ose
def Ry(theta):
    c, s = np.cos(theta/2), np.sin(theta/2)
    return np.array([[c, -s],
                     [s,  c]], dtype=complex)

# Korak 3: ugao koji |+> vodi u |0>
theta = -np.pi/2
psi = Ry(theta) @ plus
print("Stanje posle rotacije:", np.round(psi, 6))     # [1, 0]

# Korak 4: Bornove verovatnoće
probs = np.abs(psi) ** 2
print("Verovatnoće p(0), p(1):", np.round(probs, 6))  # [1, 0]

# Korak 5: uzorkovanje — svih 1000 ishoda je 0
shots = 1000
outcomes = np.random.choice([0, 1], size=shots, p=probs)
counts = np.bincount(outcomes, minlength=2)
print("Ishodi 1000 merenja:", counts)                 # [1000, 0]

Histogram ovog kola nema više dve stubića! Sva verovatnoća je skoncentrisana na ishodu 0:

histogram deterministickog ishoda

Slika 4:Nakon Ry(π/2)R_y(-\pi/2) primenjenog na +\ket{+}, svih 1000 uzoraka daje ishod 0. Slučajnosti više nema.

Nasumičnost se može „otkloniti"

Pošto je p(0)=1sinθ2p(0) = \tfrac{1 - \sin\theta}{2}, ugao rotacije nam je zapravo promenljiva kojom biramo bilo koju verovatnoću između 0 i 1: dve tačke su potpuno determinističke.

import numpy as np
import matplotlib.pyplot as plt

theta = np.linspace(-np.pi, np.pi, 400)
p0 = (1 - np.sin(theta)) / 2
p1 = (1 + np.sin(theta)) / 2

plt.figure(figsize=(12, 6))
plt.plot(theta, p0, color="blue", lw=2, label="p(0)")
plt.plot(theta, p1, color="red",  lw=2, label="p(1)")
plt.axhline(0.5, color="gray", ls="--", lw=1, alpha=0.7)

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
           [r"$-\pi$", r"$-\pi/2$", "0", r"$\pi/2$", r"$\pi$"])
plt.xlabel(r"Ugao rotacije $\theta$")
plt.ylabel("Verovatnoća")
plt.title(r"Verovatnoća ishoda kao funkcija rotacije $R_y(\theta)$ na $|+\rangle$")
plt.ylim(0, 1.05); plt.grid(alpha=0.2); plt.legend()
plt.tight_layout()
plt.show()
verovatnoca kao funkcija ugla rotacije

Slika 5:Rotacijom biramo verovatnoću ishoda. Na θ=0\theta = 0 smo u polaznom +\ket{+} (50–50); na θ=π/2\theta = -\pi/2 dobijamo 100%100\% 0\ket{0}, a na θ=+π/2\theta = +\pi/2 dobijamo 100%100\% 1\ket{1}.

Merenje jednog kola daje jedan bit, ali koliko je taj bit nepredvidiv zavisi od baze. Isto stanje +\ket{+} je nasumično u računskoj bazi, a savršeno predvidivo u {+,}\{\ket{+}, \ket{-}\} bazi. Primeniti kapije pre merenja u računskoj bazi je zato isto što i meriti u zarotiranoj bazi.

Vežbe


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