remove unused code; refactor code
This commit is contained in:
parent
36fc8cf5c5
commit
f6200bc99a
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,3 +4,6 @@ primes.json
|
|||||||
primes*.json
|
primes*.json
|
||||||
primes*.txt
|
primes*.txt
|
||||||
primes*.zip
|
primes*.zip
|
||||||
|
dhat*
|
||||||
|
flamegraph*
|
||||||
|
perf*
|
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -240,9 +240,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.70"
|
version = "2.0.71"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16"
|
checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -7,18 +7,21 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
num = "0.4"
|
num = "0.4"
|
||||||
thread-priority = "1.1"
|
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
num-bigint = { default-features = false, version = "0.4", features = ["serde"] }
|
num-bigint = { default-features = false, version = "0.4", features = ["serde"] }
|
||||||
once_cell = "1.19"
|
once_cell = "1.19"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
thread-priority = "1.1"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = true # Enable link-time optimization
|
lto = true # Enable link-time optimization
|
||||||
codegen-units = 1 # Reduce number of codegen units to increase optimizations
|
codegen-units = 1 # Reduce number of codegen units to increase optimizations
|
||||||
panic = 'abort' # Abort on panic
|
panic = 'abort' # Abort on panic
|
||||||
strip = true # Strip symbols from binary; remove pdb
|
# strip = true # Strip symbols from binary; remove pdb
|
||||||
overflow-checks = false
|
overflow-checks = false
|
||||||
|
debug = true
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
22
src/main.rs
22
src/main.rs
@ -1,12 +1,10 @@
|
|||||||
#![warn(clippy::perf)]
|
#![warn(clippy::perf)]
|
||||||
#![warn(clippy::all)]
|
#![warn(clippy::all)]
|
||||||
|
|
||||||
pub mod is_prime;
|
mod is_prime;
|
||||||
pub mod primality_test;
|
|
||||||
|
|
||||||
use crate::is_prime::prime_utils;
|
use crate::is_prime::prime_utils;
|
||||||
use num::{BigUint, One};
|
use num::{BigUint, One};
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use std::{
|
use std::{
|
||||||
env::args,
|
env::args,
|
||||||
io::Write,
|
io::Write,
|
||||||
@ -96,10 +94,8 @@ fn worker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut args = args();
|
if let Some(prime) = args().nth(1) {
|
||||||
if args.len() == 2 {
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
let prime = args.nth(1).unwrap();
|
|
||||||
let prime = BigUint::from_str(&prime).unwrap();
|
let prime = BigUint::from_str(&prime).unwrap();
|
||||||
|
|
||||||
let is_prime = is_prime::prime_utils::is_prime(&prime);
|
let is_prime = is_prime::prime_utils::is_prime(&prime);
|
||||||
@ -155,26 +151,20 @@ fn main() {
|
|||||||
let mut primes = primearc.lock().unwrap();
|
let mut primes = primearc.lock().unwrap();
|
||||||
primes.sort_unstable();
|
primes.sort_unstable();
|
||||||
|
|
||||||
#[allow(clippy::cast_possible_wrap)]
|
let removed = primes.len() - NU;
|
||||||
let removed: i32 = if primes.len() > NU {
|
|
||||||
let rem = primes.len() - NU;
|
|
||||||
primes.truncate(NU);
|
primes.truncate(NU);
|
||||||
rem as i32
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
let added = NU - primes.len();
|
let added = NU - primes.len();
|
||||||
if primes.len() < NU {
|
if primes.len() < NU {
|
||||||
static INC: once_cell::sync::Lazy<BigUint> = Lazy::new(|| BigUint::from(2u8));
|
let inc = BigUint::from(2u8);
|
||||||
|
|
||||||
println!("[INFO] less primes than expected");
|
println!("[INFO] less primes than expected");
|
||||||
let mut number = BigUint::from(THREADS) * BigUint::from(workloads);
|
let mut number = BigUint::from(THREADS) * BigUint::from(workloads);
|
||||||
if &number % &*INC == BigUint::ZERO {
|
if &number % &inc == BigUint::ZERO {
|
||||||
number += BigUint::one();
|
number += BigUint::one();
|
||||||
}
|
}
|
||||||
loop {
|
loop {
|
||||||
number += &*INC;
|
number += &inc;
|
||||||
if prime_utils::is_prime(&number) {
|
if prime_utils::is_prime(&number) {
|
||||||
primes.push(number.clone());
|
primes.push(number.clone());
|
||||||
if primes.len() == NU {
|
if primes.len() == NU {
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user