crypto_bigint/uint/boxed/neg.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
//! [`BoxedUint`] negation operations.
use crate::{BoxedUint, Limb, WideWord, Word, WrappingNeg};
impl BoxedUint {
/// Perform wrapping negation.
pub fn wrapping_neg(&self) -> Self {
let mut ret = vec![Limb::ZERO; self.nlimbs()];
let mut carry = 1;
for i in 0..self.nlimbs() {
let r = (!self.limbs[i].0 as WideWord) + carry;
ret[i] = Limb(r as Word);
carry = r >> Limb::BITS;
}
ret.into()
}
}
impl WrappingNeg for BoxedUint {
fn wrapping_neg(&self) -> Self {
self.wrapping_neg()
}
}
#[cfg(test)]
mod tests {
use crate::BoxedUint;
#[test]
fn wrapping_neg() {
assert_eq!(BoxedUint::zero().wrapping_neg(), BoxedUint::zero());
assert_eq!(BoxedUint::max(64).wrapping_neg(), BoxedUint::one());
// assert_eq!(
// BoxedUint::from(13u64).wrapping_neg(),
// BoxedUint::from(13u64).not().saturating_add(&BoxedUint::one())
// );
// assert_eq!(
// BoxedUint::from(42u64).wrapping_neg(),
// BoxedUint::from(42u64).saturating_sub(&BoxedUint::one()).not()
// );
}
}