"""
KONTROLISANI FAZNI GEJT (Controlled-Phase, CP)
==============================================
Ovaj program pokazuje kako radi kontrolisani fazni gejt `cp(θ, kontrola, cilj)`.

CP dodaje fazu e^{iθ} samo onom baznom stanju u kome su OBA kubita
(i kontrola i cilj) jednaka |1⟩. Na stanja |00⟩, |01⟩ i |10⟩ nema uticaja.
Zato je CP "entanglujući" gejt: kada je kontrolni kubit u superpoziciji,
faza se upisuje na način koji povezuje (entangluje) dva kubita.
"""

import math
from qiskit import QuantumCircuit
import quantum_utils_v1 as q

# Fazni ugao θ koji dodajemo: θ = 2π·(1/8) = π/4 (osmina punog kruga).
angle = 2 * math.pi / 8  # φ = 1/8 → fazni ugao = 2π/8 = π/4

# Kolo sa 2 kubita i 2 klasična bita (klasični bitovi služe za merenje na kraju).
qc = QuantumCircuit(2, 2)
qc.reset([0, 1])          # garantujemo početno stanje |00⟩
qc.x(1)                   # kubit 1 → |1⟩ (da bi CP uopšte imao na šta da deluje)
q.show_bloch_sphere(qc)   # početno stanje

# Korak 1: kubit 0 u superpoziciju  |0⟩ → (|0⟩+|1⟩)/√2
qc.h(0)
qc.barrier()
q.show_bloch_sphere(qc)

# Korak 2: kontrolisani fazni gejt, kontrola = kubit 0, cilj = kubit 1.
# Pošto je kubit 0 u superpoziciji, faza e^{iθ} pogađa samo komponentu |11⟩.
qc.cp(angle, 0, 1)
qc.barrier()
q.show_bloch_sphere(qc)
q.print_state(qc, "State:")

# Merenje oba kubita u pripadajuće klasične bitove.
qc.measure([0, 1], [0, 1])

# Prikaz dijagrama kola i statistike merenja (histogram).
q.show_qc(qc)
q.show_measurement(qc)
