rust_eratos/
lib.rs

1//! # rust_eratos
2//!
3//! `rust_eratos` is one of the Sieve of Eratosthenes implementation for rust language practice.
4
5fn get_upper_range_n(n: u32) -> u32 {
6    (n as f32).sqrt() as u32 + 1
7}
8
9/// Check has prime number below the number given.
10///
11/// # Examples
12/// ```
13/// assert_eq!(rust_eratos::has_prime_number_below(0), false);
14/// assert_eq!(rust_eratos::has_prime_number_below(1), false);
15/// assert_eq!(rust_eratos::has_prime_number_below(2), false);
16/// assert_eq!(rust_eratos::has_prime_number_below(3), true);
17/// ```
18pub fn has_prime_number_below(n: u32) -> bool {
19    n > 2
20}
21
22/// Check is prime the number given.
23///
24/// # Examples
25/// ```
26/// assert_eq!(rust_eratos::is_prime_number(2), true);
27/// assert_eq!(rust_eratos::is_prime_number(3), true);
28/// assert_eq!(rust_eratos::is_prime_number(11), true);
29/// assert_eq!(rust_eratos::is_prime_number(12), false);
30/// ```
31pub fn is_prime_number(n: u32) -> bool {
32    match n {
33        0..=1 => false,
34        _ => !(2..get_upper_range_n(n)).any(|i| n % i == 0),
35    }
36}
37
38/// Get prime number count below the number given.
39///
40/// # Examples
41/// ```
42/// assert_eq!(rust_eratos::get_prime_number_count_below(2), 0);
43/// assert_eq!(rust_eratos::get_prime_number_count_below(3), 1);
44/// assert_eq!(rust_eratos::get_prime_number_count_below(11), 4);
45/// assert_eq!(rust_eratos::get_prime_number_count_below(12), 5);
46/// ```
47pub fn get_prime_number_count_below(n: u32) -> usize {
48    match n {
49        0..=2 => 0,
50        _ => (2..n).filter(|i| is_prime_number(*i)).count(),
51    }
52}
53
54/// Get largest a prime number below the number given.
55///
56/// # Examples
57/// ```
58/// assert_eq!(rust_eratos::get_largest_prime_number_below(2), 0);
59/// assert_eq!(rust_eratos::get_largest_prime_number_below(3), 2);
60/// assert_eq!(rust_eratos::get_largest_prime_number_below(11), 7);
61/// assert_eq!(rust_eratos::get_largest_prime_number_below(12), 11);
62/// ```
63pub fn get_largest_prime_number_below(n: u32) -> u32 {
64    match (2..n).rev().find(|i| is_prime_number(*i)) {
65        Some(i) => i,
66        None => 0,
67    }
68}
69
70/// Get prime numbers below the number given.
71///
72/// # Examples
73/// ```
74/// assert_eq!(rust_eratos::get_prime_numbers_below(2), vec![]);
75/// assert_eq!(rust_eratos::get_prime_numbers_below(3), vec![2]);
76/// assert_eq!(rust_eratos::get_prime_numbers_below(11), vec![2, 3, 5, 7]);
77/// assert_eq!(rust_eratos::get_prime_numbers_below(12), vec![2, 3, 5, 7, 11]);
78/// ```
79pub fn get_prime_numbers_below(n: u32) -> Vec<u32> {
80    let upper_range_n: u32 = get_upper_range_n(n);
81    let mut sieve: Vec<u32> = vec![0, 0];
82    sieve.append(&mut (2..n).collect());
83
84    for (i, _) in (0..upper_range_n).enumerate() {
85        if sieve[i] <= 0 {
86            continue;
87        }
88
89        let mut next_index = i * i;
90
91        while next_index < sieve.len() {
92            sieve[next_index] = 0;
93            next_index += i;
94        }
95    }
96
97    sieve.into_iter().filter(|&element| element > 0).collect()
98}
99
100#[cfg(test)]
101mod tests {
102    use super::*;
103
104    #[test]
105    fn has_prime() {
106        assert_eq!(has_prime_number_below(0), false);
107        assert_eq!(has_prime_number_below(1), false);
108        assert_eq!(has_prime_number_below(2), false);
109        assert_eq!(has_prime_number_below(3), true);
110        assert_eq!(has_prime_number_below(4), true);
111        assert_eq!(has_prime_number_below(5), true);
112    }
113
114    #[test]
115    fn is_prime() {
116        assert_eq!(is_prime_number(0), false);
117        assert_eq!(is_prime_number(1), false);
118        assert_eq!(is_prime_number(2), true);
119        assert_eq!(is_prime_number(3), true);
120        assert_eq!(is_prime_number(4), false);
121        assert_eq!(is_prime_number(5), true);
122        assert_eq!(is_prime_number(6), false);
123        assert_eq!(is_prime_number(7), true);
124        assert_eq!(is_prime_number(8), false);
125        assert_eq!(is_prime_number(9), false);
126        assert_eq!(is_prime_number(10), false);
127        assert_eq!(is_prime_number(11), true);
128        assert_eq!(is_prime_number(12), false);
129    }
130
131    #[test]
132    fn prime_count_below() {
133        assert_eq!(get_prime_number_count_below(0), 0);
134        assert_eq!(get_prime_number_count_below(1), 0);
135        assert_eq!(get_prime_number_count_below(2), 0);
136        assert_eq!(get_prime_number_count_below(3), 1);
137        assert_eq!(get_prime_number_count_below(4), 2);
138        assert_eq!(get_prime_number_count_below(5), 2);
139        assert_eq!(get_prime_number_count_below(6), 3);
140        assert_eq!(get_prime_number_count_below(7), 3);
141        assert_eq!(get_prime_number_count_below(8), 4);
142        assert_eq!(get_prime_number_count_below(9), 4);
143        assert_eq!(get_prime_number_count_below(10), 4);
144        assert_eq!(get_prime_number_count_below(11), 4);
145        assert_eq!(get_prime_number_count_below(12), 5);
146        assert_eq!(get_prime_numbers_below(12).len(), 5);
147    }
148
149    #[test]
150    fn largest_prime_below() {
151        assert_eq!(get_largest_prime_number_below(0), 0);
152        assert_eq!(get_largest_prime_number_below(1), 0);
153        assert_eq!(get_largest_prime_number_below(2), 0);
154        assert_eq!(get_largest_prime_number_below(3), 2);
155        assert_eq!(get_largest_prime_number_below(4), 3);
156        assert_eq!(get_largest_prime_number_below(5), 3);
157        assert_eq!(get_largest_prime_number_below(6), 5);
158        assert_eq!(get_largest_prime_number_below(7), 5);
159        assert_eq!(get_largest_prime_number_below(8), 7);
160        assert_eq!(get_largest_prime_number_below(9), 7);
161        assert_eq!(get_largest_prime_number_below(10), 7);
162        assert_eq!(get_largest_prime_number_below(11), 7);
163        assert_eq!(get_largest_prime_number_below(12), 11);
164
165        assert_eq!(get_prime_numbers_below(12).contains(&11), true);
166    }
167
168    #[test]
169    fn primes_below() {
170        assert_eq!(get_prime_numbers_below(0), vec![]);
171        assert_eq!(get_prime_numbers_below(1), vec![]);
172        assert_eq!(get_prime_numbers_below(2), vec![]);
173        assert_eq!(get_prime_numbers_below(3), vec![2]);
174        assert_eq!(get_prime_numbers_below(4), vec![2, 3]);
175        assert_eq!(get_prime_numbers_below(5), vec![2, 3]);
176        assert_eq!(get_prime_numbers_below(6), vec![2, 3, 5]);
177        assert_eq!(get_prime_numbers_below(7), vec![2, 3, 5]);
178        assert_eq!(get_prime_numbers_below(8), vec![2, 3, 5, 7]);
179        assert_eq!(get_prime_numbers_below(9), vec![2, 3, 5, 7]);
180        assert_eq!(get_prime_numbers_below(10), vec![2, 3, 5, 7]);
181        assert_eq!(get_prime_numbers_below(11), vec![2, 3, 5, 7]);
182        assert_eq!(get_prime_numbers_below(12), vec![2, 3, 5, 7, 11]);
183    }
184}