passagemath-gap-pkg-semigroups 10.6.30__cp312-abi3-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.abi3.so +0 -0
|
@@ -0,0 +1,1658 @@
|
|
|
1
|
+
###############################################################################
|
|
2
|
+
##
|
|
3
|
+
## attributes/properties.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 determining properties of arbitrary
|
|
12
|
+
# semigroups. There are not very many specialised methods for acting semigroups
|
|
13
|
+
# and so we only have a single file.
|
|
14
|
+
|
|
15
|
+
# Ecom (commuting idempotents), LI (locally trivial),
|
|
16
|
+
# LG (locally group), B1 (dot-depth one), DA (regular D-classes are idempotent)
|
|
17
|
+
# R v L (???), IsNilpotentSemigroup, inverses, local submonoid, right ideal,
|
|
18
|
+
# left ideal, kernel!?
|
|
19
|
+
|
|
20
|
+
# IsLeftCancellative,
|
|
21
|
+
# IsRightCancellative, IsRightGroup, IsLeftGroup, IsUnitarySemigroup,
|
|
22
|
+
# IsRightUnitarySemigp, IsLeftUnitarySemigp, IsCongruenceFree,
|
|
23
|
+
# PrimitiveIdempotents, IdempotentOrder,
|
|
24
|
+
# IsLeftNormalBand, IsRightNormalBand, IsNormalBand, IsEUnitarySemigroup
|
|
25
|
+
# IsRectangularGroup, IsBandOfGroups, IsFreeBand, IsFreeSemilattice,
|
|
26
|
+
# IsFreeNormalBand, , IsFundamentalInverseSemigp,
|
|
27
|
+
# IsFullSubsemigroup (of an inverse semigroup), IsFactorizableInverseMonoid,
|
|
28
|
+
# IsFInverseSemigroup, IsSemigroupWithCentralIdempotents, IsLeftUnipotent,
|
|
29
|
+
# IsRightUnipotent, IsSemigroupWithClosedIdempotents, .
|
|
30
|
+
|
|
31
|
+
# same method for ideals, works for finite and infinite
|
|
32
|
+
|
|
33
|
+
InstallMethod(IsBand, "for a semigroup",
|
|
34
|
+
[IsSemigroup],
|
|
35
|
+
function(S)
|
|
36
|
+
if HasParent(S) and HasIsBand(Parent(S)) and IsBand(Parent(S)) then
|
|
37
|
+
return true;
|
|
38
|
+
fi;
|
|
39
|
+
return IsCompletelyRegularSemigroup(S) and IsHTrivial(S);
|
|
40
|
+
end);
|
|
41
|
+
|
|
42
|
+
# same method for ideals, works for finite and infinite
|
|
43
|
+
|
|
44
|
+
InstallMethod(IsBand, "for an inverse semigroup", [IsInverseSemigroup],
|
|
45
|
+
IsSemilattice);
|
|
46
|
+
|
|
47
|
+
# same method for ideals
|
|
48
|
+
|
|
49
|
+
InstallMethod(IsBlockGroup, "for a semigroup",
|
|
50
|
+
[IsSemigroup],
|
|
51
|
+
function(S)
|
|
52
|
+
local D;
|
|
53
|
+
|
|
54
|
+
if HasParent(S) and HasIsBlockGroup(Parent(S))
|
|
55
|
+
and IsBlockGroup(Parent(S)) then
|
|
56
|
+
return true;
|
|
57
|
+
elif (HasIsRegularSemigroup(S) and IsRegularSemigroup(S))
|
|
58
|
+
and (HasIsInverseSemigroup(S) and not IsInverseSemigroup(S)) then
|
|
59
|
+
Info(InfoSemigroups, 2, "regular but non-inverse semigroup");
|
|
60
|
+
return false;
|
|
61
|
+
elif not IsFinite(S) then
|
|
62
|
+
TryNextMethod();
|
|
63
|
+
fi;
|
|
64
|
+
|
|
65
|
+
for D in DClasses(S) do
|
|
66
|
+
if IsRegularDClass(D)
|
|
67
|
+
and (ForAny(RClasses(D), x -> NrIdempotents(x) > 1)
|
|
68
|
+
or NrRClasses(D) <> NrLClasses(D)) then
|
|
69
|
+
return false;
|
|
70
|
+
fi;
|
|
71
|
+
od;
|
|
72
|
+
return true;
|
|
73
|
+
end);
|
|
74
|
+
|
|
75
|
+
InstallMethod(IsSemigroupWithCommutingIdempotents, "for a semigroup",
|
|
76
|
+
[IsSemigroup],
|
|
77
|
+
function(S)
|
|
78
|
+
local ids, n, i, j;
|
|
79
|
+
ids := Idempotents(S);
|
|
80
|
+
n := Length(ids);
|
|
81
|
+
for i in [1 .. n - 1] do
|
|
82
|
+
for j in [i + 1 .. n] do
|
|
83
|
+
if ids[i] * ids[j] <> ids[j] * ids[i] then
|
|
84
|
+
return false;
|
|
85
|
+
fi;
|
|
86
|
+
od;
|
|
87
|
+
od;
|
|
88
|
+
return true;
|
|
89
|
+
end);
|
|
90
|
+
|
|
91
|
+
InstallMethod(IsSemigroupWithCommutingIdempotents,
|
|
92
|
+
"for a semigroup with idempotent generated subsemigroup",
|
|
93
|
+
[IsSemigroup and HasIdempotentGeneratedSubsemigroup],
|
|
94
|
+
S -> IsCommutativeSemigroup(IdempotentGeneratedSubsemigroup(S)));
|
|
95
|
+
|
|
96
|
+
# same method for ideals
|
|
97
|
+
|
|
98
|
+
InstallMethod(IsBrandtSemigroup, "for a semigroup",
|
|
99
|
+
[IsSemigroup],
|
|
100
|
+
function(S)
|
|
101
|
+
if not IsFinite(S) then
|
|
102
|
+
return false;
|
|
103
|
+
fi;
|
|
104
|
+
return IsZeroSimpleSemigroup(S) and IsInverseSemigroup(S);
|
|
105
|
+
end);
|
|
106
|
+
|
|
107
|
+
# same method for ideals
|
|
108
|
+
|
|
109
|
+
InstallMethod(IsCongruenceFreeSemigroup, "for a semigroup",
|
|
110
|
+
[IsSemigroup],
|
|
111
|
+
function(S)
|
|
112
|
+
local rowsDiff, T, P;
|
|
113
|
+
|
|
114
|
+
if not IsFinite(S) then
|
|
115
|
+
TryNextMethod();
|
|
116
|
+
fi;
|
|
117
|
+
|
|
118
|
+
rowsDiff := function(p)
|
|
119
|
+
local i, j;
|
|
120
|
+
for i in [1 .. Size(p) - 1] do
|
|
121
|
+
for j in [i + 1 .. Size(p)] do
|
|
122
|
+
if p[i] = p[j] then
|
|
123
|
+
return false;
|
|
124
|
+
fi;
|
|
125
|
+
od;
|
|
126
|
+
od;
|
|
127
|
+
return true;
|
|
128
|
+
end;
|
|
129
|
+
|
|
130
|
+
if Size(S) <= 2 then
|
|
131
|
+
return true;
|
|
132
|
+
elif MultiplicativeZero(S) <> fail then
|
|
133
|
+
# CASE 1: S has zero
|
|
134
|
+
if IsZeroSimpleSemigroup(S) then
|
|
135
|
+
# Find an isomorphic RZMS
|
|
136
|
+
T := Range(IsomorphismReesZeroMatrixSemigroup(S));
|
|
137
|
+
if IsTrivial(UnderlyingSemigroup(T)) then
|
|
138
|
+
# Check that no two rows or columns are identical
|
|
139
|
+
P := Matrix(T);
|
|
140
|
+
if rowsDiff(P) and rowsDiff(TransposedMat(P)) then
|
|
141
|
+
return true;
|
|
142
|
+
fi;
|
|
143
|
+
fi;
|
|
144
|
+
fi;
|
|
145
|
+
return false;
|
|
146
|
+
fi;
|
|
147
|
+
|
|
148
|
+
# CASE 2: S has no zero
|
|
149
|
+
return (IsGroup(S) and IsSimpleGroup(S))
|
|
150
|
+
or (IsGroupAsSemigroup(S)
|
|
151
|
+
and IsSimpleGroup(Range(IsomorphismPermGroup(S))));
|
|
152
|
+
end);
|
|
153
|
+
|
|
154
|
+
# same method for regular ideals, or non-regular without a generating set
|
|
155
|
+
|
|
156
|
+
InstallMethod(IsCliffordSemigroup, "for a semigroup",
|
|
157
|
+
[IsSemigroup],
|
|
158
|
+
function(S)
|
|
159
|
+
if HasParent(S) and HasIsCliffordSemigroup(Parent(S))
|
|
160
|
+
and IsCliffordSemigroup(Parent(S)) then
|
|
161
|
+
return true;
|
|
162
|
+
elif not IsFinite(S) then
|
|
163
|
+
TryNextMethod();
|
|
164
|
+
fi;
|
|
165
|
+
|
|
166
|
+
return IsRegularSemigroup(S) and NrHClasses(S) = NrDClasses(S);
|
|
167
|
+
end);
|
|
168
|
+
|
|
169
|
+
# same method for non-regular ideals
|
|
170
|
+
|
|
171
|
+
InstallMethod(IsCliffordSemigroup,
|
|
172
|
+
"for a semigroup with generators",
|
|
173
|
+
[IsSemigroup and HasGeneratorsOfSemigroup],
|
|
174
|
+
function(S)
|
|
175
|
+
local gens, idem, f, g;
|
|
176
|
+
|
|
177
|
+
if HasParent(S) and HasIsCliffordSemigroup(Parent(S))
|
|
178
|
+
and IsCliffordSemigroup(Parent(S)) then
|
|
179
|
+
return true;
|
|
180
|
+
elif HasIsInverseSemigroup(S) and not IsInverseSemigroup(S) then
|
|
181
|
+
Info(InfoSemigroups, 2, "the semigroup is not inverse");
|
|
182
|
+
return false;
|
|
183
|
+
elif HasIsCompletelyRegularSemigroup(S)
|
|
184
|
+
and not IsCompletelyRegularSemigroup(S) then
|
|
185
|
+
Info(InfoSemigroups, 2, "the semigroup is not completely regular");
|
|
186
|
+
return false;
|
|
187
|
+
elif not IsFinite(S) then
|
|
188
|
+
TryNextMethod();
|
|
189
|
+
elif IsGroupAsSemigroup(S) then
|
|
190
|
+
Info(InfoSemigroups, 2, "the semigroup is a group");
|
|
191
|
+
return true;
|
|
192
|
+
elif not IsRegularSemigroup(S) then
|
|
193
|
+
Info(InfoSemigroups, 2, "the semigroup is not regular");
|
|
194
|
+
return false;
|
|
195
|
+
fi;
|
|
196
|
+
|
|
197
|
+
gens := GeneratorsOfSemigroup(S);
|
|
198
|
+
idem := List(gens, x -> One(GreensHClassOfElementNC(S, x)));
|
|
199
|
+
|
|
200
|
+
for f in gens do
|
|
201
|
+
for g in idem do
|
|
202
|
+
if not f * g = g * f then
|
|
203
|
+
Info(InfoSemigroups, 2, "the idempotents are not central:");
|
|
204
|
+
Info(InfoSemigroups, 2, " ", f, "\n#I and\n#I ", g,
|
|
205
|
+
"\n#I do not commute,");
|
|
206
|
+
return false;
|
|
207
|
+
fi;
|
|
208
|
+
od;
|
|
209
|
+
od;
|
|
210
|
+
|
|
211
|
+
return true;
|
|
212
|
+
end);
|
|
213
|
+
|
|
214
|
+
# same method for inverse ideals
|
|
215
|
+
|
|
216
|
+
InstallMethod(IsCliffordSemigroup, "for an inverse acting semigroup",
|
|
217
|
+
[IsInverseSemigroup and IsActingSemigroup],
|
|
218
|
+
S -> ForAll(OrbSCC(LambdaOrb(S)), x -> Length(x) = 1));
|
|
219
|
+
|
|
220
|
+
InstallMethod(IsCliffordSemigroup,
|
|
221
|
+
"for an partial perm semigroup with generators",
|
|
222
|
+
[IsPartialPermSemigroup and HasGeneratorsOfSemigroup], 100,
|
|
223
|
+
function(S)
|
|
224
|
+
local x, y;
|
|
225
|
+
|
|
226
|
+
for x in GeneratorsOfSemigroup(S) do
|
|
227
|
+
for y in GeneratorsOfSemigroup(S) do
|
|
228
|
+
if Intersection(DomainOfPartialPerm(x), DomainOfPartialPerm(y)) <>
|
|
229
|
+
DomainOfPartialPerm(x * y) then
|
|
230
|
+
return false;
|
|
231
|
+
fi;
|
|
232
|
+
od;
|
|
233
|
+
od;
|
|
234
|
+
return true;
|
|
235
|
+
end);
|
|
236
|
+
|
|
237
|
+
# different method for ideals
|
|
238
|
+
|
|
239
|
+
InstallMethod(IsCommutativeSemigroup, "for a semigroup with generators",
|
|
240
|
+
[IsSemigroup and HasGeneratorsOfSemigroup],
|
|
241
|
+
function(S)
|
|
242
|
+
local gens, n, i, j;
|
|
243
|
+
|
|
244
|
+
if not IsFinite(S) then
|
|
245
|
+
TryNextMethod();
|
|
246
|
+
fi;
|
|
247
|
+
|
|
248
|
+
gens := GeneratorsOfSemigroup(S);
|
|
249
|
+
n := Length(gens);
|
|
250
|
+
|
|
251
|
+
for i in [1 .. n - 1] do
|
|
252
|
+
for j in [i + 1 .. n] do
|
|
253
|
+
if not gens[i] * gens[j] = gens[j] * gens[i] then
|
|
254
|
+
Info(InfoSemigroups, 2, "generators ", i, " and ", j,
|
|
255
|
+
" do not commute");
|
|
256
|
+
return false;
|
|
257
|
+
fi;
|
|
258
|
+
od;
|
|
259
|
+
od;
|
|
260
|
+
|
|
261
|
+
return true;
|
|
262
|
+
end);
|
|
263
|
+
|
|
264
|
+
# same method for non-regular ideals with generators
|
|
265
|
+
|
|
266
|
+
InstallMethod(IsCompletelyRegularSemigroup,
|
|
267
|
+
"for an acting semigroup with generators",
|
|
268
|
+
[IsActingSemigroup and HasGeneratorsOfSemigroup],
|
|
269
|
+
function(S)
|
|
270
|
+
local record, gens, f, o, pos;
|
|
271
|
+
|
|
272
|
+
if HasParent(S) and HasIsCompletelyRegularSemigroup(Parent(S))
|
|
273
|
+
and IsCompletelyRegularSemigroup(Parent(S)) then
|
|
274
|
+
return true;
|
|
275
|
+
elif HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
276
|
+
Info(InfoSemigroups, 2, "semigroup is not regular");
|
|
277
|
+
return false;
|
|
278
|
+
fi;
|
|
279
|
+
|
|
280
|
+
record := ShallowCopy(LambdaOrbOpts(S));
|
|
281
|
+
record.treehashsize := SEMIGROUPS.OptionsRec(S).hashlen;
|
|
282
|
+
gens := List(GeneratorsOfSemigroup(S), x -> ConvertToInternalElement(S, x));
|
|
283
|
+
|
|
284
|
+
for f in GeneratorsOfSemigroup(S) do
|
|
285
|
+
f := ConvertToInternalElement(S, f);
|
|
286
|
+
o := Orb(gens, LambdaFunc(S)(f), LambdaAct(S), record);
|
|
287
|
+
pos := LookForInOrb(o,
|
|
288
|
+
{o, x} -> LambdaRank(S)(LambdaAct(S)(x, f))
|
|
289
|
+
<> LambdaRank(S)(x),
|
|
290
|
+
1);
|
|
291
|
+
# for transformations we could use IsInjectiveListTrans instead
|
|
292
|
+
# and the performance would be better!
|
|
293
|
+
|
|
294
|
+
if pos <> false then
|
|
295
|
+
Info(InfoSemigroups, 2, "at least one H-class is not a subgroup");
|
|
296
|
+
return false;
|
|
297
|
+
fi;
|
|
298
|
+
od;
|
|
299
|
+
|
|
300
|
+
return true;
|
|
301
|
+
end);
|
|
302
|
+
|
|
303
|
+
# same method for regular ideals, or non-regular without a generating set
|
|
304
|
+
|
|
305
|
+
InstallMethod(IsCompletelyRegularSemigroup, "for a semigroup",
|
|
306
|
+
[IsSemigroup],
|
|
307
|
+
function(S)
|
|
308
|
+
if HasParent(S) and HasIsCompletelyRegularSemigroup(Parent(S))
|
|
309
|
+
and IsCompletelyRegularSemigroup(Parent(S)) then
|
|
310
|
+
return true;
|
|
311
|
+
elif HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
312
|
+
Info(InfoSemigroups, 2, "semigroup is not regular");
|
|
313
|
+
return false;
|
|
314
|
+
elif not IsFinite(S) then
|
|
315
|
+
TryNextMethod();
|
|
316
|
+
fi;
|
|
317
|
+
|
|
318
|
+
return NrHClasses(S) = NrIdempotents(S);
|
|
319
|
+
end);
|
|
320
|
+
|
|
321
|
+
# same method for inverse ideals
|
|
322
|
+
|
|
323
|
+
InstallMethod(IsCompletelyRegularSemigroup, "for an inverse semigroup",
|
|
324
|
+
[IsInverseSemigroup], IsCliffordSemigroup);
|
|
325
|
+
|
|
326
|
+
# Notes: this test required to avoid conflict with Smallsemi,
|
|
327
|
+
# DeclareSynonymAttr causes problems.
|
|
328
|
+
|
|
329
|
+
# same method for ideals
|
|
330
|
+
|
|
331
|
+
InstallMethod(IsCompletelySimpleSemigroup, "for a semigroup",
|
|
332
|
+
[IsSemigroup],
|
|
333
|
+
function(S)
|
|
334
|
+
if not IsFinite(S) then
|
|
335
|
+
TryNextMethod();
|
|
336
|
+
fi;
|
|
337
|
+
return IsSimpleSemigroup(S);
|
|
338
|
+
end);
|
|
339
|
+
|
|
340
|
+
# same method for ideals
|
|
341
|
+
|
|
342
|
+
InstallMethod(IsEUnitaryInverseSemigroup,
|
|
343
|
+
"for an inverse semigroup with inverse op",
|
|
344
|
+
[IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
|
|
345
|
+
function(S)
|
|
346
|
+
if not IsFinite(S) then
|
|
347
|
+
TryNextMethod();
|
|
348
|
+
fi;
|
|
349
|
+
return IsMajorantlyClosed(S, IdempotentGeneratedSubsemigroup(S));
|
|
350
|
+
end);
|
|
351
|
+
|
|
352
|
+
InstallMethod(IsEUnitaryInverseSemigroup, "for a semigroup",
|
|
353
|
+
[IsSemigroup],
|
|
354
|
+
function(S)
|
|
355
|
+
if not IsFinite(S) then
|
|
356
|
+
TryNextMethod();
|
|
357
|
+
elif not IsInverseSemigroup(S) then
|
|
358
|
+
return false;
|
|
359
|
+
fi;
|
|
360
|
+
return IsEUnitaryInverseSemigroup(AsSemigroup(IsPartialPermSemigroup, S));
|
|
361
|
+
end);
|
|
362
|
+
|
|
363
|
+
# different method for ideals TODO(later) or same?
|
|
364
|
+
|
|
365
|
+
InstallMethod(IsFactorisableInverseMonoid,
|
|
366
|
+
"for an inverse semigroup with generators",
|
|
367
|
+
[IsInverseSemigroup and HasGeneratorsOfSemigroup],
|
|
368
|
+
function(S)
|
|
369
|
+
local G, iso, enum, func, x;
|
|
370
|
+
|
|
371
|
+
if not IsFinite(S) then
|
|
372
|
+
TryNextMethod();
|
|
373
|
+
fi;
|
|
374
|
+
|
|
375
|
+
G := GroupOfUnits(S);
|
|
376
|
+
|
|
377
|
+
if G = fail then
|
|
378
|
+
return false;
|
|
379
|
+
elif IsTrivial(G) then
|
|
380
|
+
return IsSemilattice(S);
|
|
381
|
+
fi;
|
|
382
|
+
|
|
383
|
+
iso := InverseGeneralMapping(IsomorphismPermGroup(G));
|
|
384
|
+
enum := Enumerator(Source(iso));
|
|
385
|
+
func := NaturalLeqInverseSemigroup(S);
|
|
386
|
+
|
|
387
|
+
for x in Generators(S) do
|
|
388
|
+
if not x in G then
|
|
389
|
+
if not ForAny(enum, y -> func(x, y ^ iso)) then
|
|
390
|
+
return false;
|
|
391
|
+
fi;
|
|
392
|
+
fi;
|
|
393
|
+
od;
|
|
394
|
+
return true;
|
|
395
|
+
end);
|
|
396
|
+
|
|
397
|
+
InstallMethod(IsHTrivial, "for a trans. semigroup with known generators",
|
|
398
|
+
[IsTransformationSemigroup and HasGeneratorsOfSemigroup],
|
|
399
|
+
function(S)
|
|
400
|
+
local x;
|
|
401
|
+
for x in GeneratorsOfSemigroup(S) do
|
|
402
|
+
if IndexPeriodOfTransformation(x)[2] <> 1 then
|
|
403
|
+
return false;
|
|
404
|
+
fi;
|
|
405
|
+
od;
|
|
406
|
+
TryNextMethod();
|
|
407
|
+
end);
|
|
408
|
+
|
|
409
|
+
InstallMethod(IsHTrivial, "for a p. perm. semigroup with known generators",
|
|
410
|
+
[IsPartialPermSemigroup and HasGeneratorsOfSemigroup],
|
|
411
|
+
function(S)
|
|
412
|
+
local x;
|
|
413
|
+
for x in GeneratorsOfSemigroup(S) do
|
|
414
|
+
if IndexPeriodOfPartialPerm(x)[2] <> 1 then
|
|
415
|
+
return false;
|
|
416
|
+
fi;
|
|
417
|
+
od;
|
|
418
|
+
TryNextMethod();
|
|
419
|
+
end);
|
|
420
|
+
|
|
421
|
+
# same method for ideals
|
|
422
|
+
|
|
423
|
+
InstallMethod(IsHTrivial, "for an acting semigroup",
|
|
424
|
+
[IsActingSemigroup],
|
|
425
|
+
function(S)
|
|
426
|
+
local D;
|
|
427
|
+
|
|
428
|
+
if HasParent(S) and HasIsHTrivial(Parent(S)) and IsHTrivial(Parent(S)) then
|
|
429
|
+
return true;
|
|
430
|
+
fi;
|
|
431
|
+
|
|
432
|
+
for D in IteratorOfDClasses(S) do
|
|
433
|
+
if not IsTrivial(SchutzenbergerGroup(D)) then
|
|
434
|
+
return false;
|
|
435
|
+
fi;
|
|
436
|
+
od;
|
|
437
|
+
return true;
|
|
438
|
+
end);
|
|
439
|
+
|
|
440
|
+
InstallMethod(IsHTrivial, "for a semigroup", [IsSemigroup],
|
|
441
|
+
function(S)
|
|
442
|
+
if HasParent(S) and HasIsHTrivial(Parent(S)) and IsHTrivial(Parent(S)) then
|
|
443
|
+
return true;
|
|
444
|
+
elif not IsFinite(S) then
|
|
445
|
+
TryNextMethod();
|
|
446
|
+
fi;
|
|
447
|
+
# TODO(later) use IndexPeriodOfSemigroupElement as above
|
|
448
|
+
return NrHClasses(S) = Size(S);
|
|
449
|
+
end);
|
|
450
|
+
|
|
451
|
+
# same method for non-inverse ideals
|
|
452
|
+
|
|
453
|
+
InstallMethod(IsLTrivial, "for an acting semigroup",
|
|
454
|
+
[IsActingSemigroup],
|
|
455
|
+
function(S)
|
|
456
|
+
local D;
|
|
457
|
+
|
|
458
|
+
if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
|
|
459
|
+
return true;
|
|
460
|
+
fi;
|
|
461
|
+
|
|
462
|
+
for D in IteratorOfDClasses(S) do
|
|
463
|
+
if not IsTrivial(SchutzenbergerGroup(D)) or Length(RhoOrbSCC(D)) <> 1 then
|
|
464
|
+
return false;
|
|
465
|
+
fi;
|
|
466
|
+
od;
|
|
467
|
+
|
|
468
|
+
return true;
|
|
469
|
+
end);
|
|
470
|
+
|
|
471
|
+
# same method for inverse ideals
|
|
472
|
+
|
|
473
|
+
InstallMethod(IsLTrivial, "for an inverse acting semigroup",
|
|
474
|
+
[IsInverseActingSemigroupRep],
|
|
475
|
+
function(S)
|
|
476
|
+
if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
|
|
477
|
+
return true;
|
|
478
|
+
fi;
|
|
479
|
+
return ForAll(OrbSCC(LambdaOrb(S)), x -> Length(x) = 1);
|
|
480
|
+
end);
|
|
481
|
+
|
|
482
|
+
# same method for ideals
|
|
483
|
+
|
|
484
|
+
InstallMethod(IsLTrivial, "for a semigroup",
|
|
485
|
+
[IsSemigroup],
|
|
486
|
+
function(S)
|
|
487
|
+
if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
|
|
488
|
+
return true;
|
|
489
|
+
elif not IsFinite(S) then
|
|
490
|
+
TryNextMethod();
|
|
491
|
+
fi;
|
|
492
|
+
|
|
493
|
+
return NrLClasses(S) = Size(S);
|
|
494
|
+
end);
|
|
495
|
+
|
|
496
|
+
# same method for ideals
|
|
497
|
+
|
|
498
|
+
InstallMethod(IsRTrivial, "for an inverse semigroup",
|
|
499
|
+
[IsInverseSemigroup], IsLTrivial);
|
|
500
|
+
|
|
501
|
+
# different method for ideals
|
|
502
|
+
|
|
503
|
+
InstallMethod(IsRTrivial, "for a transformation semigroup with generators",
|
|
504
|
+
[IsTransformationSemigroup and HasGeneratorsOfSemigroup],
|
|
505
|
+
2, # to beat the method for acting semigroups
|
|
506
|
+
S -> IsAcyclicDigraph(DigraphRemoveLoops(DigraphOfActionOnPoints(S))));
|
|
507
|
+
|
|
508
|
+
# different method for ideals
|
|
509
|
+
|
|
510
|
+
InstallMethod(IsRTrivial, "for a partial perm semigroup with generators",
|
|
511
|
+
[IsPartialPermSemigroup and HasGeneratorsOfSemigroup],
|
|
512
|
+
function(S)
|
|
513
|
+
if ForAny(GeneratorsOfSemigroup(S),
|
|
514
|
+
x -> ForAny(CyclesOfPartialPerm(x), y -> Length(y) > 1)) then
|
|
515
|
+
return false;
|
|
516
|
+
fi;
|
|
517
|
+
return ForAll(CyclesOfPartialPermSemigroup(S), x -> Length(x) = 1);
|
|
518
|
+
end);
|
|
519
|
+
|
|
520
|
+
# same method for non-inverse ideals
|
|
521
|
+
|
|
522
|
+
InstallMethod(IsRTrivial, "for an acting semigroup",
|
|
523
|
+
[IsActingSemigroup],
|
|
524
|
+
function(S)
|
|
525
|
+
local x;
|
|
526
|
+
|
|
527
|
+
if HasParent(S) and HasIsRTrivial(Parent(S)) and IsRTrivial(Parent(S)) then
|
|
528
|
+
return true;
|
|
529
|
+
elif IsClosedData(SemigroupData(S)) and IsClosedOrbit(RhoOrb(S)) then
|
|
530
|
+
for x in GreensDClasses(S) do
|
|
531
|
+
if (not IsTrivial(SchutzenbergerGroup(x)))
|
|
532
|
+
or Length(LambdaOrbSCC(x)) > 1 then
|
|
533
|
+
return false;
|
|
534
|
+
fi;
|
|
535
|
+
od;
|
|
536
|
+
return true;
|
|
537
|
+
fi;
|
|
538
|
+
|
|
539
|
+
for x in IteratorOfRClasses(S) do
|
|
540
|
+
if (not IsTrivial(SchutzenbergerGroup(x)))
|
|
541
|
+
or Length(LambdaOrbSCC(x)) > 1 then
|
|
542
|
+
return false;
|
|
543
|
+
fi;
|
|
544
|
+
od;
|
|
545
|
+
|
|
546
|
+
return true;
|
|
547
|
+
end);
|
|
548
|
+
|
|
549
|
+
InstallMethod(IsRTrivial, "for a semigroup", [IsSemigroup],
|
|
550
|
+
function(S)
|
|
551
|
+
if HasParent(S) and HasIsRTrivial(Parent(S)) and IsRTrivial(Parent(S)) then
|
|
552
|
+
return true;
|
|
553
|
+
elif not IsFinite(S) then
|
|
554
|
+
TryNextMethod();
|
|
555
|
+
fi;
|
|
556
|
+
|
|
557
|
+
return Size(S) = NrRClasses(S);
|
|
558
|
+
end);
|
|
559
|
+
|
|
560
|
+
InstallMethod(IsGroupAsSemigroup, "for a semigroup",
|
|
561
|
+
[IsSemigroup],
|
|
562
|
+
function(S)
|
|
563
|
+
if HasParent(S) and HasIsGroupAsSemigroup(Parent(S))
|
|
564
|
+
and IsGroupAsSemigroup(Parent(S)) then
|
|
565
|
+
return true;
|
|
566
|
+
elif not IsFinite(S) then
|
|
567
|
+
TryNextMethod();
|
|
568
|
+
fi;
|
|
569
|
+
return NrRClasses(S) = 1 and NrLClasses(S) = 1;
|
|
570
|
+
end);
|
|
571
|
+
|
|
572
|
+
# same method for non-regular ideals
|
|
573
|
+
|
|
574
|
+
InstallMethod(IsGroupAsSemigroup, "for an acting semigroup",
|
|
575
|
+
[IsActingSemigroup],
|
|
576
|
+
function(S)
|
|
577
|
+
local gens, lambdafunc, lambda, rhofunc, rho, tester, lambda_f, rho_f, f;
|
|
578
|
+
|
|
579
|
+
if HasParent(S) and HasIsGroupAsSemigroup(Parent(S))
|
|
580
|
+
and IsGroupAsSemigroup(Parent(S)) then
|
|
581
|
+
return true;
|
|
582
|
+
fi;
|
|
583
|
+
|
|
584
|
+
gens := GeneratorsOfSemigroup(S); # not GeneratorsOfMonoid!
|
|
585
|
+
|
|
586
|
+
if IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
587
|
+
and ForAll(gens, x -> ActionRank(S)(x) = ActionDegree(x)) then
|
|
588
|
+
return true;
|
|
589
|
+
fi;
|
|
590
|
+
|
|
591
|
+
lambdafunc := LambdaFunc(S);
|
|
592
|
+
lambda := lambdafunc(gens[1]);
|
|
593
|
+
rhofunc := RhoFunc(S);
|
|
594
|
+
rho := rhofunc(gens[1]);
|
|
595
|
+
tester := IdempotentTester(S);
|
|
596
|
+
|
|
597
|
+
for f in gens do
|
|
598
|
+
lambda_f := lambdafunc(f);
|
|
599
|
+
rho_f := rhofunc(f);
|
|
600
|
+
if lambda_f <> lambda or rho_f <> rho or not tester(lambda_f, rho_f) then
|
|
601
|
+
return false;
|
|
602
|
+
fi;
|
|
603
|
+
od;
|
|
604
|
+
|
|
605
|
+
return true;
|
|
606
|
+
end);
|
|
607
|
+
|
|
608
|
+
# same method for ideals
|
|
609
|
+
|
|
610
|
+
InstallMethod(IsIdempotentGenerated, "for a semigroup",
|
|
611
|
+
[IsSemigroup],
|
|
612
|
+
function(S)
|
|
613
|
+
local gens, T, ranks, min, new, max, i;
|
|
614
|
+
|
|
615
|
+
if not IsFinite(S) then
|
|
616
|
+
TryNextMethod();
|
|
617
|
+
elif HasIsMonoidAsSemigroup(S) and IsMonoidAsSemigroup(S)
|
|
618
|
+
and not IsTrivial(GroupOfUnits(S)) then
|
|
619
|
+
return false;
|
|
620
|
+
fi;
|
|
621
|
+
|
|
622
|
+
gens := GeneratorsOfSemigroup(S);
|
|
623
|
+
|
|
624
|
+
if ForAll(gens, IsIdempotent) then
|
|
625
|
+
Info(InfoSemigroups, 2, "all the generators are idempotents");
|
|
626
|
+
return true;
|
|
627
|
+
elif HasIdempotentGeneratedSubsemigroup(S) or not IsActingSemigroup(S) then
|
|
628
|
+
T := IdempotentGeneratedSubsemigroup(S);
|
|
629
|
+
else
|
|
630
|
+
ranks := List(gens, x -> ActionRank(S)(x));
|
|
631
|
+
min := MinimumList(ranks);
|
|
632
|
+
if HasIdempotents(S) then
|
|
633
|
+
new := Filtered(Idempotents(S), x -> ActionRank(S)(x) >= min);
|
|
634
|
+
else
|
|
635
|
+
max := MaximumList(ranks);
|
|
636
|
+
new := [];
|
|
637
|
+
for i in [min .. max] do
|
|
638
|
+
Append(new, Idempotents(S, i));
|
|
639
|
+
od;
|
|
640
|
+
fi;
|
|
641
|
+
if IsEmpty(new) then
|
|
642
|
+
return false;
|
|
643
|
+
fi;
|
|
644
|
+
T := Semigroup(new, rec(acting := true));
|
|
645
|
+
fi;
|
|
646
|
+
|
|
647
|
+
# T is not always the idempotent generated subsemigroup!
|
|
648
|
+
return ForAll(gens, x -> x in T);
|
|
649
|
+
end);
|
|
650
|
+
|
|
651
|
+
# same method for inverse ideals
|
|
652
|
+
|
|
653
|
+
InstallMethod(IsIdempotentGenerated, "for an inverse semigroup",
|
|
654
|
+
[IsInverseSemigroup], IsSemilattice);
|
|
655
|
+
|
|
656
|
+
# same method for ideals
|
|
657
|
+
|
|
658
|
+
InstallMethod(IsInverseSemigroup, "for a semigroup",
|
|
659
|
+
[IsSemigroup],
|
|
660
|
+
1, # to beat sgpviz
|
|
661
|
+
function(S)
|
|
662
|
+
local lambda, rho, x;
|
|
663
|
+
|
|
664
|
+
if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
665
|
+
Info(InfoSemigroups, 2, "the semigroup is not regular");
|
|
666
|
+
return false;
|
|
667
|
+
elif not IsFinite(S) then
|
|
668
|
+
TryNextMethod();
|
|
669
|
+
elif HasGeneratorsOfSemigroup(S) and
|
|
670
|
+
IsGeneratorsOfInverseSemigroup(GeneratorsOfSemigroup(S)) and
|
|
671
|
+
ForAll(GeneratorsOfSemigroup(S), x -> x ^ -1 in S) then
|
|
672
|
+
return true;
|
|
673
|
+
elif IsCompletelyRegularSemigroup(S) then
|
|
674
|
+
Info(InfoSemigroups, 2, "the semigroup is completely regular");
|
|
675
|
+
return IsCliffordSemigroup(S);
|
|
676
|
+
elif IsActingSemigroup(S) then
|
|
677
|
+
lambda := LambdaOrb(S);
|
|
678
|
+
Enumerate(lambda);
|
|
679
|
+
rho := RhoOrb(S);
|
|
680
|
+
Enumerate(rho, Length(lambda) + 1);
|
|
681
|
+
if not (IsClosedOrbit(rho) and Length(rho) = Length(lambda)) then
|
|
682
|
+
Info(InfoSemigroups, 2,
|
|
683
|
+
"the numbers of lambda and rho values are not equal");
|
|
684
|
+
return false;
|
|
685
|
+
fi;
|
|
686
|
+
fi;
|
|
687
|
+
|
|
688
|
+
if HasGreensDClasses(S) then
|
|
689
|
+
for x in GreensDClasses(S) do
|
|
690
|
+
if not IsRegularGreensClass(x)
|
|
691
|
+
or NrRClasses(x) <> NrLClasses(x)
|
|
692
|
+
or NrIdempotents(x) <> NrRClasses(x) then
|
|
693
|
+
return false;
|
|
694
|
+
fi;
|
|
695
|
+
od;
|
|
696
|
+
return true;
|
|
697
|
+
fi;
|
|
698
|
+
|
|
699
|
+
return NrLClasses(S) = NrRClasses(S)
|
|
700
|
+
and IsRegularSemigroup(S)
|
|
701
|
+
and NrIdempotents(S) = NrRClasses(S);
|
|
702
|
+
end);
|
|
703
|
+
|
|
704
|
+
# same method for ideals
|
|
705
|
+
|
|
706
|
+
InstallMethod(IsLeftSimple, "for a semigroup", [IsSemigroup],
|
|
707
|
+
function(S)
|
|
708
|
+
if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
709
|
+
return false;
|
|
710
|
+
elif not IsFinite(S) then
|
|
711
|
+
TryNextMethod();
|
|
712
|
+
fi;
|
|
713
|
+
return NrLClasses(S) = 1;
|
|
714
|
+
end);
|
|
715
|
+
|
|
716
|
+
# same method for ideals
|
|
717
|
+
|
|
718
|
+
InstallMethod(IsLeftSimple, "for an inverse semigroup",
|
|
719
|
+
[IsInverseSemigroup], IsGroupAsSemigroup);
|
|
720
|
+
|
|
721
|
+
# different method for ideals without generators
|
|
722
|
+
|
|
723
|
+
InstallMethod(IsLeftZeroSemigroup,
|
|
724
|
+
"for an acting semigroup with generators",
|
|
725
|
+
[IsActingSemigroup and HasGeneratorsOfSemigroup],
|
|
726
|
+
function(S)
|
|
727
|
+
local gens, lambda, val, x;
|
|
728
|
+
|
|
729
|
+
if HasParent(S) and HasIsLeftZeroSemigroup(Parent(S))
|
|
730
|
+
and IsLeftZeroSemigroup(Parent(S)) then
|
|
731
|
+
return true;
|
|
732
|
+
fi;
|
|
733
|
+
|
|
734
|
+
gens := GeneratorsOfSemigroup(S);
|
|
735
|
+
lambda := LambdaFunc(S);
|
|
736
|
+
val := lambda(gens[1]);
|
|
737
|
+
|
|
738
|
+
for x in gens do
|
|
739
|
+
if lambda(x) <> val then
|
|
740
|
+
return false;
|
|
741
|
+
fi;
|
|
742
|
+
od;
|
|
743
|
+
|
|
744
|
+
return ForAll(gens, IsIdempotent);
|
|
745
|
+
end);
|
|
746
|
+
|
|
747
|
+
# works for finite and infinite
|
|
748
|
+
|
|
749
|
+
InstallMethod(IsLeftZeroSemigroup, "for a semigroup", [IsSemigroup],
|
|
750
|
+
function(S)
|
|
751
|
+
if HasParent(S) and HasIsLeftZeroSemigroup(Parent(S))
|
|
752
|
+
and IsLeftZeroSemigroup(Parent(S)) then
|
|
753
|
+
return true;
|
|
754
|
+
elif not IsFinite(S) then
|
|
755
|
+
TryNextMethod();
|
|
756
|
+
fi;
|
|
757
|
+
return IsLeftSimple(S) and IsRTrivial(S);
|
|
758
|
+
end);
|
|
759
|
+
|
|
760
|
+
# same method for ideals
|
|
761
|
+
|
|
762
|
+
InstallMethod(IsLeftZeroSemigroup, "for an inverse semigroup",
|
|
763
|
+
[IsInverseSemigroup], IsTrivial);
|
|
764
|
+
|
|
765
|
+
# not applicable for ideals
|
|
766
|
+
|
|
767
|
+
InstallImmediateMethod(IsMonogenicSemigroup,
|
|
768
|
+
IsSemigroup and IsFinite and HasGeneratorsOfSemigroup,
|
|
769
|
+
0,
|
|
770
|
+
function(S)
|
|
771
|
+
local gens;
|
|
772
|
+
|
|
773
|
+
gens := GeneratorsOfSemigroup(S);
|
|
774
|
+
if Length(gens) <= 1 then
|
|
775
|
+
SetMinimalSemigroupGeneratingSet(S, gens);
|
|
776
|
+
return Length(gens) = 1;
|
|
777
|
+
elif CanEasilyCompareElements(gens)
|
|
778
|
+
and ForAll([2 .. Length(gens)], i -> gens[1] = gens[i]) then
|
|
779
|
+
SetMinimalSemigroupGeneratingSet(S, [gens[1]]);
|
|
780
|
+
return true;
|
|
781
|
+
fi;
|
|
782
|
+
TryNextMethod();
|
|
783
|
+
end);
|
|
784
|
+
|
|
785
|
+
InstallImmediateMethod(IsMonogenicMonoid,
|
|
786
|
+
IsMonoid and IsFinite and HasGeneratorsOfMonoid,
|
|
787
|
+
0,
|
|
788
|
+
function(S)
|
|
789
|
+
local gens;
|
|
790
|
+
|
|
791
|
+
gens := GeneratorsOfMonoid(S);
|
|
792
|
+
if Length(gens) <= 1 then
|
|
793
|
+
SetMinimalMonoidGeneratingSet(S, gens);
|
|
794
|
+
return true;
|
|
795
|
+
elif CanEasilyCompareElements(gens)
|
|
796
|
+
and ForAll([2 .. Length(gens)], i -> gens[1] = gens[i]) then
|
|
797
|
+
SetMinimalMonoidGeneratingSet(S, [gens[1]]);
|
|
798
|
+
return true;
|
|
799
|
+
fi;
|
|
800
|
+
TryNextMethod();
|
|
801
|
+
end);
|
|
802
|
+
|
|
803
|
+
# same method for ideals
|
|
804
|
+
|
|
805
|
+
InstallMethod(IsMonogenicSemigroup, "for a semigroup",
|
|
806
|
+
[IsSemigroup],
|
|
807
|
+
function(S)
|
|
808
|
+
local I, gens, y, i;
|
|
809
|
+
|
|
810
|
+
if HasGeneratorsOfSemigroup(S) then
|
|
811
|
+
gens := GeneratorsOfSemigroup(S);
|
|
812
|
+
|
|
813
|
+
if not IsDuplicateFreeList(gens) then
|
|
814
|
+
gens := ShallowCopy(DuplicateFreeList(gens));
|
|
815
|
+
Info(InfoSemigroups, 2, "there are repeated generators");
|
|
816
|
+
fi;
|
|
817
|
+
|
|
818
|
+
if Length(gens) = 1 then
|
|
819
|
+
Info(InfoSemigroups, 2, "the semigroup only has one generator");
|
|
820
|
+
SetMinimalSemigroupGeneratingSet(S, gens);
|
|
821
|
+
return true;
|
|
822
|
+
fi;
|
|
823
|
+
fi;
|
|
824
|
+
|
|
825
|
+
if not IsFinite(S) then
|
|
826
|
+
TryNextMethod();
|
|
827
|
+
fi;
|
|
828
|
+
|
|
829
|
+
I := MinimalIdeal(S);
|
|
830
|
+
|
|
831
|
+
if not (IsGroup(I) or IsGroupAsSemigroup(I)) then
|
|
832
|
+
Info(InfoSemigroups, 2, "the minimal ideal is not a group.");
|
|
833
|
+
return false;
|
|
834
|
+
elif not IsCyclic(Range(IsomorphismPermGroup(I))) then
|
|
835
|
+
Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
|
|
836
|
+
return false;
|
|
837
|
+
elif HasGreensDClasses(S) then
|
|
838
|
+
i := NrDClasses(S);
|
|
839
|
+
if not IsTrivial(I) then
|
|
840
|
+
i := i - 1;
|
|
841
|
+
fi;
|
|
842
|
+
if i <> Number(GreensDClasses(S), IsTrivial) then
|
|
843
|
+
return false;
|
|
844
|
+
fi;
|
|
845
|
+
fi;
|
|
846
|
+
|
|
847
|
+
gens := GeneratorsOfSemigroup(S);
|
|
848
|
+
|
|
849
|
+
for i in [1 .. Length(gens)] do
|
|
850
|
+
y := gens[i];
|
|
851
|
+
if ForAll(gens, x -> x in Semigroup(y)) then
|
|
852
|
+
Info(InfoSemigroups, 2, "the semigroup is generated by generator ", i);
|
|
853
|
+
SetMinimalSemigroupGeneratingSet(S, [y]);
|
|
854
|
+
return true;
|
|
855
|
+
fi;
|
|
856
|
+
od;
|
|
857
|
+
Info(InfoSemigroups, 2, "at least one generator does not belong to the",
|
|
858
|
+
" semigroup generated by any ");
|
|
859
|
+
Info(InfoSemigroups, 2, "other generator.");
|
|
860
|
+
return false;
|
|
861
|
+
end);
|
|
862
|
+
|
|
863
|
+
# same method for ideals
|
|
864
|
+
|
|
865
|
+
InstallMethod(IsMonogenicInverseSemigroup, "for a semigroup",
|
|
866
|
+
[IsSemigroup],
|
|
867
|
+
function(S)
|
|
868
|
+
if not IsInverseSemigroup(S) then
|
|
869
|
+
return false;
|
|
870
|
+
elif not IsFinite(S) then
|
|
871
|
+
TryNextMethod();
|
|
872
|
+
fi;
|
|
873
|
+
return IsMonogenicInverseSemigroup(AsSemigroup(IsPartialPermSemigroup, S));
|
|
874
|
+
end);
|
|
875
|
+
|
|
876
|
+
# same method for ideals
|
|
877
|
+
|
|
878
|
+
InstallMethod(IsMonogenicInverseSemigroup,
|
|
879
|
+
"for an inverse semigroup with inverse op",
|
|
880
|
+
[IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
|
|
881
|
+
function(S)
|
|
882
|
+
local gens, I, y, i;
|
|
883
|
+
|
|
884
|
+
if HasGeneratorsOfInverseSemigroup(S) then
|
|
885
|
+
gens := GeneratorsOfInverseSemigroup(S);
|
|
886
|
+
|
|
887
|
+
if not IsDuplicateFreeList(gens) then
|
|
888
|
+
gens := ShallowCopy(DuplicateFreeList(gens));
|
|
889
|
+
Info(InfoSemigroups, 2, "there are repeated generators");
|
|
890
|
+
fi;
|
|
891
|
+
|
|
892
|
+
if Length(gens) = 1 then
|
|
893
|
+
Info(InfoSemigroups, 2, "the inverse semigroup only has one generator");
|
|
894
|
+
SetMinimalInverseSemigroupGeneratingSet(S, gens);
|
|
895
|
+
return true;
|
|
896
|
+
fi;
|
|
897
|
+
fi;
|
|
898
|
+
|
|
899
|
+
if not IsFinite(S) then
|
|
900
|
+
TryNextMethod();
|
|
901
|
+
fi;
|
|
902
|
+
|
|
903
|
+
I := MinimalIdeal(S);
|
|
904
|
+
|
|
905
|
+
if not IsCyclic(Range(IsomorphismPermGroup(I))) then
|
|
906
|
+
Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
|
|
907
|
+
return false;
|
|
908
|
+
fi;
|
|
909
|
+
|
|
910
|
+
gens := GeneratorsOfInverseSemigroup(S);
|
|
911
|
+
|
|
912
|
+
for i in [1 .. Length(gens)] do
|
|
913
|
+
y := gens[i];
|
|
914
|
+
if ForAll(gens, x -> x in InverseSemigroup(y)) then
|
|
915
|
+
Info(InfoSemigroups, 2, "the inverse semigroup is generated by ",
|
|
916
|
+
"generator ", i);
|
|
917
|
+
SetMinimalInverseSemigroupGeneratingSet(S, [y]);
|
|
918
|
+
return true;
|
|
919
|
+
fi;
|
|
920
|
+
od;
|
|
921
|
+
|
|
922
|
+
Info(InfoSemigroups, 2, "at least one generator does not belong to the",
|
|
923
|
+
" inverse semigroup generated by any ");
|
|
924
|
+
Info(InfoSemigroups, 2, "other generator.");
|
|
925
|
+
return false;
|
|
926
|
+
end);
|
|
927
|
+
|
|
928
|
+
InstallMethod(IsMonogenicMonoid, "for a monoid",
|
|
929
|
+
[IsMonoid],
|
|
930
|
+
function(S)
|
|
931
|
+
local I, gens, y, i;
|
|
932
|
+
|
|
933
|
+
if HasGeneratorsOfMonoid(S) then
|
|
934
|
+
gens := GeneratorsOfMonoid(S);
|
|
935
|
+
|
|
936
|
+
if not IsDuplicateFreeList(gens) then
|
|
937
|
+
gens := ShallowCopy(DuplicateFreeList(gens));
|
|
938
|
+
Info(InfoSemigroups, 2, "there are repeated generators");
|
|
939
|
+
fi;
|
|
940
|
+
|
|
941
|
+
if Length(gens) = 1 then
|
|
942
|
+
Info(InfoSemigroups, 2, "the monoid only has one generator");
|
|
943
|
+
SetMinimalMonoidGeneratingSet(S, gens);
|
|
944
|
+
return true;
|
|
945
|
+
fi;
|
|
946
|
+
fi;
|
|
947
|
+
|
|
948
|
+
if not IsFinite(S) then
|
|
949
|
+
TryNextMethod();
|
|
950
|
+
fi;
|
|
951
|
+
|
|
952
|
+
I := MinimalIdeal(S);
|
|
953
|
+
|
|
954
|
+
if not (IsGroup(I) or IsGroupAsSemigroup(I)) then
|
|
955
|
+
Info(InfoSemigroups, 2, "the minimal ideal is not a group.");
|
|
956
|
+
return false;
|
|
957
|
+
elif not IsCyclic(Range(IsomorphismPermGroup(I))) then
|
|
958
|
+
Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
|
|
959
|
+
return false;
|
|
960
|
+
elif HasGreensDClasses(S) then
|
|
961
|
+
i := NrDClasses(S);
|
|
962
|
+
if not IsTrivial(I) then
|
|
963
|
+
i := i - 1;
|
|
964
|
+
fi;
|
|
965
|
+
if i <> Number(GreensDClasses(S), IsTrivial) then
|
|
966
|
+
return false;
|
|
967
|
+
fi;
|
|
968
|
+
fi;
|
|
969
|
+
|
|
970
|
+
gens := GeneratorsOfMonoid(S);
|
|
971
|
+
|
|
972
|
+
for i in [1 .. Length(gens)] do
|
|
973
|
+
y := gens[i];
|
|
974
|
+
if ForAll(gens, x -> x in Monoid(y)) then
|
|
975
|
+
Info(InfoSemigroups, 2, "the monoid is generated by generator ", i);
|
|
976
|
+
SetMinimalMonoidGeneratingSet(S, [y]);
|
|
977
|
+
return true;
|
|
978
|
+
fi;
|
|
979
|
+
od;
|
|
980
|
+
Info(InfoSemigroups, 2, "at least one generator does not belong to the",
|
|
981
|
+
" monoid generated by any ");
|
|
982
|
+
Info(InfoSemigroups, 2, "other generator.");
|
|
983
|
+
return false;
|
|
984
|
+
end);
|
|
985
|
+
|
|
986
|
+
InstallMethod(IsMonogenicInverseMonoid, "for a monoid",
|
|
987
|
+
[IsMonoid],
|
|
988
|
+
function(S)
|
|
989
|
+
if not IsInverseMonoid(S) then
|
|
990
|
+
return false;
|
|
991
|
+
elif not IsFinite(S) then
|
|
992
|
+
TryNextMethod();
|
|
993
|
+
fi;
|
|
994
|
+
return IsMonogenicInverseMonoid(AsMonoid(IsPartialPermMonoid, S));
|
|
995
|
+
end);
|
|
996
|
+
|
|
997
|
+
InstallMethod(IsMonogenicInverseMonoid,
|
|
998
|
+
"for an inverse monoid with inverse op",
|
|
999
|
+
[IsInverseMonoid and IsGeneratorsOfInverseSemigroup],
|
|
1000
|
+
function(S)
|
|
1001
|
+
local gens, I, y, i;
|
|
1002
|
+
|
|
1003
|
+
if HasGeneratorsOfInverseMonoid(S) then
|
|
1004
|
+
gens := GeneratorsOfInverseMonoid(S);
|
|
1005
|
+
|
|
1006
|
+
if not IsDuplicateFreeList(gens) then
|
|
1007
|
+
gens := ShallowCopy(DuplicateFreeList(gens));
|
|
1008
|
+
Info(InfoSemigroups, 2, "there are repeated generators");
|
|
1009
|
+
fi;
|
|
1010
|
+
|
|
1011
|
+
if Length(gens) = 1 then
|
|
1012
|
+
Info(InfoSemigroups, 2, "the inverse monoid only has one generator");
|
|
1013
|
+
SetMinimalInverseMonoidGeneratingSet(S, gens);
|
|
1014
|
+
return true;
|
|
1015
|
+
fi;
|
|
1016
|
+
fi;
|
|
1017
|
+
|
|
1018
|
+
if not IsFinite(S) then
|
|
1019
|
+
# WW I cannot find an example of an infinite inverse monoid
|
|
1020
|
+
# with InverseOp - FreeGroup(1) should work, but it is not in the category
|
|
1021
|
+
TryNextMethod();
|
|
1022
|
+
fi;
|
|
1023
|
+
|
|
1024
|
+
I := MinimalIdeal(S);
|
|
1025
|
+
|
|
1026
|
+
if not IsCyclic(Range(IsomorphismPermGroup(I))) then
|
|
1027
|
+
Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
|
|
1028
|
+
return false;
|
|
1029
|
+
fi;
|
|
1030
|
+
|
|
1031
|
+
gens := GeneratorsOfInverseMonoid(S);
|
|
1032
|
+
|
|
1033
|
+
for i in [1 .. Length(gens)] do
|
|
1034
|
+
y := gens[i];
|
|
1035
|
+
if ForAll(gens, x -> x in InverseMonoid(y)) then
|
|
1036
|
+
Info(InfoSemigroups, 2, "the inverse monoid is generated by generator ",
|
|
1037
|
+
i);
|
|
1038
|
+
SetMinimalInverseMonoidGeneratingSet(S, [y]);
|
|
1039
|
+
return true;
|
|
1040
|
+
fi;
|
|
1041
|
+
od;
|
|
1042
|
+
|
|
1043
|
+
Info(InfoSemigroups, 2, "at least one generator does not belong to the",
|
|
1044
|
+
" inverse monoid generated by any ");
|
|
1045
|
+
Info(InfoSemigroups, 2, "other generator.");
|
|
1046
|
+
return false;
|
|
1047
|
+
end);
|
|
1048
|
+
|
|
1049
|
+
# same method for ideals
|
|
1050
|
+
|
|
1051
|
+
InstallMethod(IsMonoidAsSemigroup, "for a semigroup",
|
|
1052
|
+
[IsSemigroup], S -> MultiplicativeNeutralElement(S) <> fail);
|
|
1053
|
+
|
|
1054
|
+
# same method for ideals
|
|
1055
|
+
|
|
1056
|
+
InstallMethod(IsOrthodoxSemigroup, "for a semigroup",
|
|
1057
|
+
[IsSemigroup], SUM_FLAGS, # to beat the Smallsemi method
|
|
1058
|
+
function(S)
|
|
1059
|
+
if not IsFinite(S) then
|
|
1060
|
+
# WW we cannot test the following line, since the error message we
|
|
1061
|
+
# eventually get depends on whether or not Smallsemi is loaded
|
|
1062
|
+
TryNextMethod();
|
|
1063
|
+
elif not IsRegularSemigroup(S) then
|
|
1064
|
+
Info(InfoSemigroups, 2, "the semigroup is not regular");
|
|
1065
|
+
return false;
|
|
1066
|
+
fi;
|
|
1067
|
+
Info(InfoSemigroups, 2, "the idempotents do not form a subsemigroup");
|
|
1068
|
+
return IsSemigroupWithClosedIdempotents(S);
|
|
1069
|
+
end);
|
|
1070
|
+
|
|
1071
|
+
InstallMethod(IsSemigroupWithClosedIdempotents, "for a semigroup",
|
|
1072
|
+
[IsSemigroup],
|
|
1073
|
+
function(S)
|
|
1074
|
+
local e, m, i, j;
|
|
1075
|
+
|
|
1076
|
+
if not IsFinite(S) then
|
|
1077
|
+
TryNextMethod();
|
|
1078
|
+
fi;
|
|
1079
|
+
|
|
1080
|
+
e := Idempotents(S);
|
|
1081
|
+
m := NrIdempotents(S);
|
|
1082
|
+
|
|
1083
|
+
for i in [1 .. m] do
|
|
1084
|
+
for j in [i + 1 .. m] do
|
|
1085
|
+
if not IsIdempotent(e[i] * e[j]) or not IsIdempotent(e[j] * e[i]) then
|
|
1086
|
+
Info(InfoSemigroups, 2, "the product of idempotents ", i, " and ", j,
|
|
1087
|
+
" (in some order) is not idempotent");
|
|
1088
|
+
return false;
|
|
1089
|
+
fi;
|
|
1090
|
+
od;
|
|
1091
|
+
od;
|
|
1092
|
+
return true;
|
|
1093
|
+
end);
|
|
1094
|
+
|
|
1095
|
+
InstallTrueMethod(IsSemigroupWithClosedIdempotents,
|
|
1096
|
+
IsSemigroupWithCommutingIdempotents);
|
|
1097
|
+
|
|
1098
|
+
# same method for ideals, works for finite and infinite
|
|
1099
|
+
|
|
1100
|
+
InstallMethod(IsRectangularBand, "for a semigroup",
|
|
1101
|
+
[IsSemigroup],
|
|
1102
|
+
function(S)
|
|
1103
|
+
|
|
1104
|
+
if HasParent(S) and HasIsRectangularBand(Parent(S))
|
|
1105
|
+
and IsRectangularBand(Parent(S)) then
|
|
1106
|
+
return true;
|
|
1107
|
+
elif not IsFinite(S) then
|
|
1108
|
+
TryNextMethod();
|
|
1109
|
+
elif not IsSimpleSemigroup(S) then
|
|
1110
|
+
# this case is not true for infinite semigroups:
|
|
1111
|
+
# the bicyclic monoid is a simple h-trivial semigroup which is not a band
|
|
1112
|
+
Info(InfoSemigroups, 2, "the semigroup is not simple");
|
|
1113
|
+
return false;
|
|
1114
|
+
elif HasIsBand(S) then
|
|
1115
|
+
return IsBand(S);
|
|
1116
|
+
fi;
|
|
1117
|
+
|
|
1118
|
+
return IsHTrivial(S);
|
|
1119
|
+
end);
|
|
1120
|
+
|
|
1121
|
+
# same method for ideals
|
|
1122
|
+
|
|
1123
|
+
InstallMethod(IsRectangularBand, "for an inverse semigroup",
|
|
1124
|
+
[IsInverseSemigroup], IsTrivial);
|
|
1125
|
+
|
|
1126
|
+
# different method for ideals (ideals know at their point of creation if they
|
|
1127
|
+
# are regular or not)
|
|
1128
|
+
|
|
1129
|
+
InstallMethod(IsRegularSemigroup, "for an acting semigroup with generators",
|
|
1130
|
+
[IsActingSemigroup and HasGeneratorsOfSemigroup],
|
|
1131
|
+
function(S)
|
|
1132
|
+
local tester, rhofunc, lookfunc, data, i;
|
|
1133
|
+
|
|
1134
|
+
if IsSimpleSemigroup(S) then
|
|
1135
|
+
Info(InfoSemigroups, 2, "the semigroup is simple");
|
|
1136
|
+
return true;
|
|
1137
|
+
elif HasIsCompletelyRegularSemigroup(S)
|
|
1138
|
+
and IsCompletelyRegularSemigroup(S) then
|
|
1139
|
+
Info(InfoSemigroups, 2, "the semigroup is completely regular");
|
|
1140
|
+
return true;
|
|
1141
|
+
elif HasGreensDClasses(S) then
|
|
1142
|
+
return ForAll(GreensDClasses(S), IsRegularDClass);
|
|
1143
|
+
fi;
|
|
1144
|
+
|
|
1145
|
+
tester := IdempotentTester(S);
|
|
1146
|
+
rhofunc := RhoFunc(S);
|
|
1147
|
+
|
|
1148
|
+
# look for <S> not being regular
|
|
1149
|
+
lookfunc := function(data, x)
|
|
1150
|
+
local rho, scc, i;
|
|
1151
|
+
if data!.repslens[x[2]][data!.orblookup1[x[6]]] > 1 then
|
|
1152
|
+
return true;
|
|
1153
|
+
elif IsActingSemigroupWithFixedDegreeMultiplication(S)
|
|
1154
|
+
and ActionRank(S)(x[4]) = ActionDegree(x[4]) then
|
|
1155
|
+
return false;
|
|
1156
|
+
fi;
|
|
1157
|
+
|
|
1158
|
+
rho := rhofunc(x[4]);
|
|
1159
|
+
scc := OrbSCC(x[3])[x[2]];
|
|
1160
|
+
for i in scc do
|
|
1161
|
+
if tester(x[3][i], rho) then
|
|
1162
|
+
return false;
|
|
1163
|
+
fi;
|
|
1164
|
+
od;
|
|
1165
|
+
return true;
|
|
1166
|
+
end;
|
|
1167
|
+
|
|
1168
|
+
data := SemigroupData(S);
|
|
1169
|
+
|
|
1170
|
+
for i in [2 .. Length(data)] do
|
|
1171
|
+
if lookfunc(data, data[i]) then
|
|
1172
|
+
return false;
|
|
1173
|
+
fi;
|
|
1174
|
+
od;
|
|
1175
|
+
|
|
1176
|
+
if IsClosedData(data) then
|
|
1177
|
+
return true;
|
|
1178
|
+
fi;
|
|
1179
|
+
|
|
1180
|
+
data := Enumerate(data, infinity, lookfunc);
|
|
1181
|
+
return data!.found = false;
|
|
1182
|
+
end);
|
|
1183
|
+
|
|
1184
|
+
# same method for ideals
|
|
1185
|
+
|
|
1186
|
+
InstallMethod(IsRegularSemigroupElement,
|
|
1187
|
+
"for an acting semigroup and multiplicative element",
|
|
1188
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
1189
|
+
function(S, x)
|
|
1190
|
+
local o, scc, rho, tester, i;
|
|
1191
|
+
|
|
1192
|
+
if not x in S then
|
|
1193
|
+
Info(InfoSemigroups, 2, "the element does not belong to the semigroup,");
|
|
1194
|
+
return false;
|
|
1195
|
+
elif HasIsRegularSemigroup(S) and IsRegularSemigroup(S) then
|
|
1196
|
+
Info(InfoSemigroups, 2, "the semigroup is regular,");
|
|
1197
|
+
return true;
|
|
1198
|
+
fi;
|
|
1199
|
+
|
|
1200
|
+
o := LambdaOrb(S);
|
|
1201
|
+
scc := OrbSCC(o)[OrbSCCLookup(o)[Position(o, LambdaFunc(S)(x))]];
|
|
1202
|
+
rho := RhoFunc(S)(x);
|
|
1203
|
+
tester := IdempotentTester(S);
|
|
1204
|
+
|
|
1205
|
+
for i in scc do
|
|
1206
|
+
if tester(o[i], rho) then
|
|
1207
|
+
return true;
|
|
1208
|
+
fi;
|
|
1209
|
+
od;
|
|
1210
|
+
return false;
|
|
1211
|
+
end);
|
|
1212
|
+
|
|
1213
|
+
# same method for ideals
|
|
1214
|
+
|
|
1215
|
+
InstallMethod(IsRegularSemigroupElementNC,
|
|
1216
|
+
"for an acting semigroup and multiplicative element",
|
|
1217
|
+
[IsActingSemigroup, IsMultiplicativeElement],
|
|
1218
|
+
function(S, x)
|
|
1219
|
+
local o, l, scc, rho, tester, i;
|
|
1220
|
+
|
|
1221
|
+
if IsClosedOrbit(LambdaOrb(S)) then
|
|
1222
|
+
o := LambdaOrb(S);
|
|
1223
|
+
l := Position(o, LambdaFunc(S)(x));
|
|
1224
|
+
if l = fail then
|
|
1225
|
+
return false;
|
|
1226
|
+
fi;
|
|
1227
|
+
else
|
|
1228
|
+
# this has to be false, since we're not sure if <x> in <S>
|
|
1229
|
+
o := GradedLambdaOrb(S, x, false);
|
|
1230
|
+
l := 1;
|
|
1231
|
+
fi;
|
|
1232
|
+
|
|
1233
|
+
scc := OrbSCC(o)[OrbSCCLookup(o)[l]];
|
|
1234
|
+
rho := RhoFunc(S)(x);
|
|
1235
|
+
tester := IdempotentTester(S);
|
|
1236
|
+
|
|
1237
|
+
for i in scc do
|
|
1238
|
+
if tester(o[i], rho) then
|
|
1239
|
+
return true;
|
|
1240
|
+
fi;
|
|
1241
|
+
od;
|
|
1242
|
+
return false;
|
|
1243
|
+
end);
|
|
1244
|
+
|
|
1245
|
+
InstallMethod(IsRegularSemigroupElementNC,
|
|
1246
|
+
[IsSemigroup, IsMultiplicativeElement], IsRegularSemigroupElement);
|
|
1247
|
+
|
|
1248
|
+
InstallMethod(IsRegularSemigroupElement, "for semigroup", IsCollsElms,
|
|
1249
|
+
[IsSemigroup, IsMultiplicativeElement],
|
|
1250
|
+
{S, x} -> x in S and IsRegularGreensClass(RClass(S, x)));
|
|
1251
|
+
|
|
1252
|
+
# same method for ideals
|
|
1253
|
+
|
|
1254
|
+
InstallMethod(IsRightSimple, "for a semigroup", [IsSemigroup],
|
|
1255
|
+
function(S)
|
|
1256
|
+
if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
1257
|
+
return false;
|
|
1258
|
+
elif not IsFinite(S) then
|
|
1259
|
+
TryNextMethod();
|
|
1260
|
+
fi;
|
|
1261
|
+
return NrRClasses(S) = 1;
|
|
1262
|
+
end);
|
|
1263
|
+
|
|
1264
|
+
# same method for ideals
|
|
1265
|
+
|
|
1266
|
+
InstallMethod(IsRightSimple, "for an inverse semigroup",
|
|
1267
|
+
[IsInverseSemigroup], IsGroupAsSemigroup);
|
|
1268
|
+
|
|
1269
|
+
# different method for ideals
|
|
1270
|
+
|
|
1271
|
+
InstallMethod(IsRightZeroSemigroup,
|
|
1272
|
+
"for an acting semigroup with generators",
|
|
1273
|
+
[IsActingSemigroup and HasGeneratorsOfSemigroup],
|
|
1274
|
+
function(S)
|
|
1275
|
+
local gens, rho, val, x;
|
|
1276
|
+
|
|
1277
|
+
if HasParent(S) and HasIsRightZeroSemigroup(Parent(S))
|
|
1278
|
+
and IsRightZeroSemigroup(Parent(S)) then
|
|
1279
|
+
return true;
|
|
1280
|
+
fi;
|
|
1281
|
+
|
|
1282
|
+
gens := GeneratorsOfSemigroup(S);
|
|
1283
|
+
rho := RhoFunc(S);
|
|
1284
|
+
val := rho(gens[1]);
|
|
1285
|
+
for x in gens do
|
|
1286
|
+
if rho(x) <> val or not IsIdempotent(x) then
|
|
1287
|
+
return false;
|
|
1288
|
+
fi;
|
|
1289
|
+
od;
|
|
1290
|
+
|
|
1291
|
+
return true;
|
|
1292
|
+
end);
|
|
1293
|
+
|
|
1294
|
+
InstallMethod(IsRightZeroSemigroup, "for a semigroup", [IsSemigroup],
|
|
1295
|
+
function(S)
|
|
1296
|
+
if HasParent(S) and HasIsRightZeroSemigroup(Parent(S))
|
|
1297
|
+
and IsRightZeroSemigroup(Parent(S)) then
|
|
1298
|
+
return true;
|
|
1299
|
+
elif not IsFinite(S) then
|
|
1300
|
+
TryNextMethod();
|
|
1301
|
+
fi;
|
|
1302
|
+
return NrRClasses(S) = 1 and Size(S) = NrLClasses(S);
|
|
1303
|
+
end);
|
|
1304
|
+
|
|
1305
|
+
# same method for ideals
|
|
1306
|
+
|
|
1307
|
+
InstallMethod(IsRightZeroSemigroup, "for an inverse semigroup",
|
|
1308
|
+
[IsInverseSemigroup], IsTrivial);
|
|
1309
|
+
|
|
1310
|
+
# same method for ideals
|
|
1311
|
+
|
|
1312
|
+
InstallMethod(IsSemiband, "for a semigroup", [IsSemigroup],
|
|
1313
|
+
IsIdempotentGenerated);
|
|
1314
|
+
|
|
1315
|
+
# same method for ideals
|
|
1316
|
+
|
|
1317
|
+
InstallMethod(IsSemilattice, "for a semigroup", [IsSemigroup],
|
|
1318
|
+
function(S)
|
|
1319
|
+
# Do not have to check if HasParent(S) and HasIsSemilattice(Parent(S)) and
|
|
1320
|
+
# IsSemilattice(Parent(S)) since if this is true, then S is an inverse
|
|
1321
|
+
# semigroup and the method after the next is used in preference to this one
|
|
1322
|
+
return IsCommutativeSemigroup(S) and IsBand(S);
|
|
1323
|
+
end);
|
|
1324
|
+
|
|
1325
|
+
# not applicable to ideals
|
|
1326
|
+
|
|
1327
|
+
InstallMethod(IsSemilattice,
|
|
1328
|
+
"for an inverse semigroup with generators",
|
|
1329
|
+
[IsInverseSemigroup and HasGeneratorsOfSemigroup],
|
|
1330
|
+
function(S)
|
|
1331
|
+
if not IsFinite(S) then
|
|
1332
|
+
TryNextMethod();
|
|
1333
|
+
elif HasParent(S) and HasIsSemilattice(Parent(S))
|
|
1334
|
+
and IsSemilattice(Parent(S)) then
|
|
1335
|
+
return true;
|
|
1336
|
+
fi;
|
|
1337
|
+
return ForAll(GeneratorsOfSemigroup(S), IsIdempotent);
|
|
1338
|
+
end);
|
|
1339
|
+
|
|
1340
|
+
# same method for ideals
|
|
1341
|
+
|
|
1342
|
+
InstallMethod(IsSemilattice, "for an inverse semigroup",
|
|
1343
|
+
[IsInverseSemigroup],
|
|
1344
|
+
function(S)
|
|
1345
|
+
if HasParent(S) and HasIsSemilattice(Parent(S))
|
|
1346
|
+
and IsSemilattice(Parent(S)) then
|
|
1347
|
+
return true;
|
|
1348
|
+
elif not IsFinite(S) then
|
|
1349
|
+
TryNextMethod();
|
|
1350
|
+
fi;
|
|
1351
|
+
return IsDTrivial(S);
|
|
1352
|
+
end);
|
|
1353
|
+
|
|
1354
|
+
InstallMethod(IsSimpleSemigroup, "for a finite semigroup",
|
|
1355
|
+
[IsSemigroup and IsFinite], S -> NrDClasses(S) = 1);
|
|
1356
|
+
|
|
1357
|
+
# same method for ideals
|
|
1358
|
+
|
|
1359
|
+
InstallMethod(IsSimpleSemigroup, "for an acting semigroup",
|
|
1360
|
+
[IsActingSemigroup],
|
|
1361
|
+
function(S)
|
|
1362
|
+
local gens, lambdafunc, lambdarank, rank, opts, o, pos, iter, name, f;
|
|
1363
|
+
|
|
1364
|
+
if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
|
|
1365
|
+
Info(InfoSemigroups, 2, "the semigroup is not regular");
|
|
1366
|
+
return false;
|
|
1367
|
+
elif HasIsCompletelyRegularSemigroup(S)
|
|
1368
|
+
and not IsCompletelyRegularSemigroup(S) then
|
|
1369
|
+
Info(InfoSemigroups, 2, "the semigroup is not completely regular");
|
|
1370
|
+
return false;
|
|
1371
|
+
elif HasNrDClasses(S) then
|
|
1372
|
+
return NrDClasses(S) = 1;
|
|
1373
|
+
elif HasGeneratorsOfSemigroup(S) then
|
|
1374
|
+
gens := GeneratorsOfSemigroup(S); # not GeneratorsOfMonoid!
|
|
1375
|
+
lambdafunc := LambdaFunc(S);
|
|
1376
|
+
lambdarank := LambdaRank(S);
|
|
1377
|
+
rank := lambdarank(lambdafunc(gens[1]));
|
|
1378
|
+
|
|
1379
|
+
if not ForAll([2 .. Length(gens)],
|
|
1380
|
+
i -> lambdarank(lambdafunc(gens[i])) = rank) then
|
|
1381
|
+
return false;
|
|
1382
|
+
fi;
|
|
1383
|
+
|
|
1384
|
+
opts := rec(treehashsize := SEMIGROUPS.OptionsRec(S).hashlen);
|
|
1385
|
+
|
|
1386
|
+
for name in RecNames(LambdaOrbOpts(S)) do
|
|
1387
|
+
opts.(name) := LambdaOrbOpts(S).(name);
|
|
1388
|
+
od;
|
|
1389
|
+
|
|
1390
|
+
for f in gens do
|
|
1391
|
+
o := Orb(S, LambdaFunc(S)(f), LambdaAct(S), opts);
|
|
1392
|
+
pos := LookForInOrb(o, {o, x} -> LambdaRank(S)(x) < rank, 1);
|
|
1393
|
+
if pos <> false then
|
|
1394
|
+
return false;
|
|
1395
|
+
fi;
|
|
1396
|
+
od;
|
|
1397
|
+
|
|
1398
|
+
return true;
|
|
1399
|
+
fi;
|
|
1400
|
+
|
|
1401
|
+
# regular ideal case
|
|
1402
|
+
iter := IteratorOfDClasses(S);
|
|
1403
|
+
NextIterator(iter);
|
|
1404
|
+
return IsDoneIterator(iter);
|
|
1405
|
+
end);
|
|
1406
|
+
|
|
1407
|
+
# same method for ideals
|
|
1408
|
+
|
|
1409
|
+
InstallMethod(IsSimpleSemigroup, "for a finite inverse semigroup",
|
|
1410
|
+
[IsInverseSemigroup and IsFinite], IsGroupAsSemigroup);
|
|
1411
|
+
|
|
1412
|
+
# different method for ideals
|
|
1413
|
+
|
|
1414
|
+
InstallMethod(IsTrivial, "for a semigroup with generators",
|
|
1415
|
+
[IsSemigroup and HasGeneratorsOfSemigroup],
|
|
1416
|
+
function(S)
|
|
1417
|
+
local gens;
|
|
1418
|
+
|
|
1419
|
+
if not IsFinite(S) then
|
|
1420
|
+
return false;
|
|
1421
|
+
fi;
|
|
1422
|
+
gens := GeneratorsOfSemigroup(S);
|
|
1423
|
+
return Length(gens) > 0 and IsIdempotent(gens[1])
|
|
1424
|
+
and ForAll(gens, x -> gens[1] = x);
|
|
1425
|
+
end);
|
|
1426
|
+
|
|
1427
|
+
InstallMethod(IsUnitRegularMonoid, "for a semigroup",
|
|
1428
|
+
[IsSemigroup],
|
|
1429
|
+
function(S)
|
|
1430
|
+
local G, x;
|
|
1431
|
+
|
|
1432
|
+
if not IsRegularSemigroup(S) then
|
|
1433
|
+
return false;
|
|
1434
|
+
elif not IsFinite(S) then
|
|
1435
|
+
TryNextMethod();
|
|
1436
|
+
fi;
|
|
1437
|
+
|
|
1438
|
+
G := GroupOfUnits(S);
|
|
1439
|
+
|
|
1440
|
+
if G = fail then
|
|
1441
|
+
return false;
|
|
1442
|
+
elif IsTrivial(G) then
|
|
1443
|
+
return IsBand(S);
|
|
1444
|
+
fi;
|
|
1445
|
+
|
|
1446
|
+
for x in S do
|
|
1447
|
+
if ForAll(G, y -> x * y * x <> x) then
|
|
1448
|
+
return false;
|
|
1449
|
+
fi;
|
|
1450
|
+
od;
|
|
1451
|
+
return true;
|
|
1452
|
+
end);
|
|
1453
|
+
|
|
1454
|
+
# same method for ideals
|
|
1455
|
+
|
|
1456
|
+
InstallMethod(IsZeroGroup, "for a semigroup", [IsSemigroup],
|
|
1457
|
+
function(S)
|
|
1458
|
+
|
|
1459
|
+
if HasParent(S) and HasIsZeroGroup(Parent(S)) and IsZeroGroup(Parent(S)) then
|
|
1460
|
+
return S = Parent(S);
|
|
1461
|
+
elif not IsFinite(S) then
|
|
1462
|
+
TryNextMethod();
|
|
1463
|
+
elif MultiplicativeZero(S) = fail then
|
|
1464
|
+
Info(InfoSemigroups, 2, "the semigroup does not have a zero");
|
|
1465
|
+
return false;
|
|
1466
|
+
elif NrHClasses(S) = 2 then
|
|
1467
|
+
return ForAll(GreensHClasses(S), IsGroupHClass);
|
|
1468
|
+
fi;
|
|
1469
|
+
|
|
1470
|
+
Info(InfoSemigroups, 2, "the semigroup has more than two H-classes");
|
|
1471
|
+
return false;
|
|
1472
|
+
end);
|
|
1473
|
+
|
|
1474
|
+
# same method for ideals
|
|
1475
|
+
|
|
1476
|
+
InstallMethod(IsZeroRectangularBand, "for a semigroup",
|
|
1477
|
+
[IsSemigroup],
|
|
1478
|
+
function(S)
|
|
1479
|
+
if not IsFinite(S) then
|
|
1480
|
+
TryNextMethod();
|
|
1481
|
+
elif not IsZeroSimpleSemigroup(S) then
|
|
1482
|
+
Info(InfoSemigroups, 2, "the semigroup is not 0-simple");
|
|
1483
|
+
return false;
|
|
1484
|
+
fi;
|
|
1485
|
+
return IsHTrivial(S);
|
|
1486
|
+
end);
|
|
1487
|
+
|
|
1488
|
+
# different method for ideals
|
|
1489
|
+
|
|
1490
|
+
InstallMethod(IsZeroSemigroup, "for a semigroup", [IsSemigroup],
|
|
1491
|
+
function(S)
|
|
1492
|
+
local z, gens, i, j;
|
|
1493
|
+
|
|
1494
|
+
if HasParent(S) and HasIsZeroSemigroup(Parent(S))
|
|
1495
|
+
and IsZeroSemigroup(Parent(S)) then
|
|
1496
|
+
return true;
|
|
1497
|
+
elif not IsFinite(S) then
|
|
1498
|
+
TryNextMethod();
|
|
1499
|
+
fi;
|
|
1500
|
+
|
|
1501
|
+
z := MultiplicativeZero(S);
|
|
1502
|
+
|
|
1503
|
+
if z = fail then
|
|
1504
|
+
Info(InfoSemigroups, 2, "the semigroup does not have a zero");
|
|
1505
|
+
return false;
|
|
1506
|
+
fi;
|
|
1507
|
+
|
|
1508
|
+
gens := GeneratorsOfSemigroup(S);
|
|
1509
|
+
for i in [1 .. Length(gens)] do
|
|
1510
|
+
for j in [1 .. Length(gens)] do
|
|
1511
|
+
if not gens[i] * gens[j] = z then
|
|
1512
|
+
Info(InfoSemigroups, 2, "the product of generators ", i, " and ", j,
|
|
1513
|
+
" is not the multiplicative zero \n", z);
|
|
1514
|
+
return false;
|
|
1515
|
+
fi;
|
|
1516
|
+
od;
|
|
1517
|
+
od;
|
|
1518
|
+
|
|
1519
|
+
return true;
|
|
1520
|
+
end);
|
|
1521
|
+
|
|
1522
|
+
# same method for ideals
|
|
1523
|
+
|
|
1524
|
+
InstallMethod(IsZeroSemigroup, "for an inverse semigroup",
|
|
1525
|
+
[IsInverseSemigroup], IsTrivial);
|
|
1526
|
+
|
|
1527
|
+
# same method for ideals
|
|
1528
|
+
|
|
1529
|
+
InstallMethod(IsZeroSimpleSemigroup, "for an acting semigroup",
|
|
1530
|
+
[IsActingSemigroup],
|
|
1531
|
+
function(S)
|
|
1532
|
+
local iter, D;
|
|
1533
|
+
|
|
1534
|
+
if MultiplicativeZero(S) = fail then
|
|
1535
|
+
return false;
|
|
1536
|
+
elif IsClosedData(SemigroupData(S)) then
|
|
1537
|
+
return IsRegularSemigroup(S) and NrDClasses(S) = 2;
|
|
1538
|
+
fi;
|
|
1539
|
+
iter := IteratorOfDClasses(S);
|
|
1540
|
+
D := NextIterator(iter);
|
|
1541
|
+
if IsDoneIterator(iter) or not IsRegularDClass(D) then
|
|
1542
|
+
return false;
|
|
1543
|
+
fi;
|
|
1544
|
+
D := NextIterator(iter);
|
|
1545
|
+
return IsDoneIterator(iter) and IsRegularDClass(D);
|
|
1546
|
+
end);
|
|
1547
|
+
|
|
1548
|
+
# same method for ideals
|
|
1549
|
+
|
|
1550
|
+
InstallMethod(IsZeroSimpleSemigroup, "for a semigroup",
|
|
1551
|
+
[IsSemigroup], 1, # to beat the library method
|
|
1552
|
+
function(S)
|
|
1553
|
+
if not IsFinite(S) then
|
|
1554
|
+
TryNextMethod();
|
|
1555
|
+
fi;
|
|
1556
|
+
|
|
1557
|
+
return MultiplicativeZero(S) <> fail and NrDClasses(S) = 2 and
|
|
1558
|
+
IsRegularSemigroup(S);
|
|
1559
|
+
end);
|
|
1560
|
+
|
|
1561
|
+
# same method for ideals
|
|
1562
|
+
|
|
1563
|
+
InstallMethod(IsZeroSimpleSemigroup, "for a finite inverse semigroup",
|
|
1564
|
+
[IsInverseSemigroup and IsFinite],
|
|
1565
|
+
S -> MultiplicativeZero(S) <> fail and NrDClasses(S) = 2);
|
|
1566
|
+
|
|
1567
|
+
InstallMethod(IsNilpotentSemigroup, "for a semigroup",
|
|
1568
|
+
[IsSemigroup],
|
|
1569
|
+
function(S)
|
|
1570
|
+
if not IsFinite(S) then
|
|
1571
|
+
TryNextMethod();
|
|
1572
|
+
elif HasNrIdempotents(S) and NrIdempotents(S) <> 1 then
|
|
1573
|
+
return false;
|
|
1574
|
+
elif MultiplicativeZero(S) = fail then
|
|
1575
|
+
return false;
|
|
1576
|
+
fi;
|
|
1577
|
+
return NrIdempotents(S) = 1;
|
|
1578
|
+
end);
|
|
1579
|
+
|
|
1580
|
+
# WW the following lets us get higher code coverage
|
|
1581
|
+
|
|
1582
|
+
InstallMethod(IsFinite, "for a finitely presented semigroup",
|
|
1583
|
+
[IsFpSemigroup],
|
|
1584
|
+
function(S)
|
|
1585
|
+
if IsEmpty(RelationsOfFpSemigroup(S)) or
|
|
1586
|
+
ForAll(RelationsOfFpSemigroup(S),
|
|
1587
|
+
x -> IsIdenticalObj(x[1], x[2]))
|
|
1588
|
+
or Length(GeneratorsOfSemigroup(S)) >
|
|
1589
|
+
Length(RelationsOfFpSemigroup(S)) then
|
|
1590
|
+
return false;
|
|
1591
|
+
fi;
|
|
1592
|
+
TryNextMethod();
|
|
1593
|
+
end);
|
|
1594
|
+
|
|
1595
|
+
InstallMethod(IsSemigroupWithAdjoinedZero, "for a semigroup", [IsSemigroup],
|
|
1596
|
+
x -> UnderlyingSemigroupOfSemigroupWithAdjoinedZero(x) <> fail);
|
|
1597
|
+
|
|
1598
|
+
InstallMethod(IsSurjectiveSemigroup, "for a semigroup",
|
|
1599
|
+
[IsSemigroup],
|
|
1600
|
+
S -> IsEmpty(IndecomposableElements(S)));
|
|
1601
|
+
|
|
1602
|
+
InstallMethod(IsFullInverseSubsemigroup,
|
|
1603
|
+
"for an inverse semigroup and an inverse subsemigroup",
|
|
1604
|
+
[IsInverseSemigroup, IsInverseSemigroup],
|
|
1605
|
+
function(S, T)
|
|
1606
|
+
return IsSubsemigroup(S, T) and IsInverseSemigroup(T)
|
|
1607
|
+
and NrIdempotents(S) = NrIdempotents(T);
|
|
1608
|
+
end);
|
|
1609
|
+
|
|
1610
|
+
# The filter IsActingSemigroup is added here because otherwise we don't know
|
|
1611
|
+
# that G and N in the loop in the method below act on the same set.
|
|
1612
|
+
|
|
1613
|
+
InstallMethod(IsNormalInverseSubsemigroup,
|
|
1614
|
+
"for an inverse acting semigroup and subsemigroup",
|
|
1615
|
+
[IsInverseSemigroup and IsActingSemigroup,
|
|
1616
|
+
IsInverseSemigroup and IsActingSemigroup],
|
|
1617
|
+
function(S, T)
|
|
1618
|
+
local DS, G, N, p, DT;
|
|
1619
|
+
|
|
1620
|
+
if not IsSubsemigroup(S, T) then
|
|
1621
|
+
return false;
|
|
1622
|
+
fi;
|
|
1623
|
+
|
|
1624
|
+
for DT in DClasses(T) do
|
|
1625
|
+
DS := DClass(S, Representative(DT));
|
|
1626
|
+
G := Image(IsomorphismPermGroup(GroupHClass(DS)));
|
|
1627
|
+
N := Image(IsomorphismPermGroup(GroupHClass(DT)));
|
|
1628
|
+
if not IsSubset(MovedPoints(G), MovedPoints(N)) then
|
|
1629
|
+
p := MappingPermListList(MovedPoints(N), MovedPoints(G));
|
|
1630
|
+
N := N ^ p;
|
|
1631
|
+
fi;
|
|
1632
|
+
Assert(0, IsSubset(MovedPoints(G), MovedPoints(N)));
|
|
1633
|
+
if not IsNormal(G, N) then
|
|
1634
|
+
return false;
|
|
1635
|
+
fi;
|
|
1636
|
+
od;
|
|
1637
|
+
return true;
|
|
1638
|
+
end);
|
|
1639
|
+
|
|
1640
|
+
InstallMethod(IsSelfDualSemigroup,
|
|
1641
|
+
"for a finite semigroup with CanUseFroidurePin",
|
|
1642
|
+
[IsSemigroup and CanUseFroidurePin],
|
|
1643
|
+
function(S)
|
|
1644
|
+
local T, map;
|
|
1645
|
+
if IsCommutativeSemigroup(S) then # TODO(later) any more?
|
|
1646
|
+
return true;
|
|
1647
|
+
elif NrRClasses(S) <> NrLClasses(S) then
|
|
1648
|
+
return false;
|
|
1649
|
+
fi;
|
|
1650
|
+
|
|
1651
|
+
T := AsSemigroup(IsFpSemigroup, S);
|
|
1652
|
+
map := AntiIsomorphismDualFpSemigroup(T);
|
|
1653
|
+
return SemigroupIsomorphismByImages(T,
|
|
1654
|
+
Range(map),
|
|
1655
|
+
GeneratorsOfSemigroup(T),
|
|
1656
|
+
List(GeneratorsOfSemigroup(T),
|
|
1657
|
+
x -> x ^ map)) <> fail;
|
|
1658
|
+
end);
|