crypto_bigint/uint/modular/runtime_mod/
runtime_mul.rs

1use core::ops::{Mul, MulAssign};
2
3use crate::{
4    modular::mul::{mul_montgomery_form, square_montgomery_form},
5    traits::Square,
6};
7
8use super::DynResidue;
9
10impl<const LIMBS: usize> DynResidue<LIMBS> {
11    /// Multiplies by `rhs`.
12    pub const fn mul(&self, rhs: &Self) -> Self {
13        Self {
14            montgomery_form: mul_montgomery_form(
15                &self.montgomery_form,
16                &rhs.montgomery_form,
17                &self.residue_params.modulus,
18                self.residue_params.mod_neg_inv,
19            ),
20            residue_params: self.residue_params,
21        }
22    }
23
24    /// Computes the (reduced) square of a residue.
25    pub const fn square(&self) -> Self {
26        Self {
27            montgomery_form: square_montgomery_form(
28                &self.montgomery_form,
29                &self.residue_params.modulus,
30                self.residue_params.mod_neg_inv,
31            ),
32            residue_params: self.residue_params,
33        }
34    }
35}
36
37impl<const LIMBS: usize> Mul<&DynResidue<LIMBS>> for &DynResidue<LIMBS> {
38    type Output = DynResidue<LIMBS>;
39    fn mul(self, rhs: &DynResidue<LIMBS>) -> DynResidue<LIMBS> {
40        debug_assert_eq!(self.residue_params, rhs.residue_params);
41        self.mul(rhs)
42    }
43}
44
45impl<const LIMBS: usize> Mul<DynResidue<LIMBS>> for &DynResidue<LIMBS> {
46    type Output = DynResidue<LIMBS>;
47    #[allow(clippy::op_ref)]
48    fn mul(self, rhs: DynResidue<LIMBS>) -> DynResidue<LIMBS> {
49        self * &rhs
50    }
51}
52
53impl<const LIMBS: usize> Mul<&DynResidue<LIMBS>> for DynResidue<LIMBS> {
54    type Output = DynResidue<LIMBS>;
55    #[allow(clippy::op_ref)]
56    fn mul(self, rhs: &DynResidue<LIMBS>) -> DynResidue<LIMBS> {
57        &self * rhs
58    }
59}
60
61impl<const LIMBS: usize> Mul<DynResidue<LIMBS>> for DynResidue<LIMBS> {
62    type Output = DynResidue<LIMBS>;
63    fn mul(self, rhs: DynResidue<LIMBS>) -> DynResidue<LIMBS> {
64        &self * &rhs
65    }
66}
67
68impl<const LIMBS: usize> MulAssign<&DynResidue<LIMBS>> for DynResidue<LIMBS> {
69    fn mul_assign(&mut self, rhs: &DynResidue<LIMBS>) {
70        *self = *self * rhs;
71    }
72}
73
74impl<const LIMBS: usize> MulAssign<DynResidue<LIMBS>> for DynResidue<LIMBS> {
75    fn mul_assign(&mut self, rhs: DynResidue<LIMBS>) {
76        *self *= &rhs;
77    }
78}
79
80impl<const LIMBS: usize> Square for DynResidue<LIMBS> {
81    fn square(&self) -> Self {
82        DynResidue::square(self)
83    }
84}