diff options
| author | hachem <im@hachem.wtf> | 2024-09-22 10:11:02 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2024-09-22 10:11:02 +0200 |
| commit | 53287a755cc8bcef8b4c1324f1ed1f34224e15c4 (patch) | |
| tree | 145974cff606e06c48dfe1ca2476f21d0ce5a1d2 /libpsi/src/core/component.rs | |
| parent | a84b6394209e37620e45155a25b3755b38ba8515 (diff) | |
rename project to psi
Diffstat (limited to 'libpsi/src/core/component.rs')
| -rw-r--r-- | libpsi/src/core/component.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libpsi/src/core/component.rs b/libpsi/src/core/component.rs new file mode 100644 index 0000000..bd18b52 --- /dev/null +++ b/libpsi/src/core/component.rs @@ -0,0 +1,51 @@ +use crate::{ColumnVector, Complex, Matrix, VectorMatrix}; + +pub type QuantumRegister = ColumnVector<Complex<f64>>; +pub type QuantumBit = ColumnVector<Complex<f64>>; + +#[macro_export] +macro_rules! count { + () => { 0 }; + ($head:expr $(,$tail:expr)*) => { 1 + count!($( $tail ),*) }; +} + +#[macro_export] +macro_rules! qubit { + ($(($re:expr, $im:expr)),*) => { + { + let mut vector = Vec::new(); + $( + vector.push(complex!($re, $im)); + )* + QuantumBit::new(vector) + } + }; +} + +#[macro_export] +macro_rules! quantum_register { + ($($bit:expr),*) => { + { + const N: usize = count!($($bit),*); + let bits: [QuantumBit; N] = [$($bit),*]; + QuantumRegister::from(&bits) + } + }; +} + +impl QuantumBit { + pub fn get_state(&self) -> i32 { + (self[1] != Complex::new(0.0, 0.0)) as i32 + } +} + +impl QuantumRegister { + pub fn from(bits: &[QuantumBit]) -> QuantumRegister { + let matrices: Vec<Matrix<Complex<f64>>> = bits.iter().map(|bit| bit.to_matrix()).collect(); + let mut result = matrices[0].clone(); + for matrix in &matrices[1..] { + result = result.kronecker(matrix); + } + ColumnVector::from_matrix(&result) + } +} |
