haar_lib/num/modint/
algebra.rs

1//! [`ModInt`]の代数的構造
2
3pub use crate::algebra::traits::*;
4use crate::{impl_algebra, num::modint::*};
5
6/// `mod m`上の加法
7#[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/// `mod m`上の乗法
36#[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);