slice_math 0.1.31

A selection of useful math operations on slices

pub const fn is_prime(n: usize) -> bool
{
    let n_sqrt = 1 << ((n.ilog2() + 1) / 2);
    let mut m = 2;

    if n <= 1
    {
        return false;
    }

    while m < n_sqrt
    {
        if n % m == 0
        {
            return false
        }
        m += 1
    }

    true
}

pub const fn closest_mod0_of(mut x: usize, y: usize) -> Option<usize>
{
    if is_prime(y)
    {
        return Some(y);
    }
    if x == 0
    {
        x += 1;
    }
    let mut n = x;
    let mut m = x - 1;
    while m != 0 || n != usize::MAX
    {
        if y % n == 0
        {
            return Some(n)
        }
        if m != 0 && y % m == 0
        {
            return Some(m)
        }
        n = n.saturating_add(1);
        m = m.saturating_sub(1);
    }
    None
}

pub const fn closest_prime(x: usize) -> Option<usize>
{
    if x == 0
    {
        return None;
    }
    let mut n = x;
    let mut m = x - 1;
    while m != 0 || n != usize::MAX
    {
        if is_prime(n)
        {
            return Some(n)
        }
        if is_prime(m)
        {
            return Some(m)
        }
        n = n.saturating_add(1);
        m = m.saturating_sub(1);
    }
    None
}