haar_lib/algebra/
modint.rs1pub use crate::algebra::traits::*;
4use crate::{impl_algebra, num::ff::*};
5
6#[derive(Clone, Copy, Default, Debug)]
8pub struct SumMod<T: ZZ>(T);
9impl<T: ZZ> SumMod<T> {
10 pub fn new(m: T) -> Self {
12 Self(m)
13 }
14}
15
16impl<T: ZZ> Additive for SumMod<T> {
17 fn times(&self, a: Self::Element, n: u64) -> Self::Element {
18 a * self.0.from_u64(n)
19 }
20}
21
22impl_algebra!(
23 {T: ZZ} SumMod<T>;
24 set: T::Element;
25 op: |_, a: T::Element, b: T::Element| a + b;
26 id: |s: &Self| s.0.zero();
27 inv: |_, a: T::Element| -a;
28 assoc;
29 commu;
30);
31
32#[derive(Clone, Copy, Default, Debug)]
34pub struct ProdMod<T: ZZ>(T);
35impl<T: ZZ> ProdMod<T> {
36 pub fn new(m: T) -> Self {
38 Self(m)
39 }
40}
41
42impl<T: ZZ> Multiplicative for ProdMod<T> {}
43
44impl_algebra!(
45 {T: ZZ} ProdMod<T>;
46 set: T::Element;
47 op: |_, a: T::Element, b: T::Element| a * b;
48 id: |s: &Self| s.0.one();
49 assoc;
50 commu;
51);
52impl_algebra!({T: FF} ProdMod<T> where {T::Element: FFElem}; inv: |_, a: T::Element| a.inv(););