#[test] fn cmp_test() { // Simple let x = VecType::from_u64(1); let y = VecType::from_u64(2);
assert_eq!(x.partial_cmp(&x), Some(cmp::Ordering::Equal));
assert_eq!(x.cmp(&x), cmp::Ordering::Equal);
assert_eq!(x.cmp(&y), cmp::Ordering::Less);
// Check asymmetric let x = VecType::try_from(&[5, 1]).unwrap(); let y = VecType::from_u64(2);
assert_eq!(x.cmp(&x), cmp::Ordering::Equal);
assert_eq!(x.cmp(&y), cmp::Ordering::Greater);
// Check when we use reverse ordering properly. let x = VecType::try_from(&[5, 1, 9]).unwrap(); let y = VecType::try_from(&[6, 2, 8]).unwrap();
assert_eq!(x.cmp(&x), cmp::Ordering::Equal);
assert_eq!(x.cmp(&y), cmp::Ordering::Greater);
// Complex scenario, check it properly uses reverse ordering. let x = VecType::try_from(&[0, 1, 9]).unwrap(); let y = VecType::try_from(&[4294967295, 0, 9]).unwrap();
assert_eq!(x.cmp(&x), cmp::Ordering::Equal);
assert_eq!(x.cmp(&y), cmp::Ordering::Greater);
}
letmut x = VecType::from_u64(0xFFFFFFFF); let y = VecType::from_u64(5);
x *= &y; let expected: VecType = vec_from_u32(&[0xFFFFFFFB, 0x4]);
assert_eq!(&*x, &*expected);
// Test with carry letmut x = VecType::from_u64(1);
assert_eq!(&*x, &[1]);
x.add_small(LIMB_MAX);
assert_eq!(&*x, &[0, 1]);
}
#[test] fn large_add_test() { // Overflow, both single values letmut x = VecType::from_u64(4294967295); let y = VecType::from_u64(5);
bigint::large_add(&mut x, &y); let expected: VecType = vec_from_u32(&[4, 1]);
assert_eq!(&*x, &*expected);
// No overflow, single value letmut x = VecType::from_u64(5); let y = VecType::from_u64(7);
bigint::large_add(&mut x, &y); let expected = VecType::from_u64(12);
assert_eq!(&*x, &*expected);
// Single carry, internal overflow letmut x = VecType::from_u64(0x80000000FFFFFFFF); let y = VecType::from_u64(7);
bigint::large_add(&mut x, &y); let expected: VecType = vec_from_u32(&[6, 0x80000001]);
assert_eq!(&*x, &*expected);
// 1st overflows, 2nd doesn't. letmut x = VecType::from_u64(0x7FFFFFFFFFFFFFFF); let y = VecType::from_u64(0x7FFFFFFFFFFFFFFF);
bigint::large_add(&mut x, &y); let expected: VecType = vec_from_u32(&[0xFFFFFFFE, 0xFFFFFFFF]);
assert_eq!(&*x, &*expected);
// Both overflow. letmut x = VecType::from_u64(0x8FFFFFFFFFFFFFFF); let y = VecType::from_u64(0x7FFFFFFFFFFFFFFF);
bigint::large_add(&mut x, &y); let expected: VecType = vec_from_u32(&[0xFFFFFFFE, 0x0FFFFFFF, 1]);
assert_eq!(&*x, &*expected);
}
#[test] fn large_mul_test() { // Test by empty letmut x = VecType::from_u64(0xFFFFFFFF); let y = VecType::new();
bigint::large_mul(&mut x, &y); let expected = VecType::new();
assert_eq!(&*x, &*expected);
// Simple case letmut x = VecType::from_u64(0xFFFFFFFF); let y = VecType::from_u64(5);
bigint::large_mul(&mut x, &y); let expected: VecType = vec_from_u32(&[0xFFFFFFFB, 0x4]);
assert_eq!(&*x, &*expected);
// Large u32, but still just as easy. letmut x = VecType::from_u64(0xFFFFFFFF); let y = VecType::from_u64(0xFFFFFFFE);
bigint::large_mul(&mut x, &y); let expected: VecType = vec_from_u32(&[0x2, 0xFFFFFFFD]);
assert_eq!(&*x, &*expected);
// Let's multiply two large values together. letmut x: VecType = vec_from_u32(&[0xFFFFFFFE, 0x0FFFFFFF, 1]); let y: VecType = vec_from_u32(&[0x99999999, 0x99999999, 0xCCCD9999, 0xCCCC]);
bigint::large_mul(&mut x, &y); let expected: VecType =
vec_from_u32(&[0xCCCCCCCE, 0x5CCCCCCC, 0x9997FFFF, 0x33319999, 0x999A7333, 0xD999]);
assert_eq!(&*x, &*expected);
}
#[test] fn very_large_mul_test() { // Test cases triggered to that would normally use `karatsuba_mul`. // Karatsuba multiplication was ripped out, however, these are useful // test cases. letmut x: VecType = vec_from_u32(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); let y: VecType = vec_from_u32(&[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]);
bigint::large_mul(&mut x, &y); let expected: VecType = vec_from_u32(&[ 4, 13, 28, 50, 80, 119, 168, 228, 300, 385, 484, 598, 728, 875, 1040, 1224, 1340, 1435, 1508, 1558, 1584, 1585, 1560, 1508, 1428, 1319, 1180, 1010, 808, 573, 304,
]);
assert_eq!(&*x, &*expected);
#[test] fn shl_test() { // Pattern generated via `''.join(["1" +"0"*i for i in range(20)])` letmut x = VecType::from_u64(0xD2210408);
bigint::shl(&mut x, 5); let expected: VecType = vec_from_u32(&[0x44208100, 0x1A]);
assert_eq!(&*x, &*expected);
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.