num_bigint_dig/algorithms/
mul.rs1use 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}