From f6200bc99a05e42c73520d0743fe46259b7ebc0e Mon Sep 17 00:00:00 2001 From: code002lover Date: Fri, 19 Jul 2024 18:10:51 +0200 Subject: [PATCH] remove unused code; refactor code --- .gitignore | 3 +++ Cargo.lock | 4 +-- Cargo.toml | 7 +++-- src/main.rs | 24 +++++------------- src/primality_test.rs | 59 ------------------------------------------- 5 files changed, 17 insertions(+), 80 deletions(-) delete mode 100644 src/primality_test.rs diff --git a/.gitignore b/.gitignore index a5ba478..5a3efc3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ primes.json primes*.json primes*.txt primes*.zip +dhat* +flamegraph* +perf* \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index fd94ea1..de66a7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,9 +240,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.70" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 6b06676..88a669e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,18 +7,21 @@ edition = "2021" [dependencies] num = "0.4" -thread-priority = "1.1" rand = "0.8" num-bigint = { default-features = false, version = "0.4", features = ["serde"] } once_cell = "1.19" serde_json = "1.0" +[target.'cfg(windows)'.dependencies] +thread-priority = "1.1" + [profile.release] lto = true # Enable link-time optimization codegen-units = 1 # Reduce number of codegen units to increase optimizations panic = 'abort' # Abort on panic -strip = true # Strip symbols from binary; remove pdb +# strip = true # Strip symbols from binary; remove pdb overflow-checks = false +debug = true [profile.dev] opt-level = 3 diff --git a/src/main.rs b/src/main.rs index 3aa3eb2..52357a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,10 @@ #![warn(clippy::perf)] #![warn(clippy::all)] -pub mod is_prime; -pub mod primality_test; +mod is_prime; use crate::is_prime::prime_utils; use num::{BigUint, One}; -use once_cell::sync::Lazy; use std::{ env::args, io::Write, @@ -96,10 +94,8 @@ fn worker( } fn main() { - let mut args = args(); - if args.len() == 2 { + if let Some(prime) = args().nth(1) { use std::str::FromStr; - let prime = args.nth(1).unwrap(); let prime = BigUint::from_str(&prime).unwrap(); let is_prime = is_prime::prime_utils::is_prime(&prime); @@ -155,26 +151,20 @@ fn main() { let mut primes = primearc.lock().unwrap(); primes.sort_unstable(); - #[allow(clippy::cast_possible_wrap)] - let removed: i32 = if primes.len() > NU { - let rem = primes.len() - NU; - primes.truncate(NU); - rem as i32 - } else { - 0 - }; + let removed = primes.len() - NU; + primes.truncate(NU); let added = NU - primes.len(); if primes.len() < NU { - static INC: once_cell::sync::Lazy = Lazy::new(|| BigUint::from(2u8)); + let inc = BigUint::from(2u8); println!("[INFO] less primes than expected"); let mut number = BigUint::from(THREADS) * BigUint::from(workloads); - if &number % &*INC == BigUint::ZERO { + if &number % &inc == BigUint::ZERO { number += BigUint::one(); } loop { - number += &*INC; + number += &inc; if prime_utils::is_prime(&number) { primes.push(number.clone()); if primes.len() == NU { diff --git a/src/primality_test.rs b/src/primality_test.rs deleted file mode 100644 index 326f92b..0000000 --- a/src/primality_test.rs +++ /dev/null @@ -1,59 +0,0 @@ -pub mod primality_tests { - use num::{BigUint, Integer, One, Zero}; - use rand::RngCore; - - fn generate_random_biguint(num_bits: usize) -> BigUint { - let mut rng = rand::thread_rng(); - let bytes = num_bits / 8 + 1; - let mut buf = vec![0u8; bytes]; - rng.fill_bytes(&mut buf); - BigUint::from_bytes_be(&buf) - } - - #[must_use] - pub fn is_probably_prime(number: &BigUint, iterations: u32) -> bool { - if number <= &BigUint::one() || number == &BigUint::from(4u32) { - return false; - } else if number <= &BigUint::from(3u32) { - return true; - } - let one = BigUint::one(); - let mut d = number - &one; - while d.is_even() { - d /= 2u32; - } - for _ in 0..iterations { - let a = generate_random_biguint((number.bits() - 1) as usize); - let mut x = mod_exp(a.clone(), &d, number); - if x == one || x == number - &one { - continue; - } - let mut continue_loop = false; - for _ in 0..(number.bits() - 1) { - x = mod_exp(x.clone(), &BigUint::from(2u32), number); - if x == number - &one { - continue_loop = true; - break; - } - } - if !continue_loop { - return false; - } - } - true - } - - fn mod_exp(mut base: BigUint, ex: &BigUint, modulus: &BigUint) -> BigUint { - let mut exp = ex.clone(); - let mut result = BigUint::one(); - base %= modulus; - while !exp.is_zero() { - if exp.is_odd() { - result = (&result * &base) % modulus; - } - base = base.pow(2) % modulus; - exp /= 2u32; - } - result - } -}