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,1383 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## attributes/isorms.gi
|
|
4
|
+
## Copyright (C) 2014-2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
#############################################################################
|
|
12
|
+
## This file contains functions for isomorphisms and automorphisms of Rees
|
|
13
|
+
## matrix and 0-matrix semigroup. The algorithm used in this file is described
|
|
14
|
+
## in:
|
|
15
|
+
##
|
|
16
|
+
## J. Araújo, P. von Bünau, J. D. Mitchell, and M. Neunhoeffer,
|
|
17
|
+
## ‘Computing automorphisms of semigroups’,
|
|
18
|
+
## J. Symbolic Comput. 45 (2010) 373-392;
|
|
19
|
+
## https://dx.doi.org/10.1016/j.jsc.2009.10.001.
|
|
20
|
+
##
|
|
21
|
+
## This file is organized as follows:
|
|
22
|
+
##
|
|
23
|
+
## 1. Internal functions for the avoidance of duplicate code.
|
|
24
|
+
##
|
|
25
|
+
## 2. Automorphism group functions (the main functions in this file)
|
|
26
|
+
##
|
|
27
|
+
## 3. Methods for automorphism group of RMS and RZMS (ViewObj,
|
|
28
|
+
## IdentityMapping etc)
|
|
29
|
+
##
|
|
30
|
+
## 4. Isomorphisms
|
|
31
|
+
##
|
|
32
|
+
## 5. RMS/RZMSIsoByTriple (equality, <, ImagesRepresentative)
|
|
33
|
+
##
|
|
34
|
+
#############################################################################
|
|
35
|
+
|
|
36
|
+
#############################################################################
|
|
37
|
+
# 1. Internal functions
|
|
38
|
+
#############################################################################
|
|
39
|
+
|
|
40
|
+
# Find the stabiliser of the matrix of a Rees (0-)matrix semigroup under the
|
|
41
|
+
# action of the automorphism group of the R(Z)MSGraph via rearranging rows and
|
|
42
|
+
# columns
|
|
43
|
+
|
|
44
|
+
SEMIGROUPS.StabOfRMSMatrix := function(G, R)
|
|
45
|
+
local OnMatrix, H, m, n;
|
|
46
|
+
|
|
47
|
+
m := Length(Matrix(R)[1]);
|
|
48
|
+
n := Length(Matrix(R));
|
|
49
|
+
|
|
50
|
+
OnMatrix := function(mat, x)
|
|
51
|
+
local rows;
|
|
52
|
+
mat := StructuralCopy(mat);
|
|
53
|
+
rows := Permutation(x, [1 .. n], {i, p} -> (i + m) ^ p - m);
|
|
54
|
+
|
|
55
|
+
return List(Permuted(mat, rows), y -> Permuted(y, x));
|
|
56
|
+
end;
|
|
57
|
+
H := Stabilizer(G, Matrix(R), OnMatrix);
|
|
58
|
+
Info(InfoSemigroups, 2, "the size of stabilizer of the matrix is ", Size(H));
|
|
59
|
+
return H;
|
|
60
|
+
end;
|
|
61
|
+
|
|
62
|
+
# Find the pointwise stabiliser of the entries in the matrix of a Rees
|
|
63
|
+
# (0-)matrix semigroup under the action of the automorphism group of the
|
|
64
|
+
# underlying group.
|
|
65
|
+
|
|
66
|
+
SEMIGROUPS.StabOfRMSEntries := function(G, R)
|
|
67
|
+
local H, entries, i;
|
|
68
|
+
H := G;
|
|
69
|
+
entries := MatrixEntries(R);
|
|
70
|
+
i := PositionProperty(entries, x -> x <> 0 and x <> ());
|
|
71
|
+
|
|
72
|
+
while not IsTrivial(H) and i <= Length(entries) do
|
|
73
|
+
H := Stabilizer(H, entries[i], OnPoints);
|
|
74
|
+
i := i + 1;
|
|
75
|
+
od;
|
|
76
|
+
|
|
77
|
+
Info(InfoSemigroups,
|
|
78
|
+
2,
|
|
79
|
+
"the size of the stabilizer of the matrix entries is ",
|
|
80
|
+
Size(H));
|
|
81
|
+
return H;
|
|
82
|
+
end;
|
|
83
|
+
|
|
84
|
+
# Theorem 3.4.1 in Howie's book, Fundamentals of Semigroup Theory. This
|
|
85
|
+
# function finds the values of the elements u_i and v_lambda of the underlying
|
|
86
|
+
# group of R2 for the choice of l, and g, by propagating the initial value x
|
|
87
|
+
# from u_1 to v_1, ..., v_n, and then from v_1 to u_2, ..., u_m. It then
|
|
88
|
+
# checks that the equation in Theorem 3.4.1 holds for the values of u and v
|
|
89
|
+
# defined.
|
|
90
|
+
|
|
91
|
+
SEMIGROUPS.RMSInducedFunction := function(R1, R2, l, g, x)
|
|
92
|
+
local mat1, mat2, m, n, out, i, j;
|
|
93
|
+
|
|
94
|
+
mat1 := Matrix(R1);
|
|
95
|
+
mat2 := Matrix(R2);
|
|
96
|
+
m := Length(mat1[1]);
|
|
97
|
+
n := Length(mat1);
|
|
98
|
+
out := EmptyPlist(m + n);
|
|
99
|
+
out[1] := x;
|
|
100
|
+
|
|
101
|
+
for i in [m + 1 .. m + n] do
|
|
102
|
+
# This is the inverse of v_lambda from Howie's book
|
|
103
|
+
out[i] := mat2[i ^ l - m][1 ^ l] * x * ((mat1[i - m][1] ^ g) ^ -1);
|
|
104
|
+
od;
|
|
105
|
+
|
|
106
|
+
for i in [2 .. m] do
|
|
107
|
+
out[i] := mat2[(m + 1) ^ l - m][i ^ l] ^ -1 * out[m + 1]
|
|
108
|
+
* (mat1[1][i] ^ g);
|
|
109
|
+
od;
|
|
110
|
+
|
|
111
|
+
for j in [m + 2 .. n + m] do
|
|
112
|
+
for i in [2 .. m] do
|
|
113
|
+
if mat1[j - m][i] ^ g
|
|
114
|
+
<> out[j] ^ -1 * mat2[j ^ l - m][i ^ l] * out[i] then
|
|
115
|
+
return fail;
|
|
116
|
+
fi;
|
|
117
|
+
od;
|
|
118
|
+
od;
|
|
119
|
+
|
|
120
|
+
return out;
|
|
121
|
+
end;
|
|
122
|
+
|
|
123
|
+
SEMIGROUPS.RZMSInducedFunction := function(R, l, g, x, component)
|
|
124
|
+
local mat, m, n, adj, rep, out, Q, q, v;
|
|
125
|
+
|
|
126
|
+
mat := Matrix(R);
|
|
127
|
+
m := Length(mat[1]);
|
|
128
|
+
n := Length(mat);
|
|
129
|
+
adj := OutNeighbours(RZMSDigraph(R));
|
|
130
|
+
rep := component[1];
|
|
131
|
+
out := EmptyPlist(m + n);
|
|
132
|
+
out[rep] := x;
|
|
133
|
+
Q := [rep];
|
|
134
|
+
q := 1;
|
|
135
|
+
|
|
136
|
+
while q <= Length(Q) do
|
|
137
|
+
rep := Q[q];
|
|
138
|
+
q := q + 1;
|
|
139
|
+
if rep <= m then
|
|
140
|
+
for v in adj[rep] do
|
|
141
|
+
if not IsBound(out[v]) then
|
|
142
|
+
Add(Q, v);
|
|
143
|
+
out[v] := mat[v ^ l - m][rep ^ l] * out[rep] / mat[v - m][rep] ^ g;
|
|
144
|
+
elif mat[v - m][rep] ^ g
|
|
145
|
+
<> (out[v] ^ -1) * mat[v ^ l - m][rep ^ l] * out[rep] then
|
|
146
|
+
return fail;
|
|
147
|
+
fi;
|
|
148
|
+
od;
|
|
149
|
+
else
|
|
150
|
+
for v in adj[rep] do
|
|
151
|
+
if not IsBound(out[v]) then
|
|
152
|
+
Add(Q, v);
|
|
153
|
+
out[v] := mat[rep ^ l - m][v ^ l] ^ -1 * out[rep] ^ -1
|
|
154
|
+
* (mat[rep - m][v] ^ g);
|
|
155
|
+
elif mat[rep - m][v] ^ g
|
|
156
|
+
<> out[rep] ^ -1 * mat[rep ^ l - m][v ^ l] * out[v] then
|
|
157
|
+
return fail;
|
|
158
|
+
fi;
|
|
159
|
+
od;
|
|
160
|
+
fi;
|
|
161
|
+
od;
|
|
162
|
+
return out;
|
|
163
|
+
end;
|
|
164
|
+
|
|
165
|
+
# TODO(later) the next function should be combined with the previous one.
|
|
166
|
+
|
|
167
|
+
SEMIGROUPS.RZMStoRZMSInducedFunction := function(rms1, rms2, l, g, groupelts)
|
|
168
|
+
local mat1, mat2, m, rmsgraph, components, reps, imagelist, edges,
|
|
169
|
+
bicomps, sub, perm, defined, orb, j, Last, involved, verts, v, new, i, k;
|
|
170
|
+
|
|
171
|
+
mat1 := Matrix(rms1);
|
|
172
|
+
mat2 := Matrix(rms2);
|
|
173
|
+
m := Length(mat1[1]);
|
|
174
|
+
rmsgraph := RZMSDigraph(rms1);
|
|
175
|
+
components := DigraphConnectedComponents(rmsgraph).comps;
|
|
176
|
+
|
|
177
|
+
if Length(groupelts) <> Length(components) then
|
|
178
|
+
ErrorNoReturn("the 5th argument (a list) must have length ",
|
|
179
|
+
Length(components), ", but found ", Length(groupelts));
|
|
180
|
+
fi;
|
|
181
|
+
|
|
182
|
+
reps := List(components, Minimum);
|
|
183
|
+
imagelist := [];
|
|
184
|
+
imagelist{reps} := groupelts;
|
|
185
|
+
|
|
186
|
+
for i in [1 .. Length(components)] do
|
|
187
|
+
if Length(components) = 1 then
|
|
188
|
+
edges := DigraphEdges(rmsgraph);
|
|
189
|
+
bicomps := DigraphBicomponents(rmsgraph);
|
|
190
|
+
else
|
|
191
|
+
sub := InducedSubdigraph(rmsgraph, components[i]);
|
|
192
|
+
perm := MappingPermListList(DigraphVertexLabels(sub),
|
|
193
|
+
DigraphVertices(sub));
|
|
194
|
+
edges := OnTuplesTuples(DigraphEdges(sub), perm ^ -1);
|
|
195
|
+
bicomps := OnTuplesTuples(DigraphBicomponents(sub), perm ^ -1);
|
|
196
|
+
fi;
|
|
197
|
+
|
|
198
|
+
defined := [];
|
|
199
|
+
orb := [reps[i]];
|
|
200
|
+
j := 0;
|
|
201
|
+
|
|
202
|
+
repeat
|
|
203
|
+
j := j + 1;
|
|
204
|
+
Last := orb[j];
|
|
205
|
+
involved := Filtered(edges, x -> x[1] = Last and not x in defined);
|
|
206
|
+
if not IsEmpty(involved) then
|
|
207
|
+
|
|
208
|
+
verts := List(involved, x -> x[2]);
|
|
209
|
+
Append(orb, Filtered(verts, x -> not x in orb));
|
|
210
|
+
|
|
211
|
+
for k in [1 .. Length(verts)] do
|
|
212
|
+
v := verts[k];
|
|
213
|
+
|
|
214
|
+
if Last in bicomps[1] then
|
|
215
|
+
new := mat2[v ^ l - m][Last ^ l]
|
|
216
|
+
* imagelist[Last] * (mat1[v - m][Last] ^ g) ^ -1;
|
|
217
|
+
else
|
|
218
|
+
new := (mat2[Last ^ l - m][v ^ l]) ^ -1
|
|
219
|
+
* imagelist[Last] * (mat1[Last - m][v] ^ g);
|
|
220
|
+
fi;
|
|
221
|
+
|
|
222
|
+
if not IsBound(imagelist[v]) then
|
|
223
|
+
imagelist[v] := new;
|
|
224
|
+
elif not imagelist[v] = new then
|
|
225
|
+
return fail;
|
|
226
|
+
fi;
|
|
227
|
+
defined := Union(defined, [involved[k], Reversed(involved[k])]);
|
|
228
|
+
od;
|
|
229
|
+
fi;
|
|
230
|
+
until defined = edges;
|
|
231
|
+
od;
|
|
232
|
+
return imagelist;
|
|
233
|
+
end;
|
|
234
|
+
|
|
235
|
+
#############################################################################
|
|
236
|
+
# 2. Automorphism group functions
|
|
237
|
+
#############################################################################
|
|
238
|
+
|
|
239
|
+
# don't hit F5 for local variables here, it crashes vim!!
|
|
240
|
+
InstallMethod(AutomorphismGroup, "for a Rees 0-matrix semigroup",
|
|
241
|
+
[IsReesZeroMatrixSubsemigroup],
|
|
242
|
+
function(R)
|
|
243
|
+
local G, m, n, aut_graph, components, t, aut_group, stab_aut_graph,
|
|
244
|
+
hom, stab_aut_group, i, V, A, gens1, gens2, U, T, tester,
|
|
245
|
+
g, x, map, cart, RZMSInducedFunction;
|
|
246
|
+
|
|
247
|
+
G := UnderlyingSemigroup(R);
|
|
248
|
+
|
|
249
|
+
if not (IsReesZeroMatrixSemigroup(R) and IsPermGroup(G)
|
|
250
|
+
and IsZeroSimpleSemigroup(R)) then
|
|
251
|
+
TryNextMethod(); # There is no such method at present
|
|
252
|
+
fi;
|
|
253
|
+
|
|
254
|
+
m := Length(Rows(R));
|
|
255
|
+
n := Length(Columns(R));
|
|
256
|
+
|
|
257
|
+
# automorphism group of the graph . . .
|
|
258
|
+
|
|
259
|
+
aut_graph := AutomorphismGroup(RZMSDigraph(R), [[1 .. m], [m + 1 .. n + m]]);
|
|
260
|
+
|
|
261
|
+
Info(InfoSemigroups, 2, "the graph has ", Size(aut_graph), " automorphisms");
|
|
262
|
+
|
|
263
|
+
# stabiliser of the matrix under rearranging rows and columns by elements
|
|
264
|
+
# of the automorphism group of the graph
|
|
265
|
+
if m * n < 1000 then
|
|
266
|
+
stab_aut_graph := SEMIGROUPS.StabOfRMSMatrix(aut_graph, R);
|
|
267
|
+
else
|
|
268
|
+
stab_aut_graph := Group(());
|
|
269
|
+
fi;
|
|
270
|
+
|
|
271
|
+
# automorphism group of the underlying group
|
|
272
|
+
aut_group := AutomorphismGroup(G);
|
|
273
|
+
Info(InfoSemigroups,
|
|
274
|
+
2,
|
|
275
|
+
"the underlying group has ",
|
|
276
|
+
Size(aut_group),
|
|
277
|
+
" automorphisms");
|
|
278
|
+
|
|
279
|
+
# pointwise stabiliser of the entries in the matrix of R under the
|
|
280
|
+
# automorphism group of the group
|
|
281
|
+
stab_aut_group := SEMIGROUPS.StabOfRMSEntries(aut_group, R);
|
|
282
|
+
|
|
283
|
+
# The following mathematically unnecessary separation of cases is needed to
|
|
284
|
+
# support the AutPGrp package, whose method for `AutomorphismGroup` for the
|
|
285
|
+
# trivial group does not set `InnerAutomorphismsAutomorphismGroup` at
|
|
286
|
+
# creation, and no method is installed to calculate it.
|
|
287
|
+
|
|
288
|
+
# homomorphism from Aut(G) to a perm rep of Aut(G) / Inn(G)
|
|
289
|
+
if IsTrivial(G) then
|
|
290
|
+
hom := IsomorphismPermGroup(aut_group);
|
|
291
|
+
else
|
|
292
|
+
hom := NaturalHomomorphismByNormalSubgroupNC(aut_group,
|
|
293
|
+
InnerAutomorphismsAutomorphismGroup(aut_group));
|
|
294
|
+
hom := CompositionMapping(IsomorphismPermGroup(ImagesSource(hom)), hom);
|
|
295
|
+
fi;
|
|
296
|
+
|
|
297
|
+
# V is isomorphic to Aut(Gamma) x (Aut(G) / Inn(G))
|
|
298
|
+
# U is a subgroup of V contained in the subgroup we are looking for.
|
|
299
|
+
V := DirectProduct(aut_graph, Image(hom));
|
|
300
|
+
|
|
301
|
+
if IsTrivial(stab_aut_graph) and IsTrivial(stab_aut_group) then
|
|
302
|
+
U := Group(());
|
|
303
|
+
else
|
|
304
|
+
gens1 := GeneratorsOfGroup(stab_aut_graph);
|
|
305
|
+
gens2 := GeneratorsOfGroup(Image(hom, stab_aut_group));
|
|
306
|
+
U := Group(Concatenation(Images(Embedding(V, 1), gens1),
|
|
307
|
+
Images(Embedding(V, 2), gens2)));
|
|
308
|
+
fi;
|
|
309
|
+
|
|
310
|
+
components := DigraphConnectedComponents(RZMSDigraph(R)).comps;
|
|
311
|
+
t := Length(components);
|
|
312
|
+
Info(InfoSemigroups, 2, "the graph has ", t, " connected components");
|
|
313
|
+
|
|
314
|
+
T := RightTransversal(G, Centre(G));
|
|
315
|
+
A := [];
|
|
316
|
+
|
|
317
|
+
##########################################################################
|
|
318
|
+
# test whether for <x> in <V> there is a <map> such that
|
|
319
|
+
# phi := [x ^ Projection(V, 1), x ^ Projection(V, 2) ^ hom ^ -1, map]
|
|
320
|
+
# is a RZMSIsoByTriple, and add <phi> to <A> if it is!
|
|
321
|
+
##########################################################################
|
|
322
|
+
|
|
323
|
+
RZMSInducedFunction := SEMIGROUPS.RZMSInducedFunction;
|
|
324
|
+
|
|
325
|
+
tester := function(x)
|
|
326
|
+
local y, found, g, i, tmp, map;
|
|
327
|
+
y := PreImagesRepresentative(hom, x ^ Projection(V, 2));
|
|
328
|
+
x := x ^ Projection(V, 1);
|
|
329
|
+
tmp := [];
|
|
330
|
+
found := false;
|
|
331
|
+
for g in T do
|
|
332
|
+
map := RZMSInducedFunction(R, x, y, g, components[1]);
|
|
333
|
+
if map <> fail then
|
|
334
|
+
tmp := tmp + map;
|
|
335
|
+
found := true;
|
|
336
|
+
break;
|
|
337
|
+
fi;
|
|
338
|
+
od;
|
|
339
|
+
i := 1;
|
|
340
|
+
while found and i < t do
|
|
341
|
+
i := i + 1;
|
|
342
|
+
found := false;
|
|
343
|
+
for g in G do
|
|
344
|
+
map := RZMSInducedFunction(R, x, y, g, components[i]);
|
|
345
|
+
if map <> fail then
|
|
346
|
+
tmp := tmp + map;
|
|
347
|
+
found := true;
|
|
348
|
+
break;
|
|
349
|
+
fi;
|
|
350
|
+
od;
|
|
351
|
+
od;
|
|
352
|
+
|
|
353
|
+
if found then
|
|
354
|
+
AddSet(A, RZMSIsoByTripleNC(R, R, [x, y, tmp]));
|
|
355
|
+
fi;
|
|
356
|
+
return found;
|
|
357
|
+
end;
|
|
358
|
+
|
|
359
|
+
##########################################################################
|
|
360
|
+
|
|
361
|
+
if U <> V then # some search required
|
|
362
|
+
Info(InfoSemigroups, 2, "backtracking in the direct product of size ",
|
|
363
|
+
Size(V), " . . . ");
|
|
364
|
+
# This appears to do nothing, but the subgroup is computed when we call
|
|
365
|
+
# Size, and the resulting isomorphisms-by-triple are stored in A by the
|
|
366
|
+
# function tester
|
|
367
|
+
U := BacktrackSearchStabilizerChainSubgroup(StabilizerChain(V),
|
|
368
|
+
tester,
|
|
369
|
+
ReturnTrue);
|
|
370
|
+
Info(InfoSemigroups, 2, "found subgroup of size ", Size(U));
|
|
371
|
+
else
|
|
372
|
+
# U = V
|
|
373
|
+
# This appears to do nothing, but the the resulting isomorphisms-by-triple
|
|
374
|
+
# are stored in A by the function tester
|
|
375
|
+
Perform(GeneratorsOfGroup(V), tester);
|
|
376
|
+
fi;
|
|
377
|
+
|
|
378
|
+
cart := [[]];
|
|
379
|
+
for g in T do
|
|
380
|
+
map := RZMSInducedFunction(R,
|
|
381
|
+
One(aut_graph),
|
|
382
|
+
One(aut_group),
|
|
383
|
+
g,
|
|
384
|
+
components[1]);
|
|
385
|
+
if map <> fail then
|
|
386
|
+
Add(cart[1], map);
|
|
387
|
+
fi;
|
|
388
|
+
od;
|
|
389
|
+
|
|
390
|
+
for i in [2 .. t] do
|
|
391
|
+
cart[i] := [];
|
|
392
|
+
for g in G do
|
|
393
|
+
map := RZMSInducedFunction(R,
|
|
394
|
+
One(aut_graph),
|
|
395
|
+
One(aut_group),
|
|
396
|
+
g,
|
|
397
|
+
components[i]);
|
|
398
|
+
if map <> fail then
|
|
399
|
+
Add(cart[i], map);
|
|
400
|
+
fi;
|
|
401
|
+
od;
|
|
402
|
+
od;
|
|
403
|
+
|
|
404
|
+
# put B together
|
|
405
|
+
for map in EnumeratorOfCartesianProduct(cart) do
|
|
406
|
+
x := RZMSIsoByTripleNC(R, R, [One(aut_graph), One(aut_group), Sum(map)]);
|
|
407
|
+
AddSet(A, x);
|
|
408
|
+
od;
|
|
409
|
+
|
|
410
|
+
A := Group(A);
|
|
411
|
+
SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
|
|
412
|
+
SetIsFinite(A, true);
|
|
413
|
+
|
|
414
|
+
return A;
|
|
415
|
+
end);
|
|
416
|
+
|
|
417
|
+
# don't hit F5 for local variables here, it crashes vim!!
|
|
418
|
+
InstallMethod(AutomorphismGroup, "for a Rees matrix semigroup",
|
|
419
|
+
[IsReesMatrixSemigroup and IsWholeFamily],
|
|
420
|
+
function(R)
|
|
421
|
+
local G, m, n, aut_graph, aut_group, stab_aut_graph,
|
|
422
|
+
hom, stab_aut_group, V, A, gens1, gens2, U, T, tester,
|
|
423
|
+
g, map, gens, RMSInducedFunction;
|
|
424
|
+
|
|
425
|
+
G := UnderlyingSemigroup(R);
|
|
426
|
+
if not (IsReesMatrixSemigroup(R) and IsPermGroup(G)
|
|
427
|
+
and IsSimpleSemigroup(R)) then
|
|
428
|
+
TryNextMethod(); # TODO(never) write such a method
|
|
429
|
+
fi;
|
|
430
|
+
|
|
431
|
+
m := Length(Rows(R));
|
|
432
|
+
n := Length(Columns(R));
|
|
433
|
+
|
|
434
|
+
# this is easy since the graph is complete bipartite
|
|
435
|
+
|
|
436
|
+
if n = 1 and m = 1 then
|
|
437
|
+
gens := GeneratorsOfGroup(AutomorphismGroup(G));
|
|
438
|
+
if IsEmpty(gens) then
|
|
439
|
+
gens := [IdentityMapping(G)];
|
|
440
|
+
fi;
|
|
441
|
+
A := Group(List(gens, x -> RMSIsoByTripleNC(R, R,
|
|
442
|
+
[(), x, [One(G), One(G)]])));
|
|
443
|
+
SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
|
|
444
|
+
SetIsFinite(A, true);
|
|
445
|
+
return A;
|
|
446
|
+
elif n = 2 and m = 1 then
|
|
447
|
+
aut_graph := Group((2, 3));
|
|
448
|
+
SetSize(aut_graph, 2);
|
|
449
|
+
elif n > 2 and m = 1 then
|
|
450
|
+
aut_graph := Group((2, 3),
|
|
451
|
+
PermList(Concatenation([1], [3 .. n + m], [2])));
|
|
452
|
+
SetSize(aut_graph, Factorial(n));
|
|
453
|
+
else
|
|
454
|
+
aut_graph := DirectProduct(SymmetricGroup(m), SymmetricGroup(n));
|
|
455
|
+
fi;
|
|
456
|
+
|
|
457
|
+
Info(InfoSemigroups, 2, "the graph has ", Size(aut_graph), " automorphisms");
|
|
458
|
+
|
|
459
|
+
# stabiliser of the matrix under rearranging rows and columns by elements
|
|
460
|
+
# of the automorphism group of the graph
|
|
461
|
+
if m * n < 1000 then
|
|
462
|
+
stab_aut_graph := SEMIGROUPS.StabOfRMSMatrix(aut_graph, R);
|
|
463
|
+
else
|
|
464
|
+
stab_aut_graph := Group(());
|
|
465
|
+
fi;
|
|
466
|
+
|
|
467
|
+
# automorphism group of the underlying group
|
|
468
|
+
aut_group := AutomorphismGroup(G);
|
|
469
|
+
Info(InfoSemigroups,
|
|
470
|
+
2,
|
|
471
|
+
StringFormatted("there are {} group automorphisms", Size(aut_group)));
|
|
472
|
+
|
|
473
|
+
# pointwise stabiliser of the entries in the matrix of R under the
|
|
474
|
+
# automorphism group of the group
|
|
475
|
+
stab_aut_group := SEMIGROUPS.StabOfRMSEntries(aut_group, R);
|
|
476
|
+
|
|
477
|
+
# The following mathematically unnecessary separation of cases is needed to
|
|
478
|
+
# support the AutPGrp package, whose method for `AutomorphismGroup` for the
|
|
479
|
+
# trivial group does not set `InnerAutomorphismsAutomorphismGroup` at
|
|
480
|
+
# creation, and no method is installed to calculate it.
|
|
481
|
+
|
|
482
|
+
# homomorphism from Aut(G) to a perm rep of Aut(G) / Inn(G)
|
|
483
|
+
if IsTrivial(G) then
|
|
484
|
+
hom := IsomorphismPermGroup(aut_group);
|
|
485
|
+
else
|
|
486
|
+
hom := NaturalHomomorphismByNormalSubgroupNC(aut_group,
|
|
487
|
+
InnerAutomorphismsAutomorphismGroup(aut_group));
|
|
488
|
+
hom := CompositionMapping(IsomorphismPermGroup(ImagesSource(hom)), hom);
|
|
489
|
+
fi;
|
|
490
|
+
|
|
491
|
+
# V is isomorphic to Aut(Gamma) x (Aut(G) / Inn(G))
|
|
492
|
+
# U is a subgroup of V contained in the subgroup we are looking for.
|
|
493
|
+
V := DirectProduct(aut_graph, Image(hom));
|
|
494
|
+
|
|
495
|
+
if IsTrivial(stab_aut_graph) and IsTrivial(stab_aut_group) then
|
|
496
|
+
U := Group(());
|
|
497
|
+
else
|
|
498
|
+
gens1 := GeneratorsOfGroup(stab_aut_graph);
|
|
499
|
+
gens2 := GeneratorsOfGroup(Image(hom, stab_aut_group));
|
|
500
|
+
U := Group(Concatenation(Images(Embedding(V, 1), gens1),
|
|
501
|
+
Images(Embedding(V, 2), gens2)));
|
|
502
|
+
fi;
|
|
503
|
+
|
|
504
|
+
T := RightTransversal(G, Centre(G));
|
|
505
|
+
A := [];
|
|
506
|
+
|
|
507
|
+
##########################################################################
|
|
508
|
+
# test whether for <x> in <V> there is a <map> such that
|
|
509
|
+
# phi := [x ^ Projection(V, 1), x ^ Projection(V, 2) ^ hom ^ -1, map]
|
|
510
|
+
# is a RMSIsoByTriple, and add <phi> to <A> if it is!
|
|
511
|
+
##########################################################################
|
|
512
|
+
|
|
513
|
+
RMSInducedFunction := SEMIGROUPS.RMSInducedFunction;
|
|
514
|
+
|
|
515
|
+
tester := function(x)
|
|
516
|
+
local y, map, g;
|
|
517
|
+
y := PreImagesRepresentative(hom, x ^ Projection(V, 2));
|
|
518
|
+
x := x ^ Projection(V, 1);
|
|
519
|
+
for g in T do
|
|
520
|
+
map := RMSInducedFunction(R, R, x, y, g);
|
|
521
|
+
if map <> fail then
|
|
522
|
+
AddSet(A, RMSIsoByTripleNC(R, R, [x, y, map]));
|
|
523
|
+
return true;
|
|
524
|
+
fi;
|
|
525
|
+
od;
|
|
526
|
+
return false;
|
|
527
|
+
end;
|
|
528
|
+
|
|
529
|
+
##########################################################################
|
|
530
|
+
|
|
531
|
+
if U <> V then
|
|
532
|
+
Info(InfoSemigroups, 2, "backtracking in the direct product of size ",
|
|
533
|
+
Size(V), " . . . ");
|
|
534
|
+
# See the comments in the AutomorphismGroup(Rees 0-matrix semigroup) method
|
|
535
|
+
U := BacktrackSearchStabilizerChainSubgroup(StabilizerChain(V),
|
|
536
|
+
tester,
|
|
537
|
+
ReturnTrue);
|
|
538
|
+
Info(InfoSemigroups, 2, "found subgroup of size ", Size(U));
|
|
539
|
+
else # U = V
|
|
540
|
+
# See the comments in the AutomorphismGroup(Rees 0-matrix semigroup) method
|
|
541
|
+
Perform(GeneratorsOfGroup(V), tester);
|
|
542
|
+
fi;
|
|
543
|
+
|
|
544
|
+
for g in T do
|
|
545
|
+
map := RMSInducedFunction(R,
|
|
546
|
+
R,
|
|
547
|
+
One(aut_graph),
|
|
548
|
+
One(aut_group),
|
|
549
|
+
g);
|
|
550
|
+
if map <> fail then
|
|
551
|
+
AddSet(A, RMSIsoByTripleNC(R, R, [One(aut_graph), One(aut_group), map]));
|
|
552
|
+
fi;
|
|
553
|
+
od;
|
|
554
|
+
|
|
555
|
+
A := Group(A);
|
|
556
|
+
SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
|
|
557
|
+
SetIsFinite(A, true);
|
|
558
|
+
|
|
559
|
+
return A;
|
|
560
|
+
end);
|
|
561
|
+
|
|
562
|
+
#############################################################################
|
|
563
|
+
# 3. Methods for automorphism groups
|
|
564
|
+
#############################################################################
|
|
565
|
+
|
|
566
|
+
InstallMethod(ViewObj,
|
|
567
|
+
"for the automorphism group of a Rees (0-)matrix semigroup",
|
|
568
|
+
[IsAutomorphismGroupOfRMSOrRZMS],
|
|
569
|
+
function(G)
|
|
570
|
+
Print("<automorphism group of ");
|
|
571
|
+
ViewObj(Source(G.1));
|
|
572
|
+
Print(" with ");
|
|
573
|
+
Print(Pluralize(Length(GeneratorsOfGroup(G)), "generator"));
|
|
574
|
+
Print(">");
|
|
575
|
+
end);
|
|
576
|
+
|
|
577
|
+
# InstallMethod(ViewString,
|
|
578
|
+
# "for the automorphism group of a Rees (0-)matrix semigroup",
|
|
579
|
+
# [IsAutomorphismGroupOfRMSOrRZMS],
|
|
580
|
+
# function(G)
|
|
581
|
+
# local plural;
|
|
582
|
+
#
|
|
583
|
+
# plural := "";
|
|
584
|
+
# if Length(GeneratorsOfGroup(G)) > 1 then
|
|
585
|
+
# plural := "s";
|
|
586
|
+
# fi;
|
|
587
|
+
#
|
|
588
|
+
# return StringFormatted(
|
|
589
|
+
# "<automorphism group of {!v} with {!v} generator{}>",
|
|
590
|
+
# Source(G.1),
|
|
591
|
+
# Length(GeneratorsOfGroup(G)),
|
|
592
|
+
# plural);
|
|
593
|
+
# end);
|
|
594
|
+
|
|
595
|
+
InstallMethod(IsomorphismPermGroup,
|
|
596
|
+
"for the automorphism group of a Rees (0-)matrix semigroup",
|
|
597
|
+
[IsAutomorphismGroupOfRMSOrRZMS],
|
|
598
|
+
function(G)
|
|
599
|
+
local R, H, iso, x;
|
|
600
|
+
|
|
601
|
+
R := Source(Representative(G)); # the Rees (0-)matrix semigroup
|
|
602
|
+
H := [];
|
|
603
|
+
for x in GeneratorsOfGroup(G) do
|
|
604
|
+
Add(H, Permutation(x, R, OnPoints));
|
|
605
|
+
od;
|
|
606
|
+
H := Group(H);
|
|
607
|
+
|
|
608
|
+
iso := GroupHomomorphismByImagesNC(G,
|
|
609
|
+
H,
|
|
610
|
+
GeneratorsOfGroup(G),
|
|
611
|
+
GeneratorsOfGroup(H));
|
|
612
|
+
SetInverseGeneralMapping(iso,
|
|
613
|
+
GroupHomomorphismByImagesNC(H,
|
|
614
|
+
G,
|
|
615
|
+
GeneratorsOfGroup(H),
|
|
616
|
+
GeneratorsOfGroup(G)));
|
|
617
|
+
SetIsBijective(iso, true);
|
|
618
|
+
SetNiceMonomorphism(G, iso);
|
|
619
|
+
SetIsHandledByNiceMonomorphism(G, true);
|
|
620
|
+
UseIsomorphismRelation(G, H);
|
|
621
|
+
return iso;
|
|
622
|
+
end);
|
|
623
|
+
|
|
624
|
+
InstallMethod(IdentityMapping, "for a Rees matrix semigroup",
|
|
625
|
+
[IsReesMatrixSemigroup and IsWholeFamily],
|
|
626
|
+
function(R)
|
|
627
|
+
local G;
|
|
628
|
+
G := UnderlyingSemigroup(R);
|
|
629
|
+
return RMSIsoByTripleNC(R, R,
|
|
630
|
+
[(),
|
|
631
|
+
IdentityMapping(G),
|
|
632
|
+
List([1 .. Length(Columns(R)) + Length(Rows(R))],
|
|
633
|
+
x -> One(G))]);
|
|
634
|
+
end);
|
|
635
|
+
|
|
636
|
+
InstallMethod(IdentityMapping, "for a Rees 0-matrix semigroup",
|
|
637
|
+
[IsReesZeroMatrixSemigroup and IsWholeFamily],
|
|
638
|
+
function(R)
|
|
639
|
+
local G, tup;
|
|
640
|
+
G := UnderlyingSemigroup(R);
|
|
641
|
+
tup := List([1 .. Length(Columns(R)) + Length(Rows(R))], x -> One(G));
|
|
642
|
+
return RZMSIsoByTripleNC(R, R, [(), IdentityMapping(G), tup]);
|
|
643
|
+
end);
|
|
644
|
+
|
|
645
|
+
#############################################################################
|
|
646
|
+
# 4. Isomorphisms
|
|
647
|
+
#############################################################################
|
|
648
|
+
|
|
649
|
+
InstallMethod(IsomorphismSemigroups,
|
|
650
|
+
"for finite whole family Rees matrix semigroups",
|
|
651
|
+
[IsReesMatrixSemigroup and IsWholeFamily and IsFinite,
|
|
652
|
+
IsReesMatrixSemigroup and IsWholeFamily and IsFinite],
|
|
653
|
+
(RankFilter(IsSimpleSemigroup and IsFinite) - RankFilter(IsReesMatrixSemigroup
|
|
654
|
+
and IsWholeFamily and IsFinite)) + 10, # to beat IsSimpleSemigroup and IsFinite
|
|
655
|
+
function(S, T)
|
|
656
|
+
local G, H, mat, m, n, f, isograph, isogroup, RMSInducedFunction, map, l, g,
|
|
657
|
+
tup;
|
|
658
|
+
|
|
659
|
+
G := UnderlyingSemigroup(S);
|
|
660
|
+
H := UnderlyingSemigroup(T);
|
|
661
|
+
|
|
662
|
+
if not (IsGroupAsSemigroup(G) and IsGroupAsSemigroup(H)) then
|
|
663
|
+
TryNextMethod();
|
|
664
|
+
elif Size(S) <> Size(T)
|
|
665
|
+
or Length(Columns(S)) <> Length(Columns(T))
|
|
666
|
+
or Length(Rows(T)) <> Length(Rows(T)) then
|
|
667
|
+
return fail;
|
|
668
|
+
elif not (IsPermGroup(G) and IsPermGroup(H)) then
|
|
669
|
+
TryNextMethod();
|
|
670
|
+
fi;
|
|
671
|
+
|
|
672
|
+
mat := Matrix(S);
|
|
673
|
+
m := Length(mat[1]);
|
|
674
|
+
n := Length(mat);
|
|
675
|
+
|
|
676
|
+
if S = T then
|
|
677
|
+
return RMSIsoByTriple(S, T, [(),
|
|
678
|
+
IdentityMapping(G),
|
|
679
|
+
ListWithIdenticalEntries(m + n, ())]);
|
|
680
|
+
fi;
|
|
681
|
+
|
|
682
|
+
f := IsomorphismGroups(G, H);
|
|
683
|
+
if f = fail then
|
|
684
|
+
return fail;
|
|
685
|
+
fi;
|
|
686
|
+
|
|
687
|
+
# for RMS without 0 the graphs are always isomorphic,
|
|
688
|
+
# being complete bipartite.
|
|
689
|
+
|
|
690
|
+
isograph := DirectProduct(SymmetricGroup(m), SymmetricGroup(n));
|
|
691
|
+
# all isomorphisms from g1 to g2
|
|
692
|
+
isogroup := List(Elements(AutomorphismGroup(G)), x -> x * f);
|
|
693
|
+
|
|
694
|
+
# find an induced function, if there is one
|
|
695
|
+
RMSInducedFunction := SEMIGROUPS.RMSInducedFunction;
|
|
696
|
+
for l in isograph do
|
|
697
|
+
for g in isogroup do
|
|
698
|
+
for tup in Elements(H) do
|
|
699
|
+
map := RMSInducedFunction(S, T, l, g, tup);
|
|
700
|
+
if map <> fail then
|
|
701
|
+
return RMSIsoByTriple(S, T, [l, g, map]);
|
|
702
|
+
fi;
|
|
703
|
+
od;
|
|
704
|
+
od;
|
|
705
|
+
od;
|
|
706
|
+
return fail;
|
|
707
|
+
end);
|
|
708
|
+
|
|
709
|
+
InstallMethod(IsomorphismSemigroups,
|
|
710
|
+
"for finite whole family Rees 0-matrix semigroups",
|
|
711
|
+
[IsReesZeroMatrixSemigroup and IsWholeFamily and IsFinite,
|
|
712
|
+
IsReesZeroMatrixSemigroup and IsWholeFamily and IsFinite],
|
|
713
|
+
function(S, T)
|
|
714
|
+
local G, H, mat, m, n, f, groupiso, grS, grT, g, graphiso, tuples,
|
|
715
|
+
RZMStoRZMSInducedFunction, map, l, tup;
|
|
716
|
+
|
|
717
|
+
G := UnderlyingSemigroup(S);
|
|
718
|
+
H := UnderlyingSemigroup(T);
|
|
719
|
+
|
|
720
|
+
if not (IsRegularSemigroup(S) and IsGroupAsSemigroup(G) and
|
|
721
|
+
IsRegularSemigroup(T) and IsGroupAsSemigroup(H)) then
|
|
722
|
+
TryNextMethod();
|
|
723
|
+
elif Size(S) <> Size(T)
|
|
724
|
+
or Length(Columns(S)) <> Length(Columns(T))
|
|
725
|
+
or Length(Rows(S)) <> Length(Rows(T)) then
|
|
726
|
+
return fail;
|
|
727
|
+
elif not (IsPermGroup(G) and IsPermGroup(H)) then
|
|
728
|
+
TryNextMethod();
|
|
729
|
+
fi;
|
|
730
|
+
|
|
731
|
+
mat := Matrix(S);
|
|
732
|
+
m := Length(mat[1]);
|
|
733
|
+
n := Length(mat);
|
|
734
|
+
|
|
735
|
+
if S = T then
|
|
736
|
+
return RZMSIsoByTripleNC(S, T, [(),
|
|
737
|
+
IdentityMapping(G),
|
|
738
|
+
ListWithIdenticalEntries(m + n, ())]);
|
|
739
|
+
fi;
|
|
740
|
+
|
|
741
|
+
# every isomorphism of the groups
|
|
742
|
+
f := IsomorphismGroups(G, H);
|
|
743
|
+
if f = fail then
|
|
744
|
+
return fail;
|
|
745
|
+
fi;
|
|
746
|
+
groupiso := List(AutomorphismGroup(G), x -> x * f);
|
|
747
|
+
|
|
748
|
+
# every isomorphism of the graphs
|
|
749
|
+
grS := RZMSDigraph(S);
|
|
750
|
+
grT := RZMSDigraph(T);
|
|
751
|
+
if grS <> grT then
|
|
752
|
+
g := IsomorphismDigraphs(grS, grT);
|
|
753
|
+
if g = fail then
|
|
754
|
+
return fail;
|
|
755
|
+
fi;
|
|
756
|
+
else
|
|
757
|
+
g := ();
|
|
758
|
+
fi;
|
|
759
|
+
graphiso := List(AutomorphismGroup(grS, [[1 .. m], [m + 1 .. n + m]]),
|
|
760
|
+
x -> x * g);
|
|
761
|
+
|
|
762
|
+
tuples := EnumeratorOfCartesianProduct(
|
|
763
|
+
List([1 .. Length(DigraphConnectedComponents(grS).comps)],
|
|
764
|
+
x -> H));
|
|
765
|
+
# find an induced function, if there is one
|
|
766
|
+
RZMStoRZMSInducedFunction := SEMIGROUPS.RZMStoRZMSInducedFunction;
|
|
767
|
+
for l in graphiso do
|
|
768
|
+
for g in groupiso do
|
|
769
|
+
for tup in tuples do
|
|
770
|
+
# TODO(never) it should be possible to cut this down
|
|
771
|
+
map := RZMStoRZMSInducedFunction(S, T, l, g, tup);
|
|
772
|
+
if map <> fail then
|
|
773
|
+
return RZMSIsoByTripleNC(S, T, [l, g, map]);
|
|
774
|
+
fi;
|
|
775
|
+
od;
|
|
776
|
+
od;
|
|
777
|
+
od;
|
|
778
|
+
return fail;
|
|
779
|
+
end);
|
|
780
|
+
|
|
781
|
+
#############################################################################
|
|
782
|
+
# 5. RMS/RZMSIsoByTriple
|
|
783
|
+
#############################################################################
|
|
784
|
+
|
|
785
|
+
InstallMethod(RMSIsoByTriple,
|
|
786
|
+
"for two Rees matrix semigroups and a dense list",
|
|
787
|
+
[IsReesMatrixSemigroup, IsReesMatrixSemigroup, IsDenseList],
|
|
788
|
+
function(R1, R2, triple)
|
|
789
|
+
local graph_iso, group_iso, g2_elms_list, nrrows, nrcols, G1, G2;
|
|
790
|
+
graph_iso := triple[1];
|
|
791
|
+
group_iso := triple[2];
|
|
792
|
+
g2_elms_list := triple[3];
|
|
793
|
+
|
|
794
|
+
# Check number of rows and cols
|
|
795
|
+
nrcols := Length(Rows(R1)); # rows of R1 are cols of the matrix
|
|
796
|
+
nrrows := Length(Columns(R1));
|
|
797
|
+
if nrcols <> Length(Rows(R2)) or nrrows <> Length(Columns(R2)) then
|
|
798
|
+
ErrorNoReturn("the 1st and 2nd arguments (Rees matrix semigroups) ",
|
|
799
|
+
"have different numbers of rows and columns");
|
|
800
|
+
fi;
|
|
801
|
+
|
|
802
|
+
# Check graph isomorphism
|
|
803
|
+
if not IsPerm(graph_iso) then
|
|
804
|
+
ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
|
|
805
|
+
"not a permutation");
|
|
806
|
+
elif LargestMovedPoint(graph_iso) > nrrows + nrcols then
|
|
807
|
+
ErrorNoReturn("the 1st entry (a permutation) in the 3rd argument ",
|
|
808
|
+
"(a triple) is not a permutation on [1 .. ",
|
|
809
|
+
nrrows + nrcols, "]");
|
|
810
|
+
elif ForAny([1 .. nrcols], x -> x ^ graph_iso > nrcols) then
|
|
811
|
+
ErrorNoReturn("the 1st entry (a permutation) in the 3rd argument ",
|
|
812
|
+
"(a triple) maps rows to columns");
|
|
813
|
+
fi;
|
|
814
|
+
|
|
815
|
+
# Check group isomorphism
|
|
816
|
+
G1 := UnderlyingSemigroup(R1);
|
|
817
|
+
G2 := UnderlyingSemigroup(R2);
|
|
818
|
+
if not (IsGroupHomomorphism(group_iso) and
|
|
819
|
+
IsBijective(group_iso) and
|
|
820
|
+
Source(group_iso) = G1 and
|
|
821
|
+
Range(group_iso) = G2) then
|
|
822
|
+
ErrorNoReturn("the 2nd entry in the 3rd argument (a triple)",
|
|
823
|
+
" is not an isomorphism between the underlying groups",
|
|
824
|
+
" of the 1st and 2nd arguments (Rees matrix semigroups)");
|
|
825
|
+
fi;
|
|
826
|
+
|
|
827
|
+
# Check map from rows and cols to H
|
|
828
|
+
if Length(g2_elms_list) <> nrrows + nrcols then
|
|
829
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
830
|
+
"does not have length equal to the number of rows and ",
|
|
831
|
+
"columns of the 1st argument (a Rees matrix semigroup)");
|
|
832
|
+
elif not ForAll(g2_elms_list, x -> x in G2) then
|
|
833
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
834
|
+
" does not consist of elements of the underlying group",
|
|
835
|
+
" of the 2nd argument (a Rees matrix semigroup)");
|
|
836
|
+
elif SEMIGROUPS.RMSInducedFunction(R1, R2, graph_iso, group_iso,
|
|
837
|
+
g2_elms_list[1]) <> g2_elms_list then
|
|
838
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
839
|
+
" does not define an isomorphism");
|
|
840
|
+
fi;
|
|
841
|
+
|
|
842
|
+
return RMSIsoByTripleNC(R1, R2, triple);
|
|
843
|
+
end);
|
|
844
|
+
|
|
845
|
+
InstallMethod(RZMSIsoByTriple,
|
|
846
|
+
"for two Rees 0-matrix semigroups and a dense list",
|
|
847
|
+
[IsReesZeroMatrixSemigroup, IsReesZeroMatrixSemigroup, IsDenseList],
|
|
848
|
+
function(R1, R2, triple)
|
|
849
|
+
local graph_iso, group_iso, g2_elms_list, nrrows, nrcols, graph1, graph2, G1,
|
|
850
|
+
G2, reps, map, rep;
|
|
851
|
+
graph_iso := triple[1];
|
|
852
|
+
group_iso := triple[2];
|
|
853
|
+
g2_elms_list := triple[3];
|
|
854
|
+
|
|
855
|
+
# Check number of rows and cols
|
|
856
|
+
nrrows := Length(Rows(R1));
|
|
857
|
+
nrcols := Length(Columns(R1));
|
|
858
|
+
if nrrows <> Length(Rows(R2)) or nrcols <> Length(Columns(R2)) then
|
|
859
|
+
ErrorNoReturn("the 1st and 2nd arguments (Rees 0-matrix semigroups) ",
|
|
860
|
+
"have different numbers of rows and columns");
|
|
861
|
+
fi;
|
|
862
|
+
|
|
863
|
+
# Check graph isomorphism
|
|
864
|
+
graph1 := RZMSDigraph(R1);
|
|
865
|
+
graph2 := RZMSDigraph(R2);
|
|
866
|
+
if not IsPerm(graph_iso) then
|
|
867
|
+
ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
|
|
868
|
+
"not a permutation");
|
|
869
|
+
elif not OnDigraphs(graph1, graph_iso) = graph2 then
|
|
870
|
+
ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
|
|
871
|
+
"not an isomorphism from the graph of the 1st argument (a",
|
|
872
|
+
" Rees 0-matrix semigroup) and the graph of the 2nd ",
|
|
873
|
+
"argument (a Rees 0-matrix semigroup)");
|
|
874
|
+
fi;
|
|
875
|
+
|
|
876
|
+
# Check group isomorphism
|
|
877
|
+
G1 := UnderlyingSemigroup(R1);
|
|
878
|
+
G2 := UnderlyingSemigroup(R2);
|
|
879
|
+
if not (IsGroupHomomorphism(group_iso) and
|
|
880
|
+
IsBijective(group_iso) and
|
|
881
|
+
Source(group_iso) = G1 and
|
|
882
|
+
Range(group_iso) = G2) then
|
|
883
|
+
ErrorNoReturn("the 2nd entry in the 3rd argument (a triple)",
|
|
884
|
+
" is not an isomorphism between the underlying groups",
|
|
885
|
+
" of the 1st and 2nd arguments (Rees 0-matrix semigroups)");
|
|
886
|
+
fi;
|
|
887
|
+
|
|
888
|
+
# Check map from rows and cols to H
|
|
889
|
+
if Length(g2_elms_list) <> nrrows + nrcols then
|
|
890
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
891
|
+
"does not have length equal to the number of rows and ",
|
|
892
|
+
"columns of the 1st argument (a Rees 0-matrix semigroup)");
|
|
893
|
+
elif not ForAll(g2_elms_list, x -> x in G2) then
|
|
894
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
895
|
+
" does not consist of elements of the underlying group",
|
|
896
|
+
" of the 2nd argument (a Rees 0-matrix semigroup)");
|
|
897
|
+
fi;
|
|
898
|
+
reps := List(DigraphConnectedComponents(graph1).comps, Representative);
|
|
899
|
+
map := EmptyPlist(Length(reps));
|
|
900
|
+
for rep in reps do
|
|
901
|
+
map[rep] := g2_elms_list[rep];
|
|
902
|
+
od;
|
|
903
|
+
if SEMIGROUPS.RZMStoRZMSInducedFunction(R1, R2, graph_iso, group_iso, map)
|
|
904
|
+
<> g2_elms_list then
|
|
905
|
+
ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
|
|
906
|
+
" does not define an isomorphism");
|
|
907
|
+
fi;
|
|
908
|
+
|
|
909
|
+
return RZMSIsoByTripleNC(R1, R2, triple);
|
|
910
|
+
end);
|
|
911
|
+
|
|
912
|
+
InstallMethod(RMSIsoByTripleNC,
|
|
913
|
+
"for two Rees matrix semigroups and a dense list",
|
|
914
|
+
[IsReesMatrixSemigroup, IsReesMatrixSemigroup, IsDenseList],
|
|
915
|
+
function(R1, R2, triple)
|
|
916
|
+
local fam, out;
|
|
917
|
+
fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(R1)),
|
|
918
|
+
ElementsFamily(FamilyObj(R2)));
|
|
919
|
+
out := Objectify(NewType(fam, IsRMSIsoByTriple), rec(triple := triple));
|
|
920
|
+
SetSource(out, R1);
|
|
921
|
+
SetRange(out, R2);
|
|
922
|
+
return out;
|
|
923
|
+
end);
|
|
924
|
+
|
|
925
|
+
InstallMethod(RZMSIsoByTripleNC,
|
|
926
|
+
"for two Rees 0-matrix semigroups and a dense list",
|
|
927
|
+
[IsReesZeroMatrixSemigroup, IsReesZeroMatrixSemigroup, IsDenseList],
|
|
928
|
+
function(R1, R2, triple)
|
|
929
|
+
local fam, out;
|
|
930
|
+
fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(R1)),
|
|
931
|
+
ElementsFamily(FamilyObj(R2)));
|
|
932
|
+
out := Objectify(NewType(fam, IsRZMSIsoByTriple), rec(triple := triple));
|
|
933
|
+
SetSource(out, R1);
|
|
934
|
+
SetRange(out, R2);
|
|
935
|
+
return out;
|
|
936
|
+
end);
|
|
937
|
+
|
|
938
|
+
InstallMethod(ELM_LIST, "for objects in `IsRMSIsoByTriple'",
|
|
939
|
+
[IsRMSIsoByTriple, IsPosInt], {x, i} -> x!.triple[i]);
|
|
940
|
+
|
|
941
|
+
InstallMethod(ELM_LIST, "for objects in `IsRZMSIsoByTriple'",
|
|
942
|
+
[IsRZMSIsoByTriple, IsPosInt], {x, i} -> x!.triple[i]);
|
|
943
|
+
|
|
944
|
+
InstallMethod(\=, "for isomorphisms of Rees (0-)matrix semigroups",
|
|
945
|
+
[IsRMSOrRZMSIsoByTriple, IsRMSOrRZMSIsoByTriple],
|
|
946
|
+
function(x, y)
|
|
947
|
+
|
|
948
|
+
if Source(x) <> Source(y) or Range(x) <> Range(y) then
|
|
949
|
+
return false;
|
|
950
|
+
elif x[1] = y[1] and x[2] = y[2] and x[3] = y[3] then
|
|
951
|
+
return true;
|
|
952
|
+
fi;
|
|
953
|
+
|
|
954
|
+
return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
|
|
955
|
+
= OnTuples(GeneratorsOfSemigroup(Source(x)), y);
|
|
956
|
+
end);
|
|
957
|
+
|
|
958
|
+
InstallMethod(\<, "for objects in `IsRMSIsoByTriple'",
|
|
959
|
+
IsIdenticalObj,
|
|
960
|
+
[IsRMSIsoByTriple, IsRMSIsoByTriple],
|
|
961
|
+
function(x, y)
|
|
962
|
+
return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
|
|
963
|
+
< OnTuples(GeneratorsOfSemigroup(Source(x)), y);
|
|
964
|
+
end);
|
|
965
|
+
|
|
966
|
+
InstallMethod(\<, "for objects in `IsRZMSIsoByTriple'",
|
|
967
|
+
IsIdenticalObj,
|
|
968
|
+
[IsRZMSIsoByTriple, IsRZMSIsoByTriple],
|
|
969
|
+
function(x, y)
|
|
970
|
+
return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
|
|
971
|
+
< OnTuples(GeneratorsOfSemigroup(Source(x)), y);
|
|
972
|
+
end);
|
|
973
|
+
|
|
974
|
+
InstallMethod(CompositionMapping2, "for objects in `IsRMSIsoByTriple'",
|
|
975
|
+
[IsRMSIsoByTriple, IsRMSIsoByTriple],
|
|
976
|
+
function(map2, map1)
|
|
977
|
+
local n;
|
|
978
|
+
n := Length(Rows(Source(map2))) + Length(Columns(Source(map2)));
|
|
979
|
+
return RMSIsoByTripleNC(Source(map1),
|
|
980
|
+
Range(map2),
|
|
981
|
+
[map1[1] * map2[1],
|
|
982
|
+
map1[2] * map2[2],
|
|
983
|
+
List([1 .. n],
|
|
984
|
+
i -> map2[3][i ^ map1[1]] * map1[3][i] ^
|
|
985
|
+
map2[2])]);
|
|
986
|
+
end);
|
|
987
|
+
|
|
988
|
+
InstallMethod(CompositionMapping2, "for objects in `IsRZMSIsoByTriple'",
|
|
989
|
+
IsIdenticalObj, [IsRZMSIsoByTriple, IsRZMSIsoByTriple],
|
|
990
|
+
function(map2, map1)
|
|
991
|
+
local n;
|
|
992
|
+
n := Length(Rows(Source(map1))) + Length(Columns(Source(map1)));
|
|
993
|
+
return RZMSIsoByTripleNC(Source(map1),
|
|
994
|
+
Range(map2),
|
|
995
|
+
[map1[1] * map2[1],
|
|
996
|
+
map1[2] * map2[2],
|
|
997
|
+
List([1 .. n],
|
|
998
|
+
i -> map2[3][i ^ map1[1]] * map1[3][i] ^
|
|
999
|
+
map2[2])]);
|
|
1000
|
+
end);
|
|
1001
|
+
|
|
1002
|
+
InstallMethod(ImagesElm, "for an RMS element under a mapping by a triple",
|
|
1003
|
+
FamSourceEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
|
|
1004
|
+
{triple, x} -> [ImagesRepresentative(triple, x)]);
|
|
1005
|
+
|
|
1006
|
+
InstallMethod(ImagesElm, "for an RZMS element under a mapping by a triple",
|
|
1007
|
+
FamSourceEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
|
|
1008
|
+
{triple, x} -> [ImagesRepresentative(triple, x)]);
|
|
1009
|
+
|
|
1010
|
+
InstallMethod(ImagesRepresentative,
|
|
1011
|
+
"for an RMS element under a mapping by a triple",
|
|
1012
|
+
FamSourceEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
|
|
1013
|
+
function(map, x)
|
|
1014
|
+
local m;
|
|
1015
|
+
m := Length(Rows(Source(map)));
|
|
1016
|
+
return RMSElementNC(Range(map),
|
|
1017
|
+
x[1] ^ map[1],
|
|
1018
|
+
map[3][x[1]] * x[2] ^ map[2] / map[3][x[3] + m],
|
|
1019
|
+
(x[3] + m) ^ map[1] - m);
|
|
1020
|
+
end);
|
|
1021
|
+
|
|
1022
|
+
InstallMethod(ImagesRepresentative,
|
|
1023
|
+
"for an RZMS element under a mapping by a triple",
|
|
1024
|
+
FamSourceEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
|
|
1025
|
+
function(map, x)
|
|
1026
|
+
local m;
|
|
1027
|
+
|
|
1028
|
+
m := Length(Rows(Source(map)));
|
|
1029
|
+
if x = MultiplicativeZero(Source(map)) or map[3][x[1]] = 0
|
|
1030
|
+
or map[3][x[3] + m] = 0 then
|
|
1031
|
+
return MultiplicativeZero(Range(map));
|
|
1032
|
+
fi;
|
|
1033
|
+
return RMSElementNC(Range(map),
|
|
1034
|
+
x[1] ^ map[1],
|
|
1035
|
+
map[3][x[1]] * x[2] ^ map[2] / map[3][x[3] + m],
|
|
1036
|
+
(x[3] + m) ^ map[1] - m);
|
|
1037
|
+
end);
|
|
1038
|
+
|
|
1039
|
+
InstallMethod(InverseGeneralMapping, "for objects in `IsRMSIsoByTriple'",
|
|
1040
|
+
[IsRMSIsoByTriple],
|
|
1041
|
+
function(map)
|
|
1042
|
+
local n, inv;
|
|
1043
|
+
n := Length(Rows(Source(map))) + Length(Columns(Source(map)));
|
|
1044
|
+
inv := InverseGeneralMapping(map[2]);
|
|
1045
|
+
return RMSIsoByTripleNC(Range(map),
|
|
1046
|
+
Source(map),
|
|
1047
|
+
[map[1] ^ -1,
|
|
1048
|
+
inv,
|
|
1049
|
+
List([1 .. n],
|
|
1050
|
+
i -> ((map[3][i ^ (map[1] ^ -1)] ^ inv)
|
|
1051
|
+
^ -1))]);
|
|
1052
|
+
end);
|
|
1053
|
+
|
|
1054
|
+
InstallMethod(InverseGeneralMapping, "for objects in `IsRMSIsoByTriple'",
|
|
1055
|
+
[IsRMSIsoByTriple and IsOne], x -> x);
|
|
1056
|
+
|
|
1057
|
+
InstallMethod(InverseGeneralMapping, "for objects in `IsRZMSIsoByTriple'",
|
|
1058
|
+
[IsRZMSIsoByTriple],
|
|
1059
|
+
function(map)
|
|
1060
|
+
local n, inv;
|
|
1061
|
+
n := Length(Rows(Source(map))) + Length(Columns(Source(map)));
|
|
1062
|
+
inv := InverseGeneralMapping(map[2]);
|
|
1063
|
+
return RZMSIsoByTripleNC(Range(map),
|
|
1064
|
+
Source(map),
|
|
1065
|
+
[map[1] ^ -1,
|
|
1066
|
+
inv,
|
|
1067
|
+
List([1 .. n],
|
|
1068
|
+
i -> (map[3][i ^ (map[1] ^ -1)] ^ inv) ^ -1)]);
|
|
1069
|
+
end);
|
|
1070
|
+
|
|
1071
|
+
InstallMethod(IsOne, "for objects in `IsRMSIsoByTriple'",
|
|
1072
|
+
[IsRMSIsoByTriple],
|
|
1073
|
+
{map} -> IsOne(map[1]) and IsOne(map[2]) and ForAll(map[3], IsOne));
|
|
1074
|
+
|
|
1075
|
+
InstallMethod(IsOne, "for objects in `IsRZMSIsoByTriple'",
|
|
1076
|
+
[IsEndoGeneralMapping and IsRZMSIsoByTriple],
|
|
1077
|
+
{map} -> IsOne(map[1]) and IsOne(map[2]) and ForAll(map[3], IsOne));
|
|
1078
|
+
|
|
1079
|
+
InstallMethod(PreImagesRepresentativeNC,
|
|
1080
|
+
"for an RMS element under a mapping by a triple",
|
|
1081
|
+
FamRangeEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
|
|
1082
|
+
{map, x} -> ImagesRepresentative(InverseGeneralMapping(map), x));
|
|
1083
|
+
|
|
1084
|
+
InstallMethod(PreImagesRepresentativeNC,
|
|
1085
|
+
"for an RZMS element under a mapping by a triple",
|
|
1086
|
+
FamRangeEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
|
|
1087
|
+
{map, x} -> ImagesRepresentative(InverseGeneralMapping(map), x));
|
|
1088
|
+
|
|
1089
|
+
InstallMethod(PrintObj, "for an object in `IsRMSIsoByTriple'",
|
|
1090
|
+
[IsRMSIsoByTriple],
|
|
1091
|
+
function(map)
|
|
1092
|
+
Print("RMSIsoByTriple ( ", Source(map), ", ", Range(map), ", [", map[1],
|
|
1093
|
+
", ", map[2], ", ", map[3], "])");
|
|
1094
|
+
return;
|
|
1095
|
+
end);
|
|
1096
|
+
|
|
1097
|
+
InstallMethod(PrintObj, "for an object in `IsRZMSIsoByTriple'",
|
|
1098
|
+
[IsRZMSIsoByTriple],
|
|
1099
|
+
function(map)
|
|
1100
|
+
Print("RZMSIsoByTriple ( ", Source(map), ", ", Range(map), ", ", map[1],
|
|
1101
|
+
", ", map[2], ", ", map[3], " )");
|
|
1102
|
+
return;
|
|
1103
|
+
end);
|
|
1104
|
+
|
|
1105
|
+
# InstallMethod(PrintString, "for an object in `IsRMSIsoByTriple'",
|
|
1106
|
+
# [IsRMSIsoByTriple],
|
|
1107
|
+
# function(map)
|
|
1108
|
+
# return StringFormatted("RMSIsoByTriple({}, {}, [{}, {}, {}])",
|
|
1109
|
+
# Source(map),
|
|
1110
|
+
# Range(map),
|
|
1111
|
+
# map[1],
|
|
1112
|
+
# map[2],
|
|
1113
|
+
# map[3]);
|
|
1114
|
+
# end);
|
|
1115
|
+
#
|
|
1116
|
+
# InstallMethod(PrintString, "for an object in `IsRZMSIsoByTriple'",
|
|
1117
|
+
# [IsRZMSIsoByTriple],
|
|
1118
|
+
# function(map)
|
|
1119
|
+
# return StringFormatted("RZMSIsoByTriple({}, {}, [{}, {}, {}])",
|
|
1120
|
+
# Source(map),
|
|
1121
|
+
# Range(map),
|
|
1122
|
+
# map[1],
|
|
1123
|
+
# map[2],
|
|
1124
|
+
# map[3]);
|
|
1125
|
+
# end);
|
|
1126
|
+
|
|
1127
|
+
InstallMethod(ViewObj, "for an object in `IsRMSIsoByTriple'",
|
|
1128
|
+
[IsRMSIsoByTriple],
|
|
1129
|
+
function(map)
|
|
1130
|
+
Print("(", map[1], ", ", map[2], ", ", map[3], ")");
|
|
1131
|
+
end);
|
|
1132
|
+
|
|
1133
|
+
InstallMethod(ViewObj, "for object in `IsRZMSIsoByTriple'",
|
|
1134
|
+
[IsRZMSIsoByTriple],
|
|
1135
|
+
function(map)
|
|
1136
|
+
Print("(", map[1], ", ", map[2], ", ", map[3], ")");
|
|
1137
|
+
end);
|
|
1138
|
+
|
|
1139
|
+
# InstallMethod(ViewString, "for an object in `IsRMSIsoByTriple'",
|
|
1140
|
+
# [IsRMSIsoByTriple],
|
|
1141
|
+
# {map} -> StringFormatted("({!v}, {!v}, {!v})", map[1], map[2], map[3]);
|
|
1142
|
+
#
|
|
1143
|
+
# InstallMethod(ViewString, "for object in `IsRZMSIsoByTriple'",
|
|
1144
|
+
# [IsRZMSIsoByTriple],
|
|
1145
|
+
# {map} -> StringFormatted("({!v}, {!v}, {!v})", map[1], map[2], map[3]);
|
|
1146
|
+
|
|
1147
|
+
InstallMethod(IsomorphismReesMatrixSemigroupOverPermGroup,
|
|
1148
|
+
"for a semigroup",
|
|
1149
|
+
[IsSemigroup],
|
|
1150
|
+
function(S)
|
|
1151
|
+
local iso, T, G, isoG, invG, s;
|
|
1152
|
+
|
|
1153
|
+
if not IsFinite(S) or not IsSimpleSemigroup(S) then
|
|
1154
|
+
ErrorNoReturn("the argument is not a finite simple semigroup");
|
|
1155
|
+
elif not IsReesMatrixSemigroup(S) then
|
|
1156
|
+
return IsomorphismReesMatrixSemigroup(S);
|
|
1157
|
+
elif not IsWholeFamily(S) then
|
|
1158
|
+
iso := IsomorphismReesMatrixSemigroup(S);
|
|
1159
|
+
T := Range(iso);
|
|
1160
|
+
if IsPermGroup(UnderlyingSemigroup(T)) then
|
|
1161
|
+
return iso;
|
|
1162
|
+
fi;
|
|
1163
|
+
return CompositionMapping(IsomorphismReesMatrixSemigroupOverPermGroup(T),
|
|
1164
|
+
iso);
|
|
1165
|
+
fi;
|
|
1166
|
+
|
|
1167
|
+
G := UnderlyingSemigroup(S);
|
|
1168
|
+
isoG := IsomorphismPermGroup(G);
|
|
1169
|
+
invG := InverseGeneralMapping(isoG);
|
|
1170
|
+
s := ReesMatrixSemigroup(Range(isoG),
|
|
1171
|
+
List(Matrix(S), x -> OnTuples(x, isoG)));
|
|
1172
|
+
return SemigroupIsomorphismByFunctionNC(S, s,
|
|
1173
|
+
x -> RMSElement(s, x![1], x![2] ^ isoG, x![3]),
|
|
1174
|
+
x -> RMSElement(S, x![1], x![2] ^ invG, x![3]));
|
|
1175
|
+
end);
|
|
1176
|
+
|
|
1177
|
+
InstallMethod(IsomorphismReesZeroMatrixSemigroupOverPermGroup,
|
|
1178
|
+
"for a semigroup",
|
|
1179
|
+
[IsSemigroup],
|
|
1180
|
+
function(S)
|
|
1181
|
+
local iso, T, G, isoG, invG, s, func;
|
|
1182
|
+
|
|
1183
|
+
if not IsFinite(S) or not IsZeroSimpleSemigroup(S) then
|
|
1184
|
+
ErrorNoReturn("the argument is not a finite 0-simple semigroup");
|
|
1185
|
+
elif not IsReesZeroMatrixSemigroup(S) then
|
|
1186
|
+
return IsomorphismReesZeroMatrixSemigroup(S);
|
|
1187
|
+
elif not IsWholeFamily(S) then
|
|
1188
|
+
iso := IsomorphismReesZeroMatrixSemigroup(S);
|
|
1189
|
+
T := Range(iso);
|
|
1190
|
+
if IsPermGroup(UnderlyingSemigroup(T)) then
|
|
1191
|
+
return iso;
|
|
1192
|
+
fi;
|
|
1193
|
+
return CompositionMapping(
|
|
1194
|
+
IsomorphismReesZeroMatrixSemigroupOverPermGroup(T), iso);
|
|
1195
|
+
fi;
|
|
1196
|
+
|
|
1197
|
+
func := function(x, map)
|
|
1198
|
+
if x = 0 then
|
|
1199
|
+
return 0;
|
|
1200
|
+
fi;
|
|
1201
|
+
return x ^ map;
|
|
1202
|
+
end;
|
|
1203
|
+
|
|
1204
|
+
G := UnderlyingSemigroup(S);
|
|
1205
|
+
isoG := IsomorphismPermGroup(G);
|
|
1206
|
+
invG := InverseGeneralMapping(isoG);
|
|
1207
|
+
s := ReesZeroMatrixSemigroup(Range(isoG),
|
|
1208
|
+
List(Matrix(S),
|
|
1209
|
+
x -> List(x, y -> func(y, isoG))));
|
|
1210
|
+
|
|
1211
|
+
return SemigroupIsomorphismByFunctionNC(S, s,
|
|
1212
|
+
function(x)
|
|
1213
|
+
if x![1] = 0 then
|
|
1214
|
+
return MultiplicativeZero(s);
|
|
1215
|
+
fi;
|
|
1216
|
+
return RMSElement(s, x![1], func(x![2], isoG), x![3]);
|
|
1217
|
+
end,
|
|
1218
|
+
function(x)
|
|
1219
|
+
if x![1] = 0 then
|
|
1220
|
+
return MultiplicativeZero(S);
|
|
1221
|
+
fi;
|
|
1222
|
+
return RMSElement(S, x![1], func(x![2], invG), x![3]);
|
|
1223
|
+
end);
|
|
1224
|
+
end);
|
|
1225
|
+
|
|
1226
|
+
InstallMethod(CanonicalReesZeroMatrixSemigroup,
|
|
1227
|
+
"for a Rees zero matrix semigroup",
|
|
1228
|
+
[IsReesZeroMatrixSemigroup],
|
|
1229
|
+
function(S)
|
|
1230
|
+
local Flatten3DPoint, Unflatten3DPoint, SetToZeroGroupMatrix,
|
|
1231
|
+
ZeroGroupMatrixToSet, RZMSMatrixIsomorphismGroup, M, G, m, n, setM, GG;
|
|
1232
|
+
# Go from a triple in I x J x {1 .. |G| + 1} to an integer in
|
|
1233
|
+
# [1 .. |I| * |J| * (|G| + 1)]. Inverse of Unflatten3DPoint.
|
|
1234
|
+
Flatten3DPoint := function(dimensions, point)
|
|
1235
|
+
return (point[1] - 1) * dimensions[2] * dimensions[3] +
|
|
1236
|
+
(point[2] - 1) * dimensions[3] + (point[3] - 1) + 1;
|
|
1237
|
+
end;
|
|
1238
|
+
|
|
1239
|
+
# Go from an integer in [1 .. |I| * |J| * (|G| + 1)] to an element of
|
|
1240
|
+
# I x J x {1 .. |G| + 1}. Inverse of Flatten3DPoint.
|
|
1241
|
+
Unflatten3DPoint := function(dimensions, value)
|
|
1242
|
+
local ret;
|
|
1243
|
+
ret := [];
|
|
1244
|
+
value := value - 1;
|
|
1245
|
+
ret[3] := value mod dimensions[3] + 1;
|
|
1246
|
+
value := value - (ret[3] - 1);
|
|
1247
|
+
value := value / dimensions[3];
|
|
1248
|
+
ret[2] := value mod dimensions[2] + 1;
|
|
1249
|
+
value := value - (ret[2] - 1);
|
|
1250
|
+
ret[1] := value / dimensions[2] + 1;
|
|
1251
|
+
return ret;
|
|
1252
|
+
end;
|
|
1253
|
+
|
|
1254
|
+
# Unflatten the entries of a set representing a matrix over a 0-group and
|
|
1255
|
+
# return the corresponding matrix. Inverse of ZeroGroupMatrixToSet.
|
|
1256
|
+
SetToZeroGroupMatrix := function(set, nr_rows, nr_cols, G)
|
|
1257
|
+
local 0G, mat, dim, point, x;
|
|
1258
|
+
0G := Concatenation([0], Enumerator(G));
|
|
1259
|
+
mat := List([1 .. nr_rows], a -> EmptyPlist(nr_cols));
|
|
1260
|
+
dim := [nr_rows, nr_cols, Size(G) + 1];
|
|
1261
|
+
for x in set do
|
|
1262
|
+
point := Unflatten3DPoint(dim, x);
|
|
1263
|
+
mat[point[1]][point[2]] := 0G[point[3]];
|
|
1264
|
+
od;
|
|
1265
|
+
return mat;
|
|
1266
|
+
end;
|
|
1267
|
+
|
|
1268
|
+
# Flatten the entries of a matrix over a 0-group and return as a set of
|
|
1269
|
+
# integers. Inverse of SetToZeroGroupMatrix.
|
|
1270
|
+
ZeroGroupMatrixToSet := function(mat, nr_rows, nr_cols, G)
|
|
1271
|
+
local set, dim, i, j;
|
|
1272
|
+
set := [];
|
|
1273
|
+
dim := [nr_rows, nr_cols, Size(G) + 1];
|
|
1274
|
+
for i in [1 .. nr_rows] do
|
|
1275
|
+
for j in [1 .. nr_cols] do
|
|
1276
|
+
if mat[i][j] = 0 then
|
|
1277
|
+
Add(set, Flatten3DPoint(dim, [i, j, 1]));
|
|
1278
|
+
else
|
|
1279
|
+
Add(set,
|
|
1280
|
+
Flatten3DPoint(dim, [i, j, 1 + Position(Enumerator(G),
|
|
1281
|
+
mat[i][j])]));
|
|
1282
|
+
fi;
|
|
1283
|
+
od;
|
|
1284
|
+
od;
|
|
1285
|
+
return set;
|
|
1286
|
+
end;
|
|
1287
|
+
|
|
1288
|
+
# The representation of the group ((G \wr S_m) \times (G \wr S_n)) \rtimes
|
|
1289
|
+
# Aut(G) acting on [1 .. |I| * |J| * (|G| + 1)] where the integers correspond
|
|
1290
|
+
# to entries of a J x I matrix with entries from the 0-group G_0.
|
|
1291
|
+
RZMSMatrixIsomorphismGroup := function(nr_rows, nr_cols, G)
|
|
1292
|
+
local ApplyPermWholeDimension, ApplyPermSingleAssignDimension, dim, S, rows,
|
|
1293
|
+
cols, gens, elms, rmlt, grswaps, lmlt, gcswaps, auto;
|
|
1294
|
+
|
|
1295
|
+
ApplyPermWholeDimension := function(dimensions, dim, perm)
|
|
1296
|
+
local map, point, i;
|
|
1297
|
+
map := [];
|
|
1298
|
+
for i in [1 .. Product(dimensions)] do
|
|
1299
|
+
point := Unflatten3DPoint(dimensions, i);
|
|
1300
|
+
point[dim] := point[dim] ^ perm;
|
|
1301
|
+
map[i] := Flatten3DPoint(dimensions, point);
|
|
1302
|
+
od;
|
|
1303
|
+
return PermList(map);
|
|
1304
|
+
end;
|
|
1305
|
+
|
|
1306
|
+
ApplyPermSingleAssignDimension := function(dimensions, dim,
|
|
1307
|
+
perm, fixdim, fixval)
|
|
1308
|
+
local map, point, i;
|
|
1309
|
+
map := [];
|
|
1310
|
+
for i in [1 .. Product(dimensions)] do
|
|
1311
|
+
point := Unflatten3DPoint(dimensions, i);
|
|
1312
|
+
if point[fixdim] = fixval then
|
|
1313
|
+
point[dim] := point[dim] ^ perm;
|
|
1314
|
+
fi;
|
|
1315
|
+
map[i] := Flatten3DPoint(dimensions, point);
|
|
1316
|
+
od;
|
|
1317
|
+
return PermList(map);
|
|
1318
|
+
end;
|
|
1319
|
+
|
|
1320
|
+
dim := [nr_rows, nr_cols, Size(G) + 1];
|
|
1321
|
+
# Row Swaps
|
|
1322
|
+
S := SymmetricGroup(nr_rows);
|
|
1323
|
+
rows := List(GeneratorsOfGroup(S),
|
|
1324
|
+
x -> ApplyPermWholeDimension(dim, 1, x));
|
|
1325
|
+
|
|
1326
|
+
# Col swaps
|
|
1327
|
+
S := SymmetricGroup(nr_cols);
|
|
1328
|
+
cols := List(GeneratorsOfGroup(S),
|
|
1329
|
+
x -> ApplyPermWholeDimension(dim, 2, x));
|
|
1330
|
+
|
|
1331
|
+
gens := GeneratorsOfGroup(G);
|
|
1332
|
+
elms := ShallowCopy(Enumerator(G));
|
|
1333
|
+
|
|
1334
|
+
# Apply g to each row (left multiplication by inverse):
|
|
1335
|
+
rmlt := List(gens, g -> PermList(Concatenation([1],
|
|
1336
|
+
1 + List(elms, e -> Position(elms, g ^ -1 * e)))));
|
|
1337
|
+
grswaps := List(rmlt, g -> ApplyPermSingleAssignDimension(dim, 3, g, 1, 1));
|
|
1338
|
+
|
|
1339
|
+
# Apply g to each col (right multiplication):
|
|
1340
|
+
lmlt := List(gens, g -> PermList(Concatenation([1],
|
|
1341
|
+
1 + List(elms, e -> Position(elms, e * g)))));
|
|
1342
|
+
gcswaps := List(lmlt, g -> ApplyPermSingleAssignDimension(dim, 3, g, 2, 1));
|
|
1343
|
+
|
|
1344
|
+
# Automorphisms of G
|
|
1345
|
+
S := AutomorphismGroup(G);
|
|
1346
|
+
auto := Filtered(GeneratorsOfGroup(S), x -> not IsInnerAutomorphism(x));
|
|
1347
|
+
auto := List(auto, x -> List(Enumerator(G), a ->
|
|
1348
|
+
Position(Enumerator(G), a ^ x)));
|
|
1349
|
+
Apply(auto, a -> PermList(Concatenation([1], a + 1)));
|
|
1350
|
+
auto := List(auto, x -> ApplyPermWholeDimension(dim, 3, x));
|
|
1351
|
+
|
|
1352
|
+
# The RZMS matrix isomorphism group
|
|
1353
|
+
return Group(Flat([rows, cols, grswaps, gcswaps, auto]));
|
|
1354
|
+
end;
|
|
1355
|
+
|
|
1356
|
+
M := Matrix(S);
|
|
1357
|
+
G := UnderlyingSemigroup(S);
|
|
1358
|
+
if not IsGroup(UnderlyingSemigroup(S)) then
|
|
1359
|
+
ErrorNoReturn("the underlying semigroup of the argument ",
|
|
1360
|
+
"(a Rees 0-matrix semigroup) is not a group");
|
|
1361
|
+
fi;
|
|
1362
|
+
m := Length(M);
|
|
1363
|
+
n := Length(M[1]);
|
|
1364
|
+
setM := ZeroGroupMatrixToSet(M, m, n, G);
|
|
1365
|
+
GG := RZMSMatrixIsomorphismGroup(m, n, G);
|
|
1366
|
+
return ReesZeroMatrixSemigroup(G, SetToZeroGroupMatrix(
|
|
1367
|
+
CanonicalImage(GG, setM, OnSets), m, n, G));
|
|
1368
|
+
end);
|
|
1369
|
+
|
|
1370
|
+
InstallMethod(CanonicalReesMatrixSemigroup,
|
|
1371
|
+
"for a Rees matrix semigroup",
|
|
1372
|
+
[IsReesMatrixSemigroup],
|
|
1373
|
+
function(S)
|
|
1374
|
+
local G, mat;
|
|
1375
|
+
G := UnderlyingSemigroup(S);
|
|
1376
|
+
if not IsGroup(G) then
|
|
1377
|
+
ErrorNoReturn("the underlying semigroup of the argument ",
|
|
1378
|
+
"(a Rees 0-matrix semigroup) is not a group");
|
|
1379
|
+
fi;
|
|
1380
|
+
mat := Matrix(CanonicalReesZeroMatrixSemigroup(
|
|
1381
|
+
ReesZeroMatrixSemigroup(G, Matrix(S))));
|
|
1382
|
+
return ReesMatrixSemigroup(G, mat);
|
|
1383
|
+
end);
|