1
1
/* *
2
2
* @file
3
- * @brief Get list of prime numbers using Sieve of Eratosthenes
3
+ * @brief Prime Numbers using [Sieve of
4
+ * Eratosthenes](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)
4
5
* @details
5
6
* Sieve of Eratosthenes is an algorithm that finds all the primes
6
7
* between 2 and N.
11
12
* @see primes_up_to_billion.cpp prime_numbers.cpp
12
13
*/
13
14
14
- #include < cassert>
15
- #include < iostream>
16
- #include < vector>
15
+ #include < cassert> // / for assert
16
+ #include < iostream> // / for IO operations
17
+ #include < vector> // / for std::vector
17
18
18
19
/* *
19
- * This is the function that finds the primes and eliminates the multiples.
20
+ * @namespace math
21
+ * @brief Mathematical algorithms
22
+ */
23
+ namespace math {
24
+ /* *
25
+ * @namespace sieve_of_eratosthenes
26
+ * @brief Functions for finding Prime Numbers using Sieve of Eratosthenes
27
+ */
28
+ namespace sieve_of_eratosthenes {
29
+ /* *
30
+ * @brief Function to sieve out the primes
31
+ * @details
32
+ * This function finds all the primes between 2 and N using the Sieve of
33
+ * Eratosthenes algorithm. It starts by assuming all numbers (except zero and
34
+ * one) are prime and then iteratively marks the multiples of each prime as
35
+ * non-prime.
36
+ *
20
37
* Contains a common optimization to start eliminating multiples of
21
38
* a prime p starting from p * p since all of the lower multiples
22
39
* have been already eliminated.
23
- * @param N number of primes to check
24
- * @return is_prime a vector of `N + 1` booleans identifying if `i`^th number is a prime or not
40
+ * @param N number till which primes are to be found
41
+ * @return is_prime a vector of `N + 1` booleans identifying if `i`^th number is
42
+ * a prime or not
25
43
*/
26
44
std::vector<bool > sieve (uint32_t N) {
27
- std::vector<bool > is_prime (N + 1 , true );
28
- is_prime[0 ] = is_prime[1 ] = false ;
45
+ std::vector<bool > is_prime (N + 1 , true ); // Initialize all as prime numbers
46
+ is_prime[0 ] = is_prime[1 ] = false ; // 0 and 1 are not prime numbers
47
+
29
48
for (uint32_t i = 2 ; i * i <= N; i++) {
30
49
if (is_prime[i]) {
31
50
for (uint32_t j = i * i; j <= N; j += i) {
@@ -37,9 +56,10 @@ std::vector<bool> sieve(uint32_t N) {
37
56
}
38
57
39
58
/* *
40
- * This function prints out the primes to STDOUT
41
- * @param N number of primes to check
42
- * @param is_prime a vector of `N + 1` booleans identifying if `i`^th number is a prime or not
59
+ * @brief Function to print the prime numbers
60
+ * @param N number till which primes are to be found
61
+ * @param is_prime a vector of `N + 1` booleans identifying if `i`^th number is
62
+ * a prime or not
43
63
*/
44
64
void print (uint32_t N, const std::vector<bool > &is_prime) {
45
65
for (uint32_t i = 2 ; i <= N; i++) {
@@ -50,23 +70,53 @@ void print(uint32_t N, const std::vector<bool> &is_prime) {
50
70
std::cout << std::endl;
51
71
}
52
72
73
+ } // namespace sieve_of_eratosthenes
74
+ } // namespace math
75
+
53
76
/* *
54
- * Test implementations
77
+ * @brief Self-test implementations
78
+ * @return void
55
79
*/
56
- void tests () {
57
- // 0 1 2 3 4 5 6 7 8 9 10
58
- std::vector<bool > ans{false , false , true , true , false , true , false , true , false , false , false };
59
- assert (sieve (10 ) == ans);
80
+ static void tests () {
81
+ std::vector<bool > is_prime_1 =
82
+ math::sieve_of_eratosthenes::sieve (static_cast <uint32_t >(10 ));
83
+ std::vector<bool > is_prime_2 =
84
+ math::sieve_of_eratosthenes::sieve (static_cast <uint32_t >(20 ));
85
+ std::vector<bool > is_prime_3 =
86
+ math::sieve_of_eratosthenes::sieve (static_cast <uint32_t >(100 ));
87
+
88
+ std::vector<bool > expected_1{false , false , true , true , false , true ,
89
+ false , true , false , false , false };
90
+ assert (is_prime_1 == expected_1);
91
+
92
+ std::vector<bool > expected_2{false , false , true , true , false , true ,
93
+ false , true , false , false , false , true ,
94
+ false , true , false , false , false , true ,
95
+ false , true , false };
96
+ assert (is_prime_2 == expected_2);
97
+
98
+ std::vector<bool > expected_3{
99
+ false , false , true , true , false , true , false , true , false , false ,
100
+ false , true , false , true , false , false , false , true , false , true ,
101
+ false , false , false , true , false , false , false , false , false , true ,
102
+ false , true , false , false , false , false , false , true , false , false ,
103
+ false , true , false , true , false , false , false , true , false , false ,
104
+ false , false , false , true , false , false , false , false , false , true ,
105
+ false , true , false , false , false , false , false , true , false , false ,
106
+ false , true , false , true , false , false , false , false , false , true ,
107
+ false , false , false , true , false , false , false , false , false , true ,
108
+ false , false , false , false , false , false , false , true , false , false ,
109
+ false };
110
+ assert (is_prime_3 == expected_3);
111
+
112
+ std::cout << " All tests have passed successfully!\n " ;
60
113
}
61
114
62
115
/* *
63
- * Main function
116
+ * @brief Main function
117
+ * @returns 0 on exit
64
118
*/
65
119
int main () {
66
120
tests ();
67
-
68
- uint32_t N = 100 ;
69
- std::vector<bool > is_prime = sieve (N);
70
- print (N, is_prime);
71
121
return 0 ;
72
122
}
0 commit comments