algebraeon_rings/structure/
units.rs

1use crate::structure::TryReciprocalSignature;
2use algebraeon_groups::structure::{
3    AssociativeCompositionSignature, CommutativeCompositionSignature, CompositionSignature,
4    GroupSignature, IdentitySignature, LeftCancellativeCompositionSignature, MonoidSignature,
5    RightCancellativeCompositionSignature, TryInverseSignature,
6};
7use algebraeon_sets::structure::{BorrowedStructure, SetSignature, Signature};
8use std::marker::PhantomData;
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct MultiplicativeMonoidUnitsStructure<M: TryReciprocalSignature, MB: BorrowedStructure<M>> {
12    _monoid: PhantomData<M>,
13    monoid: MB,
14}
15
16impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>>
17    MultiplicativeMonoidUnitsStructure<M, MB>
18{
19    pub fn new(monoid: MB) -> Self {
20        Self {
21            _monoid: PhantomData,
22            monoid,
23        }
24    }
25
26    pub fn monoid(&self) -> &M {
27        self.monoid.borrow()
28    }
29}
30
31impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> Signature
32    for MultiplicativeMonoidUnitsStructure<M, MB>
33{
34}
35
36impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> SetSignature
37    for MultiplicativeMonoidUnitsStructure<M, MB>
38{
39    type Set = M::Set;
40
41    fn is_element(&self, x: &Self::Set) -> Result<(), String> {
42        if self.monoid().is_element(x).is_ok() {
43            if self.monoid().is_unit(x) {
44                Ok(())
45            } else {
46                Err("not a unit".to_string())
47            }
48        } else {
49            Err("not an element of the monoid".to_string())
50        }
51    }
52}
53
54impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> IdentitySignature
55    for MultiplicativeMonoidUnitsStructure<M, MB>
56{
57    fn identity(&self) -> Self::Set {
58        self.monoid().one()
59    }
60}
61
62impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> CompositionSignature
63    for MultiplicativeMonoidUnitsStructure<M, MB>
64{
65    fn compose(&self, a: &Self::Set, b: &Self::Set) -> Self::Set {
66        self.monoid().mul(a, b)
67    }
68}
69
70impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> AssociativeCompositionSignature
71    for MultiplicativeMonoidUnitsStructure<M, MB>
72{
73}
74
75impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> CommutativeCompositionSignature
76    for MultiplicativeMonoidUnitsStructure<M, MB>
77{
78}
79
80impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> TryInverseSignature
81    for MultiplicativeMonoidUnitsStructure<M, MB>
82{
83    fn try_inverse(&self, a: &Self::Set) -> Option<Self::Set> {
84        Some(self.inverse(a))
85    }
86}
87
88impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> LeftCancellativeCompositionSignature
89    for MultiplicativeMonoidUnitsStructure<M, MB>
90{
91    fn try_left_difference(&self, a: &Self::Set, b: &Self::Set) -> Option<Self::Set> {
92        Some(self.compose(&self.inverse(b), a))
93    }
94}
95
96impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> RightCancellativeCompositionSignature
97    for MultiplicativeMonoidUnitsStructure<M, MB>
98{
99    fn try_right_difference(&self, a: &Self::Set, b: &Self::Set) -> Option<Self::Set> {
100        Some(self.compose(a, &self.inverse(b)))
101    }
102}
103
104impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> MonoidSignature
105    for MultiplicativeMonoidUnitsStructure<M, MB>
106{
107}
108
109impl<M: TryReciprocalSignature, MB: BorrowedStructure<M>> GroupSignature
110    for MultiplicativeMonoidUnitsStructure<M, MB>
111{
112    fn inverse(&self, a: &Self::Set) -> Self::Set {
113        self.monoid().try_reciprocal(a).unwrap()
114    }
115}