Add subtraction.
This commit is contained in:
@@ -460,6 +460,62 @@ impl<'a,'b> Add<&'a U512> for &'b U512 {
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
impl SubAssign<U512> for U512 {
|
||||||
|
fn sub_assign(&mut self, rhs: U512) {
|
||||||
|
self.sub_assign(&rhs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> SubAssign<&'a U512> for U512 {
|
||||||
|
fn sub_assign(&mut self, rhs: &U512) {
|
||||||
|
let negated_rhs = !rhs;
|
||||||
|
let inverse_rhs = negated_rhs + U512::from_u64(1);
|
||||||
|
self.add_assign(inverse_rhs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sub<U512> for U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn sub(self, rhs: U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.sub_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Sub<U512> for &'a U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn sub(self, rhs: U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.sub_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Sub<&'a U512> for U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn sub(self, rhs: &U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.sub_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a,'b> Sub<&'a U512> for &'b U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn sub(self, rhs: &U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.sub_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
impl MulAssign<U512> for U512 {
|
impl MulAssign<U512> for U512 {
|
||||||
fn mul_assign(&mut self, rhs: U512) {
|
fn mul_assign(&mut self, rhs: U512) {
|
||||||
self.mul_assign(&rhs);
|
self.mul_assign(&rhs);
|
||||||
@@ -795,6 +851,31 @@ mod test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sub_tests() {
|
||||||
|
assert_eq!(U512{ contents: [1,1,1,1,1,1,1,1] } -
|
||||||
|
U512{ contents: [1,1,1,1,1,1,1,1] },
|
||||||
|
U512{ contents: [0,0,0,0,0,0,0,0] });
|
||||||
|
assert_eq!(U512{ contents: [0,1,0,0,0,0,0,0] } -
|
||||||
|
U512{ contents: [1,0,0,0,0,0,0,0] },
|
||||||
|
U512{ contents: [0xFFFFFFFFFFFFFFFF,0,0,0,0,0,0,0] });
|
||||||
|
assert_eq!(U512{ contents: [0,0,0,0,0,0,0,0] } -
|
||||||
|
U512{ contents: [1,0,0,0,0,0,0,0] },
|
||||||
|
U512{ contents: [0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF,
|
||||||
|
0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF,
|
||||||
|
0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF,
|
||||||
|
0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF] });
|
||||||
|
}
|
||||||
|
|
||||||
|
quickcheck! {
|
||||||
|
fn sub_destroys(a: U512) -> bool {
|
||||||
|
(&a - &a) == U512::zero()
|
||||||
|
}
|
||||||
|
fn sub_add_ident(a: U512, b: U512) -> bool {
|
||||||
|
((&a - &b) + &b) == a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn mul_tests() {
|
fn mul_tests() {
|
||||||
assert_eq!(U512{ contents: [1,0,0,0,0,0,0,0] } *
|
assert_eq!(U512{ contents: [1,0,0,0,0,0,0,0] } *
|
||||||
@@ -848,6 +929,9 @@ mod test {
|
|||||||
fn addmul_distribution(a: U512, b: U512, c: U512) -> bool {
|
fn addmul_distribution(a: U512, b: U512, c: U512) -> bool {
|
||||||
(&a * (&b + &c)) == ((&a * &b) + (&a * &c))
|
(&a * (&b + &c)) == ((&a * &b) + (&a * &c))
|
||||||
}
|
}
|
||||||
|
fn submul_distribution(a: U512, b: U512, c: U512) -> bool {
|
||||||
|
(&a * (&b - &c)) == ((&a * &b) - (&a * &c))
|
||||||
|
}
|
||||||
fn mul2shift1_equiv(a: U512) -> bool {
|
fn mul2shift1_equiv(a: U512) -> bool {
|
||||||
(&a << 1) == (&a * U512::from_u64(2))
|
(&a << 1) == (&a * U512::from_u64(2))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user