use qnect::create;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("--- Qnect: Quantum Interference Demo ---\n");
println!("Demonstrating the heart of quantum computing: interference!\n");
println!("1. Basic Interference Pattern:");
let mut q = create().with_qubits(1).build()?;
q.h(0).await?;
println!(" After H: qubit is in |+⟩ = (|0⟩ + |1⟩)/√2");
q.z(0).await?;
println!(" After Z: qubit is in |−⟩ = (|0⟩ - |1⟩)/√2");
q.h(0).await?;
println!(" After second H: interference causes cancellation");
let result = q.measure(0).await?;
println!(
" Measured: |{}⟩ (always 1 due to destructive interference!)\n",
result
);
println!("2. Two-Qubit Interference:");
let mut q = create().with_qubits(2).build()?;
q.h(0).await?;
q.cnot(0, 1).await?;
println!(" Created |Φ+⟩ = (|00⟩ + |11⟩)/√2");
q.z(0).await?;
println!(" After Z on qubit 0: (|00⟩ - |11⟩)/√2");
q.h(0).await?;
q.h(1).await?;
let (m0, m1) = (q.measure(0).await?, q.measure(1).await?);
println!(" Measured: |{}{}⟩", m0, m1);
println!(" (Results depend on quantum interference patterns)\n");
println!("3. Phase Kickback (Key to Quantum Algorithms):");
let mut q = create().with_qubits(2).build()?;
q.h(0).await?;
q.x(1).await?;
q.cz(0, 1).await?;
println!(" CZ gate 'kicks back' phase to control qubit");
q.h(0).await?;
let control = q.measure(0).await?;
println!(
" Control measured: |{}⟩ (phase affected measurement)",
control
);
println!("\n💡 Key Insight: Quantum interference is what makes quantum");
println!(" algorithms powerful. It's not just superposition - it's");
println!(" the ability to interfere amplitudes constructively and");
println!(" destructively that enables quantum speedup!");
Ok(())
}