@@ -18,46 +18,49 @@ pub fn sieve_of_eratosthenes(num: usize) -> Vec<usize> {
18
18
19
19
let end: usize = ( num as f64 ) . sqrt ( ) as usize ;
20
20
21
- // mark non-prime numbers in the sieve
22
- update_sieve ( & mut sieve, end, num) ;
21
+ // Mark non-prime numbers in the sieve and collect primes up to `end`
22
+ update_sieve ( & mut sieve, end, num, & mut result ) ;
23
23
24
- // collect all prime numbers
25
- result = extract_primes ( & sieve) ;
24
+ // Collect remaining primes beyond `end`
25
+ result. extend ( extract_remaining_primes ( & sieve, end + 1 ) ) ;
26
26
}
27
27
result
28
28
}
29
29
30
- /// Marks non-prime numbers in the sieve.
30
+ /// Marks non-prime numbers in the sieve and collects prime numbers up to `end` .
31
31
///
32
32
/// # Arguments
33
33
///
34
- /// * `sieve` - A mut slice of booleans representing the sieve.
34
+ /// * `sieve` - A mutable slice of booleans representing the sieve.
35
35
/// * `end` - The square root of the upper limit, used to optimize the algorithm.
36
36
/// * `num` - The upper limit up to which to mark non-prime numbers.
37
- fn update_sieve ( sieve : & mut [ bool ] , end : usize , num : usize ) {
37
+ /// * `result` - A mutable vector to store the prime numbers.
38
+ fn update_sieve ( sieve : & mut [ bool ] , end : usize , num : usize , result : & mut Vec < usize > ) {
38
39
for start in 2 ..=end {
39
40
if sieve[ start] {
41
+ result. push ( start) ; // Collect prime numbers up to `end`
40
42
for i in ( start * start..=num) . step_by ( start) {
41
43
sieve[ i] = false ;
42
44
}
43
45
}
44
46
}
45
47
}
46
48
47
- /// Extracts prime numbers from the sieve.
49
+ /// Extracts remaining prime numbers from the sieve beyond the given start index .
48
50
///
49
51
/// # Arguments
50
52
///
51
53
/// * `sieve` - A slice of booleans representing the sieve with non-prime numbers marked as false.
54
+ /// * `start` - The index to start checking for primes (inclusive).
52
55
///
53
56
/// # Returns
54
57
///
55
- /// A vector containing all prime numbers extracted from the sieve.
56
- fn extract_primes ( sieve : & [ bool ] ) -> Vec < usize > {
57
- sieve
58
+ /// A vector containing all remaining prime numbers extracted from the sieve.
59
+ fn extract_remaining_primes ( sieve : & [ bool ] , start : usize ) -> Vec < usize > {
60
+ sieve[ start.. ]
58
61
. iter ( )
59
62
. enumerate ( )
60
- . filter_map ( |( num , is_prime) | if * is_prime { Some ( num ) } else { None } )
63
+ . filter_map ( |( i , & is_prime) | if is_prime { Some ( start + i ) } else { None } )
61
64
. collect ( )
62
65
}
63
66
0 commit comments