haar_lib/num/modint/
algebra.rs1pub use crate::algebra::traits::*;
4use crate::{impl_algebra, num::modint::*};
5
6#[derive(Clone, Copy, Default, Debug)]
8pub struct SumModM(Option<ModInt>);
9impl SumModM {
10 pub fn new(a: ModInt) -> Self {
11 Self(Some(a))
12 }
13 pub fn value(self) -> u32 {
14 self.0.map_or(0, |a| a.value)
15 }
16}
17impl PartialEq for SumModM {
18 fn eq(&self, other: &Self) -> bool {
19 self.value() == other.value()
20 }
21}
22impl Eq for SumModM {}
23impl_algebra!(
24 SumModM;
25 op: |a: Self, b: Self| match (a.0, b.0) {
26 (Some(a), Some(b)) => Self(Some(a + b)),
27 (a, None) | (None, a) => Self(a),
28 };
29 id: Self(None);
30 inv: |a: Self| Self(a.0.map(|x| -x));
31 assoc;
32 commu;
33);
34
35#[derive(Clone, Copy, Default, Debug)]
37pub struct ProdModM(Option<ModInt>);
38impl ProdModM {
39 pub fn new(a: ModInt) -> Self {
40 Self(Some(a))
41 }
42 pub fn value(self) -> u32 {
43 self.0.map_or(1, |a| a.value)
44 }
45}
46impl PartialEq for ProdModM {
47 fn eq(&self, other: &Self) -> bool {
48 self.value() == other.value()
49 }
50}
51impl Eq for ProdModM {}
52impl_algebra!(
53 ProdModM;
54 op: |a: Self, b: Self| match (a.0, b.0) {
55 (Some(a), Some(b)) => Self(Some(a * b)),
56 (a, None) | (None, a) => Self(a),
57 };
58 id: Self(None);
59 assoc;
60 commu;
61);