#[cfg(limb_width_64)] pub(crate) fn from_u32(x: &[u32]) -> Vec<Limb> { letmut v = Vec::<Limb>::default(); for xi in x.chunks(2) { match xi.len() { 1 => v.push(xi[0] as u64), 2 => v.push(((xi[1] as u64) << 32) | (xi[0] as u64)),
_ => unreachable!(),
}
}
v
}
#[test] fn compare_test() { // Simple let x = Bigint {
data: from_u32(&[1]),
}; let y = Bigint {
data: from_u32(&[2]),
};
assert_eq!(x.compare(&y), cmp::Ordering::Less);
assert_eq!(x.compare(&x), cmp::Ordering::Equal);
assert_eq!(y.compare(&x), cmp::Ordering::Greater);
// Check asymmetric let x = Bigint {
data: from_u32(&[5, 1]),
}; let y = Bigint {
data: from_u32(&[2]),
};
assert_eq!(x.compare(&y), cmp::Ordering::Greater);
assert_eq!(x.compare(&x), cmp::Ordering::Equal);
assert_eq!(y.compare(&x), cmp::Ordering::Less);
// Check when we use reverse ordering properly. let x = Bigint {
data: from_u32(&[5, 1, 9]),
}; let y = Bigint {
data: from_u32(&[6, 2, 8]),
};
assert_eq!(x.compare(&y), cmp::Ordering::Greater);
assert_eq!(x.compare(&x), cmp::Ordering::Equal);
assert_eq!(y.compare(&x), cmp::Ordering::Less);
// Complex scenario, check it properly uses reverse ordering. let x = Bigint {
data: from_u32(&[0, 1, 9]),
}; let y = Bigint {
data: from_u32(&[4294967295, 0, 9]),
};
assert_eq!(x.compare(&y), cmp::Ordering::Greater);
assert_eq!(x.compare(&x), cmp::Ordering::Equal);
assert_eq!(y.compare(&x), cmp::Ordering::Less);
}
#[test] fn bit_length_test() { let x = Bigint {
data: from_u32(&[0, 0, 0, 1]),
};
assert_eq!(x.bit_length(), 97);
let x = Bigint {
data: from_u32(&[0, 0, 0, 3]),
};
assert_eq!(x.bit_length(), 98);
let x = Bigint {
data: from_u32(&[1 << 31]),
};
assert_eq!(x.bit_length(), 32);
}
#[test] fn iadd_small_test() { // Overflow check (single) // This should set all the internal data values to 0, the top // value to (1<<31), and the bottom value to (4>>1). // This is because the max_value + 1 leads to all 0s, we set the // topmost bit to 1. letmut x = Bigint {
data: from_u32(&[4294967295]),
};
x.iadd_small(5);
assert_eq!(x.data, from_u32(&[4, 1]));
// No overflow, single value letmut x = Bigint {
data: from_u32(&[5]),
};
x.iadd_small(7);
assert_eq!(x.data, from_u32(&[12]));
// Single carry, internal overflow letmut x = Bigint::from_u64(0x80000000FFFFFFFF);
x.iadd_small(7);
assert_eq!(x.data, from_u32(&[6, 0x80000001]));
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.