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}