src/coefficients.rs

Wed, 26 Oct 2022 22:16:57 +0300

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 26 Oct 2022 22:16:57 +0300
changeset 7
860a54fca7bc
parent 5
59dc4c5883f4
permissions
-rw-r--r--

Added tag unthreaded for changeset d80b87b8acd0

/*!
Arithmetic functions that are valid in a ‘const context”, i.e., can be computed at compile-time.
*/

/// Calculate $n!$. Valid in a const-context.
///
/// (The version in the crate `num_integer` deesn't currently work in a const-context.)
pub const fn factorial(n : usize) -> usize {
    const fn f(i : usize, a : usize) -> usize {
        if i==0 { a } else { f(i-1, i*a) }
    }
    f(n, 1)
}

/// Calculate $n \choose k$. Valid in a const-context.
///
/// (The version in the crate `num_integer` doesn't currently work in a const-context.)
pub const fn binomial(n : usize, k : usize) -> usize {
    factorial(n)/(factorial(n-k)*factorial(k))
}

/// Calculate $n^k$. Valid in a const-context.
///
/// (The version in the crate `num_integer` doesn't currently work in a const-context.)
pub const fn pow(n : usize, k : usize) -> usize {
    const fn pow_accum(n : usize, k : usize, accum : usize) -> usize {
        if k==0 { accum } else { pow_accum(n, k-1, accum*n) }
    }
    pow_accum(n, k, 1)
}

mercurial