dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
use crate::{
    fermat_factorization_method::fermat_factorization_method,
    make_sparse_histogram::make_sparse_histogram,
};

fn prime_factorize_flat_fermat(mut n: u64) -> Vec<u64> {
    assert!(n > 0);

    let mut res = vec![];

    let ctz = n.trailing_zeros();

    res.extend(vec![2; ctz as usize]);

    n >>= ctz;

    if n == 1 {
        return res;
    }

    let a = fermat_factorization_method(n);

    let b = n / a;

    debug_assert!(a >= b && a * b == n);

    if a == n {
        res.push(a);
    } else {
        res.extend(prime_factorize_flat_fermat(a).into_iter());

        res.extend(prime_factorize_flat_fermat(b).into_iter());
    }

    res
}

pub fn prime_factorize_fermat(n: u64) -> Vec<(u64, u8)> {
    make_sparse_histogram(prime_factorize_flat_fermat(n))
        .into_iter()
        .map(|(p, c)| (p, c as u8))
        .collect()
}

#[cfg(test)]

mod tests {

    #[test]

    fn test() {
        use super::*;
        use crate::prime_factorize_trial_division::*;

        for i in 1..100 {
            assert_eq!(prime_factorize_fermat(i), prime_factorize(i));
        }
    }
}