More comments
This commit is contained in:
parent
3540f29ae2
commit
64fef1848c
38
src/lib.rs
38
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)
|
/// Solve the system and return the indexes of the true hashes (or error if the system is unsolvable)
|
||||||
pub fn attempt_solve(&self) -> Result<Vec<usize>, ()> {
|
pub fn attempt_solve(&self) -> Result<Vec<usize>, ()> {
|
||||||
|
|
||||||
|
|
||||||
// Arrange the hashes into an augmented for matrix...
|
// 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 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 j in 0..self.expanded_hashes.len() {
|
||||||
for i in 0..m {
|
for i in 0..m {
|
||||||
augmented_matrix.update(i, j, self.expanded_hashes[j as usize].0[i as usize]);
|
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() {
|
for (i, r) in (m..m + self.expanded_hashes.len()).enumerate() {
|
||||||
augmented_matrix.update(r as usize, i, PrimeOrderDomain::new(1));
|
augmented_matrix.update(r as usize, i, PrimeOrderDomain::new(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transpose for row reduction...
|
||||||
augmented_matrix = augmented_matrix.transpose();
|
augmented_matrix = augmented_matrix.transpose();
|
||||||
|
|
||||||
|
// Pretty Print...
|
||||||
for i in 0..augmented_matrix.rows() {
|
for i in 0..augmented_matrix.rows() {
|
||||||
for j in 0..augmented_matrix.cols() {
|
for j in 0..augmented_matrix.cols() {
|
||||||
print!("{} ", augmented_matrix.at(i, j as usize));
|
print!("{} ", augmented_matrix.at(i, j as usize));
|
||||||
|
@ -128,6 +126,7 @@ impl Solver {
|
||||||
println!(";")
|
println!(";")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do the actual row reduction...
|
||||||
let cols = augmented_matrix.cols();
|
let cols = augmented_matrix.cols();
|
||||||
let rows = augmented_matrix.rows();
|
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();
|
augmented_matrix = augmented_matrix.transpose();
|
||||||
|
|
||||||
|
|
||||||
|
// Pretty Print for checking...
|
||||||
for i in 0..augmented_matrix.rows() {
|
for i in 0..augmented_matrix.rows() {
|
||||||
for j in 0..augmented_matrix.cols() {
|
for j in 0..augmented_matrix.cols() {
|
||||||
print!("{} ", augmented_matrix.at(i, j as usize));
|
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;
|
let mut count = 0;
|
||||||
for col in (0..self.expanded_hashes.len()).rev() {
|
for col in (0..self.expanded_hashes.len()).rev() {
|
||||||
let mut is_null = true;
|
let mut is_null = true;
|
||||||
|
@ -193,9 +197,11 @@ impl Solver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
|
// Unsolvable...
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We found some vectors...now we can derive a solution...
|
||||||
println!("Found {} Kernel Basis Vectors...", count);
|
println!("Found {} Kernel Basis Vectors...", count);
|
||||||
let mut solution = vec![];
|
let mut solution = vec![];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue