1use quickcheck::quickcheck;
2
3fn sieve(n: usize) -> Vec<usize> {
4 if n <= 1 {
5 return vec![];
6 }
7
8 let mut marked = vec![false; n + 1];
9 marked[0] = true;
10 marked[1] = true;
11 marked[2] = true;
12 for p in 2..n {
13 for i in (2 * p..n).filter(|&n| n % p == 0) {
14 marked[i] = true;
15 }
16 }
17 marked
18 .iter()
19 .enumerate()
20 .filter_map(|(i, &m)| if m { None } else { Some(i) })
21 .collect()
22}
23
24fn is_prime(n: usize) -> bool {
25 n != 0 && n != 1 && (2..).take_while(|i| i * i <= n).all(|i| n % i != 0)
26}
27
28fn main() {
29 fn prop_all_prime(n: usize) -> bool {
30 sieve(n).into_iter().all(is_prime)
31 }
32
33 fn prop_prime_iff_in_the_sieve(n: usize) -> bool {
34 sieve(n) == (0..(n + 1)).filter(|&i| is_prime(i)).collect::<Vec<_>>()
35 }
36
37 quickcheck(prop_all_prime as fn(usize) -> bool);
38 quickcheck(prop_prime_iff_in_the_sieve as fn(usize) -> bool);
39}