diff --git a/src/lib.rs b/src/lib.rs index 1195e88..e49f49f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,30 +97,28 @@ impl Solver { /// Solve the system and return the indexes of the true hashes (or error if the system is unsolvable) pub fn attempt_solve(&self) -> Result, ()> { + + // Arrange the hashes into an augmented for matrix... - let mut orginal_matrix = Matrix::new( - (self.synthetic_max + self.threshold) as usize, - self.expanded_hashes.len(), - ); - let mut augmented_matrix = Matrix::new( - (self.synthetic_max + self.threshold) as usize + self.expanded_hashes.len(), - self.expanded_hashes.len(), - ); - let m = (self.synthetic_max + self.threshold) as usize; - + let mut augmented_matrix = Matrix::new( + m + self.expanded_hashes.len(), + self.expanded_hashes.len(), + ); for j in 0..self.expanded_hashes.len() { for i in 0..m { augmented_matrix.update(i, j, self.expanded_hashes[j as usize].0[i as usize]); - orginal_matrix.update(i, j, self.expanded_hashes[j as usize].0[i as usize]) } } - + // Append the identity matrix... for (i, r) in (m..m + self.expanded_hashes.len()).enumerate() { augmented_matrix.update(r as usize, i, PrimeOrderDomain::new(1)); } + + // Transpose for row reduction... augmented_matrix = augmented_matrix.transpose(); + // Pretty Print... for i in 0..augmented_matrix.rows() { for j in 0..augmented_matrix.cols() { print!("{} ", augmented_matrix.at(i, j as usize)); @@ -128,6 +126,7 @@ impl Solver { println!(";") } + // Do the actual row reduction... let cols = augmented_matrix.cols(); let rows = augmented_matrix.rows(); @@ -160,11 +159,15 @@ impl Solver { } } - println!(""); - println!(""); - println!(""); + println!(); + println!(); + println!(); + + // Transpose back to column form... augmented_matrix = augmented_matrix.transpose(); + + // Pretty Print for checking... for i in 0..augmented_matrix.rows() { for j in 0..augmented_matrix.cols() { print!("{} ", augmented_matrix.at(i, j as usize)); @@ -175,7 +178,8 @@ impl Solver { } } - // Calculate the Nulls... + // Calculate the Kernel Basis Vectors...these are the columns where the + // Original matrix is now all 0s let mut count = 0; for col in (0..self.expanded_hashes.len()).rev() { let mut is_null = true; @@ -193,9 +197,11 @@ impl Solver { } if count == 0 { + // Unsolvable... return Err(()); } + // We found some vectors...now we can derive a solution... println!("Found {} Kernel Basis Vectors...", count); let mut solution = vec![];