optimize a bit
This commit is contained in:
parent
069898b620
commit
53158ccdd3
@ -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
|
||||||
|
17
src/main.rs
17
src/main.rs
@ -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:?}");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user