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;
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
src/main.rs
14
src/main.rs
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user