Skip to content

Commit 113e939

Browse files
committed
do not convert carry/borrow to/from DoubleBigDigit
1 parent 66f9d0e commit 113e939

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

src/algorithms.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ pub mod big_digit {
2121
/// size is the double of the size of `BigDigit`.
2222
pub type DoubleBigDigit = u64;
2323

24+
/// A `SignedDoubleBigDigit` is the signed version of `DoubleBigDigit`.
25+
pub type SignedDoubleBigDigit = i64;
26+
2427
pub const ZERO_BIG_DIGIT: BigDigit = 0;
2528

2629
// `DoubleBigDigit` size dependent
@@ -51,47 +54,44 @@ pub mod big_digit {
5154
}
5255
}
5356

54-
use big_digit::{BigDigit, DoubleBigDigit};
57+
use big_digit::{BigDigit, DoubleBigDigit, SignedDoubleBigDigit};
5558

5659
// Generic functions for add/subtract/multiply with carry/borrow:
5760

5861
// Add with carry:
5962
#[inline]
60-
fn adc(a: BigDigit, b: BigDigit, carry: &mut BigDigit) -> BigDigit {
61-
let (hi, lo) = big_digit::from_doublebigdigit((a as DoubleBigDigit) + (b as DoubleBigDigit) +
62-
(*carry as DoubleBigDigit));
63-
64-
*carry = hi;
63+
fn adc(a: BigDigit, b: BigDigit, acc: &mut DoubleBigDigit) -> BigDigit {
64+
*acc += a as DoubleBigDigit;
65+
*acc += b as DoubleBigDigit;
66+
let lo = *acc as BigDigit;
67+
*acc >>= big_digit::BITS;
6568
lo
6669
}
6770

6871
// Subtract with borrow:
6972
#[inline]
70-
fn sbb(a: BigDigit, b: BigDigit, borrow: &mut BigDigit) -> BigDigit {
71-
let (hi, lo) = big_digit::from_doublebigdigit(big_digit::BASE + (a as DoubleBigDigit) -
72-
(b as DoubleBigDigit) -
73-
(*borrow as DoubleBigDigit));
74-
// hi * (base) + lo == 1*(base) + ai - bi - borrow
75-
// => ai - bi - borrow < 0 <=> hi == 0
76-
*borrow = (hi == 0) as BigDigit;
73+
fn sbb(a: BigDigit, b: BigDigit, acc: &mut SignedDoubleBigDigit) -> BigDigit {
74+
*acc += a as SignedDoubleBigDigit;
75+
*acc -= b as SignedDoubleBigDigit;
76+
let lo = *acc as BigDigit;
77+
*acc >>= big_digit::BITS;
7778
lo
7879
}
7980

8081
#[inline]
81-
pub fn mac_with_carry(a: BigDigit, b: BigDigit, c: BigDigit, carry: &mut BigDigit) -> BigDigit {
82-
let (hi, lo) = big_digit::from_doublebigdigit((a as DoubleBigDigit) +
83-
(b as DoubleBigDigit) * (c as DoubleBigDigit) +
84-
(*carry as DoubleBigDigit));
85-
*carry = hi;
82+
pub fn mac_with_carry(a: BigDigit, b: BigDigit, c: BigDigit, acc: &mut DoubleBigDigit) -> BigDigit {
83+
*acc += a as DoubleBigDigit;
84+
*acc += (b as DoubleBigDigit) * (c as DoubleBigDigit);
85+
let lo = *acc as BigDigit;
86+
*acc >>= big_digit::BITS;
8687
lo
8788
}
8889

8990
#[inline]
90-
pub fn mul_with_carry(a: BigDigit, b: BigDigit, carry: &mut BigDigit) -> BigDigit {
91-
let (hi, lo) = big_digit::from_doublebigdigit((a as DoubleBigDigit) * (b as DoubleBigDigit) +
92-
(*carry as DoubleBigDigit));
93-
94-
*carry = hi;
91+
pub fn mul_with_carry(a: BigDigit, b: BigDigit, acc: &mut DoubleBigDigit) -> BigDigit {
92+
*acc += (a as DoubleBigDigit) * (b as DoubleBigDigit);
93+
let lo = *acc as BigDigit;
94+
*acc >>= big_digit::BITS;
9595
lo
9696
}
9797

@@ -141,7 +141,7 @@ pub fn __add2(a: &mut [BigDigit], b: &[BigDigit]) -> BigDigit {
141141
}
142142
}
143143

144-
carry
144+
carry as BigDigit
145145
}
146146

147147
/// /Two argument addition of raw slices:
@@ -446,7 +446,7 @@ pub fn scalar_mul(a: &mut [BigDigit], b: BigDigit) -> BigDigit {
446446
for a in a.iter_mut() {
447447
*a = mul_with_carry(*a, b, &mut carry);
448448
}
449-
carry
449+
carry as BigDigit
450450
}
451451

452452
pub fn div_rem(u: &BigUint, d: &BigUint) -> (BigUint, BigUint) {

0 commit comments

Comments
 (0)