diff --git a/src/is_prime.rs b/src/is_prime.rs index 9a9b0d4..0629f2b 100644 --- a/src/is_prime.rs +++ b/src/is_prime.rs @@ -1,10 +1,21 @@ -pub mod is_prime { - use num_bigint::BigUint; - fn log_2(x: BigUint) -> u64 { +use num_bigint::BigUint; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct PrimeUtils { + //prime_cache: Vec +} + +impl PrimeUtils { + + pub fn new() -> Self { + Self { } + } + + pub fn log_2(self: &Self, x: BigUint) -> u64 { x.bits() - 1 } - pub fn is_prime(number: &BigUint) -> bool { + pub fn is_prime(self: &Self, number: &BigUint) -> bool { if BigUint::from(1u8) == *number { return false; } @@ -20,7 +31,7 @@ pub mod is_prime { // number = 2^a - 1 // a = log2(number + 1) - let a = log_2(number+1u8); + let a = self.log_2(number+1u8); if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != *number { let mut i = BigUint::from(1u8); let one = BigUint::from(1u8); @@ -52,6 +63,6 @@ pub mod is_prime { } else { false } - } + } } diff --git a/src/main.rs b/src/main.rs index b4fbc6f..9757235 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ pub mod is_prime; use std::{time::SystemTime,thread}; use num_bigint::BigUint; -use crate::is_prime::is_prime::is_prime; +use crate::is_prime::PrimeUtils; fn p(n: f64) -> f64 { let ln_n = n.ln(); @@ -38,7 +38,9 @@ fn main() { let sys_time = SystemTime::now(); - let n:f64 = 1_000_000f64; + let utils = PrimeUtils::new(); + + let n:f64 = 1_000f64; let nthprime_approx = p(n*1.01) as u128; const THREADS: u128 = 12; let workloads = nthprime_approx/THREADS; @@ -56,7 +58,7 @@ fn main() { loop { number = number + &inc; - if is_prime(&number) { + if utils.is_prime(&number) { lprimes.push(number.clone()); } if number == max { @@ -85,8 +87,8 @@ fn main() { break; } } - let removed = (primes.len()-n as usize).clamp(0, n as usize); - if primes.len() > n as usize { + let removed = (primes.len()-n as usize).clamp(0, primes.len()); + if removed != 0 { for _ in 0..removed { primes.pop(); } @@ -98,7 +100,7 @@ fn main() { let inc = BigUint::from(1u8); loop { number = number + &inc; - if is_prime(&number) { + if utils.is_prime(&number) { primes.push(number.clone()); } if primes.len() == n as usize {