crypto_bigint/uint/modular/runtime_mod/
runtime_mul.rs1use 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 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 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}