| use quickcheck::quickcheck; | 
 |  | 
 | fn sieve(n: usize) -> Vec<usize> { | 
 |     if n <= 1 { | 
 |         return vec![]; | 
 |     } | 
 |  | 
 |     let mut marked = vec![false; n + 1]; | 
 |     marked[0] = true; | 
 |     marked[1] = true; | 
 |     marked[2] = true; | 
 |     for p in 2..n { | 
 |         for i in (2 * p..n).filter(|&n| n % p == 0) { | 
 |             marked[i] = true; | 
 |         } | 
 |     } | 
 |     marked | 
 |         .iter() | 
 |         .enumerate() | 
 |         .filter_map(|(i, &m)| if m { None } else { Some(i) }) | 
 |         .collect() | 
 | } | 
 |  | 
 | fn is_prime(n: usize) -> bool { | 
 |     n != 0 && n != 1 && (2..).take_while(|i| i * i <= n).all(|i| n % i != 0) | 
 | } | 
 |  | 
 | fn main() { | 
 |     fn prop_all_prime(n: usize) -> bool { | 
 |         sieve(n).into_iter().all(is_prime) | 
 |     } | 
 |  | 
 |     fn prop_prime_iff_in_the_sieve(n: usize) -> bool { | 
 |         sieve(n) == (0..(n + 1)).filter(|&i| is_prime(i)).collect::<Vec<_>>() | 
 |     } | 
 |  | 
 |     quickcheck(prop_all_prime as fn(usize) -> bool); | 
 |     quickcheck(prop_prime_iff_in_the_sieve as fn(usize) -> bool); | 
 | } |