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