passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-macosx_13_0_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-apple-darwin22-default64-kv10/semigroups.so +0 -0
- gap/pkg/semigroups/config.guess +1807 -0
- gap/pkg/semigroups/config.log +1082 -0
- gap/pkg/semigroups/config.status +1134 -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.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,1467 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## congruences/congrms.gi
|
|
4
|
+
## Copyright (C) 2015-2022 Michael C. Young
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
## This file contains methods for congruences on finite (0-)simple Rees
|
|
11
|
+
## (0-)matrix semigroups, using linked triples. See Howie 3.5-6, and see
|
|
12
|
+
## MT's reports "Computing with Congruences on Finite 0-Simple Semigroups"
|
|
13
|
+
## and MSc thesis "Computing with Semigroup Congruences" chapter 3.
|
|
14
|
+
##
|
|
15
|
+
|
|
16
|
+
# This file is organised as follows:
|
|
17
|
+
# 1. Congruences: representation specific operations/functions
|
|
18
|
+
# 2. Congruences: representation specific constructors
|
|
19
|
+
# 3. Congruences: changing representation, generating pairs
|
|
20
|
+
# 4. Congruences: printing and viewing
|
|
21
|
+
# 5. Congruences: mandatory methods for CanComputeEquivalenceRelationPartition
|
|
22
|
+
# 6. Congruences: non-mandatory methods for
|
|
23
|
+
# CanComputeEquivalenceRelationPartition, where we have a superior method
|
|
24
|
+
# for this particular representation.
|
|
25
|
+
# 7. Equivalence classes: representation specific constructors
|
|
26
|
+
# 8. Equivalence classes: mandatory methods for
|
|
27
|
+
# CanComputeEquivalenceRelationPartition
|
|
28
|
+
# 9. Congruence lattice
|
|
29
|
+
|
|
30
|
+
###############################################################################
|
|
31
|
+
# 1. Congruences: representation specific operations/functions
|
|
32
|
+
###############################################################################
|
|
33
|
+
|
|
34
|
+
InstallMethod(IsLinkedTriple,
|
|
35
|
+
"for Rees matrix semigroup, group, and two lists",
|
|
36
|
+
[IsReesMatrixSemigroup,
|
|
37
|
+
IsGroup, IsDenseList, IsDenseList],
|
|
38
|
+
function(S, n, colBlocks, rowBlocks)
|
|
39
|
+
local mat, block, bi, bj, i, j, u, v, bu, bv;
|
|
40
|
+
# Check the semigroup is valid
|
|
41
|
+
if not IsFinite(S) then
|
|
42
|
+
ErrorNoReturn("the 1st argument (a Rees matrix semigroup) is not finite");
|
|
43
|
+
elif not IsSimpleSemigroup(S) then
|
|
44
|
+
ErrorNoReturn("the 1st argument (a Rees matrix semigroup) is not simple");
|
|
45
|
+
fi;
|
|
46
|
+
mat := Matrix(S);
|
|
47
|
+
# Check axiom (L2) from Howie p.86, then call NC function
|
|
48
|
+
# Go through the column blocks
|
|
49
|
+
for block in colBlocks do
|
|
50
|
+
# Check q-condition for all pairs of columns in this block (L2)
|
|
51
|
+
for bi in [1 .. Size(block)] do
|
|
52
|
+
for bj in [bi + 1 .. Size(block)] do
|
|
53
|
+
i := block[bi];
|
|
54
|
+
j := block[bj];
|
|
55
|
+
# Check all pairs of rows (u,v)
|
|
56
|
+
for u in [1 .. Size(mat)] do
|
|
57
|
+
for v in [u + 1 .. Size(mat)] do
|
|
58
|
+
if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
|
|
59
|
+
in n then
|
|
60
|
+
return false;
|
|
61
|
+
fi;
|
|
62
|
+
od;
|
|
63
|
+
od;
|
|
64
|
+
od;
|
|
65
|
+
od;
|
|
66
|
+
od;
|
|
67
|
+
|
|
68
|
+
# Go through the row blocks
|
|
69
|
+
for block in rowBlocks do
|
|
70
|
+
# Check q-condition for all pairs of rows in this block (L2)
|
|
71
|
+
for bu in [1 .. Size(block)] do
|
|
72
|
+
for bv in [bu + 1 .. Size(block)] do
|
|
73
|
+
u := block[bu];
|
|
74
|
+
v := block[bv];
|
|
75
|
+
# Check all pairs of columns (i,j)
|
|
76
|
+
for i in [1 .. Size(mat[1])] do
|
|
77
|
+
for j in [i + 1 .. Size(mat[1])] do
|
|
78
|
+
if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
|
|
79
|
+
in n then
|
|
80
|
+
return false;
|
|
81
|
+
fi;
|
|
82
|
+
od;
|
|
83
|
+
od;
|
|
84
|
+
od;
|
|
85
|
+
od;
|
|
86
|
+
od;
|
|
87
|
+
return true;
|
|
88
|
+
end);
|
|
89
|
+
|
|
90
|
+
InstallMethod(IsLinkedTriple,
|
|
91
|
+
"for Rees 0-matrix semigroup, group, and two lists",
|
|
92
|
+
[IsReesZeroMatrixSemigroup,
|
|
93
|
+
IsGroup, IsDenseList, IsDenseList],
|
|
94
|
+
function(S, n, colBlocks, rowBlocks)
|
|
95
|
+
local mat, block, i, j, u, v, bi, bj, bu, bv;
|
|
96
|
+
# Check the semigroup is valid
|
|
97
|
+
if not IsFinite(S) then
|
|
98
|
+
ErrorNoReturn("the 1st argument (a Rees 0-matrix semigroup) is not finite");
|
|
99
|
+
elif not IsZeroSimpleSemigroup(S) then
|
|
100
|
+
ErrorNoReturn("the 1st argument (a Rees 0-matrix semigroup) is ",
|
|
101
|
+
"not 0-simple");
|
|
102
|
+
fi;
|
|
103
|
+
mat := Matrix(S);
|
|
104
|
+
# Check axioms (L1) and (L2) from Howie p.86, then call NC function
|
|
105
|
+
# Go through the column blocks
|
|
106
|
+
for block in colBlocks do
|
|
107
|
+
for bj in [2 .. Size(block)] do
|
|
108
|
+
# Check columns have zeroes in all the same rows (L1)
|
|
109
|
+
for u in [1 .. Size(mat)] do
|
|
110
|
+
if (mat[u][block[1]] = 0) <> (mat[u][block[bj]] = 0) then
|
|
111
|
+
return false;
|
|
112
|
+
fi;
|
|
113
|
+
od;
|
|
114
|
+
od;
|
|
115
|
+
# Check q-condition for all pairs of columns in this block (L2)
|
|
116
|
+
for bi in [1 .. Size(block)] do
|
|
117
|
+
for bj in [bi + 1 .. Size(block)] do
|
|
118
|
+
i := block[bi];
|
|
119
|
+
j := block[bj];
|
|
120
|
+
# Check all pairs of rows (u,v)
|
|
121
|
+
for u in [1 .. Size(mat)] do
|
|
122
|
+
if mat[u][i] = 0 then
|
|
123
|
+
continue;
|
|
124
|
+
fi;
|
|
125
|
+
for v in [u + 1 .. Size(mat)] do
|
|
126
|
+
if mat[v][i] = 0 then
|
|
127
|
+
continue;
|
|
128
|
+
fi;
|
|
129
|
+
if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
|
|
130
|
+
in n then
|
|
131
|
+
return false;
|
|
132
|
+
fi;
|
|
133
|
+
od;
|
|
134
|
+
od;
|
|
135
|
+
od;
|
|
136
|
+
od;
|
|
137
|
+
od;
|
|
138
|
+
|
|
139
|
+
# Go through the row blocks
|
|
140
|
+
for block in rowBlocks do
|
|
141
|
+
for bv in [2 .. Size(block)] do
|
|
142
|
+
# Check rows have zeroes in all the same columns (L1)
|
|
143
|
+
for i in [1 .. Size(mat[1])] do
|
|
144
|
+
if (mat[block[1]][i] = 0) <> (mat[block[bv]][i] = 0) then
|
|
145
|
+
return false;
|
|
146
|
+
fi;
|
|
147
|
+
od;
|
|
148
|
+
od;
|
|
149
|
+
# Check q-condition for all pairs of rows in this block (L2)
|
|
150
|
+
for bu in [1 .. Size(block)] do
|
|
151
|
+
for bv in [bu + 1 .. Size(block)] do
|
|
152
|
+
u := block[bu];
|
|
153
|
+
v := block[bv];
|
|
154
|
+
# Check all pairs of columns (i,j)
|
|
155
|
+
for i in [1 .. Size(mat[1])] do
|
|
156
|
+
if mat[u][i] = 0 then
|
|
157
|
+
continue;
|
|
158
|
+
fi;
|
|
159
|
+
for j in [i + 1 .. Size(mat[1])] do
|
|
160
|
+
if mat[u][j] = 0 then
|
|
161
|
+
continue;
|
|
162
|
+
fi;
|
|
163
|
+
if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
|
|
164
|
+
in n then
|
|
165
|
+
return false;
|
|
166
|
+
fi;
|
|
167
|
+
od;
|
|
168
|
+
od;
|
|
169
|
+
od;
|
|
170
|
+
od;
|
|
171
|
+
od;
|
|
172
|
+
return true;
|
|
173
|
+
end);
|
|
174
|
+
|
|
175
|
+
BindGlobal("LinkedElement",
|
|
176
|
+
function(x)
|
|
177
|
+
local mat, i, u, v, j;
|
|
178
|
+
mat := Matrix(ReesMatrixSemigroupOfFamily(FamilyObj(x)));
|
|
179
|
+
i := x[1]; # Column no
|
|
180
|
+
u := x[3]; # Row no
|
|
181
|
+
if IsReesMatrixSemigroupElement(x) then
|
|
182
|
+
# RMS case
|
|
183
|
+
return mat[1][i] * x[2] * mat[u][1];
|
|
184
|
+
else
|
|
185
|
+
# RZMS case
|
|
186
|
+
for v in [1 .. Size(mat)] do
|
|
187
|
+
if mat[v][i] <> 0 then
|
|
188
|
+
break;
|
|
189
|
+
fi;
|
|
190
|
+
od;
|
|
191
|
+
for j in [1 .. Size(mat[1])] do
|
|
192
|
+
if mat[u][j] <> 0 then
|
|
193
|
+
break;
|
|
194
|
+
fi;
|
|
195
|
+
od;
|
|
196
|
+
return mat[v][i] * x[2] * mat[u][j];
|
|
197
|
+
fi;
|
|
198
|
+
end);
|
|
199
|
+
|
|
200
|
+
#############################################################################
|
|
201
|
+
# 2. Congruences: representation specific constructors
|
|
202
|
+
#############################################################################
|
|
203
|
+
|
|
204
|
+
InstallGlobalFunction(RMSCongruenceByLinkedTriple,
|
|
205
|
+
function(S, n, colBlocks, rowBlocks)
|
|
206
|
+
local mat, g;
|
|
207
|
+
mat := Matrix(S);
|
|
208
|
+
g := UnderlyingSemigroup(S);
|
|
209
|
+
|
|
210
|
+
# Basic checks
|
|
211
|
+
if not IsNormal(g, n) then
|
|
212
|
+
ErrorNoReturn("the 2nd argument (a group) is not a normal ",
|
|
213
|
+
"subgroup of the underlying semigroup of the 1st ",
|
|
214
|
+
"argument (a Rees matrix semigroup)");
|
|
215
|
+
elif not IsList(colBlocks) or not ForAll(colBlocks, IsList) then
|
|
216
|
+
ErrorNoReturn("the 3rd argument must be a list of lists");
|
|
217
|
+
elif not IsList(rowBlocks) or not ForAll(rowBlocks, IsList) then
|
|
218
|
+
ErrorNoReturn("the 4th argument must be a list of lists");
|
|
219
|
+
elif SortedList(Flat(colBlocks)) <> [1 .. Size(mat[1])] then
|
|
220
|
+
ErrorNoReturn("the 3rd argument (a list of lists) does not partition ",
|
|
221
|
+
"the columns of the matrix of the 1st argument (a Rees",
|
|
222
|
+
" matrix semigroup)");
|
|
223
|
+
elif SortedList(Flat(rowBlocks)) <> [1 .. Size(mat)] then
|
|
224
|
+
ErrorNoReturn("the 4th argument (a list of lists) does not partition ",
|
|
225
|
+
"the columns of the matrix of the 1st argument (a Rees",
|
|
226
|
+
" matrix semigroup)");
|
|
227
|
+
fi;
|
|
228
|
+
|
|
229
|
+
if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
|
|
230
|
+
return RMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks);
|
|
231
|
+
else
|
|
232
|
+
ErrorNoReturn("invalid triple");
|
|
233
|
+
fi;
|
|
234
|
+
end);
|
|
235
|
+
|
|
236
|
+
InstallGlobalFunction(RZMSCongruenceByLinkedTriple,
|
|
237
|
+
function(S, n, colBlocks, rowBlocks)
|
|
238
|
+
local mat, g;
|
|
239
|
+
mat := Matrix(S);
|
|
240
|
+
g := UnderlyingSemigroup(S);
|
|
241
|
+
|
|
242
|
+
# Basic checks
|
|
243
|
+
if not (IsGroup(g) and IsGroup(n)) then
|
|
244
|
+
ErrorNoReturn("the underlying semigroup of the 1st argument ",
|
|
245
|
+
"(a Rees 0-matrix semigroup) is not a group");
|
|
246
|
+
elif not IsNormal(g, n) then
|
|
247
|
+
ErrorNoReturn("the 2nd argument (a group) is not a normal ",
|
|
248
|
+
"subgroup of the underlying semigroup of the 1st ",
|
|
249
|
+
"argument (a Rees 0-matrix semigroup)");
|
|
250
|
+
elif not IsList(colBlocks) or not ForAll(colBlocks, IsList) then
|
|
251
|
+
ErrorNoReturn("the 3rd argument is not a list of lists");
|
|
252
|
+
elif not IsList(rowBlocks) or not ForAll(rowBlocks, IsList) then
|
|
253
|
+
ErrorNoReturn("the 4th argument is not a list of lists");
|
|
254
|
+
elif SortedList(Flat(colBlocks)) <> [1 .. Size(mat[1])] then
|
|
255
|
+
ErrorNoReturn("the 3rd argument (a list of lists) does not partition ",
|
|
256
|
+
"the columns of the matrix of the 1st argument (a Rees",
|
|
257
|
+
" 0-matrix semigroup)");
|
|
258
|
+
elif SortedList(Flat(rowBlocks)) <> [1 .. Size(mat)] then
|
|
259
|
+
ErrorNoReturn("the 4th argument (a list of lists) does not partition ",
|
|
260
|
+
"the columns of the matrix of the 1st argument (a Rees",
|
|
261
|
+
" 0-matrix semigroup)");
|
|
262
|
+
fi;
|
|
263
|
+
|
|
264
|
+
if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
|
|
265
|
+
return RZMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks);
|
|
266
|
+
else
|
|
267
|
+
ErrorNoReturn("invalid triple");
|
|
268
|
+
fi;
|
|
269
|
+
end);
|
|
270
|
+
|
|
271
|
+
InstallGlobalFunction(RMSCongruenceByLinkedTripleNC,
|
|
272
|
+
function(S, n, colBlocks, rowBlocks)
|
|
273
|
+
local fam, C, colLookup, rowLookup, i, j;
|
|
274
|
+
# Sort the blocks
|
|
275
|
+
colBlocks := SSortedList(colBlocks);
|
|
276
|
+
rowBlocks := SSortedList(rowBlocks);
|
|
277
|
+
# Calculate lookup table for equivalence relations
|
|
278
|
+
colLookup := [];
|
|
279
|
+
rowLookup := [];
|
|
280
|
+
for i in [1 .. Length(colBlocks)] do
|
|
281
|
+
for j in colBlocks[i] do
|
|
282
|
+
colLookup[j] := i;
|
|
283
|
+
od;
|
|
284
|
+
od;
|
|
285
|
+
for i in [1 .. Length(rowBlocks)] do
|
|
286
|
+
for j in rowBlocks[i] do
|
|
287
|
+
rowLookup[j] := i;
|
|
288
|
+
od;
|
|
289
|
+
od;
|
|
290
|
+
# Construct the object
|
|
291
|
+
fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(S)),
|
|
292
|
+
ElementsFamily(FamilyObj(S)));
|
|
293
|
+
C := Objectify(NewType(fam, IsRMSCongruenceByLinkedTriple),
|
|
294
|
+
rec(n := n,
|
|
295
|
+
colBlocks := colBlocks,
|
|
296
|
+
colLookup := colLookup,
|
|
297
|
+
rowBlocks := rowBlocks,
|
|
298
|
+
rowLookup := rowLookup));
|
|
299
|
+
SetSource(C, S);
|
|
300
|
+
SetRange(C, S);
|
|
301
|
+
return C;
|
|
302
|
+
end);
|
|
303
|
+
|
|
304
|
+
InstallGlobalFunction(RZMSCongruenceByLinkedTripleNC,
|
|
305
|
+
function(S, n, colBlocks, rowBlocks)
|
|
306
|
+
local fam, C, colLookup, rowLookup, i, j;
|
|
307
|
+
# Sort the blocks
|
|
308
|
+
colBlocks := SSortedList(colBlocks);
|
|
309
|
+
rowBlocks := SSortedList(rowBlocks);
|
|
310
|
+
# Calculate lookup table for equivalence relations
|
|
311
|
+
colLookup := [];
|
|
312
|
+
rowLookup := [];
|
|
313
|
+
for i in [1 .. Length(colBlocks)] do
|
|
314
|
+
for j in colBlocks[i] do
|
|
315
|
+
colLookup[j] := i;
|
|
316
|
+
od;
|
|
317
|
+
od;
|
|
318
|
+
for i in [1 .. Length(rowBlocks)] do
|
|
319
|
+
for j in rowBlocks[i] do
|
|
320
|
+
rowLookup[j] := i;
|
|
321
|
+
od;
|
|
322
|
+
od;
|
|
323
|
+
# Construct the object
|
|
324
|
+
fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(S)),
|
|
325
|
+
ElementsFamily(FamilyObj(S)));
|
|
326
|
+
C := Objectify(NewType(fam, IsRZMSCongruenceByLinkedTriple),
|
|
327
|
+
rec(n := n,
|
|
328
|
+
colBlocks := colBlocks,
|
|
329
|
+
colLookup := colLookup,
|
|
330
|
+
rowBlocks := rowBlocks,
|
|
331
|
+
rowLookup := rowLookup));
|
|
332
|
+
SetSource(C, S);
|
|
333
|
+
SetRange(C, S);
|
|
334
|
+
return C;
|
|
335
|
+
end);
|
|
336
|
+
|
|
337
|
+
###############################################################################
|
|
338
|
+
# 3. Congruences: changing representation, generating pairs
|
|
339
|
+
###############################################################################
|
|
340
|
+
|
|
341
|
+
InstallMethod(GeneratingPairsOfMagmaCongruence,
|
|
342
|
+
"for Rees matrix semigroup congruence by linked triple",
|
|
343
|
+
[IsRMSCongruenceByLinkedTriple],
|
|
344
|
+
function(C)
|
|
345
|
+
local S, G, m, pairs, n_gens, col_pairs, bl, j, row_pairs, max, n, cp, rp,
|
|
346
|
+
pair_no, r, c;
|
|
347
|
+
S := Range(C);
|
|
348
|
+
G := UnderlyingSemigroup(S);
|
|
349
|
+
m := Matrix(S);
|
|
350
|
+
pairs := [];
|
|
351
|
+
|
|
352
|
+
# Normal subgroup elements to identify with id
|
|
353
|
+
n_gens := GeneratorsOfSemigroup(C!.n);
|
|
354
|
+
|
|
355
|
+
# Pairs that generate the columns relation
|
|
356
|
+
col_pairs := [];
|
|
357
|
+
for bl in C!.colBlocks do
|
|
358
|
+
for j in [2 .. Size(bl)] do
|
|
359
|
+
Add(col_pairs, [bl[1], bl[j]]);
|
|
360
|
+
od;
|
|
361
|
+
od;
|
|
362
|
+
|
|
363
|
+
# Pairs that generate the rows relation
|
|
364
|
+
row_pairs := [];
|
|
365
|
+
for bl in C!.rowBlocks do
|
|
366
|
+
for j in [2 .. Size(bl)] do
|
|
367
|
+
Add(row_pairs, [bl[1], bl[j]]);
|
|
368
|
+
od;
|
|
369
|
+
od;
|
|
370
|
+
|
|
371
|
+
# Collate into RMS element pairs
|
|
372
|
+
max := Maximum(Length(n_gens), Length(col_pairs), Length(row_pairs));
|
|
373
|
+
pairs := EmptyPlist(max);
|
|
374
|
+
# Set default values in case a list has length 0
|
|
375
|
+
n := One(G);
|
|
376
|
+
cp := [1, 1];
|
|
377
|
+
rp := [1, 1];
|
|
378
|
+
# Iterate through all 3 lists together
|
|
379
|
+
for pair_no in [1 .. max] do
|
|
380
|
+
# If any list has run out, just keep using the last entry or default value
|
|
381
|
+
if pair_no <= Length(n_gens) then
|
|
382
|
+
n := n_gens[pair_no];
|
|
383
|
+
fi;
|
|
384
|
+
if pair_no <= Length(col_pairs) then
|
|
385
|
+
cp := col_pairs[pair_no];
|
|
386
|
+
fi;
|
|
387
|
+
if pair_no <= Length(row_pairs) then
|
|
388
|
+
rp := row_pairs[pair_no];
|
|
389
|
+
fi;
|
|
390
|
+
# Choose r and c s.t. m[r][cp[1]] and m[rp[1]][c] are both non-zero
|
|
391
|
+
# (since there are no zeroes, we can just use 1 for both)
|
|
392
|
+
r := 1;
|
|
393
|
+
c := 1;
|
|
394
|
+
# Make the pair and add it
|
|
395
|
+
pairs[pair_no] :=
|
|
396
|
+
[RMSElement(S, cp[1], m[r][cp[1]] ^ -1 * n * m[rp[1]][c] ^ -1, rp[1]),
|
|
397
|
+
RMSElement(S, cp[2], m[r][cp[2]] ^ -1 * m[rp[2]][c] ^ -1, rp[2])];
|
|
398
|
+
od;
|
|
399
|
+
return pairs;
|
|
400
|
+
end);
|
|
401
|
+
|
|
402
|
+
InstallMethod(GeneratingPairsOfMagmaCongruence,
|
|
403
|
+
"for Rees 0-matrix semigroup congruence by linked triple",
|
|
404
|
+
[IsRZMSCongruenceByLinkedTriple],
|
|
405
|
+
function(C)
|
|
406
|
+
local S, G, m, pairs, n_gens, col_pairs, bl, j, row_pairs, max, n, cp, rp,
|
|
407
|
+
pair_no, r, c;
|
|
408
|
+
S := Range(C);
|
|
409
|
+
G := UnderlyingSemigroup(S);
|
|
410
|
+
m := Matrix(S);
|
|
411
|
+
pairs := [];
|
|
412
|
+
|
|
413
|
+
# Normal subgroup elements to identify with id
|
|
414
|
+
n_gens := GeneratorsOfSemigroup(C!.n);
|
|
415
|
+
|
|
416
|
+
# Pairs that generate the columns relation
|
|
417
|
+
col_pairs := [];
|
|
418
|
+
for bl in C!.colBlocks do
|
|
419
|
+
for j in [2 .. Size(bl)] do
|
|
420
|
+
Add(col_pairs, [bl[1], bl[j]]);
|
|
421
|
+
od;
|
|
422
|
+
od;
|
|
423
|
+
|
|
424
|
+
# Pairs that generate the rows relation
|
|
425
|
+
row_pairs := [];
|
|
426
|
+
for bl in C!.rowBlocks do
|
|
427
|
+
for j in [2 .. Size(bl)] do
|
|
428
|
+
Add(row_pairs, [bl[1], bl[j]]);
|
|
429
|
+
od;
|
|
430
|
+
od;
|
|
431
|
+
|
|
432
|
+
# Collate into RMS element pairs
|
|
433
|
+
max := Maximum(Length(n_gens), Length(col_pairs), Length(row_pairs));
|
|
434
|
+
pairs := EmptyPlist(max);
|
|
435
|
+
# Set default values in case a list has length 0
|
|
436
|
+
n := One(G);
|
|
437
|
+
cp := [1, 1];
|
|
438
|
+
rp := [1, 1];
|
|
439
|
+
# Iterate through all 3 lists together
|
|
440
|
+
for pair_no in [1 .. max] do
|
|
441
|
+
# If any list has run out, just keep using the last entry or default value
|
|
442
|
+
if pair_no <= Length(n_gens) then
|
|
443
|
+
n := n_gens[pair_no];
|
|
444
|
+
fi;
|
|
445
|
+
if pair_no <= Length(col_pairs) then
|
|
446
|
+
cp := col_pairs[pair_no];
|
|
447
|
+
fi;
|
|
448
|
+
if pair_no <= Length(row_pairs) then
|
|
449
|
+
rp := row_pairs[pair_no];
|
|
450
|
+
fi;
|
|
451
|
+
# Choose r and c s.t. m[r][cp[1]] and m[rp[1]][c] are both non-zero
|
|
452
|
+
r := First([1 .. Length(m)], r -> m[r][cp[1]] <> 0);
|
|
453
|
+
c := First([1 .. Length(m[1])], c -> m[rp[1]][c] <> 0);
|
|
454
|
+
# Make the pair and add it
|
|
455
|
+
pairs[pair_no] :=
|
|
456
|
+
[RMSElement(S, cp[1], m[r][cp[1]] ^ -1 * n * m[rp[1]][c] ^ -1, rp[1]),
|
|
457
|
+
RMSElement(S, cp[2], m[r][cp[2]] ^ -1 * m[rp[2]][c] ^ -1, rp[2])];
|
|
458
|
+
od;
|
|
459
|
+
return pairs;
|
|
460
|
+
end);
|
|
461
|
+
|
|
462
|
+
InstallMethod(SemigroupCongruenceByGeneratingPairs,
|
|
463
|
+
"for Rees matrix semigroup and list of pairs",
|
|
464
|
+
[IsReesMatrixSemigroup, IsHomogeneousList],
|
|
465
|
+
ToBeat([IsReesMatrixSemigroup, IsHomogeneousList],
|
|
466
|
+
[IsSemigroup and CanUseLibsemigroupsCongruences, IsList and IsEmpty],
|
|
467
|
+
[IsSimpleSemigroup, IsHomogeneousList])
|
|
468
|
+
+
|
|
469
|
+
ToBeat([IsSimpleSemigroup, IsHomogeneousList],
|
|
470
|
+
[IsSemigroup and CanUseLibsemigroupsCongruences,
|
|
471
|
+
IsList and IsEmpty]),
|
|
472
|
+
function(S, pairs)
|
|
473
|
+
local g, mat, colLookup, rowLookup, n, C, pair, v, j;
|
|
474
|
+
|
|
475
|
+
g := UnderlyingSemigroup(S);
|
|
476
|
+
mat := Matrix(S);
|
|
477
|
+
|
|
478
|
+
# Union-Find data structure for the column and row equivalences
|
|
479
|
+
colLookup := PartitionDS(IsPartitionDS, Size(mat[1]));
|
|
480
|
+
rowLookup := PartitionDS(IsPartitionDS, Size(mat));
|
|
481
|
+
|
|
482
|
+
# Normal subgroup
|
|
483
|
+
n := Subgroup(g, []);
|
|
484
|
+
|
|
485
|
+
for pair in pairs do
|
|
486
|
+
# If this pair adds no information, ignore it
|
|
487
|
+
if pair[1] = pair[2] then
|
|
488
|
+
continue;
|
|
489
|
+
fi;
|
|
490
|
+
|
|
491
|
+
# Associate the columns and rows
|
|
492
|
+
Unite(colLookup, pair[1][1], pair[2][1]);
|
|
493
|
+
Unite(rowLookup, pair[1][3], pair[2][3]);
|
|
494
|
+
|
|
495
|
+
# Associate group entries in the normal subgroup
|
|
496
|
+
n := ClosureGroup(n, LinkedElement(pair[1]) * LinkedElement(pair[2]) ^ -1);
|
|
497
|
+
|
|
498
|
+
# Ensure linkedness
|
|
499
|
+
for v in [2 .. Size(mat)] do
|
|
500
|
+
n := ClosureGroup(n, mat[1][pair[1][1]]
|
|
501
|
+
* mat[v][pair[1][1]] ^ -1
|
|
502
|
+
* mat[v][pair[2][1]]
|
|
503
|
+
* mat[1][pair[2][1]] ^ -1);
|
|
504
|
+
od;
|
|
505
|
+
for j in [2 .. Size(mat[1])] do
|
|
506
|
+
n := ClosureGroup(n, mat[pair[1][3]][1]
|
|
507
|
+
* mat[pair[2][3]][1] ^ -1
|
|
508
|
+
* mat[pair[2][3]][j]
|
|
509
|
+
* mat[pair[1][3]][j] ^ -1);
|
|
510
|
+
od;
|
|
511
|
+
od;
|
|
512
|
+
|
|
513
|
+
# Make n normal
|
|
514
|
+
n := NormalClosure(g, n);
|
|
515
|
+
C := RMSCongruenceByLinkedTriple(S,
|
|
516
|
+
n,
|
|
517
|
+
PartsOfPartitionDS(colLookup),
|
|
518
|
+
PartsOfPartitionDS(rowLookup));
|
|
519
|
+
SetGeneratingPairsOfMagmaCongruence(C, pairs);
|
|
520
|
+
return C;
|
|
521
|
+
end);
|
|
522
|
+
|
|
523
|
+
InstallMethod(SemigroupCongruenceByGeneratingPairs,
|
|
524
|
+
"for a Rees 0-matrix semigroup and list of pairs",
|
|
525
|
+
[IsReesZeroMatrixSemigroup, IsHomogeneousList],
|
|
526
|
+
ToBeat([IsReesZeroMatrixSemigroup, IsHomogeneousList],
|
|
527
|
+
[IsSemigroup and CanUseLibsemigroupsCongruences, IsList and IsEmpty],
|
|
528
|
+
[IsZeroSimpleSemigroup, IsHomogeneousList])
|
|
529
|
+
+
|
|
530
|
+
ToBeat([IsZeroSimpleSemigroup, IsHomogeneousList],
|
|
531
|
+
[IsSemigroup and CanUseLibsemigroupsCongruences,
|
|
532
|
+
IsList and IsEmpty]),
|
|
533
|
+
function(S, pairs)
|
|
534
|
+
local g, mat, colLookup, rowLookup, n, u, i, C, pair, v, j;
|
|
535
|
+
|
|
536
|
+
g := UnderlyingSemigroup(S);
|
|
537
|
+
mat := Matrix(S);
|
|
538
|
+
|
|
539
|
+
# Union-Find data structure for the column and row equivalences
|
|
540
|
+
colLookup := PartitionDS(IsPartitionDS, Size(mat[1]));
|
|
541
|
+
rowLookup := PartitionDS(IsPartitionDS, Size(mat));
|
|
542
|
+
|
|
543
|
+
# Normal subgroup
|
|
544
|
+
n := Subgroup(g, []);
|
|
545
|
+
|
|
546
|
+
for pair in pairs do
|
|
547
|
+
# If this pair adds no information, ignore it
|
|
548
|
+
if pair[1] = pair[2] then
|
|
549
|
+
continue;
|
|
550
|
+
fi;
|
|
551
|
+
|
|
552
|
+
# Does this relate any non-zero elements to zero?
|
|
553
|
+
if pair[1] = MultiplicativeZero(S)
|
|
554
|
+
or pair[2] = MultiplicativeZero(S)
|
|
555
|
+
or ForAny([1 .. Size(mat)],
|
|
556
|
+
u -> (mat[u][pair[1][1]] = 0)
|
|
557
|
+
<> (mat[u][pair[2][1]] = 0))
|
|
558
|
+
or ForAny([1 .. Size(mat[1])],
|
|
559
|
+
i -> (mat[pair[1][3]][i] = 0)
|
|
560
|
+
<> (mat[pair[2][3]][i] = 0)) then
|
|
561
|
+
return UniversalSemigroupCongruence(S);
|
|
562
|
+
fi;
|
|
563
|
+
|
|
564
|
+
# Associate the columns and rows
|
|
565
|
+
Unite(colLookup, pair[1][1], pair[2][1]);
|
|
566
|
+
Unite(rowLookup, pair[1][3], pair[2][3]);
|
|
567
|
+
|
|
568
|
+
# Associate group entries in the normal subgroup
|
|
569
|
+
n := ClosureGroup(n, LinkedElement(pair[1]) * LinkedElement(pair[2]) ^ -1);
|
|
570
|
+
|
|
571
|
+
# Ensure linkedness
|
|
572
|
+
u := PositionProperty([1 .. Size(mat)], u -> mat[u][pair[1][1]] <> 0);
|
|
573
|
+
for v in [u + 1 .. Size(mat)] do
|
|
574
|
+
if mat[v][pair[1][1]] = 0 then
|
|
575
|
+
continue;
|
|
576
|
+
fi;
|
|
577
|
+
n := ClosureGroup(n, mat[u][pair[1][1]]
|
|
578
|
+
* mat[v][pair[1][1]] ^ -1
|
|
579
|
+
* mat[v][pair[2][1]]
|
|
580
|
+
* mat[u][pair[2][1]] ^ -1);
|
|
581
|
+
od;
|
|
582
|
+
i := PositionProperty([1 .. Size(mat[1])], k -> mat[pair[1][3]][k] <> 0);
|
|
583
|
+
for j in [i + 1 .. Size(mat[1])] do
|
|
584
|
+
if mat[pair[1][3]][j] = 0 then
|
|
585
|
+
continue;
|
|
586
|
+
fi;
|
|
587
|
+
n := ClosureGroup(n, mat[pair[1][3]][i]
|
|
588
|
+
* mat[pair[2][3]][i] ^ -1
|
|
589
|
+
* mat[pair[2][3]][j]
|
|
590
|
+
* mat[pair[1][3]][j] ^ -1);
|
|
591
|
+
od;
|
|
592
|
+
od;
|
|
593
|
+
|
|
594
|
+
n := NormalClosure(g, n);
|
|
595
|
+
C := RZMSCongruenceByLinkedTriple(S,
|
|
596
|
+
n,
|
|
597
|
+
PartsOfPartitionDS(colLookup),
|
|
598
|
+
PartsOfPartitionDS(rowLookup));
|
|
599
|
+
SetGeneratingPairsOfMagmaCongruence(C, pairs);
|
|
600
|
+
return C;
|
|
601
|
+
end);
|
|
602
|
+
|
|
603
|
+
#############################################################################
|
|
604
|
+
# 4. Congruences: printing and viewing
|
|
605
|
+
#############################################################################
|
|
606
|
+
|
|
607
|
+
InstallMethod(ViewObj,
|
|
608
|
+
"for Rees (0-)matrix semigroup congruence by linked triple",
|
|
609
|
+
[IsRMSOrRZMSCongruenceByLinkedTriple],
|
|
610
|
+
function(C)
|
|
611
|
+
Print("<semigroup congruence over ");
|
|
612
|
+
ViewObj(Range(C));
|
|
613
|
+
Print(" with linked triple (",
|
|
614
|
+
StructureDescription(C!.n:short), ",",
|
|
615
|
+
Size(C!.colBlocks), ",",
|
|
616
|
+
Size(C!.rowBlocks), ")>");
|
|
617
|
+
end);
|
|
618
|
+
|
|
619
|
+
#############################################################################
|
|
620
|
+
# 5. Congruences: mandatory methods for CanComputeEquivalenceRelationPartition
|
|
621
|
+
#############################################################################
|
|
622
|
+
|
|
623
|
+
InstallMethod(EquivalenceRelationPartitionWithSingletons,
|
|
624
|
+
"for a Rees (0-)matrix semigroup congruence by linked triple",
|
|
625
|
+
[IsRMSOrRZMSCongruenceByLinkedTriple],
|
|
626
|
+
function(C)
|
|
627
|
+
local S, n, elms, table, next, part, class, i, x;
|
|
628
|
+
|
|
629
|
+
S := Range(C);
|
|
630
|
+
n := Size(S);
|
|
631
|
+
elms := EnumeratorCanonical(S);
|
|
632
|
+
table := EmptyPlist(n);
|
|
633
|
+
next := 1;
|
|
634
|
+
part := [];
|
|
635
|
+
for i in [1 .. n] do
|
|
636
|
+
if not IsBound(table[i]) then
|
|
637
|
+
class := ImagesElm(C, elms[i]);
|
|
638
|
+
for x in class do
|
|
639
|
+
table[PositionCanonical(S, x)] := next;
|
|
640
|
+
od;
|
|
641
|
+
Add(part, class);
|
|
642
|
+
next := next + 1;
|
|
643
|
+
fi;
|
|
644
|
+
od;
|
|
645
|
+
SetEquivalenceRelationCanonicalLookup(C, table);
|
|
646
|
+
return part;
|
|
647
|
+
end);
|
|
648
|
+
|
|
649
|
+
InstallMethod(ImagesElm,
|
|
650
|
+
"for Rees matrix semigroup congruence by linked triple and element",
|
|
651
|
+
[IsRMSCongruenceByLinkedTriple, IsReesMatrixSemigroupElement],
|
|
652
|
+
function(C, x)
|
|
653
|
+
local S, mat, images, i, a, u, j, v, nElm, b;
|
|
654
|
+
S := Range(C);
|
|
655
|
+
mat := Matrix(S);
|
|
656
|
+
if not x in S then
|
|
657
|
+
ErrorNoReturn("the 2nd argument (an element of a Rees matrix ",
|
|
658
|
+
"semigroup) does not belong to the range of the ",
|
|
659
|
+
"1st argument (a congruence)");
|
|
660
|
+
fi;
|
|
661
|
+
# List of all elements congruent to x under C
|
|
662
|
+
images := [];
|
|
663
|
+
# Read the element as (i,a,u)
|
|
664
|
+
i := x[1];
|
|
665
|
+
a := x[2];
|
|
666
|
+
u := x[3];
|
|
667
|
+
# Construct congruent elements as (j,b,v)
|
|
668
|
+
for j in C!.colBlocks[C!.colLookup[i]] do
|
|
669
|
+
for v in C!.rowBlocks[C!.rowLookup[u]] do
|
|
670
|
+
for nElm in C!.n do
|
|
671
|
+
# Might be better to use congruence classes after all
|
|
672
|
+
b := mat[1][j] ^ -1 * nElm * mat[1][i] * a * mat[u][1]
|
|
673
|
+
* mat[v][1] ^ -1;
|
|
674
|
+
Add(images, RMSElement(S, j, b, v));
|
|
675
|
+
od;
|
|
676
|
+
od;
|
|
677
|
+
od;
|
|
678
|
+
return images;
|
|
679
|
+
end);
|
|
680
|
+
|
|
681
|
+
InstallMethod(ImagesElm,
|
|
682
|
+
"for Rees 0-matrix semigroup congruence by linked triple and element",
|
|
683
|
+
[IsRZMSCongruenceByLinkedTriple, IsReesZeroMatrixSemigroupElement],
|
|
684
|
+
function(C, x)
|
|
685
|
+
local S, mat, images, i, a, u, row, col, j, b, v, nElm;
|
|
686
|
+
S := Range(C);
|
|
687
|
+
mat := Matrix(S);
|
|
688
|
+
if not x in S then
|
|
689
|
+
ErrorNoReturn("the 2nd argument (an element of a Rees 0-matrix ",
|
|
690
|
+
"semigroup) does not belong to the range of the ",
|
|
691
|
+
"1st argument (a congruence)");
|
|
692
|
+
fi;
|
|
693
|
+
# Special case for 0
|
|
694
|
+
if x = MultiplicativeZero(S) then
|
|
695
|
+
return [x];
|
|
696
|
+
fi;
|
|
697
|
+
# List of all elements congruent to x under C
|
|
698
|
+
images := [];
|
|
699
|
+
# Read the element as (i,a,u)
|
|
700
|
+
i := x[1];
|
|
701
|
+
a := x[2];
|
|
702
|
+
u := x[3];
|
|
703
|
+
# Find a non-zero row for this class of columns
|
|
704
|
+
for row in [1 .. Size(mat)] do
|
|
705
|
+
if mat[row][i] <> 0 then
|
|
706
|
+
break;
|
|
707
|
+
fi;
|
|
708
|
+
od;
|
|
709
|
+
# Find a non-zero column for this class of rows
|
|
710
|
+
for col in [1 .. Size(mat[1])] do
|
|
711
|
+
if mat[u][col] <> 0 then
|
|
712
|
+
break;
|
|
713
|
+
fi;
|
|
714
|
+
od;
|
|
715
|
+
|
|
716
|
+
# Construct congruent elements as (j,b,v)
|
|
717
|
+
for j in C!.colBlocks[C!.colLookup[i]] do
|
|
718
|
+
for v in C!.rowBlocks[C!.rowLookup[u]] do
|
|
719
|
+
for nElm in C!.n do
|
|
720
|
+
# Might be better to use congruence classes after all
|
|
721
|
+
b := mat[row][j] ^ -1
|
|
722
|
+
* nElm
|
|
723
|
+
* mat[row][i]
|
|
724
|
+
* a
|
|
725
|
+
* mat[u][col]
|
|
726
|
+
* mat[v][col] ^ -1;
|
|
727
|
+
Add(images, RMSElement(S, j, b, v));
|
|
728
|
+
od;
|
|
729
|
+
od;
|
|
730
|
+
od;
|
|
731
|
+
return images;
|
|
732
|
+
end);
|
|
733
|
+
|
|
734
|
+
InstallMethod(CongruenceTestMembershipNC,
|
|
735
|
+
"for RMS congruence by linked triple and two RMS elements",
|
|
736
|
+
[IsRMSCongruenceByLinkedTriple,
|
|
737
|
+
IsReesMatrixSemigroupElement, IsReesMatrixSemigroupElement],
|
|
738
|
+
function(C, lhop, rhop)
|
|
739
|
+
local i, a, u, j, b, v, mat, gpElm;
|
|
740
|
+
# Read the elements as (i,a,u) and (j,b,v)
|
|
741
|
+
i := lhop[1];
|
|
742
|
+
a := lhop[2];
|
|
743
|
+
u := lhop[3];
|
|
744
|
+
j := rhop[1];
|
|
745
|
+
b := rhop[2];
|
|
746
|
+
v := rhop[3];
|
|
747
|
+
|
|
748
|
+
# First, the columns and rows must be related
|
|
749
|
+
if C!.colLookup[i] <> C!.colLookup[j] or
|
|
750
|
+
C!.rowLookup[u] <> C!.rowLookup[v] then
|
|
751
|
+
return false;
|
|
752
|
+
fi;
|
|
753
|
+
|
|
754
|
+
# Finally, check Lemma 3.5.6(2) in Howie, with row 1 and column 1
|
|
755
|
+
mat := Matrix(Range(C));
|
|
756
|
+
gpElm := mat[1][i] * a * mat[u][1] * Inverse(mat[1][j] * b * mat[v][1]);
|
|
757
|
+
return gpElm in C!.n;
|
|
758
|
+
end);
|
|
759
|
+
|
|
760
|
+
InstallMethod(CongruenceTestMembershipNC,
|
|
761
|
+
"for RZMS congruence by linked triple and two RZMS elements",
|
|
762
|
+
[IsRZMSCongruenceByLinkedTriple,
|
|
763
|
+
IsReesZeroMatrixSemigroupElement, IsReesZeroMatrixSemigroupElement],
|
|
764
|
+
function(C, lhop, rhop)
|
|
765
|
+
local S, i, a, u, j, b, v, mat, rows, cols, col, row, gpElm;
|
|
766
|
+
S := Range(C);
|
|
767
|
+
|
|
768
|
+
# Handling the case when one or more of the pair are zero
|
|
769
|
+
if lhop = rhop then
|
|
770
|
+
return true;
|
|
771
|
+
elif lhop = MultiplicativeZero(S) or rhop = MultiplicativeZero(S) then
|
|
772
|
+
return false;
|
|
773
|
+
fi;
|
|
774
|
+
|
|
775
|
+
# Read the elements as (i,a,u) and (j,b,v)
|
|
776
|
+
i := lhop[1];
|
|
777
|
+
a := lhop[2];
|
|
778
|
+
u := lhop[3];
|
|
779
|
+
j := rhop[1];
|
|
780
|
+
b := rhop[2];
|
|
781
|
+
v := rhop[3];
|
|
782
|
+
|
|
783
|
+
# First, the columns and rows must be related
|
|
784
|
+
if C!.colLookup[i] <> C!.colLookup[j] or
|
|
785
|
+
C!.rowLookup[u] <> C!.rowLookup[v] then
|
|
786
|
+
return false;
|
|
787
|
+
fi;
|
|
788
|
+
|
|
789
|
+
# Finally, check Lemma 3.5.6(2) in Howie
|
|
790
|
+
mat := Matrix(S);
|
|
791
|
+
rows := mat;
|
|
792
|
+
cols := TransposedMat(mat);
|
|
793
|
+
# Pick a valid column and row
|
|
794
|
+
col := PositionProperty(rows[u], x -> x <> 0);
|
|
795
|
+
row := PositionProperty(cols[i], x -> x <> 0);
|
|
796
|
+
gpElm := mat[row][i] * a * mat[u][col] *
|
|
797
|
+
Inverse(mat[row][j] * b * mat[v][col]);
|
|
798
|
+
return gpElm in C!.n;
|
|
799
|
+
end);
|
|
800
|
+
|
|
801
|
+
########################################################################
|
|
802
|
+
# 6. Congruences: non-mandatory methods for
|
|
803
|
+
# CanComputeEquivalenceRelationPartition, where we have a superior method
|
|
804
|
+
# for this particular representation.
|
|
805
|
+
########################################################################
|
|
806
|
+
|
|
807
|
+
# Comparison operators
|
|
808
|
+
|
|
809
|
+
InstallMethod(\=,
|
|
810
|
+
"for Rees (0-)matrix semigroup congruences by linked triple",
|
|
811
|
+
[IsRMSOrRZMSCongruenceByLinkedTriple, IsRMSOrRZMSCongruenceByLinkedTriple],
|
|
812
|
+
function(lhop, rhop)
|
|
813
|
+
return(Range(lhop) = Range(rhop) and
|
|
814
|
+
lhop!.n = rhop!.n and
|
|
815
|
+
lhop!.colBlocks = rhop!.colBlocks and
|
|
816
|
+
lhop!.rowBlocks = rhop!.rowBlocks);
|
|
817
|
+
end);
|
|
818
|
+
|
|
819
|
+
InstallMethod(IsSubrelation,
|
|
820
|
+
"for Rees (0-)matrix semigroup congruences by linked triple",
|
|
821
|
+
[IsRMSOrRZMSCongruenceByLinkedTriple, IsRMSOrRZMSCongruenceByLinkedTriple],
|
|
822
|
+
function(lhop, rhop)
|
|
823
|
+
# Tests whether rhop is a subcongruence of lhop
|
|
824
|
+
if Range(lhop) <> Range(rhop) then
|
|
825
|
+
Error("the 1st and 2nd arguments are congruences over different",
|
|
826
|
+
" semigroups");
|
|
827
|
+
fi;
|
|
828
|
+
return IsSubgroup(lhop!.n, rhop!.n)
|
|
829
|
+
and ForAll(rhop!.colBlocks,
|
|
830
|
+
b2 -> ForAny(lhop!.colBlocks, b1 -> IsSubset(b1, b2)))
|
|
831
|
+
and ForAll(rhop!.rowBlocks,
|
|
832
|
+
b2 -> ForAny(lhop!.rowBlocks, b1 -> IsSubset(b1, b2)));
|
|
833
|
+
end);
|
|
834
|
+
|
|
835
|
+
# EquivalenceClasses
|
|
836
|
+
|
|
837
|
+
InstallMethod(EquivalenceClasses,
|
|
838
|
+
"for Rees matrix semigroup congruence by linked triple",
|
|
839
|
+
[IsRMSCongruenceByLinkedTriple],
|
|
840
|
+
function(C)
|
|
841
|
+
local list, S, g, n, colBlocks, rowBlocks, colClass, rowClass, rep, x;
|
|
842
|
+
list := [];
|
|
843
|
+
S := Range(C);
|
|
844
|
+
g := UnderlyingSemigroup(S);
|
|
845
|
+
n := C!.n;
|
|
846
|
+
colBlocks := C!.colBlocks;
|
|
847
|
+
rowBlocks := C!.rowBlocks;
|
|
848
|
+
for colClass in [1 .. Size(colBlocks)] do
|
|
849
|
+
for rowClass in [1 .. Size(rowBlocks)] do
|
|
850
|
+
for rep in List(RightCosets(g, n), Representative) do
|
|
851
|
+
x := RMSElement(S,
|
|
852
|
+
colBlocks[colClass][1],
|
|
853
|
+
rep,
|
|
854
|
+
rowBlocks[rowClass][1]);
|
|
855
|
+
Add(list, EquivalenceClassOfElement(C, x));
|
|
856
|
+
od;
|
|
857
|
+
od;
|
|
858
|
+
od;
|
|
859
|
+
return list;
|
|
860
|
+
end);
|
|
861
|
+
|
|
862
|
+
InstallMethod(EquivalenceClasses,
|
|
863
|
+
"for Rees 0-matrix semigroup congruence by linked triple",
|
|
864
|
+
[IsRZMSCongruenceByLinkedTriple],
|
|
865
|
+
function(C)
|
|
866
|
+
local list, S, g, n, colBlocks, rowBlocks, colClass, rowClass, rep, x;
|
|
867
|
+
list := [];
|
|
868
|
+
S := Range(C);
|
|
869
|
+
g := UnderlyingSemigroup(S);
|
|
870
|
+
n := C!.n;
|
|
871
|
+
colBlocks := C!.colBlocks;
|
|
872
|
+
rowBlocks := C!.rowBlocks;
|
|
873
|
+
for colClass in [1 .. Size(colBlocks)] do
|
|
874
|
+
for rowClass in [1 .. Size(rowBlocks)] do
|
|
875
|
+
for rep in List(RightCosets(g, n), Representative) do
|
|
876
|
+
x := RMSElement(S,
|
|
877
|
+
colBlocks[colClass][1],
|
|
878
|
+
rep,
|
|
879
|
+
rowBlocks[rowClass][1]);
|
|
880
|
+
Add(list, EquivalenceClassOfElement(C, x));
|
|
881
|
+
od;
|
|
882
|
+
od;
|
|
883
|
+
od;
|
|
884
|
+
# Add the zero class
|
|
885
|
+
Add(list, EquivalenceClassOfElement(C, MultiplicativeZero(S)));
|
|
886
|
+
return list;
|
|
887
|
+
end);
|
|
888
|
+
|
|
889
|
+
InstallMethod(NrEquivalenceClasses,
|
|
890
|
+
"for Rees matrix semigroup congruence by linked triple",
|
|
891
|
+
[IsRMSCongruenceByLinkedTriple],
|
|
892
|
+
function(C)
|
|
893
|
+
local S, g;
|
|
894
|
+
S := Range(C);
|
|
895
|
+
g := UnderlyingSemigroup(S);
|
|
896
|
+
return(Index(g, C!.n) # Number of cosets of n
|
|
897
|
+
* Size(C!.colBlocks) # Number of column blocks
|
|
898
|
+
* Size(C!.rowBlocks)); # Number of row blocks
|
|
899
|
+
end);
|
|
900
|
+
|
|
901
|
+
InstallMethod(NrEquivalenceClasses,
|
|
902
|
+
"for Rees 0-matrix semigroup congruence by linked triple",
|
|
903
|
+
[IsRZMSCongruenceByLinkedTriple],
|
|
904
|
+
function(C)
|
|
905
|
+
local S, g;
|
|
906
|
+
S := Range(C);
|
|
907
|
+
g := UnderlyingSemigroup(S);
|
|
908
|
+
return(Index(g, C!.n) # Number of cosets of n
|
|
909
|
+
* Size(C!.colBlocks) # Number of column blocks
|
|
910
|
+
* Size(C!.rowBlocks) # Number of row blocks
|
|
911
|
+
+ 1); # Class containing zero
|
|
912
|
+
end);
|
|
913
|
+
|
|
914
|
+
# Algebraic operators
|
|
915
|
+
|
|
916
|
+
InstallMethod(JoinSemigroupCongruences,
|
|
917
|
+
"for two Rees matrix semigroup congruences by linked triple",
|
|
918
|
+
[IsRMSCongruenceByLinkedTriple, IsRMSCongruenceByLinkedTriple],
|
|
919
|
+
function(lhop, rhop)
|
|
920
|
+
local gens, n, colBlocks, rowBlocks, block, b1, j, pos;
|
|
921
|
+
if Range(lhop) <> Range(rhop) then
|
|
922
|
+
ErrorNoReturn("cannot form the join of congruences over different",
|
|
923
|
+
" semigroups");
|
|
924
|
+
fi;
|
|
925
|
+
# n is the product of the normal subgroups
|
|
926
|
+
gens := Concatenation(GeneratorsOfGroup(lhop!.n), GeneratorsOfGroup(rhop!.n));
|
|
927
|
+
n := Subgroup(UnderlyingSemigroup(Range(lhop)), gens);
|
|
928
|
+
# Calculate the join of the column and row relations
|
|
929
|
+
colBlocks := List(lhop!.colBlocks, ShallowCopy);
|
|
930
|
+
rowBlocks := List(lhop!.rowBlocks, ShallowCopy);
|
|
931
|
+
for block in rhop!.colBlocks do
|
|
932
|
+
b1 := PositionProperty(colBlocks, cb -> block[1] in cb);
|
|
933
|
+
for j in [2 .. Size(block)] do
|
|
934
|
+
if not block[j] in colBlocks[b1] then
|
|
935
|
+
# Combine the classes
|
|
936
|
+
pos := PositionProperty(colBlocks, cb -> block[j] in cb);
|
|
937
|
+
Append(colBlocks[b1], colBlocks[pos]);
|
|
938
|
+
Unbind(colBlocks[pos]);
|
|
939
|
+
fi;
|
|
940
|
+
od;
|
|
941
|
+
colBlocks := Compacted(colBlocks);
|
|
942
|
+
od;
|
|
943
|
+
for block in rhop!.rowBlocks do
|
|
944
|
+
b1 := PositionProperty(rowBlocks, rb -> block[1] in rb);
|
|
945
|
+
for j in [2 .. Size(block)] do
|
|
946
|
+
if not block[j] in rowBlocks[b1] then
|
|
947
|
+
# Combine the classes
|
|
948
|
+
pos := PositionProperty(rowBlocks, rb -> block[j] in rb);
|
|
949
|
+
Append(rowBlocks[b1], rowBlocks[pos]);
|
|
950
|
+
Unbind(rowBlocks[pos]);
|
|
951
|
+
fi;
|
|
952
|
+
od;
|
|
953
|
+
rowBlocks := Compacted(rowBlocks);
|
|
954
|
+
od;
|
|
955
|
+
colBlocks := SortedList(List(colBlocks, SortedList));
|
|
956
|
+
rowBlocks := SortedList(List(rowBlocks, SortedList));
|
|
957
|
+
# Make the congruence and return it
|
|
958
|
+
return RMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
|
|
959
|
+
end);
|
|
960
|
+
|
|
961
|
+
InstallMethod(JoinSemigroupCongruences,
|
|
962
|
+
"for two Rees 0-matrix semigroup congruences by linked triple",
|
|
963
|
+
[IsRZMSCongruenceByLinkedTriple, IsRZMSCongruenceByLinkedTriple],
|
|
964
|
+
function(lhop, rhop)
|
|
965
|
+
local gens, n, colBlocks, rowBlocks, block, b1, j, pos;
|
|
966
|
+
if Range(lhop) <> Range(rhop) then
|
|
967
|
+
ErrorNoReturn("cannot form the join of congruences over different",
|
|
968
|
+
" semigroups");
|
|
969
|
+
fi;
|
|
970
|
+
# n is the product of the normal subgroups
|
|
971
|
+
gens := Concatenation(GeneratorsOfGroup(lhop!.n), GeneratorsOfGroup(rhop!.n));
|
|
972
|
+
n := Subgroup(UnderlyingSemigroup(Range(lhop)), gens);
|
|
973
|
+
# Calculate the join of the column and row relations
|
|
974
|
+
colBlocks := List(lhop!.colBlocks, ShallowCopy);
|
|
975
|
+
rowBlocks := List(lhop!.rowBlocks, ShallowCopy);
|
|
976
|
+
for block in rhop!.colBlocks do
|
|
977
|
+
b1 := PositionProperty(colBlocks, cb -> block[1] in cb);
|
|
978
|
+
for j in [2 .. Size(block)] do
|
|
979
|
+
if not block[j] in colBlocks[b1] then
|
|
980
|
+
# Combine the classes
|
|
981
|
+
pos := PositionProperty(colBlocks, cb -> block[j] in cb);
|
|
982
|
+
Append(colBlocks[b1], colBlocks[pos]);
|
|
983
|
+
Unbind(colBlocks[pos]);
|
|
984
|
+
fi;
|
|
985
|
+
od;
|
|
986
|
+
colBlocks := Compacted(colBlocks);
|
|
987
|
+
od;
|
|
988
|
+
for block in rhop!.rowBlocks do
|
|
989
|
+
b1 := PositionProperty(rowBlocks, rb -> block[1] in rb);
|
|
990
|
+
for j in [2 .. Size(block)] do
|
|
991
|
+
if not block[j] in rowBlocks[b1] then
|
|
992
|
+
# Combine the classes
|
|
993
|
+
pos := PositionProperty(rowBlocks, rb -> block[j] in rb);
|
|
994
|
+
Append(rowBlocks[b1], rowBlocks[pos]);
|
|
995
|
+
Unbind(rowBlocks[pos]);
|
|
996
|
+
fi;
|
|
997
|
+
od;
|
|
998
|
+
rowBlocks := Compacted(rowBlocks);
|
|
999
|
+
od;
|
|
1000
|
+
colBlocks := SortedList(List(colBlocks, SortedList));
|
|
1001
|
+
rowBlocks := SortedList(List(rowBlocks, SortedList));
|
|
1002
|
+
# Make the congruence and return it
|
|
1003
|
+
return RZMSCongruenceByLinkedTriple(Range(lhop), n, colBlocks, rowBlocks);
|
|
1004
|
+
end);
|
|
1005
|
+
|
|
1006
|
+
InstallMethod(MeetSemigroupCongruences,
|
|
1007
|
+
"for two Rees matrix semigroup congruences by linked triple",
|
|
1008
|
+
[IsRMSCongruenceByLinkedTriple, IsRMSCongruenceByLinkedTriple],
|
|
1009
|
+
function(lhop, rhop)
|
|
1010
|
+
local n, colBlocks, cols, rowBlocks, rows, i, block, j, u, v;
|
|
1011
|
+
if Range(lhop) <> Range(rhop) then
|
|
1012
|
+
ErrorNoReturn("cannot form the meet of congruences over different",
|
|
1013
|
+
" semigroups");
|
|
1014
|
+
fi;
|
|
1015
|
+
# n is the intersection of the two normal subgroups
|
|
1016
|
+
n := Intersection(lhop!.n, rhop!.n);
|
|
1017
|
+
# Calculate the intersection of the column and row relations
|
|
1018
|
+
colBlocks := [];
|
|
1019
|
+
cols := [1 .. Size(lhop!.colLookup)];
|
|
1020
|
+
rowBlocks := [];
|
|
1021
|
+
rows := [1 .. Size(lhop!.rowLookup)];
|
|
1022
|
+
for i in [1 .. Size(cols)] do
|
|
1023
|
+
if cols[i] = 0 then
|
|
1024
|
+
continue;
|
|
1025
|
+
fi;
|
|
1026
|
+
block := Intersection(lhop!.colBlocks[lhop!.colLookup[i]],
|
|
1027
|
+
rhop!.colBlocks[rhop!.colLookup[i]]);
|
|
1028
|
+
for j in block do
|
|
1029
|
+
cols[j] := 0;
|
|
1030
|
+
od;
|
|
1031
|
+
Add(colBlocks, block);
|
|
1032
|
+
od;
|
|
1033
|
+
for u in [1 .. Size(rows)] do
|
|
1034
|
+
if rows[u] = 0 then
|
|
1035
|
+
continue;
|
|
1036
|
+
fi;
|
|
1037
|
+
block := Intersection(lhop!.rowBlocks[lhop!.rowLookup[u]],
|
|
1038
|
+
rhop!.rowBlocks[rhop!.rowLookup[u]]);
|
|
1039
|
+
for v in block do
|
|
1040
|
+
rows[v] := 0;
|
|
1041
|
+
od;
|
|
1042
|
+
Add(rowBlocks, block);
|
|
1043
|
+
od;
|
|
1044
|
+
# Make the congruence and return it
|
|
1045
|
+
return RMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
|
|
1046
|
+
end);
|
|
1047
|
+
|
|
1048
|
+
InstallMethod(MeetSemigroupCongruences,
|
|
1049
|
+
"for two Rees 0-matrix semigroup congruences by linked triple",
|
|
1050
|
+
[IsRZMSCongruenceByLinkedTriple, IsRZMSCongruenceByLinkedTriple],
|
|
1051
|
+
function(lhop, rhop)
|
|
1052
|
+
local n, colBlocks, cols, rowBlocks, rows, i, block, j, u, v;
|
|
1053
|
+
if Range(lhop) <> Range(rhop) then
|
|
1054
|
+
ErrorNoReturn("cannot form the meet of congruences over different",
|
|
1055
|
+
" semigroups");
|
|
1056
|
+
fi;
|
|
1057
|
+
# n is the intersection of the two normal subgroups
|
|
1058
|
+
n := Intersection(lhop!.n, rhop!.n);
|
|
1059
|
+
# Calculate the intersection of the column and row relations
|
|
1060
|
+
colBlocks := [];
|
|
1061
|
+
cols := [1 .. Size(lhop!.colLookup)];
|
|
1062
|
+
rowBlocks := [];
|
|
1063
|
+
rows := [1 .. Size(lhop!.rowLookup)];
|
|
1064
|
+
for i in [1 .. Size(cols)] do
|
|
1065
|
+
if cols[i] = 0 then
|
|
1066
|
+
continue;
|
|
1067
|
+
fi;
|
|
1068
|
+
block := Intersection(lhop!.colBlocks[lhop!.colLookup[i]],
|
|
1069
|
+
rhop!.colBlocks[rhop!.colLookup[i]]);
|
|
1070
|
+
for j in block do
|
|
1071
|
+
cols[j] := 0;
|
|
1072
|
+
od;
|
|
1073
|
+
Add(colBlocks, block);
|
|
1074
|
+
od;
|
|
1075
|
+
for u in [1 .. Size(rows)] do
|
|
1076
|
+
if rows[u] = 0 then
|
|
1077
|
+
continue;
|
|
1078
|
+
fi;
|
|
1079
|
+
block := Intersection(lhop!.rowBlocks[lhop!.rowLookup[u]],
|
|
1080
|
+
rhop!.rowBlocks[rhop!.rowLookup[u]]);
|
|
1081
|
+
for v in block do
|
|
1082
|
+
rows[v] := 0;
|
|
1083
|
+
od;
|
|
1084
|
+
Add(rowBlocks, block);
|
|
1085
|
+
od;
|
|
1086
|
+
# Make the congruence and return it
|
|
1087
|
+
return RZMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
|
|
1088
|
+
end);
|
|
1089
|
+
|
|
1090
|
+
###############################################################################
|
|
1091
|
+
# 8. Equivalence classes: mandatory methods for
|
|
1092
|
+
# CanComputeEquivalenceRelationPartition
|
|
1093
|
+
###############################################################################
|
|
1094
|
+
|
|
1095
|
+
InstallMethod(RMSCongruenceClassByLinkedTriple,
|
|
1096
|
+
"for semigroup congruence by linked triple, a coset and two positive integers",
|
|
1097
|
+
[IsRMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
|
|
1098
|
+
function(C, nCoset, colClass, rowClass)
|
|
1099
|
+
local g;
|
|
1100
|
+
g := UnderlyingSemigroup(Range(C));
|
|
1101
|
+
if ActingDomain(nCoset) <> C!.n or not IsSubset(g, nCoset) then
|
|
1102
|
+
ErrorNoReturn("the 2nd argument (a right coset) is not a coset of the",
|
|
1103
|
+
" normal subgroup of defining the 1st argument (a ",
|
|
1104
|
+
"congruence)");
|
|
1105
|
+
elif not colClass in [1 .. Size(C!.colBlocks)] then
|
|
1106
|
+
ErrorNoReturn("the 3rd argument (a pos. int.) is out of range");
|
|
1107
|
+
elif not rowClass in [1 .. Size(C!.rowBlocks)] then
|
|
1108
|
+
ErrorNoReturn("the 4th argument (a pos. int.) is out of range");
|
|
1109
|
+
fi;
|
|
1110
|
+
return RMSCongruenceClassByLinkedTripleNC(C, nCoset, colClass, rowClass);
|
|
1111
|
+
end);
|
|
1112
|
+
|
|
1113
|
+
InstallMethod(RZMSCongruenceClassByLinkedTriple,
|
|
1114
|
+
"for semigroup congruence by linked triple, a coset and two positive integers",
|
|
1115
|
+
[IsRZMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
|
|
1116
|
+
function(C, nCoset, colClass, rowClass)
|
|
1117
|
+
local g;
|
|
1118
|
+
g := UnderlyingSemigroup(Range(C));
|
|
1119
|
+
if ActingDomain(nCoset) <> C!.n or not IsSubset(g, nCoset) then
|
|
1120
|
+
ErrorNoReturn("the 2nd argument (a right coset) is not a coset of the",
|
|
1121
|
+
" normal subgroup of defining the 1st argument (a ",
|
|
1122
|
+
"congruence)");
|
|
1123
|
+
elif not colClass in [1 .. Size(C!.colBlocks)] then
|
|
1124
|
+
ErrorNoReturn("the 3rd argument (a pos. int.) is out of range");
|
|
1125
|
+
elif not rowClass in [1 .. Size(C!.rowBlocks)] then
|
|
1126
|
+
ErrorNoReturn("the 4th argument (a pos. int.) is out of range");
|
|
1127
|
+
fi;
|
|
1128
|
+
return RZMSCongruenceClassByLinkedTripleNC(C, nCoset, colClass, rowClass);
|
|
1129
|
+
end);
|
|
1130
|
+
|
|
1131
|
+
InstallMethod(RMSCongruenceClassByLinkedTripleNC,
|
|
1132
|
+
"for semigroup congruence by linked triple, a coset and two positive integers",
|
|
1133
|
+
[IsRMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
|
|
1134
|
+
function(C, nCoset, colClass, rowClass)
|
|
1135
|
+
local fam, class;
|
|
1136
|
+
fam := FamilyObj(Range(C));
|
|
1137
|
+
class := Objectify(NewType(fam, IsRMSCongruenceClassByLinkedTriple),
|
|
1138
|
+
rec(nCoset := nCoset,
|
|
1139
|
+
colClass := colClass,
|
|
1140
|
+
rowClass := rowClass));
|
|
1141
|
+
SetParentAttr(class, Range(C));
|
|
1142
|
+
SetEquivalenceClassRelation(class, C);
|
|
1143
|
+
return class;
|
|
1144
|
+
end);
|
|
1145
|
+
|
|
1146
|
+
InstallMethod(RZMSCongruenceClassByLinkedTripleNC,
|
|
1147
|
+
"for semigroup congruence by linked triple, a coset and two positive integers",
|
|
1148
|
+
[IsRZMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
|
|
1149
|
+
function(C, nCoset, colClass, rowClass)
|
|
1150
|
+
local fam, class;
|
|
1151
|
+
fam := FamilyObj(Range(C));
|
|
1152
|
+
class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
|
|
1153
|
+
rec(nCoset := nCoset,
|
|
1154
|
+
colClass := colClass,
|
|
1155
|
+
rowClass := rowClass));
|
|
1156
|
+
SetParentAttr(class, Range(C));
|
|
1157
|
+
SetEquivalenceClassRelation(class, C);
|
|
1158
|
+
return class;
|
|
1159
|
+
end);
|
|
1160
|
+
|
|
1161
|
+
###############################################################################
|
|
1162
|
+
# 7. Equivalence classes - mandatory methods for
|
|
1163
|
+
# CanComputeEquivalenceRelationPartition
|
|
1164
|
+
###############################################################################
|
|
1165
|
+
|
|
1166
|
+
InstallMethod(EquivalenceClassOfElementNC,
|
|
1167
|
+
"for Rees matrix semigroup congruence by linked triple and element",
|
|
1168
|
+
[IsRMSCongruenceByLinkedTriple, IsReesMatrixSemigroupElement],
|
|
1169
|
+
function(C, x)
|
|
1170
|
+
local fam, nCoset, colClass, rowClass, class;
|
|
1171
|
+
fam := CollectionsFamily(FamilyObj(x));
|
|
1172
|
+
nCoset := RightCoset(C!.n, LinkedElement(x));
|
|
1173
|
+
colClass := C!.colLookup[x[1]];
|
|
1174
|
+
rowClass := C!.rowLookup[x[3]];
|
|
1175
|
+
class := Objectify(NewType(fam, IsRMSCongruenceClassByLinkedTriple),
|
|
1176
|
+
rec(nCoset := nCoset,
|
|
1177
|
+
colClass := colClass,
|
|
1178
|
+
rowClass := rowClass));
|
|
1179
|
+
SetParentAttr(class, Range(C));
|
|
1180
|
+
SetEquivalenceClassRelation(class, C);
|
|
1181
|
+
SetRepresentative(class, x);
|
|
1182
|
+
return class;
|
|
1183
|
+
end);
|
|
1184
|
+
|
|
1185
|
+
InstallMethod(EquivalenceClassOfElementNC,
|
|
1186
|
+
"for Rees 0-matrix semigroup congruence by linked triple and element",
|
|
1187
|
+
[IsRZMSCongruenceByLinkedTriple, IsReesZeroMatrixSemigroupElement],
|
|
1188
|
+
function(C, x)
|
|
1189
|
+
local fam, class, nCoset, colClass, rowClass;
|
|
1190
|
+
fam := CollectionsFamily(FamilyObj(x));
|
|
1191
|
+
if x = MultiplicativeZero(Range(C)) then
|
|
1192
|
+
class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
|
|
1193
|
+
rec(nCoset := 0));
|
|
1194
|
+
else
|
|
1195
|
+
nCoset := RightCoset(C!.n, LinkedElement(x));
|
|
1196
|
+
colClass := C!.colLookup[x[1]];
|
|
1197
|
+
rowClass := C!.rowLookup[x[3]];
|
|
1198
|
+
class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
|
|
1199
|
+
rec(nCoset := nCoset,
|
|
1200
|
+
colClass := colClass,
|
|
1201
|
+
rowClass := rowClass));
|
|
1202
|
+
fi;
|
|
1203
|
+
SetParentAttr(class, Range(C));
|
|
1204
|
+
SetEquivalenceClassRelation(class, C);
|
|
1205
|
+
SetRepresentative(class, x);
|
|
1206
|
+
return class;
|
|
1207
|
+
end);
|
|
1208
|
+
|
|
1209
|
+
###############################################################################
|
|
1210
|
+
# 7. Equivalence classes - superior representation specific methods
|
|
1211
|
+
###############################################################################
|
|
1212
|
+
|
|
1213
|
+
InstallMethod(\in,
|
|
1214
|
+
"for Rees matrix semigroup element and a congruence class by linked triple",
|
|
1215
|
+
[IsReesMatrixSemigroupElement, IsRMSCongruenceClassByLinkedTriple],
|
|
1216
|
+
function(x, class)
|
|
1217
|
+
local S, C;
|
|
1218
|
+
C := EquivalenceClassRelation(class);
|
|
1219
|
+
S := Range(C);
|
|
1220
|
+
return(x in S and
|
|
1221
|
+
C!.colLookup[x[1]] = class!.colClass and
|
|
1222
|
+
C!.rowLookup[x[3]] = class!.rowClass and
|
|
1223
|
+
LinkedElement(x) in class!.nCoset);
|
|
1224
|
+
end);
|
|
1225
|
+
|
|
1226
|
+
InstallMethod(\in,
|
|
1227
|
+
"for Rees 0-matrix semigroup element and a congruence class by linked triple",
|
|
1228
|
+
[IsReesZeroMatrixSemigroupElement, IsRZMSCongruenceClassByLinkedTriple],
|
|
1229
|
+
function(x, class)
|
|
1230
|
+
local S, C;
|
|
1231
|
+
C := EquivalenceClassRelation(class);
|
|
1232
|
+
S := Range(C);
|
|
1233
|
+
# Special case for 0 and {0}
|
|
1234
|
+
if class!.nCoset = 0 then
|
|
1235
|
+
return x = MultiplicativeZero(S);
|
|
1236
|
+
elif IsMultiplicativeZero(S, x) then
|
|
1237
|
+
return false;
|
|
1238
|
+
fi;
|
|
1239
|
+
# Otherwise
|
|
1240
|
+
return x in S
|
|
1241
|
+
and C!.colLookup[x[1]] = class!.colClass
|
|
1242
|
+
and C!.rowLookup[x[3]] = class!.rowClass
|
|
1243
|
+
and LinkedElement(x) in class!.nCoset;
|
|
1244
|
+
end);
|
|
1245
|
+
|
|
1246
|
+
InstallMethod(Size,
|
|
1247
|
+
"for RMS congruence class by linked triple",
|
|
1248
|
+
[IsRMSCongruenceClassByLinkedTriple],
|
|
1249
|
+
function(class)
|
|
1250
|
+
local C;
|
|
1251
|
+
C := EquivalenceClassRelation(class);
|
|
1252
|
+
return(Size(C!.n) *
|
|
1253
|
+
Size(C!.colBlocks[class!.colClass]) *
|
|
1254
|
+
Size(C!.rowBlocks[class!.rowClass]));
|
|
1255
|
+
end);
|
|
1256
|
+
|
|
1257
|
+
InstallMethod(Size,
|
|
1258
|
+
"for RZMS congruence class by linked triple",
|
|
1259
|
+
[IsRZMSCongruenceClassByLinkedTriple],
|
|
1260
|
+
function(class)
|
|
1261
|
+
local C;
|
|
1262
|
+
# Special case for {0}
|
|
1263
|
+
if class!.nCoset = 0 then
|
|
1264
|
+
return 1;
|
|
1265
|
+
fi;
|
|
1266
|
+
# Otherwise
|
|
1267
|
+
C := EquivalenceClassRelation(class);
|
|
1268
|
+
return(Size(C!.n) *
|
|
1269
|
+
Size(C!.colBlocks[class!.colClass]) *
|
|
1270
|
+
Size(C!.rowBlocks[class!.rowClass]));
|
|
1271
|
+
end);
|
|
1272
|
+
|
|
1273
|
+
InstallMethod(\=,
|
|
1274
|
+
"for two congruence classes by linked triple",
|
|
1275
|
+
[IsRMSCongruenceClassByLinkedTriple, IsRMSCongruenceClassByLinkedTriple],
|
|
1276
|
+
function(lhop, rhop)
|
|
1277
|
+
return(lhop!.nCoset = rhop!.nCoset and
|
|
1278
|
+
lhop!.colClass = rhop!.colClass and
|
|
1279
|
+
lhop!.rowClass = rhop!.rowClass);
|
|
1280
|
+
end);
|
|
1281
|
+
|
|
1282
|
+
InstallMethod(\=,
|
|
1283
|
+
"for two congruence classes by linked triple",
|
|
1284
|
+
[IsRZMSCongruenceClassByLinkedTriple, IsRZMSCongruenceClassByLinkedTriple],
|
|
1285
|
+
function(lhop, rhop)
|
|
1286
|
+
# Special case for {0}
|
|
1287
|
+
if lhop!.nCoset = 0 and rhop!.nCoset = 0 then
|
|
1288
|
+
return true;
|
|
1289
|
+
fi;
|
|
1290
|
+
# Otherwise
|
|
1291
|
+
return(lhop!.nCoset = rhop!.nCoset and
|
|
1292
|
+
lhop!.colClass = rhop!.colClass and
|
|
1293
|
+
lhop!.rowClass = rhop!.rowClass);
|
|
1294
|
+
end);
|
|
1295
|
+
|
|
1296
|
+
InstallMethod(Representative,
|
|
1297
|
+
"for Rees matrix semigroup congruence class by linked triple",
|
|
1298
|
+
[IsRMSCongruenceClassByLinkedTriple],
|
|
1299
|
+
function(class)
|
|
1300
|
+
local C, S, i, u, mat, a;
|
|
1301
|
+
C := EquivalenceClassRelation(class);
|
|
1302
|
+
S := Range(C);
|
|
1303
|
+
# Pick the first row and column from the classes
|
|
1304
|
+
i := C!.colBlocks[class!.colClass][1];
|
|
1305
|
+
u := C!.rowBlocks[class!.rowClass][1];
|
|
1306
|
+
# Pick another row and column
|
|
1307
|
+
mat := Matrix(S);
|
|
1308
|
+
a := mat[1][i] ^ -1
|
|
1309
|
+
* CanonicalRightCosetElement(C!.n, Representative(class!.nCoset))
|
|
1310
|
+
* mat[u][1] ^ -1;
|
|
1311
|
+
return RMSElement(S, i, a, u);
|
|
1312
|
+
end);
|
|
1313
|
+
|
|
1314
|
+
InstallMethod(Representative,
|
|
1315
|
+
"for Rees 0-matrix semigroup congruence class by linked triple",
|
|
1316
|
+
[IsRZMSCongruenceClassByLinkedTriple],
|
|
1317
|
+
function(class)
|
|
1318
|
+
local C, S, mat, i, u, v, j, a;
|
|
1319
|
+
C := EquivalenceClassRelation(class);
|
|
1320
|
+
S := Range(C);
|
|
1321
|
+
# Seems to be impossible that a class does not know its Representative at
|
|
1322
|
+
# creation when nCoset is 0
|
|
1323
|
+
Assert(0, class!.nCoset <> 0);
|
|
1324
|
+
# Old code retained in case the assertion above is not correct!
|
|
1325
|
+
# if class!.nCoset = 0 then
|
|
1326
|
+
# return MultiplicativeZero(S);
|
|
1327
|
+
# fi;
|
|
1328
|
+
|
|
1329
|
+
# Pick the first row and column from the classes
|
|
1330
|
+
i := C!.colBlocks[class!.colClass][1];
|
|
1331
|
+
u := C!.rowBlocks[class!.rowClass][1];
|
|
1332
|
+
# Pick another row and column with appropriate non-zero entries
|
|
1333
|
+
mat := Matrix(S);
|
|
1334
|
+
for v in [1 .. Size(mat)] do
|
|
1335
|
+
if mat[v][i] <> 0 then
|
|
1336
|
+
break;
|
|
1337
|
+
fi;
|
|
1338
|
+
od;
|
|
1339
|
+
for j in [1 .. Size(mat[1])] do
|
|
1340
|
+
if mat[u][j] <> 0 then
|
|
1341
|
+
break;
|
|
1342
|
+
fi;
|
|
1343
|
+
od;
|
|
1344
|
+
a := mat[v][i] ^ -1
|
|
1345
|
+
* CanonicalRightCosetElement(C!.n, Representative(class!.nCoset))
|
|
1346
|
+
* mat[u][j] ^ -1;
|
|
1347
|
+
return RMSElement(S, i, a, u);
|
|
1348
|
+
end);
|
|
1349
|
+
|
|
1350
|
+
###############################################################################
|
|
1351
|
+
# 9. Congruence lattice
|
|
1352
|
+
###############################################################################
|
|
1353
|
+
|
|
1354
|
+
# Function to compute all subsets of a relation given by partitions
|
|
1355
|
+
SEMIGROUPS.Subpartitions := function(part)
|
|
1356
|
+
local l;
|
|
1357
|
+
# Replace each class with a list of all partitions of that class
|
|
1358
|
+
l := List(part, PartitionsSet);
|
|
1359
|
+
# Produce all the combinations of partitions of classes
|
|
1360
|
+
l := Cartesian(l);
|
|
1361
|
+
# Concatenate these lists to produce complete partitions of the set
|
|
1362
|
+
l := List(l, Concatenation);
|
|
1363
|
+
# Finally sort each of these into the canonical order of its new classes
|
|
1364
|
+
return List(l, SSortedList);
|
|
1365
|
+
end;
|
|
1366
|
+
|
|
1367
|
+
InstallMethod(CongruencesOfSemigroup,
|
|
1368
|
+
"for finite simple Rees matrix semigroup",
|
|
1369
|
+
[IsReesMatrixSemigroup and IsSimpleSemigroup and IsFinite],
|
|
1370
|
+
function(S)
|
|
1371
|
+
local subpartitions, congs, mat, g, colBlocksList,
|
|
1372
|
+
rowBlocksList, n, colBlocks, rowBlocks;
|
|
1373
|
+
|
|
1374
|
+
subpartitions := SEMIGROUPS.Subpartitions;
|
|
1375
|
+
|
|
1376
|
+
congs := [];
|
|
1377
|
+
mat := Matrix(S);
|
|
1378
|
+
g := UnderlyingSemigroup(S);
|
|
1379
|
+
|
|
1380
|
+
# No need to add the universal congruence
|
|
1381
|
+
|
|
1382
|
+
# Compute all column and row relations which are subsets of the max relations
|
|
1383
|
+
colBlocksList := subpartitions([[1 .. Size(mat[1])]]);
|
|
1384
|
+
rowBlocksList := subpartitions([[1 .. Size(mat)]]);
|
|
1385
|
+
|
|
1386
|
+
# Go through all triples and check
|
|
1387
|
+
for n in NormalSubgroups(g) do
|
|
1388
|
+
for colBlocks in colBlocksList do
|
|
1389
|
+
for rowBlocks in rowBlocksList do
|
|
1390
|
+
if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
|
|
1391
|
+
Add(congs,
|
|
1392
|
+
RMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks));
|
|
1393
|
+
fi;
|
|
1394
|
+
od;
|
|
1395
|
+
od;
|
|
1396
|
+
od;
|
|
1397
|
+
|
|
1398
|
+
return congs;
|
|
1399
|
+
end);
|
|
1400
|
+
|
|
1401
|
+
InstallMethod(CongruencesOfSemigroup,
|
|
1402
|
+
"for finite 0-simple Rees 0-matrix semigroup",
|
|
1403
|
+
[IsReesZeroMatrixSemigroup and IsZeroSimpleSemigroup and IsFinite],
|
|
1404
|
+
function(S)
|
|
1405
|
+
local congs, mat, g, AddRelation, maxColBlocks, maxRowBlocks,
|
|
1406
|
+
i, j, u, v, n, colBlocks, rowBlocks, colBlocksList, rowBlocksList,
|
|
1407
|
+
subpartitions;
|
|
1408
|
+
|
|
1409
|
+
subpartitions := SEMIGROUPS.Subpartitions;
|
|
1410
|
+
congs := [];
|
|
1411
|
+
mat := Matrix(S);
|
|
1412
|
+
g := UnderlyingSemigroup(S);
|
|
1413
|
+
|
|
1414
|
+
# This function combines two congruence classes
|
|
1415
|
+
AddRelation := function(R, x, y)
|
|
1416
|
+
local xClass, yClass;
|
|
1417
|
+
xClass := PositionProperty(R, class -> x in class);
|
|
1418
|
+
yClass := PositionProperty(R, class -> y in class);
|
|
1419
|
+
if xClass <> yClass then
|
|
1420
|
+
Append(R[xClass], R[yClass]);
|
|
1421
|
+
Remove(R, yClass);
|
|
1422
|
+
fi;
|
|
1423
|
+
end;
|
|
1424
|
+
|
|
1425
|
+
# Construct maximum column relation
|
|
1426
|
+
maxColBlocks := List([1 .. Size(mat[1])], i -> [i]);
|
|
1427
|
+
for i in [1 .. Size(mat[1])] do
|
|
1428
|
+
for j in [i + 1 .. Size(mat[1])] do
|
|
1429
|
+
if ForAll([1 .. Size(mat)],
|
|
1430
|
+
u -> ((mat[u][i] = 0) = (mat[u][j] = 0))) then
|
|
1431
|
+
AddRelation(maxColBlocks, i, j);
|
|
1432
|
+
fi;
|
|
1433
|
+
od;
|
|
1434
|
+
od;
|
|
1435
|
+
|
|
1436
|
+
# Construct maximum row relation
|
|
1437
|
+
maxRowBlocks := List([1 .. Size(mat)], u -> [u]);
|
|
1438
|
+
for u in [1 .. Size(mat)] do
|
|
1439
|
+
for v in [u + 1 .. Size(mat)] do
|
|
1440
|
+
if ForAll([1 .. Size(mat[1])],
|
|
1441
|
+
i -> ((mat[u][i] = 0) = (mat[v][i] = 0))) then
|
|
1442
|
+
AddRelation(maxRowBlocks, u, v);
|
|
1443
|
+
fi;
|
|
1444
|
+
od;
|
|
1445
|
+
od;
|
|
1446
|
+
|
|
1447
|
+
# Add the universal congruence
|
|
1448
|
+
Add(congs, UniversalSemigroupCongruence(S));
|
|
1449
|
+
|
|
1450
|
+
# Compute all column and row relations which are subsets of the max relations
|
|
1451
|
+
colBlocksList := subpartitions(maxColBlocks);
|
|
1452
|
+
rowBlocksList := subpartitions(maxRowBlocks);
|
|
1453
|
+
|
|
1454
|
+
# Go through all triples and check
|
|
1455
|
+
for n in NormalSubgroups(g) do
|
|
1456
|
+
for colBlocks in colBlocksList do
|
|
1457
|
+
for rowBlocks in rowBlocksList do
|
|
1458
|
+
if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
|
|
1459
|
+
Add(congs,
|
|
1460
|
+
RZMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks));
|
|
1461
|
+
fi;
|
|
1462
|
+
od;
|
|
1463
|
+
od;
|
|
1464
|
+
od;
|
|
1465
|
+
|
|
1466
|
+
return congs;
|
|
1467
|
+
end);
|