use quickcheck::quickcheck; fn sieve(n: usize) -> Vec { 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::>() } quickcheck(prop_all_prime as fn(usize) -> bool); quickcheck(prop_prime_iff_in_the_sieve as fn(usize) -> bool); }