aboutsummaryrefslogtreecommitdiff
path: root/rust/sieve/src/lib.rs
blob: 307ff83a9497b4828bf8b134696af351e06c2a09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pub fn primes_up_to(upper_bound: u64) -> Vec<u64> {
    let mut sieve: Vec<Option<u64>> = (2..=upper_bound).map(Some).collect();
    primes(&mut sieve);
    sieve.iter().filter_map(|x| *x).collect()
}

fn primes(ps: &mut [Option<u64>]) {
    if let Some(&n) = ps.first() {
        if let Some(p) = n {
            (p as usize..ps.len())
                .step_by(p as usize)
                .for_each(|x| ps[x] = None)
        }
        primes(&mut ps[1..]);
    }
}