use rayon::prelude::*;
use rayon::slice::ParallelSliceMut;
use crate::common::{ConfigMode, NUM_ROOTS, get_small_primes};
use crate::prime::{PrimalityTest, PrimeFormula};
use crate::sieve::{Sieve, SieveMode};
pub mod common;
pub mod sieve;
#[cfg(feature = "constellations")]
pub mod constellations;
pub mod prime;
#[cfg(feature = "big-primes")]
pub mod big_prime;
pub fn get_primes(start: u128, end: u128, mode: &ConfigMode) -> Vec<u128> {
let mut primes: Vec<u128>;
if *mode == ConfigMode::MillerRabinDeterministic {
let inst = PrimeFormula::new(PrimalityTest::MillerRabinDeterministic, 8);
primes = inst.get_unsorted_primes(start, end);
} else if *mode == ConfigMode::MillerRabinProbabilistic {
let inst = PrimeFormula::new(PrimalityTest::MillerRabinProbabilistic, 8);
primes = inst.get_unsorted_primes(start, end);
} else {
primes = (0..NUM_ROOTS)
.into_par_iter()
.flat_map(
|root_idx| match Sieve::new(root_idx as u8, start, end, SieveMode::Sieve) {
Ok(mut sieve) => sieve.get_primes(),
Err(_e) => vec![0; 0],
},
)
.collect();
}
primes.extend(get_small_primes(start, end));
primes.par_sort_unstable();
primes
}
pub fn count_primes(start: u128, end: u128, mode: &ConfigMode) -> usize {
let mut count: usize = get_small_primes(start, end).len();
count += if *mode == ConfigMode::MillerRabinDeterministic {
let inst = PrimeFormula::new(PrimalityTest::MillerRabinDeterministic, 8);
let primes = inst.get_unsorted_primes(start, end);
primes.len()
} else if *mode == ConfigMode::MillerRabinProbabilistic {
let inst = PrimeFormula::new(PrimalityTest::MillerRabinProbabilistic, 8);
let primes = inst.get_unsorted_primes(start, end);
primes.len()
} else {
(0..NUM_ROOTS)
.into_par_iter()
.map(
|root_idx| match Sieve::new(root_idx as u8, start, end, SieveMode::Sieve) {
Ok(mut sieve) => sieve.count_primes(),
Err(_e) => 0,
},
)
.sum()
};
count
}