haar_lib/algebra/
modint.rs

1//! `mod m`の代数的構造
2
3pub use crate::algebra::traits::*;
4use crate::{impl_algebra, num::ff::*};
5
6/// `mod m`上の加法
7#[derive(Clone, Copy, Default, Debug)]
8pub struct SumMod<T: ZZ>(T);
9impl<T: ZZ> SumMod<T> {
10    /// [`SumMod<T>`]を作る。
11    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/// `mod m`上の乗法
33#[derive(Clone, Copy, Default, Debug)]
34pub struct ProdMod<T: ZZ>(T);
35impl<T: ZZ> ProdMod<T> {
36    /// [`ProdMod<T>`]を作る。
37    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(););