refactor a bit
This commit is contained in:
parent
2af65c41f0
commit
39cc138252
@ -7,8 +7,8 @@ pub mod prime_utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn is_prime(number: &BigUint, g_primes: &[BigUint]) -> bool {
|
pub fn is_prime(number: &BigUint) -> bool {
|
||||||
if BigUint::from(1u8) == *number {
|
if BigUint::one() == *number {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if BigUint::from(4u8) > *number {
|
if BigUint::from(4u8) > *number {
|
||||||
@ -27,12 +27,6 @@ pub mod prime_utils {
|
|||||||
|
|
||||||
let sqrtnum = number.sqrt() + &one; //fake ceil function
|
let sqrtnum = number.sqrt() + &one; //fake ceil function
|
||||||
|
|
||||||
for prime in g_primes.iter().filter(|p| p < &&sqrtnum) {
|
|
||||||
if number % prime == ZERO {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
i += &one;
|
i += &one;
|
||||||
if number % &i == ZERO {
|
if number % &i == ZERO {
|
||||||
|
38
src/main.rs
38
src/main.rs
@ -56,7 +56,6 @@ const N: i64 = 1_000_000;
|
|||||||
const NF: f64 = N as f64;
|
const NF: f64 = N as f64;
|
||||||
const NU: usize = N as usize;
|
const NU: usize = N as usize;
|
||||||
const THREADS: usize = 30;
|
const THREADS: usize = 30;
|
||||||
const SPLITTER: u64 = N as u64 / THREADS as u64;
|
|
||||||
|
|
||||||
fn worker(
|
fn worker(
|
||||||
workloads: usize,
|
workloads: usize,
|
||||||
@ -68,53 +67,24 @@ fn worker(
|
|||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
try_set_thread_priority();
|
try_set_thread_priority();
|
||||||
|
|
||||||
static INC: once_cell::sync::Lazy<BigUint> = Lazy::new(BigUint::one);
|
|
||||||
static ONE_THOUSAND: once_cell::sync::Lazy<BigUint> =
|
|
||||||
Lazy::new(|| BigUint::from(SPLITTER * 10));
|
|
||||||
static ONE_HUNDRED: once_cell::sync::Lazy<BigUint> = Lazy::new(|| BigUint::from(SPLITTER));
|
|
||||||
static TEN: once_cell::sync::Lazy<BigUint> = Lazy::new(|| BigUint::from(10u8));
|
|
||||||
|
|
||||||
let work_uint = BigUint::from(workloads);
|
let work_uint = BigUint::from(workloads);
|
||||||
let mut number = BigUint::from(i) * &work_uint;
|
let mut number = BigUint::from(i) * &work_uint;
|
||||||
|
|
||||||
let max = BigUint::from(i + 1) * work_uint;
|
let max = BigUint::from(i + 1) * work_uint;
|
||||||
let mut primecache = Vec::with_capacity(NU);
|
let mut primecache = Vec::with_capacity(NU);
|
||||||
let mut primecache_outside_len = 0;
|
|
||||||
let mut global_primes = arcclone.read().unwrap();
|
|
||||||
loop {
|
loop {
|
||||||
number += &*INC;
|
number += &BigUint::one();
|
||||||
|
|
||||||
if prime_utils::is_prime(&number, &global_primes) {
|
if prime_utils::is_prime(&number) {
|
||||||
primecache.push(number.clone());
|
primecache.push(number.clone());
|
||||||
progress.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
progress.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (&number * &*ONE_THOUSAND) / &max / &*TEN == &number / &max * &*ONE_HUNDRED {
|
|
||||||
drop(global_primes);
|
|
||||||
|
|
||||||
let mut new_primecache = arcclone.write().unwrap();
|
|
||||||
|
|
||||||
new_primecache.extend_from_slice(&primecache[primecache_outside_len..]);
|
|
||||||
new_primecache.sort_unstable();
|
|
||||||
|
|
||||||
primecache.clone_from(&new_primecache);
|
|
||||||
primecache_outside_len = new_primecache.len();
|
|
||||||
|
|
||||||
drop(new_primecache);
|
|
||||||
|
|
||||||
global_primes = arcclone.read().unwrap();
|
|
||||||
}
|
|
||||||
if number == max {
|
if number == max {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(global_primes);
|
arcclone.write().unwrap().append(&mut primecache);
|
||||||
|
|
||||||
let mut new_primecache = arcclone.write().unwrap();
|
|
||||||
|
|
||||||
new_primecache.extend_from_slice(&primecache[primecache_outside_len..]);
|
|
||||||
new_primecache.sort_unstable();
|
|
||||||
|
|
||||||
threads_done.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
threads_done.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
@ -180,7 +150,7 @@ fn main() {
|
|||||||
let mut number = BigUint::from(THREADS) * BigUint::from(workloads);
|
let mut number = BigUint::from(THREADS) * BigUint::from(workloads);
|
||||||
loop {
|
loop {
|
||||||
number += &*INC;
|
number += &*INC;
|
||||||
if prime_utils::is_prime(&number, &primes) {
|
if prime_utils::is_prime(&number) {
|
||||||
primes.push(number.clone());
|
primes.push(number.clone());
|
||||||
}
|
}
|
||||||
if primes.len() == NU {
|
if primes.len() == NU {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user