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.

Kvantna kola (quantum circuits)

U prošloj lekciji upoznali smo pojedinačne kvantne kapije kao matrice 2×22\times 2. Sada ćemo videti kako se one nižu jedna za drugom u kvantno kolo: dijagram koji se čita kao note, s leva na desno, kroz vreme.

Koraci u muzici,

Slika 1:Tri koraka svake muzičke kompozicije. Violinski ključ (početak kompozicije), note (sama kompozicija), i kraj (znak za kraj kompozicije).

Kvantno kolo je zapravo „recept" za ceo kvantni proračun: kako da pripremimo, transformišemo i izmerimo kubit.

Tri koraka svakog kvantnog procesa

Svaki kvantno-mehanički proces (pa i svaki kvantni proračun) sastoji se iz tri koraka:

Tri koraka kvantnog procesa: priprema, evolucija, merenje.

Slika 2:Tri koraka svakog kvantnog procesa na primeru jednog kubita: priprema (0\ket{0} na severnom polu Blohove sfere), evolucija (kapija UU zarotira stanje) i merenje (instrument daje klasičan bit 0 ili 1).

Cilj ove lekcije je da naučimo da čitamo i pišemo ovakve dijagrame, i da ih povežemo sa matricama iz prethodne lekcije.

Ovakav tip diskretne kvantne mehanika deli sličnost sa muzičkim notama kao što smo već videli.

Ne treba zaboraviti da najčešće sa merenjem asociramo osu z! (slučaj superprovodnih kubita)

Šta je kvantno kolo?

Kvantno kolo je dijagram sa nekoliko jednostavnih pravila:

Jednokjubitno kolo sa kapijama H i T i merenjem.

Slika 3:Tehnički crtež napravljen pomoću Qiskit paketa jednokubitno kolo: kubit qq krene iz 0\ket{0}, prođe kroz kapije HH i TT, pa se meri; rezultat (klasičan bit) upisuje se u klasični registar cc (dvostruka linija).

Kasnije ćemo videti i kola sa više žica (više kubita, jedna iznad druge); zasad ostajemo na jednom kubitu.

Kolo je proizvod matrica (redosled je obrnut!)

Neka kolo prvo primeni kapiju AA, pa BB, pa CC na početno stanje ψulaz\ket{\psi^{\rm ulaz}}. To kolo možemo dijagramatički da predstavimo na sledeći način:

Tri koraka kvantnog procesa: priprema, evolucija, merenje.

Slika 4:Primer kola sa više kapija. Imati na umu da ovo nije kompletna vizuelizacija, već samo delimična sa stanjima na početku i na kraju. Tehnički diagram ne nužno imaju takav zapis.

Pošto svaka naredna kapija deluje na rezultat prethodne, ukupno dejstvo je

ψizlaz=C(B(Aψulaz))=CBAUkoloψulaz.\ket{\psi^{\rm izlaz}} = C\,\big(B\,(A\ket{\psi^{\rm ulaz}})\big) = \underbrace{C\,B\,A}_{U_{\rm kolo}}\,\ket{\psi^{\rm ulaz}}.

Uočite obrnut redosled: iako u kolu prvo crtamo AA, u proizvodu matrica ona stoji skroz desno (jer prva deluje na stanje).

Prethodni primer

Pogledajmo konkretan primer sa Slika 3: kolo 0HT\ket{0}\,\text{–}\,H\,\text{–}\,T\,\text{–} (prvo HH, pa TT). Njegova matrica je Ukolo=THU_{\rm kolo} = T\,H (a ne HTH\,T!):

Isto možemo da proverimo na dva načina — „ručno" preko matrica (kao u prošloj lekciji) i preko Qiskit kola.

import numpy as np

# matrice kapija (iste kao u prošloj lekciji)
I2 = np.eye(2, dtype=complex)
X  = np.array([[0, 1], [1, 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)
ket0 = np.array([[1], [0]], dtype=complex)

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

Prvo „ručno", matricama — pazimo na obrnut redosled:

# Kolo |0> --H--T-- ; redosled matrica je OBRNUT od crtanja:
U_kolo = T @ H                 # prvo H, pa T  ->  T·H
psi = U_kolo @ ket0
print("Izlazno stanje =\n", np.round(psi, 3))   # (|0> + e^{i pi/4}|1>)/sqrt(2) = |T>

Hajde da obavimo isti račun koristeći QisKit. Gde je prvo potrebno instalirati paket pomoću komande

# instalacije QisKit-a i dodatka zabolju vizuelizaciju
!pip install qiskit 
!pip install pylatexenc

A sada isto to kao Qiskit kolo. QuantumCircuit sam množi matrice u obrnutom redosledu umesto nas:

# učitati potrebne funkcije iz QisKit paketa
from qiskit import QuantumCircuit


# definisati kvantno kolo
qc = QuantumCircuit(1)
qc.h(0)      # prvo nacrtamo (i primenimo) H
qc.t(0)      # pa T
# provera da se Qiskit slaže sa T·H (a ne H·T):
print("Qiskit = T·H ? ", np.allclose(Operator(qc).data, T @ H))
print("Stanje:", np.round(Statevector(qc).data, 3))

Vizuelizacija kola iz Slika 3.

qc.measure_all()

qc.draw('mpl', style='iqp')

Priprema proizvoljnog stanja kolom

Kolo nam služi i da iz 0\ket{0} napravimo bilo koje željeno stanje. Iz prošle lekcije znamo da opšta kapija U(θ,ϕ,λ)U(\theta,\phi,\lambda) iz (23) pokriva sve rotacije, pa jedno kolo 0U(θ,ϕ,λ)\ket{0}\,\text{–}\,U(\theta,\phi,\lambda)\,\text{–} može da dosegne svaku tačku Blohove sfere.

Za tačke na ekvatoru dovoljni su HH i jedna RzR_z: prvo HH (dovede nas na ekvator, u +\ket{+}), pa Rz(φ)R_z(\varphi) (zavrti za azimut φ\varphi).

# Kolo |0> --H--Rz(phi)-- priprema stanje na ekvatoru sa azimutom phi:
phi = np.radians(70)
psi = Rz(phi) @ H @ ket0                 # matrica kola je Rz·H (obrnut redosled!)
azimut = np.degrees(np.angle(psi[1, 0] / psi[0, 0]))
print("Blohov azimut stanja:", round(azimut, 1), "stepeni")   # ~ 70
# isto kolo u Qiskit-u:
qc = QuantumCircuit(1)
qc.h(0)
qc.rz(np.radians(70), 0)
qc.measure_all()

qc.draw('mpl', style='iqp')

Merenje: kraj kola

Na kraju kola merimo kjubit u računskoj bazi {0,1}\{\ket{0}, \ket{1}\}. Po Bornovom pravilu iz , verovatnoće ishoda su p(0)=0|ψ2p(0) = |\braket{0}{\psi}|^2 i p(1)=1|ψ2p(1) = |\braket{1}{\psi}|^2, pa jedno merenje daje jedan klasičan bit. U kolu ga zapisujemo sa qc.measure_all(), kao na Slika 3.

Time je „recept" kola potpun: pripremi, evoluiraj, izmeri. Kako iz pojedinačnih merenja dobijamo verovatnoće i celo stanje, kako merimo u drugim bazama, i kako se kolo pokreće na pravom kvantnom računaru je tema naredne lekcije, Kvantno merenje.

Vežbe


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