use everett::StateVectorBackend;
use everett::algorithms::qft;
use std::f64::consts::TAU;
fn main() {
let n = 3;
let input_basis = 1usize;
let mut c = everett::Circuit::new(n);
for bit in 0..n {
if input_basis & (1 << bit) != 0 {
c.x(bit);
}
}
c.compose(&qft::qft(n));
let state = StateVectorBackend::run(&c).unwrap().into_state();
let nn = 1 << n;
let scale = 1.0 / (nn as f64).sqrt();
println!("QFT |{input_basis}> on {n} qubits (N={nn}):");
println!(
"{:>4} {:>24} {:>18} {:>18}",
"k", "amplitude", "expected_re", "expected_im"
);
for k in 0..nn {
let amp = state.amplitudes()[k];
let expected_re = scale * (TAU * k as f64 / nn as f64).cos();
let expected_im = scale * (TAU * k as f64 / nn as f64).sin();
println!(
"{k:>4} {:.6}+{:.6}i {:.6} {:.6}",
amp.re, amp.im, expected_re, expected_im
);
}
}