From 1a9ef4a7f0cbd4ed848ccf0903ebbbd4fdab6adf Mon Sep 17 00:00:00 2001 From: hachem Date: Sun, 22 Sep 2024 13:07:30 +0200 Subject: First quantum calculation --- libpsi-tester/src/main.rs | 10 ++++++---- libpsi/src/core/component.rs | 39 ++++++++++++++++++++++++++++++++++----- libpsi/src/core/gates.rs | 0 libpsi/src/maths/vector.rs | 1 + 4 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 libpsi/src/core/gates.rs diff --git a/libpsi-tester/src/main.rs b/libpsi-tester/src/main.rs index 4aaa92d..5ecc2f0 100644 --- a/libpsi-tester/src/main.rs +++ b/libpsi-tester/src/main.rs @@ -1,8 +1,10 @@ use libpsi::*; fn main() { - let bit_1 = qubit![(1.0, 2.0), (1.0, 2.0)]; - let bit_2 = qubit![(1.0, 2.0), (1.0, 2.0)]; - let register: QuantumRegister = quantum_register![bit_1, bit_2]; - println!("{}", register); + let mut register = quantum_register![qubit![(1.0, 0.0), (0.0, 0.0)]]; + let hadamard = matrix!([Complex::one(), Complex::one()]; [Complex::one(), -Complex::one()]) + .scale(complex!(1.0 / f64::sqrt(2.0), 0.0)); + println!("Before:\n{}", register[0]); + register.apply(&hadamard, 0); + println!("\nAfter H Gate:\n{}", register[0]); } diff --git a/libpsi/src/core/component.rs b/libpsi/src/core/component.rs index bd18b52..51e0551 100644 --- a/libpsi/src/core/component.rs +++ b/libpsi/src/core/component.rs @@ -1,7 +1,13 @@ use crate::{ColumnVector, Complex, Matrix, VectorMatrix}; +use std::ops; -pub type QuantumRegister = ColumnVector>; pub type QuantumBit = ColumnVector>; +pub type QuantumGate = Matrix>; + +pub struct QuantumRegister { + state: ColumnVector>, + qubits: Vec, +} #[macro_export] macro_rules! count { @@ -27,8 +33,8 @@ macro_rules! quantum_register { ($($bit:expr),*) => { { const N: usize = count!($($bit),*); - let bits: [QuantumBit; N] = [$($bit),*]; - QuantumRegister::from(&bits) + let mut bits: [QuantumBit; N] = [$($bit),*]; + QuantumRegister::from(&mut bits) } }; } @@ -40,12 +46,35 @@ impl QuantumBit { } impl QuantumRegister { - pub fn from(bits: &[QuantumBit]) -> QuantumRegister { + pub fn from(bits: &mut [QuantumBit]) -> QuantumRegister { let matrices: Vec>> = 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) + + QuantumRegister { + qubits: bits.to_vec(), + state: ColumnVector::from_matrix(&result), + } + } + + pub fn apply(&mut self, gate: &QuantumGate, index: usize) { + let result: ColumnVector> = self.state.mul_matrix(gate).unwrap(); + self.qubits[index] = result; + } +} + +impl ops::Index for QuantumRegister { + type Output = QuantumBit; + + fn index(&self, index: usize) -> &Self::Output { + &self.qubits[index] + } +} + +impl ops::IndexMut for QuantumRegister { + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + &mut self.qubits[index] } } diff --git a/libpsi/src/core/gates.rs b/libpsi/src/core/gates.rs new file mode 100644 index 0000000..e69de29 diff --git a/libpsi/src/maths/vector.rs b/libpsi/src/maths/vector.rs index 0c13e4c..243061d 100644 --- a/libpsi/src/maths/vector.rs +++ b/libpsi/src/maths/vector.rs @@ -43,6 +43,7 @@ pub trait VectorMatrix { fn to_matrix(&self) -> Matrix; } +#[derive(Clone)] pub struct VectorImpl(Vec); pub type RowVector = VectorImpl; pub type ColumnVector = VectorImpl; -- cgit v1.3