mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 03:27:44 +00:00
tests/factor ~ refactor for readability + improve DRY
This commit is contained in:
parent
114fda0519
commit
94e240a2fc
2 changed files with 15 additions and 10 deletions
|
@ -329,6 +329,7 @@ pin_same-file = { version="1.0.4, < 1.0.6", package="same-file" } ## same-file v
|
||||||
pin_winapi-util = { version="0.1.2, < 0.1.3", package="winapi-util" } ## winapi-util v0.1.3 has compiler errors for MinRustV v1.32.0, expects 1.34
|
pin_winapi-util = { version="0.1.2, < 0.1.3", package="winapi-util" } ## winapi-util v0.1.3 has compiler errors for MinRustV v1.32.0, expects 1.34
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
conv = "0.3"
|
||||||
filetime = "0.2"
|
filetime = "0.2"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
rand = "0.7"
|
rand = "0.7"
|
||||||
|
|
|
@ -10,15 +10,15 @@ use std::time::SystemTime;
|
||||||
|
|
||||||
#[path = "../../src/uu/factor/sieve.rs"]
|
#[path = "../../src/uu/factor/sieve.rs"]
|
||||||
mod sieve;
|
mod sieve;
|
||||||
use self::sieve::Sieve;
|
|
||||||
|
|
||||||
|
extern crate conv;
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
|
|
||||||
use self::rand::distributions::{Distribution, Uniform};
|
use self::rand::distributions::{Distribution, Uniform};
|
||||||
use self::rand::{rngs::SmallRng, Rng, SeedableRng};
|
use self::rand::{rngs::SmallRng, Rng, SeedableRng};
|
||||||
|
use self::sieve::Sieve;
|
||||||
|
|
||||||
const NUM_PRIMES: usize = 10000;
|
const NUM_PRIMES: usize = 10000;
|
||||||
const LOG_PRIMES: f64 = 14.0; // ceil(log2(NUM_PRIMES))
|
|
||||||
|
|
||||||
const NUM_TESTS: usize = 100;
|
const NUM_TESTS: usize = 100;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -44,6 +44,9 @@ fn test_first_100000_integers() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_random() {
|
fn test_random() {
|
||||||
|
use conv::prelude::*;
|
||||||
|
|
||||||
|
let log_num_primes = f64::value_from(NUM_PRIMES).unwrap().log2().ceil();
|
||||||
let primes = Sieve::primes().take(NUM_PRIMES).collect::<Vec<u64>>();
|
let primes = Sieve::primes().take(NUM_PRIMES).collect::<Vec<u64>>();
|
||||||
|
|
||||||
let rng_seed = SystemTime::now()
|
let rng_seed = SystemTime::now()
|
||||||
|
@ -51,16 +54,16 @@ fn test_random() {
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.as_secs();
|
.as_secs();
|
||||||
println!("rng_seed={:?}", rng_seed);
|
println!("rng_seed={:?}", rng_seed);
|
||||||
|
|
||||||
let mut rng = SmallRng::seed_from_u64(rng_seed);
|
let mut rng = SmallRng::seed_from_u64(rng_seed);
|
||||||
|
|
||||||
let mut rand_gt = move |min: u64| {
|
let mut rand_gt = move |min: u64| {
|
||||||
let mut product = 1u64;
|
let mut product = 1_u64;
|
||||||
let mut factors = Vec::new();
|
let mut factors = Vec::new();
|
||||||
while product < min {
|
while product < min {
|
||||||
// log distribution---higher probability for lower numbers
|
// log distribution---higher probability for lower numbers
|
||||||
let factor;
|
let factor;
|
||||||
loop {
|
loop {
|
||||||
let next = rng.gen_range(0f64, LOG_PRIMES).exp2().floor() as usize;
|
let next = rng.gen_range(0_f64, log_num_primes).exp2().floor() as usize;
|
||||||
if next < NUM_PRIMES {
|
if next < NUM_PRIMES {
|
||||||
factor = primes[next];
|
factor = primes[next];
|
||||||
break;
|
break;
|
||||||
|
@ -106,7 +109,8 @@ fn test_random_big() {
|
||||||
.as_secs();
|
.as_secs();
|
||||||
println!("rng_seed={:?}", rng_seed);
|
println!("rng_seed={:?}", rng_seed);
|
||||||
let mut rng = SmallRng::seed_from_u64(rng_seed);
|
let mut rng = SmallRng::seed_from_u64(rng_seed);
|
||||||
let bitrange_1 = Uniform::new(14usize, 51);
|
|
||||||
|
let bitrange_1 = Uniform::new(14_usize, 51);
|
||||||
let mut rand_64 = move || {
|
let mut rand_64 = move || {
|
||||||
// first, choose a random number of bits for the first factor
|
// first, choose a random number of bits for the first factor
|
||||||
let f_bit_1 = bitrange_1.sample(&mut rng);
|
let f_bit_1 = bitrange_1.sample(&mut rng);
|
||||||
|
@ -116,11 +120,11 @@ fn test_random_big() {
|
||||||
// we will have a number of additional factors equal to nfacts + 1
|
// we will have a number of additional factors equal to nfacts + 1
|
||||||
// where nfacts is in [0, floor(rem/14) ) NOTE half-open interval
|
// where nfacts is in [0, floor(rem/14) ) NOTE half-open interval
|
||||||
// Each prime factor is at least 14 bits, hence floor(rem/14)
|
// Each prime factor is at least 14 bits, hence floor(rem/14)
|
||||||
let nfacts = Uniform::new(0usize, rem / 14).sample(&mut rng);
|
let nfacts = Uniform::new(0_usize, rem / 14).sample(&mut rng);
|
||||||
// we have to distribute extrabits among the (nfacts + 1) values
|
// we have to distribute extrabits among the (nfacts + 1) values
|
||||||
let extrabits = rem - (nfacts + 1) * 14;
|
let extrabits = rem - (nfacts + 1) * 14;
|
||||||
// (remember, a Range is a half-open interval)
|
// (remember, a Range is a half-open interval)
|
||||||
let extrarange = Uniform::new(0usize, extrabits + 1);
|
let extrarange = Uniform::new(0_usize, extrabits + 1);
|
||||||
|
|
||||||
// to generate an even split of this range, generate n-1 random elements
|
// to generate an even split of this range, generate n-1 random elements
|
||||||
// in the range, add the desired total value to the end, sort this list,
|
// in the range, add the desired total value to the end, sort this list,
|
||||||
|
@ -147,7 +151,7 @@ fn test_random_big() {
|
||||||
let f_bits = f_bits;
|
let f_bits = f_bits;
|
||||||
|
|
||||||
let mut nbits = 0;
|
let mut nbits = 0;
|
||||||
let mut product = 1u64;
|
let mut product = 1_u64;
|
||||||
let mut factors = Vec::new();
|
let mut factors = Vec::new();
|
||||||
for bit in f_bits {
|
for bit in f_bits {
|
||||||
assert!(bit < 37);
|
assert!(bit < 37);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue