snarkvm_console_types_group/
arithmetic.rs1use super::*;
17
18impl<E: Environment> Neg for Group<E> {
19 type Output = Group<E>;
20
21 #[inline]
23 fn neg(self) -> Self::Output {
24 Group::from_projective(-self.group)
25 }
26}
27
28impl<E: Environment> Add<Group<E>> for Group<E> {
29 type Output = Group<E>;
30
31 #[inline]
33 fn add(self, other: Group<E>) -> Self::Output {
34 Group::from_projective(self.group + other.group)
35 }
36}
37
38impl<E: Environment> Add<&Group<E>> for Group<E> {
39 type Output = Group<E>;
40
41 #[inline]
43 fn add(self, other: &Group<E>) -> Self::Output {
44 Group::from_projective(self.group + other.group)
45 }
46}
47
48impl<E: Environment> AddAssign<Group<E>> for Group<E> {
49 #[inline]
51 fn add_assign(&mut self, other: Group<E>) {
52 self.group += other.group;
53 }
54}
55
56impl<E: Environment> AddAssign<&Group<E>> for Group<E> {
57 #[inline]
59 fn add_assign(&mut self, other: &Group<E>) {
60 self.group += other.group;
61 }
62}
63
64impl<E: Environment> Sub<Group<E>> for Group<E> {
65 type Output = Group<E>;
66
67 #[inline]
69 fn sub(self, other: Group<E>) -> Self::Output {
70 Group::from_projective(self.group - other.group)
71 }
72}
73
74impl<E: Environment> Sub<&Group<E>> for Group<E> {
75 type Output = Group<E>;
76
77 #[inline]
79 fn sub(self, other: &Group<E>) -> Self::Output {
80 Group::from_projective(self.group - other.group)
81 }
82}
83
84impl<E: Environment> SubAssign<Group<E>> for Group<E> {
85 #[inline]
87 fn sub_assign(&mut self, other: Group<E>) {
88 self.group -= other.group;
89 }
90}
91
92impl<E: Environment> SubAssign<&Group<E>> for Group<E> {
93 #[inline]
95 fn sub_assign(&mut self, other: &Group<E>) {
96 self.group -= other.group;
97 }
98}
99
100impl<E: Environment> Mul<Scalar<E>> for Group<E> {
101 type Output = Group<E>;
102
103 #[inline]
105 fn mul(self, other: Scalar<E>) -> Self::Output {
106 Group::from_projective(self.group * *other)
107 }
108}
109
110impl<E: Environment> Mul<&Scalar<E>> for Group<E> {
111 type Output = Group<E>;
112
113 #[inline]
115 fn mul(self, other: &Scalar<E>) -> Self::Output {
116 Group::from_projective(self.group * **other)
117 }
118}
119
120impl<E: Environment> Mul<Group<E>> for Scalar<E> {
121 type Output = Group<E>;
122
123 #[inline]
125 fn mul(self, other: Group<E>) -> Self::Output {
126 Group::from_projective(other.group * *self)
127 }
128}
129
130impl<E: Environment> Mul<&Group<E>> for Scalar<E> {
131 type Output = Group<E>;
132
133 #[inline]
135 fn mul(self, other: &Group<E>) -> Self::Output {
136 Group::from_projective(other.group * *self)
137 }
138}
139
140impl<E: Environment> MulAssign<Scalar<E>> for Group<E> {
141 #[inline]
143 fn mul_assign(&mut self, other: Scalar<E>) {
144 self.group *= *other;
145 }
146}
147
148impl<E: Environment> MulAssign<&Scalar<E>> for Group<E> {
149 #[inline]
151 fn mul_assign(&mut self, other: &Scalar<E>) {
152 self.group *= **other;
153 }
154}
155
156impl<E: Environment> Double for Group<E> {
157 type Output = Group<E>;
158
159 #[inline]
161 fn double(&self) -> Self::Output {
162 Group::from_projective(self.group.double())
163 }
164}
165
166impl<E: Environment> Sum<Group<E>> for Group<E> {
167 #[inline]
169 fn sum<I: Iterator<Item = Group<E>>>(iter: I) -> Self {
170 iter.fold(Group::zero(), |a, b| a + b)
171 }
172}
173
174impl<'a, E: Environment> Sum<&'a Group<E>> for Group<E> {
175 #[inline]
177 fn sum<I: Iterator<Item = &'a Group<E>>>(iter: I) -> Self {
178 iter.fold(Group::zero(), |a, b| a + b)
179 }
180}