p521/arithmetic/field/
loose.rs1use super::{field_impl::*, FieldElement};
2use core::ops::Mul;
3
4pub(crate) struct LooseFieldElement(pub(super) fiat_p521_loose_field_element);
6
7impl LooseFieldElement {
8    pub(crate) const fn carry(&self) -> FieldElement {
10        FieldElement(fiat_p521_carry(&self.0))
11    }
12
13    pub(crate) const fn mul(&self, rhs: &Self) -> FieldElement {
15        FieldElement(fiat_p521_carry_mul(&self.0, &rhs.0))
16    }
17
18    pub(crate) const fn square(&self) -> FieldElement {
20        FieldElement(fiat_p521_carry_square(&self.0))
21    }
22}
23
24impl From<FieldElement> for LooseFieldElement {
25    #[inline]
26    fn from(tight: FieldElement) -> LooseFieldElement {
27        LooseFieldElement::from(&tight)
28    }
29}
30
31impl From<&FieldElement> for LooseFieldElement {
32    #[inline]
33    fn from(tight: &FieldElement) -> LooseFieldElement {
34        tight.relax()
35    }
36}
37
38impl From<LooseFieldElement> for FieldElement {
39    #[inline]
40    fn from(loose: LooseFieldElement) -> FieldElement {
41        FieldElement::from(&loose)
42    }
43}
44
45impl From<&LooseFieldElement> for FieldElement {
46    #[inline]
47    fn from(loose: &LooseFieldElement) -> FieldElement {
48        loose.carry()
49    }
50}
51
52impl Mul for LooseFieldElement {
53    type Output = FieldElement;
54
55    #[inline]
56    fn mul(self, rhs: LooseFieldElement) -> FieldElement {
57        Self::mul(&self, &rhs)
58    }
59}
60
61impl Mul<&LooseFieldElement> for LooseFieldElement {
62    type Output = FieldElement;
63
64    #[inline]
65    fn mul(self, rhs: &LooseFieldElement) -> FieldElement {
66        Self::mul(&self, rhs)
67    }
68}
69
70impl Mul<&LooseFieldElement> for &LooseFieldElement {
71    type Output = FieldElement;
72
73    #[inline]
74    fn mul(self, rhs: &LooseFieldElement) -> FieldElement {
75        LooseFieldElement::mul(self, rhs)
76    }
77}