passagemath-gap-pkg-semigroups 10.6.30__cp311-cp311-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-gap-pkg-semigroups might be problematic. Click here for more details.
- gap/pkg/semigroups/CHANGELOG.md +1699 -0
- gap/pkg/semigroups/CONTRIBUTING.md +91 -0
- gap/pkg/semigroups/GNUmakefile +110 -0
- gap/pkg/semigroups/GNUmakefile.in +110 -0
- gap/pkg/semigroups/GPL +674 -0
- gap/pkg/semigroups/LICENSE +16 -0
- gap/pkg/semigroups/Makefile +26 -0
- gap/pkg/semigroups/Makefile.gappkg +225 -0
- gap/pkg/semigroups/PackageInfo.g +529 -0
- gap/pkg/semigroups/README.md +102 -0
- gap/pkg/semigroups/VERSIONS +112 -0
- gap/pkg/semigroups/aclocal.m4 +375 -0
- gap/pkg/semigroups/autogen.sh +25 -0
- gap/pkg/semigroups/bin/aarch64-apple-darwin23-default64-kv10/semigroups.so +0 -0
- gap/pkg/semigroups/config.guess +1807 -0
- gap/pkg/semigroups/config.log +1158 -0
- gap/pkg/semigroups/config.status +1131 -0
- gap/pkg/semigroups/config.sub +1960 -0
- gap/pkg/semigroups/configure +9742 -0
- gap/pkg/semigroups/configure.ac +71 -0
- gap/pkg/semigroups/data/doc/greens.pickle +1 -0
- gap/pkg/semigroups/data/gens/fullbool-8.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/fullbool.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/hall.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex-6.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex.pickle.gz +0 -0
- gap/pkg/semigroups/data/tst/bipart4 +10 -0
- gap/pkg/semigroups/data/tst/pperm10 +1 -0
- gap/pkg/semigroups/data/tst/tables.gz +0 -0
- gap/pkg/semigroups/data/tst/testdata +1 -0
- gap/pkg/semigroups/data/tst/testinstall.pickle +1 -0
- gap/pkg/semigroups/data/tst/trans3 +7 -0
- gap/pkg/semigroups/data/tst/trans3-old +7 -0
- gap/pkg/semigroups/environment.yml +7 -0
- gap/pkg/semigroups/gap/attributes/acting.gd +15 -0
- gap/pkg/semigroups/gap/attributes/acting.gi +297 -0
- gap/pkg/semigroups/gap/attributes/attr.gd +91 -0
- gap/pkg/semigroups/gap/attributes/attr.gi +1214 -0
- gap/pkg/semigroups/gap/attributes/dual.gd +25 -0
- gap/pkg/semigroups/gap/attributes/dual.gi +209 -0
- gap/pkg/semigroups/gap/attributes/factor.gd +17 -0
- gap/pkg/semigroups/gap/attributes/factor.gi +453 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gd +84 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gi +591 -0
- gap/pkg/semigroups/gap/attributes/inverse.gd +38 -0
- gap/pkg/semigroups/gap/attributes/inverse.gi +708 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gd +16 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gi +377 -0
- gap/pkg/semigroups/gap/attributes/isorms.gd +49 -0
- gap/pkg/semigroups/gap/attributes/isorms.gi +1383 -0
- gap/pkg/semigroups/gap/attributes/maximal.gd +16 -0
- gap/pkg/semigroups/gap/attributes/maximal.gi +1876 -0
- gap/pkg/semigroups/gap/attributes/properties.gd +109 -0
- gap/pkg/semigroups/gap/attributes/properties.gi +1658 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gd +39 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gi +1078 -0
- gap/pkg/semigroups/gap/attributes/semifp.gd +12 -0
- gap/pkg/semigroups/gap/attributes/semifp.gi +84 -0
- gap/pkg/semigroups/gap/attributes/translat.gd +474 -0
- gap/pkg/semigroups/gap/attributes/translat.gi +1779 -0
- gap/pkg/semigroups/gap/congruences/cong.gd +154 -0
- gap/pkg/semigroups/gap/congruences/cong.gi +351 -0
- gap/pkg/semigroups/gap/congruences/conginv.gd +38 -0
- gap/pkg/semigroups/gap/congruences/conginv.gi +589 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gd +101 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gi +886 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gi +272 -0
- gap/pkg/semigroups/gap/congruences/congpart.gd +90 -0
- gap/pkg/semigroups/gap/congruences/congpart.gi +449 -0
- gap/pkg/semigroups/gap/congruences/congrees.gd +20 -0
- gap/pkg/semigroups/gap/congruences/congrees.gi +313 -0
- gap/pkg/semigroups/gap/congruences/congrms.gd +54 -0
- gap/pkg/semigroups/gap/congruences/congrms.gi +1467 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gd +28 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gi +289 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gd +27 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gi +236 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gd +20 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gi +271 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gi +250 -0
- gap/pkg/semigroups/gap/elements/bipart.gd +71 -0
- gap/pkg/semigroups/gap/elements/bipart.gi +995 -0
- gap/pkg/semigroups/gap/elements/blocks.gd +31 -0
- gap/pkg/semigroups/gap/elements/blocks.gi +134 -0
- gap/pkg/semigroups/gap/elements/boolmat.gd +74 -0
- gap/pkg/semigroups/gap/elements/boolmat.gi +726 -0
- gap/pkg/semigroups/gap/elements/elements.gd +11 -0
- gap/pkg/semigroups/gap/elements/elements.gi +121 -0
- gap/pkg/semigroups/gap/elements/ffmat.gd +71 -0
- gap/pkg/semigroups/gap/elements/ffmat.gi +311 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gd +131 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gi +782 -0
- gap/pkg/semigroups/gap/elements/pbr.gd +51 -0
- gap/pkg/semigroups/gap/elements/pbr.gi +740 -0
- gap/pkg/semigroups/gap/elements/pperm.gd +11 -0
- gap/pkg/semigroups/gap/elements/pperm.gi +14 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gd +136 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gi +717 -0
- gap/pkg/semigroups/gap/elements/star.gd +21 -0
- gap/pkg/semigroups/gap/elements/star.gi +21 -0
- gap/pkg/semigroups/gap/elements/trans.gd +13 -0
- gap/pkg/semigroups/gap/elements/trans.gi +50 -0
- gap/pkg/semigroups/gap/fp/freeband.gd +22 -0
- gap/pkg/semigroups/gap/fp/freeband.gi +502 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gd +30 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gi +465 -0
- gap/pkg/semigroups/gap/fp/tietze.gd +89 -0
- gap/pkg/semigroups/gap/fp/tietze.gi +1578 -0
- gap/pkg/semigroups/gap/fp/word.gd +15 -0
- gap/pkg/semigroups/gap/fp/word.gi +67 -0
- gap/pkg/semigroups/gap/greens/acting-inverse.gi +774 -0
- gap/pkg/semigroups/gap/greens/acting-regular.gi +553 -0
- gap/pkg/semigroups/gap/greens/acting.gd +81 -0
- gap/pkg/semigroups/gap/greens/acting.gi +2433 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gd +25 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gi +741 -0
- gap/pkg/semigroups/gap/greens/generic.gd +117 -0
- gap/pkg/semigroups/gap/greens/generic.gi +630 -0
- gap/pkg/semigroups/gap/ideals/acting.gd +17 -0
- gap/pkg/semigroups/gap/ideals/acting.gi +1155 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gd +11 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gi +105 -0
- gap/pkg/semigroups/gap/ideals/ideals.gd +45 -0
- gap/pkg/semigroups/gap/ideals/ideals.gi +442 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gd +16 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gi +614 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gd +24 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gi +431 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gd +16 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gi +53 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gd +17 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gi +945 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gd +38 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gi +308 -0
- gap/pkg/semigroups/gap/main/acting.gd +36 -0
- gap/pkg/semigroups/gap/main/acting.gi +779 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gd +72 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gi +655 -0
- gap/pkg/semigroups/gap/main/graded.gd +26 -0
- gap/pkg/semigroups/gap/main/graded.gi +355 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gd +29 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gi +514 -0
- gap/pkg/semigroups/gap/main/orbits.gd +24 -0
- gap/pkg/semigroups/gap/main/orbits.gi +512 -0
- gap/pkg/semigroups/gap/main/semiact.gd +20 -0
- gap/pkg/semigroups/gap/main/semiact.gi +821 -0
- gap/pkg/semigroups/gap/main/setup.gd +61 -0
- gap/pkg/semigroups/gap/main/setup.gi +1094 -0
- gap/pkg/semigroups/gap/obsolete.gd +9 -0
- gap/pkg/semigroups/gap/obsolete.gi +14 -0
- gap/pkg/semigroups/gap/options.g +55 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gd +12 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gi +177 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gi +570 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gd +20 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gi +104 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gd +52 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gi +1194 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gi +509 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gd +126 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gi +889 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gd +104 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gi +1590 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gd +37 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gi +565 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gi +1364 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gd +40 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gi +292 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gd +165 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gi +1225 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gd +72 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gi +710 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gi +74 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gi +139 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gd +27 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gi +711 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gd +14 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gi +97 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gd +16 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gi +21 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gi +977 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gd +49 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gi +909 -0
- gap/pkg/semigroups/gap/tools/display.gd +24 -0
- gap/pkg/semigroups/gap/tools/display.gi +749 -0
- gap/pkg/semigroups/gap/tools/io.gd +17 -0
- gap/pkg/semigroups/gap/tools/io.gi +543 -0
- gap/pkg/semigroups/gap/tools/iterators.gd +16 -0
- gap/pkg/semigroups/gap/tools/iterators.gi +253 -0
- gap/pkg/semigroups/gap/tools/utils.gd +19 -0
- gap/pkg/semigroups/gap/tools/utils.gi +756 -0
- gap/pkg/semigroups/gapbind14/.ccls +18 -0
- gap/pkg/semigroups/gapbind14/.clang-format +104 -0
- gap/pkg/semigroups/gapbind14/CPPLINT.cfg +5 -0
- gap/pkg/semigroups/gapbind14/LICENSE +674 -0
- gap/pkg/semigroups/gapbind14/README.md +76 -0
- gap/pkg/semigroups/gapbind14/demo/.gitignore +4 -0
- gap/pkg/semigroups/gapbind14/demo/LICENSE +293 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.gappkg +220 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.in +19 -0
- gap/pkg/semigroups/gapbind14/demo/PackageInfo.g +87 -0
- gap/pkg/semigroups/gapbind14/demo/README.md +17 -0
- gap/pkg/semigroups/gapbind14/demo/configure +34 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gd +19 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gi +10 -0
- gap/pkg/semigroups/gapbind14/demo/init.g +16 -0
- gap/pkg/semigroups/gapbind14/demo/makedoc.g +10 -0
- gap/pkg/semigroups/gapbind14/demo/read.g +6 -0
- gap/pkg/semigroups/gapbind14/demo/src/gapbind_demo.cc +142 -0
- gap/pkg/semigroups/gapbind14/demo/tst/testall.g +12 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/cpp_fn.hpp +223 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gap_include.hpp +26 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gapbind14.hpp +445 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_free_fn.hpp +420 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_mem_fn.hpp +556 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_cpp.hpp +162 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_gap.hpp +158 -0
- gap/pkg/semigroups/gapbind14/src/.clang-format +108 -0
- gap/pkg/semigroups/gapbind14/src/gapbind14.cpp +334 -0
- gap/pkg/semigroups/init.g +150 -0
- gap/pkg/semigroups/m4/ax_append_flag.m4 +50 -0
- gap/pkg/semigroups/m4/ax_check_compile_flag.m4 +53 -0
- gap/pkg/semigroups/m4/ax_check_hpcombi.m4 +121 -0
- gap/pkg/semigroups/m4/ax_check_libsemigroup.m4 +68 -0
- gap/pkg/semigroups/m4/ax_compare_version.m4 +177 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx_14.m4 +34 -0
- gap/pkg/semigroups/m4/ax_prefix_config_h.m4 +203 -0
- gap/pkg/semigroups/m4/ax_pthread.m4 +522 -0
- gap/pkg/semigroups/m4/find_gap.m4 +94 -0
- gap/pkg/semigroups/makedoc.g +153 -0
- gap/pkg/semigroups/prerequisites.sh +62 -0
- gap/pkg/semigroups/read.g +105 -0
- gap/pkg/semigroups/release.toml +6 -0
- gap/pkg/semigroups/tst/extreme/README +2 -0
- gap/pkg/semigroups/tst/extreme/attrinv.tst +703 -0
- gap/pkg/semigroups/tst/extreme/bipart.tst +2803 -0
- gap/pkg/semigroups/tst/extreme/closure.tst +652 -0
- gap/pkg/semigroups/tst/extreme/cong.tst +286 -0
- gap/pkg/semigroups/tst/extreme/conginv.tst +43 -0
- gap/pkg/semigroups/tst/extreme/examples.tst +2449 -0
- gap/pkg/semigroups/tst/extreme/freeband.tst +37 -0
- gap/pkg/semigroups/tst/extreme/greens-acting-regular.tst +27 -0
- gap/pkg/semigroups/tst/extreme/greens-acting.tst +1999 -0
- gap/pkg/semigroups/tst/extreme/ideals.tst +858 -0
- gap/pkg/semigroups/tst/extreme/inverse.tst +1025 -0
- gap/pkg/semigroups/tst/extreme/maximal.tst +856 -0
- gap/pkg/semigroups/tst/extreme/misc.tst +4236 -0
- gap/pkg/semigroups/tst/extreme/monoid_pkg.tst +1488 -0
- gap/pkg/semigroups/tst/extreme/properties.tst +914 -0
- gap/pkg/semigroups/tst/extreme/semibipart.tst +2837 -0
- gap/pkg/semigroups/tst/extreme/semieunit.tst +49 -0
- gap/pkg/semigroups/tst/extreme/semiffmat.tst +353 -0
- gap/pkg/semigroups/tst/extreme/semigroups.tst +245 -0
- gap/pkg/semigroups/tst/extreme/semiiter.tst +58 -0
- gap/pkg/semigroups/tst/extreme/semirms.tst +1091 -0
- gap/pkg/semigroups/tst/extreme/transform.tst +305 -0
- gap/pkg/semigroups/tst/extreme/translat.tst +44 -0
- gap/pkg/semigroups/tst/standard/README +2 -0
- gap/pkg/semigroups/tst/standard/attributes/acting.tst +388 -0
- gap/pkg/semigroups/tst/standard/attributes/attr.tst +2404 -0
- gap/pkg/semigroups/tst/standard/attributes/dual.tst +308 -0
- gap/pkg/semigroups/tst/standard/attributes/factor.tst +629 -0
- gap/pkg/semigroups/tst/standard/attributes/homomorph.tst +1134 -0
- gap/pkg/semigroups/tst/standard/attributes/inverse.tst +1521 -0
- gap/pkg/semigroups/tst/standard/attributes/isomorph.tst +435 -0
- gap/pkg/semigroups/tst/standard/attributes/isorms.tst +1147 -0
- gap/pkg/semigroups/tst/standard/attributes/maximal.tst +853 -0
- gap/pkg/semigroups/tst/standard/attributes/properties.tst +2028 -0
- gap/pkg/semigroups/tst/standard/attributes/semifp.tst +53 -0
- gap/pkg/semigroups/tst/standard/attributes/translat.tst +796 -0
- gap/pkg/semigroups/tst/standard/congruences/cong.tst +1044 -0
- gap/pkg/semigroups/tst/standard/congruences/conginv.tst +292 -0
- gap/pkg/semigroups/tst/standard/congruences/conglatt.tst +421 -0
- gap/pkg/semigroups/tst/standard/congruences/congpairs.tst +1011 -0
- gap/pkg/semigroups/tst/standard/congruences/congrees.tst +288 -0
- gap/pkg/semigroups/tst/standard/congruences/congrms.tst +701 -0
- gap/pkg/semigroups/tst/standard/congruences/congsemigraph.tst +422 -0
- gap/pkg/semigroups/tst/standard/congruences/congsimple.tst +311 -0
- gap/pkg/semigroups/tst/standard/congruences/conguniv.tst +259 -0
- gap/pkg/semigroups/tst/standard/congruences/congwordgraph.tst +330 -0
- gap/pkg/semigroups/tst/standard/elements/bipart.tst +783 -0
- gap/pkg/semigroups/tst/standard/elements/blocks.tst +166 -0
- gap/pkg/semigroups/tst/standard/elements/boolmat.tst +608 -0
- gap/pkg/semigroups/tst/standard/elements/elements.tst +117 -0
- gap/pkg/semigroups/tst/standard/elements/ffmat.tst +349 -0
- gap/pkg/semigroups/tst/standard/elements/maxplusmat.tst +613 -0
- gap/pkg/semigroups/tst/standard/elements/pbr.tst +506 -0
- gap/pkg/semigroups/tst/standard/elements/pperm.tst +32 -0
- gap/pkg/semigroups/tst/standard/elements/semiringmat.tst +601 -0
- gap/pkg/semigroups/tst/standard/elements/trans.tst +58 -0
- gap/pkg/semigroups/tst/standard/fp/freeband.tst +311 -0
- gap/pkg/semigroups/tst/standard/fp/freeinverse.tst +147 -0
- gap/pkg/semigroups/tst/standard/fp/tietze.tst +780 -0
- gap/pkg/semigroups/tst/standard/fp/word.tst +106 -0
- gap/pkg/semigroups/tst/standard/greens/acting-inverse.tst +545 -0
- gap/pkg/semigroups/tst/standard/greens/acting-regular.tst +396 -0
- gap/pkg/semigroups/tst/standard/greens/acting.tst +2033 -0
- gap/pkg/semigroups/tst/standard/greens/froidure-pin.tst +1831 -0
- gap/pkg/semigroups/tst/standard/greens/generic.tst +1436 -0
- gap/pkg/semigroups/tst/standard/ideals/acting.tst +279 -0
- gap/pkg/semigroups/tst/standard/ideals/froidure-pin.tst +178 -0
- gap/pkg/semigroups/tst/standard/ideals/ideals.tst +380 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/cong.tst +310 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/froidure-pin.tst +778 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/sims1.tst +379 -0
- gap/pkg/semigroups/tst/standard/main/acting.tst +411 -0
- gap/pkg/semigroups/tst/standard/main/froidure-pin.tst +392 -0
- gap/pkg/semigroups/tst/standard/main/semiact.tst +203 -0
- gap/pkg/semigroups/tst/standard/main/setup.tst +1144 -0
- gap/pkg/semigroups/tst/standard/obsolete.tst +19 -0
- gap/pkg/semigroups/tst/standard/options.tst +54 -0
- gap/pkg/semigroups/tst/standard/semigroups/grpperm.tst +581 -0
- gap/pkg/semigroups/tst/standard/semigroups/semibipart.tst +2635 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiboolmat.tst +1871 -0
- gap/pkg/semigroups/tst/standard/semigroups/semicons.tst +1173 -0
- gap/pkg/semigroups/tst/standard/semigroups/semidp.tst +739 -0
- gap/pkg/semigroups/tst/standard/semigroups/semieunit.tst +339 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiex.tst +2055 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiffmat.tst +746 -0
- gap/pkg/semigroups/tst/standard/semigroups/semifp.tst +2702 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigraph.tst +133 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigrp.tst +1112 -0
- gap/pkg/semigroups/tst/standard/semigroups/semimaxplus.tst +654 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipbr.tst +2142 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipperm.tst +2169 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiquo.tst +278 -0
- gap/pkg/semigroups/tst/standard/semigroups/semirms.tst +3010 -0
- gap/pkg/semigroups/tst/standard/semigroups/semitrans.tst +2758 -0
- gap/pkg/semigroups/tst/standard/tools/display.tst +1040 -0
- gap/pkg/semigroups/tst/standard/tools/io.tst +363 -0
- gap/pkg/semigroups/tst/testinstall.tst +1815 -0
- gap/pkg/semigroups/tst/teststandard.g +22 -0
- gap/pkg/semigroups/tst/workspaces/load-workspace.tst +142 -0
- gap/pkg/semigroups/tst/workspaces/load.g +11 -0
- gap/pkg/semigroups/tst/workspaces/save-workspace.tst +166 -0
- gap/pkg/semigroups/tst/workspaces/save.g +14 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA +93 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA.bak +94 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/RECORD +354 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/WHEEL +6 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/top_level.txt +1 -0
- passagemath_gap_pkg_semigroups.dylibs/libsemigroups.2.dylib +0 -0
- sage/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/gap_pkg_semigroups.cpython-311-darwin.so +0 -0
|
@@ -0,0 +1,2433 @@
|
|
|
1
|
+
#############################################################################
|
|
2
|
+
##
|
|
3
|
+
## greens/acting.gi
|
|
4
|
+
## Copyright (C) 2015-2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
#############################################################################
|
|
12
|
+
## This file contains methods for Green's classes etc for acting semigroups.
|
|
13
|
+
## It is organized as follows:
|
|
14
|
+
##
|
|
15
|
+
## 1. Helper functions for the creation of Green's classes, and lambda-rho
|
|
16
|
+
## stuff.
|
|
17
|
+
##
|
|
18
|
+
## 2. Technical Green's stuff (types, representative, etc)
|
|
19
|
+
##
|
|
20
|
+
## 3. Individual Green's classes (constructors, size, membership)
|
|
21
|
+
##
|
|
22
|
+
## 4. Collections of Green's classes (GreensXClasses, XClassReps, NrXClasses)
|
|
23
|
+
##
|
|
24
|
+
## 5. Idempotents and NrIdempotents
|
|
25
|
+
##
|
|
26
|
+
## 6. Regularity of Green's classes
|
|
27
|
+
##
|
|
28
|
+
## 7. Iterators and enumerators
|
|
29
|
+
##
|
|
30
|
+
#############################################################################
|
|
31
|
+
|
|
32
|
+
#############################################################################
|
|
33
|
+
## Green's classes are created as follows:
|
|
34
|
+
##
|
|
35
|
+
## 1. Create the class C using SEMIGROUPS.CreateXClass, this sets the type,
|
|
36
|
+
## equivalence relations, whether or not the class is NC, the parent, and
|
|
37
|
+
## the element used to create the class (stored in C!.rep)
|
|
38
|
+
##
|
|
39
|
+
## 2. Copy or set the lambda/rho orbits using SEMIGROUPS.CopyLambda/Rho and
|
|
40
|
+
## SEMIGROUPS.SetLambda/Rho. After calling any combination of these two
|
|
41
|
+
## functions Lambda/RhoOrb and Lambda/RhoOrbSCCIndex for the class are
|
|
42
|
+
## set.
|
|
43
|
+
##
|
|
44
|
+
## The former simply copies the orbit and the index of the strongly
|
|
45
|
+
## connected component containing the lambda/rho value of the element used
|
|
46
|
+
## to create the class. This is useful, for example, when trying to create
|
|
47
|
+
## an R-class of a D-class, when the lambda orbit and scc index are just
|
|
48
|
+
## the same as those for the D-class.
|
|
49
|
+
##
|
|
50
|
+
## The latter uses the lambda/rho orbit of the whole semigroup if it is
|
|
51
|
+
## known and the class is not nc. Otherwise it creates/finds the graded
|
|
52
|
+
## lambda/rho orbit. If the graded lambda/rho orbit is created/found, then
|
|
53
|
+
## the position of the lambda/rho value of C!.rep (the element used to
|
|
54
|
+
## create the class) in the orbit is stored in C!.Lambda/RhoPos.
|
|
55
|
+
##
|
|
56
|
+
## 3. Rectify the lambda/rho value of the representative. The representative
|
|
57
|
+
## of an R-class, for example, must have its lambda-value in the first
|
|
58
|
+
## position of the scc containing it. Representatives of L-classes must
|
|
59
|
+
## have the rho-value in the first position of the scc containing
|
|
60
|
+
## it, D-class reps must have both lambda- and rho-values in the
|
|
61
|
+
## respective first positions, the lambda- and rho-values of H-class reps
|
|
62
|
+
## must not be modified. The functions SEMIGROUPS.RectifyLambda/Rho can
|
|
63
|
+
## used to modify C!.rep (in place) so that its lambda/rho-value is in the
|
|
64
|
+
## first place of its scc. These functions depend on the previous 2 steps
|
|
65
|
+
## being called.
|
|
66
|
+
##
|
|
67
|
+
## Note that a Green's class does not satisfies IsGreensClassNC if it is known
|
|
68
|
+
## that its representative is an element of the underlying semigroup, not if it
|
|
69
|
+
## is known to be an element of another Green's class. Also a class in
|
|
70
|
+
## IsGreensClassNC makes the assumption that the representative belongs to the
|
|
71
|
+
## containing object, and reuses the lambda/rho orbit from the container. So,
|
|
72
|
+
## it might be that the representative of a class created using an NC method,
|
|
73
|
+
## has lambda/rho value not belonging to the lambda/rho orbit of the class.
|
|
74
|
+
#############################################################################
|
|
75
|
+
|
|
76
|
+
#############################################################################
|
|
77
|
+
## 1. Helper functions for the creation of Green's classes . . .
|
|
78
|
+
#############################################################################
|
|
79
|
+
|
|
80
|
+
# same method for regular/different for inverse
|
|
81
|
+
|
|
82
|
+
SEMIGROUPS.CreateXClass := function(args, type, rel)
|
|
83
|
+
local S, nc, rep, irep, erep, C;
|
|
84
|
+
|
|
85
|
+
if Length(args) = 1 then # arg is a Green's class
|
|
86
|
+
# for creating bigger classes containing smaller ones
|
|
87
|
+
Assert(1, IsActingSemigroupGreensClass(args[1]));
|
|
88
|
+
S := Parent(args[1]);
|
|
89
|
+
nc := IsGreensClassNC(args[1]);
|
|
90
|
+
rep := args[1]!.rep;
|
|
91
|
+
else # arg is semigroup/Green's class, rep, and boolean
|
|
92
|
+
# for creating smaller classes inside bigger ones
|
|
93
|
+
if IsGreensClass(args[1]) then
|
|
94
|
+
S := Parent(args[1]);
|
|
95
|
+
else
|
|
96
|
+
S := args[1];
|
|
97
|
+
fi;
|
|
98
|
+
rep := args[2];
|
|
99
|
+
nc := args[3];
|
|
100
|
+
fi;
|
|
101
|
+
|
|
102
|
+
irep := ConvertToInternalElement(S, rep);
|
|
103
|
+
erep := ConvertToExternalElement(S, rep);
|
|
104
|
+
|
|
105
|
+
C := rec(rep := irep);
|
|
106
|
+
ObjectifyWithAttributes(C, type(S),
|
|
107
|
+
ParentAttr, S,
|
|
108
|
+
IsGreensClassNC, nc,
|
|
109
|
+
EquivalenceClassRelation, rel(S),
|
|
110
|
+
Representative, erep);
|
|
111
|
+
|
|
112
|
+
if IsInverseActingSemigroupRep(S) then
|
|
113
|
+
SetFilterObj(C, IsInverseActingRepGreensClass);
|
|
114
|
+
elif IsRegularActingSemigroupRep(S) then
|
|
115
|
+
SetFilterObj(C, IsRegularActingRepGreensClass);
|
|
116
|
+
elif HasIsRegularSemigroup(S) and IsRegularSemigroup(S) then
|
|
117
|
+
if type <> HClassType then
|
|
118
|
+
SetIsRegularGreensClass(C, true);
|
|
119
|
+
fi;
|
|
120
|
+
fi;
|
|
121
|
+
|
|
122
|
+
return C;
|
|
123
|
+
end;
|
|
124
|
+
|
|
125
|
+
# same method for regular/inverse
|
|
126
|
+
|
|
127
|
+
SEMIGROUPS.CreateDClass := function(arg...)
|
|
128
|
+
return SEMIGROUPS.CreateXClass(arg, DClassType, GreensDRelation);
|
|
129
|
+
end;
|
|
130
|
+
|
|
131
|
+
# same method for regular/inverse
|
|
132
|
+
|
|
133
|
+
SEMIGROUPS.CreateRClass := function(arg...)
|
|
134
|
+
return SEMIGROUPS.CreateXClass(arg, RClassType, GreensRRelation);
|
|
135
|
+
end;
|
|
136
|
+
|
|
137
|
+
# same method for regular/inverse
|
|
138
|
+
|
|
139
|
+
SEMIGROUPS.CreateLClass := function(arg...)
|
|
140
|
+
return SEMIGROUPS.CreateXClass(arg, LClassType, GreensLRelation);
|
|
141
|
+
end;
|
|
142
|
+
|
|
143
|
+
# same method for regular/inverse
|
|
144
|
+
|
|
145
|
+
SEMIGROUPS.CreateHClass := function(arg...)
|
|
146
|
+
return SEMIGROUPS.CreateXClass(arg, HClassType, GreensHRelation);
|
|
147
|
+
end;
|
|
148
|
+
|
|
149
|
+
SEMIGROUPS.SetLambda := function(C)
|
|
150
|
+
local S, o;
|
|
151
|
+
|
|
152
|
+
S := Parent(C);
|
|
153
|
+
if HasLambdaOrb(S) and IsClosedOrbit(LambdaOrb(S))
|
|
154
|
+
and not IsGreensClassNC(C) then
|
|
155
|
+
SetLambdaOrb(C, LambdaOrb(S));
|
|
156
|
+
SetLambdaOrbSCCIndex(C, OrbSCCIndex(LambdaOrb(S), LambdaFunc(S)(C!.rep)));
|
|
157
|
+
else
|
|
158
|
+
o := GradedLambdaOrb(S, C!.rep, IsGreensClassNC(C) <> true, C);
|
|
159
|
+
SetLambdaOrb(C, o);
|
|
160
|
+
SetLambdaOrbSCCIndex(C, OrbSCCLookup(o)[C!.LambdaPos]);
|
|
161
|
+
fi;
|
|
162
|
+
end;
|
|
163
|
+
|
|
164
|
+
SEMIGROUPS.SetRho := function(C)
|
|
165
|
+
local S, o;
|
|
166
|
+
|
|
167
|
+
S := Parent(C);
|
|
168
|
+
if HasRhoOrb(S) and IsClosedOrbit(RhoOrb(S)) and not IsGreensClassNC(C) then
|
|
169
|
+
SetRhoOrb(C, RhoOrb(S));
|
|
170
|
+
SetRhoOrbSCCIndex(C, OrbSCCIndex(RhoOrb(S), RhoFunc(S)(C!.rep)));
|
|
171
|
+
else
|
|
172
|
+
o := GradedRhoOrb(S, C!.rep, IsGreensClassNC(C) <> true, C);
|
|
173
|
+
SetRhoOrb(C, o);
|
|
174
|
+
SetRhoOrbSCCIndex(C, OrbSCCLookup(o)[C!.RhoPos]);
|
|
175
|
+
fi;
|
|
176
|
+
end;
|
|
177
|
+
|
|
178
|
+
SEMIGROUPS.CopyLambda := function(old, new)
|
|
179
|
+
SetLambdaOrb(new, LambdaOrb(old));
|
|
180
|
+
SetLambdaOrbSCCIndex(new, LambdaOrbSCCIndex(old));
|
|
181
|
+
return;
|
|
182
|
+
end;
|
|
183
|
+
|
|
184
|
+
SEMIGROUPS.CopyRho := function(old, new)
|
|
185
|
+
SetRhoOrb(new, RhoOrb(old));
|
|
186
|
+
SetRhoOrbSCCIndex(new, RhoOrbSCCIndex(old));
|
|
187
|
+
return;
|
|
188
|
+
end;
|
|
189
|
+
|
|
190
|
+
SEMIGROUPS.RectifyLambda := function(C)
|
|
191
|
+
local o, i, m;
|
|
192
|
+
Assert(1, not IsGreensHClass(C));
|
|
193
|
+
|
|
194
|
+
o := LambdaOrb(C);
|
|
195
|
+
|
|
196
|
+
if not IsBound(C!.LambdaPos) then
|
|
197
|
+
i := Position(o, LambdaFunc(Parent(C))(C!.rep));
|
|
198
|
+
else
|
|
199
|
+
i := C!.LambdaPos;
|
|
200
|
+
fi;
|
|
201
|
+
|
|
202
|
+
m := LambdaOrbSCCIndex(C);
|
|
203
|
+
|
|
204
|
+
if i <> OrbSCC(o)[m][1] then
|
|
205
|
+
C!.rep := C!.rep * LambdaOrbMult(o, m, i)[2];
|
|
206
|
+
# don't set Representative in case we must also rectify Rho
|
|
207
|
+
fi;
|
|
208
|
+
|
|
209
|
+
return;
|
|
210
|
+
end;
|
|
211
|
+
|
|
212
|
+
SEMIGROUPS.RectifyRho := function(C)
|
|
213
|
+
local o, i, m;
|
|
214
|
+
Assert(1, not IsGreensHClass(C));
|
|
215
|
+
o := RhoOrb(C);
|
|
216
|
+
|
|
217
|
+
if not IsBound(C!.RhoPos) then
|
|
218
|
+
i := Position(o, RhoFunc(Parent(C))(C!.rep));
|
|
219
|
+
else
|
|
220
|
+
i := C!.RhoPos;
|
|
221
|
+
fi;
|
|
222
|
+
|
|
223
|
+
m := RhoOrbSCCIndex(C);
|
|
224
|
+
|
|
225
|
+
if i <> OrbSCC(o)[m][1] then
|
|
226
|
+
C!.rep := RhoOrbMult(o, m, i)[2] * C!.rep;
|
|
227
|
+
# don't set Representative in case we must also rectify Lambda
|
|
228
|
+
fi;
|
|
229
|
+
|
|
230
|
+
return;
|
|
231
|
+
end;
|
|
232
|
+
|
|
233
|
+
# helper function, for: Green's class, lambda/rho value, rho/lambda scc,
|
|
234
|
+
# rho/lambda orbit, and boolean
|
|
235
|
+
|
|
236
|
+
SEMIGROUPS.Idempotents := function(x, value, scc, o, onright)
|
|
237
|
+
local S, out, j, tester, creator, i;
|
|
238
|
+
Assert(1, IsActingSemigroupGreensClass(x));
|
|
239
|
+
|
|
240
|
+
if HasIsRegularGreensClass(x) and not IsRegularGreensClass(x) then
|
|
241
|
+
return [];
|
|
242
|
+
fi;
|
|
243
|
+
|
|
244
|
+
S := Parent(x);
|
|
245
|
+
|
|
246
|
+
if IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
247
|
+
and IsMultiplicativeElementWithOneCollection(S)
|
|
248
|
+
and ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
|
|
249
|
+
return [One(S)];
|
|
250
|
+
fi;
|
|
251
|
+
|
|
252
|
+
out := EmptyPlist(Length(scc));
|
|
253
|
+
j := 0;
|
|
254
|
+
tester := IdempotentTester(S);
|
|
255
|
+
creator := IdempotentCreator(S);
|
|
256
|
+
|
|
257
|
+
if onright then
|
|
258
|
+
for i in scc do
|
|
259
|
+
if tester(o[i], value) then
|
|
260
|
+
j := j + 1;
|
|
261
|
+
out[j] := ConvertToExternalElement(S, creator(o[i], value));
|
|
262
|
+
fi;
|
|
263
|
+
od;
|
|
264
|
+
else
|
|
265
|
+
for i in scc do
|
|
266
|
+
if tester(value, o[i]) then
|
|
267
|
+
j := j + 1;
|
|
268
|
+
out[j] := ConvertToExternalElement(S, creator(value, o[i]));
|
|
269
|
+
fi;
|
|
270
|
+
od;
|
|
271
|
+
fi;
|
|
272
|
+
|
|
273
|
+
if not HasIsRegularGreensClass(x) then
|
|
274
|
+
SetIsRegularGreensClass(x, j <> 0);
|
|
275
|
+
fi;
|
|
276
|
+
|
|
277
|
+
# can't set NrIdempotents here since we sometimes input a D-class here.
|
|
278
|
+
|
|
279
|
+
ShrinkAllocationPlist(out);
|
|
280
|
+
return out;
|
|
281
|
+
end;
|
|
282
|
+
|
|
283
|
+
# helper function, for: Green's class, lambda/rho value, rho/lambda scc,
|
|
284
|
+
# rho/lambda orbit, and boolean
|
|
285
|
+
|
|
286
|
+
SEMIGROUPS.NrIdempotents := function(x, value, scc, o, onright)
|
|
287
|
+
local S, data, m, nr, tester, i;
|
|
288
|
+
|
|
289
|
+
if HasIsRegularGreensClass(x) and not IsRegularGreensClass(x) then
|
|
290
|
+
return 0;
|
|
291
|
+
fi;
|
|
292
|
+
|
|
293
|
+
S := Parent(x);
|
|
294
|
+
|
|
295
|
+
# check if we already know this...
|
|
296
|
+
if HasSemigroupDataIndex(x)
|
|
297
|
+
and not (HasIsRegularGreensClass(x) and IsRegularGreensClass(x)) then
|
|
298
|
+
data := SemigroupData(S);
|
|
299
|
+
m := LambdaOrbSCCIndex(x);
|
|
300
|
+
if data!.repslens[m][data!.orblookup1[SemigroupDataIndex(x)]] > 1 then
|
|
301
|
+
return 0;
|
|
302
|
+
fi;
|
|
303
|
+
fi;
|
|
304
|
+
|
|
305
|
+
# is r the group of units...
|
|
306
|
+
if IsActingSemigroupWithFixedDegreeMultiplication(S) and
|
|
307
|
+
ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
|
|
308
|
+
return 1;
|
|
309
|
+
fi;
|
|
310
|
+
|
|
311
|
+
nr := 0;
|
|
312
|
+
tester := IdempotentTester(S);
|
|
313
|
+
|
|
314
|
+
if onright then
|
|
315
|
+
for i in scc do
|
|
316
|
+
if tester(o[i], value) then
|
|
317
|
+
nr := nr + 1;
|
|
318
|
+
fi;
|
|
319
|
+
od;
|
|
320
|
+
else
|
|
321
|
+
for i in scc do
|
|
322
|
+
if tester(value, o[i]) then
|
|
323
|
+
nr := nr + 1;
|
|
324
|
+
fi;
|
|
325
|
+
od;
|
|
326
|
+
fi;
|
|
327
|
+
|
|
328
|
+
if not HasIsRegularGreensClass(x) then
|
|
329
|
+
SetIsRegularGreensClass(x, nr <> 0);
|
|
330
|
+
fi;
|
|
331
|
+
|
|
332
|
+
return nr;
|
|
333
|
+
end;
|
|
334
|
+
|
|
335
|
+
# helper function, for: Green's class, lambda/rho value, rho/lambda scc,
|
|
336
|
+
# rho/lambda orbit, and boolean
|
|
337
|
+
|
|
338
|
+
SEMIGROUPS.IsRegularGreensClass := function(x, value, scc, o, onright)
|
|
339
|
+
local S, data, m, tester, i;
|
|
340
|
+
|
|
341
|
+
if HasNrIdempotents(x) then
|
|
342
|
+
return NrIdempotents(x) <> 0;
|
|
343
|
+
fi;
|
|
344
|
+
|
|
345
|
+
S := Parent(x);
|
|
346
|
+
|
|
347
|
+
if HasSemigroupDataIndex(x) then
|
|
348
|
+
data := SemigroupData(S);
|
|
349
|
+
m := LambdaOrbSCCIndex(x);
|
|
350
|
+
if data!.repslens[m][data!.orblookup1[SemigroupDataIndex(x)]] > 1 then
|
|
351
|
+
return false;
|
|
352
|
+
fi;
|
|
353
|
+
fi;
|
|
354
|
+
|
|
355
|
+
# is x the group of units...
|
|
356
|
+
if IsActingSemigroupWithFixedDegreeMultiplication(S) and
|
|
357
|
+
ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
|
|
358
|
+
return true;
|
|
359
|
+
fi;
|
|
360
|
+
|
|
361
|
+
tester := IdempotentTester(S);
|
|
362
|
+
|
|
363
|
+
if onright then
|
|
364
|
+
for i in scc do
|
|
365
|
+
if tester(o[i], value) then
|
|
366
|
+
return true;
|
|
367
|
+
fi;
|
|
368
|
+
od;
|
|
369
|
+
else
|
|
370
|
+
for i in scc do
|
|
371
|
+
if tester(value, o[i]) then
|
|
372
|
+
return true;
|
|
373
|
+
fi;
|
|
374
|
+
od;
|
|
375
|
+
fi;
|
|
376
|
+
|
|
377
|
+
return false;
|
|
378
|
+
end;
|
|
379
|
+
|
|
380
|
+
# Lambda-Rho stuff
|
|
381
|
+
|
|
382
|
+
# same method for regular/inverse/ideals
|
|
383
|
+
|
|
384
|
+
InstallMethod(LambdaOrbSCC, "for a Green's class of an acting semigroup",
|
|
385
|
+
[IsActingSemigroupGreensClass and IsGreensClass],
|
|
386
|
+
C -> OrbSCC(LambdaOrb(C))[LambdaOrbSCCIndex(C)]);
|
|
387
|
+
|
|
388
|
+
# same method for regular/inverse/ideals
|
|
389
|
+
|
|
390
|
+
InstallMethod(RhoOrbSCC, "for a Green's class of an acting semigroup",
|
|
391
|
+
[IsActingSemigroupGreensClass and IsGreensClass],
|
|
392
|
+
C -> OrbSCC(RhoOrb(C))[RhoOrbSCCIndex(C)]);
|
|
393
|
+
|
|
394
|
+
# not required for regular/inverse, same method for ideals
|
|
395
|
+
|
|
396
|
+
InstallMethod(LambdaCosets, "for a D-class of an acting semigroup",
|
|
397
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
398
|
+
function(D)
|
|
399
|
+
return RightTransversal(LambdaOrbSchutzGp(LambdaOrb(D),
|
|
400
|
+
LambdaOrbSCCIndex(D)),
|
|
401
|
+
SchutzenbergerGroup(D));
|
|
402
|
+
end);
|
|
403
|
+
|
|
404
|
+
# not required for regular/inverse, same method for ideals
|
|
405
|
+
|
|
406
|
+
InstallMethod(RhoCosets, "for a D-class of an acting semigroup",
|
|
407
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
408
|
+
function(D)
|
|
409
|
+
local o, m, S;
|
|
410
|
+
o := RhoOrb(D);
|
|
411
|
+
m := RhoOrbSCCIndex(D);
|
|
412
|
+
S := Parent(D);
|
|
413
|
+
return RightTransversal(RhoOrbSchutzGp(o, m) ^
|
|
414
|
+
LambdaConjugator(S)(RhoOrbRep(o, m),
|
|
415
|
+
D!.rep),
|
|
416
|
+
SchutzenbergerGroup(D));
|
|
417
|
+
end);
|
|
418
|
+
|
|
419
|
+
# note that the RhoCosets of the D-class containing an L-class are not the same
|
|
420
|
+
# as the RhoCosets of the L-class. The RhoCosets of a D-class correspond to the
|
|
421
|
+
# lambda value of the rep of the D-class (which is in the first place of its
|
|
422
|
+
# scc) and the rep of the D-class but the RhoCosets of the L-class should
|
|
423
|
+
# correspond to the lambda value of the rep of the L-class which is not nec in
|
|
424
|
+
# the first place of its scc.
|
|
425
|
+
|
|
426
|
+
# different method for regular, same method for ideals
|
|
427
|
+
|
|
428
|
+
InstallMethod(RhoCosets, "for a L-class of an acting semigroup",
|
|
429
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
430
|
+
function(L)
|
|
431
|
+
local D, S, rep, m, o, pos, x, conj;
|
|
432
|
+
|
|
433
|
+
D := DClassOfLClass(L);
|
|
434
|
+
S := Parent(L);
|
|
435
|
+
o := LambdaOrb(D);
|
|
436
|
+
m := LambdaOrbSCCIndex(D);
|
|
437
|
+
|
|
438
|
+
if IsRegularGreensClass(L) or Length(RhoCosets(D)) = 1 then
|
|
439
|
+
# Maybe <L> is regular and doesn't know it!
|
|
440
|
+
return [LambdaIdentity(S)(LambdaRank(S)(o[OrbSCC(o)[m][1]]))];
|
|
441
|
+
fi;
|
|
442
|
+
|
|
443
|
+
rep := L!.rep;
|
|
444
|
+
pos := Position(o, LambdaFunc(S)(rep));
|
|
445
|
+
|
|
446
|
+
if pos = OrbSCC(o)[m][1] then
|
|
447
|
+
return RhoCosets(D);
|
|
448
|
+
else
|
|
449
|
+
x := rep * LambdaOrbMult(o, m, pos)[2];
|
|
450
|
+
conj := LambdaConjugator(S)(x, rep) * LambdaPerm(S)(x, D!.rep);
|
|
451
|
+
return List(RhoCosets(D), x -> x ^ conj);
|
|
452
|
+
fi;
|
|
453
|
+
end);
|
|
454
|
+
|
|
455
|
+
# different method for regular/inverse, same for ideals
|
|
456
|
+
|
|
457
|
+
InstallMethod(RhoOrbStabChain, "for a D-class of an acting semigroup",
|
|
458
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
459
|
+
D -> RhoOrbStabChain(GreensLClassOfElementNC(D, D!.rep)));
|
|
460
|
+
|
|
461
|
+
# same method for regular, not required for inverse, same for ideals
|
|
462
|
+
|
|
463
|
+
InstallMethod(RhoOrbStabChain, "for an L-class of an acting semigroup",
|
|
464
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
465
|
+
function(L)
|
|
466
|
+
local G;
|
|
467
|
+
|
|
468
|
+
G := SchutzenbergerGroup(L);
|
|
469
|
+
|
|
470
|
+
if IsTrivial(G) then
|
|
471
|
+
return false;
|
|
472
|
+
elif IsNaturalSymmetricGroup(G) and
|
|
473
|
+
NrMovedPoints(G) = ActionRank(Parent(L))(L!.rep) then
|
|
474
|
+
return true;
|
|
475
|
+
elif IsPermGroup(G) then
|
|
476
|
+
return StabChainImmutable(G);
|
|
477
|
+
else # if IsMatrixGroup(g)
|
|
478
|
+
return G;
|
|
479
|
+
fi;
|
|
480
|
+
end);
|
|
481
|
+
|
|
482
|
+
InstallMethod(SemigroupDataIndex,
|
|
483
|
+
"for an acting semigroup Green's class",
|
|
484
|
+
[IsActingSemigroupGreensClass],
|
|
485
|
+
C -> Position(SemigroupData(Parent(C)), Representative(C)));
|
|
486
|
+
|
|
487
|
+
# different method for regular/inverse/ideals
|
|
488
|
+
|
|
489
|
+
InstallMethod(SchutzenbergerGroup, "for a D-class of an acting semigroup",
|
|
490
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
491
|
+
function(D)
|
|
492
|
+
local o, m, lambda_schutz, lambda_stab, rho_schutz, rho_stab, schutz, p;
|
|
493
|
+
|
|
494
|
+
o := LambdaOrb(D);
|
|
495
|
+
m := LambdaOrbSCCIndex(D);
|
|
496
|
+
lambda_schutz := LambdaOrbSchutzGp(o, m);
|
|
497
|
+
lambda_stab := LambdaOrbStabChain(o, m);
|
|
498
|
+
|
|
499
|
+
o := RhoOrb(D);
|
|
500
|
+
m := RhoOrbSCCIndex(D);
|
|
501
|
+
rho_schutz := RhoOrbSchutzGp(o, m);
|
|
502
|
+
rho_stab := RhoOrbStabChain(o, m);
|
|
503
|
+
|
|
504
|
+
if rho_stab = true then
|
|
505
|
+
schutz := lambda_schutz;
|
|
506
|
+
if lambda_stab = true then
|
|
507
|
+
SetRhoOrbStabChain(D, true);
|
|
508
|
+
# Right transversal required so can use PositionCanonical
|
|
509
|
+
SetRhoCosets(D, RightTransversal(schutz, schutz));
|
|
510
|
+
return lambda_schutz;
|
|
511
|
+
fi;
|
|
512
|
+
elif rho_stab = false then
|
|
513
|
+
SetRhoOrbStabChain(D, false);
|
|
514
|
+
SetRhoCosets(D, RightTransversal(rho_schutz, rho_schutz));
|
|
515
|
+
return rho_schutz;
|
|
516
|
+
fi;
|
|
517
|
+
|
|
518
|
+
# Use D!.rep because it might be different that Representative(D)
|
|
519
|
+
p := LambdaConjugator(Parent(D))(RhoOrbRep(o, m), D!.rep);
|
|
520
|
+
rho_schutz := rho_schutz ^ p;
|
|
521
|
+
|
|
522
|
+
if IsPermGroup(rho_schutz) then
|
|
523
|
+
SetRhoOrbStabChain(D, StabChainImmutable(rho_schutz));
|
|
524
|
+
else # if IsMatrixGroup(g)
|
|
525
|
+
SetRhoOrbStabChain(D, rho_schutz);
|
|
526
|
+
fi;
|
|
527
|
+
|
|
528
|
+
if lambda_stab = false then
|
|
529
|
+
SetRhoCosets(D, Enumerator(rho_schutz));
|
|
530
|
+
return lambda_schutz;
|
|
531
|
+
elif lambda_stab = true then
|
|
532
|
+
schutz := rho_schutz;
|
|
533
|
+
else
|
|
534
|
+
schutz := Intersection(lambda_schutz, rho_schutz);
|
|
535
|
+
fi;
|
|
536
|
+
|
|
537
|
+
SetRhoCosets(D, RightTransversal(rho_schutz, schutz));
|
|
538
|
+
return schutz;
|
|
539
|
+
end);
|
|
540
|
+
|
|
541
|
+
# same method for regular/inverse/ideals
|
|
542
|
+
|
|
543
|
+
InstallMethod(SchutzenbergerGroup, "for an R-class of an acting semigroup",
|
|
544
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
545
|
+
R -> LambdaOrbSchutzGp(LambdaOrb(R), LambdaOrbSCCIndex(R)));
|
|
546
|
+
|
|
547
|
+
# same method for regular/ideals, different method for inverse
|
|
548
|
+
|
|
549
|
+
InstallMethod(SchutzenbergerGroup, "for an L-class of an acting semigroup",
|
|
550
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
551
|
+
function(L)
|
|
552
|
+
local o, m, p;
|
|
553
|
+
o := RhoOrb(L);
|
|
554
|
+
m := RhoOrbSCCIndex(L);
|
|
555
|
+
p := LambdaConjugator(Parent(L))(RhoOrbRep(o, m), L!.rep);
|
|
556
|
+
return RhoOrbSchutzGp(o, m) ^ p;
|
|
557
|
+
end);
|
|
558
|
+
|
|
559
|
+
# different method for regular/inverse, same method for ideals
|
|
560
|
+
|
|
561
|
+
InstallMethod(SchutzenbergerGroup, "for a H-class of an acting semigroup",
|
|
562
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
563
|
+
function(H)
|
|
564
|
+
local lambda_o, lambda_m, lambda_schutz, lambda_stab, rho_o, rho_m,
|
|
565
|
+
rho_schutz, rho_stab, S, rep, lambda_mult, lambda_p, rho_mult, rho_p;
|
|
566
|
+
|
|
567
|
+
lambda_o := LambdaOrb(H);
|
|
568
|
+
lambda_m := LambdaOrbSCCIndex(H);
|
|
569
|
+
lambda_schutz := LambdaOrbSchutzGp(lambda_o, lambda_m);
|
|
570
|
+
lambda_stab := LambdaOrbStabChain(lambda_o, lambda_m);
|
|
571
|
+
|
|
572
|
+
if lambda_stab = false then
|
|
573
|
+
return lambda_schutz;
|
|
574
|
+
fi;
|
|
575
|
+
|
|
576
|
+
rho_o := RhoOrb(H);
|
|
577
|
+
rho_m := RhoOrbSCCIndex(H);
|
|
578
|
+
rho_schutz := RhoOrbSchutzGp(rho_o, rho_m);
|
|
579
|
+
rho_stab := RhoOrbStabChain(rho_o, rho_m);
|
|
580
|
+
|
|
581
|
+
if rho_stab = false then
|
|
582
|
+
return rho_schutz;
|
|
583
|
+
fi;
|
|
584
|
+
|
|
585
|
+
S := Parent(H);
|
|
586
|
+
rep := H!.rep;
|
|
587
|
+
|
|
588
|
+
lambda_mult := LambdaOrbMult(lambda_o,
|
|
589
|
+
lambda_m,
|
|
590
|
+
Position(lambda_o, LambdaFunc(S)(rep)))[2];
|
|
591
|
+
|
|
592
|
+
# the points acted on by LambdaSchutzGp mapped to the lambda value of rep
|
|
593
|
+
lambda_p := LambdaConjugator(S)(rep * lambda_mult, rep);
|
|
594
|
+
|
|
595
|
+
if rho_stab = true then
|
|
596
|
+
return lambda_schutz ^ lambda_p;
|
|
597
|
+
fi;
|
|
598
|
+
|
|
599
|
+
rho_mult := RhoOrbMult(rho_o, rho_m, Position(rho_o, RhoFunc(S)(rep)))[2];
|
|
600
|
+
# the points acted on by RhoSchutzGp mapped to the corresponding points for
|
|
601
|
+
# rep (the rho value mapped through the rep so that it is on the right)
|
|
602
|
+
rho_p := LambdaConjugator(S)(RhoOrbRep(rho_o, rho_m), rho_mult * rep);
|
|
603
|
+
|
|
604
|
+
return Intersection(lambda_schutz ^ lambda_p, rho_schutz ^ rho_p);
|
|
605
|
+
end);
|
|
606
|
+
|
|
607
|
+
#############################################################################
|
|
608
|
+
## 2. Technical Green's classes stuff . . .
|
|
609
|
+
#############################################################################
|
|
610
|
+
|
|
611
|
+
# Different method for regular/inverse
|
|
612
|
+
|
|
613
|
+
InstallMethod(\<, "for Green's D-classes of an acting semigroup",
|
|
614
|
+
[IsGreensDClass and IsActingSemigroupGreensClass,
|
|
615
|
+
IsGreensDClass and IsActingSemigroupGreensClass],
|
|
616
|
+
function(x, y)
|
|
617
|
+
local scc;
|
|
618
|
+
if Parent(x) <> Parent(y) or x = y then
|
|
619
|
+
return false;
|
|
620
|
+
fi;
|
|
621
|
+
scc := OrbSCCLookup(SemigroupData(Parent(x)));
|
|
622
|
+
return scc[SemigroupDataIndex(x)] < scc[SemigroupDataIndex(y)];
|
|
623
|
+
end);
|
|
624
|
+
|
|
625
|
+
# Different method for regular/inverse
|
|
626
|
+
|
|
627
|
+
InstallMethod(\<, "for Green's R-classes of an acting semigroup",
|
|
628
|
+
[IsGreensRClass and IsActingSemigroupGreensClass,
|
|
629
|
+
IsGreensRClass and IsActingSemigroupGreensClass],
|
|
630
|
+
function(x, y)
|
|
631
|
+
if Parent(x) <> Parent(y) or x = y then
|
|
632
|
+
return false;
|
|
633
|
+
fi;
|
|
634
|
+
return SemigroupDataIndex(x) < SemigroupDataIndex(y);
|
|
635
|
+
end);
|
|
636
|
+
|
|
637
|
+
# TODO(later) a method for L-classes?
|
|
638
|
+
|
|
639
|
+
InstallMethod(IsRegularDClass, "for a Green's D-class",
|
|
640
|
+
[IsGreensDClass and IsActingSemigroupGreensClass], IsRegularGreensClass);
|
|
641
|
+
|
|
642
|
+
# different method for regular/inverse
|
|
643
|
+
|
|
644
|
+
InstallMethod(DClassType, "for an acting semigroup",
|
|
645
|
+
[IsActingSemigroup],
|
|
646
|
+
function(S)
|
|
647
|
+
return NewType(FamilyObj(S), IsEquivalenceClass
|
|
648
|
+
and IsEquivalenceClassDefaultRep
|
|
649
|
+
and IsGreensDClass
|
|
650
|
+
and IsActingSemigroupGreensClass);
|
|
651
|
+
end);
|
|
652
|
+
|
|
653
|
+
# different method for regular/inverse
|
|
654
|
+
|
|
655
|
+
InstallMethod(HClassType, "for an acting semigroup",
|
|
656
|
+
[IsActingSemigroup],
|
|
657
|
+
function(S)
|
|
658
|
+
return NewType(FamilyObj(S), IsEquivalenceClass
|
|
659
|
+
and IsEquivalenceClassDefaultRep
|
|
660
|
+
and IsGreensHClass
|
|
661
|
+
and IsActingSemigroupGreensClass);
|
|
662
|
+
end);
|
|
663
|
+
|
|
664
|
+
# different method for regular/inverse
|
|
665
|
+
|
|
666
|
+
InstallMethod(LClassType, "for an acting semigroup",
|
|
667
|
+
[IsActingSemigroup],
|
|
668
|
+
function(S)
|
|
669
|
+
return NewType(FamilyObj(S), IsEquivalenceClass
|
|
670
|
+
and IsEquivalenceClassDefaultRep
|
|
671
|
+
and IsGreensLClass
|
|
672
|
+
and IsActingSemigroupGreensClass);
|
|
673
|
+
end);
|
|
674
|
+
|
|
675
|
+
# different method for regular/inverse
|
|
676
|
+
|
|
677
|
+
InstallMethod(RClassType, "for an acting semigroup",
|
|
678
|
+
[IsActingSemigroup],
|
|
679
|
+
function(S)
|
|
680
|
+
return NewType(FamilyObj(S), IsEquivalenceClass
|
|
681
|
+
and IsEquivalenceClassDefaultRep
|
|
682
|
+
and IsGreensRClass
|
|
683
|
+
and IsActingSemigroupGreensClass);
|
|
684
|
+
end);
|
|
685
|
+
|
|
686
|
+
#############################################################################
|
|
687
|
+
## 3. Individual classes . . .
|
|
688
|
+
#############################################################################
|
|
689
|
+
|
|
690
|
+
# same method for regular/ideals, different method for inverse
|
|
691
|
+
|
|
692
|
+
InstallMethod(DClassOfLClass, "for an L-class of an acting semigroup",
|
|
693
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
694
|
+
function(L)
|
|
695
|
+
local D;
|
|
696
|
+
D := SEMIGROUPS.CreateDClass(L);
|
|
697
|
+
SEMIGROUPS.CopyRho(L, D);
|
|
698
|
+
SEMIGROUPS.SetLambda(D);
|
|
699
|
+
SEMIGROUPS.RectifyLambda(D);
|
|
700
|
+
return D;
|
|
701
|
+
end);
|
|
702
|
+
|
|
703
|
+
# same method for regular/ideals, different method for inverse
|
|
704
|
+
|
|
705
|
+
InstallMethod(DClassOfRClass, "for an R-class of an acting semigroup",
|
|
706
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
707
|
+
function(R)
|
|
708
|
+
local D;
|
|
709
|
+
D := SEMIGROUPS.CreateDClass(R);
|
|
710
|
+
SEMIGROUPS.CopyLambda(R, D);
|
|
711
|
+
SEMIGROUPS.SetRho(D);
|
|
712
|
+
SEMIGROUPS.RectifyRho(D);
|
|
713
|
+
return D;
|
|
714
|
+
end);
|
|
715
|
+
|
|
716
|
+
# same method for regular, different method for inverse semigroups,
|
|
717
|
+
# same for ideals
|
|
718
|
+
|
|
719
|
+
InstallMethod(DClassOfHClass, "for an H-class of an acting semigroup",
|
|
720
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
721
|
+
function(H)
|
|
722
|
+
local D;
|
|
723
|
+
D := SEMIGROUPS.CreateDClass(H);
|
|
724
|
+
SEMIGROUPS.CopyLambda(H, D);
|
|
725
|
+
SEMIGROUPS.RectifyLambda(D);
|
|
726
|
+
SEMIGROUPS.CopyRho(H, D);
|
|
727
|
+
SEMIGROUPS.RectifyRho(D);
|
|
728
|
+
return D;
|
|
729
|
+
end);
|
|
730
|
+
|
|
731
|
+
# same method for regular/ideals, different method for inverse
|
|
732
|
+
|
|
733
|
+
InstallMethod(LClassOfHClass, "for an H-class of an acting semigroup",
|
|
734
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
735
|
+
function(H)
|
|
736
|
+
local L;
|
|
737
|
+
L := SEMIGROUPS.CreateLClass(H);
|
|
738
|
+
SEMIGROUPS.CopyRho(H, L);
|
|
739
|
+
SEMIGROUPS.RectifyRho(L);
|
|
740
|
+
return L;
|
|
741
|
+
end);
|
|
742
|
+
|
|
743
|
+
# same method for regular/inverse/ideals
|
|
744
|
+
|
|
745
|
+
InstallMethod(RClassOfHClass, "for an H-class of an acting semigroup",
|
|
746
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
747
|
+
function(H)
|
|
748
|
+
local R;
|
|
749
|
+
R := SEMIGROUPS.CreateRClass(H);
|
|
750
|
+
SEMIGROUPS.CopyLambda(H, R);
|
|
751
|
+
SEMIGROUPS.RectifyLambda(R);
|
|
752
|
+
return R;
|
|
753
|
+
end);
|
|
754
|
+
|
|
755
|
+
# same method for regular/ideals/inverse
|
|
756
|
+
|
|
757
|
+
InstallMethod(GreensDClassOfElement, "for an acting semigroup and element",
|
|
758
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
759
|
+
function(S, x)
|
|
760
|
+
if not x in S then
|
|
761
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
762
|
+
"to the 1st argument (a semigroup)");
|
|
763
|
+
fi;
|
|
764
|
+
return GreensDClassOfElementNC(S, x, false);
|
|
765
|
+
end);
|
|
766
|
+
|
|
767
|
+
# same method for regular/ideals/inverse
|
|
768
|
+
|
|
769
|
+
InstallMethod(GreensDClassOfElementNC, "for an acting semigroup and element",
|
|
770
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
771
|
+
{S, x} -> GreensDClassOfElementNC(S, x, true));
|
|
772
|
+
|
|
773
|
+
# same method for regular/ideals, different method for inverse
|
|
774
|
+
|
|
775
|
+
InstallMethod(GreensDClassOfElementNC,
|
|
776
|
+
"for an acting semigroup, element, and bool",
|
|
777
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsBool],
|
|
778
|
+
function(S, x, isGreensClassNC)
|
|
779
|
+
local D;
|
|
780
|
+
D := SEMIGROUPS.CreateDClass(S, x, isGreensClassNC);
|
|
781
|
+
SEMIGROUPS.SetLambda(D);
|
|
782
|
+
SEMIGROUPS.RectifyLambda(D);
|
|
783
|
+
SEMIGROUPS.SetRho(D);
|
|
784
|
+
SEMIGROUPS.RectifyRho(D);
|
|
785
|
+
return D;
|
|
786
|
+
end);
|
|
787
|
+
|
|
788
|
+
# same method for regular/ideals/inverse
|
|
789
|
+
|
|
790
|
+
InstallMethod(GreensLClassOfElement, "for an acting semigroup and element",
|
|
791
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
792
|
+
function(S, x)
|
|
793
|
+
if not x in S then
|
|
794
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
795
|
+
"to the 1st argument (a semigroup)");
|
|
796
|
+
fi;
|
|
797
|
+
return GreensLClassOfElementNC(S, x, false);
|
|
798
|
+
end);
|
|
799
|
+
|
|
800
|
+
# same method for regular/ideals/inverse
|
|
801
|
+
|
|
802
|
+
InstallMethod(GreensLClassOfElementNC, "for an acting semigroup and element",
|
|
803
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
804
|
+
{S, x} -> GreensLClassOfElementNC(S, x, true));
|
|
805
|
+
|
|
806
|
+
# same method for regular/ideals, different method for inverse
|
|
807
|
+
|
|
808
|
+
InstallMethod(GreensLClassOfElementNC,
|
|
809
|
+
"for an acting semigroup, element, and bool",
|
|
810
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsBool],
|
|
811
|
+
function(S, x, isGreensClassNC)
|
|
812
|
+
local L;
|
|
813
|
+
L := SEMIGROUPS.CreateLClass(S, x, isGreensClassNC);
|
|
814
|
+
SEMIGROUPS.SetRho(L);
|
|
815
|
+
SEMIGROUPS.RectifyRho(L);
|
|
816
|
+
return L;
|
|
817
|
+
end);
|
|
818
|
+
|
|
819
|
+
# same method for regular/ideals/inverse
|
|
820
|
+
|
|
821
|
+
InstallMethod(GreensLClassOfElement,
|
|
822
|
+
"for D-class of acting semigroup and element",
|
|
823
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
|
|
824
|
+
function(D, x)
|
|
825
|
+
if not x in D then
|
|
826
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
827
|
+
"to the 1st argument (a Green's D-class)");
|
|
828
|
+
fi;
|
|
829
|
+
return GreensLClassOfElementNC(D, x, IsGreensClassNC(D));
|
|
830
|
+
end);
|
|
831
|
+
|
|
832
|
+
# same method for regular/ideals/inverse
|
|
833
|
+
|
|
834
|
+
InstallMethod(GreensLClassOfElementNC, "for D-class and multiplicative element",
|
|
835
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
|
|
836
|
+
{D, x} -> GreensLClassOfElementNC(D, x, true));
|
|
837
|
+
|
|
838
|
+
# same method for regular/ideals, different method for inverse
|
|
839
|
+
|
|
840
|
+
InstallMethod(GreensLClassOfElementNC,
|
|
841
|
+
"for D-class, multiplicative element, and bool",
|
|
842
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement,
|
|
843
|
+
IsBool],
|
|
844
|
+
function(D, x, isGreensClassNC)
|
|
845
|
+
local L;
|
|
846
|
+
L := SEMIGROUPS.CreateLClass(D, x, isGreensClassNC);
|
|
847
|
+
# this is a special case, D might not be an inverse-op class but
|
|
848
|
+
# L might be an inverse-op class.
|
|
849
|
+
if IsInverseActingRepGreensClass(L) then
|
|
850
|
+
SEMIGROUPS.CopyLambda(D, L);
|
|
851
|
+
SEMIGROUPS.InverseRectifyRho(L);
|
|
852
|
+
else
|
|
853
|
+
SEMIGROUPS.CopyRho(D, L);
|
|
854
|
+
SEMIGROUPS.RectifyRho(L);
|
|
855
|
+
fi;
|
|
856
|
+
SetDClassOfLClass(L, D);
|
|
857
|
+
return L;
|
|
858
|
+
end);
|
|
859
|
+
|
|
860
|
+
# same method for regular/inverse/ideals
|
|
861
|
+
|
|
862
|
+
InstallMethod(GreensRClassOfElement, "for an acting semigroup and element",
|
|
863
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
864
|
+
function(S, x)
|
|
865
|
+
if not x in S then
|
|
866
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
867
|
+
"to the 1st argument (a semigroup)");
|
|
868
|
+
fi;
|
|
869
|
+
return GreensRClassOfElementNC(S, x, false);
|
|
870
|
+
end);
|
|
871
|
+
|
|
872
|
+
# same method for regular/inverse/ideals
|
|
873
|
+
|
|
874
|
+
InstallMethod(GreensRClassOfElementNC, "for an acting semigroup and element",
|
|
875
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
876
|
+
{S, x} -> GreensRClassOfElementNC(S, x, true));
|
|
877
|
+
|
|
878
|
+
# same method for regular/inverse/ideals
|
|
879
|
+
|
|
880
|
+
InstallMethod(GreensRClassOfElementNC,
|
|
881
|
+
"for an acting semigroup, multiplicative element, and bool",
|
|
882
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsBool],
|
|
883
|
+
function(S, x, isGreensClassNC)
|
|
884
|
+
local R;
|
|
885
|
+
R := SEMIGROUPS.CreateRClass(S, x, isGreensClassNC);
|
|
886
|
+
SEMIGROUPS.SetLambda(R);
|
|
887
|
+
SEMIGROUPS.RectifyLambda(R);
|
|
888
|
+
return R;
|
|
889
|
+
end);
|
|
890
|
+
|
|
891
|
+
# same method for regular/inverse/ideals
|
|
892
|
+
|
|
893
|
+
InstallMethod(GreensRClassOfElement,
|
|
894
|
+
"for an acting semigroup D-class and multiplicative element",
|
|
895
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
|
|
896
|
+
function(D, x)
|
|
897
|
+
if not x in D then
|
|
898
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
899
|
+
"to the 1st argument (a Green's D-class)");
|
|
900
|
+
fi;
|
|
901
|
+
return GreensRClassOfElementNC(D, x, IsGreensClassNC(D));
|
|
902
|
+
end);
|
|
903
|
+
|
|
904
|
+
# same method for regular/inverse/ideals
|
|
905
|
+
|
|
906
|
+
InstallMethod(GreensRClassOfElementNC, "for D-class and multiplicative element",
|
|
907
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
|
|
908
|
+
{D, x} -> GreensRClassOfElementNC(D, x, true));
|
|
909
|
+
|
|
910
|
+
# same method for regular/inverse/ideals
|
|
911
|
+
|
|
912
|
+
InstallMethod(GreensRClassOfElementNC,
|
|
913
|
+
"for a D-class, multiplicative element, and bool",
|
|
914
|
+
[IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement,
|
|
915
|
+
IsBool],
|
|
916
|
+
function(D, x, isGreensClassNC)
|
|
917
|
+
local R;
|
|
918
|
+
R := SEMIGROUPS.CreateRClass(D, x, isGreensClassNC);
|
|
919
|
+
SEMIGROUPS.CopyLambda(D, R);
|
|
920
|
+
SEMIGROUPS.RectifyLambda(R);
|
|
921
|
+
SetDClassOfRClass(R, D);
|
|
922
|
+
return R;
|
|
923
|
+
end);
|
|
924
|
+
|
|
925
|
+
# same method for regular/ideals/inverse
|
|
926
|
+
|
|
927
|
+
InstallMethod(GreensHClassOfElement, "for an acting semigroup and element",
|
|
928
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
929
|
+
function(S, x)
|
|
930
|
+
if not x in S then
|
|
931
|
+
ErrorNoReturn("the element does not belong to the semigroup");
|
|
932
|
+
fi;
|
|
933
|
+
return GreensHClassOfElementNC(S, x, false);
|
|
934
|
+
end);
|
|
935
|
+
|
|
936
|
+
# same method for regular/ideals/inverse
|
|
937
|
+
|
|
938
|
+
InstallMethod(GreensHClassOfElementNC, "for an acting semigroup and element",
|
|
939
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
940
|
+
{S, x} -> GreensHClassOfElementNC(S, x, true));
|
|
941
|
+
|
|
942
|
+
# same method for regular/ideals, different for inverse
|
|
943
|
+
|
|
944
|
+
InstallMethod(GreensHClassOfElementNC,
|
|
945
|
+
"for an acting semigroup, element, and bool",
|
|
946
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsBool],
|
|
947
|
+
function(S, x, isGreensClassNC)
|
|
948
|
+
local H;
|
|
949
|
+
H := SEMIGROUPS.CreateHClass(S, x, isGreensClassNC);
|
|
950
|
+
SEMIGROUPS.SetLambda(H);
|
|
951
|
+
SEMIGROUPS.SetRho(H);
|
|
952
|
+
return H;
|
|
953
|
+
end);
|
|
954
|
+
|
|
955
|
+
# same method for regular/ideals/inverse
|
|
956
|
+
|
|
957
|
+
InstallMethod(GreensHClassOfElement, "for a D/H-class and element",
|
|
958
|
+
[IsActingSemigroupGreensClass and IsGreensClass, IsMultiplicativeElement],
|
|
959
|
+
function(C, x)
|
|
960
|
+
if not x in C then
|
|
961
|
+
ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
|
|
962
|
+
"to the 1st argument (a Green's class)");
|
|
963
|
+
fi;
|
|
964
|
+
return GreensHClassOfElementNC(C, x, IsGreensClassNC(C));
|
|
965
|
+
end);
|
|
966
|
+
|
|
967
|
+
# same method for regular/ideals/inverse
|
|
968
|
+
|
|
969
|
+
InstallMethod(GreensHClassOfElementNC, "for a D/H-class and element",
|
|
970
|
+
[IsActingSemigroupGreensClass and IsGreensClass, IsMultiplicativeElement],
|
|
971
|
+
{C, x} -> GreensHClassOfElementNC(C, x, true));
|
|
972
|
+
|
|
973
|
+
# same method for regular/ideals, different method for inverse
|
|
974
|
+
|
|
975
|
+
InstallMethod(GreensHClassOfElementNC, "for a D/H-class, element, and bool",
|
|
976
|
+
[IsActingSemigroupGreensClass and IsGreensClass,
|
|
977
|
+
IsMultiplicativeElement,
|
|
978
|
+
IsBool],
|
|
979
|
+
function(C, x, isGreensClassNC)
|
|
980
|
+
local H;
|
|
981
|
+
H := SEMIGROUPS.CreateHClass(C, x, isGreensClassNC);
|
|
982
|
+
SEMIGROUPS.CopyLambda(C, H);
|
|
983
|
+
SEMIGROUPS.CopyRho(C, H);
|
|
984
|
+
if IsGreensDClass(C) then
|
|
985
|
+
SetDClassOfHClass(H, C);
|
|
986
|
+
fi;
|
|
987
|
+
return H;
|
|
988
|
+
end);
|
|
989
|
+
|
|
990
|
+
# same method for regular/ideals, different method for inverse
|
|
991
|
+
|
|
992
|
+
InstallMethod(GreensHClassOfElementNC, "for an L-class, element, and bool",
|
|
993
|
+
[IsActingSemigroupGreensClass and IsGreensLClass, IsMultiplicativeElement,
|
|
994
|
+
IsBool],
|
|
995
|
+
function(L, x, isGreensClassNC)
|
|
996
|
+
local H;
|
|
997
|
+
H := SEMIGROUPS.CreateHClass(L, x, isGreensClassNC);
|
|
998
|
+
SEMIGROUPS.CopyRho(L, H);
|
|
999
|
+
SEMIGROUPS.SetLambda(H);
|
|
1000
|
+
SetLClassOfHClass(H, L);
|
|
1001
|
+
return H;
|
|
1002
|
+
end);
|
|
1003
|
+
|
|
1004
|
+
# same method for regular/ideals, different method for inverse
|
|
1005
|
+
|
|
1006
|
+
InstallMethod(GreensHClassOfElementNC, "for an R-class, element, and bool",
|
|
1007
|
+
[IsActingSemigroupGreensClass and IsGreensRClass, IsMultiplicativeElement,
|
|
1008
|
+
IsBool],
|
|
1009
|
+
function(R, x, isGreensClassNC)
|
|
1010
|
+
local H;
|
|
1011
|
+
H := SEMIGROUPS.CreateHClass(R, x, isGreensClassNC);
|
|
1012
|
+
SEMIGROUPS.CopyLambda(R, H);
|
|
1013
|
+
SEMIGROUPS.SetRho(H);
|
|
1014
|
+
SetRClassOfHClass(H, R);
|
|
1015
|
+
return H;
|
|
1016
|
+
end);
|
|
1017
|
+
|
|
1018
|
+
# different method for inverse/regular, same for ideals
|
|
1019
|
+
|
|
1020
|
+
InstallMethod(Size, "for a D-class of an acting semigroup",
|
|
1021
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1022
|
+
function(D)
|
|
1023
|
+
local L, R;
|
|
1024
|
+
L := LambdaOrbSchutzGp(LambdaOrb(D), LambdaOrbSCCIndex(D));
|
|
1025
|
+
R := RhoOrbSchutzGp(RhoOrb(D), RhoOrbSCCIndex(D));
|
|
1026
|
+
return Size(R) * Size(L) * Length(LambdaOrbSCC(D)) * Length(RhoOrbSCC(D)) /
|
|
1027
|
+
Size(SchutzenbergerGroup(D));
|
|
1028
|
+
end);
|
|
1029
|
+
|
|
1030
|
+
# same method for inverse/regular/ideals
|
|
1031
|
+
|
|
1032
|
+
InstallMethod(Size, "for an R-class of an acting semigroup",
|
|
1033
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1034
|
+
R -> Size(SchutzenbergerGroup(R)) * Length(LambdaOrbSCC(R)));
|
|
1035
|
+
|
|
1036
|
+
# same method for regular/ideals, different method of inverse
|
|
1037
|
+
|
|
1038
|
+
InstallMethod(Size, "for an L-class of an acting semigroup",
|
|
1039
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1040
|
+
L -> Size(SchutzenbergerGroup(L)) * Length(RhoOrbSCC(L)));
|
|
1041
|
+
|
|
1042
|
+
# same method for inverse/regular/ideals
|
|
1043
|
+
|
|
1044
|
+
InstallMethod(Size, "for an H-class of an acting semigroup",
|
|
1045
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1046
|
+
H -> Size(SchutzenbergerGroup(H)));
|
|
1047
|
+
|
|
1048
|
+
# same method for regular/ideals, different for inverse
|
|
1049
|
+
|
|
1050
|
+
InstallMethod(\in, "for mult. elt. and D-class of acting semigroup",
|
|
1051
|
+
[IsMultiplicativeElement, IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1052
|
+
function(x, D)
|
|
1053
|
+
local S, rep, o, m, scc, l, schutz, cosets, membership, one, p;
|
|
1054
|
+
|
|
1055
|
+
S := Parent(D);
|
|
1056
|
+
rep := Representative(D);
|
|
1057
|
+
|
|
1058
|
+
if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
|
|
1059
|
+
or (IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
1060
|
+
and ActionDegree(x) <> ActionDegree(rep))
|
|
1061
|
+
or ActionRank(S)(x) <> ActionRank(S)(rep) then
|
|
1062
|
+
return false;
|
|
1063
|
+
fi;
|
|
1064
|
+
|
|
1065
|
+
x := ConvertToInternalElement(S, x);
|
|
1066
|
+
|
|
1067
|
+
o := LambdaOrb(D);
|
|
1068
|
+
m := LambdaOrbSCCIndex(D);
|
|
1069
|
+
scc := OrbSCC(o);
|
|
1070
|
+
l := Position(o, LambdaFunc(S)(x));
|
|
1071
|
+
|
|
1072
|
+
if l = fail or OrbSCCLookup(o)[l] <> m then
|
|
1073
|
+
return false;
|
|
1074
|
+
elif l <> scc[m][1] then
|
|
1075
|
+
x := x * LambdaOrbMult(o, m, l)[2];
|
|
1076
|
+
fi;
|
|
1077
|
+
|
|
1078
|
+
o := RhoOrb(D);
|
|
1079
|
+
m := RhoOrbSCCIndex(D);
|
|
1080
|
+
scc := OrbSCC(o);
|
|
1081
|
+
l := Position(o, RhoFunc(S)(x));
|
|
1082
|
+
schutz := RhoOrbStabChain(D);
|
|
1083
|
+
|
|
1084
|
+
if l = fail or OrbSCCLookup(o)[l] <> m then
|
|
1085
|
+
return false;
|
|
1086
|
+
elif schutz = true then
|
|
1087
|
+
return true;
|
|
1088
|
+
elif l <> scc[m][1] then
|
|
1089
|
+
x := RhoOrbMult(o, m, l)[2] * x;
|
|
1090
|
+
fi;
|
|
1091
|
+
|
|
1092
|
+
cosets := LambdaCosets(D);
|
|
1093
|
+
rep := D!.rep;
|
|
1094
|
+
x := LambdaPerm(S)(rep, x);
|
|
1095
|
+
membership := SchutzGpMembership(S);
|
|
1096
|
+
one := LambdaIdentity(S)(ActionRank(S)(rep));
|
|
1097
|
+
|
|
1098
|
+
if schutz <> false then
|
|
1099
|
+
for p in cosets do
|
|
1100
|
+
if membership(schutz, x / p) then
|
|
1101
|
+
return true;
|
|
1102
|
+
fi;
|
|
1103
|
+
od;
|
|
1104
|
+
else
|
|
1105
|
+
for p in cosets do
|
|
1106
|
+
if x / p = one then
|
|
1107
|
+
return true;
|
|
1108
|
+
fi;
|
|
1109
|
+
od;
|
|
1110
|
+
fi;
|
|
1111
|
+
|
|
1112
|
+
return false;
|
|
1113
|
+
end);
|
|
1114
|
+
|
|
1115
|
+
# same method for regular/ideals, different method for inverse
|
|
1116
|
+
|
|
1117
|
+
InstallMethod(\in, "for multiplicative element and L-class of acting semigroup",
|
|
1118
|
+
[IsMultiplicativeElement, IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1119
|
+
function(x, L)
|
|
1120
|
+
local S, rep, o, m, scc, l, schutz;
|
|
1121
|
+
|
|
1122
|
+
S := Parent(L);
|
|
1123
|
+
rep := Representative(L);
|
|
1124
|
+
|
|
1125
|
+
if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
|
|
1126
|
+
or (IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
1127
|
+
and ActionDegree(x) <> ActionDegree(rep))
|
|
1128
|
+
or ActionRank(S)(x) <> ActionRank(S)(rep)
|
|
1129
|
+
or LambdaFunc(S)(x) <> LambdaFunc(S)(rep) then
|
|
1130
|
+
return false;
|
|
1131
|
+
fi;
|
|
1132
|
+
|
|
1133
|
+
x := ConvertToInternalElement(S, x);
|
|
1134
|
+
rep := L!.rep;
|
|
1135
|
+
|
|
1136
|
+
o := RhoOrb(L);
|
|
1137
|
+
m := RhoOrbSCCIndex(L);
|
|
1138
|
+
scc := OrbSCC(o);
|
|
1139
|
+
l := Position(o, RhoFunc(S)(x));
|
|
1140
|
+
schutz := RhoOrbStabChain(L);
|
|
1141
|
+
|
|
1142
|
+
if l = fail or OrbSCCLookup(o)[l] <> m then
|
|
1143
|
+
return false;
|
|
1144
|
+
elif schutz = true then
|
|
1145
|
+
return true;
|
|
1146
|
+
elif l <> scc[m][1] then
|
|
1147
|
+
x := RhoOrbMult(o, m, l)[2] * x;
|
|
1148
|
+
fi;
|
|
1149
|
+
|
|
1150
|
+
if x = rep then
|
|
1151
|
+
return true;
|
|
1152
|
+
elif schutz = false then
|
|
1153
|
+
return false;
|
|
1154
|
+
fi;
|
|
1155
|
+
|
|
1156
|
+
return SchutzGpMembership(S)(schutz, LambdaPerm(S)(rep, x));
|
|
1157
|
+
end);
|
|
1158
|
+
|
|
1159
|
+
# same method for regular/inverse/ideals
|
|
1160
|
+
|
|
1161
|
+
InstallMethod(\in, "for multiplicative element and R-class of acting semigroup",
|
|
1162
|
+
[IsMultiplicativeElement, IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1163
|
+
function(x, R)
|
|
1164
|
+
local S, rep, o, m, scc, l, schutz;
|
|
1165
|
+
|
|
1166
|
+
S := Parent(R);
|
|
1167
|
+
rep := Representative(R);
|
|
1168
|
+
|
|
1169
|
+
if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
|
|
1170
|
+
or (IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
1171
|
+
and ActionDegree(x) <> ActionDegree(rep))
|
|
1172
|
+
or ActionRank(S)(x) <> ActionRank(S)(rep)
|
|
1173
|
+
or RhoFunc(S)(x) <> RhoFunc(S)(rep) then
|
|
1174
|
+
return false;
|
|
1175
|
+
fi;
|
|
1176
|
+
|
|
1177
|
+
x := ConvertToInternalElement(S, x);
|
|
1178
|
+
rep := R!.rep;
|
|
1179
|
+
|
|
1180
|
+
o := LambdaOrb(R);
|
|
1181
|
+
m := LambdaOrbSCCIndex(R);
|
|
1182
|
+
scc := OrbSCC(o);
|
|
1183
|
+
l := Position(o, LambdaFunc(S)(x));
|
|
1184
|
+
schutz := LambdaOrbStabChain(o, m);
|
|
1185
|
+
|
|
1186
|
+
if l = fail or OrbSCCLookup(o)[l] <> m then
|
|
1187
|
+
return false;
|
|
1188
|
+
elif schutz = true then
|
|
1189
|
+
return true;
|
|
1190
|
+
elif l <> scc[m][1] then
|
|
1191
|
+
x := x * LambdaOrbMult(o, m, l)[2];
|
|
1192
|
+
fi;
|
|
1193
|
+
|
|
1194
|
+
if x = rep then
|
|
1195
|
+
return true;
|
|
1196
|
+
elif schutz = false then
|
|
1197
|
+
return false;
|
|
1198
|
+
fi;
|
|
1199
|
+
|
|
1200
|
+
return SchutzGpMembership(S)(schutz, LambdaPerm(S)(rep, x));
|
|
1201
|
+
end);
|
|
1202
|
+
|
|
1203
|
+
# same method for regular/inverse/ideals
|
|
1204
|
+
|
|
1205
|
+
InstallMethod(\in, "for element and acting semigroup H-class",
|
|
1206
|
+
[IsMultiplicativeElement, IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1207
|
+
function(x, H)
|
|
1208
|
+
local S, rep;
|
|
1209
|
+
|
|
1210
|
+
S := Parent(H);
|
|
1211
|
+
rep := Representative(H);
|
|
1212
|
+
|
|
1213
|
+
if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
|
|
1214
|
+
or (IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
1215
|
+
and ActionDegree(x) <> ActionDegree(rep))
|
|
1216
|
+
or ActionRank(S)(x) <> ActionRank(S)(rep)
|
|
1217
|
+
or RhoFunc(S)(x) <> RhoFunc(S)(rep)
|
|
1218
|
+
or LambdaFunc(S)(x) <> LambdaFunc(S)(rep) then
|
|
1219
|
+
return false;
|
|
1220
|
+
fi;
|
|
1221
|
+
|
|
1222
|
+
x := ConvertToInternalElement(S, x);
|
|
1223
|
+
rep := H!.rep;
|
|
1224
|
+
|
|
1225
|
+
return LambdaPerm(S)(rep, x) in SchutzenbergerGroup(H);
|
|
1226
|
+
end);
|
|
1227
|
+
|
|
1228
|
+
#############################################################################
|
|
1229
|
+
## 4. Collections of classes, and reps
|
|
1230
|
+
#############################################################################
|
|
1231
|
+
|
|
1232
|
+
# These are not rho-rectified!
|
|
1233
|
+
|
|
1234
|
+
# different methods for regular/inverse/ideals
|
|
1235
|
+
|
|
1236
|
+
InstallMethod(DClassReps, "for an acting semigroup",
|
|
1237
|
+
[IsActingSemigroup],
|
|
1238
|
+
function(S)
|
|
1239
|
+
local data, scc, out, i;
|
|
1240
|
+
|
|
1241
|
+
data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
|
|
1242
|
+
scc := OrbSCC(data);
|
|
1243
|
+
out := EmptyPlist(Length(scc) - 1);
|
|
1244
|
+
|
|
1245
|
+
for i in [2 .. Length(scc)] do
|
|
1246
|
+
out[i - 1] := ConvertToExternalElement(S, data[scc[i][1]][4]);
|
|
1247
|
+
od;
|
|
1248
|
+
return out;
|
|
1249
|
+
end);
|
|
1250
|
+
|
|
1251
|
+
InstallMethod(RelativeDClassReps, "for an acting semigroup and subsemigroup",
|
|
1252
|
+
[IsActingSemigroup, IsActingSemigroup],
|
|
1253
|
+
function(S, T)
|
|
1254
|
+
local data, D, gens, genstoapply, x, i, j;
|
|
1255
|
+
|
|
1256
|
+
if not IsSubsemigroup(S, T) then
|
|
1257
|
+
ErrorNoReturn("the 2nd argument (an acting semigroup) must be ",
|
|
1258
|
+
"a subsemigroup of the 1st argument (an acting semigroup)");
|
|
1259
|
+
fi;
|
|
1260
|
+
|
|
1261
|
+
data := Enumerate(SemigroupData(S, RelativeLambdaOrb(S, T)));
|
|
1262
|
+
D := List([1 .. Length(data)], x -> []);
|
|
1263
|
+
gens := GeneratorsOfSemigroup(T);
|
|
1264
|
+
genstoapply := [1 .. Length(gens)];
|
|
1265
|
+
for i in [2 .. Length(data)] do
|
|
1266
|
+
x := data[i][4];
|
|
1267
|
+
for j in genstoapply do
|
|
1268
|
+
Add(D[i], Position(data, gens[j] * x));
|
|
1269
|
+
od;
|
|
1270
|
+
od;
|
|
1271
|
+
D := DigraphStronglyConnectedComponents(Digraph(D)).comps;
|
|
1272
|
+
D := List(D, x -> x[1]){[2 .. Length(D)]};
|
|
1273
|
+
return List(data{D}, x -> x[4]);
|
|
1274
|
+
end);
|
|
1275
|
+
|
|
1276
|
+
InstallMethod(RelativeRClassReps, "for an acting semigroup and subsemigroup",
|
|
1277
|
+
[IsActingSemigroup, IsActingSemigroup],
|
|
1278
|
+
function(S, T)
|
|
1279
|
+
local data;
|
|
1280
|
+
if not IsSubsemigroup(S, T) then
|
|
1281
|
+
ErrorNoReturn("the 2nd argument (an acting semigroup) must be ",
|
|
1282
|
+
"a subsemigroup of the 1st argument (an acting semigroup)");
|
|
1283
|
+
fi;
|
|
1284
|
+
|
|
1285
|
+
data := Enumerate(SemigroupData(S, RelativeLambdaOrb(S, T)));
|
|
1286
|
+
return List(data, x -> x[4]);
|
|
1287
|
+
end);
|
|
1288
|
+
|
|
1289
|
+
# different method for regular/inverse/ideals
|
|
1290
|
+
|
|
1291
|
+
InstallMethod(GreensDClasses, "for an acting semigroup",
|
|
1292
|
+
[IsActingSemigroup],
|
|
1293
|
+
function(S)
|
|
1294
|
+
local data, scc, out, CreateDClass, RectifyRho, next, D, i;
|
|
1295
|
+
|
|
1296
|
+
data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
|
|
1297
|
+
scc := OrbSCC(data);
|
|
1298
|
+
out := EmptyPlist(Length(scc));
|
|
1299
|
+
CreateDClass := SEMIGROUPS.CreateDClass;
|
|
1300
|
+
RectifyRho := SEMIGROUPS.RectifyRho;
|
|
1301
|
+
|
|
1302
|
+
for i in [2 .. Length(scc)] do
|
|
1303
|
+
next := data[scc[i][1]];
|
|
1304
|
+
# don't use GreensDClassOfElementNC here since we don't have to lookup scc
|
|
1305
|
+
# indices or rectify lambda
|
|
1306
|
+
D := CreateDClass(S, next[4], false);
|
|
1307
|
+
SetLambdaOrb(D, LambdaOrb(S));
|
|
1308
|
+
SetLambdaOrbSCCIndex(D, next[2]);
|
|
1309
|
+
SetRhoOrb(D, RhoOrb(S));
|
|
1310
|
+
SetRhoOrbSCCIndex(D, OrbSCCLookup(RhoOrb(S))[data!.rholookup[next[6]]]);
|
|
1311
|
+
RectifyRho(D);
|
|
1312
|
+
SetSemigroupDataIndex(D, next[6]);
|
|
1313
|
+
out[i - 1] := D;
|
|
1314
|
+
od;
|
|
1315
|
+
|
|
1316
|
+
return out;
|
|
1317
|
+
end);
|
|
1318
|
+
|
|
1319
|
+
# same method for regular/inverse/ideals
|
|
1320
|
+
|
|
1321
|
+
InstallMethod(LClassReps, "for an acting semigroup",
|
|
1322
|
+
[IsActingSemigroup],
|
|
1323
|
+
S -> Concatenation(List(GreensDClasses(S), LClassReps)));
|
|
1324
|
+
|
|
1325
|
+
# same method for regular/inverse/ideals
|
|
1326
|
+
|
|
1327
|
+
InstallMethod(GreensLClasses, "for an acting semigroup",
|
|
1328
|
+
[IsActingSemigroup],
|
|
1329
|
+
S -> Concatenation(List(GreensDClasses(S), GreensLClasses)));
|
|
1330
|
+
|
|
1331
|
+
# same method for regular/inverse/ideals
|
|
1332
|
+
|
|
1333
|
+
InstallMethod(LClassReps, "for a D-class of an acting semigroup",
|
|
1334
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1335
|
+
function(D)
|
|
1336
|
+
local scc, mults, cosets, rep, act, out, nr, x, p, i;
|
|
1337
|
+
|
|
1338
|
+
scc := LambdaOrbSCC(D);
|
|
1339
|
+
mults := LambdaOrbMults(LambdaOrb(D), LambdaOrbSCCIndex(D));
|
|
1340
|
+
cosets := LambdaCosets(D);
|
|
1341
|
+
rep := D!.rep;
|
|
1342
|
+
act := StabilizerAction(Parent(D));
|
|
1343
|
+
out := EmptyPlist(Length(scc) * Length(cosets));
|
|
1344
|
+
nr := 0;
|
|
1345
|
+
|
|
1346
|
+
for p in cosets do
|
|
1347
|
+
x := act(rep, p);
|
|
1348
|
+
for i in scc do
|
|
1349
|
+
nr := nr + 1;
|
|
1350
|
+
# don't use GreensLClassOfElementNC cos we don't need to rectify the
|
|
1351
|
+
# rho-value
|
|
1352
|
+
out[nr] := x * mults[i][1];
|
|
1353
|
+
od;
|
|
1354
|
+
od;
|
|
1355
|
+
|
|
1356
|
+
return out;
|
|
1357
|
+
end);
|
|
1358
|
+
|
|
1359
|
+
# same method for regular/ideals, different for inverse
|
|
1360
|
+
|
|
1361
|
+
InstallMethod(GreensLClasses, "for a D-class of an acting semigroup",
|
|
1362
|
+
[IsActingSemigroupGreensClass and IsGreensDClass],
|
|
1363
|
+
function(D)
|
|
1364
|
+
local reps, out, CreateLClass, CopyRho, i;
|
|
1365
|
+
|
|
1366
|
+
reps := LClassReps(D);
|
|
1367
|
+
out := EmptyPlist(Length(reps));
|
|
1368
|
+
CreateLClass := SEMIGROUPS.CreateLClass;
|
|
1369
|
+
CopyRho := SEMIGROUPS.CopyRho;
|
|
1370
|
+
|
|
1371
|
+
for i in [1 .. Length(reps)] do
|
|
1372
|
+
# don't use GreensLClassOfElementNC cos we don't need to rectify the
|
|
1373
|
+
# rho-value
|
|
1374
|
+
out[i] := CreateLClass(D, reps[i], IsGreensClassNC(D));
|
|
1375
|
+
CopyRho(D, out[i]);
|
|
1376
|
+
SetDClassOfLClass(out[i], D);
|
|
1377
|
+
od;
|
|
1378
|
+
return out;
|
|
1379
|
+
end);
|
|
1380
|
+
|
|
1381
|
+
# different method for regular/inverse, same method for ideals
|
|
1382
|
+
|
|
1383
|
+
InstallMethod(RClassReps, "for an acting semigroup", [IsActingSemigroup],
|
|
1384
|
+
function(S)
|
|
1385
|
+
local data, out, i;
|
|
1386
|
+
|
|
1387
|
+
data := Enumerate(SemigroupData(S));
|
|
1388
|
+
out := EmptyPlist(Length(data) - 1);
|
|
1389
|
+
|
|
1390
|
+
for i in [2 .. Length(data)] do
|
|
1391
|
+
out[i - 1] := data[i][4];
|
|
1392
|
+
od;
|
|
1393
|
+
return out;
|
|
1394
|
+
end);
|
|
1395
|
+
|
|
1396
|
+
# different method for regular/inverse, same for ideals
|
|
1397
|
+
|
|
1398
|
+
InstallMethod(GreensRClasses, "for an acting semigroup",
|
|
1399
|
+
[IsActingSemigroup],
|
|
1400
|
+
function(S)
|
|
1401
|
+
local reps, out, data, CreateRClass, i;
|
|
1402
|
+
|
|
1403
|
+
reps := RClassReps(S);
|
|
1404
|
+
out := EmptyPlist(Length(reps));
|
|
1405
|
+
data := SemigroupData(S);
|
|
1406
|
+
CreateRClass := SEMIGROUPS.CreateRClass;
|
|
1407
|
+
for i in [1 .. Length(reps)] do
|
|
1408
|
+
# don't use GreensRClassOfElementNC cos we don't need to rectify the
|
|
1409
|
+
# lambda-value
|
|
1410
|
+
out[i] := CreateRClass(S, reps[i], false);
|
|
1411
|
+
SetLambdaOrb(out[i], LambdaOrb(S));
|
|
1412
|
+
SetLambdaOrbSCCIndex(out[i], data[i + 1][2]);
|
|
1413
|
+
SetSemigroupDataIndex(out[i], i + 1);
|
|
1414
|
+
od;
|
|
1415
|
+
return out;
|
|
1416
|
+
end);
|
|
1417
|
+
|
|
1418
|
+
# same method for regular/ideals, different method for inverse
|
|
1419
|
+
|
|
1420
|
+
InstallMethod(RClassReps, "for a D-class of an acting semigroup",
|
|
1421
|
+
[IsActingSemigroupGreensClass and IsGreensDClass],
|
|
1422
|
+
function(D)
|
|
1423
|
+
local scc, mults, cosets, rep, act, out, nr, x, i, p;
|
|
1424
|
+
|
|
1425
|
+
scc := RhoOrbSCC(D);
|
|
1426
|
+
mults := RhoOrbMults(RhoOrb(D), RhoOrbSCCIndex(D));
|
|
1427
|
+
cosets := RhoCosets(D);
|
|
1428
|
+
rep := D!.rep;
|
|
1429
|
+
act := StabilizerAction(Parent(D));
|
|
1430
|
+
out := EmptyPlist(Length(scc) * Length(cosets));
|
|
1431
|
+
nr := 0;
|
|
1432
|
+
|
|
1433
|
+
for p in cosets do
|
|
1434
|
+
x := act(rep, p ^ -1);
|
|
1435
|
+
for i in scc do
|
|
1436
|
+
nr := nr + 1;
|
|
1437
|
+
out[nr] := mults[i][1] * x;
|
|
1438
|
+
od;
|
|
1439
|
+
od;
|
|
1440
|
+
|
|
1441
|
+
return out;
|
|
1442
|
+
end);
|
|
1443
|
+
|
|
1444
|
+
# same method for regular/inverse/ideals
|
|
1445
|
+
|
|
1446
|
+
InstallMethod(GreensRClasses, "for a D-class of an acting semigroup",
|
|
1447
|
+
[IsActingSemigroupGreensClass and IsGreensDClass],
|
|
1448
|
+
function(D)
|
|
1449
|
+
local reps, out, CreateRClass, CopyLambda, i;
|
|
1450
|
+
|
|
1451
|
+
reps := RClassReps(D);
|
|
1452
|
+
out := EmptyPlist(Length(reps));
|
|
1453
|
+
CreateRClass := SEMIGROUPS.CreateRClass;
|
|
1454
|
+
CopyLambda := SEMIGROUPS.CopyLambda;
|
|
1455
|
+
|
|
1456
|
+
for i in [1 .. Length(reps)] do
|
|
1457
|
+
# don't use GreensRClassOfElementNC cos we don't need to rectify the
|
|
1458
|
+
# lambda-value
|
|
1459
|
+
out[i] := CreateRClass(D, reps[i], IsGreensClassNC(D));
|
|
1460
|
+
CopyLambda(D, out[i]);
|
|
1461
|
+
SetDClassOfRClass(out[i], D);
|
|
1462
|
+
od;
|
|
1463
|
+
return out;
|
|
1464
|
+
end);
|
|
1465
|
+
|
|
1466
|
+
# same method for regular/inverse/ideals
|
|
1467
|
+
|
|
1468
|
+
InstallMethod(HClassReps, "for an acting semigroup",
|
|
1469
|
+
[IsActingSemigroup], S -> Concatenation(List(GreensRClasses(S), HClassReps)));
|
|
1470
|
+
|
|
1471
|
+
# same method for regular/inverse/ideals
|
|
1472
|
+
|
|
1473
|
+
InstallMethod(GreensHClasses, "for an acting semigroup",
|
|
1474
|
+
[IsActingSemigroup],
|
|
1475
|
+
S -> Concatenation(List(GreensDClasses(S), GreensHClasses)));
|
|
1476
|
+
|
|
1477
|
+
# same method for regular/inverse/ideals
|
|
1478
|
+
|
|
1479
|
+
InstallMethod(HClassReps, "for a D-class of an acting semigroup",
|
|
1480
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1481
|
+
D -> Concatenation(List(GreensRClasses(D), HClassReps)));
|
|
1482
|
+
|
|
1483
|
+
# same method for regular/inverse/ideals
|
|
1484
|
+
|
|
1485
|
+
InstallMethod(GreensHClasses, "for a D-class of an acting semigroup",
|
|
1486
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1487
|
+
D -> Concatenation(List(GreensRClasses(D), GreensHClasses)));
|
|
1488
|
+
|
|
1489
|
+
# same method for regular/inverse/ideals
|
|
1490
|
+
|
|
1491
|
+
InstallMethod(HClassReps, "for an R-class of an acting semigroup",
|
|
1492
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1493
|
+
function(R)
|
|
1494
|
+
local scc, mults, cosets, rep, act, out, nr, x, i, p;
|
|
1495
|
+
|
|
1496
|
+
scc := LambdaOrbSCC(R);
|
|
1497
|
+
mults := LambdaOrbMults(LambdaOrb(R), LambdaOrbSCCIndex(R));
|
|
1498
|
+
cosets := LambdaCosets(DClassOfRClass(R));
|
|
1499
|
+
rep := R!.rep;
|
|
1500
|
+
act := StabilizerAction(Parent(R));
|
|
1501
|
+
out := EmptyPlist(Length(scc) * Length(cosets));
|
|
1502
|
+
nr := 0;
|
|
1503
|
+
|
|
1504
|
+
for p in cosets do
|
|
1505
|
+
x := act(rep, p);
|
|
1506
|
+
for i in scc do
|
|
1507
|
+
nr := nr + 1;
|
|
1508
|
+
out[nr] := ConvertToExternalElement(Parent(R), x * mults[i][1]);
|
|
1509
|
+
od;
|
|
1510
|
+
od;
|
|
1511
|
+
return out;
|
|
1512
|
+
end);
|
|
1513
|
+
|
|
1514
|
+
# same method for regular/inverse/ideals
|
|
1515
|
+
|
|
1516
|
+
InstallMethod(GreensHClasses, "for an R-class of an acting semigroup",
|
|
1517
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1518
|
+
function(R)
|
|
1519
|
+
local reps, out, i;
|
|
1520
|
+
reps := HClassReps(R);
|
|
1521
|
+
out := [GreensHClassOfElementNC(R, reps[1], IsGreensClassNC(R))];
|
|
1522
|
+
# do this rather than GreensHClassOfElement(R, reps[i]) to
|
|
1523
|
+
# avoid recomputing the RhoOrb.
|
|
1524
|
+
for i in [2 .. Length(reps)] do
|
|
1525
|
+
out[i] := GreensHClassOfElementNC(out[1], reps[i], IsGreensClassNC(R));
|
|
1526
|
+
SetRClassOfHClass(out[i], R);
|
|
1527
|
+
od;
|
|
1528
|
+
return out;
|
|
1529
|
+
end);
|
|
1530
|
+
|
|
1531
|
+
# same method for regular/ideals, different method for inverse
|
|
1532
|
+
|
|
1533
|
+
InstallMethod(HClassReps, "for an L-class of an acting semigroup",
|
|
1534
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1535
|
+
function(L)
|
|
1536
|
+
local scc, mults, cosets, rep, act, out, nr, x, p, i;
|
|
1537
|
+
|
|
1538
|
+
scc := RhoOrbSCC(L);
|
|
1539
|
+
mults := RhoOrbMults(RhoOrb(L), RhoOrbSCCIndex(L));
|
|
1540
|
+
cosets := RhoCosets(L);
|
|
1541
|
+
# These are the rho cosets of the D-class containing L rectified so that they
|
|
1542
|
+
# correspond to the lambda value of the rep of L and not the lambda value of
|
|
1543
|
+
# the rep of the D-class.
|
|
1544
|
+
rep := L!.rep;
|
|
1545
|
+
act := StabilizerAction(Parent(L));
|
|
1546
|
+
out := EmptyPlist(Length(scc) * Length(cosets));
|
|
1547
|
+
nr := 0;
|
|
1548
|
+
|
|
1549
|
+
for p in cosets do
|
|
1550
|
+
x := act(rep, p ^ -1);
|
|
1551
|
+
for i in scc do
|
|
1552
|
+
nr := nr + 1;
|
|
1553
|
+
out[nr] := ConvertToExternalElement(Parent(L), mults[i][1] * x);
|
|
1554
|
+
od;
|
|
1555
|
+
od;
|
|
1556
|
+
return out;
|
|
1557
|
+
end);
|
|
1558
|
+
|
|
1559
|
+
# same method for regular/ideals, different for inverse
|
|
1560
|
+
|
|
1561
|
+
InstallMethod(GreensHClasses, "for an L-class of an acting semigroup",
|
|
1562
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1563
|
+
function(L)
|
|
1564
|
+
local reps, out, i;
|
|
1565
|
+
reps := HClassReps(L);
|
|
1566
|
+
out := [GreensHClassOfElementNC(L, reps[1], IsGreensClassNC(L))];
|
|
1567
|
+
# do this rather than GreensHClassOfElement(L, reps[i]) to
|
|
1568
|
+
# avoid recomputing the RhoOrb.
|
|
1569
|
+
for i in [2 .. Length(reps)] do
|
|
1570
|
+
out[i] := GreensHClassOfElementNC(out[1], reps[i], IsGreensClassNC(L));
|
|
1571
|
+
SetLClassOfHClass(out[i], L);
|
|
1572
|
+
od;
|
|
1573
|
+
return out;
|
|
1574
|
+
end);
|
|
1575
|
+
|
|
1576
|
+
#############################################################################
|
|
1577
|
+
|
|
1578
|
+
# different method for regular/inverse, same for ideals
|
|
1579
|
+
|
|
1580
|
+
InstallMethod(NrDClasses, "for an acting semigroup",
|
|
1581
|
+
[IsActingSemigroup],
|
|
1582
|
+
S -> Length(OrbSCC(SemigroupData(S))) - 1);
|
|
1583
|
+
|
|
1584
|
+
# different method for regular/inverse, same for ideals
|
|
1585
|
+
|
|
1586
|
+
InstallMethod(NrLClasses, "for an acting semigroup",
|
|
1587
|
+
[IsActingSemigroup], S -> Sum(List(GreensDClasses(S), NrLClasses)));
|
|
1588
|
+
|
|
1589
|
+
# different method for regular/inverse, same for ideals
|
|
1590
|
+
|
|
1591
|
+
InstallMethod(NrLClasses, "for a D-class of an acting semigroup",
|
|
1592
|
+
[IsActingSemigroupGreensClass and IsGreensDClass],
|
|
1593
|
+
D -> Length(LambdaCosets(D)) * Length(LambdaOrbSCC(D)));
|
|
1594
|
+
|
|
1595
|
+
# different method for regular/inverse, same for ideals
|
|
1596
|
+
|
|
1597
|
+
InstallMethod(NrRClasses, "for an acting semigroup", [IsActingSemigroup],
|
|
1598
|
+
S -> Length(Enumerate(SemigroupData(S), infinity, ReturnFalse)) - 1);
|
|
1599
|
+
|
|
1600
|
+
# different method for regular/inverse, same for ideals
|
|
1601
|
+
|
|
1602
|
+
InstallMethod(NrRClasses, "for a D-class of an acting semigroup",
|
|
1603
|
+
[IsActingSemigroupGreensClass and IsGreensDClass],
|
|
1604
|
+
D -> Length(RhoCosets(D)) * Length(RhoOrbSCC(D)));
|
|
1605
|
+
|
|
1606
|
+
# same method for regular/inverse/ideals
|
|
1607
|
+
|
|
1608
|
+
InstallMethod(NrHClasses, "for an acting semigroup", [IsActingSemigroup],
|
|
1609
|
+
S -> Sum(List(GreensDClasses(S), NrHClasses)));
|
|
1610
|
+
|
|
1611
|
+
# same method for regular/ideals, different method for inverse
|
|
1612
|
+
|
|
1613
|
+
InstallMethod(GroupHClassOfGreensDClass,
|
|
1614
|
+
"for a D-class of an acting semigroup",
|
|
1615
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1616
|
+
function(D)
|
|
1617
|
+
local S, rho, o, scc, tester, rep, i;
|
|
1618
|
+
|
|
1619
|
+
if HasIsRegularGreensClass(D) and not IsRegularGreensClass(D) then
|
|
1620
|
+
return fail;
|
|
1621
|
+
fi;
|
|
1622
|
+
|
|
1623
|
+
S := Parent(D);
|
|
1624
|
+
rho := RhoFunc(S)(D!.rep);
|
|
1625
|
+
o := LambdaOrb(D);
|
|
1626
|
+
scc := LambdaOrbSCC(D);
|
|
1627
|
+
tester := IdempotentTester(S);
|
|
1628
|
+
|
|
1629
|
+
for i in scc do
|
|
1630
|
+
if tester(o[i], rho) then
|
|
1631
|
+
if not HasIsRegularGreensClass(D) then
|
|
1632
|
+
SetIsRegularGreensClass(D, true);
|
|
1633
|
+
fi;
|
|
1634
|
+
rep := ConvertToExternalElement(S, IdempotentCreator(S)(o[i], rho));
|
|
1635
|
+
return GreensHClassOfElementNC(D, rep, IsGreensClassNC(D));
|
|
1636
|
+
fi;
|
|
1637
|
+
od;
|
|
1638
|
+
|
|
1639
|
+
if not HasIsRegularGreensClass(D) then
|
|
1640
|
+
SetIsRegularGreensClass(D, false);
|
|
1641
|
+
fi;
|
|
1642
|
+
return fail;
|
|
1643
|
+
end);
|
|
1644
|
+
|
|
1645
|
+
# same method for regular/inverse/ideals
|
|
1646
|
+
|
|
1647
|
+
InstallMethod(IsGroupHClass, "for an H-class of an acting semigroup",
|
|
1648
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1649
|
+
function(H)
|
|
1650
|
+
local S, x;
|
|
1651
|
+
S := Parent(H);
|
|
1652
|
+
x := H!.rep;
|
|
1653
|
+
return IdempotentTester(S)(LambdaFunc(S)(x), RhoFunc(S)(x));
|
|
1654
|
+
end);
|
|
1655
|
+
|
|
1656
|
+
# same method for regular/inverse/ideals
|
|
1657
|
+
|
|
1658
|
+
InstallMethod(IsomorphismPermGroup, "for H-class of an acting semigroup",
|
|
1659
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1660
|
+
function(H)
|
|
1661
|
+
local map, id, iso, inv;
|
|
1662
|
+
|
|
1663
|
+
if not IsGroupHClass(H) then
|
|
1664
|
+
ErrorNoReturn("the argument (a Green's H-class) is not a group");
|
|
1665
|
+
elif not IsPermGroup(SchutzenbergerGroup(H)) then
|
|
1666
|
+
map := IsomorphismPermGroup(SchutzenbergerGroup(H));
|
|
1667
|
+
else
|
|
1668
|
+
map := IdentityMapping(SchutzenbergerGroup(H));
|
|
1669
|
+
fi;
|
|
1670
|
+
|
|
1671
|
+
id := ConvertToInternalElement(Parent(H), MultiplicativeNeutralElement(H));
|
|
1672
|
+
|
|
1673
|
+
iso := function(x)
|
|
1674
|
+
if not x in H then
|
|
1675
|
+
ErrorNoReturn("the argument does not belong to the domain of the ",
|
|
1676
|
+
"function");
|
|
1677
|
+
fi;
|
|
1678
|
+
x := ConvertToInternalElement(Parent(H), x);
|
|
1679
|
+
return LambdaPerm(Parent(H))(id, x) ^ map;
|
|
1680
|
+
end;
|
|
1681
|
+
inv := function(x)
|
|
1682
|
+
local S, act;
|
|
1683
|
+
if not x in Image(map) then
|
|
1684
|
+
ErrorNoReturn("the argument does not belong to the domain of the ",
|
|
1685
|
+
"function");
|
|
1686
|
+
fi;
|
|
1687
|
+
S := Parent(H);
|
|
1688
|
+
act := StabilizerAction(S);
|
|
1689
|
+
return ConvertToExternalElement(S,
|
|
1690
|
+
act(id, x ^ InverseGeneralMapping(map)));
|
|
1691
|
+
end;
|
|
1692
|
+
return MappingByFunction(H, Range(map), iso, inv);
|
|
1693
|
+
end);
|
|
1694
|
+
|
|
1695
|
+
# different method for regular/inverse/ideals
|
|
1696
|
+
|
|
1697
|
+
InstallMethod(PartialOrderOfDClasses, "for an acting semigroup",
|
|
1698
|
+
[IsActingSemigroup],
|
|
1699
|
+
function(S)
|
|
1700
|
+
local D, n, out, data, gens, graph, datalookup, i, j, k, x, f;
|
|
1701
|
+
|
|
1702
|
+
D := GreensDClasses(S);
|
|
1703
|
+
n := Length(D);
|
|
1704
|
+
out := List([1 .. n], x -> []);
|
|
1705
|
+
|
|
1706
|
+
data := SemigroupData(S);
|
|
1707
|
+
gens := data!.gens;
|
|
1708
|
+
graph := data!.graph;
|
|
1709
|
+
datalookup := OrbSCCLookup(data) - 1;
|
|
1710
|
+
|
|
1711
|
+
for i in [1 .. n] do
|
|
1712
|
+
# collect info about left multiplying R-class reps of D[i] by gens
|
|
1713
|
+
for j in OrbSCC(data)[OrbSCCLookup(data)[SemigroupDataIndex(D[i])]] do
|
|
1714
|
+
for k in graph[j] do
|
|
1715
|
+
AddSet(out[i], datalookup[k]);
|
|
1716
|
+
od;
|
|
1717
|
+
od;
|
|
1718
|
+
|
|
1719
|
+
for x in gens do
|
|
1720
|
+
for f in LClassReps(D[i]) do
|
|
1721
|
+
AddSet(out[i], datalookup[Position(data, f * x)]);
|
|
1722
|
+
od;
|
|
1723
|
+
od;
|
|
1724
|
+
od;
|
|
1725
|
+
Perform(out, ShrinkAllocationPlist);
|
|
1726
|
+
D := DigraphNC(IsMutableDigraph, out);
|
|
1727
|
+
DigraphRemoveLoops(D);
|
|
1728
|
+
MakeImmutable(D);
|
|
1729
|
+
return D;
|
|
1730
|
+
end);
|
|
1731
|
+
|
|
1732
|
+
InstallMethod(LeftGreensMultiplierNC,
|
|
1733
|
+
"for an acting semigroup and L-related elements",
|
|
1734
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsMultiplicativeElement],
|
|
1735
|
+
function(S, a, b)
|
|
1736
|
+
local o, l, m, result, p;
|
|
1737
|
+
|
|
1738
|
+
o := Enumerate(RhoOrb(S));
|
|
1739
|
+
l := Position(o, RhoFunc(S)(a));
|
|
1740
|
+
m := OrbSCCLookup(o)[l];
|
|
1741
|
+
|
|
1742
|
+
# back to the first pos. in scc
|
|
1743
|
+
result := RhoOrbMult(o, m, l)[2];
|
|
1744
|
+
l := Position(o, RhoFunc(S)(b));
|
|
1745
|
+
# out to the same pos. as b
|
|
1746
|
+
result := RhoOrbMult(o, m, l)[1] * result;
|
|
1747
|
+
|
|
1748
|
+
# result * a * LambdaPerm(S)(result * a, b) = b
|
|
1749
|
+
p := LambdaPerm(S)(result * a, b);
|
|
1750
|
+
# Apply the inverse of the bijection \Psi in Proposition 3.11 of the Citrus
|
|
1751
|
+
# paper, to convert p from acting on the right to action on the left
|
|
1752
|
+
return result * StabilizerAction(S)(a, p) * WeakInverse(a);
|
|
1753
|
+
end);
|
|
1754
|
+
|
|
1755
|
+
InstallMethod(RightGreensMultiplierNC,
|
|
1756
|
+
"for an acting semigroup and R-related elements",
|
|
1757
|
+
[IsActingSemigroup, IsMultiplicativeElement, IsMultiplicativeElement],
|
|
1758
|
+
function(S, a, b)
|
|
1759
|
+
local o, l, m, result, p;
|
|
1760
|
+
|
|
1761
|
+
o := Enumerate(LambdaOrb(S));
|
|
1762
|
+
l := Position(o, LambdaFunc(S)(a));
|
|
1763
|
+
m := OrbSCCLookup(o)[l];
|
|
1764
|
+
|
|
1765
|
+
# back to the first pos. in scc
|
|
1766
|
+
result := LambdaOrbMult(o, m, l)[2];
|
|
1767
|
+
l := Position(o, LambdaFunc(S)(b));
|
|
1768
|
+
# out to the same pos. as b
|
|
1769
|
+
result := result * LambdaOrbMult(o, m, l)[1];
|
|
1770
|
+
|
|
1771
|
+
# At this point StabilizerAction(a * result, LambdaPerm(S)(a * result, b)) =
|
|
1772
|
+
# b.
|
|
1773
|
+
p := LambdaPerm(S)(a * result, b);
|
|
1774
|
+
return WeakInverse(a) * StabilizerAction(S)(a * result, p);
|
|
1775
|
+
end);
|
|
1776
|
+
|
|
1777
|
+
#############################################################################
|
|
1778
|
+
## 5. Idempotents . . .
|
|
1779
|
+
#############################################################################
|
|
1780
|
+
|
|
1781
|
+
# same method for regular/ideals, different method for inverse
|
|
1782
|
+
|
|
1783
|
+
InstallMethod(Idempotents, "for an acting semigroup", [IsActingSemigroup],
|
|
1784
|
+
function(S)
|
|
1785
|
+
local out, nr, tester, creator, rho_o, scc, lambda_o, gens, rhofunc, lookup,
|
|
1786
|
+
rep, rho, j, i, k;
|
|
1787
|
+
|
|
1788
|
+
if HasRClasses(S) or not IsRegularSemigroup(S) then
|
|
1789
|
+
return Concatenation(List(GreensRClasses(S), Idempotents));
|
|
1790
|
+
fi;
|
|
1791
|
+
|
|
1792
|
+
out := [];
|
|
1793
|
+
nr := 0;
|
|
1794
|
+
tester := IdempotentTester(S);
|
|
1795
|
+
creator := IdempotentCreator(S);
|
|
1796
|
+
rho_o := RhoOrb(S);
|
|
1797
|
+
scc := OrbSCC(rho_o);
|
|
1798
|
+
lambda_o := LambdaOrb(S);
|
|
1799
|
+
Enumerate(lambda_o, infinity);
|
|
1800
|
+
gens := lambda_o!.gens;
|
|
1801
|
+
rhofunc := RhoFunc(S);
|
|
1802
|
+
lookup := OrbSCCLookup(rho_o);
|
|
1803
|
+
|
|
1804
|
+
for i in [2 .. Length(lambda_o)] do
|
|
1805
|
+
# TODO(later) this could be better, just take the product with the next
|
|
1806
|
+
# schreiergen every time
|
|
1807
|
+
rep := EvaluateWord(lambda_o, TraceSchreierTreeForward(lambda_o, i));
|
|
1808
|
+
rho := rhofunc(rep);
|
|
1809
|
+
j := lookup[Position(rho_o, rho)];
|
|
1810
|
+
|
|
1811
|
+
for k in scc[j] do
|
|
1812
|
+
if tester(lambda_o[i], rho_o[k]) then
|
|
1813
|
+
nr := nr + 1;
|
|
1814
|
+
out[nr] := creator(lambda_o[i], rho_o[k]);
|
|
1815
|
+
fi;
|
|
1816
|
+
od;
|
|
1817
|
+
od;
|
|
1818
|
+
|
|
1819
|
+
if not HasNrIdempotents(S) then
|
|
1820
|
+
SetNrIdempotents(S, nr);
|
|
1821
|
+
fi;
|
|
1822
|
+
return out;
|
|
1823
|
+
end);
|
|
1824
|
+
|
|
1825
|
+
# same method for regular/ideals, different method for inverse
|
|
1826
|
+
|
|
1827
|
+
InstallMethod(Idempotents,
|
|
1828
|
+
"for an acting semigroup and a positive integer",
|
|
1829
|
+
[IsActingSemigroup, IsInt],
|
|
1830
|
+
function(S, n)
|
|
1831
|
+
local out, nr, tester, creator, rho_o, scc, lambda_o, gens, rhofunc, lookup,
|
|
1832
|
+
rank, rep, rho, j, i, k;
|
|
1833
|
+
|
|
1834
|
+
if n < 0 then
|
|
1835
|
+
ErrorNoReturn("the 2nd argument (an integer) is not non-negative");
|
|
1836
|
+
elif n > Maximum(List(GeneratorsOfSemigroup(S), x -> ActionRank(S)(x))) then
|
|
1837
|
+
return [];
|
|
1838
|
+
elif HasIdempotents(S) or not IsRegularSemigroup(S) then
|
|
1839
|
+
return Filtered(Idempotents(S), x -> ActionRank(S)(x) = n);
|
|
1840
|
+
fi;
|
|
1841
|
+
|
|
1842
|
+
out := [];
|
|
1843
|
+
nr := 0;
|
|
1844
|
+
tester := IdempotentTester(S);
|
|
1845
|
+
creator := IdempotentCreator(S);
|
|
1846
|
+
rho_o := RhoOrb(S);
|
|
1847
|
+
scc := OrbSCC(rho_o);
|
|
1848
|
+
lambda_o := LambdaOrb(S);
|
|
1849
|
+
gens := lambda_o!.gens;
|
|
1850
|
+
rhofunc := RhoFunc(S);
|
|
1851
|
+
lookup := OrbSCCLookup(rho_o);
|
|
1852
|
+
rank := RhoRank(S);
|
|
1853
|
+
|
|
1854
|
+
Enumerate(lambda_o, infinity);
|
|
1855
|
+
|
|
1856
|
+
for i in [2 .. Length(lambda_o)] do
|
|
1857
|
+
# TODO(later) this could be better, just take the product with the next
|
|
1858
|
+
# schreiergen every time
|
|
1859
|
+
rep := EvaluateWord(lambda_o, TraceSchreierTreeForward(lambda_o, i));
|
|
1860
|
+
rho := rhofunc(rep);
|
|
1861
|
+
j := lookup[Position(rho_o, rho)];
|
|
1862
|
+
if rank(rho_o[scc[j][1]]) = n then
|
|
1863
|
+
for k in scc[j] do
|
|
1864
|
+
if tester(lambda_o[i], rho_o[k]) then
|
|
1865
|
+
nr := nr + 1;
|
|
1866
|
+
out[nr] := creator(lambda_o[i], rho_o[k]);
|
|
1867
|
+
fi;
|
|
1868
|
+
od;
|
|
1869
|
+
fi;
|
|
1870
|
+
od;
|
|
1871
|
+
|
|
1872
|
+
return out;
|
|
1873
|
+
end);
|
|
1874
|
+
|
|
1875
|
+
# same method for regular/ideals, different method for inverse
|
|
1876
|
+
|
|
1877
|
+
InstallMethod(Idempotents, "for a D-class of an acting semigroup",
|
|
1878
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1879
|
+
function(D)
|
|
1880
|
+
if HasIsRegularGreensClass(D) and not IsRegularGreensClass(D) then
|
|
1881
|
+
# this avoids creating the R-classes, which is an unnecessary overhead
|
|
1882
|
+
return [];
|
|
1883
|
+
fi;
|
|
1884
|
+
return Concatenation(List(GreensRClasses(D), Idempotents));
|
|
1885
|
+
end);
|
|
1886
|
+
|
|
1887
|
+
# same method for regular/ideals, different method for inverse
|
|
1888
|
+
|
|
1889
|
+
InstallMethod(Idempotents, "for an L-class of an acting semigroup",
|
|
1890
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1891
|
+
L -> SEMIGROUPS.Idempotents(L,
|
|
1892
|
+
LambdaFunc(Parent(L))(L!.rep),
|
|
1893
|
+
RhoOrbSCC(L),
|
|
1894
|
+
RhoOrb(L),
|
|
1895
|
+
false));
|
|
1896
|
+
|
|
1897
|
+
# same method for regular/ideals, different method for inverse
|
|
1898
|
+
|
|
1899
|
+
InstallMethod(Idempotents, "for an R-class of an acting semigroup",
|
|
1900
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1901
|
+
R -> SEMIGROUPS.Idempotents(R,
|
|
1902
|
+
RhoFunc(Parent(R))(R!.rep),
|
|
1903
|
+
LambdaOrbSCC(R),
|
|
1904
|
+
LambdaOrb(R),
|
|
1905
|
+
true));
|
|
1906
|
+
|
|
1907
|
+
# same method for regular/inverse/ideals
|
|
1908
|
+
|
|
1909
|
+
InstallMethod(Idempotents, "for an H-class of an acting semigroup",
|
|
1910
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1911
|
+
function(H)
|
|
1912
|
+
local S, x;
|
|
1913
|
+
|
|
1914
|
+
if not IsGroupHClass(H) then
|
|
1915
|
+
return [];
|
|
1916
|
+
fi;
|
|
1917
|
+
|
|
1918
|
+
S := Parent(H);
|
|
1919
|
+
x := H!.rep;
|
|
1920
|
+
return [ConvertToExternalElement(S,
|
|
1921
|
+
IdempotentCreator(S)(LambdaFunc(S)(x),
|
|
1922
|
+
RhoFunc(S)(x)))];
|
|
1923
|
+
end);
|
|
1924
|
+
|
|
1925
|
+
# Number of idempotents . . .
|
|
1926
|
+
|
|
1927
|
+
# different method for regular/inverse, same for ideals
|
|
1928
|
+
|
|
1929
|
+
InstallMethod(NrIdempotents, "for an acting semigroup", [IsActingSemigroup],
|
|
1930
|
+
function(S)
|
|
1931
|
+
local data, lambda, rho, scc, lenreps, repslens, rholookup, repslookup,
|
|
1932
|
+
tester, nr, rhoval, m, ind, i;
|
|
1933
|
+
|
|
1934
|
+
if HasIdempotents(S) then
|
|
1935
|
+
return Length(Idempotents(S));
|
|
1936
|
+
fi;
|
|
1937
|
+
|
|
1938
|
+
data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
|
|
1939
|
+
|
|
1940
|
+
lambda := LambdaOrb(S);
|
|
1941
|
+
rho := RhoOrb(S);
|
|
1942
|
+
scc := OrbSCC(lambda);
|
|
1943
|
+
|
|
1944
|
+
lenreps := data!.lenreps;
|
|
1945
|
+
repslens := data!.repslens;
|
|
1946
|
+
rholookup := data!.rholookup;
|
|
1947
|
+
repslookup := data!.repslookup;
|
|
1948
|
+
|
|
1949
|
+
tester := IdempotentTester(S);
|
|
1950
|
+
|
|
1951
|
+
nr := 0;
|
|
1952
|
+
for m in [2 .. Length(scc)] do
|
|
1953
|
+
for ind in [1 .. lenreps[m]] do
|
|
1954
|
+
if repslens[m][ind] = 1 then
|
|
1955
|
+
rhoval := rho[rholookup[repslookup[m][ind][1]]];
|
|
1956
|
+
for i in scc[m] do
|
|
1957
|
+
if tester(lambda[i], rhoval) then
|
|
1958
|
+
nr := nr + 1;
|
|
1959
|
+
fi;
|
|
1960
|
+
od;
|
|
1961
|
+
fi;
|
|
1962
|
+
od;
|
|
1963
|
+
od;
|
|
1964
|
+
|
|
1965
|
+
return nr;
|
|
1966
|
+
end);
|
|
1967
|
+
|
|
1968
|
+
# same method for regular/inverse/ideals
|
|
1969
|
+
|
|
1970
|
+
InstallMethod(NrIdempotents, "for a D-class of an acting semigroup",
|
|
1971
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
1972
|
+
D -> Sum(List(GreensRClasses(D), NrIdempotents)));
|
|
1973
|
+
|
|
1974
|
+
# same method for regular/ideals, different method for inverse
|
|
1975
|
+
|
|
1976
|
+
InstallMethod(NrIdempotents, "for an L-class of an acting semigroup",
|
|
1977
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
1978
|
+
L -> SEMIGROUPS.NrIdempotents(L,
|
|
1979
|
+
LambdaFunc(Parent(L))(L!.rep),
|
|
1980
|
+
RhoOrbSCC(L),
|
|
1981
|
+
RhoOrb(L),
|
|
1982
|
+
false));
|
|
1983
|
+
|
|
1984
|
+
# same method for regular/ideals, different method inverse
|
|
1985
|
+
|
|
1986
|
+
InstallMethod(NrIdempotents, "for an R-class of an acting semigroup",
|
|
1987
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
1988
|
+
R -> SEMIGROUPS.NrIdempotents(R,
|
|
1989
|
+
RhoFunc(Parent(R))(R!.rep),
|
|
1990
|
+
LambdaOrbSCC(R),
|
|
1991
|
+
LambdaOrb(R),
|
|
1992
|
+
true));
|
|
1993
|
+
|
|
1994
|
+
# same method for regular/inverse/ideals
|
|
1995
|
+
|
|
1996
|
+
InstallMethod(NrIdempotents, "for a H-class of an acting semigroup",
|
|
1997
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
1998
|
+
function(H)
|
|
1999
|
+
if IsGroupHClass(H) then
|
|
2000
|
+
return 1;
|
|
2001
|
+
fi;
|
|
2002
|
+
return 0;
|
|
2003
|
+
end);
|
|
2004
|
+
|
|
2005
|
+
#############################################################################
|
|
2006
|
+
## 6. Regular classes . . .
|
|
2007
|
+
#############################################################################
|
|
2008
|
+
|
|
2009
|
+
# not required for regular/inverse, same for ideals
|
|
2010
|
+
|
|
2011
|
+
InstallMethod(IsRegularGreensClass, "for an D-class of an acting semigroup",
|
|
2012
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
2013
|
+
D -> SEMIGROUPS.IsRegularGreensClass(D,
|
|
2014
|
+
RhoFunc(Parent(D))(D!.rep),
|
|
2015
|
+
LambdaOrbSCC(D),
|
|
2016
|
+
LambdaOrb(D),
|
|
2017
|
+
true));
|
|
2018
|
+
|
|
2019
|
+
# not required for regular/inverse, same for ideals
|
|
2020
|
+
|
|
2021
|
+
InstallMethod(IsRegularGreensClass, "for an L-class of an acting semigroup",
|
|
2022
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
2023
|
+
L -> SEMIGROUPS.IsRegularGreensClass(L,
|
|
2024
|
+
LambdaFunc(Parent(L))(L!.rep),
|
|
2025
|
+
RhoOrbSCC(L),
|
|
2026
|
+
RhoOrb(L),
|
|
2027
|
+
false));
|
|
2028
|
+
|
|
2029
|
+
# not required for regular/inverse, same for ideals
|
|
2030
|
+
|
|
2031
|
+
InstallMethod(IsRegularGreensClass, "for an R-class of an acting semigroup",
|
|
2032
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
2033
|
+
R -> SEMIGROUPS.IsRegularGreensClass(R,
|
|
2034
|
+
RhoFunc(Parent(R))(R!.rep),
|
|
2035
|
+
LambdaOrbSCC(R),
|
|
2036
|
+
LambdaOrb(R),
|
|
2037
|
+
true));
|
|
2038
|
+
|
|
2039
|
+
# same method for regular/inverse, same method for ideals
|
|
2040
|
+
|
|
2041
|
+
InstallMethod(IsRegularGreensClass, "for an H-class of an acting semigroup",
|
|
2042
|
+
[IsGreensHClass and IsActingSemigroupGreensClass], IsGroupHClass);
|
|
2043
|
+
|
|
2044
|
+
# different method for regular/inverse/ideals
|
|
2045
|
+
|
|
2046
|
+
InstallMethod(NrRegularDClasses, "for an acting semigroup",
|
|
2047
|
+
[IsActingSemigroup],
|
|
2048
|
+
function(S)
|
|
2049
|
+
local data, datascc, rho, lambda, scc, rholookup, tester, nr, j, rhoval, i,
|
|
2050
|
+
k;
|
|
2051
|
+
|
|
2052
|
+
data := SemigroupData(S);
|
|
2053
|
+
datascc := OrbSCC(data);
|
|
2054
|
+
rho := RhoOrb(S);
|
|
2055
|
+
lambda := LambdaOrb(S);
|
|
2056
|
+
scc := OrbSCC(lambda);
|
|
2057
|
+
rholookup := data!.rholookup;
|
|
2058
|
+
tester := IdempotentTester(S);
|
|
2059
|
+
nr := 0;
|
|
2060
|
+
|
|
2061
|
+
for i in [2 .. Length(datascc)] do
|
|
2062
|
+
j := datascc[i][1];
|
|
2063
|
+
# data of the first R-class in the D-class corresponding to x
|
|
2064
|
+
rhoval := rho[rholookup[j]];
|
|
2065
|
+
for k in scc[data[j][2]] do
|
|
2066
|
+
if tester(lambda[k], rhoval) then
|
|
2067
|
+
nr := nr + 1;
|
|
2068
|
+
break;
|
|
2069
|
+
fi;
|
|
2070
|
+
od;
|
|
2071
|
+
od;
|
|
2072
|
+
return nr;
|
|
2073
|
+
end);
|
|
2074
|
+
|
|
2075
|
+
#############################################################################
|
|
2076
|
+
## 7. Iterators and enumerators . . .
|
|
2077
|
+
#############################################################################
|
|
2078
|
+
|
|
2079
|
+
#############################################################################
|
|
2080
|
+
## 7.a. for all classes
|
|
2081
|
+
#############################################################################
|
|
2082
|
+
|
|
2083
|
+
# different method for regular/inverse
|
|
2084
|
+
|
|
2085
|
+
InstallMethod(IteratorOfRClassReps, "for an acting semigroup",
|
|
2086
|
+
[IsActingSemigroup],
|
|
2087
|
+
function(S)
|
|
2088
|
+
local record;
|
|
2089
|
+
|
|
2090
|
+
record := rec();
|
|
2091
|
+
|
|
2092
|
+
record.i := 1;
|
|
2093
|
+
|
|
2094
|
+
record.parent := S;
|
|
2095
|
+
|
|
2096
|
+
record.NextIterator := function(iter)
|
|
2097
|
+
local data;
|
|
2098
|
+
iter!.i := iter!.i + 1;
|
|
2099
|
+
data := Enumerate(SemigroupData(iter!.parent), iter!.i, ReturnFalse);
|
|
2100
|
+
if iter!.i > Length(data!.orbit) then
|
|
2101
|
+
return fail;
|
|
2102
|
+
fi;
|
|
2103
|
+
return data[iter!.i][4];
|
|
2104
|
+
end;
|
|
2105
|
+
|
|
2106
|
+
record.ShallowCopy := iter -> rec(i := 1, parent := iter!.parent);
|
|
2107
|
+
|
|
2108
|
+
return IteratorByNextIterator(record);
|
|
2109
|
+
end);
|
|
2110
|
+
|
|
2111
|
+
# same method for regular/inverse
|
|
2112
|
+
|
|
2113
|
+
InstallMethod(IteratorOfRClasses, "for an acting semigroup",
|
|
2114
|
+
[IsActingSemigroup],
|
|
2115
|
+
function(S)
|
|
2116
|
+
local record;
|
|
2117
|
+
|
|
2118
|
+
if HasGreensRClasses(S) then
|
|
2119
|
+
return IteratorList(GreensRClasses(S));
|
|
2120
|
+
fi;
|
|
2121
|
+
|
|
2122
|
+
record := rec();
|
|
2123
|
+
record.parent := S;
|
|
2124
|
+
|
|
2125
|
+
return WrappedIterator(IteratorOfRClassReps(S),
|
|
2126
|
+
{iter, x} -> GreensRClassOfElementNC(iter!.parent, x),
|
|
2127
|
+
record);
|
|
2128
|
+
end);
|
|
2129
|
+
|
|
2130
|
+
# different method for regular/inverse
|
|
2131
|
+
|
|
2132
|
+
InstallMethod(IteratorOfDClasses, "for an acting semigroup",
|
|
2133
|
+
[IsActingSemigroup],
|
|
2134
|
+
function(S)
|
|
2135
|
+
local iter, convert, isnew;
|
|
2136
|
+
|
|
2137
|
+
if IsClosedData(SemigroupData(S)) then
|
|
2138
|
+
return IteratorList(GreensDClasses(S));
|
|
2139
|
+
fi;
|
|
2140
|
+
|
|
2141
|
+
convert := function(iter, x)
|
|
2142
|
+
local D;
|
|
2143
|
+
D := DClassOfRClass(GreensRClassOfElementNC(S, x));
|
|
2144
|
+
Add(iter!.classes, D);
|
|
2145
|
+
return D;
|
|
2146
|
+
end;
|
|
2147
|
+
|
|
2148
|
+
isnew := {iter, x} -> x = fail or ForAll(iter!.classes, D -> not x in D);
|
|
2149
|
+
|
|
2150
|
+
return WrappedIterator(IteratorOfRClassReps(S),
|
|
2151
|
+
convert,
|
|
2152
|
+
rec(classes := []),
|
|
2153
|
+
isnew);
|
|
2154
|
+
end);
|
|
2155
|
+
|
|
2156
|
+
########################################################################
|
|
2157
|
+
# 7.b. for individual classes
|
|
2158
|
+
########################################################################
|
|
2159
|
+
|
|
2160
|
+
# different method for regular/inverse
|
|
2161
|
+
|
|
2162
|
+
InstallMethod(Enumerator, "for a D-class of an acting semigroup",
|
|
2163
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
2164
|
+
function(D)
|
|
2165
|
+
local record, convert_out, convert_in, i;
|
|
2166
|
+
|
|
2167
|
+
record := rec();
|
|
2168
|
+
|
|
2169
|
+
record.parent := D; # required by WrappedEnumerator
|
|
2170
|
+
record.underlying_enums := List(GreensRClasses(D), Enumerator);
|
|
2171
|
+
record.lengths := [];
|
|
2172
|
+
|
|
2173
|
+
for i in [1 .. NrRClasses(D)] do
|
|
2174
|
+
record.lengths[i] := Sum(record.underlying_enums{[1 .. i]}, Length);
|
|
2175
|
+
od;
|
|
2176
|
+
|
|
2177
|
+
convert_out := function(enum, pos)
|
|
2178
|
+
local index;
|
|
2179
|
+
index := PositionSorted(enum!.lengths, pos);
|
|
2180
|
+
if index > 1 then
|
|
2181
|
+
pos := pos - enum!.lengths[index - 1];
|
|
2182
|
+
fi;
|
|
2183
|
+
return enum!.underlying_enums[index][pos];
|
|
2184
|
+
end;
|
|
2185
|
+
|
|
2186
|
+
convert_in := function(enum, elt)
|
|
2187
|
+
local R, index, pos;
|
|
2188
|
+
if not elt in enum!.parent then
|
|
2189
|
+
return fail;
|
|
2190
|
+
fi;
|
|
2191
|
+
R := GreensRClassOfElement(enum!.parent, elt);
|
|
2192
|
+
index := Position(GreensRClasses(D), R);
|
|
2193
|
+
pos := Position(enum!.underlying_enums[index], elt);
|
|
2194
|
+
if index <> 1 then
|
|
2195
|
+
return pos + enum!.lengths[index - 1];
|
|
2196
|
+
else
|
|
2197
|
+
return pos;
|
|
2198
|
+
fi;
|
|
2199
|
+
end;
|
|
2200
|
+
|
|
2201
|
+
return WrappedEnumerator(record, [1 .. Size(D)], convert_out, convert_in);
|
|
2202
|
+
end);
|
|
2203
|
+
|
|
2204
|
+
# different method for regular/inverse
|
|
2205
|
+
|
|
2206
|
+
InstallMethod(Iterator, "for a D-class of an acting semigroup",
|
|
2207
|
+
[IsGreensDClass and IsActingSemigroupGreensClass],
|
|
2208
|
+
function(D)
|
|
2209
|
+
|
|
2210
|
+
if HasAsList(D) then
|
|
2211
|
+
return IteratorList(AsList(D));
|
|
2212
|
+
fi;
|
|
2213
|
+
return ChainIterators(GreensRClasses(D));
|
|
2214
|
+
end);
|
|
2215
|
+
|
|
2216
|
+
# same method for inverse/regular
|
|
2217
|
+
|
|
2218
|
+
InstallMethod(Enumerator, "for an H-class of acting semigroup",
|
|
2219
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
2220
|
+
function(H)
|
|
2221
|
+
local convert_in, convert_out;
|
|
2222
|
+
|
|
2223
|
+
convert_in := function(enum, elt)
|
|
2224
|
+
local H, S, rep;
|
|
2225
|
+
H := enum!.parent;
|
|
2226
|
+
S := Parent(H);
|
|
2227
|
+
rep := H!.rep;
|
|
2228
|
+
elt := ConvertToInternalElement(S, elt);
|
|
2229
|
+
|
|
2230
|
+
if LambdaFunc(S)(elt) <> LambdaFunc(S)(rep)
|
|
2231
|
+
or RhoFunc(S)(elt) <> RhoFunc(S)(rep) then
|
|
2232
|
+
return fail;
|
|
2233
|
+
fi;
|
|
2234
|
+
return LambdaPerm(S)(rep, elt);
|
|
2235
|
+
end;
|
|
2236
|
+
|
|
2237
|
+
convert_out := function(enum, perm)
|
|
2238
|
+
local H, S;
|
|
2239
|
+
H := enum!.parent;
|
|
2240
|
+
S := Parent(H);
|
|
2241
|
+
return ConvertToExternalElement(S,
|
|
2242
|
+
StabilizerAction(S)(H!.rep, perm));
|
|
2243
|
+
end;
|
|
2244
|
+
|
|
2245
|
+
return WrappedEnumerator(H,
|
|
2246
|
+
Enumerator(SchutzenbergerGroup(H)),
|
|
2247
|
+
convert_out,
|
|
2248
|
+
convert_in);
|
|
2249
|
+
end);
|
|
2250
|
+
|
|
2251
|
+
# same method for regular/inverse
|
|
2252
|
+
|
|
2253
|
+
InstallMethod(Iterator, "for a H-class of an acting semigroup",
|
|
2254
|
+
[IsGreensHClass and IsActingSemigroupGreensClass],
|
|
2255
|
+
function(H)
|
|
2256
|
+
local record, unwrap;
|
|
2257
|
+
|
|
2258
|
+
if HasAsList(H) then
|
|
2259
|
+
return IteratorList(AsList(H));
|
|
2260
|
+
fi;
|
|
2261
|
+
|
|
2262
|
+
record := rec();
|
|
2263
|
+
record.parent := H;
|
|
2264
|
+
record.rep := H!.rep;
|
|
2265
|
+
|
|
2266
|
+
unwrap := function(iter, x)
|
|
2267
|
+
local S, rep;
|
|
2268
|
+
S := Parent(iter!.parent);
|
|
2269
|
+
rep := iter!.rep;
|
|
2270
|
+
return ConvertToExternalElement(S, StabilizerAction(S)(rep, x));
|
|
2271
|
+
end;
|
|
2272
|
+
|
|
2273
|
+
return WrappedIterator(Iterator(SchutzenbergerGroup(H)), unwrap, record);
|
|
2274
|
+
end);
|
|
2275
|
+
|
|
2276
|
+
# same method for regular, different method for inverse
|
|
2277
|
+
|
|
2278
|
+
InstallMethod(Enumerator, "for L-class of an acting semigroup",
|
|
2279
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
2280
|
+
function(L)
|
|
2281
|
+
local convert_out, convert_in, scc, enum;
|
|
2282
|
+
|
|
2283
|
+
convert_in := function(enum, elt)
|
|
2284
|
+
local L, S, i, f;
|
|
2285
|
+
|
|
2286
|
+
L := enum!.parent;
|
|
2287
|
+
S := Parent(L);
|
|
2288
|
+
|
|
2289
|
+
elt := ConvertToInternalElement(S, elt);
|
|
2290
|
+
|
|
2291
|
+
if LambdaFunc(S)(elt) <> LambdaFunc(S)(L!.rep) then
|
|
2292
|
+
return fail;
|
|
2293
|
+
fi;
|
|
2294
|
+
|
|
2295
|
+
i := Position(RhoOrb(L), RhoFunc(S)(elt));
|
|
2296
|
+
if i = fail or OrbSCCLookup(RhoOrb(L))[i] <> RhoOrbSCCIndex(L) then
|
|
2297
|
+
return fail;
|
|
2298
|
+
fi;
|
|
2299
|
+
|
|
2300
|
+
f := RhoOrbMult(RhoOrb(L), RhoOrbSCCIndex(L), i)[2] * elt;
|
|
2301
|
+
|
|
2302
|
+
return [i, LambdaPerm(S)(L!.rep, f)];
|
|
2303
|
+
end;
|
|
2304
|
+
|
|
2305
|
+
convert_out := function(enum, tuple)
|
|
2306
|
+
local L, S, rep, act, result;
|
|
2307
|
+
|
|
2308
|
+
L := enum!.parent;
|
|
2309
|
+
S := Parent(L);
|
|
2310
|
+
rep := L!.rep;
|
|
2311
|
+
act := StabilizerAction(S);
|
|
2312
|
+
|
|
2313
|
+
result := act(RhoOrbMult(RhoOrb(L),
|
|
2314
|
+
RhoOrbSCCIndex(L),
|
|
2315
|
+
tuple[1])[1] * rep,
|
|
2316
|
+
tuple[2]);
|
|
2317
|
+
return ConvertToExternalElement(S, result);
|
|
2318
|
+
end;
|
|
2319
|
+
|
|
2320
|
+
scc := OrbSCC(RhoOrb(L))[RhoOrbSCCIndex(L)];
|
|
2321
|
+
enum := EnumeratorOfCartesianProduct(scc, SchutzenbergerGroup(L));
|
|
2322
|
+
return WrappedEnumerator(L, enum, convert_out, convert_in);
|
|
2323
|
+
end);
|
|
2324
|
+
|
|
2325
|
+
# same method for regular, different method for inverse
|
|
2326
|
+
|
|
2327
|
+
InstallMethod(Iterator, "for an L-class of an acting semigroup",
|
|
2328
|
+
[IsGreensLClass and IsActingSemigroupGreensClass],
|
|
2329
|
+
function(L)
|
|
2330
|
+
local it, record, unwrap;
|
|
2331
|
+
|
|
2332
|
+
if HasAsSSortedList(L) then
|
|
2333
|
+
return IteratorList(AsSSortedList(L));
|
|
2334
|
+
fi;
|
|
2335
|
+
|
|
2336
|
+
it := IteratorOfCartesianProduct(OrbSCC(RhoOrb(L))[RhoOrbSCCIndex(L)],
|
|
2337
|
+
Enumerator(SchutzenbergerGroup(L)));
|
|
2338
|
+
|
|
2339
|
+
record := rec();
|
|
2340
|
+
record.parent := L;
|
|
2341
|
+
|
|
2342
|
+
unwrap := function(iter, x)
|
|
2343
|
+
local L, S, rep, result;
|
|
2344
|
+
L := iter!.parent;
|
|
2345
|
+
S := Parent(L);
|
|
2346
|
+
rep := L!.rep;
|
|
2347
|
+
result := StabilizerAction(S)(RhoOrbMult(RhoOrb(L),
|
|
2348
|
+
RhoOrbSCCIndex(L),
|
|
2349
|
+
x[1])[1] * rep,
|
|
2350
|
+
x[2]);
|
|
2351
|
+
return ConvertToExternalElement(S, result);
|
|
2352
|
+
end;
|
|
2353
|
+
|
|
2354
|
+
return WrappedIterator(it, unwrap, record);
|
|
2355
|
+
end);
|
|
2356
|
+
|
|
2357
|
+
# same method for regular/inverse
|
|
2358
|
+
|
|
2359
|
+
InstallMethod(Enumerator, "for R-class of an acting semigroup",
|
|
2360
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
2361
|
+
function(R)
|
|
2362
|
+
local convert_out, convert_in, scc, enum;
|
|
2363
|
+
|
|
2364
|
+
convert_in := function(enum, elt)
|
|
2365
|
+
local R, S, i, f;
|
|
2366
|
+
|
|
2367
|
+
R := enum!.parent;
|
|
2368
|
+
S := Parent(R);
|
|
2369
|
+
|
|
2370
|
+
elt := ConvertToInternalElement(S, elt);
|
|
2371
|
+
|
|
2372
|
+
if RhoFunc(S)(elt) <> RhoFunc(S)(R!.rep) then
|
|
2373
|
+
return fail;
|
|
2374
|
+
fi;
|
|
2375
|
+
|
|
2376
|
+
i := Position(LambdaOrb(R), LambdaFunc(S)(elt));
|
|
2377
|
+
|
|
2378
|
+
if i = fail or OrbSCCLookup(LambdaOrb(R))[i] <> LambdaOrbSCCIndex(R) then
|
|
2379
|
+
return fail;
|
|
2380
|
+
fi;
|
|
2381
|
+
f := elt * LambdaOrbMult(LambdaOrb(R), LambdaOrbSCCIndex(R), i)[2];
|
|
2382
|
+
|
|
2383
|
+
return [LambdaPerm(S)(R!.rep, f), i];
|
|
2384
|
+
end;
|
|
2385
|
+
|
|
2386
|
+
convert_out := function(enum, tuple)
|
|
2387
|
+
local R, S, rep, act, result;
|
|
2388
|
+
|
|
2389
|
+
R := enum!.parent;
|
|
2390
|
+
S := Parent(R);
|
|
2391
|
+
rep := R!.rep;
|
|
2392
|
+
act := StabilizerAction(S);
|
|
2393
|
+
result := act(rep, tuple[1]) * LambdaOrbMult(LambdaOrb(R),
|
|
2394
|
+
LambdaOrbSCCIndex(R),
|
|
2395
|
+
tuple[2])[1];
|
|
2396
|
+
return ConvertToExternalElement(S, result);
|
|
2397
|
+
end;
|
|
2398
|
+
|
|
2399
|
+
scc := OrbSCC(LambdaOrb(R))[LambdaOrbSCCIndex(R)];
|
|
2400
|
+
enum := EnumeratorOfCartesianProduct(SchutzenbergerGroup(R), scc);
|
|
2401
|
+
return WrappedEnumerator(R, enum, convert_out, convert_in);
|
|
2402
|
+
end);
|
|
2403
|
+
|
|
2404
|
+
# This method makes Iterator of a semigroup much better!!
|
|
2405
|
+
# same method for regular/inverse
|
|
2406
|
+
|
|
2407
|
+
InstallMethod(Iterator, "for an R-class of an acting semigroup",
|
|
2408
|
+
[IsGreensRClass and IsActingSemigroupGreensClass],
|
|
2409
|
+
function(R)
|
|
2410
|
+
local it, record, unwrap;
|
|
2411
|
+
|
|
2412
|
+
if HasAsSSortedList(R) then
|
|
2413
|
+
return IteratorList(AsSSortedList(R));
|
|
2414
|
+
fi;
|
|
2415
|
+
|
|
2416
|
+
it := IteratorOfCartesianProduct(Enumerator(SchutzenbergerGroup(R)),
|
|
2417
|
+
OrbSCC(LambdaOrb(R))[LambdaOrbSCCIndex(R)]);
|
|
2418
|
+
|
|
2419
|
+
record := rec();
|
|
2420
|
+
record.parent := R;
|
|
2421
|
+
|
|
2422
|
+
unwrap := function(iter, x)
|
|
2423
|
+
local R, S, rep, result;
|
|
2424
|
+
R := iter!.parent;
|
|
2425
|
+
S := Parent(R);
|
|
2426
|
+
rep := R!.rep;
|
|
2427
|
+
result := StabilizerAction(S)(rep, x[1])
|
|
2428
|
+
* LambdaOrbMult(LambdaOrb(R), LambdaOrbSCCIndex(R), x[2])[1];
|
|
2429
|
+
return ConvertToExternalElement(S, result);
|
|
2430
|
+
end;
|
|
2431
|
+
|
|
2432
|
+
return WrappedIterator(it, unwrap, record);
|
|
2433
|
+
end);
|