diff --git a/src/main.rs b/src/main.rs index 51abb9f..ced04b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,40 @@ use std::{ time::Instant, }; -fn generate_primes(threads: usize, max_value: usize) -> Vec { +fn generate_primes_single_threaded(max_value: usize) -> Vec { + let size = max_value + 1; + let mut prime_map = vec![true; size]; + + let to_sqrt = 2..(f64::sqrt(max_value as f64) as usize); + + for index in to_sqrt { + if let Some(slot) = prime_map.get(index) { + let slot: &bool = slot; + + if *slot { + for composite in (index * 2..size).step_by(index) { + if let Some(slot) = prime_map.get_mut(composite) { + *slot = false; + } + } + } + } + } + + (0..size) + .filter(|index| { + if let Some(slot) = prime_map.get(*index) { + let slot: &bool = slot; + + *slot + } else { + false + } + }) + .collect::>() +} + +fn generate_primes_multi_threaded(threads: usize, max_value: usize) -> Vec { let size = max_value + 1; let prime_map = (0..size).map(|_| AtomicBool::new(true)).collect::>(); @@ -64,9 +97,7 @@ fn generate_primes(threads: usize, max_value: usize) -> Vec { }) } -fn main() { - let max_prime = 3_000_000_000; - +fn run_multi_threaded(max_prime: usize) -> Vec { let now = Instant::now(); let threads: usize = std::thread::available_parallelism() @@ -78,18 +109,32 @@ fn main() { now.elapsed() ); - let mut primes = generate_primes(threads, max_prime); + let mut primes = generate_primes_multi_threaded(threads, max_prime); println!("{:?} - Generated {} primes", now.elapsed(), primes.len()); primes.sort(); println!("{:?} - Sorted", now.elapsed()); + primes +} +fn run_single_threaded(max_prime: usize) -> Vec { + let now = Instant::now(); + println!( + "{:?} - Generating primes up to {max_prime} with 1 thread", + now.elapsed() + ); + let primes = generate_primes_single_threaded(max_prime); + println!("{:?} - Generated {} primes", now.elapsed(), primes.len()); + primes +} + +fn print_primes(primes: Vec) { let buf = Vec::with_capacity(primes.len() * 8); let mut buf_writer = BufWriter::new(buf); for prime in primes { write!(buf_writer, "{prime}\n").expect("Writing succedes"); } buf_writer.flush().expect("Flush succeeds"); - println!("{:?} - Built output string", now.elapsed()); + println!("Built output string"); /* println!( "{}", @@ -98,3 +143,10 @@ fn main() { ); */ } + +fn main() { + let max_prime = 3_000_000_000; + + print_primes(run_multi_threaded(max_prime)); + print_primes(run_single_threaded(max_prime)); +}