const_primes/
count.rs

1// Copyright 2025 Johanna Sörngård
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use crate::sieve;
5
6/// Returns an array of size `N` where the value at a given index is how many primes are less than or equal to the index.
7///
8/// Sieves primes with [`sieve`](crate::sieve()) and then counts them.
9///
10/// # Example
11///
12/// Basic usage
13///
14/// ```
15/// # use const_primes::prime_pi;
16/// const COUNTS: [usize; 10] = prime_pi();
17/// assert_eq!(COUNTS, [0, 0, 1, 2, 2, 3, 3, 4, 4, 4]);
18/// ```
19#[must_use = "the function only returns a new value"]
20pub const fn prime_pi<const N: usize>() -> [usize; N] {
21    let mut counts = [0; N];
22    if N <= 2 {
23        return counts;
24    }
25    counts[2] = 1;
26    let prime_status: [bool; N] = sieve();
27    let mut count = 1;
28    let mut i = 3;
29    while i < N {
30        if prime_status[i] {
31            count += 1;
32        }
33        counts[i] = count;
34        if i + 1 < N {
35            counts[i + 1] = count;
36        }
37        i += 2;
38    }
39    counts
40}