move primecheck to utils struct
This commit is contained in:
parent
dc797b2dda
commit
c359ca292a
@ -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<BigUint>
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
14
src/main.rs
14
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user