move primecheck to utils struct

This commit is contained in:
Mystikfluu 2023-02-26 10:49:51 +01:00
parent dc797b2dda
commit c359ca292a
2 changed files with 25 additions and 12 deletions

View File

@ -1,10 +1,21 @@
pub mod is_prime { use num_bigint::BigUint;
use num_bigint::BigUint;
fn log_2(x: BigUint) -> u64 { #[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 x.bits() - 1
} }
pub fn is_prime(number: &BigUint) -> bool { pub fn is_prime(self: &Self, number: &BigUint) -> bool {
if BigUint::from(1u8) == *number { if BigUint::from(1u8) == *number {
return false; return false;
} }
@ -20,7 +31,7 @@ pub mod is_prime {
// number = 2^a - 1 // number = 2^a - 1
// a = log2(number + 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 { if BigUint::from(2u8).pow(a as u32)-BigUint::from(1u8) != *number {
let mut i = BigUint::from(1u8); let mut i = BigUint::from(1u8);
let one = BigUint::from(1u8); let one = BigUint::from(1u8);
@ -52,6 +63,6 @@ pub mod is_prime {
} else { } else {
false false
} }
} }
} }

View File

@ -2,7 +2,7 @@ pub mod is_prime;
use std::{time::SystemTime,thread}; use std::{time::SystemTime,thread};
use num_bigint::BigUint; use num_bigint::BigUint;
use crate::is_prime::is_prime::is_prime; use crate::is_prime::PrimeUtils;
fn p(n: f64) -> f64 { fn p(n: f64) -> f64 {
let ln_n = n.ln(); let ln_n = n.ln();
@ -38,7 +38,9 @@ fn main() {
let sys_time = SystemTime::now(); 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; let nthprime_approx = p(n*1.01) as u128;
const THREADS: u128 = 12; const THREADS: u128 = 12;
let workloads = nthprime_approx/THREADS; let workloads = nthprime_approx/THREADS;
@ -56,7 +58,7 @@ fn main() {
loop { loop {
number = number + &inc; number = number + &inc;
if is_prime(&number) { if utils.is_prime(&number) {
lprimes.push(number.clone()); lprimes.push(number.clone());
} }
if number == max { if number == max {
@ -85,8 +87,8 @@ fn main() {
break; break;
} }
} }
let removed = (primes.len()-n as usize).clamp(0, n as usize); let removed = (primes.len()-n as usize).clamp(0, primes.len());
if primes.len() > n as usize { if removed != 0 {
for _ in 0..removed { for _ in 0..removed {
primes.pop(); primes.pop();
} }
@ -98,7 +100,7 @@ fn main() {
let inc = BigUint::from(1u8); let inc = BigUint::from(1u8);
loop { loop {
number = number + &inc; number = number + &inc;
if is_prime(&number) { if utils.is_prime(&number) {
primes.push(number.clone()); primes.push(number.clone());
} }
if primes.len() == n as usize { if primes.len() == n as usize {