1use std::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign};
3
4#[allow(clippy::wrong_self_convention)]
6pub trait ZZ: Clone {
7 type Element: ZZElem;
9 fn from_u64(&self, a: u64) -> Self::Element;
11 fn from_i64(&self, a: i64) -> Self::Element;
13 fn zero(&self) -> Self::Element {
15 self.from_u64(0)
16 }
17 fn one(&self) -> Self::Element {
19 self.from_u64(1)
20 }
21 fn modulo(&self) -> u32;
23}
24
25pub trait ZZElem:
27 Sized
28 + Copy
29 + PartialEq
30 + Neg<Output = Self>
31 + Add<Output = Self>
32 + Sub<Output = Self>
33 + Mul<Output = Self>
34 + AddAssign
35 + SubAssign
36 + MulAssign
37{
38 fn value(self) -> u32;
40 fn modulo(self) -> u32;
42 fn pow(self, p: u64) -> Self;
44}