algebraeon_rings/structure/
units.rs1use 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}