fix generic prime generator for 51
51 is still WIP
This commit is contained in:
+18
-15
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user