[feature] single thread code to calculate hcns using prime factorization
This commit is contained in:
parent
2f6449a25a
commit
24cf088011
50
src/main.rs
50
src/main.rs
@ -1,12 +1,56 @@
|
|||||||
mod sieve;
|
mod sieve;
|
||||||
|
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
use sieve::get_primes;
|
use sieve::get_primes;
|
||||||
|
|
||||||
const MAX_SIEVED_PRIMES: usize = 100_000_000;
|
const MAX_SIEVED_PRIMES: usize = 100_000_000;
|
||||||
|
|
||||||
fn main() {
|
fn count_prime_factor_exponent(prime: u64, mut nr: u64) -> u64 {
|
||||||
let primes = get_primes(MAX_SIEVED_PRIMES);
|
let mut count = 0;
|
||||||
|
|
||||||
|
while nr % prime == 0 {
|
||||||
|
nr /= prime;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prime_factors(nr: u64, primes: &[u64]) -> u64 {
|
||||||
|
let mut num_teilers = 1;
|
||||||
|
|
||||||
|
let nr_sqrt = (nr as f64).sqrt().ceil() as u64;
|
||||||
|
|
||||||
for prime in primes {
|
for prime in primes {
|
||||||
println!("{prime}");
|
if *prime > nr_sqrt {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let count = count_prime_factor_exponent(*prime, nr);
|
||||||
|
if count > 0 {
|
||||||
|
num_teilers *= count + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
num_teilers
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let start = Instant::now();
|
||||||
|
println!("Precalculating primes...");
|
||||||
|
let primes = get_primes(MAX_SIEVED_PRIMES);
|
||||||
|
println!("{} primes. Took {:?}", primes.len(), start.elapsed());
|
||||||
|
|
||||||
|
let mut max_teilers = 0;
|
||||||
|
|
||||||
|
let start = Instant::now();
|
||||||
|
|
||||||
|
for nr in (2..1_000_000_000).step_by(2) {
|
||||||
|
let teilers = prime_factors(nr, &primes);
|
||||||
|
if teilers > max_teilers {
|
||||||
|
println!("{nr}: {teilers} ({:?} since start)", start.elapsed());
|
||||||
|
max_teilers = teilers;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user