diff --git a/src/is_prime.rs b/src/is_prime.rs index 5605445..a509379 100644 --- a/src/is_prime.rs +++ b/src/is_prime.rs @@ -24,15 +24,20 @@ pub mod prime_utils { const ZERO: BigUint = BigUint::ZERO; let mut i = BigUint::one(); let one = BigUint::one(); + let two = &one + &one; - let sqrtnum = number.sqrt() + &one; //fake ceil function + if number % &two == ZERO { + return false; + } + + let sqrtnum = number.sqrt() + one; //fake ceil function loop { - i += &one; + i += &two; //we begin checking 3 and then continue with every second number as every even number is divisible by 2 and we already checked that if number % &i == ZERO { return false; } - if i == sqrtnum { + if i >= sqrtnum { return true; } } diff --git a/src/main.rs b/src/main.rs index 6967713..105345c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use crate::is_prime::prime_utils; use num::{BigUint, One}; use once_cell::sync::Lazy; use std::{ + env::args, io::Write, sync::{ atomic::{AtomicU64, AtomicUsize}, @@ -47,8 +48,13 @@ fn try_set_thread_priority() { } fn write_primes(primes: &[BigUint]) { + let primes: Vec = primes + .iter() + .map(std::string::ToString::to_string) + .collect(); + let mut file = std::fs::File::create("primes.json").unwrap(); - file.write_all(serde_json::to_string(primes).unwrap().as_bytes()) + file.write_all(serde_json::to_string(&primes).unwrap().as_bytes()) .unwrap(); } @@ -90,6 +96,19 @@ fn worker( } fn main() { + let mut args = args(); + if args.len() == 2 { + use std::str::FromStr; + let prime = args.nth(1).unwrap(); + + println!( + "Number is prime: {}", + is_prime::prime_utils::is_prime(&BigUint::from_str(&prime).unwrap()) + ); + + return; + } + let sys_time = SystemTime::now(); let nthprime_approx: usize = to_usize(p(NF * 1.02)); @@ -132,6 +151,7 @@ fn main() { }); let mut primes = primearc.write().unwrap(); + primes.sort_unstable(); #[allow(clippy::cast_possible_wrap)] let removed: i32 = if primes.len() > NU { @@ -144,17 +164,20 @@ fn main() { let added = NU - primes.len(); if primes.len() < NU { - static INC: once_cell::sync::Lazy = Lazy::new(BigUint::one); + static INC: once_cell::sync::Lazy = Lazy::new(|| BigUint::from(2u8)); println!("[INFO] less primes than expected"); let mut number = BigUint::from(THREADS) * BigUint::from(workloads); + if &number % &*INC == BigUint::ZERO { + number += BigUint::one(); + } loop { number += &*INC; if prime_utils::is_prime(&number) { primes.push(number.clone()); - } - if primes.len() == NU { - break; + if primes.len() == NU { + break; + } } } }