use crate::matrices::types::vec_of_vec::sorted::VecOfVec;
use rand::Rng; use rand::distributions::{Bernoulli, Distribution};
pub fn random_upper_triangular( matrix_size: usize, modulus: usize) -> VecOfVec< usize, usize > {
let mut rng = rand::thread_rng(); let mut vec_of_vec = vec![];
for row_index in 0 .. matrix_size {
let coefficient_leading = rng.gen_range( 1 .. modulus );
let mut new_vec = vec![ (row_index, coefficient_leading) ]; for q in row_index+1 .. matrix_size { let coefficient = rng.gen_range( 0 .. modulus );
let flag = rng.gen_range(0usize .. 3usize);
if flag == 0 { new_vec.push( ( q, 0 ) ) }
else if flag == 1 { new_vec.push( ( q, coefficient ) ) }
else { continue }
}
vec_of_vec.push( new_vec ); }
VecOfVec::new( vec_of_vec ) }
pub fn random_upper_unitriangular( matrix_size: usize, modulus: usize) -> VecOfVec< usize, usize > {
let mut rng = rand::thread_rng(); let mut vec_of_vec = vec![];
for row_index in 0 .. matrix_size {
let coefficient_leading = 1;
let mut new_vec = vec![ (row_index, coefficient_leading) ]; for q in row_index+1 .. matrix_size { let coefficient = rng.gen_range( 0 .. modulus );
let flag = rng.gen_range(0usize .. 3usize);
if flag == 0 { new_vec.push( ( q, 0 ) ) }
else if flag == 1 { new_vec.push( ( q, coefficient ) ) }
else { continue }
}
vec_of_vec.push( new_vec ); }
VecOfVec::new( vec_of_vec ) }
pub fn random_vec_of_vec_simple(
num_indices_major: usize,
num_indices_minor: usize,
approximate_density: f64,
modulus: usize,
allow_nonstructural_zero: bool,
)
->
VecOfVec< usize, usize >
{
let mut rng = rand::thread_rng();
let d = Bernoulli::new( approximate_density ).unwrap(); let v = d.sample(&mut rand::thread_rng());
println!("{} is from a Bernoulli distribution", v);
let mut vecvec = Vec::new(); for row_index in 0 .. num_indices_major {
vecvec.push( Vec::new() ); for column_index in 0 .. num_indices_minor { if d.sample( &mut rand::thread_rng() ) { let coefficient = match allow_nonstructural_zero{
true => { rng.gen_range( 0 .. modulus ) },
false => { rng.gen_range( 1 .. modulus ) }
};
vecvec[ row_index ].push( (column_index, coefficient) );
}
}
vecvec[ row_index ].shrink_to_fit();
}
return VecOfVec::new( vecvec )
}
pub fn random_upper_triangular_matrix_mod_p
( matrix_size: usize, modulus: usize )
->
VecOfVec< usize, usize >
{
use rand::Rng;
let mut rng = rand::thread_rng(); let mut vec_of_vec = vec![];
for row_index in 0 .. matrix_size {
let coefficient_leading = rng.gen_range( 1 .. modulus );
let mut new_vec = vec![ (row_index, coefficient_leading) ]; for q in row_index+1 .. matrix_size { let coefficient = rng.gen_range( 1 .. modulus );
let flag = rng.gen_range(0usize .. 3usize);
if flag == 0 { new_vec.push( ( q, 0 ) ) }
else if flag == 1 { new_vec.push( ( q, coefficient ) ) }
else { continue }
}
vec_of_vec.push( new_vec ); }
return VecOfVec::new(vec_of_vec); }
pub fn random_m_by_n_matrix
( num_rows: usize, num_cols: usize, modulus: usize )
->
VecOfVec< usize, usize >
{
use rand::Rng;
let mut rng = rand::thread_rng(); let mut vec_of_vec = vec![];
for row_index in 0 .. num_rows {
let mut new_vec = vec![]; for q in row_index+1 .. num_cols { let coefficient = rng.gen_range( 1 .. modulus );
let flag = rng.gen_range(0usize .. 3usize);
if flag == 0 { new_vec.push( ( q, 0 ) ) }
else if flag == 1 { new_vec.push( ( q, coefficient ) ) }
else { continue }
}
vec_of_vec.push( new_vec ); }
return VecOfVec::new(vec_of_vec); }