haar_lib/num/
zz.rs

1//! $\mathbb{Z} / m \mathbb{Z}$の環
2use std::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign};
3
4/// $\mathbb{Z} / m \mathbb{Z}$の環
5#[allow(clippy::wrong_self_convention)]
6pub trait ZZ: Clone {
7    /// 環の元の型
8    type Element: ZZElem;
9    /// `u64`から生成する。
10    fn from_u64(&self, a: u64) -> Self::Element;
11    /// `i64`から生成する。
12    fn from_i64(&self, a: i64) -> Self::Element;
13    /// 加法の単位元を返す。
14    fn zero(&self) -> Self::Element {
15        self.from_u64(0)
16    }
17    /// 乗法の単位元を返す。
18    fn one(&self) -> Self::Element {
19        self.from_u64(1)
20    }
21    /// 剰余の除数を返す。
22    fn modulo(&self) -> u32;
23}
24
25/// $\mathbb{Z} / m \mathbb{Z}$の環の元
26pub trait ZZElem:
27    Sized
28    + Copy
29    + PartialEq
30    + Neg<Output = Self>
31    + Add<Output = Self>
32    + Sub<Output = Self>
33    + Mul<Output = Self>
34    + AddAssign
35    + SubAssign
36    + MulAssign
37{
38    /// 内部の値を取り出す。
39    fn value(self) -> u32;
40    /// 剰余の除数を返す。
41    fn modulo(self) -> u32;
42    /// `self`の`p`乗を返す。
43    fn pow(self, p: u64) -> Self;
44}