diff --git a/src/uu/factor/src/factor.rs b/src/uu/factor/src/factor.rs index 3ba471d73..d56488793 100644 --- a/src/uu/factor/src/factor.rs +++ b/src/uu/factor/src/factor.rs @@ -32,10 +32,17 @@ struct Factors { } impl Factors { - fn new() -> Factors { + fn one() -> Factors { Factors { f: BTreeMap::new() } } + fn prime(p: u64) -> Factors { + debug_assert!(miller_rabin::is_prime(p)); + let mut f = Factors::one(); + f.push(p); + f + } + fn add(&mut self, prime: u64, exp: u8) { debug_assert!(exp > 0); let n = *self.f.get(&prime).unwrap_or(&0); @@ -75,7 +82,7 @@ impl fmt::Display for Factors { } fn factor(mut n: u64) -> Factors { - let mut factors = Factors::new(); + let mut factors = Factors::one(); if n < 2 { factors.push(n); diff --git a/src/uu/factor/src/rho.rs b/src/uu/factor/src/rho.rs index e9076144b..9a53a40f4 100644 --- a/src/uu/factor/src/rho.rs +++ b/src/uu/factor/src/rho.rs @@ -55,29 +55,21 @@ fn _factor(num: u64) -> Factors { _factor::(n) }; - let mut factors = Factors::new(); if num == 1 { - return factors; + return Factors::one(); } let n = A::new(num); - let divisor; - match miller_rabin::test::(n) { + let divisor = match miller_rabin::test::(n) { Prime => { - factors.push(num); - return factors; + return Factors::prime(num); } - Composite(d) => { - divisor = d; - } - - Pseudoprime => { - divisor = find_divisor::(n); - } + Composite(d) => d, + Pseudoprime => find_divisor::(n), }; - factors *= _factor(divisor); + let mut factors = _factor(divisor); factors *= _factor(num / divisor); factors } diff --git a/src/uu/factor/src/table.rs b/src/uu/factor/src/table.rs index 6c59d3f07..e11b7198b 100644 --- a/src/uu/factor/src/table.rs +++ b/src/uu/factor/src/table.rs @@ -15,7 +15,7 @@ use crate::Factors; include!(concat!(env!("OUT_DIR"), "/prime_table.rs")); pub(crate) fn factor(mut num: u64) -> (Factors, u64) { - let mut factors = Factors::new(); + let mut factors = Factors::one(); for &(prime, inv, ceil) in P_INVS_U64 { if num == 1 { break;