mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-29 20:17:45 +00:00
factor::Factors: Use a RefCell rather than copy data when printing
~2.9% faster than the previous commit, ~11% faster than “master” overall.
This commit is contained in:
parent
30f9cf32f2
commit
8643489096
1 changed files with 6 additions and 5 deletions
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
|
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use crate::numeric::{Arithmetic, Montgomery};
|
use crate::numeric::{Arithmetic, Montgomery};
|
||||||
|
@ -64,16 +65,16 @@ impl PartialEq for Decomposition {
|
||||||
impl Eq for Decomposition {}
|
impl Eq for Decomposition {}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct Factors(Decomposition);
|
pub struct Factors(RefCell<Decomposition>);
|
||||||
|
|
||||||
impl Factors {
|
impl Factors {
|
||||||
pub fn one() -> Factors {
|
pub fn one() -> Factors {
|
||||||
Factors(Decomposition::one())
|
Factors(RefCell::new(Decomposition::one()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add(&mut self, prime: u64, exp: Exponent) {
|
pub fn add(&mut self, prime: u64, exp: Exponent) {
|
||||||
debug_assert!(miller_rabin::is_prime(prime));
|
debug_assert!(miller_rabin::is_prime(prime));
|
||||||
self.0.add(prime, exp)
|
self.0.borrow_mut().add(prime, exp)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push(&mut self, prime: u64) {
|
pub fn push(&mut self, prime: u64) {
|
||||||
|
@ -82,13 +83,13 @@ impl Factors {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
fn product(&self) -> u64 {
|
fn product(&self) -> u64 {
|
||||||
self.0.product()
|
self.0.borrow().product()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Factors {
|
impl fmt::Display for Factors {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
let mut v = (self.0).0.clone();
|
let v = &mut (self.0).borrow_mut().0;
|
||||||
v.sort_unstable();
|
v.sort_unstable();
|
||||||
|
|
||||||
for (p, exp) in v.iter() {
|
for (p, exp) in v.iter() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue