use crate::num::basic::unsigneds::PrimitiveUnsigned;
use crate::num::conversion::traits::WrappingInto;
use crate::test_util::common::rle_encode;
pub fn factor_naive<T: PrimitiveUnsigned>(mut n: T) -> Vec<(T, u8)> {
assert_ne!(n, T::ZERO);
if n == T::ONE {
return Vec::new();
}
let mut factors = Vec::new();
'outer: loop {
let limit = n.floor_sqrt();
for p in T::primes().take_while(|&p| p <= limit) {
let (q, r) = n.div_mod(p);
if r == T::ZERO {
factors.push(p);
n = q;
continue 'outer;
}
}
factors.push(n);
break;
}
rle_encode(factors.into_iter())
.into_iter()
.map(|(p, e)| {
let e: u8 = e.wrapping_into();
(p, e)
})
.collect()
}