40 lines
946 B
Rust
40 lines
946 B
Rust
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);
|
|
}
|