1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
extern crate rand;
extern crate num;

use std::f32;
use rand::Rng;
use num::complex::Complex;

pub mod gate;

pub struct Qubit{
    state: (f32, Complex<f32>),
}

impl Default for Qubit {
    fn default() -> Qubit {
	Qubit{state: (1.0, Complex::new(0.0, 0.0))}
    }
}

fn measure(qubit: &mut Qubit) -> u32 {
    let mut rng = rand::thread_rng();
    let rn = rng.gen::<f32>();

    if rn < qubit.state.0.powf(2.0) {
	qubit.state = (1.0, Complex::new(0.0, 0.0));
	return 0;
    }
    qubit.state = (0.0, Complex::new(1.0, 0.0));
    return 1;
}

pub mod alg {
    use crate::*;

    pub fn qrn() -> u32 {
	let mut qubit = Qubit::default();
	gate::h(&mut qubit);
	return measure(&mut qubit);
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use num::complex::Complex;

    #[test]
    fn test_qubit_init() {
	let qubit = Qubit::default();

	assert_eq!(qubit.state, (1.0, Complex{re: 0.0, im: 0.0}));
    }

    #[test]
    fn test_collapes_of_state() {
	use crate::gate;

	let mut qubit = Qubit::default();

	gate::h(&mut qubit);

	let want = measure(&mut qubit);

	for _n in 0..100 {
	    let got = measure(&mut qubit);
	    assert_eq!(got, want);
	}
    }

}