nessa/algorithms/
integer_ext.rs1use malachite::integer::random::uniform_random_integer_range;
2use malachite::Integer;
3use malachite::rounding_modes::RoundingMode;
4use malachite::num::conversion::traits::{RoundingFrom, SaturatingInto};
5use rand::RngCore;
6
7lazy_static! {
8 pub static ref ZERO: Integer = Integer::from(0);
9 pub static ref ONE: Integer = Integer::from(1);
10 pub static ref BYTE_MAX: Integer = Integer::from(255);
11 pub static ref USIZE_MAX: Integer = Integer::from(usize::MAX);
12 pub static ref U64_MAX: Integer = Integer::from(u64::MAX);
13}
14
15pub fn to_f64(n: &Integer) -> f64 {
16 f64::rounding_from(n, RoundingMode::Exact).0
17}
18
19pub fn to_usize(n: &Integer) -> usize {
20 n.saturating_into()
21}
22
23pub fn to_u32(n: &Integer) -> u32 {
24 n.saturating_into()
25}
26
27pub fn to_u64(n: &Integer) -> u64 {
28 n.saturating_into()
29}
30
31pub fn to_u8(n: &Integer) -> u8 {
32 n.saturating_into()
33}
34
35pub fn is_valid_index(n: &Integer) -> bool {
36 *n >= *ZERO && *n <= *USIZE_MAX
37}
38
39pub fn is_valid_byte(n: &Integer) -> bool {
40 *n >= *ZERO && *n <= *BYTE_MAX
41}
42
43pub fn truncate(n: &Integer) -> Integer {
44 n & &*U64_MAX
45}
46
47pub fn randint(f: Integer, t: Integer) -> Integer {
48 let mut bytes = [0; 32];
49 rand::thread_rng().fill_bytes(&mut bytes);
50 let s = malachite::random::Seed { bytes };
51
52 let mut r = uniform_random_integer_range(s, f, t);
53 r.next().unwrap()
54}