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,977 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## semigroups/semirms.gi
|
|
4
|
+
## Copyright (C) 2014-2022 James D. Mitchell
|
|
5
|
+
## Wilf A. Wilson
|
|
6
|
+
##
|
|
7
|
+
## Licensing information can be found in the README file of this package.
|
|
8
|
+
##
|
|
9
|
+
#############################################################################
|
|
10
|
+
##
|
|
11
|
+
|
|
12
|
+
# this file contains methods for every operation/attribute/property that is
|
|
13
|
+
# specific to Rees 0-matrix semigroups.
|
|
14
|
+
|
|
15
|
+
#############################################################################
|
|
16
|
+
## Random semigroups
|
|
17
|
+
#############################################################################
|
|
18
|
+
|
|
19
|
+
InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
|
|
20
|
+
[IsReesMatrixSemigroup, IsList],
|
|
21
|
+
function(_, params)
|
|
22
|
+
local order, i;
|
|
23
|
+
if Length(params) < 1 then # rows I
|
|
24
|
+
params[1] := Random(1, 100);
|
|
25
|
+
elif not IsPosInt(params[1]) then
|
|
26
|
+
return "the 2nd argument (number of rows) must be a positive integer";
|
|
27
|
+
fi;
|
|
28
|
+
if Length(params) < 2 then # cols J
|
|
29
|
+
params[2] := Random(1, 100);
|
|
30
|
+
elif not IsPosInt(params[2]) then
|
|
31
|
+
return "the 3rd argument (number of columns) must be a positive integer";
|
|
32
|
+
fi;
|
|
33
|
+
if Length(params) < 3 then # group
|
|
34
|
+
order := Random(1, 2047);
|
|
35
|
+
i := Random(1, NumberSmallGroups(order));
|
|
36
|
+
params[3] := Range(IsomorphismPermGroup(SmallGroup(order, i)));
|
|
37
|
+
elif not IsPermGroup(params[3]) then
|
|
38
|
+
return "the 4th argument must be a permutation group";
|
|
39
|
+
fi;
|
|
40
|
+
if Length(params) > 3 then
|
|
41
|
+
return Concatenation("expected at most 3 arguments, found ",
|
|
42
|
+
String(Length(params)));
|
|
43
|
+
fi;
|
|
44
|
+
return params;
|
|
45
|
+
end);
|
|
46
|
+
|
|
47
|
+
InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
|
|
48
|
+
[IsReesZeroMatrixSemigroup, IsList],
|
|
49
|
+
{filt, params}
|
|
50
|
+
-> SEMIGROUPS_ProcessRandomArgsCons(IsReesMatrixSemigroup, params));
|
|
51
|
+
|
|
52
|
+
InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
|
|
53
|
+
[IsReesZeroMatrixSemigroup and IsRegularSemigroup, IsList],
|
|
54
|
+
{filt, params}
|
|
55
|
+
-> SEMIGROUPS_ProcessRandomArgsCons(IsReesMatrixSemigroup, params));
|
|
56
|
+
|
|
57
|
+
InstallMethod(RandomSemigroupCons,
|
|
58
|
+
"for IsReesZeroMatrixSemigroup and list",
|
|
59
|
+
[IsReesZeroMatrixSemigroup, IsList],
|
|
60
|
+
function(_, params)
|
|
61
|
+
local I, G, J, mat, i, j;
|
|
62
|
+
|
|
63
|
+
I := [1 .. params[1]];
|
|
64
|
+
J := [1 .. params[2]];
|
|
65
|
+
G := params[3];
|
|
66
|
+
# could add nr connected components
|
|
67
|
+
|
|
68
|
+
mat := List(J, x -> I * 0);
|
|
69
|
+
|
|
70
|
+
for i in I do
|
|
71
|
+
for j in J do
|
|
72
|
+
if Random(1, 2) = 1 then
|
|
73
|
+
mat[j][i] := Random(G);
|
|
74
|
+
fi;
|
|
75
|
+
od;
|
|
76
|
+
od;
|
|
77
|
+
|
|
78
|
+
return ReesZeroMatrixSemigroup(G, mat);
|
|
79
|
+
end);
|
|
80
|
+
|
|
81
|
+
InstallMethod(RandomSemigroupCons,
|
|
82
|
+
"for IsReesMatrixSemigroup and list",
|
|
83
|
+
[IsReesMatrixSemigroup, IsList],
|
|
84
|
+
function(_, params)
|
|
85
|
+
local I, G, J, mat, i, j;
|
|
86
|
+
|
|
87
|
+
I := [1 .. params[1]];
|
|
88
|
+
J := [1 .. params[2]];
|
|
89
|
+
G := params[3];
|
|
90
|
+
|
|
91
|
+
mat := List(J, x -> List(I, x -> ()));
|
|
92
|
+
|
|
93
|
+
for i in I do
|
|
94
|
+
for j in J do
|
|
95
|
+
if Random(1, 2) = 1 then
|
|
96
|
+
mat[j][i] := Random(G);
|
|
97
|
+
fi;
|
|
98
|
+
od;
|
|
99
|
+
od;
|
|
100
|
+
|
|
101
|
+
return ReesMatrixSemigroup(G, mat);
|
|
102
|
+
end);
|
|
103
|
+
|
|
104
|
+
InstallMethod(RandomSemigroupCons,
|
|
105
|
+
"for IsReesZeroMatrixSemigroup and IsRegularSemigroup and list",
|
|
106
|
+
[IsReesZeroMatrixSemigroup and IsRegularSemigroup, IsList],
|
|
107
|
+
function(_, params)
|
|
108
|
+
local I, G, J, mat, i, j;
|
|
109
|
+
|
|
110
|
+
I := [1 .. params[1]];
|
|
111
|
+
J := [1 .. params[2]];
|
|
112
|
+
G := params[3];
|
|
113
|
+
# could add nr connected components
|
|
114
|
+
|
|
115
|
+
mat := List(J, x -> I * 0);
|
|
116
|
+
|
|
117
|
+
if I > J then
|
|
118
|
+
for i in J do
|
|
119
|
+
mat[i][i] := ();
|
|
120
|
+
od;
|
|
121
|
+
for i in [params[2] + 1 .. params[1]] do
|
|
122
|
+
mat[1][i] := ();
|
|
123
|
+
od;
|
|
124
|
+
else
|
|
125
|
+
for i in I do
|
|
126
|
+
mat[i][i] := ();
|
|
127
|
+
od;
|
|
128
|
+
for i in [params[1] + 1 .. params[2]] do
|
|
129
|
+
mat[i][1] := ();
|
|
130
|
+
od;
|
|
131
|
+
fi;
|
|
132
|
+
|
|
133
|
+
for i in I do
|
|
134
|
+
for j in J do
|
|
135
|
+
if Random(1, 2) = 1 then
|
|
136
|
+
mat[j][i] := Random(G);
|
|
137
|
+
fi;
|
|
138
|
+
od;
|
|
139
|
+
od;
|
|
140
|
+
|
|
141
|
+
return ReesZeroMatrixSemigroup(G, mat);
|
|
142
|
+
end);
|
|
143
|
+
|
|
144
|
+
#############################################################################
|
|
145
|
+
## Isomorphisms
|
|
146
|
+
#############################################################################
|
|
147
|
+
|
|
148
|
+
InstallMethod(AsMonoid, "for a Rees matrix semigroup",
|
|
149
|
+
[IsReesMatrixSemigroup], ReturnFail);
|
|
150
|
+
|
|
151
|
+
InstallMethod(AsMonoid, "for a Rees 0-matrix semigroup",
|
|
152
|
+
[IsReesZeroMatrixSemigroup], ReturnFail);
|
|
153
|
+
|
|
154
|
+
InstallMethod(IsomorphismSemigroup,
|
|
155
|
+
"for IsReesMatrixSemigroup and a semigroup",
|
|
156
|
+
[IsReesMatrixSemigroup, IsSemigroup],
|
|
157
|
+
{filt, S} -> IsomorphismReesMatrixSemigroup(S));
|
|
158
|
+
|
|
159
|
+
InstallMethod(IsomorphismSemigroup,
|
|
160
|
+
"for IsReesZeroMatrixSemigroup and a semigroup",
|
|
161
|
+
[IsReesZeroMatrixSemigroup, IsSemigroup],
|
|
162
|
+
{filt, S} -> IsomorphismReesZeroMatrixSemigroup(S));
|
|
163
|
+
|
|
164
|
+
InstallMethod(IsomorphismReesMatrixSemigroup, "for a semigroup",
|
|
165
|
+
[IsSemigroup],
|
|
166
|
+
3, # to beat IsReesMatrixSubsemigroup
|
|
167
|
+
function(S)
|
|
168
|
+
local D, iso, inv;
|
|
169
|
+
|
|
170
|
+
if not IsFinite(S) then
|
|
171
|
+
TryNextMethod();
|
|
172
|
+
elif not IsSimpleSemigroup(S) then
|
|
173
|
+
ErrorNoReturn("the argument (a semigroup) is not simple");
|
|
174
|
+
# TODO(later) is there another method? I.e. can we turn
|
|
175
|
+
# non-simple/non-0-simple semigroups into Rees (0-)matrix semigroups over
|
|
176
|
+
# non-groups?
|
|
177
|
+
fi;
|
|
178
|
+
|
|
179
|
+
D := GreensDClasses(S)[1];
|
|
180
|
+
iso := IsomorphismReesMatrixSemigroup(D);
|
|
181
|
+
inv := InverseGeneralMapping(iso);
|
|
182
|
+
UseIsomorphismRelation(S, Range(iso));
|
|
183
|
+
|
|
184
|
+
# We use object instead of x below to stop some GAP library tests from
|
|
185
|
+
# failing.
|
|
186
|
+
return SemigroupIsomorphismByFunctionNC(S,
|
|
187
|
+
Range(iso),
|
|
188
|
+
object -> object ^ iso,
|
|
189
|
+
object -> object ^ inv);
|
|
190
|
+
end);
|
|
191
|
+
|
|
192
|
+
InstallMethod(IsomorphismReesZeroMatrixSemigroup, "for a semigroup",
|
|
193
|
+
[IsSemigroup],
|
|
194
|
+
function(S)
|
|
195
|
+
local D, map, inj, inv;
|
|
196
|
+
|
|
197
|
+
if not IsFinite(S) then
|
|
198
|
+
TryNextMethod();
|
|
199
|
+
elif not IsZeroSimpleSemigroup(S) then
|
|
200
|
+
ErrorNoReturn("the argument (a semigroup) is not a 0-simple semigroup");
|
|
201
|
+
# TODO(later) is there another method? I.e. can we turn
|
|
202
|
+
# non-simple/non-0-simple semigroups into Rees (0-)matrix semigroups over
|
|
203
|
+
# non-groups?
|
|
204
|
+
fi;
|
|
205
|
+
|
|
206
|
+
D := First(GreensDClasses(S),
|
|
207
|
+
x -> not IsMultiplicativeZero(S, Representative(x)));
|
|
208
|
+
map := SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
|
|
209
|
+
|
|
210
|
+
# the below is necessary since map is not defined on the zero of S
|
|
211
|
+
inj := function(x)
|
|
212
|
+
if x = MultiplicativeZero(S) then
|
|
213
|
+
return MultiplicativeZero(Range(map));
|
|
214
|
+
fi;
|
|
215
|
+
return x ^ map;
|
|
216
|
+
end;
|
|
217
|
+
|
|
218
|
+
inv := function(x)
|
|
219
|
+
if x = MultiplicativeZero(Range(map)) then
|
|
220
|
+
return MultiplicativeZero(S);
|
|
221
|
+
fi;
|
|
222
|
+
return x ^ InverseGeneralMapping(map);
|
|
223
|
+
end;
|
|
224
|
+
|
|
225
|
+
return SemigroupIsomorphismByFunctionNC(S,
|
|
226
|
+
Range(map),
|
|
227
|
+
inj,
|
|
228
|
+
inv);
|
|
229
|
+
end);
|
|
230
|
+
|
|
231
|
+
InstallGlobalFunction(RMSElementNC,
|
|
232
|
+
function(R, i, g, j)
|
|
233
|
+
return Objectify(TypeReesMatrixSemigroupElements(R),
|
|
234
|
+
[i, g, j, Matrix(R)]);
|
|
235
|
+
end);
|
|
236
|
+
|
|
237
|
+
InstallMethod(MultiplicativeZero, "for a Rees 0-matrix semigroup",
|
|
238
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
239
|
+
function(R)
|
|
240
|
+
local super, x, gens, row, col, i;
|
|
241
|
+
|
|
242
|
+
super := ReesMatrixSemigroupOfFamily(FamilyObj(Representative(R)));
|
|
243
|
+
x := MultiplicativeZero(super);
|
|
244
|
+
if (HasIsReesZeroMatrixSemigroup(R) and IsReesZeroMatrixSemigroup(R))
|
|
245
|
+
or x in R then
|
|
246
|
+
return x;
|
|
247
|
+
fi;
|
|
248
|
+
|
|
249
|
+
gens := GeneratorsOfSemigroup(R);
|
|
250
|
+
row := RowOfReesZeroMatrixSemigroupElement(gens[1]);
|
|
251
|
+
col := ColumnOfReesZeroMatrixSemigroupElement(gens[1]);
|
|
252
|
+
for i in [2 .. Length(gens)] do
|
|
253
|
+
x := gens[i];
|
|
254
|
+
if RowOfReesZeroMatrixSemigroupElement(x) <> row or
|
|
255
|
+
ColumnOfReesZeroMatrixSemigroupElement(x) <> col then
|
|
256
|
+
return fail;
|
|
257
|
+
fi;
|
|
258
|
+
od;
|
|
259
|
+
|
|
260
|
+
TryNextMethod();
|
|
261
|
+
end);
|
|
262
|
+
|
|
263
|
+
# same method for ideals
|
|
264
|
+
|
|
265
|
+
InstallMethod(IsomorphismPermGroup,
|
|
266
|
+
"for a subsemigroup of a Rees 0-matrix semigroup",
|
|
267
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
268
|
+
function(S)
|
|
269
|
+
local r, mat, G, map, inv;
|
|
270
|
+
|
|
271
|
+
if not IsGroupAsSemigroup(S) then
|
|
272
|
+
ErrorNoReturn("the underlying semigroup of the argument (a ",
|
|
273
|
+
" subsemigroup of a Rees 0-matrix ",
|
|
274
|
+
"semigroup) does not satisfy IsGroupAsSemigroup");
|
|
275
|
+
fi;
|
|
276
|
+
|
|
277
|
+
r := Representative(S);
|
|
278
|
+
if r![1] = 0 then # special case for the group consisting of 0
|
|
279
|
+
return SemigroupIsomorphismByFunctionNC(S, Group(()), x -> (), x -> r);
|
|
280
|
+
fi;
|
|
281
|
+
|
|
282
|
+
mat := Matrix(ReesMatrixSemigroupOfFamily(FamilyObj(r)));
|
|
283
|
+
G := Group(List(GeneratorsOfSemigroup(S), x -> x![2] * mat[x![3]][x![1]]));
|
|
284
|
+
UseIsomorphismRelation(S, G);
|
|
285
|
+
|
|
286
|
+
map := x -> x![2] * mat[x![3]][x![1]];
|
|
287
|
+
inv := x -> RMSElement(S, r![1], x * mat[r![3]][r![1]] ^ -1, r![3]);
|
|
288
|
+
return SemigroupIsomorphismByFunctionNC(S, G, map, inv);
|
|
289
|
+
end);
|
|
290
|
+
|
|
291
|
+
################################################################################
|
|
292
|
+
# Attributes, operations, and properties
|
|
293
|
+
################################################################################
|
|
294
|
+
|
|
295
|
+
# This method is only required because of some problems in the library code for
|
|
296
|
+
# Rees (0-)matrix semigroups.
|
|
297
|
+
|
|
298
|
+
InstallMethod(Representative,
|
|
299
|
+
"for a Rees 0-matrix subsemigroup with rows, columns and matrix",
|
|
300
|
+
[IsReesZeroMatrixSubsemigroup
|
|
301
|
+
and HasRowsOfReesZeroMatrixSemigroup
|
|
302
|
+
and HasColumnsOfReesZeroMatrixSemigroup
|
|
303
|
+
and HasMatrixOfReesZeroMatrixSemigroup],
|
|
304
|
+
function(R)
|
|
305
|
+
return Objectify(TypeReesMatrixSemigroupElements(R),
|
|
306
|
+
[RowsOfReesZeroMatrixSemigroup(R)[1],
|
|
307
|
+
Representative(UnderlyingSemigroup(R)),
|
|
308
|
+
ColumnsOfReesZeroMatrixSemigroup(R)[1],
|
|
309
|
+
MatrixOfReesZeroMatrixSemigroup(R)]);
|
|
310
|
+
end);
|
|
311
|
+
|
|
312
|
+
# This method is only required because of some problems in the library code for
|
|
313
|
+
# Rees (0-)matrix semigroups.
|
|
314
|
+
|
|
315
|
+
InstallMethod(Representative,
|
|
316
|
+
"for a Rees matrix subsemigroup with rows, columns, and matrix",
|
|
317
|
+
[IsReesMatrixSubsemigroup
|
|
318
|
+
and HasRowsOfReesMatrixSemigroup
|
|
319
|
+
and HasColumnsOfReesMatrixSemigroup
|
|
320
|
+
and HasMatrixOfReesMatrixSemigroup],
|
|
321
|
+
function(R)
|
|
322
|
+
return Objectify(TypeReesMatrixSemigroupElements(R),
|
|
323
|
+
[RowsOfReesMatrixSemigroup(R)[1],
|
|
324
|
+
Representative(UnderlyingSemigroup(R)),
|
|
325
|
+
ColumnsOfReesMatrixSemigroup(R)[1],
|
|
326
|
+
MatrixOfReesMatrixSemigroup(R)]);
|
|
327
|
+
end);
|
|
328
|
+
|
|
329
|
+
# same method for ideals
|
|
330
|
+
|
|
331
|
+
InstallMethod(GroupOfUnits, "for a Rees 0-matrix subsemigroup",
|
|
332
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
333
|
+
function(S)
|
|
334
|
+
local x, U;
|
|
335
|
+
|
|
336
|
+
x := MultiplicativeNeutralElement(S);
|
|
337
|
+
|
|
338
|
+
if MultiplicativeNeutralElement(S) = fail then
|
|
339
|
+
return fail;
|
|
340
|
+
elif IsMultiplicativeZero(S, x) then
|
|
341
|
+
U := Semigroup(x);
|
|
342
|
+
else
|
|
343
|
+
U := Semigroup(RClassNC(S, x), rec(small := true));
|
|
344
|
+
fi;
|
|
345
|
+
SetIsGroupAsSemigroup(U, true);
|
|
346
|
+
return U;
|
|
347
|
+
end);
|
|
348
|
+
|
|
349
|
+
# This method is better than the one for acting semigroups.
|
|
350
|
+
|
|
351
|
+
InstallMethod(Random, "for a Rees 0-matrix semigroup",
|
|
352
|
+
[IsReesZeroMatrixSemigroup],
|
|
353
|
+
3, # to beat the method for regular acting semigroups
|
|
354
|
+
function(R)
|
|
355
|
+
return Objectify(TypeReesMatrixSemigroupElements(R),
|
|
356
|
+
[Random(Rows(R)), Random(UnderlyingSemigroup(R)),
|
|
357
|
+
Random(Columns(R)), Matrix(ParentAttr(R))]);
|
|
358
|
+
end);
|
|
359
|
+
|
|
360
|
+
# TODO(later) a proper method here
|
|
361
|
+
|
|
362
|
+
InstallMethod(IsGeneratorsOfInverseSemigroup,
|
|
363
|
+
"for a collection of Rees 0-matrix semigroup elements",
|
|
364
|
+
[IsReesZeroMatrixSemigroupElementCollection], ReturnFalse);
|
|
365
|
+
|
|
366
|
+
InstallMethod(ViewString,
|
|
367
|
+
"for a Rees 0-matrix subsemigroup ideal with ideal generators",
|
|
368
|
+
[IsReesZeroMatrixSubsemigroup and IsSemigroupIdeal and
|
|
369
|
+
HasGeneratorsOfSemigroupIdeal],
|
|
370
|
+
7, # to beat ViewString for a semigroup ideal with ideal generators
|
|
371
|
+
function(I)
|
|
372
|
+
local str, nrgens;
|
|
373
|
+
|
|
374
|
+
str := "\><";
|
|
375
|
+
|
|
376
|
+
if HasIsCommutative(I) and IsCommutative(I) then
|
|
377
|
+
Append(str, "\>commutative\< ");
|
|
378
|
+
fi;
|
|
379
|
+
|
|
380
|
+
if HasIsZeroSimpleSemigroup(I) and IsZeroSimpleSemigroup(I) then
|
|
381
|
+
Append(str, "\>0-simple\< ");
|
|
382
|
+
elif HasIsSimpleSemigroup(I) and IsSimpleSemigroup(I) then
|
|
383
|
+
Append(str, "\>simple\< ");
|
|
384
|
+
fi;
|
|
385
|
+
|
|
386
|
+
if HasIsInverseSemigroup(I) and IsInverseSemigroup(I) then
|
|
387
|
+
Append(str, "\>inverse\< ");
|
|
388
|
+
elif HasIsRegularSemigroup(I)
|
|
389
|
+
and not (HasIsSimpleSemigroup(I) and IsSimpleSemigroup(I)) then
|
|
390
|
+
if IsRegularSemigroup(I) then
|
|
391
|
+
Append(str, "\>regular\< ");
|
|
392
|
+
else
|
|
393
|
+
Append(str, "\>non-regular\< ");
|
|
394
|
+
fi;
|
|
395
|
+
fi;
|
|
396
|
+
|
|
397
|
+
Append(str, "\>Rees\< \>0-matrix\< \>semigroup\< \>ideal\< ");
|
|
398
|
+
Append(str, "\<with\> ");
|
|
399
|
+
|
|
400
|
+
nrgens := Length(GeneratorsOfSemigroupIdeal(I));
|
|
401
|
+
Append(str, ViewString(nrgens));
|
|
402
|
+
Append(str, "\< generator");
|
|
403
|
+
|
|
404
|
+
if nrgens > 1 or nrgens = 0 then
|
|
405
|
+
Append(str, "s\<");
|
|
406
|
+
else
|
|
407
|
+
Append(str, "\<");
|
|
408
|
+
fi;
|
|
409
|
+
Append(str, ">\<");
|
|
410
|
+
|
|
411
|
+
return str;
|
|
412
|
+
end);
|
|
413
|
+
|
|
414
|
+
InstallMethod(MatrixEntries, "for a Rees matrix semigroup",
|
|
415
|
+
[IsReesMatrixSemigroup],
|
|
416
|
+
function(R)
|
|
417
|
+
return Union(Matrix(R){Columns(R)}{Rows(R)});
|
|
418
|
+
# in case R is a proper subsemigroup of another RMS
|
|
419
|
+
end);
|
|
420
|
+
|
|
421
|
+
InstallMethod(MatrixEntries, "for a Rees 0-matrix semigroup",
|
|
422
|
+
[IsReesZeroMatrixSemigroup],
|
|
423
|
+
function(R)
|
|
424
|
+
local mat, elt, zero, i, j;
|
|
425
|
+
|
|
426
|
+
mat := Matrix(R);
|
|
427
|
+
elt := [];
|
|
428
|
+
zero := false;
|
|
429
|
+
|
|
430
|
+
for i in Rows(R) do
|
|
431
|
+
for j in Columns(R) do
|
|
432
|
+
if mat[j][i] = 0 then
|
|
433
|
+
zero := true;
|
|
434
|
+
else
|
|
435
|
+
AddSet(elt, mat[j][i]);
|
|
436
|
+
fi;
|
|
437
|
+
od;
|
|
438
|
+
od;
|
|
439
|
+
|
|
440
|
+
if zero then
|
|
441
|
+
return Concatenation([0], elt);
|
|
442
|
+
fi;
|
|
443
|
+
return elt;
|
|
444
|
+
end);
|
|
445
|
+
|
|
446
|
+
InstallMethod(GreensHClassOfElement, "for a RZMS, pos int, and pos int",
|
|
447
|
+
[IsReesZeroMatrixSemigroup, IsPosInt, IsPosInt],
|
|
448
|
+
function(R, i, j)
|
|
449
|
+
local rep;
|
|
450
|
+
|
|
451
|
+
rep := RMSElement(R, i, Representative(UnderlyingSemigroup(R)), j);
|
|
452
|
+
return GreensHClassOfElement(R, rep);
|
|
453
|
+
end);
|
|
454
|
+
|
|
455
|
+
InstallMethod(RZMSDigraph, "for a Rees 0-matrix semigroup",
|
|
456
|
+
[IsReesZeroMatrixSemigroup],
|
|
457
|
+
function(R)
|
|
458
|
+
local rows, cols, mat, n, m, nredges, out, gr, i, j;
|
|
459
|
+
|
|
460
|
+
rows := Rows(R);
|
|
461
|
+
cols := Columns(R);
|
|
462
|
+
mat := Matrix(R);
|
|
463
|
+
n := Length(Columns(R));
|
|
464
|
+
m := Length(Rows(R));
|
|
465
|
+
nredges := 0;
|
|
466
|
+
out := List([1 .. m + n], x -> []);
|
|
467
|
+
for i in [1 .. m] do
|
|
468
|
+
for j in [1 .. n] do
|
|
469
|
+
if mat[cols[j]][rows[i]] <> 0 then
|
|
470
|
+
nredges := nredges + 2;
|
|
471
|
+
Add(out[j + m], i);
|
|
472
|
+
Add(out[i], j + m);
|
|
473
|
+
fi;
|
|
474
|
+
od;
|
|
475
|
+
od;
|
|
476
|
+
gr := DigraphNC(out);
|
|
477
|
+
SetIsBipartiteDigraph(gr, true);
|
|
478
|
+
SetDigraphHasLoops(gr, false);
|
|
479
|
+
SetDigraphBicomponents(gr, [[1 .. m], [m + 1 .. m + n]]);
|
|
480
|
+
SetDigraphNrEdges(gr, nredges);
|
|
481
|
+
# SetDigraphVertexLabels(gr, Concatenation(rows, cols));
|
|
482
|
+
return gr;
|
|
483
|
+
end);
|
|
484
|
+
|
|
485
|
+
InstallMethod(RZMSConnectedComponents,
|
|
486
|
+
"for a Rees 0-matrix semigroup",
|
|
487
|
+
[IsReesZeroMatrixSemigroup],
|
|
488
|
+
function(R)
|
|
489
|
+
local gr, comps, new, n, m, i;
|
|
490
|
+
|
|
491
|
+
gr := RZMSDigraph(R);
|
|
492
|
+
comps := DigraphConnectedComponents(gr);
|
|
493
|
+
new := List([1 .. Length(comps.comps)], x -> [[], []]);
|
|
494
|
+
n := Length(Columns(R));
|
|
495
|
+
m := Length(Rows(R));
|
|
496
|
+
|
|
497
|
+
for i in [1 .. m] do
|
|
498
|
+
Add(new[comps.id[i]][1], Rows(R)[i]);
|
|
499
|
+
od;
|
|
500
|
+
for i in [m + 1 .. m + n] do
|
|
501
|
+
Add(new[comps.id[i]][2], Columns(R)[i - m]);
|
|
502
|
+
od;
|
|
503
|
+
return new;
|
|
504
|
+
end);
|
|
505
|
+
|
|
506
|
+
#############################################################################
|
|
507
|
+
## Methods related to inverse semigroups
|
|
508
|
+
#############################################################################
|
|
509
|
+
|
|
510
|
+
InstallMethod(IsInverseSemigroup,
|
|
511
|
+
"for a Rees 0-matrix subsemigroup",
|
|
512
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
513
|
+
function(R)
|
|
514
|
+
local U, elts, mat, row, seen, G, j, i;
|
|
515
|
+
|
|
516
|
+
if not IsReesZeroMatrixSemigroup(R) then
|
|
517
|
+
TryNextMethod();
|
|
518
|
+
fi;
|
|
519
|
+
|
|
520
|
+
U := UnderlyingSemigroup(R);
|
|
521
|
+
|
|
522
|
+
if (HasIsInverseSemigroup(U) and not IsInverseSemigroup(U))
|
|
523
|
+
or (HasIsRegularSemigroup(U) and not IsRegularSemigroup(U))
|
|
524
|
+
or (HasIsMonoidAsSemigroup(U) and not IsMonoidAsSemigroup(U))
|
|
525
|
+
or (HasGroupOfUnits(U) and GroupOfUnits(U) = fail)
|
|
526
|
+
or Length(Columns(R)) <> Length(Rows(R)) then
|
|
527
|
+
return false;
|
|
528
|
+
fi;
|
|
529
|
+
|
|
530
|
+
# Check each row and column of mat contains *exactly* one non-zero entry
|
|
531
|
+
elts := [];
|
|
532
|
+
mat := Matrix(R);
|
|
533
|
+
row := BlistList([1 .. Maximum(Rows(R))], []); # <row[i]> is <true> iff found
|
|
534
|
+
# a non-zero entry in row <i>
|
|
535
|
+
for j in Columns(R) do
|
|
536
|
+
seen := false; # <seen>: <true> iff found a non-zero entry in the col <j>
|
|
537
|
+
for i in Rows(R) do
|
|
538
|
+
if mat[j][i] <> 0 then
|
|
539
|
+
if seen or row[i] then
|
|
540
|
+
return false;
|
|
541
|
+
fi;
|
|
542
|
+
seen := true;
|
|
543
|
+
row[i] := true;
|
|
544
|
+
AddSet(elts, mat[j][i]);
|
|
545
|
+
fi;
|
|
546
|
+
od;
|
|
547
|
+
if not seen then
|
|
548
|
+
return false;
|
|
549
|
+
fi;
|
|
550
|
+
od;
|
|
551
|
+
|
|
552
|
+
# Check that non-zero matrix entries are units of the inverse monoid <U>
|
|
553
|
+
G := GroupOfUnits(U);
|
|
554
|
+
|
|
555
|
+
return G <> fail and ForAll(elts, x -> x in G) and IsInverseSemigroup(U);
|
|
556
|
+
end);
|
|
557
|
+
|
|
558
|
+
InstallMethod(Idempotents,
|
|
559
|
+
"for an inverse Rees 0-matrix subsemigroup",
|
|
560
|
+
[IsReesZeroMatrixSubsemigroup and IsInverseSemigroup],
|
|
561
|
+
function(R)
|
|
562
|
+
local mat, I, star, e, out, k, i, j, x;
|
|
563
|
+
|
|
564
|
+
if not IsReesZeroMatrixSemigroup(R) then
|
|
565
|
+
TryNextMethod();
|
|
566
|
+
fi;
|
|
567
|
+
|
|
568
|
+
mat := Matrix(R);
|
|
569
|
+
I := Rows(R);
|
|
570
|
+
star := EmptyPlist(Maximum(I));
|
|
571
|
+
for i in I do
|
|
572
|
+
for j in Columns(R) do
|
|
573
|
+
if mat[j][i] <> 0 then
|
|
574
|
+
star[i] := j; # <star[i]> is index such that mat[star[i]][i] <> 0
|
|
575
|
+
break;
|
|
576
|
+
fi;
|
|
577
|
+
od;
|
|
578
|
+
od;
|
|
579
|
+
|
|
580
|
+
e := Idempotents(UnderlyingSemigroup(R));
|
|
581
|
+
out := EmptyPlist(NrIdempotents(R));
|
|
582
|
+
out[1] := MultiplicativeZero(R);
|
|
583
|
+
k := 1;
|
|
584
|
+
for i in I do
|
|
585
|
+
for x in e do
|
|
586
|
+
k := k + 1;
|
|
587
|
+
out[k] := RMSElement(R, i, x * mat[star[i]][i] ^ -1, star[i]);
|
|
588
|
+
od;
|
|
589
|
+
od;
|
|
590
|
+
|
|
591
|
+
return out;
|
|
592
|
+
end);
|
|
593
|
+
|
|
594
|
+
# The following works for RZMS's over groups
|
|
595
|
+
|
|
596
|
+
InstallMethod(Idempotents,
|
|
597
|
+
"for a Rees 0-matrix subsemigroup",
|
|
598
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
599
|
+
RankFilter(IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup) -
|
|
600
|
+
RankFilter(IsReesZeroMatrixSubsemigroup) + 2,
|
|
601
|
+
function(R)
|
|
602
|
+
local G, group, iso, inv, mat, out, k, i, j;
|
|
603
|
+
|
|
604
|
+
if not IsReesZeroMatrixSemigroup(R)
|
|
605
|
+
or not IsGroupAsSemigroup(UnderlyingSemigroup(R)) then
|
|
606
|
+
TryNextMethod();
|
|
607
|
+
fi;
|
|
608
|
+
|
|
609
|
+
G := UnderlyingSemigroup(R);
|
|
610
|
+
group := IsGroup(G);
|
|
611
|
+
if not IsGroup(R) then
|
|
612
|
+
iso := IsomorphismPermGroup(G);
|
|
613
|
+
inv := InverseGeneralMapping(iso);
|
|
614
|
+
fi;
|
|
615
|
+
|
|
616
|
+
mat := Matrix(R);
|
|
617
|
+
out := [];
|
|
618
|
+
out[1] := MultiplicativeZero(R);
|
|
619
|
+
k := 1;
|
|
620
|
+
for i in Rows(R) do
|
|
621
|
+
for j in Columns(R) do
|
|
622
|
+
if mat[j][i] <> 0 then
|
|
623
|
+
k := k + 1;
|
|
624
|
+
if group then
|
|
625
|
+
out[k] := RMSElement(R, i, mat[j][i] ^ -1, j);
|
|
626
|
+
else
|
|
627
|
+
out[k] := RMSElement(R, i, ((mat[j][i] ^ iso) ^ -1) ^ inv, j);
|
|
628
|
+
fi;
|
|
629
|
+
fi;
|
|
630
|
+
od;
|
|
631
|
+
od;
|
|
632
|
+
|
|
633
|
+
return out;
|
|
634
|
+
end);
|
|
635
|
+
|
|
636
|
+
InstallMethod(NrIdempotents,
|
|
637
|
+
"for an inverse Rees 0-matrix subsemigroup",
|
|
638
|
+
[IsReesZeroMatrixSubsemigroup and IsInverseSemigroup],
|
|
639
|
+
function(R)
|
|
640
|
+
if not IsReesZeroMatrixSemigroup(R) then
|
|
641
|
+
TryNextMethod();
|
|
642
|
+
fi;
|
|
643
|
+
return NrIdempotents(UnderlyingSemigroup(R)) * Length(Rows(R)) + 1;
|
|
644
|
+
end);
|
|
645
|
+
|
|
646
|
+
# The following works for RZMS's over groups
|
|
647
|
+
|
|
648
|
+
InstallMethod(NrIdempotents,
|
|
649
|
+
"for a Rees 0-matrix subsemigroup",
|
|
650
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
651
|
+
RankFilter(IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup) -
|
|
652
|
+
RankFilter(IsReesZeroMatrixSubsemigroup) + 2,
|
|
653
|
+
function(R)
|
|
654
|
+
local count, mat, i, j;
|
|
655
|
+
|
|
656
|
+
if not IsReesZeroMatrixSemigroup(R)
|
|
657
|
+
or not IsGroupAsSemigroup(UnderlyingSemigroup(R)) then
|
|
658
|
+
TryNextMethod();
|
|
659
|
+
fi;
|
|
660
|
+
|
|
661
|
+
count := 1;
|
|
662
|
+
mat := Matrix(R);
|
|
663
|
+
for i in Rows(R) do
|
|
664
|
+
for j in Columns(R) do
|
|
665
|
+
if mat[j][i] <> 0 then
|
|
666
|
+
count := count + 1;
|
|
667
|
+
fi;
|
|
668
|
+
od;
|
|
669
|
+
od;
|
|
670
|
+
|
|
671
|
+
return count;
|
|
672
|
+
end);
|
|
673
|
+
|
|
674
|
+
#############################################################################
|
|
675
|
+
## Normalizations
|
|
676
|
+
#############################################################################
|
|
677
|
+
|
|
678
|
+
InstallMethod(RZMSNormalization,
|
|
679
|
+
"for a Rees 0-matrix semigroup",
|
|
680
|
+
[IsReesZeroMatrixSemigroup],
|
|
681
|
+
function(R)
|
|
682
|
+
local T, rows, cols, I, L, lookup_cols, lookup_rows, mat, group, one, r, c,
|
|
683
|
+
invert, GT, comp, size, p, rows_unsorted, cols_unsorted, x, j, cols_todo,
|
|
684
|
+
rows_todo, new, S, iso, inv, i, k;
|
|
685
|
+
|
|
686
|
+
T := UnderlyingSemigroup(R);
|
|
687
|
+
|
|
688
|
+
rows := Rows(R);
|
|
689
|
+
cols := Columns(R);
|
|
690
|
+
I := Length(rows);
|
|
691
|
+
L := Length(cols);
|
|
692
|
+
|
|
693
|
+
lookup_cols := EmptyPlist(Maximum(cols));
|
|
694
|
+
for i in [1 .. L] do
|
|
695
|
+
lookup_cols[cols[i]] := i;
|
|
696
|
+
od;
|
|
697
|
+
lookup_rows := EmptyPlist(Maximum(rows));
|
|
698
|
+
for i in [1 .. I] do
|
|
699
|
+
lookup_rows[rows[i]] := i;
|
|
700
|
+
od;
|
|
701
|
+
|
|
702
|
+
mat := Matrix(R);
|
|
703
|
+
group := IsGroupAsSemigroup(T);
|
|
704
|
+
|
|
705
|
+
if group then
|
|
706
|
+
one := MultiplicativeNeutralElement(T);
|
|
707
|
+
r := ListWithIdenticalEntries(I, one);
|
|
708
|
+
c := ListWithIdenticalEntries(L, one);
|
|
709
|
+
# Not every IsGroupAsSemigroup has the usual inverse operation
|
|
710
|
+
if IsGroup(T) then
|
|
711
|
+
invert := InverseOp;
|
|
712
|
+
else
|
|
713
|
+
invert := x -> InversesOfSemigroupElement(T, x)[1];
|
|
714
|
+
fi;
|
|
715
|
+
fi;
|
|
716
|
+
|
|
717
|
+
GT := {x, y} -> y < x;
|
|
718
|
+
|
|
719
|
+
# Sort the connected components of <R> by size (#rows * #columns) descending.
|
|
720
|
+
# This also sends any zero-columns or zero-rows to the end of the new matrix.
|
|
721
|
+
comp := ShallowCopy(RZMSConnectedComponents(R));
|
|
722
|
+
size := List(comp, x -> Length(x[1]) * Length(x[2]));
|
|
723
|
+
SortParallel(size, comp, GT); # comp[1] defines largest connected component.
|
|
724
|
+
p := rec(row := EmptyPlist(I), col := EmptyPlist(I));
|
|
725
|
+
|
|
726
|
+
for k in [1 .. Length(comp)] do
|
|
727
|
+
if size[k] = 0 then
|
|
728
|
+
Append(p.row, comp[k][1]);
|
|
729
|
+
Append(p.col, comp[k][2]);
|
|
730
|
+
continue;
|
|
731
|
+
fi;
|
|
732
|
+
# The rows and columns contained in the <k>^th largest conn. component.
|
|
733
|
+
rows := comp[k][1];
|
|
734
|
+
cols := comp[k][2];
|
|
735
|
+
rows_unsorted := BlistList(rows, rows);
|
|
736
|
+
cols_unsorted := BlistList(cols, cols);
|
|
737
|
+
|
|
738
|
+
# Choose a column with the max number of non-zero entries to go first
|
|
739
|
+
x := List(cols, j -> Number(rows, i -> mat[j][i] <> 0));
|
|
740
|
+
x := Position(x, Maximum(x));
|
|
741
|
+
j := cols[x];
|
|
742
|
+
cols_todo := [j];
|
|
743
|
+
cols_unsorted[x] := false;
|
|
744
|
+
Add(p.col, j);
|
|
745
|
+
|
|
746
|
+
# At each step, for the columns which have just been sorted:
|
|
747
|
+
# 1. It is necessary to identify <rows_todo>, those unsorted rows which have
|
|
748
|
+
# an idempotent in any of the just-sorted columns.
|
|
749
|
+
# 2. When doing this we also order these rows such that they are contiguous.
|
|
750
|
+
# 3. If <T> is a group, then for each of these rows <i> we define the
|
|
751
|
+
# element <r[i]> of <T> which will, in the normalization, ensure that the
|
|
752
|
+
# first non-zero entry of that row is <one>, the identity of <T>.
|
|
753
|
+
# It is necessary to do the same procedure again, swapping rows and columns.
|
|
754
|
+
|
|
755
|
+
while not IsEmpty(cols_todo) do
|
|
756
|
+
rows_todo := [];
|
|
757
|
+
for j in cols_todo do
|
|
758
|
+
x := ListBlist(rows, rows_unsorted);
|
|
759
|
+
for i in x do
|
|
760
|
+
if mat[j][i] <> 0 then
|
|
761
|
+
Add(rows_todo, i);
|
|
762
|
+
rows_unsorted[PositionSorted(rows, i)] := false;
|
|
763
|
+
if group then
|
|
764
|
+
r[i] := c[j] * mat[j][i];
|
|
765
|
+
fi;
|
|
766
|
+
Add(p.row, i);
|
|
767
|
+
fi;
|
|
768
|
+
od;
|
|
769
|
+
od;
|
|
770
|
+
cols_todo := [];
|
|
771
|
+
for i in rows_todo do
|
|
772
|
+
x := ListBlist(cols, cols_unsorted);
|
|
773
|
+
for j in x do
|
|
774
|
+
if mat[j][i] <> 0 then
|
|
775
|
+
Add(cols_todo, j);
|
|
776
|
+
cols_unsorted[PositionSorted(cols, j)] := false;
|
|
777
|
+
if group then
|
|
778
|
+
c[j] := r[i] * invert(mat[j][i]);
|
|
779
|
+
fi;
|
|
780
|
+
Add(p.col, j);
|
|
781
|
+
fi;
|
|
782
|
+
od;
|
|
783
|
+
od;
|
|
784
|
+
od;
|
|
785
|
+
od;
|
|
786
|
+
|
|
787
|
+
rows := Rows(R);
|
|
788
|
+
cols := Columns(R);
|
|
789
|
+
|
|
790
|
+
p.row := List(p.row, x -> lookup_rows[x]);
|
|
791
|
+
p.col := List(p.col, x -> lookup_cols[x]);
|
|
792
|
+
|
|
793
|
+
# p.row takes a row of <R> and gives the corresponding row of <S>.
|
|
794
|
+
# p.row_i is the inverse of this (to avoid inverting repeatedly).
|
|
795
|
+
p.row_i := PermList(p.row);
|
|
796
|
+
p.col_i := PermList(p.col);
|
|
797
|
+
p.row := p.row_i ^ -1;
|
|
798
|
+
p.col := p.col_i ^ -1;
|
|
799
|
+
|
|
800
|
+
# Construct the normalized RZMS <S>.
|
|
801
|
+
new := List(cols, x -> EmptyPlist(I));
|
|
802
|
+
for j in cols do
|
|
803
|
+
for i in rows do
|
|
804
|
+
if mat[j][i] <> 0 and group then
|
|
805
|
+
new[lookup_cols[j] ^ p.col][lookup_rows[i] ^ p.row] :=
|
|
806
|
+
c[j] * mat[j][i] * invert(r[i]);
|
|
807
|
+
else
|
|
808
|
+
new[lookup_cols[j] ^ p.col][lookup_rows[i] ^ p.row] := mat[j][i];
|
|
809
|
+
fi;
|
|
810
|
+
od;
|
|
811
|
+
od;
|
|
812
|
+
S := ReesZeroMatrixSemigroup(T, new);
|
|
813
|
+
|
|
814
|
+
# Construct isomorphisms between <R> and <S>.
|
|
815
|
+
# iso: (i, g, l) -> (i ^ p.row, r[i] * g * c[l] ^ -1, l ^ p.col)
|
|
816
|
+
iso := function(x)
|
|
817
|
+
if x![1] = 0 then
|
|
818
|
+
return MultiplicativeZero(S);
|
|
819
|
+
fi;
|
|
820
|
+
return RMSElement(S, lookup_rows[x![1]] ^ p.row,
|
|
821
|
+
r[x![1]] * x![2] * invert(c[x![3]]),
|
|
822
|
+
lookup_cols[x![3]] ^ p.col);
|
|
823
|
+
end;
|
|
824
|
+
# inv: (i, g, l) -> (a, r[a] ^ -1 * g * c[b], b)
|
|
825
|
+
# where a = i ^ (p.row ^ -1) and b = j ^ (r.col ^ -1)
|
|
826
|
+
inv := function(x)
|
|
827
|
+
if x![1] = 0 then
|
|
828
|
+
return MultiplicativeZero(R);
|
|
829
|
+
fi;
|
|
830
|
+
return RMSElement(R,
|
|
831
|
+
rows[x![1] ^ p.row_i],
|
|
832
|
+
invert(r[rows[x![1] ^ p.row_i]]) * x![2]
|
|
833
|
+
* c[cols[x![3] ^ p.col_i]],
|
|
834
|
+
cols[x![3] ^ p.col_i]);
|
|
835
|
+
end;
|
|
836
|
+
|
|
837
|
+
return SemigroupIsomorphismByFunctionNC(R, S, iso, inv);
|
|
838
|
+
end);
|
|
839
|
+
|
|
840
|
+
# Makes entries in the first row and col of the matrix equal to identity
|
|
841
|
+
|
|
842
|
+
InstallMethod(RMSNormalization,
|
|
843
|
+
"for a Rees matrix semigroup",
|
|
844
|
+
[IsReesMatrixSemigroup],
|
|
845
|
+
function(R)
|
|
846
|
+
local G, invert, new, r, c, S, lookup_rows, lookup_cols, iso, inv, j, i;
|
|
847
|
+
|
|
848
|
+
G := UnderlyingSemigroup(R);
|
|
849
|
+
if not IsGroupAsSemigroup(G) then
|
|
850
|
+
ErrorNoReturn("the underlying semigroup of the argument (a ",
|
|
851
|
+
" subsemigroup of a Rees matrix ",
|
|
852
|
+
"semigroup) does not satisfy IsGroupAsSemigroup");
|
|
853
|
+
fi;
|
|
854
|
+
|
|
855
|
+
if IsGroup(G) then
|
|
856
|
+
invert := InverseOp;
|
|
857
|
+
else
|
|
858
|
+
invert := x -> InversesOfSemigroupElement(G, x)[1];
|
|
859
|
+
fi;
|
|
860
|
+
|
|
861
|
+
new := ShallowCopy(Matrix(R)){Columns(R)}{Rows(R)};
|
|
862
|
+
|
|
863
|
+
# Construct the normalized RMS <S>
|
|
864
|
+
r := List([1 .. Length(Rows(R))], i -> invert(new[1][i]) * new[1][1]);
|
|
865
|
+
c := List([1 .. Length(Columns(R))], j -> invert(new[j][1]));
|
|
866
|
+
for j in [1 .. Length(Columns(R))] do
|
|
867
|
+
new[j] := ShallowCopy(new[j]);
|
|
868
|
+
for i in [1 .. Length(Rows(R))] do
|
|
869
|
+
new[j][i] := c[j] * new[j][i] * r[i];
|
|
870
|
+
od;
|
|
871
|
+
od;
|
|
872
|
+
S := ReesMatrixSemigroup(G, new);
|
|
873
|
+
|
|
874
|
+
lookup_rows := EmptyPlist(Maximum(Rows(R)));
|
|
875
|
+
lookup_cols := EmptyPlist(Maximum(Columns(R)));
|
|
876
|
+
for i in [1 .. Length(Rows(R))] do
|
|
877
|
+
lookup_rows[Rows(R)[i]] := i;
|
|
878
|
+
od;
|
|
879
|
+
for j in [1 .. Length(Columns(R))] do
|
|
880
|
+
lookup_cols[Columns(R)[j]] := j;
|
|
881
|
+
od;
|
|
882
|
+
|
|
883
|
+
# Construct isomorphisms between <R> and <S>
|
|
884
|
+
iso := x -> RMSElement(S, lookup_rows[x![1]],
|
|
885
|
+
invert(r[lookup_rows[x![1]]]) * x![2] *
|
|
886
|
+
invert(c[lookup_cols[x![3]]]),
|
|
887
|
+
lookup_cols[x![3]]);
|
|
888
|
+
inv := x -> RMSElement(R, Rows(R)[x![1]],
|
|
889
|
+
r[x![1]] * x![2] * c[x![3]],
|
|
890
|
+
Columns(R)[x![3]]);
|
|
891
|
+
|
|
892
|
+
return SemigroupIsomorphismByFunctionNC(R, S, iso, inv);
|
|
893
|
+
end);
|
|
894
|
+
|
|
895
|
+
InstallMethod(IsIdempotentGenerated, "for a Rees 0-matrix subsemigroup",
|
|
896
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
897
|
+
function(R)
|
|
898
|
+
local U, N;
|
|
899
|
+
if not IsReesZeroMatrixSemigroup(R) then
|
|
900
|
+
TryNextMethod();
|
|
901
|
+
elif not IsConnectedDigraph(RZMSDigraph(R)) then
|
|
902
|
+
return false;
|
|
903
|
+
fi;
|
|
904
|
+
U := UnderlyingSemigroup(R);
|
|
905
|
+
if not IsGroupAsSemigroup(U) then
|
|
906
|
+
TryNextMethod();
|
|
907
|
+
fi;
|
|
908
|
+
N := Range(RZMSNormalization(R));
|
|
909
|
+
return Semigroup(Filtered(MatrixEntries(N), x -> x <> 0)) = U;
|
|
910
|
+
end);
|
|
911
|
+
|
|
912
|
+
InstallMethod(IsIdempotentGenerated, "for a Rees matrix subsemigroup",
|
|
913
|
+
[IsReesMatrixSubsemigroup],
|
|
914
|
+
function(R)
|
|
915
|
+
local U, N;
|
|
916
|
+
if not IsReesMatrixSemigroup(R) then
|
|
917
|
+
TryNextMethod();
|
|
918
|
+
fi;
|
|
919
|
+
U := UnderlyingSemigroup(R);
|
|
920
|
+
if not IsGroupAsSemigroup(U) then
|
|
921
|
+
TryNextMethod();
|
|
922
|
+
fi;
|
|
923
|
+
N := Range(RMSNormalization(R));
|
|
924
|
+
return Semigroup(MatrixEntries(N)) = U;
|
|
925
|
+
end);
|
|
926
|
+
|
|
927
|
+
InstallMethod(Size, "for a Rees matrix semigroup",
|
|
928
|
+
[IsReesMatrixSemigroup and HasUnderlyingSemigroup and HasRows and
|
|
929
|
+
HasColumns],
|
|
930
|
+
R -> Length(Rows(R)) * Size(UnderlyingSemigroup(R)) * Length(Columns(R)));
|
|
931
|
+
|
|
932
|
+
InstallMethod(Size, "for a Rees 0-matrix semigroup",
|
|
933
|
+
[IsReesZeroMatrixSemigroup and HasUnderlyingSemigroup and HasRows and
|
|
934
|
+
HasColumns],
|
|
935
|
+
function(R)
|
|
936
|
+
return Length(Rows(R)) * Size(UnderlyingSemigroup(R)) * Length(Columns(R))
|
|
937
|
+
+ 1;
|
|
938
|
+
end);
|
|
939
|
+
|
|
940
|
+
#############################################################################
|
|
941
|
+
# Pickler
|
|
942
|
+
#############################################################################
|
|
943
|
+
|
|
944
|
+
SEMIGROUPS.PickleRMSOrRZMS := function(str)
|
|
945
|
+
Assert(1, IsString(str));
|
|
946
|
+
return function(file, x)
|
|
947
|
+
if IO_Write(file, str) = fail
|
|
948
|
+
or IO_Pickle(file, [UnderlyingSemigroup(x), Matrix(x)]) = IO_Error then
|
|
949
|
+
return IO_Error;
|
|
950
|
+
fi;
|
|
951
|
+
return IO_OK;
|
|
952
|
+
end;
|
|
953
|
+
end;
|
|
954
|
+
|
|
955
|
+
InstallMethod(IO_Pickle, "for a Rees matrix semigroup",
|
|
956
|
+
[IsFile, IsReesMatrixSemigroup], SEMIGROUPS.PickleRMSOrRZMS("RMSX"));
|
|
957
|
+
|
|
958
|
+
IO_Unpicklers.RMSX := function(file)
|
|
959
|
+
local x;
|
|
960
|
+
x := IO_Unpickle(file);
|
|
961
|
+
if x = IO_Error then
|
|
962
|
+
return IO_Error;
|
|
963
|
+
fi;
|
|
964
|
+
return ReesMatrixSemigroup(x[1], x[2]);
|
|
965
|
+
end;
|
|
966
|
+
|
|
967
|
+
InstallMethod(IO_Pickle, "for a Rees 0-matrix semigroup",
|
|
968
|
+
[IsFile, IsReesZeroMatrixSemigroup], SEMIGROUPS.PickleRMSOrRZMS("RZMS"));
|
|
969
|
+
|
|
970
|
+
IO_Unpicklers.RZMS := function(file)
|
|
971
|
+
local x;
|
|
972
|
+
x := IO_Unpickle(file);
|
|
973
|
+
if x = IO_Error then
|
|
974
|
+
return IO_Error;
|
|
975
|
+
fi;
|
|
976
|
+
return ReesZeroMatrixSemigroup(x[1], x[2]);
|
|
977
|
+
end;
|