pub fn constrained_montgomery_mul<T>( a_mont: &T, b_mont: &T, modulus: &T, n_prime: &T, r_bits: usize, ) -> Twhere for<'a> T: Clone + Zero + One + PartialOrd + Shl<usize, Output = T> + Shr<usize, Output = T> + WrappingAdd + WrappingSub + for<'a> Rem<&'a T, Output = T> + RemAssign<&'a T> + Mul<&'a T, Output = T>, for<'a> &'a T: Rem<&'a T, Output = T> + BitAnd<Output = T>,
Montgomery multiplication (Constrained): (a * R) * (b * R) -> (a * b * R) mod N