From 53158ccdd3f81240926b4565315652400b1a9fb8 Mon Sep 17 00:00:00 2001 From: Mystikfluu Date: Sat, 25 Feb 2023 18:41:59 +0100 Subject: [PATCH] optimize a bit --- src/is_prime.rs | 20 +++++++++----------- src/main.rs | 17 +++++++++-------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/is_prime.rs b/src/is_prime.rs index a55a099..5780bd1 100644 --- a/src/is_prime.rs +++ b/src/is_prime.rs @@ -4,11 +4,11 @@ pub mod is_prime { x.bits() - 1 } - pub fn is_prime(number: BigUint) -> bool { - if BigUint::from(1u8) == number { + pub fn is_prime(number: &BigUint) -> bool { + if BigUint::from(1u8) == *number { return false; } - if BigUint::from(4u8) > number { + if BigUint::from(4u8) > *number { return true; } @@ -16,19 +16,17 @@ pub mod is_prime { // number = 2^a - 1 // a = log2(number + 1) - let a = log_2(number.clone()+1u8); - if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != number { - //eprintln!("only supports numbers of type (2^x)-1"); + let a = 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); let zero = BigUint::from(0u8); - let sqrtnum = number.sqrt()+one.clone(); + let sqrtnum = number.sqrt()+&one; let mut is_prime = true; loop { - i = i + one.clone(); - if number.clone()%i.clone() == zero { - // println!("{number} {i}"); + i = i + &one; + if number%&i == zero { is_prime = false; break; } @@ -43,7 +41,7 @@ pub mod is_prime { let mut last = BigUint::from(4u8); for _i in 2..a { - last = (last.pow(2)-two.clone())%number.clone(); + last = (last.pow(2)-&two)%number; } if last == BigUint::from(0u8) { true diff --git a/src/main.rs b/src/main.rs index 8e0899b..b4fbc6f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,14 +48,15 @@ fn main() { for i in 0..THREADS { let tprimes = thread::spawn(move || { let mut lprimes = vec![]; - let mut number = BigUint::from(i)*BigUint::from(workloads); + let work_uint = BigUint::from(workloads); + let mut number = BigUint::from(i)*&work_uint; let inc = BigUint::from(1u8); - let max = BigUint::from(i+1)*BigUint::from(workloads); + let max = BigUint::from(i+1)*work_uint; loop { - number = number + inc.clone(); - if is_prime(number.clone()) { + number = number + &inc; + if is_prime(&number) { lprimes.push(number.clone()); } if number == max { @@ -93,11 +94,11 @@ fn main() { let added = (n as usize-primes.len()).clamp(0, n as usize); if primes.len() < n as usize { - let mut number = BigUint::from(THREADS+1)*BigUint::from(workloads); + let mut number = BigUint::from(THREADS)*BigUint::from(workloads); let inc = BigUint::from(1u8); loop { - number = number + inc.clone(); - if is_prime(number.clone()) { + number = number + &inc; + if is_prime(&number) { primes.push(number.clone()); } if primes.len() == n as usize { @@ -112,7 +113,7 @@ fn main() { println!("{:?}", primes); - println!("prime count: {}, expected: {}, primes removed: {} | {}%, primes added: {} | {}%",primes.len(),n,removed,(removed as f64)/primes.len() as f64*100.0,added,(added as f64)/primes.len() as f64*100.0); + println!("prime count: {}, expected: {}, primes added: {} | {}%",primes.len(),n,added,(added as f64)/primes.len() as f64*100.0); println!("last prime approx: {}",nthprime_approx); println!("And that's time: {difference:?}");