from qiskit import QuantumCircuit

import quantum_utils_v1 as q

# ============================================================================
# "URADI SAM" — KVANTNO KOLO KAO MAH-CENDEROV INTERFEROMETAR
# ============================================================================
# Ova vežba prevodi optički Mah-Cenderov (Mach–Zehnder) interferometar iz knjige
# u ekvivalentno kvantno kolo nad JEDNIM kubitom. Veza komponenti i gejtova:
#
#   H-gejt          ↔  polupropusno ogledalo (PPO) — deli/spaja "puteve" (superpozicija)
#   Z-gejt          ↔  staklena pločica — uvodi faznu razliku između dva puta
#   X-gejt          ↔  ogledala O1 i O2 — zamenjuju gornji i donji put
#
# Cilj vežbe: prati stanje na Blohovoj sferi posle svakog elementa i pokušaj da
# unapred PREDVIDIŠ rezultat merenja, pa proveri da li se poklapa sa histogramom.
# ============================================================================

# Jedan kubit i jedan klasični bit (za merenje na kraju).
qc = QuantumCircuit(1, 1)
qc.barrier()
q.show_bloch_sphere(qc)

qc.x(0)         # Početno stanje |1⟩ (foton kreće "donjim" putem)
qc.barrier()
q.show_bloch_sphere(qc)

qc.h(0)         # H-gejt – prvo polupropusno ogledalo (PPO1)
qc.barrier()
q.show_bloch_sphere(qc)

qc.z(0)         # Z-gejt – staklena pločica (fazni pomak)
qc.barrier()
q.show_bloch_sphere(qc)

qc.x(0)         # X-gejt – ogledala O1 i O2 (zamena puteva)
qc.barrier()
q.show_bloch_sphere(qc)

qc.h(0)         # H-gejt – drugo polupropusno ogledalo (PPO2)
qc.barrier()
q.show_bloch_sphere(qc)

qc.measure(0, 0)

q.show_qc(qc)
q.show_measurement(qc)
