use cas_attrs::builtin;
use crate::{funcs::miscellaneous::partial_factorial, primitive::int};
use rug::Integer;
#[derive(Debug)]
pub struct Ncr;
#[cfg_attr(feature = "numerical", builtin)]
impl Ncr {
pub fn eval_static(n: Integer, k: Integer) -> Integer {
if k > n {
return Integer::from(0);
}
let sub = int(&n - &k);
if k > sub {
partial_factorial(n, k) / partial_factorial(sub, int(1))
} else {
partial_factorial(n, sub) / partial_factorial(k, int(1))
}
}
}
#[derive(Debug)]
pub struct Npr;
#[cfg_attr(feature = "numerical", builtin)]
impl Npr {
pub fn eval_static(n: Integer, k: Integer) -> Integer {
let sub = &n - k;
partial_factorial(n, sub)
}
}