use crate::Circuit;
#[must_use]
pub fn superdense_circuit(bit0: bool, bit1: bool) -> Circuit {
let mut c = Circuit::with_classical(2, 2);
c.h(0).cnot(0, 1);
if bit1 {
c.x(0);
}
if bit0 {
c.z(0);
}
c.cnot(0, 1).h(0);
c.measure(0, 0).measure(1, 1);
c
}
#[cfg(test)]
mod tests {
use super::*;
use crate::StateVectorBackend;
fn check(bit0: bool, bit1: bool) {
let exec = StateVectorBackend::run(&superdense_circuit(bit0, bit1)).unwrap();
assert_eq!(
exec.classical()[0],
bit0,
"bit0 mismatch for ({bit0},{bit1})"
);
assert_eq!(
exec.classical()[1],
bit1,
"bit1 mismatch for ({bit0},{bit1})"
);
}
#[test]
fn all_four_bit_pairs_decode_correctly() {
check(false, false);
check(false, true);
check(true, false);
check(true, true);
}
}