From dacee413dbb8abac36be6eb4389a07781609207e Mon Sep 17 00:00:00 2001 From: nicoo Date: Fri, 19 Jun 2020 14:03:11 +0200 Subject: [PATCH] factor::rho: Refactor to avoid unnecessary allocations --- src/uu/factor/src/factor.rs | 7 +++++++ src/uu/factor/src/rho.rs | 8 +++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/uu/factor/src/factor.rs b/src/uu/factor/src/factor.rs index 8ee77e5bb..d56488793 100644 --- a/src/uu/factor/src/factor.rs +++ b/src/uu/factor/src/factor.rs @@ -36,6 +36,13 @@ impl 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); diff --git a/src/uu/factor/src/rho.rs b/src/uu/factor/src/rho.rs index 93b1943bc..4dfa33b07 100644 --- a/src/uu/factor/src/rho.rs +++ b/src/uu/factor/src/rho.rs @@ -55,17 +55,15 @@ fn _factor(num: u64) -> Factors { _factor::(n) }; - let mut factors = Factors::one(); if num == 1 { - return factors; + return Factors::one(); } let n = A::new(num); let divisor; match miller_rabin::test::(n) { Prime => { - factors.push(num); - return factors; + return Factors::prime(num); } Composite(d) => { @@ -77,7 +75,7 @@ fn _factor(num: u64) -> Factors { } }; - factors *= _factor(divisor); + let mut factors = _factor(divisor); factors *= _factor(num / divisor); factors }