-
Notifications
You must be signed in to change notification settings - Fork 41
Mitsch Order #1024
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Mitsch Order #1024
Changes from 4 commits
affb39b
27eb838
3f1f82d
790c32a
46f97d7
c0f5385
8a02024
653a959
1baed0e
6edd905
18edcfd
47a7653
1ec7731
9ff45bb
185fdde
e679757
3d7bd8c
5119849
6fb4a4a
334d361
49e775b
dfc6a66
ae4f45d
2e17d1b
fac9442
b24f3c7
5ca82f0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1052,6 +1052,188 @@ function(S) | |
| end; | ||
| end); | ||
|
|
||
| InstallMethod(KernelContainment, | ||
|
james-d-mitchell marked this conversation as resolved.
Outdated
|
||
| "for two transformations in a semigroup of degree n", | ||
| [IsTransformation, IsTransformation, IsPosInt], | ||
| function(a, b, n) | ||
| local m, i, idx, q, class; | ||
| if DegreeOfTransformation(a) > n or | ||
| DegreeOfTransformation(b) > n then | ||
| ErrorNoReturn | ||
| ("Transformation does not belong | ||
| to a transformation semigroup of degree n"); | ||
| fi; | ||
| q := []; | ||
| for class in KernelOfTransformation(a, n) do | ||
| m := Minimum(class); | ||
| for i in class do | ||
| q[i] := m; | ||
| od; | ||
| od; | ||
| for class in KernelOfTransformation(b, n) do | ||
| idx := q[class[1]]; | ||
| for i in class do | ||
| if q[i] <> idx then | ||
| return false; | ||
| fi; | ||
| od; | ||
| od; | ||
| return true; | ||
| end); | ||
|
|
||
| SEMIGROUPS.ExistsTransversal := function(a, b, n) | ||
| local exists, class, i; | ||
| if DegreeOfTransformation(a) > n or | ||
| DegreeOfTransformation(b) > n then | ||
| ErrorNoReturn("Transformation does not | ||
| belong to a transformation semigroup of degree n"); | ||
| fi; | ||
| for class in KernelOfTransformation(a, n) do | ||
| exists := false; | ||
| for i in [1 .. Size(class)] do | ||
| if class[i] ^ a = class[i] ^ b then | ||
| exists := true; | ||
| break; | ||
| fi; | ||
| od; | ||
| if exists = false then | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| return false; | ||
| fi; | ||
| od; | ||
| return true; | ||
| end; | ||
|
|
||
| InstallMethod(RegularLeqTransformationSemigroup, | ||
| "for a transformation semigroup", | ||
| [IsTransformationSemigroup], | ||
| function(S) | ||
| local deg; | ||
| deg := DegreeOfTransformationSemigroup(S); | ||
| return | ||
| function(x, y) | ||
| # Only returns the correct answer if y is a regular element | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add check that Also what happens if |
||
| return KernelContainment(x, y, deg) | ||
| and SEMIGROUPS.ExistsTransversal(x, y, deg); | ||
| end; | ||
| end); | ||
|
|
||
| InstallMethod(MitschLeqSemigroup, | ||
| "for a semigroup", | ||
| [IsSemigroup], | ||
| function(S) | ||
| if IsInverseSemigroup(S) then | ||
| return NaturalLeqInverseSemigroup(S); | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| fi; | ||
|
|
||
| return | ||
| function(x, y) | ||
| if x = y then | ||
| return true; | ||
| else | ||
| return ForAny(Elements(S), s -> x = x * s and x = y * s) and | ||
| ForAny(Elements(S), t -> t * y = x and t * x = x); | ||
|
james-d-mitchell marked this conversation as resolved.
Outdated
|
||
| fi; | ||
| end; | ||
| end); | ||
|
|
||
| InstallMethod(MitschOrderOfTransformationSemigroup, | ||
| "for a finite transformation semigroup", | ||
| [IsFinite and IsTransformationSemigroup], | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| function(S) | ||
| local elts, p, func1, func2, out, i, j, regular, D, a; | ||
| elts := ShallowCopy(Elements(S)); | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| p := Sortex(elts, {x, y} -> IsGreensDGreaterThanFunc(S)(y, x)) ^ -1; | ||
| func1 := RegularLeqTransformationSemigroup(S); | ||
| func2 := MitschLeqSemigroup(S); | ||
| out := List([1 .. Size(S)], x -> []); | ||
| regular := ListWithIdenticalEntries(Size(S), false); | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| for D in RegularDClasses(S) do | ||
|
Tianrun-Y marked this conversation as resolved.
|
||
| for a in D do | ||
| i := Position(elts, a); | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| regular[i] := true; | ||
| od; | ||
| od; | ||
| for j in [Size(S), Size(S) - 1 .. 1] do | ||
| if regular[j] then | ||
| for i in [j - 1, j - 2 .. 1] do | ||
| if func1(elts[i], elts[j]) then | ||
| AddSet(out[j ^ p], i ^ p); | ||
| fi; | ||
| od; | ||
| else | ||
| for i in [j - 1, j - 2 .. 1] do | ||
| if func2(elts[i], elts[j]) then | ||
| AddSet(out[j ^ p], i ^ p); | ||
| fi; | ||
| od; | ||
| fi; | ||
| od; | ||
| return out; | ||
| end); | ||
|
|
||
| InstallMethod(MitschOrderOfTransformationSemigroup, | ||
|
james-d-mitchell marked this conversation as resolved.
Outdated
|
||
| "for a finite regular transformation semigroup", | ||
| [IsFinite and IsRegularSemigroup and IsTransformationSemigroup], | ||
|
Tianrun-Y marked this conversation as resolved.
Outdated
|
||
| function(S) | ||
| local elts, p, func, out, i, j; | ||
| elts := ShallowCopy(Elements(S)); | ||
| p := Sortex(elts, {x, y} -> IsGreensDGreaterThanFunc(S)(y, x)) ^ -1; | ||
| func := RegularLeqTransformationSemigroup(S); | ||
| out := List([1 .. Size(S)], x -> []); | ||
| for i in [1 .. Size(S)] do | ||
| for j in [i + 1 .. Size(S)] do | ||
| if func(elts[i], elts[j]) then | ||
| AddSet(out[j ^ p], i ^ p); | ||
| fi; | ||
| od; | ||
| od; | ||
| return out; | ||
| end); | ||
|
|
||
| InstallMethod(MitschOrderOfSemigroup, | ||
| "for a finite semigroup", | ||
| [IsFinite and IsSemigroup], | ||
| function(S) | ||
| local i, iso, T, MT, MS, eltsS, eltsT, idx_map, q; | ||
| if IsInverseSemigroup(S) then | ||
| return NaturalPartialOrder(S); | ||
| elif IsTransformationSemigroup(S) then | ||
| return MitschOrderOfTransformationSemigroup(S); | ||
| fi; | ||
| iso := IsomorphismTransformationSemigroup(S); | ||
| T := Range(iso); | ||
| eltsS := Elements(S); | ||
| eltsT := Elements(T); | ||
| idx_map := List([1 .. Size(S)], i -> Position(eltsT, eltsS[i] ^ iso)); | ||
| q := PermList(idx_map); | ||
| MT := MitschOrderOfTransformationSemigroup(T); | ||
| MS := []; | ||
| for i in [1 .. Size(S)] do | ||
| MS[i] := AsSet(OnTuples(MoT[i ^ q], q ^ -1)); | ||
| od; | ||
| return MS; | ||
| end); | ||
|
|
||
| InstallMethod(DumbMitschOrderOfSemigroup, | ||
| "for a finite semigroup", | ||
| [IsSemigroup and IsFinite], | ||
| function(S) | ||
| local func, out, i, j, elts; | ||
| func := MitschLeqSemigroup(S); | ||
| elts := Elements(S); | ||
| out := List([1 .. Size(S)], x -> []); | ||
| for i in [1 .. Size(S)] do | ||
| for j in [1 .. Size(S)] do | ||
| if i = j then | ||
| continue; | ||
| elif func(elts[i], elts[j]) then | ||
| AddSet(out[j], i); | ||
| fi; | ||
| od; | ||
| od; | ||
| return out; | ||
| end); | ||
|
Comment on lines
+1188
to
+1206
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should probably not be a separate method. I would suggest adding an optional flag for |
||
|
|
||
| InstallMethod(LeftIdentity, | ||
| "for semigroup with CanUseFroidurePin and mult. elt.", | ||
| [IsSemigroup and CanUseFroidurePin, IsMultiplicativeElement], | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operation
KernelContainmentdeclared but never defined.