use crate::Circuit;
#[must_use]
pub fn bell() -> Circuit {
let mut c = Circuit::new(2);
c.h(0).cnot(0, 1);
c
}
#[must_use]
pub fn ghz(n: usize) -> Circuit {
assert!(n >= 2, "GHZ state requires at least 2 qubits");
let mut c = Circuit::new(n);
c.h(0);
for k in 0..n - 1 {
c.cnot(k, k + 1);
}
c
}
#[cfg(test)]
mod tests {
use super::*;
use crate::StateVectorBackend;
#[test]
fn bell_has_correct_probabilities() {
let exec = StateVectorBackend::run(&bell()).unwrap();
let s = exec.state();
assert!((s.probability(0b00) - 0.5).abs() < 1e-12);
assert!((s.probability(0b11) - 0.5).abs() < 1e-12);
assert!(s.probability(0b01) < 1e-12);
assert!(s.probability(0b10) < 1e-12);
}
#[test]
fn ghz3_has_correct_probabilities() {
let exec = StateVectorBackend::run(&ghz(3)).unwrap();
let s = exec.state();
assert!((s.probability(0b000) - 0.5).abs() < 1e-12);
assert!((s.probability(0b111) - 0.5).abs() < 1e-12);
for b in 1..=6 {
assert!(s.probability(b) < 1e-12, "unexpected amplitude at {b}");
}
}
}