optimize a bit

This commit is contained in:
Mystikfluu 2023-02-25 18:41:59 +01:00
parent 069898b620
commit 53158ccdd3
2 changed files with 18 additions and 19 deletions

View File

@ -4,11 +4,11 @@ pub mod is_prime {
x.bits() - 1 x.bits() - 1
} }
pub fn is_prime(number: BigUint) -> bool { pub fn is_prime(number: &BigUint) -> bool {
if BigUint::from(1u8) == number { if BigUint::from(1u8) == *number {
return false; return false;
} }
if BigUint::from(4u8) > number { if BigUint::from(4u8) > *number {
return true; return true;
} }
@ -16,19 +16,17 @@ 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.clone()+1u8); let a = 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 {
//eprintln!("only supports numbers of type (2^x)-1");
let mut i = BigUint::from(1u8); let mut i = BigUint::from(1u8);
let one = BigUint::from(1u8); let one = BigUint::from(1u8);
let zero = BigUint::from(0u8); let zero = BigUint::from(0u8);
let sqrtnum = number.sqrt()+one.clone(); let sqrtnum = number.sqrt()+&one;
let mut is_prime = true; let mut is_prime = true;
loop { loop {
i = i + one.clone(); i = i + &one;
if number.clone()%i.clone() == zero { if number%&i == zero {
// println!("{number} {i}");
is_prime = false; is_prime = false;
break; break;
} }
@ -43,7 +41,7 @@ pub mod is_prime {
let mut last = BigUint::from(4u8); let mut last = BigUint::from(4u8);
for _i in 2..a { for _i in 2..a {
last = (last.pow(2)-two.clone())%number.clone(); last = (last.pow(2)-&two)%number;
} }
if last == BigUint::from(0u8) { if last == BigUint::from(0u8) {
true true

View File

@ -48,14 +48,15 @@ fn main() {
for i in 0..THREADS { for i in 0..THREADS {
let tprimes = thread::spawn(move || { let tprimes = thread::spawn(move || {
let mut lprimes = vec![]; let mut lprimes = vec![];
let mut number = BigUint::from(i)*BigUint::from(workloads); let work_uint = BigUint::from(workloads);
let mut number = BigUint::from(i)*&work_uint;
let inc = BigUint::from(1u8); let inc = BigUint::from(1u8);
let max = BigUint::from(i+1)*BigUint::from(workloads); let max = BigUint::from(i+1)*work_uint;
loop { loop {
number = number + inc.clone(); number = number + &inc;
if is_prime(number.clone()) { if is_prime(&number) {
lprimes.push(number.clone()); lprimes.push(number.clone());
} }
if number == max { if number == max {
@ -93,11 +94,11 @@ fn main() {
let added = (n as usize-primes.len()).clamp(0, n as usize); let added = (n as usize-primes.len()).clamp(0, n as usize);
if primes.len() < n as usize { if primes.len() < n as usize {
let mut number = BigUint::from(THREADS+1)*BigUint::from(workloads); let mut number = BigUint::from(THREADS)*BigUint::from(workloads);
let inc = BigUint::from(1u8); let inc = BigUint::from(1u8);
loop { loop {
number = number + inc.clone(); number = number + &inc;
if is_prime(number.clone()) { if is_prime(&number) {
primes.push(number.clone()); primes.push(number.clone());
} }
if primes.len() == n as usize { if primes.len() == n as usize {
@ -112,7 +113,7 @@ fn main() {
println!("{:?}", primes); println!("{:?}", primes);
println!("prime count: {}, expected: {}, primes removed: {} | {}%, primes added: {} | {}%",primes.len(),n,removed,(removed as f64)/primes.len() as f64*100.0,added,(added as f64)/primes.len() as f64*100.0); println!("prime count: {}, expected: {}, primes added: {} | {}%",primes.len(),n,added,(added as f64)/primes.len() as f64*100.0);
println!("last prime approx: {}",nthprime_approx); println!("last prime approx: {}",nthprime_approx);
println!("And that's time: {difference:?}"); println!("And that's time: {difference:?}");