use num_complex::Complex;
use std::fmt;
type F = f64;
#[derive(Debug)] pub struct Qubit {
state: [Complex<F>; 2],
}
impl Qubit {
pub fn new() -> Self {
Self {
state: [Complex::new(1.0, 0.0), Complex::new(0.0, 0.0)],
}
}
pub fn get_state_vector(&self) -> &[Complex<F>; 2] {
&self.state
}
pub fn apply_gate(&mut self, gate_matrix: &[[Complex<F>; 2]; 2]) {
let g00 = gate_matrix[0][0];
let g01 = gate_matrix[0][1];
let g10 = gate_matrix[1][0];
let g11 = gate_matrix[1][1];
let alpha = self.state[0];
let beta = self.state[1];
let new_alpha = g00 * alpha + g01 * beta;
let new_beta = g10 * alpha + g11 * beta;
self.state = [new_alpha, new_beta];
}
}
impl fmt::Display for Qubit {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let alpha = self.state[0];
let beta = self.state[1];
write!(
f,
"({:.3} + {:.3}i)|0⟩ + ({:.3} + {:.3}i)|1⟩",
alpha.re, alpha.im, beta.re, beta.im
)
}
}
impl Default for Qubit {
fn default() -> Self {
Self::new()
}
}