passagemath-gap-pkg-semigroups 10.6.30__cp310-cp310-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-gap-pkg-semigroups might be problematic. Click here for more details.
- gap/pkg/semigroups/CHANGELOG.md +1699 -0
- gap/pkg/semigroups/CONTRIBUTING.md +91 -0
- gap/pkg/semigroups/GNUmakefile +110 -0
- gap/pkg/semigroups/GNUmakefile.in +110 -0
- gap/pkg/semigroups/GPL +674 -0
- gap/pkg/semigroups/LICENSE +16 -0
- gap/pkg/semigroups/Makefile +26 -0
- gap/pkg/semigroups/Makefile.gappkg +225 -0
- gap/pkg/semigroups/PackageInfo.g +529 -0
- gap/pkg/semigroups/README.md +102 -0
- gap/pkg/semigroups/VERSIONS +112 -0
- gap/pkg/semigroups/aclocal.m4 +375 -0
- gap/pkg/semigroups/autogen.sh +25 -0
- gap/pkg/semigroups/bin/aarch64-apple-darwin23-default64-kv10/semigroups.so +0 -0
- gap/pkg/semigroups/config.guess +1807 -0
- gap/pkg/semigroups/config.log +1158 -0
- gap/pkg/semigroups/config.status +1131 -0
- gap/pkg/semigroups/config.sub +1960 -0
- gap/pkg/semigroups/configure +9742 -0
- gap/pkg/semigroups/configure.ac +71 -0
- gap/pkg/semigroups/data/doc/greens.pickle +1 -0
- gap/pkg/semigroups/data/gens/fullbool-8.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/fullbool.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/hall.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex-6.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex.pickle.gz +0 -0
- gap/pkg/semigroups/data/tst/bipart4 +10 -0
- gap/pkg/semigroups/data/tst/pperm10 +1 -0
- gap/pkg/semigroups/data/tst/tables.gz +0 -0
- gap/pkg/semigroups/data/tst/testdata +1 -0
- gap/pkg/semigroups/data/tst/testinstall.pickle +1 -0
- gap/pkg/semigroups/data/tst/trans3 +7 -0
- gap/pkg/semigroups/data/tst/trans3-old +7 -0
- gap/pkg/semigroups/environment.yml +7 -0
- gap/pkg/semigroups/gap/attributes/acting.gd +15 -0
- gap/pkg/semigroups/gap/attributes/acting.gi +297 -0
- gap/pkg/semigroups/gap/attributes/attr.gd +91 -0
- gap/pkg/semigroups/gap/attributes/attr.gi +1214 -0
- gap/pkg/semigroups/gap/attributes/dual.gd +25 -0
- gap/pkg/semigroups/gap/attributes/dual.gi +209 -0
- gap/pkg/semigroups/gap/attributes/factor.gd +17 -0
- gap/pkg/semigroups/gap/attributes/factor.gi +453 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gd +84 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gi +591 -0
- gap/pkg/semigroups/gap/attributes/inverse.gd +38 -0
- gap/pkg/semigroups/gap/attributes/inverse.gi +708 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gd +16 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gi +377 -0
- gap/pkg/semigroups/gap/attributes/isorms.gd +49 -0
- gap/pkg/semigroups/gap/attributes/isorms.gi +1383 -0
- gap/pkg/semigroups/gap/attributes/maximal.gd +16 -0
- gap/pkg/semigroups/gap/attributes/maximal.gi +1876 -0
- gap/pkg/semigroups/gap/attributes/properties.gd +109 -0
- gap/pkg/semigroups/gap/attributes/properties.gi +1658 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gd +39 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gi +1078 -0
- gap/pkg/semigroups/gap/attributes/semifp.gd +12 -0
- gap/pkg/semigroups/gap/attributes/semifp.gi +84 -0
- gap/pkg/semigroups/gap/attributes/translat.gd +474 -0
- gap/pkg/semigroups/gap/attributes/translat.gi +1779 -0
- gap/pkg/semigroups/gap/congruences/cong.gd +154 -0
- gap/pkg/semigroups/gap/congruences/cong.gi +351 -0
- gap/pkg/semigroups/gap/congruences/conginv.gd +38 -0
- gap/pkg/semigroups/gap/congruences/conginv.gi +589 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gd +101 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gi +886 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gi +272 -0
- gap/pkg/semigroups/gap/congruences/congpart.gd +90 -0
- gap/pkg/semigroups/gap/congruences/congpart.gi +449 -0
- gap/pkg/semigroups/gap/congruences/congrees.gd +20 -0
- gap/pkg/semigroups/gap/congruences/congrees.gi +313 -0
- gap/pkg/semigroups/gap/congruences/congrms.gd +54 -0
- gap/pkg/semigroups/gap/congruences/congrms.gi +1467 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gd +28 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gi +289 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gd +27 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gi +236 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gd +20 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gi +271 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gi +250 -0
- gap/pkg/semigroups/gap/elements/bipart.gd +71 -0
- gap/pkg/semigroups/gap/elements/bipart.gi +995 -0
- gap/pkg/semigroups/gap/elements/blocks.gd +31 -0
- gap/pkg/semigroups/gap/elements/blocks.gi +134 -0
- gap/pkg/semigroups/gap/elements/boolmat.gd +74 -0
- gap/pkg/semigroups/gap/elements/boolmat.gi +726 -0
- gap/pkg/semigroups/gap/elements/elements.gd +11 -0
- gap/pkg/semigroups/gap/elements/elements.gi +121 -0
- gap/pkg/semigroups/gap/elements/ffmat.gd +71 -0
- gap/pkg/semigroups/gap/elements/ffmat.gi +311 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gd +131 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gi +782 -0
- gap/pkg/semigroups/gap/elements/pbr.gd +51 -0
- gap/pkg/semigroups/gap/elements/pbr.gi +740 -0
- gap/pkg/semigroups/gap/elements/pperm.gd +11 -0
- gap/pkg/semigroups/gap/elements/pperm.gi +14 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gd +136 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gi +717 -0
- gap/pkg/semigroups/gap/elements/star.gd +21 -0
- gap/pkg/semigroups/gap/elements/star.gi +21 -0
- gap/pkg/semigroups/gap/elements/trans.gd +13 -0
- gap/pkg/semigroups/gap/elements/trans.gi +50 -0
- gap/pkg/semigroups/gap/fp/freeband.gd +22 -0
- gap/pkg/semigroups/gap/fp/freeband.gi +502 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gd +30 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gi +465 -0
- gap/pkg/semigroups/gap/fp/tietze.gd +89 -0
- gap/pkg/semigroups/gap/fp/tietze.gi +1578 -0
- gap/pkg/semigroups/gap/fp/word.gd +15 -0
- gap/pkg/semigroups/gap/fp/word.gi +67 -0
- gap/pkg/semigroups/gap/greens/acting-inverse.gi +774 -0
- gap/pkg/semigroups/gap/greens/acting-regular.gi +553 -0
- gap/pkg/semigroups/gap/greens/acting.gd +81 -0
- gap/pkg/semigroups/gap/greens/acting.gi +2433 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gd +25 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gi +741 -0
- gap/pkg/semigroups/gap/greens/generic.gd +117 -0
- gap/pkg/semigroups/gap/greens/generic.gi +630 -0
- gap/pkg/semigroups/gap/ideals/acting.gd +17 -0
- gap/pkg/semigroups/gap/ideals/acting.gi +1155 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gd +11 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gi +105 -0
- gap/pkg/semigroups/gap/ideals/ideals.gd +45 -0
- gap/pkg/semigroups/gap/ideals/ideals.gi +442 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gd +16 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gi +614 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gd +24 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gi +431 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gd +16 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gi +53 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gd +17 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gi +945 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gd +38 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gi +308 -0
- gap/pkg/semigroups/gap/main/acting.gd +36 -0
- gap/pkg/semigroups/gap/main/acting.gi +779 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gd +72 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gi +655 -0
- gap/pkg/semigroups/gap/main/graded.gd +26 -0
- gap/pkg/semigroups/gap/main/graded.gi +355 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gd +29 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gi +514 -0
- gap/pkg/semigroups/gap/main/orbits.gd +24 -0
- gap/pkg/semigroups/gap/main/orbits.gi +512 -0
- gap/pkg/semigroups/gap/main/semiact.gd +20 -0
- gap/pkg/semigroups/gap/main/semiact.gi +821 -0
- gap/pkg/semigroups/gap/main/setup.gd +61 -0
- gap/pkg/semigroups/gap/main/setup.gi +1094 -0
- gap/pkg/semigroups/gap/obsolete.gd +9 -0
- gap/pkg/semigroups/gap/obsolete.gi +14 -0
- gap/pkg/semigroups/gap/options.g +55 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gd +12 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gi +177 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gi +570 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gd +20 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gi +104 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gd +52 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gi +1194 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gi +509 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gd +126 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gi +889 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gd +104 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gi +1590 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gd +37 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gi +565 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gi +1364 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gd +40 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gi +292 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gd +165 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gi +1225 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gd +72 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gi +710 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gi +74 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gi +139 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gd +27 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gi +711 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gd +14 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gi +97 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gd +16 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gi +21 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gi +977 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gd +49 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gi +909 -0
- gap/pkg/semigroups/gap/tools/display.gd +24 -0
- gap/pkg/semigroups/gap/tools/display.gi +749 -0
- gap/pkg/semigroups/gap/tools/io.gd +17 -0
- gap/pkg/semigroups/gap/tools/io.gi +543 -0
- gap/pkg/semigroups/gap/tools/iterators.gd +16 -0
- gap/pkg/semigroups/gap/tools/iterators.gi +253 -0
- gap/pkg/semigroups/gap/tools/utils.gd +19 -0
- gap/pkg/semigroups/gap/tools/utils.gi +756 -0
- gap/pkg/semigroups/gapbind14/.ccls +18 -0
- gap/pkg/semigroups/gapbind14/.clang-format +104 -0
- gap/pkg/semigroups/gapbind14/CPPLINT.cfg +5 -0
- gap/pkg/semigroups/gapbind14/LICENSE +674 -0
- gap/pkg/semigroups/gapbind14/README.md +76 -0
- gap/pkg/semigroups/gapbind14/demo/.gitignore +4 -0
- gap/pkg/semigroups/gapbind14/demo/LICENSE +293 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.gappkg +220 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.in +19 -0
- gap/pkg/semigroups/gapbind14/demo/PackageInfo.g +87 -0
- gap/pkg/semigroups/gapbind14/demo/README.md +17 -0
- gap/pkg/semigroups/gapbind14/demo/configure +34 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gd +19 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gi +10 -0
- gap/pkg/semigroups/gapbind14/demo/init.g +16 -0
- gap/pkg/semigroups/gapbind14/demo/makedoc.g +10 -0
- gap/pkg/semigroups/gapbind14/demo/read.g +6 -0
- gap/pkg/semigroups/gapbind14/demo/src/gapbind_demo.cc +142 -0
- gap/pkg/semigroups/gapbind14/demo/tst/testall.g +12 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/cpp_fn.hpp +223 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gap_include.hpp +26 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gapbind14.hpp +445 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_free_fn.hpp +420 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_mem_fn.hpp +556 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_cpp.hpp +162 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_gap.hpp +158 -0
- gap/pkg/semigroups/gapbind14/src/.clang-format +108 -0
- gap/pkg/semigroups/gapbind14/src/gapbind14.cpp +334 -0
- gap/pkg/semigroups/init.g +150 -0
- gap/pkg/semigroups/m4/ax_append_flag.m4 +50 -0
- gap/pkg/semigroups/m4/ax_check_compile_flag.m4 +53 -0
- gap/pkg/semigroups/m4/ax_check_hpcombi.m4 +121 -0
- gap/pkg/semigroups/m4/ax_check_libsemigroup.m4 +68 -0
- gap/pkg/semigroups/m4/ax_compare_version.m4 +177 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx_14.m4 +34 -0
- gap/pkg/semigroups/m4/ax_prefix_config_h.m4 +203 -0
- gap/pkg/semigroups/m4/ax_pthread.m4 +522 -0
- gap/pkg/semigroups/m4/find_gap.m4 +94 -0
- gap/pkg/semigroups/makedoc.g +153 -0
- gap/pkg/semigroups/prerequisites.sh +62 -0
- gap/pkg/semigroups/read.g +105 -0
- gap/pkg/semigroups/release.toml +6 -0
- gap/pkg/semigroups/tst/extreme/README +2 -0
- gap/pkg/semigroups/tst/extreme/attrinv.tst +703 -0
- gap/pkg/semigroups/tst/extreme/bipart.tst +2803 -0
- gap/pkg/semigroups/tst/extreme/closure.tst +652 -0
- gap/pkg/semigroups/tst/extreme/cong.tst +286 -0
- gap/pkg/semigroups/tst/extreme/conginv.tst +43 -0
- gap/pkg/semigroups/tst/extreme/examples.tst +2449 -0
- gap/pkg/semigroups/tst/extreme/freeband.tst +37 -0
- gap/pkg/semigroups/tst/extreme/greens-acting-regular.tst +27 -0
- gap/pkg/semigroups/tst/extreme/greens-acting.tst +1999 -0
- gap/pkg/semigroups/tst/extreme/ideals.tst +858 -0
- gap/pkg/semigroups/tst/extreme/inverse.tst +1025 -0
- gap/pkg/semigroups/tst/extreme/maximal.tst +856 -0
- gap/pkg/semigroups/tst/extreme/misc.tst +4236 -0
- gap/pkg/semigroups/tst/extreme/monoid_pkg.tst +1488 -0
- gap/pkg/semigroups/tst/extreme/properties.tst +914 -0
- gap/pkg/semigroups/tst/extreme/semibipart.tst +2837 -0
- gap/pkg/semigroups/tst/extreme/semieunit.tst +49 -0
- gap/pkg/semigroups/tst/extreme/semiffmat.tst +353 -0
- gap/pkg/semigroups/tst/extreme/semigroups.tst +245 -0
- gap/pkg/semigroups/tst/extreme/semiiter.tst +58 -0
- gap/pkg/semigroups/tst/extreme/semirms.tst +1091 -0
- gap/pkg/semigroups/tst/extreme/transform.tst +305 -0
- gap/pkg/semigroups/tst/extreme/translat.tst +44 -0
- gap/pkg/semigroups/tst/standard/README +2 -0
- gap/pkg/semigroups/tst/standard/attributes/acting.tst +388 -0
- gap/pkg/semigroups/tst/standard/attributes/attr.tst +2404 -0
- gap/pkg/semigroups/tst/standard/attributes/dual.tst +308 -0
- gap/pkg/semigroups/tst/standard/attributes/factor.tst +629 -0
- gap/pkg/semigroups/tst/standard/attributes/homomorph.tst +1134 -0
- gap/pkg/semigroups/tst/standard/attributes/inverse.tst +1521 -0
- gap/pkg/semigroups/tst/standard/attributes/isomorph.tst +435 -0
- gap/pkg/semigroups/tst/standard/attributes/isorms.tst +1147 -0
- gap/pkg/semigroups/tst/standard/attributes/maximal.tst +853 -0
- gap/pkg/semigroups/tst/standard/attributes/properties.tst +2028 -0
- gap/pkg/semigroups/tst/standard/attributes/semifp.tst +53 -0
- gap/pkg/semigroups/tst/standard/attributes/translat.tst +796 -0
- gap/pkg/semigroups/tst/standard/congruences/cong.tst +1044 -0
- gap/pkg/semigroups/tst/standard/congruences/conginv.tst +292 -0
- gap/pkg/semigroups/tst/standard/congruences/conglatt.tst +421 -0
- gap/pkg/semigroups/tst/standard/congruences/congpairs.tst +1011 -0
- gap/pkg/semigroups/tst/standard/congruences/congrees.tst +288 -0
- gap/pkg/semigroups/tst/standard/congruences/congrms.tst +701 -0
- gap/pkg/semigroups/tst/standard/congruences/congsemigraph.tst +422 -0
- gap/pkg/semigroups/tst/standard/congruences/congsimple.tst +311 -0
- gap/pkg/semigroups/tst/standard/congruences/conguniv.tst +259 -0
- gap/pkg/semigroups/tst/standard/congruences/congwordgraph.tst +330 -0
- gap/pkg/semigroups/tst/standard/elements/bipart.tst +783 -0
- gap/pkg/semigroups/tst/standard/elements/blocks.tst +166 -0
- gap/pkg/semigroups/tst/standard/elements/boolmat.tst +608 -0
- gap/pkg/semigroups/tst/standard/elements/elements.tst +117 -0
- gap/pkg/semigroups/tst/standard/elements/ffmat.tst +349 -0
- gap/pkg/semigroups/tst/standard/elements/maxplusmat.tst +613 -0
- gap/pkg/semigroups/tst/standard/elements/pbr.tst +506 -0
- gap/pkg/semigroups/tst/standard/elements/pperm.tst +32 -0
- gap/pkg/semigroups/tst/standard/elements/semiringmat.tst +601 -0
- gap/pkg/semigroups/tst/standard/elements/trans.tst +58 -0
- gap/pkg/semigroups/tst/standard/fp/freeband.tst +311 -0
- gap/pkg/semigroups/tst/standard/fp/freeinverse.tst +147 -0
- gap/pkg/semigroups/tst/standard/fp/tietze.tst +780 -0
- gap/pkg/semigroups/tst/standard/fp/word.tst +106 -0
- gap/pkg/semigroups/tst/standard/greens/acting-inverse.tst +545 -0
- gap/pkg/semigroups/tst/standard/greens/acting-regular.tst +396 -0
- gap/pkg/semigroups/tst/standard/greens/acting.tst +2033 -0
- gap/pkg/semigroups/tst/standard/greens/froidure-pin.tst +1831 -0
- gap/pkg/semigroups/tst/standard/greens/generic.tst +1436 -0
- gap/pkg/semigroups/tst/standard/ideals/acting.tst +279 -0
- gap/pkg/semigroups/tst/standard/ideals/froidure-pin.tst +178 -0
- gap/pkg/semigroups/tst/standard/ideals/ideals.tst +380 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/cong.tst +310 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/froidure-pin.tst +778 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/sims1.tst +379 -0
- gap/pkg/semigroups/tst/standard/main/acting.tst +411 -0
- gap/pkg/semigroups/tst/standard/main/froidure-pin.tst +392 -0
- gap/pkg/semigroups/tst/standard/main/semiact.tst +203 -0
- gap/pkg/semigroups/tst/standard/main/setup.tst +1144 -0
- gap/pkg/semigroups/tst/standard/obsolete.tst +19 -0
- gap/pkg/semigroups/tst/standard/options.tst +54 -0
- gap/pkg/semigroups/tst/standard/semigroups/grpperm.tst +581 -0
- gap/pkg/semigroups/tst/standard/semigroups/semibipart.tst +2635 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiboolmat.tst +1871 -0
- gap/pkg/semigroups/tst/standard/semigroups/semicons.tst +1173 -0
- gap/pkg/semigroups/tst/standard/semigroups/semidp.tst +739 -0
- gap/pkg/semigroups/tst/standard/semigroups/semieunit.tst +339 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiex.tst +2055 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiffmat.tst +746 -0
- gap/pkg/semigroups/tst/standard/semigroups/semifp.tst +2702 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigraph.tst +133 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigrp.tst +1112 -0
- gap/pkg/semigroups/tst/standard/semigroups/semimaxplus.tst +654 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipbr.tst +2142 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipperm.tst +2169 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiquo.tst +278 -0
- gap/pkg/semigroups/tst/standard/semigroups/semirms.tst +3010 -0
- gap/pkg/semigroups/tst/standard/semigroups/semitrans.tst +2758 -0
- gap/pkg/semigroups/tst/standard/tools/display.tst +1040 -0
- gap/pkg/semigroups/tst/standard/tools/io.tst +363 -0
- gap/pkg/semigroups/tst/testinstall.tst +1815 -0
- gap/pkg/semigroups/tst/teststandard.g +22 -0
- gap/pkg/semigroups/tst/workspaces/load-workspace.tst +142 -0
- gap/pkg/semigroups/tst/workspaces/load.g +11 -0
- gap/pkg/semigroups/tst/workspaces/save-workspace.tst +166 -0
- gap/pkg/semigroups/tst/workspaces/save.g +14 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA +93 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA.bak +94 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/RECORD +354 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/WHEEL +6 -0
- passagemath_gap_pkg_semigroups-10.6.30.dist-info/top_level.txt +1 -0
- passagemath_gap_pkg_semigroups.dylibs/libsemigroups.2.dylib +0 -0
- sage/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/gap_pkg_semigroups.cpython-310-darwin.so +0 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## congruences/conginv.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 inverse semigroups, using the
|
|
11
|
+
## "kernel and trace" representation.
|
|
12
|
+
##
|
|
13
|
+
## See J.M. Howie's "Fundamentals of Semigroup Theory" Section 5.3, and see
|
|
14
|
+
## Michael Young's MSc thesis "Computing with Semigroup Congruences" Chapter 5
|
|
15
|
+
## (www-circa.mcs.st-and.ac.uk/~mct25/files/mt5099-report.pdf) for more details.
|
|
16
|
+
##
|
|
17
|
+
|
|
18
|
+
InstallImmediateMethod(CanUseLibsemigroupsCongruence,
|
|
19
|
+
IsInverseSemigroupCongruenceByKernelTrace,
|
|
20
|
+
0,
|
|
21
|
+
ReturnFalse);
|
|
22
|
+
|
|
23
|
+
# TODO(later) use a congruence on the semilattice of idempotents for the trace,
|
|
24
|
+
# instead of traceBlocks and traceLookup.
|
|
25
|
+
|
|
26
|
+
InstallGlobalFunction(InverseSemigroupCongruenceByKernelTrace,
|
|
27
|
+
function(S, kernel, traceBlocks)
|
|
28
|
+
local a, x, traceClass, f, l, e;
|
|
29
|
+
if not IsInverseSemigroup(S)
|
|
30
|
+
and IsMultiplicativeElementWithInverseCollection(S) then
|
|
31
|
+
ErrorNoReturn("the 1st argument is not an inverse ",
|
|
32
|
+
"semigroup with inverse op");
|
|
33
|
+
elif not IsInverseSubsemigroup(S, kernel) then
|
|
34
|
+
# Check that the kernel is an inverse subsemigroup
|
|
35
|
+
ErrorNoReturn("the 2nd argument is not an inverse ",
|
|
36
|
+
"subsemigroup of the 1st argument (an inverse semigroup)");
|
|
37
|
+
# CHECK KERNEL IS NORMAL:
|
|
38
|
+
elif NrIdempotents(kernel) <> NrIdempotents(S) then
|
|
39
|
+
# (1) Must contain all the idempotents of S
|
|
40
|
+
ErrorNoReturn("the 2nd argument (an inverse semigroup) does not contain ",
|
|
41
|
+
"all of the idempotents of the 1st argument (an inverse",
|
|
42
|
+
" semigroup)");
|
|
43
|
+
fi;
|
|
44
|
+
# (2) Must be self-conjugate
|
|
45
|
+
for a in kernel do
|
|
46
|
+
for x in GeneratorsOfSemigroup(S) do
|
|
47
|
+
if not a ^ x in kernel then
|
|
48
|
+
ErrorNoReturn("the 2nd argument (an inverse semigroup) must be ",
|
|
49
|
+
"self-conjugate");
|
|
50
|
+
fi;
|
|
51
|
+
od;
|
|
52
|
+
od;
|
|
53
|
+
# Check conditions for a congruence pair: Howie p.156
|
|
54
|
+
for traceClass in traceBlocks do
|
|
55
|
+
for f in traceClass do
|
|
56
|
+
l := LClass(S, f);
|
|
57
|
+
for a in l do
|
|
58
|
+
if a in kernel then
|
|
59
|
+
# Condition (C2): aa' related to a'a
|
|
60
|
+
if not a * a ^ -1 in traceClass then
|
|
61
|
+
ErrorNoReturn("not a valid congruence pair (C2)");
|
|
62
|
+
fi;
|
|
63
|
+
else
|
|
64
|
+
# Condition (C1): (ae in kernel && e related to a'a) => a in kernel
|
|
65
|
+
for e in traceClass do
|
|
66
|
+
if a * e in kernel then
|
|
67
|
+
ErrorNoReturn("not a valid congruence pair (C1)");
|
|
68
|
+
fi;
|
|
69
|
+
od;
|
|
70
|
+
fi;
|
|
71
|
+
od;
|
|
72
|
+
od;
|
|
73
|
+
od;
|
|
74
|
+
# TODO(later) check trace is *normal*
|
|
75
|
+
return InverseSemigroupCongruenceByKernelTraceNC(S, kernel, traceBlocks);
|
|
76
|
+
end);
|
|
77
|
+
|
|
78
|
+
InstallGlobalFunction(InverseSemigroupCongruenceByKernelTraceNC,
|
|
79
|
+
function(S, kernel, traceBlocks)
|
|
80
|
+
local traceLookup, ES, fam, C, i, elm;
|
|
81
|
+
|
|
82
|
+
# Sort blocks
|
|
83
|
+
traceBlocks := SortedList(List(traceBlocks, SortedList));
|
|
84
|
+
|
|
85
|
+
# Calculate lookup table for trace
|
|
86
|
+
# Might remove lookup - might never be better than blocks
|
|
87
|
+
traceLookup := [];
|
|
88
|
+
ES := IdempotentGeneratedSubsemigroup(S);
|
|
89
|
+
|
|
90
|
+
for i in [1 .. Length(traceBlocks)] do
|
|
91
|
+
for elm in traceBlocks[i] do
|
|
92
|
+
traceLookup[PositionCanonical(ES, elm)] := i;
|
|
93
|
+
od;
|
|
94
|
+
od;
|
|
95
|
+
# Construct the object
|
|
96
|
+
fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(S)),
|
|
97
|
+
ElementsFamily(FamilyObj(S)));
|
|
98
|
+
C := Objectify(NewType(fam, IsInverseSemigroupCongruenceByKernelTrace),
|
|
99
|
+
rec(kernel := kernel,
|
|
100
|
+
traceBlocks := traceBlocks,
|
|
101
|
+
traceLookup := traceLookup));
|
|
102
|
+
SetSource(C, S);
|
|
103
|
+
SetRange(C, S);
|
|
104
|
+
SetKernelOfSemigroupCongruence(C, kernel);
|
|
105
|
+
SetTraceOfSemigroupCongruence(C, traceBlocks);
|
|
106
|
+
return C;
|
|
107
|
+
end);
|
|
108
|
+
|
|
109
|
+
InstallMethod(ViewObj,
|
|
110
|
+
"for inverse semigroup congruence by kernel and trace",
|
|
111
|
+
[IsInverseSemigroupCongruenceByKernelTrace],
|
|
112
|
+
function(C)
|
|
113
|
+
Print("<semigroup congruence over ");
|
|
114
|
+
ViewObj(Range(C));
|
|
115
|
+
Print(" with congruence pair (",
|
|
116
|
+
Size(C!.kernel), ",",
|
|
117
|
+
Size(C!.traceBlocks), ")>");
|
|
118
|
+
end);
|
|
119
|
+
|
|
120
|
+
InstallMethod(\=,
|
|
121
|
+
"for two inverse semigroup congruences by kernel and trace",
|
|
122
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
123
|
+
IsInverseSemigroupCongruenceByKernelTrace],
|
|
124
|
+
function(lhop, rhop)
|
|
125
|
+
return(Range(lhop) = Range(rhop) and
|
|
126
|
+
lhop!.kernel = rhop!.kernel and
|
|
127
|
+
lhop!.traceBlocks = rhop!.traceBlocks);
|
|
128
|
+
end);
|
|
129
|
+
|
|
130
|
+
InstallMethod(IsSubrelation,
|
|
131
|
+
"for two inverse semigroup congruences by kernel and trace",
|
|
132
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
133
|
+
IsInverseSemigroupCongruenceByKernelTrace],
|
|
134
|
+
function(lhop, rhop)
|
|
135
|
+
# Tests whether rhop is a subcongruence of lhop
|
|
136
|
+
if Range(lhop) <> Range(rhop) then
|
|
137
|
+
Error("the 1st and 2nd arguments are congruences over different",
|
|
138
|
+
" semigroups");
|
|
139
|
+
fi;
|
|
140
|
+
return IsSubsemigroup(lhop!.kernel, rhop!.kernel)
|
|
141
|
+
and ForAll(rhop!.traceBlocks,
|
|
142
|
+
b2 -> ForAny(lhop!.traceBlocks, b1 -> IsSubset(b1, b2)));
|
|
143
|
+
end);
|
|
144
|
+
|
|
145
|
+
InstallMethod(ImagesElm,
|
|
146
|
+
"for inverse semigroup congruence by kernel and trace and mult. elt.",
|
|
147
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
148
|
+
IsMultiplicativeElementWithInverse],
|
|
149
|
+
function(C, elm)
|
|
150
|
+
local S, images, e, b;
|
|
151
|
+
S := Range(C);
|
|
152
|
+
if not elm in S then
|
|
153
|
+
ErrorNoReturn("the 2nd argument (a mult. elt. with inverse) does not ",
|
|
154
|
+
"belong to the range of the 1st argument (a congruence)");
|
|
155
|
+
fi;
|
|
156
|
+
images := [];
|
|
157
|
+
# Consider all idempotents trace-related to (a^-1 a)
|
|
158
|
+
for e in First(C!.traceBlocks, c -> (elm ^ -1 * elm) in c) do
|
|
159
|
+
for b in LClass(S, e) do
|
|
160
|
+
if elm * b ^ -1 in C!.kernel then
|
|
161
|
+
Add(images, b);
|
|
162
|
+
fi;
|
|
163
|
+
od;
|
|
164
|
+
od;
|
|
165
|
+
return images;
|
|
166
|
+
end);
|
|
167
|
+
|
|
168
|
+
InstallMethod(EquivalenceRelationPartitionWithSingletons,
|
|
169
|
+
"for inverse semigroup congruence by kernel and trace",
|
|
170
|
+
[IsInverseSemigroupCongruenceByKernelTrace],
|
|
171
|
+
function(C)
|
|
172
|
+
local S, elmlists, kernel, blockelmlists, pos, traceBlock, id, elm;
|
|
173
|
+
|
|
174
|
+
S := Range(C);
|
|
175
|
+
elmlists := [];
|
|
176
|
+
kernel := Elements(C!.kernel);
|
|
177
|
+
|
|
178
|
+
# Consider each trace-class in turn
|
|
179
|
+
for traceBlock in C!.traceBlocks do
|
|
180
|
+
# Consider all the congruence classes corresponding to this trace-class
|
|
181
|
+
blockelmlists := []; # List of lists of elms in class
|
|
182
|
+
for id in traceBlock do
|
|
183
|
+
for elm in LClass(S, id) do
|
|
184
|
+
# Find the congruence class that this element lies in
|
|
185
|
+
pos := PositionProperty(blockelmlists,
|
|
186
|
+
class -> elm * class[1] ^ -1 in kernel);
|
|
187
|
+
if pos = fail then
|
|
188
|
+
# New class
|
|
189
|
+
Add(blockelmlists, [elm]);
|
|
190
|
+
else
|
|
191
|
+
# Add to the old class
|
|
192
|
+
Add(blockelmlists[pos], elm);
|
|
193
|
+
fi;
|
|
194
|
+
od;
|
|
195
|
+
od;
|
|
196
|
+
Append(elmlists, blockelmlists);
|
|
197
|
+
od;
|
|
198
|
+
return elmlists;
|
|
199
|
+
end);
|
|
200
|
+
|
|
201
|
+
InstallMethod(CongruenceTestMembershipNC,
|
|
202
|
+
"for inverse semigroup congruence by kernel and trace and two mult. elts",
|
|
203
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
204
|
+
IsMultiplicativeElement,
|
|
205
|
+
IsMultiplicativeElement],
|
|
206
|
+
function(C, x, y)
|
|
207
|
+
# Is (a^-1 a, b^-1 b) in the trace?
|
|
208
|
+
if x ^ -1 * x in
|
|
209
|
+
First(C!.traceBlocks, c -> y ^ -1 * y in c) then
|
|
210
|
+
# Is ab^-1 in the kernel?
|
|
211
|
+
if x * y ^ -1 in C!.kernel then
|
|
212
|
+
return true;
|
|
213
|
+
fi;
|
|
214
|
+
fi;
|
|
215
|
+
return false;
|
|
216
|
+
end);
|
|
217
|
+
|
|
218
|
+
InstallMethod(EquivalenceClassOfElementNC,
|
|
219
|
+
"for inverse semigroup congruence by kernel and trace and mult. elt.",
|
|
220
|
+
[IsInverseSemigroupCongruenceByKernelTrace, IsMultiplicativeElement],
|
|
221
|
+
function(C, x)
|
|
222
|
+
local class;
|
|
223
|
+
class := Objectify(InverseSemigroupCongruenceClassByKernelTraceType(C),
|
|
224
|
+
rec());
|
|
225
|
+
SetParentAttr(class, Range(C));
|
|
226
|
+
SetEquivalenceClassRelation(class, C);
|
|
227
|
+
SetRepresentative(class, x);
|
|
228
|
+
return class;
|
|
229
|
+
end);
|
|
230
|
+
|
|
231
|
+
InstallMethod(InverseSemigroupCongruenceClassByKernelTraceType,
|
|
232
|
+
"for inverse semigroup congruence by kernel and trace",
|
|
233
|
+
[IsInverseSemigroupCongruenceByKernelTrace],
|
|
234
|
+
function(C)
|
|
235
|
+
return NewType(FamilyObj(Range(C)),
|
|
236
|
+
IsInverseSemigroupCongruenceClassByKernelTrace);
|
|
237
|
+
end);
|
|
238
|
+
|
|
239
|
+
InstallMethod(TraceOfSemigroupCongruence, "for semigroup congruence",
|
|
240
|
+
[IsSemigroupCongruence],
|
|
241
|
+
function(C)
|
|
242
|
+
local S, invcong;
|
|
243
|
+
S := Range(C);
|
|
244
|
+
if not (IsInverseSemigroup(S) and IsGeneratorsOfInverseSemigroup(S)) then
|
|
245
|
+
ErrorNoReturn("the range of the argument (a congruence) must be an ",
|
|
246
|
+
"inverse semigroup with inverse op");
|
|
247
|
+
fi;
|
|
248
|
+
invcong := AsInverseSemigroupCongruenceByKernelTrace(C);
|
|
249
|
+
return invcong!.traceBlocks;
|
|
250
|
+
end);
|
|
251
|
+
|
|
252
|
+
InstallMethod(KernelOfSemigroupCongruence, "for semigroup congruence",
|
|
253
|
+
[IsSemigroupCongruence],
|
|
254
|
+
function(C)
|
|
255
|
+
local S, invcong;
|
|
256
|
+
S := Range(C);
|
|
257
|
+
if not (IsInverseSemigroup(S) and IsGeneratorsOfInverseSemigroup(S)) then
|
|
258
|
+
ErrorNoReturn("the range of the argument (a congruence) must be an ",
|
|
259
|
+
"inverse semigroup with inverse op");
|
|
260
|
+
fi;
|
|
261
|
+
invcong := AsInverseSemigroupCongruenceByKernelTrace(C);
|
|
262
|
+
return invcong!.kernel;
|
|
263
|
+
end);
|
|
264
|
+
|
|
265
|
+
InstallMethod(AsInverseSemigroupCongruenceByKernelTrace,
|
|
266
|
+
"for semigroup congruence with generating pairs",
|
|
267
|
+
[IsSemigroupCongruence and HasGeneratingPairsOfMagmaCongruence],
|
|
268
|
+
function(C)
|
|
269
|
+
local S;
|
|
270
|
+
S := Range(C);
|
|
271
|
+
if not (IsInverseSemigroup(S) and IsGeneratorsOfInverseSemigroup(S)) then
|
|
272
|
+
ErrorNoReturn("the range of the argument (a congruence) must be an ",
|
|
273
|
+
"inverse semigroup with inverse op");
|
|
274
|
+
fi;
|
|
275
|
+
return
|
|
276
|
+
SEMIGROUPS.KernelTraceClosure(S,
|
|
277
|
+
IdempotentGeneratedSubsemigroup(S),
|
|
278
|
+
List(Idempotents(S), e -> [e]),
|
|
279
|
+
GeneratingPairsOfSemigroupCongruence(C));
|
|
280
|
+
end);
|
|
281
|
+
|
|
282
|
+
InstallMethod(JoinSemigroupCongruences,
|
|
283
|
+
"for inverse semigroup congruence",
|
|
284
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
285
|
+
IsInverseSemigroupCongruenceByKernelTrace],
|
|
286
|
+
function(lhop, rhop)
|
|
287
|
+
local S, gens1, gens2, kernel, traceBlocks, block, b1, j, pos;
|
|
288
|
+
S := Range(lhop);
|
|
289
|
+
if S <> Range(rhop) then
|
|
290
|
+
Error("cannot form the join of congruences over different semigroups");
|
|
291
|
+
fi;
|
|
292
|
+
|
|
293
|
+
# kernel generated by union of lhop's kernel and rhop's kernel
|
|
294
|
+
gens1 := GeneratorsOfInverseSemigroup(lhop!.kernel);
|
|
295
|
+
gens2 := GeneratorsOfInverseSemigroup(rhop!.kernel);
|
|
296
|
+
kernel := InverseSemigroup(Concatenation(gens1, gens2));
|
|
297
|
+
|
|
298
|
+
# trace is join of lhop's trace and rhop's trace
|
|
299
|
+
traceBlocks := StructuralCopy(lhop!.traceBlocks);
|
|
300
|
+
for block in rhop!.traceBlocks do
|
|
301
|
+
b1 := PositionProperty(traceBlocks, b -> block[1] in b);
|
|
302
|
+
for j in [2 .. Size(block)] do
|
|
303
|
+
if not block[j] in traceBlocks[b1] then
|
|
304
|
+
# Combine the classes
|
|
305
|
+
pos := PositionProperty(traceBlocks, b -> block[j] in b);
|
|
306
|
+
Append(traceBlocks[b1], traceBlocks[pos]);
|
|
307
|
+
Unbind(traceBlocks[pos]);
|
|
308
|
+
fi;
|
|
309
|
+
od;
|
|
310
|
+
traceBlocks := Compacted(traceBlocks);
|
|
311
|
+
od;
|
|
312
|
+
|
|
313
|
+
# Take the kernel-trace closure to ensure we have a correct congruence
|
|
314
|
+
return SEMIGROUPS.KernelTraceClosure(S, kernel, traceBlocks, []);
|
|
315
|
+
end);
|
|
316
|
+
|
|
317
|
+
InstallMethod(MeetSemigroupCongruences,
|
|
318
|
+
"for two inverse semigroup congruence",
|
|
319
|
+
[IsInverseSemigroupCongruenceByKernelTrace,
|
|
320
|
+
IsInverseSemigroupCongruenceByKernelTrace],
|
|
321
|
+
function(lhop, rhop)
|
|
322
|
+
local S, kernel, traceBlocks, ids, c2lookup, classnos, block, classno;
|
|
323
|
+
S := Range(lhop);
|
|
324
|
+
if S <> Range(rhop) then
|
|
325
|
+
Error("cannot form the meet of congruences over different semigroups");
|
|
326
|
+
fi;
|
|
327
|
+
|
|
328
|
+
# Calculate the intersection of the kernels
|
|
329
|
+
# TODO(later): can we do this without enumerating the whole kernel?
|
|
330
|
+
kernel := InverseSemigroup(Intersection(lhop!.kernel, rhop!.kernel));
|
|
331
|
+
kernel := InverseSemigroup(SmallInverseSemigroupGeneratingSet(kernel));
|
|
332
|
+
|
|
333
|
+
# Calculate the intersection of the traces
|
|
334
|
+
traceBlocks := [];
|
|
335
|
+
ids := IdempotentGeneratedSubsemigroup(S);
|
|
336
|
+
c2lookup := rhop!.traceLookup;
|
|
337
|
+
for block in lhop!.traceBlocks do
|
|
338
|
+
classnos := c2lookup{List(block, x -> Position(ids, x))};
|
|
339
|
+
for classno in DuplicateFreeList(classnos) do
|
|
340
|
+
Add(traceBlocks, block{Positions(classnos, classno)});
|
|
341
|
+
od;
|
|
342
|
+
od;
|
|
343
|
+
|
|
344
|
+
return InverseSemigroupCongruenceByKernelTrace(S, kernel, traceBlocks);
|
|
345
|
+
end);
|
|
346
|
+
|
|
347
|
+
SEMIGROUPS.KernelTraceClosure := function(S, kernel, traceBlocks, pairstoapply)
|
|
348
|
+
local canonical_lookup, idsmgp, idslist, slist, kernelgenstoapply, gen, nrk,
|
|
349
|
+
nr, traceUF, i, pos1, j, pos, hashlen, ht, right, genstoapply,
|
|
350
|
+
NormalClosureInverseSemigroup, enumerate_trace, enforce_conditions,
|
|
351
|
+
compute_kernel, oldLookup, oldKernel, trace_unchanged, kernel_unchanged;
|
|
352
|
+
|
|
353
|
+
# This function takes an inverse semigroup S, a subsemigroup ker, an
|
|
354
|
+
# equivalence traceBlocks on the idempotents, and a list of pairs in S.
|
|
355
|
+
# It returns the minimal congruence containing "kernel" in its kernel and
|
|
356
|
+
# "traceBlocks" in its trace, and containing all the given pairs
|
|
357
|
+
# TODO(later) Review this JDM for use of Elements, AsList etc. Could
|
|
358
|
+
# iterators work better?
|
|
359
|
+
|
|
360
|
+
canonical_lookup := function(uf)
|
|
361
|
+
local N;
|
|
362
|
+
N := SizeUnderlyingSetDS(traceUF);
|
|
363
|
+
return FlatKernelOfTransformation(Transformation([1 .. N],
|
|
364
|
+
x -> Representative(uf, x)),
|
|
365
|
+
N);
|
|
366
|
+
end;
|
|
367
|
+
|
|
368
|
+
idsmgp := IdempotentGeneratedSubsemigroup(S);
|
|
369
|
+
idslist := AsListCanonical(idsmgp);
|
|
370
|
+
slist := AsListCanonical(S);
|
|
371
|
+
|
|
372
|
+
# Retrieve the initial information
|
|
373
|
+
kernel := InverseSubsemigroup(S, kernel);
|
|
374
|
+
kernelgenstoapply := Set(pairstoapply, x -> x[1] * x[2] ^ -1);
|
|
375
|
+
# kernel might not be normal, so make sure to check its generators too
|
|
376
|
+
for gen in GeneratorsOfInverseSemigroup(kernel) do
|
|
377
|
+
AddSet(kernelgenstoapply, gen);
|
|
378
|
+
od;
|
|
379
|
+
nrk := Length(kernelgenstoapply);
|
|
380
|
+
Enumerate(kernel);
|
|
381
|
+
pairstoapply := List(pairstoapply,
|
|
382
|
+
x -> [PositionCanonical(idsmgp, RightOne(x[1])),
|
|
383
|
+
PositionCanonical(idsmgp, RightOne(x[2]))]);
|
|
384
|
+
nr := Length(pairstoapply);
|
|
385
|
+
|
|
386
|
+
# Calculate traceUF from traceBlocks
|
|
387
|
+
traceUF := PartitionDS(IsPartitionDS, Length(idslist));
|
|
388
|
+
for i in [1 .. Length(traceBlocks)] do
|
|
389
|
+
pos1 := PositionCanonical(idsmgp, traceBlocks[i][1]);
|
|
390
|
+
for j in [2 .. Length(traceBlocks[i])] do
|
|
391
|
+
Unite(traceUF, pos1, PositionCanonical(idsmgp, traceBlocks[i][j]));
|
|
392
|
+
od;
|
|
393
|
+
od;
|
|
394
|
+
|
|
395
|
+
# Setup some useful information
|
|
396
|
+
pos := 0;
|
|
397
|
+
hashlen := SEMIGROUPS.OptionsRec(S).hashlen;
|
|
398
|
+
ht := HTCreate([1, 1], rec(forflatplainlists := true,
|
|
399
|
+
treehashsize := hashlen));
|
|
400
|
+
right := OutNeighbours(RightCayleyDigraph(idsmgp));
|
|
401
|
+
genstoapply := [1 .. Length(right[1])];
|
|
402
|
+
|
|
403
|
+
#
|
|
404
|
+
# The functions that do the work:
|
|
405
|
+
#
|
|
406
|
+
NormalClosureInverseSemigroup := function(S, K, coll)
|
|
407
|
+
local T, opts, x, list;
|
|
408
|
+
# This takes an inv smgp S, an inv subsemigroup K, and some elms coll,
|
|
409
|
+
# then creates the *normal closure* of K with coll inside S.
|
|
410
|
+
# It assumes K is already normal.
|
|
411
|
+
T := ClosureInverseSemigroup(K, coll);
|
|
412
|
+
while K <> T do
|
|
413
|
+
K := T;
|
|
414
|
+
opts := rec();
|
|
415
|
+
opts.gradingfunc := {o, x} -> x in K;
|
|
416
|
+
opts.onlygrades := {x, data} -> x = false;
|
|
417
|
+
opts.onlygradesdata := fail;
|
|
418
|
+
for x in K do
|
|
419
|
+
list := Enumerate(Orb(GeneratorsOfSemigroup(S), x, OnPoints, opts));
|
|
420
|
+
list := AsList(list);
|
|
421
|
+
T := ClosureInverseSemigroup(T, list);
|
|
422
|
+
od;
|
|
423
|
+
od;
|
|
424
|
+
return K;
|
|
425
|
+
end;
|
|
426
|
+
|
|
427
|
+
enumerate_trace := function()
|
|
428
|
+
local a, j, x, y, z;
|
|
429
|
+
if pos = 0 then
|
|
430
|
+
# Add the generating pairs themselves
|
|
431
|
+
for x in pairstoapply do
|
|
432
|
+
if x[1] <> x[2] and HTValue(ht, x) = fail then
|
|
433
|
+
HTAdd(ht, x, true);
|
|
434
|
+
Unite(traceUF, x[1], x[2]);
|
|
435
|
+
# Add each pair's "conjugate" pairs
|
|
436
|
+
for a in GeneratorsOfSemigroup(S) do
|
|
437
|
+
z := [PositionCanonical(idsmgp, a ^ -1 * idslist[x[1]] * a),
|
|
438
|
+
PositionCanonical(idsmgp, a ^ -1 * idslist[x[2]] * a)];
|
|
439
|
+
if z[1] <> z[2] and HTValue(ht, z) = fail then
|
|
440
|
+
HTAdd(ht, z, true);
|
|
441
|
+
nr := nr + 1;
|
|
442
|
+
pairstoapply[nr] := z;
|
|
443
|
+
Unite(traceUF, z[1], z[2]);
|
|
444
|
+
fi;
|
|
445
|
+
od;
|
|
446
|
+
fi;
|
|
447
|
+
od;
|
|
448
|
+
fi;
|
|
449
|
+
|
|
450
|
+
while pos < nr do
|
|
451
|
+
pos := pos + 1;
|
|
452
|
+
x := pairstoapply[pos];
|
|
453
|
+
for j in genstoapply do
|
|
454
|
+
# Add the pair's right-multiples (idsmgp is commutative)
|
|
455
|
+
y := [right[x[1]][j], right[x[2]][j]];
|
|
456
|
+
if y[1] <> y[2] and HTValue(ht, y) = fail then
|
|
457
|
+
HTAdd(ht, y, true);
|
|
458
|
+
nr := nr + 1;
|
|
459
|
+
pairstoapply[nr] := y;
|
|
460
|
+
Unite(traceUF, y[1], y[2]);
|
|
461
|
+
# Add the pair's "conjugate" pairs
|
|
462
|
+
for a in GeneratorsOfSemigroup(S) do
|
|
463
|
+
z := [PositionCanonical(idsmgp, a ^ -1 * idslist[x[1]] * a),
|
|
464
|
+
PositionCanonical(idsmgp, a ^ -1 * idslist[x[2]] * a)];
|
|
465
|
+
if z[1] <> z[2] and HTValue(ht, z) = fail then
|
|
466
|
+
HTAdd(ht, z, true);
|
|
467
|
+
nr := nr + 1;
|
|
468
|
+
pairstoapply[nr] := z;
|
|
469
|
+
Unite(traceUF, z[1], z[2]);
|
|
470
|
+
fi;
|
|
471
|
+
od;
|
|
472
|
+
fi;
|
|
473
|
+
od;
|
|
474
|
+
od;
|
|
475
|
+
end;
|
|
476
|
+
|
|
477
|
+
enforce_conditions := function()
|
|
478
|
+
local traceTable, traceBlocks, a, e, f, classno, blocks, bl, N;
|
|
479
|
+
blocks := PartsOfPartitionDS(traceUF);
|
|
480
|
+
traceBlocks := [];
|
|
481
|
+
for bl in blocks do
|
|
482
|
+
traceBlocks[Representative(traceUF, bl[1])] := bl;
|
|
483
|
+
od;
|
|
484
|
+
N := SizeUnderlyingSetDS(traceUF);
|
|
485
|
+
traceTable := List([1 .. N], x -> Representative(traceUF, x));
|
|
486
|
+
for a in slist do
|
|
487
|
+
if a in kernel then
|
|
488
|
+
e := PositionCanonical(idsmgp, LeftOne(a));
|
|
489
|
+
f := PositionCanonical(idsmgp, RightOne(a));
|
|
490
|
+
if traceTable[e] <> traceTable[f] then
|
|
491
|
+
nr := nr + 1;
|
|
492
|
+
pairstoapply[nr] := [e, f];
|
|
493
|
+
fi;
|
|
494
|
+
else
|
|
495
|
+
classno := traceTable[PositionCanonical(idsmgp, RightOne(a))];
|
|
496
|
+
for e in traceBlocks[classno] do
|
|
497
|
+
if a * idslist[e] in kernel then
|
|
498
|
+
nrk := nrk + 1;
|
|
499
|
+
AddSet(kernelgenstoapply, a);
|
|
500
|
+
break;
|
|
501
|
+
# JDM is this correct? Why repeatedly add the same a to
|
|
502
|
+
# kernelgenstoapply?
|
|
503
|
+
fi;
|
|
504
|
+
od;
|
|
505
|
+
fi;
|
|
506
|
+
od;
|
|
507
|
+
end;
|
|
508
|
+
|
|
509
|
+
compute_kernel := function()
|
|
510
|
+
# Take the normal closure inverse semigroup containing the new elements
|
|
511
|
+
if kernelgenstoapply <> [] then
|
|
512
|
+
kernel := NormalClosureInverseSemigroup(S, kernel,
|
|
513
|
+
kernelgenstoapply);
|
|
514
|
+
Enumerate(kernel);
|
|
515
|
+
kernelgenstoapply := [];
|
|
516
|
+
nrk := 0;
|
|
517
|
+
fi;
|
|
518
|
+
end;
|
|
519
|
+
|
|
520
|
+
# Keep applying the method until no new info is found
|
|
521
|
+
repeat
|
|
522
|
+
oldLookup := canonical_lookup(traceUF);
|
|
523
|
+
oldKernel := kernel;
|
|
524
|
+
compute_kernel();
|
|
525
|
+
enforce_conditions();
|
|
526
|
+
enumerate_trace();
|
|
527
|
+
trace_unchanged := (oldLookup = canonical_lookup(traceUF));
|
|
528
|
+
kernel_unchanged := (oldKernel = kernel);
|
|
529
|
+
Info(InfoSemigroups, 3, "lookup: ", trace_unchanged);
|
|
530
|
+
Info(InfoSemigroups, 3, "kernel: ", kernel_unchanged);
|
|
531
|
+
Info(InfoSemigroups, 3, "nrk = 0: ", nrk = 0);
|
|
532
|
+
until trace_unchanged and kernel_unchanged and (nrk = 0);
|
|
533
|
+
|
|
534
|
+
# Convert traceLookup to traceBlocks
|
|
535
|
+
traceBlocks := List(Compacted(PartsOfPartitionDS(traceUF)),
|
|
536
|
+
b -> List(b, i -> idslist[i]));
|
|
537
|
+
|
|
538
|
+
return InverseSemigroupCongruenceByKernelTraceNC(S, kernel, traceBlocks);
|
|
539
|
+
end;
|
|
540
|
+
|
|
541
|
+
InstallMethod(MinimumGroupCongruence,
|
|
542
|
+
"for an inverse semigroup with inverse op",
|
|
543
|
+
[IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
|
|
544
|
+
# This is the maximum congruence whose quotient is a group
|
|
545
|
+
function(S)
|
|
546
|
+
local ker, leq, n, x, traceBlocks;
|
|
547
|
+
|
|
548
|
+
# Kernel should be the majorant closure of the idempotents
|
|
549
|
+
ker := IdempotentGeneratedSubsemigroup(S);
|
|
550
|
+
leq := NaturalLeqInverseSemigroup(S);
|
|
551
|
+
for n in ker do
|
|
552
|
+
for x in S do
|
|
553
|
+
if leq(n, x) and not x in ker then
|
|
554
|
+
ker := ClosureInverseSemigroup(ker, x);
|
|
555
|
+
fi;
|
|
556
|
+
od;
|
|
557
|
+
od;
|
|
558
|
+
ker := InverseSemigroup(SmallInverseSemigroupGeneratingSet(ker));
|
|
559
|
+
|
|
560
|
+
# Trace should be the universal congruence
|
|
561
|
+
traceBlocks := [Idempotents(S)];
|
|
562
|
+
|
|
563
|
+
return InverseSemigroupCongruenceByKernelTraceNC(S, ker, traceBlocks);
|
|
564
|
+
end);
|
|
565
|
+
|
|
566
|
+
# TODO(later) this is a completely generic version implementation, surely we
|
|
567
|
+
# can do better than this!
|
|
568
|
+
|
|
569
|
+
InstallMethod(GeneratingPairsOfMagmaCongruence,
|
|
570
|
+
"for inverse semigroup congruence by kernel and trace",
|
|
571
|
+
[IsInverseSemigroupCongruenceByKernelTrace],
|
|
572
|
+
function(C)
|
|
573
|
+
local CC, pairs, class, i, j;
|
|
574
|
+
|
|
575
|
+
CC := SemigroupCongruenceByGeneratingPairs(Source(C), []);
|
|
576
|
+
for class in EquivalenceRelationPartition(C) do
|
|
577
|
+
for i in [1 .. Length(class) - 1] do
|
|
578
|
+
for j in [i + 1 .. Length(class)] do
|
|
579
|
+
if not [class[i], class[j]] in CC then
|
|
580
|
+
pairs := GeneratingPairsOfSemigroupCongruence(CC);
|
|
581
|
+
pairs := Concatenation(pairs, [[class[i], class[j]]]);
|
|
582
|
+
CC := SemigroupCongruenceByGeneratingPairs(Source(C), pairs);
|
|
583
|
+
fi;
|
|
584
|
+
od;
|
|
585
|
+
od;
|
|
586
|
+
od;
|
|
587
|
+
return GeneratingPairsOfSemigroupCongruence(CC);
|
|
588
|
+
end);
|
|
589
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
############################################################################
|
|
2
|
+
##
|
|
3
|
+
## congruences/conglatt.gd
|
|
4
|
+
## Copyright (C) 2016-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 functions for a poset of congruences.
|
|
11
|
+
##
|
|
12
|
+
## When the congruences of a semigroup are computed, they form a lattice with
|
|
13
|
+
## respect to containment. The information about the congruences' positions in
|
|
14
|
+
## this lattice may be stored in an IsCongruencePoset object (a component object
|
|
15
|
+
## based on a record) and can be retrieved from this object using the methods in
|
|
16
|
+
## this file.
|
|
17
|
+
##
|
|
18
|
+
|
|
19
|
+
DeclareCategory("IsCongruencePoset", IsDigraph);
|
|
20
|
+
|
|
21
|
+
DeclareAttribute("UnderlyingSemigroupOfCongruencePoset", IsCongruencePoset);
|
|
22
|
+
DeclareAttribute("PosetOfPrincipalCongruences", IsCongruencePoset);
|
|
23
|
+
DeclareAttribute("JoinSemilatticeOfCongruences", IsCongruencePoset);
|
|
24
|
+
DeclareAttribute("MinimalCongruences", IsCongruencePoset);
|
|
25
|
+
|
|
26
|
+
DeclareAttribute("CongruencesOfPoset", IsCongruencePoset);
|
|
27
|
+
|
|
28
|
+
# Constructs the poset object consisting of the congruences given in the
|
|
29
|
+
# argument.
|
|
30
|
+
DeclareOperation("PosetOfCongruences", [IsListOrCollection]);
|
|
31
|
+
DeclareAttribute("JoinSemilatticeOfCongruences", IsListOrCollection);
|
|
32
|
+
|
|
33
|
+
DeclareAttribute("GeneratingPairsOfPrincipalCongruences", IsSemigroup);
|
|
34
|
+
DeclareAttribute("GeneratingPairsOfPrincipalLeftCongruences", IsSemigroup);
|
|
35
|
+
DeclareAttribute("GeneratingPairsOfPrincipalRightCongruences", IsSemigroup);
|
|
36
|
+
|
|
37
|
+
DeclareAttribute("PosetOfPrincipalCongruences", IsSemigroup);
|
|
38
|
+
DeclareAttribute("PosetOfPrincipalLeftCongruences", IsSemigroup);
|
|
39
|
+
DeclareAttribute("PosetOfPrincipalRightCongruences", IsSemigroup);
|
|
40
|
+
|
|
41
|
+
DeclareOperation("PosetOfPrincipalCongruences",
|
|
42
|
+
[IsSemigroup, IsListOrCollection]);
|
|
43
|
+
DeclareOperation("PosetOfPrincipalLeftCongruences",
|
|
44
|
+
[IsSemigroup, IsListOrCollection]);
|
|
45
|
+
DeclareOperation("PosetOfPrincipalRightCongruences",
|
|
46
|
+
[IsSemigroup, IsListOrCollection]);
|
|
47
|
+
|
|
48
|
+
DeclareAttribute("LatticeOfCongruences", IsSemigroup);
|
|
49
|
+
DeclareAttribute("LatticeOfLeftCongruences", IsSemigroup);
|
|
50
|
+
DeclareAttribute("LatticeOfRightCongruences", IsSemigroup);
|
|
51
|
+
|
|
52
|
+
DeclareAttribute("CayleyDigraphOfCongruences", IsSemigroup);
|
|
53
|
+
DeclareAttribute("CayleyDigraphOfLeftCongruences", IsSemigroup);
|
|
54
|
+
DeclareAttribute("CayleyDigraphOfRightCongruences", IsSemigroup);
|
|
55
|
+
|
|
56
|
+
DeclareOperation("CayleyDigraphOfCongruences",
|
|
57
|
+
[IsSemigroup, IsListOrCollection]);
|
|
58
|
+
DeclareOperation("CayleyDigraphOfLeftCongruences",
|
|
59
|
+
[IsSemigroup, IsListOrCollection]);
|
|
60
|
+
DeclareOperation("CayleyDigraphOfRightCongruences",
|
|
61
|
+
[IsSemigroup, IsListOrCollection]);
|
|
62
|
+
|
|
63
|
+
DeclareCategory("IsCayleyDigraphOfCongruences", IsCongruencePoset);
|
|
64
|
+
|
|
65
|
+
DeclareOperation("LatticeOfCongruences",
|
|
66
|
+
[IsSemigroup, IsListOrCollection]);
|
|
67
|
+
DeclareOperation("LatticeOfLeftCongruences",
|
|
68
|
+
[IsSemigroup, IsListOrCollection]);
|
|
69
|
+
DeclareOperation("LatticeOfRightCongruences",
|
|
70
|
+
[IsSemigroup, IsListOrCollection]);
|
|
71
|
+
|
|
72
|
+
DeclareAttribute("CongruencesOfSemigroup", IsSemigroup);
|
|
73
|
+
DeclareAttribute("LeftCongruencesOfSemigroup", IsSemigroup);
|
|
74
|
+
DeclareAttribute("RightCongruencesOfSemigroup", IsSemigroup);
|
|
75
|
+
|
|
76
|
+
DeclareAttribute("MinimalCongruencesOfSemigroup", IsSemigroup);
|
|
77
|
+
DeclareAttribute("MinimalLeftCongruencesOfSemigroup", IsSemigroup);
|
|
78
|
+
DeclareAttribute("MinimalRightCongruencesOfSemigroup", IsSemigroup);
|
|
79
|
+
|
|
80
|
+
DeclareOperation("MinimalCongruencesOfSemigroup",
|
|
81
|
+
[IsSemigroup, IsListOrCollection]);
|
|
82
|
+
DeclareOperation("MinimalCongruencesOfSemigroup",
|
|
83
|
+
[IsSemigroup, IsIterator]);
|
|
84
|
+
|
|
85
|
+
DeclareOperation("MinimalLeftCongruencesOfSemigroup",
|
|
86
|
+
[IsSemigroup, IsListOrCollection]);
|
|
87
|
+
DeclareOperation("MinimalRightCongruencesOfSemigroup",
|
|
88
|
+
[IsSemigroup, IsListOrCollection]);
|
|
89
|
+
|
|
90
|
+
DeclareAttribute("PrincipalCongruencesOfSemigroup", IsSemigroup);
|
|
91
|
+
DeclareAttribute("PrincipalLeftCongruencesOfSemigroup", IsSemigroup);
|
|
92
|
+
DeclareAttribute("PrincipalRightCongruencesOfSemigroup", IsSemigroup);
|
|
93
|
+
|
|
94
|
+
DeclareOperation("PrincipalCongruencesOfSemigroup",
|
|
95
|
+
[IsSemigroup, IsListOrCollection]);
|
|
96
|
+
DeclareOperation("PrincipalLeftCongruencesOfSemigroup",
|
|
97
|
+
[IsSemigroup, IsListOrCollection]);
|
|
98
|
+
DeclareOperation("PrincipalRightCongruencesOfSemigroup",
|
|
99
|
+
[IsSemigroup, IsListOrCollection]);
|
|
100
|
+
|
|
101
|
+
DeclareAttribute("GeneratingCongruencesOfJoinSemilattice", IsCongruencePoset);
|