passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.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/x86_64-pc-linux-gnu-default64-kv10/semigroups.so +0 -0
- gap/pkg/semigroups/config.guess +1807 -0
- gap/pkg/semigroups/config.log +1069 -0
- gap/pkg/semigroups/config.status +1133 -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.29.dist-info/METADATA +93 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/METADATA.bak +94 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/RECORD +354 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/WHEEL +6 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/top_level.txt +1 -0
- passagemath_gap_pkg_semigroups.libs/libsemigroups-6be12ad2.so.2.0.0 +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.abi3.so +0 -0
|
@@ -0,0 +1,1214 @@
|
|
|
1
|
+
#############################################################################
|
|
2
|
+
##
|
|
3
|
+
## attributes/attr.gi
|
|
4
|
+
## Copyright (C) 2013-2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
# This file contains methods for finding various attributes of finite
|
|
12
|
+
# semigroups, which satisfy CanUseFroidurePin or where no better method is
|
|
13
|
+
# known.
|
|
14
|
+
|
|
15
|
+
# Note about the difference between One and MultiplicativeNeutralElement
|
|
16
|
+
# (the same goes for Zero and MultplicativeZero):
|
|
17
|
+
#
|
|
18
|
+
# One(s) returns One(Representative(s)) if it belongs to s, so that
|
|
19
|
+
# One(s) = Transformation([1 .. DegreeOfTransformationSemigroup(s)]) if s is a
|
|
20
|
+
# transformation semigroup and it returns fail otherwise, or it returns
|
|
21
|
+
# PartialPerm([1 .. DegreeOfPartialPermSemigroup]) if this belongs to s.
|
|
22
|
+
#
|
|
23
|
+
# MultiplicativeNeutralElement on the other hand returns the element of s that
|
|
24
|
+
# acts as the identity, note that this can be equal to One(s) but it can also
|
|
25
|
+
# not be equal to One(s).
|
|
26
|
+
#
|
|
27
|
+
# A semigroup satisfies IsMonoidAsSemigroup(s) if
|
|
28
|
+
# MultiplicativeNeutralElement(x) <> fail, so it could be that One(s) returns
|
|
29
|
+
# fail but IsMonoidAsSemigroup is still true.
|
|
30
|
+
|
|
31
|
+
SEMIGROUPS.InjectionPrincipalFactor := function(D, constructor)
|
|
32
|
+
local map, inv, G, mat, rep, R, L, x, RR, LL, rms, iso, hom, i, j;
|
|
33
|
+
|
|
34
|
+
map := IsomorphismPermGroup(GroupHClass(D));
|
|
35
|
+
inv := InverseGeneralMapping(map);
|
|
36
|
+
|
|
37
|
+
G := Range(map);
|
|
38
|
+
mat := [];
|
|
39
|
+
rep := MultiplicativeNeutralElement(GroupHClass(D));
|
|
40
|
+
R := HClassReps(LClass(D, rep));
|
|
41
|
+
L := HClassReps(RClass(D, rep));
|
|
42
|
+
|
|
43
|
+
for i in [1 .. Length(L)] do
|
|
44
|
+
mat[i] := [];
|
|
45
|
+
for j in [1 .. Length(R)] do
|
|
46
|
+
x := L[i] * R[j];
|
|
47
|
+
if x in D then
|
|
48
|
+
mat[i][j] := x ^ map;
|
|
49
|
+
else
|
|
50
|
+
mat[i][j] := 0;
|
|
51
|
+
fi;
|
|
52
|
+
od;
|
|
53
|
+
od;
|
|
54
|
+
|
|
55
|
+
RR := EmptyPlist(Length(R));
|
|
56
|
+
LL := EmptyPlist(Length(L));
|
|
57
|
+
|
|
58
|
+
for j in [1 .. Length(R)] do
|
|
59
|
+
for i in [1 .. Length(L)] do
|
|
60
|
+
if mat[i][j] <> 0 then
|
|
61
|
+
RR[j] := ((mat[i][j] ^ -1) ^ inv) * L[i];
|
|
62
|
+
break;
|
|
63
|
+
fi;
|
|
64
|
+
od;
|
|
65
|
+
od;
|
|
66
|
+
|
|
67
|
+
for i in [1 .. Length(L)] do
|
|
68
|
+
for j in [1 .. Length(R)] do
|
|
69
|
+
if mat[i][j] <> 0 then
|
|
70
|
+
LL[i] := R[j] * (mat[i][j] ^ -1) ^ inv;
|
|
71
|
+
break;
|
|
72
|
+
fi;
|
|
73
|
+
od;
|
|
74
|
+
od;
|
|
75
|
+
|
|
76
|
+
rms := constructor(G, mat);
|
|
77
|
+
|
|
78
|
+
iso := function(x)
|
|
79
|
+
local i, j;
|
|
80
|
+
|
|
81
|
+
if not x in D then
|
|
82
|
+
return fail;
|
|
83
|
+
fi;
|
|
84
|
+
|
|
85
|
+
i := PositionProperty(R, y -> y in RClass(D, x));
|
|
86
|
+
j := PositionProperty(L, y -> y in LClass(D, x));
|
|
87
|
+
|
|
88
|
+
return Objectify(TypeReesMatrixSemigroupElements(rms),
|
|
89
|
+
[i, (rep * RR[i] * x * LL[j]) ^ map, j, mat]);
|
|
90
|
+
end;
|
|
91
|
+
|
|
92
|
+
inv := function(x)
|
|
93
|
+
if x![1] = 0 then
|
|
94
|
+
return fail;
|
|
95
|
+
fi;
|
|
96
|
+
return R[x![1]] * (x![2] ^ InverseGeneralMapping(map)) * L[x![3]];
|
|
97
|
+
end;
|
|
98
|
+
hom := MappingByFunction(D, rms, iso, inv);
|
|
99
|
+
SetIsInjective(hom, true);
|
|
100
|
+
SetIsTotal(hom, true);
|
|
101
|
+
return hom;
|
|
102
|
+
end;
|
|
103
|
+
|
|
104
|
+
#############################################################################
|
|
105
|
+
## 1. Default methods, for which there are currently no better methods.
|
|
106
|
+
#############################################################################
|
|
107
|
+
|
|
108
|
+
# Don't use ClosureSemigroup here since the order of the generators matters
|
|
109
|
+
# and ClosureSemigroup shuffles the generators.
|
|
110
|
+
|
|
111
|
+
InstallMethod(GeneratorsSmallest,
|
|
112
|
+
"for a semigroup with CanUseFroidurePin",
|
|
113
|
+
[CanUseFroidurePin],
|
|
114
|
+
function(S)
|
|
115
|
+
local iter, gens, T, closure, x;
|
|
116
|
+
|
|
117
|
+
iter := IteratorSorted(S);
|
|
118
|
+
gens := [NextIterator(iter)];
|
|
119
|
+
T := Semigroup(gens);
|
|
120
|
+
|
|
121
|
+
if CanUseLibsemigroupsFroidurePin(S) then
|
|
122
|
+
closure := {S, coll, opts} ->
|
|
123
|
+
ClosureSemigroupOrMonoidNC(Semigroup, S, coll, opts);
|
|
124
|
+
else
|
|
125
|
+
closure := ClosureSemigroup;
|
|
126
|
+
fi;
|
|
127
|
+
|
|
128
|
+
for x in iter do
|
|
129
|
+
if not x in T then
|
|
130
|
+
T := closure(T, [x], SEMIGROUPS.OptionsRec(T));
|
|
131
|
+
Add(gens, x);
|
|
132
|
+
if T = S then
|
|
133
|
+
break;
|
|
134
|
+
fi;
|
|
135
|
+
fi;
|
|
136
|
+
od;
|
|
137
|
+
return gens;
|
|
138
|
+
end);
|
|
139
|
+
|
|
140
|
+
InstallMethod(SmallestElementSemigroup, "for a semigroup",
|
|
141
|
+
[IsSemigroup],
|
|
142
|
+
function(S)
|
|
143
|
+
if not IsFinite(S) then
|
|
144
|
+
TryNextMethod();
|
|
145
|
+
fi;
|
|
146
|
+
return NextIterator(IteratorSorted(S));
|
|
147
|
+
end);
|
|
148
|
+
|
|
149
|
+
InstallMethod(LargestElementSemigroup, "for a semigroup",
|
|
150
|
+
[IsSemigroup],
|
|
151
|
+
function(S)
|
|
152
|
+
if not IsFinite(S) then
|
|
153
|
+
TryNextMethod();
|
|
154
|
+
fi;
|
|
155
|
+
return EnumeratorSorted(S)[Size(S)];
|
|
156
|
+
end);
|
|
157
|
+
|
|
158
|
+
InstallMethod(NrIdempotents, "for a semigroup", [IsSemigroup],
|
|
159
|
+
S -> Length(Idempotents(S)));
|
|
160
|
+
|
|
161
|
+
InstallMethod(GroupOfUnits, "for a semigroup", [IsSemigroup],
|
|
162
|
+
function(S)
|
|
163
|
+
local H, map, U, iso;
|
|
164
|
+
|
|
165
|
+
if not IsFinite(S) then
|
|
166
|
+
TryNextMethod();
|
|
167
|
+
elif MultiplicativeNeutralElement(S) = fail then
|
|
168
|
+
return fail;
|
|
169
|
+
fi;
|
|
170
|
+
|
|
171
|
+
H := GreensHClassOfElementNC(S, MultiplicativeNeutralElement(S));
|
|
172
|
+
map := IsomorphismPermGroup(H);
|
|
173
|
+
|
|
174
|
+
U := Semigroup(List(GeneratorsOfGroup(Range(map)),
|
|
175
|
+
x -> x ^ InverseGeneralMapping(map)));
|
|
176
|
+
|
|
177
|
+
iso := SemigroupIsomorphismByFunctionNC(U,
|
|
178
|
+
Range(map),
|
|
179
|
+
x -> x ^ map,
|
|
180
|
+
x -> x ^ InverseGeneralMapping(map));
|
|
181
|
+
SetIsomorphismPermGroup(U, iso);
|
|
182
|
+
SetIsGroupAsSemigroup(U, true);
|
|
183
|
+
UseIsomorphismRelation(U, Range(iso));
|
|
184
|
+
return U;
|
|
185
|
+
end);
|
|
186
|
+
|
|
187
|
+
# same method for ideals
|
|
188
|
+
|
|
189
|
+
InstallMethod(IsomorphismReesMatrixSemigroup, "for a D-class",
|
|
190
|
+
[IsGreensDClass],
|
|
191
|
+
function(D)
|
|
192
|
+
if NrIdempotents(D) <> NrHClasses(D) then
|
|
193
|
+
ErrorNoReturn("the argument (a Green's D-class) is not a semigroup");
|
|
194
|
+
fi;
|
|
195
|
+
|
|
196
|
+
return InjectionPrincipalFactor(D);
|
|
197
|
+
end);
|
|
198
|
+
|
|
199
|
+
# same method for ideal
|
|
200
|
+
|
|
201
|
+
InstallMethod(IrredundantGeneratingSubset,
|
|
202
|
+
"for a multiplicative element collection",
|
|
203
|
+
[IsMultiplicativeElementCollection],
|
|
204
|
+
function(coll)
|
|
205
|
+
local gens, nrgens, deg, out, redund, i, x;
|
|
206
|
+
|
|
207
|
+
if (IsSemigroup(coll) and HasGeneratorsOfSemigroup(coll))
|
|
208
|
+
or (HasIsSemigroupIdeal(coll) and IsSemigroupIdeal(coll)) then
|
|
209
|
+
coll := ShallowCopy(GeneratorsOfSemigroup(coll));
|
|
210
|
+
elif not IsMutable(coll) then
|
|
211
|
+
coll := ShallowCopy(coll);
|
|
212
|
+
fi;
|
|
213
|
+
|
|
214
|
+
if Size(coll) = 1 then
|
|
215
|
+
return coll;
|
|
216
|
+
fi;
|
|
217
|
+
|
|
218
|
+
gens := Set(coll);
|
|
219
|
+
nrgens := Length(gens);
|
|
220
|
+
|
|
221
|
+
if nrgens = 1 then
|
|
222
|
+
return gens;
|
|
223
|
+
elif IsGeneratorsOfActingSemigroup(coll) then
|
|
224
|
+
deg := ActionDegree(coll);
|
|
225
|
+
Shuffle(coll);
|
|
226
|
+
Sort(coll, {x, y} -> ActionRank(x, deg) > ActionRank(y, deg));
|
|
227
|
+
fi;
|
|
228
|
+
|
|
229
|
+
out := EmptyPlist(Length(coll));
|
|
230
|
+
redund := EmptyPlist(Length(coll));
|
|
231
|
+
i := 0;
|
|
232
|
+
|
|
233
|
+
repeat
|
|
234
|
+
i := i + 1;
|
|
235
|
+
x := coll[i];
|
|
236
|
+
if InfoLevel(InfoSemigroups) >= 3 then
|
|
237
|
+
PrintFormatted(
|
|
238
|
+
"at \t{} of \t{} with \t{} redundant, \t{} non-redundant\n",
|
|
239
|
+
i,
|
|
240
|
+
Length(coll),
|
|
241
|
+
Length(redund),
|
|
242
|
+
Length(out));
|
|
243
|
+
fi;
|
|
244
|
+
|
|
245
|
+
if not x in redund and not x in out then
|
|
246
|
+
if Length(gens) > 1 and x in Semigroup(Difference(gens, [x])) then
|
|
247
|
+
AddSet(redund, x);
|
|
248
|
+
gens := Difference(gens, [x]);
|
|
249
|
+
else
|
|
250
|
+
AddSet(out, x);
|
|
251
|
+
fi;
|
|
252
|
+
fi;
|
|
253
|
+
until Length(redund) + Length(out) = nrgens;
|
|
254
|
+
|
|
255
|
+
if InfoLevel(InfoSemigroups) >= 3 then
|
|
256
|
+
Print("\n");
|
|
257
|
+
fi;
|
|
258
|
+
|
|
259
|
+
return out;
|
|
260
|
+
end);
|
|
261
|
+
|
|
262
|
+
# same method for ideals
|
|
263
|
+
|
|
264
|
+
InstallMethod(MinimalIdeal, "for a semigroup",
|
|
265
|
+
[IsSemigroup],
|
|
266
|
+
function(S)
|
|
267
|
+
local I;
|
|
268
|
+
if not IsFinite(S) then
|
|
269
|
+
TryNextMethod();
|
|
270
|
+
fi;
|
|
271
|
+
I := SemigroupIdealByGeneratorsNC(S,
|
|
272
|
+
[RepresentativeOfMinimalIdeal(S)],
|
|
273
|
+
SEMIGROUPS.OptionsRec(S));
|
|
274
|
+
SetIsSimpleSemigroup(I, true);
|
|
275
|
+
return I;
|
|
276
|
+
end);
|
|
277
|
+
|
|
278
|
+
InstallMethod(PrincipalFactor, "for a Green's D-class",
|
|
279
|
+
[IsGreensDClass], D -> Range(InjectionPrincipalFactor(D)));
|
|
280
|
+
|
|
281
|
+
InstallMethod(NormalizedPrincipalFactor, "for a Green's D-class",
|
|
282
|
+
[IsGreensDClass], D -> Range(InjectionNormalizedPrincipalFactor(D)));
|
|
283
|
+
|
|
284
|
+
# different method for ideals, not yet implemented
|
|
285
|
+
|
|
286
|
+
InstallMethod(SmallSemigroupGeneratingSet, "for a list or collection",
|
|
287
|
+
[IsListOrCollection],
|
|
288
|
+
function(coll)
|
|
289
|
+
if Length(coll) < 2 then
|
|
290
|
+
return coll;
|
|
291
|
+
fi;
|
|
292
|
+
return GeneratorsOfSemigroup(Semigroup(coll, rec(small := true)));
|
|
293
|
+
end);
|
|
294
|
+
|
|
295
|
+
# different method for ideals, not yet implemented
|
|
296
|
+
|
|
297
|
+
InstallMethod(SmallSemigroupGeneratingSet,
|
|
298
|
+
"for a finite semigroup", [IsSemigroup and IsFinite],
|
|
299
|
+
S -> SmallSemigroupGeneratingSet(GeneratorsOfSemigroup(S)));
|
|
300
|
+
|
|
301
|
+
InstallMethod(SmallMonoidGeneratingSet,
|
|
302
|
+
"for a multiplicative element with one collection",
|
|
303
|
+
[IsMultiplicativeElementWithOneCollection],
|
|
304
|
+
function(coll)
|
|
305
|
+
if Length(coll) < 2 then
|
|
306
|
+
return coll;
|
|
307
|
+
fi;
|
|
308
|
+
return GeneratorsOfMonoid(Monoid(coll, rec(small := true)));
|
|
309
|
+
end);
|
|
310
|
+
|
|
311
|
+
# same method for ideals
|
|
312
|
+
|
|
313
|
+
InstallMethod(SmallMonoidGeneratingSet, "for a finite monoid",
|
|
314
|
+
[IsFinite and IsMonoid],
|
|
315
|
+
function(S)
|
|
316
|
+
if Length(GeneratorsOfMonoid(S)) < 2 then
|
|
317
|
+
return GeneratorsOfMonoid(S);
|
|
318
|
+
fi;
|
|
319
|
+
return SmallMonoidGeneratingSet(GeneratorsOfMonoid(S));
|
|
320
|
+
end);
|
|
321
|
+
|
|
322
|
+
InstallMethod(SmallInverseSemigroupGeneratingSet,
|
|
323
|
+
"for a multiplicative element coll",
|
|
324
|
+
[IsMultiplicativeElementCollection],
|
|
325
|
+
function(coll)
|
|
326
|
+
if not IsGeneratorsOfInverseSemigroup(coll) then
|
|
327
|
+
ErrorNoReturn("the argument (a mult. elt. coll.) does not ",
|
|
328
|
+
"satisfy IsGeneratorsOfInverseSemigroup");
|
|
329
|
+
fi;
|
|
330
|
+
if Length(coll) < 2 then
|
|
331
|
+
return coll;
|
|
332
|
+
fi;
|
|
333
|
+
return GeneratorsOfInverseSemigroup(InverseSemigroup(coll,
|
|
334
|
+
rec(small := true)));
|
|
335
|
+
end);
|
|
336
|
+
|
|
337
|
+
InstallMethod(SmallInverseSemigroupGeneratingSet,
|
|
338
|
+
"for an inverse semigroup with inverse op",
|
|
339
|
+
[IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
|
|
340
|
+
S -> SmallSemigroupGeneratingSet(GeneratorsOfInverseSemigroup(S)));
|
|
341
|
+
|
|
342
|
+
InstallMethod(SmallInverseMonoidGeneratingSet,
|
|
343
|
+
"for generators of an inverse monoid",
|
|
344
|
+
[IsMultiplicativeElementWithOneCollection],
|
|
345
|
+
function(coll)
|
|
346
|
+
if not IsGeneratorsOfInverseSemigroup(coll) then
|
|
347
|
+
ErrorNoReturn("the argument (a mult. elt. coll.) do not satisfy ",
|
|
348
|
+
"IsGeneratorsOfInverseSemigroup");
|
|
349
|
+
fi;
|
|
350
|
+
# The empty list does not satisfy IsGeneratorsOfInverseSemigroup
|
|
351
|
+
Assert(1, not IsEmpty(coll));
|
|
352
|
+
if Length(coll) = 1 then
|
|
353
|
+
if coll[1] = One(coll) then
|
|
354
|
+
return [];
|
|
355
|
+
fi;
|
|
356
|
+
return coll;
|
|
357
|
+
fi;
|
|
358
|
+
return GeneratorsOfInverseMonoid(InverseMonoid(coll, rec(small := true)));
|
|
359
|
+
end);
|
|
360
|
+
|
|
361
|
+
InstallMethod(SmallInverseMonoidGeneratingSet,
|
|
362
|
+
"for an inverse monoid with inverse op",
|
|
363
|
+
[IsInverseMonoid and IsGeneratorsOfInverseSemigroup],
|
|
364
|
+
function(S)
|
|
365
|
+
if IsEmpty(GeneratorsOfInverseMonoid(S)) then
|
|
366
|
+
return GeneratorsOfInverseMonoid(S);
|
|
367
|
+
fi;
|
|
368
|
+
return SmallMonoidGeneratingSet(GeneratorsOfInverseMonoid(S));
|
|
369
|
+
end);
|
|
370
|
+
|
|
371
|
+
InstallMethod(SmallGeneratingSet, "for a semigroup",
|
|
372
|
+
[IsSemigroup],
|
|
373
|
+
function(S)
|
|
374
|
+
|
|
375
|
+
if HasGeneratorsOfSemigroupIdeal(S) then
|
|
376
|
+
return MinimalIdealGeneratingSet(S);
|
|
377
|
+
elif HasGeneratorsOfInverseMonoid(S) then
|
|
378
|
+
return SmallInverseMonoidGeneratingSet(S);
|
|
379
|
+
elif HasGeneratorsOfInverseSemigroup(S) then
|
|
380
|
+
return SmallInverseSemigroupGeneratingSet(S);
|
|
381
|
+
elif HasGeneratorsOfMonoid(S) then
|
|
382
|
+
return SmallMonoidGeneratingSet(S);
|
|
383
|
+
fi;
|
|
384
|
+
|
|
385
|
+
return SmallSemigroupGeneratingSet(S);
|
|
386
|
+
end);
|
|
387
|
+
|
|
388
|
+
InstallMethod(StructureDescription, "for a Brandt semigroup",
|
|
389
|
+
[IsBrandtSemigroup],
|
|
390
|
+
function(S)
|
|
391
|
+
local D;
|
|
392
|
+
D := MaximalDClasses(S)[1];
|
|
393
|
+
return Concatenation("B(", StructureDescription(GroupHClass(D)), ", ",
|
|
394
|
+
String(NrRClasses(D)), ")");
|
|
395
|
+
end);
|
|
396
|
+
|
|
397
|
+
# same method for ideals
|
|
398
|
+
|
|
399
|
+
InstallMethod(StructureDescription, "for a group as semigroup",
|
|
400
|
+
[IsGroupAsSemigroup],
|
|
401
|
+
function(S)
|
|
402
|
+
if IsGroup(S) then
|
|
403
|
+
TryNextMethod();
|
|
404
|
+
fi;
|
|
405
|
+
return StructureDescription(Range(IsomorphismPermGroup(S)));
|
|
406
|
+
end);
|
|
407
|
+
|
|
408
|
+
# same method for ideals
|
|
409
|
+
|
|
410
|
+
InstallMethod(MultiplicativeZero, "for a semigroup",
|
|
411
|
+
[IsSemigroup],
|
|
412
|
+
function(S)
|
|
413
|
+
local gens, D, rep;
|
|
414
|
+
|
|
415
|
+
if IsSemigroupIdeal(S)
|
|
416
|
+
and HasMultiplicativeZero(SupersemigroupOfIdeal(S)) then
|
|
417
|
+
return MultiplicativeZero(SupersemigroupOfIdeal(S));
|
|
418
|
+
elif HasMinimalDClass(S) then
|
|
419
|
+
D := MinimalDClass(S);
|
|
420
|
+
if HasSize(D) then
|
|
421
|
+
if IsTrivial(D) then
|
|
422
|
+
return Representative(D);
|
|
423
|
+
fi;
|
|
424
|
+
return fail;
|
|
425
|
+
fi;
|
|
426
|
+
elif IsSemigroupIdeal(S) then
|
|
427
|
+
return MultiplicativeZero(SupersemigroupOfIdeal(S));
|
|
428
|
+
elif not IsFinite(S) then
|
|
429
|
+
Info(InfoWarning,
|
|
430
|
+
1,
|
|
431
|
+
"may not be able to find the multiplicative zero, ",
|
|
432
|
+
"the semigroup is infinite");
|
|
433
|
+
# Cannot currently test this line, because the next method runs forever
|
|
434
|
+
TryNextMethod();
|
|
435
|
+
fi;
|
|
436
|
+
|
|
437
|
+
rep := RepresentativeOfMinimalIdeal(S);
|
|
438
|
+
gens := GeneratorsOfSemigroup(S);
|
|
439
|
+
|
|
440
|
+
if ForAll(gens, x -> x * rep = rep and rep * x = rep) then
|
|
441
|
+
return rep;
|
|
442
|
+
fi;
|
|
443
|
+
|
|
444
|
+
return fail;
|
|
445
|
+
end);
|
|
446
|
+
|
|
447
|
+
InstallMethod(MultiplicativeZero, "for a free semigroup",
|
|
448
|
+
[IsFreeSemigroup], ReturnFail);
|
|
449
|
+
|
|
450
|
+
InstallMethod(MultiplicativeZero, "for a free inverse semigroup",
|
|
451
|
+
[IsFreeInverseSemigroup], ReturnFail);
|
|
452
|
+
|
|
453
|
+
InstallMethod(LengthOfLongestDClassChain, "for a semigroup",
|
|
454
|
+
[IsSemigroup],
|
|
455
|
+
function(S)
|
|
456
|
+
local D, min;
|
|
457
|
+
|
|
458
|
+
if not IsFinite(S) then
|
|
459
|
+
TryNextMethod();
|
|
460
|
+
fi;
|
|
461
|
+
|
|
462
|
+
D := DigraphReverse(PartialOrderOfDClasses(S));
|
|
463
|
+
Assert(1, Length(DigraphSources(D)) = 1);
|
|
464
|
+
min := DigraphSources(D)[1]; # minimal D-class
|
|
465
|
+
SetMinimalDClass(S, GreensDClasses(S)[min]);
|
|
466
|
+
SetRepresentativeOfMinimalIdeal(S, Representative(
|
|
467
|
+
GreensDClasses(S)[min]));
|
|
468
|
+
|
|
469
|
+
return DigraphLongestDistanceFromVertex(D, min);
|
|
470
|
+
end);
|
|
471
|
+
|
|
472
|
+
InstallMethod(NilpotencyDegree, "for a finite semigroup",
|
|
473
|
+
[IsSemigroup and IsFinite],
|
|
474
|
+
function(S)
|
|
475
|
+
if not IsNilpotentSemigroup(S) then
|
|
476
|
+
return fail;
|
|
477
|
+
fi;
|
|
478
|
+
return LengthOfLongestDClassChain(S) + 1;
|
|
479
|
+
end);
|
|
480
|
+
|
|
481
|
+
InstallMethod(MinimalDClass, "for a semigroup", [IsSemigroup],
|
|
482
|
+
S -> GreensDClassOfElementNC(S, RepresentativeOfMinimalIdeal(S)));
|
|
483
|
+
|
|
484
|
+
#############################################################################
|
|
485
|
+
## 2. Methods for attributes where there are known better methods for acting
|
|
486
|
+
## semigroups.
|
|
487
|
+
#############################################################################
|
|
488
|
+
|
|
489
|
+
InstallMethod(IsGreensDGreaterThanFunc,
|
|
490
|
+
"for a semigroup with CanUseFroidurePin",
|
|
491
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
492
|
+
function(S)
|
|
493
|
+
local D, id;
|
|
494
|
+
|
|
495
|
+
if not IsFinite(S) then
|
|
496
|
+
TryNextMethod();
|
|
497
|
+
fi;
|
|
498
|
+
|
|
499
|
+
D := PartialOrderOfDClasses(S);
|
|
500
|
+
id := GreensDRelation(S)!.data.id;
|
|
501
|
+
|
|
502
|
+
return function(x, y)
|
|
503
|
+
local u, v;
|
|
504
|
+
if x = y then
|
|
505
|
+
return false;
|
|
506
|
+
fi;
|
|
507
|
+
u := id[PositionCanonical(S, x)];
|
|
508
|
+
v := id[PositionCanonical(S, y)];
|
|
509
|
+
return u <> v and IsReachable(D, u, v);
|
|
510
|
+
end;
|
|
511
|
+
end);
|
|
512
|
+
|
|
513
|
+
InstallMethod(MaximalDClasses,
|
|
514
|
+
"for a semigroup with CanUseFroidurePin",
|
|
515
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
516
|
+
function(S)
|
|
517
|
+
local D;
|
|
518
|
+
if NrDClasses(S) = 1 then
|
|
519
|
+
return DClasses(S);
|
|
520
|
+
fi;
|
|
521
|
+
D := PartialOrderOfDClasses(S);
|
|
522
|
+
return DClasses(S){DigraphSources(D)};
|
|
523
|
+
end);
|
|
524
|
+
|
|
525
|
+
InstallMethod(MaximalDClasses,
|
|
526
|
+
"for a finite monoid as semigroup with mult. neutral elt",
|
|
527
|
+
[IsFinite and IsMonoidAsSemigroup and HasMultiplicativeNeutralElement],
|
|
528
|
+
S -> [DClass(S, MultiplicativeNeutralElement(S))]);
|
|
529
|
+
|
|
530
|
+
InstallMethod(MaximalLClasses,
|
|
531
|
+
"for a semigroup that CanUseFroidurePin",
|
|
532
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
533
|
+
function(S)
|
|
534
|
+
|
|
535
|
+
if NrLClasses(S) = 1 then
|
|
536
|
+
return LClasses(S);
|
|
537
|
+
fi;
|
|
538
|
+
|
|
539
|
+
return LClasses(S){DigraphSources(PartialOrderOfLClasses(S))};
|
|
540
|
+
end);
|
|
541
|
+
|
|
542
|
+
InstallMethod(MaximalRClasses,
|
|
543
|
+
"for a semigroup that CanUseFroidurePin",
|
|
544
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
545
|
+
function(S)
|
|
546
|
+
|
|
547
|
+
if NrRClasses(S) = 1 then
|
|
548
|
+
return RClasses(S);
|
|
549
|
+
fi;
|
|
550
|
+
|
|
551
|
+
return RClasses(S){DigraphSources(PartialOrderOfRClasses(S))};
|
|
552
|
+
end);
|
|
553
|
+
|
|
554
|
+
# same method for ideals
|
|
555
|
+
|
|
556
|
+
InstallMethod(StructureDescriptionMaximalSubgroups,
|
|
557
|
+
"for a semigroup", [IsSemigroup],
|
|
558
|
+
function(S)
|
|
559
|
+
local out, D;
|
|
560
|
+
|
|
561
|
+
if not IsFinite(S) then
|
|
562
|
+
TryNextMethod();
|
|
563
|
+
fi;
|
|
564
|
+
|
|
565
|
+
out := [];
|
|
566
|
+
for D in RegularDClasses(S) do
|
|
567
|
+
AddSet(out, StructureDescription(GroupHClass(D)));
|
|
568
|
+
od;
|
|
569
|
+
|
|
570
|
+
return out;
|
|
571
|
+
end);
|
|
572
|
+
|
|
573
|
+
InstallMethod(IdempotentGeneratedSubsemigroup, "for a semigroup",
|
|
574
|
+
[IsSemigroup],
|
|
575
|
+
function(S)
|
|
576
|
+
local out;
|
|
577
|
+
if not IsFinite(S) then
|
|
578
|
+
TryNextMethod();
|
|
579
|
+
fi;
|
|
580
|
+
out := Semigroup(Idempotents(S), rec(small := true));
|
|
581
|
+
SetIsIdempotentGenerated(out, true);
|
|
582
|
+
if HasIsSemigroupWithCommutingIdempotents(S)
|
|
583
|
+
and IsSemigroupWithCommutingIdempotents(S) then
|
|
584
|
+
SetIsSemigroupWithCommutingIdempotents(out, true);
|
|
585
|
+
fi;
|
|
586
|
+
return out;
|
|
587
|
+
end);
|
|
588
|
+
|
|
589
|
+
InstallMethod(IdempotentGeneratedSubsemigroup,
|
|
590
|
+
"for a Rees matrix subsemigroup",
|
|
591
|
+
[IsReesMatrixSubsemigroup],
|
|
592
|
+
function(R)
|
|
593
|
+
local mat, I, J, nrrows, nrcols, min, max, gens, out, i;
|
|
594
|
+
|
|
595
|
+
if not IsFinite(R) or not IsReesMatrixSemigroup(R)
|
|
596
|
+
or not IsGroup(UnderlyingSemigroup(R)) then
|
|
597
|
+
TryNextMethod();
|
|
598
|
+
fi;
|
|
599
|
+
|
|
600
|
+
mat := Matrix(R);
|
|
601
|
+
I := Rows(R);
|
|
602
|
+
J := Columns(R);
|
|
603
|
+
nrrows := Length(I);
|
|
604
|
+
nrcols := Length(J);
|
|
605
|
+
|
|
606
|
+
min := Minimum(nrrows, nrcols);
|
|
607
|
+
max := Maximum(nrrows, nrcols);
|
|
608
|
+
gens := EmptyPlist(max);
|
|
609
|
+
for i in [1 .. min] do
|
|
610
|
+
Add(gens, RMSElement(R, I[i], mat[J[i]][I[i]] ^ -1, J[i]));
|
|
611
|
+
od;
|
|
612
|
+
for i in [min + 1 .. nrrows] do
|
|
613
|
+
Add(gens, RMSElement(R, I[i], mat[J[1]][I[i]] ^ -1, J[1]));
|
|
614
|
+
od;
|
|
615
|
+
for i in [min + 1 .. nrcols] do
|
|
616
|
+
Add(gens, RMSElement(R, I[1], mat[J[i]][I[1]] ^ -1, J[i]));
|
|
617
|
+
od;
|
|
618
|
+
out := Semigroup(gens);
|
|
619
|
+
SetIsRegularSemigroup(out, true);
|
|
620
|
+
SetIsIdempotentGenerated(out, true);
|
|
621
|
+
SetIsSimpleSemigroup(out, true);
|
|
622
|
+
return out;
|
|
623
|
+
end);
|
|
624
|
+
|
|
625
|
+
InstallMethod(IdempotentGeneratedSubsemigroup,
|
|
626
|
+
"for a Rees 0-matrix subsemigroup",
|
|
627
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
628
|
+
function(R)
|
|
629
|
+
local mat, gr, gens, I, J, nrrows, k, out, i, j;
|
|
630
|
+
|
|
631
|
+
if not IsFinite(R) or not IsReesZeroMatrixSemigroup(R)
|
|
632
|
+
or not IsGroup(UnderlyingSemigroup(R)) then
|
|
633
|
+
TryNextMethod();
|
|
634
|
+
fi;
|
|
635
|
+
|
|
636
|
+
mat := Matrix(R);
|
|
637
|
+
gr := RZMSDigraph(R);
|
|
638
|
+
gens := [];
|
|
639
|
+
|
|
640
|
+
if IsCompleteBipartiteDigraph(ReducedDigraph(gr)) or IsEmptyDigraph(gr) then
|
|
641
|
+
Add(gens, MultiplicativeZero(R));
|
|
642
|
+
fi;
|
|
643
|
+
|
|
644
|
+
gr := OutNeighbours(UndirectedSpanningForest(gr));
|
|
645
|
+
I := Rows(R);
|
|
646
|
+
J := Columns(R);
|
|
647
|
+
nrrows := Length(I);
|
|
648
|
+
|
|
649
|
+
for i in [1 .. nrrows] do
|
|
650
|
+
for j in gr[i] do
|
|
651
|
+
k := J[j - nrrows];
|
|
652
|
+
Add(gens, RMSElement(R, I[i], mat[k][I[i]] ^ -1, k));
|
|
653
|
+
od;
|
|
654
|
+
od;
|
|
655
|
+
|
|
656
|
+
out := Semigroup(gens);
|
|
657
|
+
SetIsRegularSemigroup(out, true);
|
|
658
|
+
SetIsIdempotentGenerated(out, true);
|
|
659
|
+
return out;
|
|
660
|
+
end);
|
|
661
|
+
|
|
662
|
+
InstallMethod(InjectionPrincipalFactor, "for a Green's D-class (Semigroups)",
|
|
663
|
+
[IsGreensDClass],
|
|
664
|
+
function(D)
|
|
665
|
+
if not IsRegularDClass(D) then
|
|
666
|
+
ErrorNoReturn("the argument (a Green's D-class) is not regular");
|
|
667
|
+
elif NrHClasses(D) = NrIdempotents(D) then
|
|
668
|
+
return SEMIGROUPS.InjectionPrincipalFactor(D, ReesMatrixSemigroup);
|
|
669
|
+
fi;
|
|
670
|
+
return SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
|
|
671
|
+
end);
|
|
672
|
+
|
|
673
|
+
InstallMethod(InjectionNormalizedPrincipalFactor,
|
|
674
|
+
"for a Green's D-class (Semigroups)",
|
|
675
|
+
[IsGreensDClass],
|
|
676
|
+
function(D)
|
|
677
|
+
local iso1, iso2, rms, inv1, inv2, iso, inv, hom;
|
|
678
|
+
|
|
679
|
+
if not IsRegularDClass(D) then
|
|
680
|
+
ErrorNoReturn("the argument (a Green's D-class) is not regular");
|
|
681
|
+
elif NrHClasses(D) = NrIdempotents(D) then
|
|
682
|
+
iso1 := SEMIGROUPS.InjectionPrincipalFactor(D, ReesMatrixSemigroup);
|
|
683
|
+
iso2 := RMSNormalization(Range(iso1));
|
|
684
|
+
else
|
|
685
|
+
iso1 := SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
|
|
686
|
+
iso2 := RZMSNormalization(Range(iso1));
|
|
687
|
+
fi;
|
|
688
|
+
|
|
689
|
+
rms := Range(iso2);
|
|
690
|
+
inv1 := InverseGeneralMapping(iso1);
|
|
691
|
+
inv2 := InverseGeneralMapping(iso2);
|
|
692
|
+
iso := x -> (x ^ iso1) ^ iso2;
|
|
693
|
+
inv := x -> (x ^ inv2) ^ inv1;
|
|
694
|
+
hom := MappingByFunction(D, rms, iso, inv);
|
|
695
|
+
SetIsInjective(hom, true);
|
|
696
|
+
SetIsTotal(hom, true);
|
|
697
|
+
return hom;
|
|
698
|
+
end);
|
|
699
|
+
|
|
700
|
+
InstallMethod(MultiplicativeNeutralElement,
|
|
701
|
+
"for a semigroup with CanUseFroidurePin + generators",
|
|
702
|
+
[IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup],
|
|
703
|
+
function(S)
|
|
704
|
+
local D, e;
|
|
705
|
+
|
|
706
|
+
if not IsFinite(S) then
|
|
707
|
+
TryNextMethod();
|
|
708
|
+
elif IsMultiplicativeElementWithOneCollection(S) and One(S) in S then
|
|
709
|
+
return One(S);
|
|
710
|
+
elif Length(MaximalDClasses(S)) > 1 then
|
|
711
|
+
return fail;
|
|
712
|
+
fi;
|
|
713
|
+
|
|
714
|
+
D := MaximalDClasses(S)[1];
|
|
715
|
+
|
|
716
|
+
if NrHClasses(D) <> 1 or not IsRegularDClass(D) then
|
|
717
|
+
return fail;
|
|
718
|
+
fi;
|
|
719
|
+
|
|
720
|
+
e := Idempotents(D)[1];
|
|
721
|
+
|
|
722
|
+
if ForAll(GeneratorsOfSemigroup(S), x -> e * x = x and x * e = x) then
|
|
723
|
+
return e;
|
|
724
|
+
fi;
|
|
725
|
+
return fail;
|
|
726
|
+
end);
|
|
727
|
+
|
|
728
|
+
# same method for inverse/ideals
|
|
729
|
+
|
|
730
|
+
InstallMethod(RepresentativeOfMinimalIdeal, "for a semigroup",
|
|
731
|
+
[IsSemigroup],
|
|
732
|
+
function(S)
|
|
733
|
+
|
|
734
|
+
if HasMultiplicativeZero(S) and MultiplicativeZero(S) <> fail then
|
|
735
|
+
return MultiplicativeZero(S);
|
|
736
|
+
elif HasIsSimpleSemigroup(S) and IsSimpleSemigroup(S) then
|
|
737
|
+
# This catches known trivial semigroups
|
|
738
|
+
return Representative(S);
|
|
739
|
+
elif IsSemigroupIdeal(S) and
|
|
740
|
+
(HasRepresentativeOfMinimalIdeal(SupersemigroupOfIdeal(S))
|
|
741
|
+
or not HasGeneratorsOfSemigroup(S)) then
|
|
742
|
+
return RepresentativeOfMinimalIdeal(SupersemigroupOfIdeal(S));
|
|
743
|
+
elif not IsFinite(S) then
|
|
744
|
+
TryNextMethod();
|
|
745
|
+
fi;
|
|
746
|
+
|
|
747
|
+
return RepresentativeOfMinimalIdealNC(S);
|
|
748
|
+
end);
|
|
749
|
+
|
|
750
|
+
InstallMethod(RepresentativeOfMinimalIdealNC, "for a finite semigroup",
|
|
751
|
+
[IsSemigroup and IsFinite],
|
|
752
|
+
function(S)
|
|
753
|
+
local D, pos;
|
|
754
|
+
D := PartialOrderOfDClasses(S);
|
|
755
|
+
pos := DigraphSinks(D)[1];
|
|
756
|
+
Assert(1, Length(DigraphSinks(D)) = 1);
|
|
757
|
+
return Representative(DClasses(S)[pos]);
|
|
758
|
+
end);
|
|
759
|
+
|
|
760
|
+
InstallMethod(InversesOfSemigroupElementNC,
|
|
761
|
+
"for a group as semigroup and a multiplicative element",
|
|
762
|
+
[IsGroupAsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
|
|
763
|
+
function(G, x)
|
|
764
|
+
local i, iso, inv;
|
|
765
|
+
if IsMultiplicativeElementWithInverse(x) then
|
|
766
|
+
i := InverseOp(x);
|
|
767
|
+
if i <> fail then
|
|
768
|
+
return [i];
|
|
769
|
+
fi;
|
|
770
|
+
fi;
|
|
771
|
+
iso := IsomorphismPermGroup(G);
|
|
772
|
+
inv := InverseGeneralMapping(iso);
|
|
773
|
+
return [((x ^ iso) ^ -1) ^ inv];
|
|
774
|
+
end);
|
|
775
|
+
|
|
776
|
+
InstallMethod(InversesOfSemigroupElementNC,
|
|
777
|
+
"for a semigroup that can use froidure-pin and a multiplicative element",
|
|
778
|
+
[CanUseFroidurePin, IsMultiplicativeElement],
|
|
779
|
+
function(S, a)
|
|
780
|
+
local R, L, inverses, e, f, s;
|
|
781
|
+
R := RClass(S, a);
|
|
782
|
+
L := LClass(S, a);
|
|
783
|
+
inverses := EmptyPlist(NrIdempotents(R) * NrIdempotents(L));
|
|
784
|
+
|
|
785
|
+
for e in Idempotents(R) do
|
|
786
|
+
s := RightGreensMultiplierNC(S, a, e) * e;
|
|
787
|
+
for f in Idempotents(L) do
|
|
788
|
+
Add(inverses, f * s);
|
|
789
|
+
od;
|
|
790
|
+
od;
|
|
791
|
+
return inverses;
|
|
792
|
+
end);
|
|
793
|
+
|
|
794
|
+
InstallMethod(InversesOfSemigroupElement,
|
|
795
|
+
"for a semigroup that can use froidure-pin and a multiplicative element",
|
|
796
|
+
[CanUseFroidurePin, IsMultiplicativeElement], # to beat the library method
|
|
797
|
+
function(S, x)
|
|
798
|
+
if not IsFinite(S) then
|
|
799
|
+
TryNextMethod();
|
|
800
|
+
elif not x in S then
|
|
801
|
+
ErrorNoReturn("the 2nd argument (a mult. element) must belong to the 1st ",
|
|
802
|
+
"argument (a semigroup)");
|
|
803
|
+
fi;
|
|
804
|
+
return InversesOfSemigroupElementNC(S, x);
|
|
805
|
+
end);
|
|
806
|
+
|
|
807
|
+
InstallMethod(OneInverseOfSemigroupElementNC,
|
|
808
|
+
"for a semigroup and a multiplicative element",
|
|
809
|
+
[IsSemigroup, IsMultiplicativeElement],
|
|
810
|
+
function(S, x)
|
|
811
|
+
if not IsFinite(S) then
|
|
812
|
+
TryNextMethod();
|
|
813
|
+
fi;
|
|
814
|
+
return First(EnumeratorSorted(S),
|
|
815
|
+
y -> x * y * x = x and y * x * y = y);
|
|
816
|
+
end);
|
|
817
|
+
|
|
818
|
+
InstallMethod(OneInverseOfSemigroupElementNC,
|
|
819
|
+
"for CanUseFroidurePin and a multiplicative element",
|
|
820
|
+
[CanUseFroidurePin, IsMultiplicativeElement],
|
|
821
|
+
function(S, a)
|
|
822
|
+
local R, L, e, f, s;
|
|
823
|
+
R := RClass(S, a);
|
|
824
|
+
L := LClass(S, a);
|
|
825
|
+
e := Idempotents(R);
|
|
826
|
+
if IsEmpty(e) then
|
|
827
|
+
return fail;
|
|
828
|
+
fi;
|
|
829
|
+
e := e[1];
|
|
830
|
+
f := Idempotents(L);
|
|
831
|
+
if IsEmpty(f) then
|
|
832
|
+
return fail;
|
|
833
|
+
fi;
|
|
834
|
+
f := f[1];
|
|
835
|
+
s := RightGreensMultiplierNC(S, a, e);
|
|
836
|
+
return f * s * e;
|
|
837
|
+
end);
|
|
838
|
+
|
|
839
|
+
InstallMethod(OneInverseOfSemigroupElement,
|
|
840
|
+
"for a semigroup and a multiplicative element",
|
|
841
|
+
[IsSemigroup, IsMultiplicativeElement],
|
|
842
|
+
function(S, x)
|
|
843
|
+
if not IsFinite(S) then
|
|
844
|
+
ErrorNoReturn("the semigroup is not finite");
|
|
845
|
+
elif not x in S then
|
|
846
|
+
ErrorNoReturn("the 2nd argument (a mult. element) must belong to the 1st ",
|
|
847
|
+
"argument (a semigroup)");
|
|
848
|
+
fi;
|
|
849
|
+
return OneInverseOfSemigroupElementNC(S, x);
|
|
850
|
+
end);
|
|
851
|
+
|
|
852
|
+
InstallMethod(UnderlyingSemigroupOfSemigroupWithAdjoinedZero,
|
|
853
|
+
"for a semigroup",
|
|
854
|
+
[IsSemigroup],
|
|
855
|
+
function(S)
|
|
856
|
+
local zero, gens, T;
|
|
857
|
+
|
|
858
|
+
if HasIsSemigroupWithAdjoinedZero(S)
|
|
859
|
+
and not IsSemigroupWithAdjoinedZero(S) then
|
|
860
|
+
return fail;
|
|
861
|
+
fi;
|
|
862
|
+
|
|
863
|
+
zero := MultiplicativeZero(S);
|
|
864
|
+
if zero = fail then
|
|
865
|
+
return fail;
|
|
866
|
+
fi;
|
|
867
|
+
|
|
868
|
+
gens := GeneratorsOfSemigroup(S);
|
|
869
|
+
if Length(gens) = 1 then
|
|
870
|
+
return fail;
|
|
871
|
+
elif not zero in gens then
|
|
872
|
+
return fail;
|
|
873
|
+
fi;
|
|
874
|
+
|
|
875
|
+
T := Semigroup(Difference(gens, [zero]));
|
|
876
|
+
|
|
877
|
+
if zero in T then
|
|
878
|
+
return fail;
|
|
879
|
+
fi;
|
|
880
|
+
return T;
|
|
881
|
+
end);
|
|
882
|
+
|
|
883
|
+
BindGlobal("_SemigroupSizeByIndexPeriod",
|
|
884
|
+
function(S)
|
|
885
|
+
local gen, ind;
|
|
886
|
+
gen := MinimalSemigroupGeneratingSet(S)[1];
|
|
887
|
+
ind := IndexPeriodOfSemigroupElement(gen);
|
|
888
|
+
if ind[1] = 1 then
|
|
889
|
+
SetIsGroupAsSemigroup(S, true);
|
|
890
|
+
fi;
|
|
891
|
+
return Sum(ind) - 1;
|
|
892
|
+
end);
|
|
893
|
+
|
|
894
|
+
InstallMethod(Size,
|
|
895
|
+
"for a monogenic transformation semigroup with minimal generating set",
|
|
896
|
+
[IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
|
|
897
|
+
IsTransformationSemigroup],
|
|
898
|
+
10, # to beat IsActingSemigroup
|
|
899
|
+
_SemigroupSizeByIndexPeriod);
|
|
900
|
+
|
|
901
|
+
InstallMethod(Size,
|
|
902
|
+
"for a monogenic partial perm semigroup with minimal generating set",
|
|
903
|
+
[IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
|
|
904
|
+
IsPartialPermSemigroup],
|
|
905
|
+
10, # to beat IsActingSemigroup
|
|
906
|
+
_SemigroupSizeByIndexPeriod);
|
|
907
|
+
|
|
908
|
+
InstallMethod(Size,
|
|
909
|
+
"for a monogenic bipartition semigroup with minimal generating set",
|
|
910
|
+
[IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
|
|
911
|
+
IsBipartitionSemigroup],
|
|
912
|
+
10, # to beat IsActingSemigroup
|
|
913
|
+
_SemigroupSizeByIndexPeriod);
|
|
914
|
+
|
|
915
|
+
InstallMethod(Size,
|
|
916
|
+
"for a monogenic semigroup of matrices over finite field with minimal gen set",
|
|
917
|
+
[IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
|
|
918
|
+
IsMatrixOverFiniteFieldSemigroup],
|
|
919
|
+
_SemigroupSizeByIndexPeriod);
|
|
920
|
+
|
|
921
|
+
MakeReadWriteGlobal("_SemigroupSizeByIndexPeriod");
|
|
922
|
+
Unbind(_SemigroupSizeByIndexPeriod);
|
|
923
|
+
|
|
924
|
+
InstallMethod(IndecomposableElements, "for a semigroup", [IsSemigroup],
|
|
925
|
+
function(S)
|
|
926
|
+
local out, D;
|
|
927
|
+
|
|
928
|
+
if HasIsSurjectiveSemigroup(S) and IsSurjectiveSemigroup(S) then
|
|
929
|
+
return [];
|
|
930
|
+
fi;
|
|
931
|
+
out := [];
|
|
932
|
+
for D in MaximalDClasses(S) do
|
|
933
|
+
if not IsRegularDClass(D) then
|
|
934
|
+
AddSet(out, Representative(D));
|
|
935
|
+
fi;
|
|
936
|
+
od;
|
|
937
|
+
return out;
|
|
938
|
+
end);
|
|
939
|
+
|
|
940
|
+
InstallMethod(MinimalSemigroupGeneratingSet, "for a free semigroup",
|
|
941
|
+
[IsFreeSemigroup], GeneratorsOfSemigroup);
|
|
942
|
+
|
|
943
|
+
InstallMethod(MinimalSemigroupGeneratingSet, "for a semigroup",
|
|
944
|
+
[IsSemigroup],
|
|
945
|
+
function(S)
|
|
946
|
+
local gens, indecomp, id, T, zero, iso, inv, G, x, D, non_unit_gens, classes,
|
|
947
|
+
po, nbs;
|
|
948
|
+
|
|
949
|
+
if IsTrivial(S) then
|
|
950
|
+
return [Representative(S)];
|
|
951
|
+
elif IsGroupAsSemigroup(S) then
|
|
952
|
+
iso := IsomorphismPermGroup(S);
|
|
953
|
+
inv := InverseGeneralMapping(iso);
|
|
954
|
+
G := Range(iso);
|
|
955
|
+
return Images(inv, MinimalGeneratingSet(G));
|
|
956
|
+
elif IsMonogenicSemigroup(S) then
|
|
957
|
+
return [Representative(MaximalDClasses(S)[1])];
|
|
958
|
+
fi;
|
|
959
|
+
|
|
960
|
+
gens := IrredundantGeneratingSubset(S);
|
|
961
|
+
|
|
962
|
+
# A semigroup that has a 2-generating set but is not monogenic has rank 2.
|
|
963
|
+
if Length(gens) = 2 then
|
|
964
|
+
return gens;
|
|
965
|
+
fi;
|
|
966
|
+
|
|
967
|
+
# A generating set for a semigroup that has either a one/zero adjoined is
|
|
968
|
+
# minimal if and only if it contains that one/zero, and is minimal for the
|
|
969
|
+
# semigroup without the one/zero.
|
|
970
|
+
if IsMonoidAsSemigroup(S) and IsTrivial(GroupOfUnits(S)) then
|
|
971
|
+
id := MultiplicativeNeutralElement(S);
|
|
972
|
+
T := Semigroup(Filtered(gens, x -> x <> id));
|
|
973
|
+
return Concatenation([id], MinimalSemigroupGeneratingSet(T));
|
|
974
|
+
elif IsSemigroupWithAdjoinedZero(S) then
|
|
975
|
+
zero := MultiplicativeZero(S);
|
|
976
|
+
T := Semigroup(Filtered(gens, x -> x <> zero));
|
|
977
|
+
return Concatenation([zero], MinimalSemigroupGeneratingSet(T));
|
|
978
|
+
fi;
|
|
979
|
+
|
|
980
|
+
# The indecomposable elements are contains in any generating set. If the
|
|
981
|
+
# indecomposable elements (or if not, the indecomposable elements plus a
|
|
982
|
+
# single element) generate the semigroup, then you have a minimal generating
|
|
983
|
+
# set.
|
|
984
|
+
indecomp := IndecomposableElements(S);
|
|
985
|
+
if Length(gens) = Length(indecomp) then
|
|
986
|
+
return indecomp;
|
|
987
|
+
elif not IsEmpty(indecomp) then
|
|
988
|
+
x := Difference(gens, Semigroup(indecomp));
|
|
989
|
+
if Length(x) = 1 then
|
|
990
|
+
return Concatenation(x, indecomp);
|
|
991
|
+
fi;
|
|
992
|
+
fi;
|
|
993
|
+
|
|
994
|
+
# A generating set for a monoid that consists of a minimal generating set for
|
|
995
|
+
# the group of units and exactly one generator in each D-class immediately
|
|
996
|
+
# below the group of units is minimal.
|
|
997
|
+
if IsMonoidAsSemigroup(S) then
|
|
998
|
+
D := DClass(S, MultiplicativeNeutralElement(S));
|
|
999
|
+
non_unit_gens := Filtered(gens, x -> not x in D);
|
|
1000
|
+
classes := List(non_unit_gens, x -> Position(DClasses(S), DClass(S, x)));
|
|
1001
|
+
if IsDuplicateFreeList(classes) then
|
|
1002
|
+
po := PartialOrderOfDClasses(S);
|
|
1003
|
+
po := DigraphReflexiveTransitiveReduction(po);
|
|
1004
|
+
nbs := OutNeighboursOfVertex(po, Position(DClasses(S), D));
|
|
1005
|
+
if ForAll(classes, x -> x in nbs) then
|
|
1006
|
+
iso := IsomorphismPermGroup(GroupOfUnits(S));
|
|
1007
|
+
inv := InverseGeneralMapping(iso);
|
|
1008
|
+
G := Range(iso);
|
|
1009
|
+
return Concatenation(Images(inv, MinimalGeneratingSet(G)),
|
|
1010
|
+
non_unit_gens);
|
|
1011
|
+
fi;
|
|
1012
|
+
fi;
|
|
1013
|
+
fi;
|
|
1014
|
+
|
|
1015
|
+
# An irredundant generating set of a finite semigroup that contains at most
|
|
1016
|
+
# one generator per D-class is minimal.
|
|
1017
|
+
if IsFinite(S) and (IsDTrivial(S) or
|
|
1018
|
+
Length(Set(gens, x -> DClass(S, x))) = Length(gens)) then
|
|
1019
|
+
return gens;
|
|
1020
|
+
fi;
|
|
1021
|
+
|
|
1022
|
+
ErrorNoReturn("no further methods for computing minimal generating sets ",
|
|
1023
|
+
"are implemented");
|
|
1024
|
+
end);
|
|
1025
|
+
|
|
1026
|
+
InstallMethod(MinimalMonoidGeneratingSet, "for a free monoid",
|
|
1027
|
+
[IsFreeMonoid], GeneratorsOfMonoid);
|
|
1028
|
+
|
|
1029
|
+
InstallMethod(MinimalMonoidGeneratingSet, "for a monoid",
|
|
1030
|
+
[IsMonoid],
|
|
1031
|
+
function(S)
|
|
1032
|
+
local one, gens, new;
|
|
1033
|
+
|
|
1034
|
+
one := One(S);
|
|
1035
|
+
if IsTrivial(S) then
|
|
1036
|
+
return [one];
|
|
1037
|
+
fi;
|
|
1038
|
+
|
|
1039
|
+
gens := MinimalSemigroupGeneratingSet(S);
|
|
1040
|
+
if not IsTrivial(GroupOfUnits(S)) then
|
|
1041
|
+
return gens;
|
|
1042
|
+
fi;
|
|
1043
|
+
new := Difference(gens, [one]);
|
|
1044
|
+
if One(new) = one then
|
|
1045
|
+
# The One of the non-identity generators is the One, so One is not needed.
|
|
1046
|
+
return new;
|
|
1047
|
+
fi;
|
|
1048
|
+
|
|
1049
|
+
# This currently applies to only partial perm monoids: sometimes, the One
|
|
1050
|
+
# of the non-One generators is not the One of the monoid. Therefore the One
|
|
1051
|
+
# has to be included in the GeneratorsOfMonoid. WARNING: therefore
|
|
1052
|
+
# MinimalMonoidGeneratingSet may include the One even though, mathematically,
|
|
1053
|
+
# it shouldn't be needed. For example, see symmetric inverse monoid on 1 pt.
|
|
1054
|
+
return gens;
|
|
1055
|
+
end);
|
|
1056
|
+
|
|
1057
|
+
InstallMethod(NambooripadPartialOrder, "for a semigroup",
|
|
1058
|
+
[IsSemigroup],
|
|
1059
|
+
function(S)
|
|
1060
|
+
local elts, p, func, out, i, j;
|
|
1061
|
+
|
|
1062
|
+
if not IsFinite(S) then
|
|
1063
|
+
ErrorNoReturn("the argument (a semigroup) is not finite");
|
|
1064
|
+
elif not IsRegularSemigroup(S) then
|
|
1065
|
+
ErrorNoReturn("the argument (a semigroup) is not regular");
|
|
1066
|
+
elif IsInverseSemigroup(S) then
|
|
1067
|
+
return NaturalPartialOrder(S);
|
|
1068
|
+
fi;
|
|
1069
|
+
|
|
1070
|
+
Info(InfoWarning, 2, "NambooripadPartialOrder: this method ",
|
|
1071
|
+
"fully enumerates its argument!");
|
|
1072
|
+
|
|
1073
|
+
elts := ShallowCopy(Elements(S));
|
|
1074
|
+
p := Sortex(elts, {x, y} -> IsGreensDGreaterThanFunc(S)(y, x)) ^ -1;
|
|
1075
|
+
func := NambooripadLeqRegularSemigroup(S);
|
|
1076
|
+
out := List([1 .. Size(S)], x -> []);
|
|
1077
|
+
|
|
1078
|
+
for i in [1 .. Size(S)] do
|
|
1079
|
+
for j in [i + 1 .. Size(S)] do
|
|
1080
|
+
if func(elts[i], elts[j]) then
|
|
1081
|
+
AddSet(out[j ^ p], i ^ p);
|
|
1082
|
+
fi;
|
|
1083
|
+
od;
|
|
1084
|
+
od;
|
|
1085
|
+
return out;
|
|
1086
|
+
end);
|
|
1087
|
+
|
|
1088
|
+
InstallMethod(NambooripadLeqRegularSemigroup, "for a semigroup",
|
|
1089
|
+
[IsSemigroup],
|
|
1090
|
+
function(S)
|
|
1091
|
+
if not IsFinite(S) then
|
|
1092
|
+
ErrorNoReturn("the argument (a semigroup) is not finite");
|
|
1093
|
+
elif not IsRegularSemigroup(S) then
|
|
1094
|
+
ErrorNoReturn("the argument (a semigroup) is not regular");
|
|
1095
|
+
elif IsInverseSemigroup(S) then
|
|
1096
|
+
return NaturalLeqInverseSemigroup(S);
|
|
1097
|
+
fi;
|
|
1098
|
+
|
|
1099
|
+
return
|
|
1100
|
+
function(x, y)
|
|
1101
|
+
local E;
|
|
1102
|
+
E := Idempotents(S);
|
|
1103
|
+
return ForAny(E, e -> e * y = x)
|
|
1104
|
+
and ForAny(E, f -> y * f = x);
|
|
1105
|
+
end;
|
|
1106
|
+
end);
|
|
1107
|
+
|
|
1108
|
+
InstallMethod(LeftIdentity,
|
|
1109
|
+
"for semigroup with CanUseFroidurePin and mult. elt.",
|
|
1110
|
+
[IsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
|
|
1111
|
+
function(S, x)
|
|
1112
|
+
local i, p, result;
|
|
1113
|
+
if not x in S then
|
|
1114
|
+
Error("the 2nd argument (a mult. elt.) does not belong to the 1st ",
|
|
1115
|
+
"argument (a semigroup)");
|
|
1116
|
+
elif IsMonoid(S) then
|
|
1117
|
+
return One(S);
|
|
1118
|
+
elif IsMonoidAsSemigroup(S) then
|
|
1119
|
+
return MultiplicativeNeutralElement(S);
|
|
1120
|
+
elif IsIdempotent(x) then
|
|
1121
|
+
return x;
|
|
1122
|
+
fi;
|
|
1123
|
+
|
|
1124
|
+
i := PositionCanonical(S, x);
|
|
1125
|
+
p := DigraphPath(LeftCayleyDigraph(S), i, i);
|
|
1126
|
+
if p = fail then
|
|
1127
|
+
return fail;
|
|
1128
|
+
fi;
|
|
1129
|
+
result := EvaluateWord(GeneratorsOfSemigroup(S), Reversed(p[2]));
|
|
1130
|
+
return result ^ SmallestIdempotentPower(result);
|
|
1131
|
+
end);
|
|
1132
|
+
|
|
1133
|
+
InstallMethod(RightIdentity,
|
|
1134
|
+
"for semgroup with CanUseFroidurePin and mult. elt.",
|
|
1135
|
+
[IsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
|
|
1136
|
+
function(S, x)
|
|
1137
|
+
local i, p, result;
|
|
1138
|
+
if not x in S then
|
|
1139
|
+
Error("the 2nd argument (a mult. elt.) does not belong to the 1st ",
|
|
1140
|
+
"argument (a semigroup)");
|
|
1141
|
+
elif IsMonoid(S) then
|
|
1142
|
+
return One(S);
|
|
1143
|
+
elif IsMonoidAsSemigroup(S) then
|
|
1144
|
+
return MultiplicativeNeutralElement(S);
|
|
1145
|
+
elif IsIdempotent(x) then
|
|
1146
|
+
return x;
|
|
1147
|
+
fi;
|
|
1148
|
+
|
|
1149
|
+
i := PositionCanonical(S, x);
|
|
1150
|
+
p := DigraphPath(RightCayleyDigraph(S), i, i);
|
|
1151
|
+
if p = fail then
|
|
1152
|
+
return fail;
|
|
1153
|
+
fi;
|
|
1154
|
+
result := EvaluateWord(GeneratorsOfSemigroup(S), p[2]);
|
|
1155
|
+
return result ^ SmallestIdempotentPower(result);
|
|
1156
|
+
end);
|
|
1157
|
+
|
|
1158
|
+
InstallMethod(MultiplicationTableWithCanonicalPositions,
|
|
1159
|
+
"for a semigroup with CanUseFroidurePin",
|
|
1160
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
1161
|
+
function(S)
|
|
1162
|
+
local n, sortedlist, t, tinv, M;
|
|
1163
|
+
n := Size(S);
|
|
1164
|
+
sortedlist := AsSortedList(S);
|
|
1165
|
+
|
|
1166
|
+
t := PermList(List([1 .. n], i -> PositionCanonical(S, sortedlist[i])));
|
|
1167
|
+
tinv := t ^ -1;
|
|
1168
|
+
M := MultiplicationTable(S);
|
|
1169
|
+
|
|
1170
|
+
return List([1 .. n], i -> List([1 .. n], j -> M[i ^ tinv][j ^ tinv] ^ t));
|
|
1171
|
+
end);
|
|
1172
|
+
|
|
1173
|
+
InstallMethod(TransposedMultiplicationTableWithCanonicalPositions,
|
|
1174
|
+
"for a semigroup with CanUseFroidurePin",
|
|
1175
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
1176
|
+
S -> TransposedMat(MultiplicationTableWithCanonicalPositions(S)));
|
|
1177
|
+
|
|
1178
|
+
InstallMethod(MinimalFaithfulTransformationDegree, "for a right zero semigroup",
|
|
1179
|
+
[IsRightZeroSemigroup],
|
|
1180
|
+
function(S)
|
|
1181
|
+
local max, deg;
|
|
1182
|
+
|
|
1183
|
+
max := 0;
|
|
1184
|
+
deg := 0;
|
|
1185
|
+
while max < Size(S) do
|
|
1186
|
+
deg := deg + 1;
|
|
1187
|
+
if (deg mod 3) = 0 then
|
|
1188
|
+
max := 3 ^ (deg / 3);
|
|
1189
|
+
elif (deg mod 3) = 1 then
|
|
1190
|
+
max := 4 * 3 ^ ((deg - 4) / 3);
|
|
1191
|
+
else
|
|
1192
|
+
max := 2 * 3 ^ ((deg - 2) / 3);
|
|
1193
|
+
fi;
|
|
1194
|
+
od;
|
|
1195
|
+
return deg;
|
|
1196
|
+
end);
|
|
1197
|
+
|
|
1198
|
+
InstallMethod(MinimalFaithfulTransformationDegree, "for a left zero semigroup",
|
|
1199
|
+
[IsLeftZeroSemigroup],
|
|
1200
|
+
function(S)
|
|
1201
|
+
local max, deg, N, r;
|
|
1202
|
+
max := 0;
|
|
1203
|
+
deg := 0;
|
|
1204
|
+
while max < Size(S) do
|
|
1205
|
+
deg := deg + 1;
|
|
1206
|
+
for r in [1 .. deg - 1] do
|
|
1207
|
+
N := r ^ (deg - r);
|
|
1208
|
+
if N > max then
|
|
1209
|
+
max := N;
|
|
1210
|
+
fi;
|
|
1211
|
+
od;
|
|
1212
|
+
od;
|
|
1213
|
+
return deg;
|
|
1214
|
+
end);
|