diff options
Diffstat (limited to 'rust/sieve/src/lib.rs')
| -rw-r--r-- | rust/sieve/src/lib.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/rust/sieve/src/lib.rs b/rust/sieve/src/lib.rs new file mode 100644 index 0000000..307ff83 --- /dev/null +++ b/rust/sieve/src/lib.rs | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | pub fn primes_up_to(upper_bound: u64) -> Vec<u64> { | ||
| 2 | let mut sieve: Vec<Option<u64>> = (2..=upper_bound).map(Some).collect(); | ||
| 3 | primes(&mut sieve); | ||
| 4 | sieve.iter().filter_map(|x| *x).collect() | ||
| 5 | } | ||
| 6 | |||
| 7 | fn primes(ps: &mut [Option<u64>]) { | ||
| 8 | if let Some(&n) = ps.first() { | ||
| 9 | if let Some(p) = n { | ||
| 10 | (p as usize..ps.len()) | ||
| 11 | .step_by(p as usize) | ||
| 12 | .for_each(|x| ps[x] = None) | ||
| 13 | } | ||
| 14 | primes(&mut ps[1..]); | ||
| 15 | } | ||
| 16 | } | ||
