haar_lib/algebra/semiring/
add_mul_mod.rs

1//! $\mathbb{Z} / m \mathbb{Z}$の環
2pub use crate::algebra::semiring::*;
3use crate::num::ff::*;
4
5/// $\mathbb{Z} / m \mathbb{Z}$の環
6#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct AddMulMod<T: ZZ>(pub T);
8
9impl<T: ZZ> Semiring for AddMulMod<T> {
10    type Element = T::Element;
11    fn zero(&self) -> Self::Element {
12        self.0.zero()
13    }
14    fn one(&self) -> Self::Element {
15        self.0.one()
16    }
17    fn add(&self, a: Self::Element, b: Self::Element) -> Self::Element {
18        a + b
19    }
20    fn mul(&self, a: Self::Element, b: Self::Element) -> Self::Element {
21        a * b
22    }
23    fn times(&self, a: Self::Element, n: u64) -> Self::Element {
24        a * self.0.from_u64(n)
25    }
26}
27
28impl<T: ZZ> Ring for AddMulMod<T> {
29    fn neg(&self, a: Self::Element) -> Self::Element {
30        -a
31    }
32}
33
34impl<T: FF> Field for AddMulMod<T>
35where
36    T::Element: FFElem,
37{
38    fn inv(&self, a: Self::Element) -> Self::Element {
39        a.inv()
40    }
41}