from qiskit import QuantumCircuit

import quantum_utils_v1 as q

# ============================================================================
# STANJA KUBITA: SUPERPOZICIJA, FAZNI GEJTOVI I POVRATAK U RAČUNSKU BAZU
# ============================================================================
# Tipičan obrazac kvantnog računanja u tri faze:
#   1) ULAZAK u superpoziciju    — Adamar (H) na svaki kubit
#   2) RAD u superpoziciji       — fazni gejtovi (Z, T) menjaju FAZE baznih stanja
#   3) IZLAZAK iz superpozicije   — ponovo H, da se faze pretvore u merljive razlike
#
# Fazni gejtovi (Z = faza π, T = faza π/4) ne menjaju verovatnoće dok smo u
# superpoziciji, ali zato menjaju faze; tek završni H te "skrivene" faze pretvara
# u različite verovatnoće pri merenju. Prati Blohovu sferu posle svake faze.
# ============================================================================

# Kvantno kolo sa dva kubita i dva klasična bita.
qc = QuantumCircuit(2, 2)
qc.reset([0, 1])            # Inicijalizacija kubita 0 i 1 u stanje |0⟩
qc.barrier()                # Barijera = vizuelni presek (ne menja stanje)
q.show_bloch_sphere(qc)     # Blohova sfera sa trenutnim stanjem kubita

# Faza 1: ulazak u superpoziciju (oba kubita u |+⟩)
qc.h(0)
qc.h(1)
qc.barrier()
q.show_bloch_sphere(qc)

# Faza 2: rad u superpoziciji — fazni gejtovi rotiraju faze oko Z ose
qc.z(1)   # Z: fazni pomak za π na kubitu 1
qc.t(0)   # T: fazni pomak za π/4 na kubitu 0
qc.barrier()
q.show_bloch_sphere(qc)

# Faza 3: izlazak iz superpozicije i povratak u računsku bazu
qc.h(0)
qc.h(1)
qc.barrier()
q.show_bloch_sphere(qc)

# Merenje
qc.measure(0, 0)
qc.measure(1, 1)
qc.barrier()
q.show_qc(qc)
q.show_measurement(qc)
