From 71e1c529203d88e97d9aa477d11feb62bf22b2a9 Mon Sep 17 00:00:00 2001 From: nicoo Date: Fri, 19 Jun 2020 13:58:11 +0200 Subject: [PATCH 1/3] factor::Factors: Rename new() to one() --- src/uu/factor/src/factor.rs | 4 ++-- src/uu/factor/src/rho.rs | 2 +- src/uu/factor/src/table.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/uu/factor/src/factor.rs b/src/uu/factor/src/factor.rs index 3ba471d73..8ee77e5bb 100644 --- a/src/uu/factor/src/factor.rs +++ b/src/uu/factor/src/factor.rs @@ -32,7 +32,7 @@ struct Factors { } impl Factors { - fn new() -> Factors { + fn one() -> Factors { Factors { f: BTreeMap::new() } } @@ -75,7 +75,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..93b1943bc 100644 --- a/src/uu/factor/src/rho.rs +++ b/src/uu/factor/src/rho.rs @@ -55,7 +55,7 @@ fn _factor(num: u64) -> Factors { _factor::(n) }; - let mut factors = Factors::new(); + let mut factors = Factors::one(); if num == 1 { return 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; From dacee413dbb8abac36be6eb4389a07781609207e Mon Sep 17 00:00:00 2001 From: nicoo Date: Fri, 19 Jun 2020 14:03:11 +0200 Subject: [PATCH 2/3] 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 } From 0518e06053282505d98936c612bf1202609d27ce Mon Sep 17 00:00:00 2001 From: nicoo Date: Fri, 19 Jun 2020 14:10:34 +0200 Subject: [PATCH 3/3] factor::rho: Minor refactor for readability --- src/uu/factor/src/rho.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/uu/factor/src/rho.rs b/src/uu/factor/src/rho.rs index 4dfa33b07..9a53a40f4 100644 --- a/src/uu/factor/src/rho.rs +++ b/src/uu/factor/src/rho.rs @@ -60,19 +60,13 @@ fn _factor(num: u64) -> Factors { } let n = A::new(num); - let divisor; - match miller_rabin::test::(n) { + let divisor = match miller_rabin::test::(n) { Prime => { return Factors::prime(num); } - Composite(d) => { - divisor = d; - } - - Pseudoprime => { - divisor = find_divisor::(n); - } + Composite(d) => d, + Pseudoprime => find_divisor::(n), }; let mut factors = _factor(divisor);