Use existing utility functions
This commit is contained in:
parent
d9ed40e96d
commit
79c7c4a183
66
src/fq.rs
66
src/fq.rs
|
@ -72,6 +72,13 @@ fn adc2(a: u64, b: u64, carry: u64) -> (u64, u64) {
|
|||
(adc as u64, (adc >> 64) as u64)
|
||||
}
|
||||
|
||||
/// Compute a + b, returning the result and the carry over.
|
||||
#[inline(always)]
|
||||
fn overflowing_add(a: u64, b: u64) -> (u64, u64) {
|
||||
let (sum, overflow) = a.overflowing_add(b);
|
||||
(sum, overflow as u64)
|
||||
}
|
||||
|
||||
/// Compute a - (b + borrow), returning the result and setting borrow to
|
||||
/// the borrow value.
|
||||
#[inline(always)]
|
||||
|
@ -262,42 +269,16 @@ impl Fq {
|
|||
res
|
||||
}
|
||||
|
||||
/// Calculate a + (b * c) + carry, returning the least significant digit
|
||||
/// and setting carry to the most significant digit.
|
||||
#[inline(always)]
|
||||
fn mac_with_carry(a: u64, b: u64, c: u64, carry: &mut u64) -> u64 {
|
||||
let tmp = (u128::from(a)) + u128::from(b) * u128::from(c) + u128::from(*carry);
|
||||
|
||||
*carry = (tmp >> 64) as u64;
|
||||
|
||||
tmp as u64
|
||||
}
|
||||
|
||||
/// Calculate a + b + carry, returning the sum and modifying the
|
||||
/// carry value.
|
||||
#[inline(always)]
|
||||
fn adc(a: u64, b: u64, carry: &mut u64) -> u64 {
|
||||
let tmp = u128::from(a) + u128::from(b) + u128::from(*carry);
|
||||
|
||||
*carry = (tmp >> 64) as u64;
|
||||
|
||||
tmp as u64
|
||||
}
|
||||
|
||||
/// Squares this element.
|
||||
pub fn square_assign(&mut self) {
|
||||
let mut carry = 0;
|
||||
let r1 = Fq::mac_with_carry(0, self.0[0], self.0[1], &mut carry);
|
||||
let r2 = Fq::mac_with_carry(0, self.0[0], self.0[2], &mut carry);
|
||||
let r3 = Fq::mac_with_carry(0, self.0[0], self.0[3], &mut carry);
|
||||
let r4 = carry;
|
||||
let mut carry = 0;
|
||||
let r3 = Fq::mac_with_carry(r3, self.0[1], self.0[2], &mut carry);
|
||||
let r4 = Fq::mac_with_carry(r4, self.0[1], self.0[3], &mut carry);
|
||||
let r5 = carry;
|
||||
let mut carry = 0;
|
||||
let r5 = Fq::mac_with_carry(r5, self.0[2], self.0[3], &mut carry);
|
||||
let r6 = carry;
|
||||
let (r1, carry) = overflowing_mul(self.0[0], self.0[1]);
|
||||
let (r2, carry) = mac(carry, self.0[0], self.0[2]);
|
||||
let (r3, r4) = mac(carry, self.0[0], self.0[3]);
|
||||
|
||||
let (r3, carry) = mac(r3, self.0[1], self.0[2]);
|
||||
let (r4, r5) = mac_with_carry(r4, self.0[1], self.0[3], carry);
|
||||
|
||||
let (r5, r6) = mac(r5, self.0[2], self.0[3]);
|
||||
|
||||
let r7 = r6 >> 63;
|
||||
let r6 = (r6 << 1) | (r5 >> 63);
|
||||
|
@ -307,15 +288,14 @@ impl Fq {
|
|||
let r2 = (r2 << 1) | (r1 >> 63);
|
||||
let r1 = r1 << 1;
|
||||
|
||||
let mut carry = 0;
|
||||
let r0 = Fq::mac_with_carry(0, self.0[0], self.0[0], &mut carry);
|
||||
let r1 = Fq::adc(r1, 0, &mut carry);
|
||||
let r2 = Fq::mac_with_carry(r2, self.0[1], self.0[1], &mut carry);
|
||||
let r3 = Fq::adc(r3, 0, &mut carry);
|
||||
let r4 = Fq::mac_with_carry(r4, self.0[2], self.0[2], &mut carry);
|
||||
let r5 = Fq::adc(r5, 0, &mut carry);
|
||||
let r6 = Fq::mac_with_carry(r6, self.0[3], self.0[3], &mut carry);
|
||||
let r7 = Fq::adc(r7, 0, &mut carry);
|
||||
let (r0, carry) = overflowing_mul(self.0[0], self.0[0]);
|
||||
let (r1, carry) = overflowing_add(r1, carry);
|
||||
let (r2, carry) = mac_with_carry(r2, self.0[1], self.0[1], carry);
|
||||
let (r3, carry) = overflowing_add(r3, carry);
|
||||
let (r4, carry) = mac_with_carry(r4, self.0[2], self.0[2], carry);
|
||||
let (r5, carry) = overflowing_add(r5, carry);
|
||||
let (r6, carry) = mac_with_carry(r6, self.0[3], self.0[3], carry);
|
||||
let r7 = r7 + carry;
|
||||
|
||||
self.montgomery_reduce(r0, r1, r2, r3, r4, r5, r6, r7);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue