fix generic prime generator for 51

51 is still WIP
This commit is contained in:
timeshifter
2022-08-11 10:58:26 +02:00
parent 1c30f42704
commit d19e503d45
+18 -15
View File
@@ -13,20 +13,20 @@ pub struct Primes<T: Num + ToPrimitive> {
impl<T: Num + ToPrimitive + FromPrimitive + Hash + Eq + PartialEq + Copy> Primes<T> { impl<T: Num + ToPrimitive + FromPrimitive + Hash + Eq + PartialEq + Copy> Primes<T> {
pub fn get_between(min_value: T, max_value: T) -> Self { pub fn get_between(min_value: T, max_value: T) -> Self {
let max_value_usize = max_value.to_usize().unwrap();
let min_value_usize = min_value.to_usize().unwrap();
Self::from_array( Self::from_array(
Self::get_prime_numbers_array(&min_value, &max_value), Self::get_prime_numbers_array(&min_value_usize, &max_value_usize),
&min_value, &min_value_usize,
&max_value, &max_value_usize,
) )
} }
fn from_array(array: Vec<bool>, min_value: &T, max_value: &T) -> Self { fn from_array(array: Vec<bool>, min_value: &usize, max_value: &usize) -> Self {
let mut vector = Vec::new(); let mut vector = Vec::new();
let mut set = HashSet::new(); let mut set = HashSet::new();
let min_value_usize = min_value.to_usize().unwrap(); for number in *min_value..*max_value {
let max_value_usize = max_value.to_usize().unwrap(); if array[(number - min_value) as usize] {
for number in min_value_usize..max_value_usize {
if array[(number - min_value_usize) as usize] {
vector.push(FromPrimitive::from_usize(number).unwrap()); vector.push(FromPrimitive::from_usize(number).unwrap());
set.insert(FromPrimitive::from_usize(number).unwrap()); set.insert(FromPrimitive::from_usize(number).unwrap());
} }
@@ -34,20 +34,23 @@ impl<T: Num + ToPrimitive + FromPrimitive + Hash + Eq + PartialEq + Copy> Primes
Primes { vector, set } Primes { vector, set }
} }
fn get_prime_numbers_array(min_value: &T, max_value: &T) -> Vec<bool> { fn get_prime_numbers_array(min_value: &usize, max_value: &usize) -> Vec<bool> {
// Sieve of Eratosthenes // Sieve of Eratosthenes
let mut result = Vec::with_capacity((*max_value - *min_value).to_usize().unwrap()); let length = *max_value - *min_value;
let mut result = vec![true; length];
let max_value_usize = max_value.to_usize().unwrap(); for number_to_check in 2..(max_value / 2) {
for number_to_check in 2..(max_value_usize / 2) {
let mut last_number = number_to_check; let mut last_number = number_to_check;
loop { loop {
let current_number = last_number + number_to_check; let current_number = last_number + number_to_check;
if current_number >= max_value_usize { if current_number < *min_value {
last_number = current_number;
continue;
}
if current_number >= *max_value {
break; break;
} }
result[(current_number - 2) as usize] = false; result[current_number - min_value] = false;
last_number = current_number; last_number = current_number;
} }
} }