use num_bigint::Sign::Plus; use num_bigint::{BigInt, ToBigInt}; use num_bigint::{BigUint, ToBigUint}; use num_integer::Integer;
use std::cmp::Ordering::{Equal, Greater, Less}; use std::collections::hash_map::RandomState; use std::hash::{BuildHasher, Hash, Hasher}; use std::iter::repeat; use std::str::FromStr; use std::{f32, f64};
#[test] fn test_to_bytes_be() { fn check(s: &str, result: &str) { let b = BigUint::parse_bytes(result.as_bytes(), 10).unwrap();
assert_eq!(b.to_bytes_be(), s.as_bytes());
assert_eq!(<BigUint as ToBytes>::to_be_bytes(&b), s.as_bytes());
}
check("A", "65");
check("AA", "16705");
check("AB", "16706");
check("Hello world!", "22405534230753963835153736737"); let b: BigUint = Zero::zero();
assert_eq!(b.to_bytes_be(), [0]);
// Test with leading/trailing zero bytes and a full BigDigit of value 0 let b = BigUint::from_str_radix("00010000000000000200", 16).unwrap();
assert_eq!(b.to_bytes_be(), [1, 0, 0, 0, 0, 0, 0, 2, 0]);
}
#[test] fn test_to_bytes_le() { fn check(s: &str, result: &str) { let b = BigUint::parse_bytes(result.as_bytes(), 10).unwrap();
assert_eq!(b.to_bytes_le(), s.as_bytes());
assert_eq!(<BigUint as ToBytes>::to_le_bytes(&b), s.as_bytes());
}
check("A", "65");
check("AA", "16705");
check("BA", "16706");
check("!dlrow olleH", "22405534230753963835153736737"); let b: BigUint = Zero::zero();
assert_eq!(b.to_bytes_le(), [0]);
// Test with leading/trailing zero bytes and a full BigDigit of value 0 let b = BigUint::from_str_radix("00010000000000000200", 16).unwrap();
assert_eq!(b.to_bytes_le(), [0, 2, 0, 0, 0, 0, 0, 0, 1]);
}
#[test] fn test_cmp() { let data: [&[_]; 7] = [&[], &[1], &[2], &[! style='color: green'>0], &[0, 1], &[>2, 1], &[1, 1, 1]]; let data: Vec<BigUint> = data.iter().map(|v| BigUint::from_slice(*v)).collect(); for (i, ni) in data.iter().enumerate() { for (j0, nj) in data[i..].iter().enumerate() { let j = j0 + i; if i == j {
assert_eq!(ni.cmp(nj), Equal);
assert_eq!(nj.cmp(ni), Equal);
assert_eq!(ni, nj);
assert!(!(ni != nj));
assert!(ni <= nj);
assert!(ni >= nj);
assert!(!(ni < nj));
assert!(!(ni > nj));
} else {
assert_eq!(ni.cmp(nj), Less);
assert_eq!(nj.cmp(ni), Greater);
let a = BigUint::new(vec![]); let b = BigUint::new(vec![0]); let c = BigUint::new(vec![1]); let d = BigUint::new(vec![1, 0, 0, 0, 0, 0]); let e = BigUint::new(vec![0, 0, 0, 0, 0, 1]);
assert!(hash(&a) == hash(&b));
assert!(hash(&b) != hash(&c));
assert!(hash(&c) == hash(&d));
assert!(hash(&d) != hash(&e));
}
#[test] fn test_bitand() { for elm in BIT_TESTS { let (a_vec, b_vec, c_vec, _, _) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(a & b == c);
assert_op!(b & a == c);
assert_assign_op!(a &= b == c);
assert_assign_op!(b &= a == c);
}
}
#[test] fn test_bitor() { for elm in BIT_TESTS { let (a_vec, b_vec, _, c_vec, _) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(a | b == c);
assert_op!(b | a == c);
assert_assign_op!(a |= b == c);
assert_assign_op!(b |= a == c);
}
}
#[test] fn test_bitxor() { for elm in BIT_TESTS { let (a_vec, b_vec, _, _, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(a ^ b == c);
assert_op!(b ^ a == c);
assert_op!(a ^ c == b);
assert_op!(c ^ a == b);
assert_op!(b ^ c == a);
assert_op!(c ^ b == a);
assert_assign_op!(a ^= b == c);
assert_assign_op!(b ^= a == c);
assert_assign_op!(a ^= c == b);
assert_assign_op!(c ^= a == b);
assert_assign_op!(b ^= c == a);
assert_assign_op!(c ^= b == a);
}
}
// keeping all 24 digits with the bits at different offsets to the BigDigits let x: u32 = 0b00000000101111011111011011011101; letmut f = x as f32; letmut b = BigUint::from(x); for _ in0..64 {
check(&b, f);
f *= 2.0;
b <<= 1;
}
// this number when rounded to f64 then f32 isn't the same as when rounded straight to f32 let n: u64 = 0b0000000000111111111111111111111111011111111111111111111111111111;
assert!((n as f64) as f32 != n as f32);
assert_eq!(BigUint::from(n).to_f32(), Some(n as f32));
// test rounding up with the bits at different offsets to the BigDigits letmut f = ((1u64 << 25) - 1) as f32; letmut b = BigUint::from(1u64 << 25); for _ in0..64 {
assert_eq!(b.to_f32(), Some(f));
f *= 2.0;
b <<= 1;
}
// test correct ties-to-even rounding let weird: i128 = (1i128 << 100) + (1i128 << (100 - f32::MANTISSA_DIGITS));
assert_ne!(weird as f32, (weird + 1) as f32);
assert_eq!(BigInt::from(weird).to_f32(), Some(weird as f32));
assert_eq!(BigInt::from(weird + 1).to_f32(), Some((weird + 1) as f32));
// largest BigUint that will round to a finite f32 value let big_num = (BigUint::one() << 128u8) - 1u8 - (BigUint::one() << (128u8 - 25));
assert_eq!(big_num.to_f32(), Some(f32::MAX));
assert_eq!((big_num + 1u8).to_f32(), Some(f32::INFINITY));
// keeping all 53 digits with the bits at different offsets to the BigDigits let x: u64 = 0b0000000000011110111110110111111101110111101111011111011011011101; letmut f = x as f64; letmut b = BigUint::from(x); for _ in0..128 {
check(&b, f);
f *= 2.0;
b <<= 1;
}
// test rounding up with the bits at different offsets to the BigDigits letmut f = ((1u64 << 54) - 1) as f64; letmut b = BigUint::from(1u64 << 54); for _ in0..128 {
assert_eq!(b.to_f64(), Some(f));
f *= 2.0;
b <<= 1;
}
// test correct ties-to-even rounding let weird: i128 = (1i128 << 100) + (1i128 << (100 - f64::MANTISSA_DIGITS));
assert_ne!(weird as f64, (weird + 1) as f64);
assert_eq!(BigInt::from(weird).to_f64(), Some(weird as f64));
assert_eq!(BigInt::from(weird + 1).to_f64(), Some((weird + 1) as f64));
// largest BigUint that will round to a finite f64 value let big_num = (BigUint::one() << 1024u16) - 1u8 - (BigUint::one() << (1024u16 - 54));
assert_eq!(big_num.to_f64(), Some(f64::MAX));
assert_eq!((big_num + 1u8).to_f64(), Some(f64::INFINITY));
check!(u8, BigUint::from_slice(&[u8::MAX as u32]));
check!(u16, BigUint::from_slice(&[u16::MAX as u32]));
check!(u32, BigUint::from_slice(&[u32::MAX]));
check!(u64, BigUint::from_slice(&[u32::MAX, u32::MAX]));
check!(
u128,
BigUint::from_slice(&[u32::MAX, u32::MAX, u32::MAX, u32::MAX])
);
check!(usize, BigUint::from(usize::MAX as u64));
}
#[test] fn test_add() { for elm in SUM_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(a + b == c);
assert_op!(b + a == c);
assert_assign_op!(a += b == c);
assert_assign_op!(b += a == c);
}
}
#[test] fn test_sub() { for elm in SUM_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(c - a == b);
assert_op!(c - b == a);
assert_assign_op!(c -= a == b);
assert_assign_op!(c -= b == a);
}
}
#[test] #[should_panic] fn test_sub_fail_on_underflow() { let (a, b): (BigUint, BigUint) = (Zero::zero(), One::one()); let _ = a - b;
}
#[test] fn test_mul() { for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
assert_op!(a * b == c);
assert_op!(b * a == c);
assert_assign_op!(a *= b == c);
assert_assign_op!(b *= a == c);
}
for elm in DIV_REM_QUADRUPLES.iter() { let (a_vec, b_vec, c_vec, d_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec); let d = BigUint::from_slice(d_vec);
#[test] fn test_div_rem() { for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
if !a.is_zero() {
assert_op!(c / a == b);
assert_op!(c % a == BigUint::zero());
assert_assign_op!(c /= a == b);
assert_assign_op!(c %= a == BigUint::zero());
assert_eq!(c.div_rem(&a), (b.clone(), BigUint::zero()));
} if !b.is_zero() {
assert_op!(c / b == a);
assert_op!(c % b == BigUint::zero());
assert_assign_op!(c /= b == a);
assert_assign_op!(c %= b == BigUint::zero());
assert_eq!(c.div_rem(&b), (a.clone(), BigUint::zero()));
}
}
for elm in DIV_REM_QUADRUPLES.iter() { let (a_vec, b_vec, c_vec, d_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec); let d = BigUint::from_slice(d_vec);
if !b.is_zero() {
assert_op!(a / b == c);
assert_op!(a % b == d);
assert_assign_op!(a /= b == c);
assert_assign_op!(a %= b == d);
assert!(a.div_rem(&b) == (c, d));
}
}
}
#[test] fn test_div_rem_big_multiple() { let a = BigUint::from(3u32).pow(100u32); let a2 = &a * &a;
let (div, rem) = a2.div_rem(&a);
assert_eq!(div, a);
assert!(rem.is_zero());
for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
if !a.is_zero() {
check(&c, &a, &b, &Zero::zero());
} if !b.is_zero() {
check(&c, &b, &a, &Zero::zero());
}
}
for elm in DIV_REM_QUADRUPLES.iter() { let (a_vec, b_vec, c_vec, d_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec); let d = BigUint::from_slice(d_vec);
for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
if !a.is_zero() {
check(&c, &a, &b, &Zero::zero());
} if !b.is_zero() {
check(&c, &b, &a, &Zero::zero());
}
}
for elm in DIV_REM_QUADRUPLES.iter() { let (a_vec, b_vec, c_vec, d_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec); let d = BigUint::from_slice(d_vec);
if !b.is_zero() {
check(&a, &b, &c, &d);
}
}
}
#[test] fn test_checked_add() { for elm in SUM_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
#[test] fn test_checked_sub() { for elm in SUM_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
if a > c {
assert!(a.checked_sub(&c).is_none());
} if b > c {
assert!(b.checked_sub(&c).is_none());
}
}
}
#[test] fn test_checked_mul() { for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
for elm in DIV_REM_QUADRUPLES.iter() { let (a_vec, b_vec, c_vec, d_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec); let d = BigUint::from_slice(d_vec);
#[test] fn test_mul_overflow() { // Test for issue #187 - overflow due to mac3 incorrectly sizing temporary let s = "5311379928167670986895882065524686273295931177270319231994441382\ 0040355986085224273916250223263671004753755210595137000079652876\ 0829212940754539968588340162273730474622005920097370111"; let a: BigUint = s.parse().unwrap(); let b = a.clone(); let _ = a.checked_mul(&b);
}
#[test] fn test_mul_overflow_2() { // Try a bunch of sizes that are right on the edge of multiplication length // overflow, where (x * x).data.len() == 2 * x.data.len() + 1. for i in1u8..20 { let bits = 1u32 << i; let x = (BigUint::one() << bits) - 1u32; let x2 = (BigUint::one() << (2 * bits)) - &x - &x - 1u32;
assert_eq!(&x * &x, x2);
}
}
#[test] fn test_checked_div() { for elm in MUL_TRIPLES.iter() { let (a_vec, b_vec, c_vec) = *elm; let a = BigUint::from_slice(a_vec); let b = BigUint::from_slice(b_vec); let c = BigUint::from_slice(c_vec);
if !a.is_zero() {
assert!(c.checked_div(&a).unwrap() == b);
} if !b.is_zero() {
assert!(c.checked_div(&b).unwrap() == a);
}
#[test] fn test_to_str_radix() { let r = to_str_pairs(); for num_pair in r.iter() { let &(ref n, ref rs) = num_pair; for str_pair in rs.iter() { let &(ref radix, ref str) = str_pair;
assert_eq!(n.to_str_radix(*radix), *str);
}
}
}
#[test] fn test_from_str_radix() { let r = to_str_pairs(); for num_pair in r.iter() { let &(ref n, ref rs) = num_pair; for str_pair in rs.iter() { let &(ref radix, ref str) = str_pair;
assert_eq!(n, &BigUint::from_str_radix(str, *radix).unwrap());
}
}
let zed = BigUint::from_str_radix("Z", 10).ok();
assert_eq!(zed, None); let blank = BigUint::from_str_radix("_", 2).ok();
assert_eq!(blank, None); let blank_one = BigUint::from_str_radix("_1", 2).ok();
assert_eq!(blank_one, None); let plus_one = BigUint::from_str_radix("+1", 10).ok();
assert_eq!(plus_one, Some(BigUint::from_slice(&[1]))); let plus_plus_one = BigUint::from_str_radix("++1", 10).ok();
assert_eq!(plus_plus_one, None); let minus_one = BigUint::from_str_radix("-1", 10).ok();
assert_eq!(minus_one, None); let zero_plus_two = BigUint::from_str_radix("0+2", 10).ok();
assert_eq!(zero_plus_two, None); let three = BigUint::from_str_radix("1_1", 2).ok();
assert_eq!(three, Some(BigUint::from_slice(&[3]))); let ff = BigUint::from_str_radix("1111_1111", 2).ok();
assert_eq!(ff, Some(BigUint::from_slice(&[0xff])));
}
#[test] fn test_all_str_radix() { let n = BigUint::new((0..10).collect()); for radix in2..37 { let s = n.to_str_radix(radix); let x = BigUint::from_str_radix(&s, radix);
assert_eq!(x.unwrap(), n);
let s = s.to_ascii_uppercase(); let x = BigUint::from_str_radix(&s, radix);
assert_eq!(x.unwrap(), n);
}
}
#[test] fn test_big_str() { for n in2..=20_u32 { let x: BigUint = BigUint::from(n).pow(10_000_u32); let s = x.to_string(); let y: BigUint = s.parse().unwrap();
assert_eq!(x, y);
}
}
#[test] fn test_lower_hex() { let a = BigUint::parse_bytes(b"A", 16).unwrap(); let hello = BigUint::parse_bytes(b"22405534230753963835153736737", 10).unwrap();
#[test] fn test_upper_hex() { let a = BigUint::parse_bytes(b"A", 16).unwrap(); let hello = BigUint::parse_bytes(b"22405534230753963835153736737", 10).unwrap();
#[test] fn test_octal() { let a = BigUint::parse_bytes(b"A", 16).unwrap(); let hello = BigUint::parse_bytes(b"22405534230753963835153736737", 10).unwrap();
#[test] fn test_display() { let a = BigUint::parse_bytes(b"A", 16).unwrap(); let hello = BigUint::parse_bytes(b"22405534230753963835153736737", 10).unwrap();
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.33Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.