num_bigint_dig/algorithms/
mul.rs

1use crate::algorithms::mac3;
2use crate::big_digit::{BigDigit, DoubleBigDigit, BITS};
3use crate::BigUint;
4
5#[inline]
6pub fn mul_with_carry(a: BigDigit, b: BigDigit, acc: &mut DoubleBigDigit) -> BigDigit {
7    *acc += (a as DoubleBigDigit) * (b as DoubleBigDigit);
8    let lo = *acc as BigDigit;
9    *acc >>= BITS;
10    lo
11}
12
13pub fn mul3(x: &[BigDigit], y: &[BigDigit]) -> BigUint {
14    let len = x.len() + y.len() + 1;
15    let mut prod = BigUint {
16        data: smallvec![0; len],
17    };
18
19    mac3(&mut prod.data[..], x, y);
20    prod.normalized()
21}
22
23pub fn scalar_mul(a: &mut [BigDigit], b: BigDigit) -> BigDigit {
24    let mut carry = 0;
25    for a in a.iter_mut() {
26        *a = mul_with_carry(*a, b, &mut carry);
27    }
28    carry as BigDigit
29}