///|
/// All positive m such that m | n
pub fn[E : Abs + HasOne + Mul, P : HasOne + Compare + Add] divisors(
n : E,
f : Factorization[E, P],
) -> Array[E] raise InvokeError {
guard n != HasNil::nil() else { [] }
let factors = f(abs(n))
let mut divisors = [HasOne::one()]
for p, exp in factors {
let mut power = HasOne::one()
let powers = [power] // precompute [1, p, p^2, ..., p^exp]
for i = HasOne::one(); i <= exp; i = i + HasOne::one() {
power = power * p
powers.push(power)
}
divisors = divisors.map(d => powers.map(pow => d * pow)).flatten()
}
divisors
}
///|
test "divisors" {
assert_eq(divisors(6, factor9973), [1, 3, 2, 6])
assert_eq(divisors(109, factor9973), [1, 109])
}