use rand::{rngs::SmallRng, SeedableRng};
use qvass::{qft, QuantumSimulator, QubitError};
fn main() -> Result<(), QubitError> {
const NUM_QUBITS: u8 = 3;
let qft_gate = qft::build_qft_circuit(NUM_QUBITS)?.into_gate();
let mut sim = QuantumSimulator::new(NUM_QUBITS);
sim.add_gate(qft_gate, [0, 1, 2])?;
let initial_state_index = 1;
sim.init_state(initial_state_index);
println!(
"Initial state is |{:0width$b}>",
initial_state_index,
width = NUM_QUBITS as usize
);
sim.run();
println!("\nState vector after applying QFT:");
println!("{}", sim.state());
let mut rng = SmallRng::seed_from_u64(42);
let n_iterations = 4096;
let mut histogram = vec![0; sim.state().as_ref().len()];
println!("\nBuilding histogram from {n_iterations} measurements...");
for _ in 0..n_iterations {
sim.init_state(initial_state_index);
sim.run();
let outcome = sim.measure(&mut rng);
histogram[outcome] += 1;
}
println!("\nMeasurement Histogram:");
for (i, &count) in histogram.iter().enumerate() {
println!(
" |{:0width$b}> : {}",
i,
count,
width = NUM_QUBITS as usize
);
}
println!(
"\nNote: Each outcome has a probability of ~1/8, so counts should be around {}.",
n_iterations / 8
);
Ok(())
}