From cb0cd5a9f5053147ddc8bfd783d89eeed9170789 Mon Sep 17 00:00:00 2001 From: Vishal Pankaj Chandratreya <19171016+tfpf@users.noreply.github.com> Date: Sun, 5 May 2024 00:41:55 +0530 Subject: [PATCH 1/3] Removed the multithreading helper of `is_small_prime_small_test`. --- src/utils.rs | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 263679e..d63de38 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -262,33 +262,25 @@ mod tests { reader.lines().map(|line| line.unwrap()) } - /// Convenience to count the number of prime numbers in a given range using - /// multiple threads. - /// - /// * `lower` - First number of the range (inclusive). - /// * `upper` - Last number of the range (exclusive). - /// * `pieces` - Number of threads to use. - /// - /// -> Number of primes numbers in the range. - fn primes(lower: i64, upper: i64, pieces: i64) -> usize { + #[cfg(target_pointer_width = "64")] + #[test] + fn is_prime_small_test() { + // Break the range into equal sub-ranges, and count the number of + // primes in each sub-range in a separate thread. + let (lower, upper, pieces) = (0, 3i64.pow(20), 20); let search_space = upper - lower; let search_space = search_space / pieces + if search_space % pieces == 0 { 0 } else { 1 }; - (lower..upper) + let num_of_primes = (lower..upper) .step_by(search_space as usize) .map(|lower| { let upper = std::cmp::min(lower + search_space, upper); + println!("{} {}", upper, lower); std::thread::spawn(move || (lower..upper).filter(|&num| utils::is_prime(num)).count()) }) .collect::>() .into_iter() .map(|worker| worker.join().unwrap()) - .sum() - } - - #[cfg(target_pointer_width = "64")] - #[test] - fn is_prime_small_test() { - let num_of_primes = primes(0, 3i64.pow(20), 3); + .sum::(); assert_eq!(num_of_primes, 166677978); } From 92ea3acd5867f6b0d2bc156ae296987c3efa16ce Mon Sep 17 00:00:00 2001 From: Vishal Pankaj Chandratreya <19171016+tfpf@users.noreply.github.com> Date: Sun, 5 May 2024 00:43:23 +0530 Subject: [PATCH 2/3] Removed debug print. --- src/utils.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils.rs b/src/utils.rs index d63de38..b7a061d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -274,7 +274,6 @@ mod tests { .step_by(search_space as usize) .map(|lower| { let upper = std::cmp::min(lower + search_space, upper); - println!("{} {}", upper, lower); std::thread::spawn(move || (lower..upper).filter(|&num| utils::is_prime(num)).count()) }) .collect::>() From eed0c2984d5dcddbb811b1828ff63120f7ce83db Mon Sep 17 00:00:00 2001 From: Vishal Pankaj Chandratreya <19171016+tfpf@users.noreply.github.com> Date: Sun, 5 May 2024 00:44:34 +0530 Subject: [PATCH 3/3] Reduced to 3 threads. More suitable for GitHub Actions runner. --- src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.rs b/src/utils.rs index b7a061d..ba2245b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -267,7 +267,7 @@ mod tests { fn is_prime_small_test() { // Break the range into equal sub-ranges, and count the number of // primes in each sub-range in a separate thread. - let (lower, upper, pieces) = (0, 3i64.pow(20), 20); + let (lower, upper, pieces) = (0, 3i64.pow(20), 3); let search_space = upper - lower; let search_space = search_space / pieces + if search_space % pieces == 0 { 0 } else { 1 }; let num_of_primes = (lower..upper)