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,1155 @@
|
|
|
1
|
+
#############################################################################
|
|
2
|
+
##
|
|
3
|
+
## ideals/acting.gi
|
|
4
|
+
## Copyright (C) 2013-2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
# This file contains methods for ideals of acting semigroups, and it requires
|
|
12
|
+
# some cleaning up.
|
|
13
|
+
|
|
14
|
+
# Attributes with better methods than the ones for
|
|
15
|
+
# IsActingSemigroup without IsSemigroupIdeal.
|
|
16
|
+
|
|
17
|
+
# This is here so that for regular ideals this method has higher rank than the
|
|
18
|
+
# method for IsSemigroup.
|
|
19
|
+
|
|
20
|
+
InstallMethod(NrDClasses, "for an inverse acting semigroup ideal rep",
|
|
21
|
+
[IsInverseActingSemigroupRep and IsSemigroupIdeal],
|
|
22
|
+
{I} -> Length(OrbSCC(LambdaOrb(I))) - 1);
|
|
23
|
+
|
|
24
|
+
InstallMethod(NrDClasses, "for a regular acting semigroup ideal rep",
|
|
25
|
+
[IsRegularActingSemigroupRep and IsSemigroupIdeal],
|
|
26
|
+
function(I)
|
|
27
|
+
Enumerate(SemigroupIdealData(I));
|
|
28
|
+
return Length(SemigroupIdealData(I)!.dorbit);
|
|
29
|
+
end);
|
|
30
|
+
|
|
31
|
+
InstallMethod(GreensDClasses, "for a regular acting semigroup ideal rep",
|
|
32
|
+
[IsSemigroupIdeal and IsRegularActingSemigroupRep],
|
|
33
|
+
function(I)
|
|
34
|
+
if IsInverseActingSemigroupRep(I) then
|
|
35
|
+
TryNextMethod();
|
|
36
|
+
fi;
|
|
37
|
+
Enumerate(SemigroupIdealData(I));
|
|
38
|
+
return SemigroupIdealData(I)!.dorbit;
|
|
39
|
+
end);
|
|
40
|
+
|
|
41
|
+
InstallMethod(PartialOrderOfDClasses,
|
|
42
|
+
"for a regular acting semigroup ideal rep",
|
|
43
|
+
[IsSemigroupIdeal and IsRegularActingSemigroupRep],
|
|
44
|
+
function(I)
|
|
45
|
+
local data, D;
|
|
46
|
+
if IsInverseActingSemigroupRep(I) then
|
|
47
|
+
TryNextMethod();
|
|
48
|
+
fi;
|
|
49
|
+
data := SemigroupIdealData(I);
|
|
50
|
+
Enumerate(data);
|
|
51
|
+
D := DigraphNC(IsMutableDigraph, data!.poset);
|
|
52
|
+
DigraphRemoveLoops(D);
|
|
53
|
+
MakeImmutable(D);
|
|
54
|
+
return D;
|
|
55
|
+
end);
|
|
56
|
+
|
|
57
|
+
InstallMethod(DClassReps, "for a regular acting semigroup ideal rep",
|
|
58
|
+
[IsSemigroupIdeal and IsRegularActingSemigroupRep],
|
|
59
|
+
function(I)
|
|
60
|
+
local data;
|
|
61
|
+
if IsInverseActingSemigroupRep(I) then
|
|
62
|
+
TryNextMethod();
|
|
63
|
+
fi;
|
|
64
|
+
data := SemigroupIdealData(I);
|
|
65
|
+
Enumerate(data);
|
|
66
|
+
return List(data!.dorbit, Representative);
|
|
67
|
+
end);
|
|
68
|
+
|
|
69
|
+
# the really technical stuff...
|
|
70
|
+
|
|
71
|
+
InstallMethod(SemigroupData, "for a regular acting semigroup ideal rep",
|
|
72
|
+
[IsRegularActingSemigroupRep and IsSemigroupIdeal],
|
|
73
|
+
SemigroupIdealData);
|
|
74
|
+
|
|
75
|
+
# JDM this method should become obsolete in time...
|
|
76
|
+
# <I> is not known to be regular if this function is invoked...
|
|
77
|
+
|
|
78
|
+
InstallMethod(SemigroupData, "for an acting semigroup ideal",
|
|
79
|
+
[IsActingSemigroup and IsSemigroupIdeal],
|
|
80
|
+
function(I)
|
|
81
|
+
local data, pos, partial, classes, D, U, inj, i, j, C;
|
|
82
|
+
# the maximal D-classes of the supersemigroup of <I> contained in <I>
|
|
83
|
+
data := Enumerate(SemigroupIdealData(I));
|
|
84
|
+
pos := [1 .. data!.genspos - 1];
|
|
85
|
+
# the D-classes of the generators in positions
|
|
86
|
+
# [1 .. n - 1] in data!.dorbit
|
|
87
|
+
partial := data!.poset;
|
|
88
|
+
classes := data!.dorbit;
|
|
89
|
+
D := [];
|
|
90
|
+
for i in pos do
|
|
91
|
+
if not ForAny([1 .. Length(partial)], j -> j <> i and i in partial[j]) then
|
|
92
|
+
Add(D, classes[i]);
|
|
93
|
+
fi;
|
|
94
|
+
od;
|
|
95
|
+
|
|
96
|
+
# find generators for I...
|
|
97
|
+
U := Semigroup(GeneratorsOfSemigroupIdeal(I), SEMIGROUPS.OptionsRec(I));
|
|
98
|
+
|
|
99
|
+
for i in [1 .. Length(D)] do
|
|
100
|
+
if IsRegularDClass(D[i]) then
|
|
101
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(D[i]));
|
|
102
|
+
U := ClosureSemigroup(U, OnTuples(GeneratorsOfSemigroup(Source(inj)),
|
|
103
|
+
inj));
|
|
104
|
+
else
|
|
105
|
+
U := ClosureSemigroup(U, D[i]);
|
|
106
|
+
fi;
|
|
107
|
+
od;
|
|
108
|
+
|
|
109
|
+
i := 0;
|
|
110
|
+
|
|
111
|
+
while Size(U) <> Size(I) do
|
|
112
|
+
i := i + 1;
|
|
113
|
+
j := 0;
|
|
114
|
+
while Size(U) <> Size(I) and j < Length(partial[i]) do
|
|
115
|
+
j := j + 1;
|
|
116
|
+
if Length(partial[i]) = 1 or partial[i][j] <> i then
|
|
117
|
+
C := classes[partial[i][j]];
|
|
118
|
+
if IsRegularDClass(C) then
|
|
119
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(C));
|
|
120
|
+
U := ClosureSemigroup(U, OnTuples(GeneratorsOfSemigroup(Source(inj)),
|
|
121
|
+
inj));
|
|
122
|
+
else
|
|
123
|
+
U := ClosureSemigroup(U, AsList(C));
|
|
124
|
+
fi;
|
|
125
|
+
fi;
|
|
126
|
+
od;
|
|
127
|
+
od;
|
|
128
|
+
|
|
129
|
+
SetGeneratorsOfSemigroup(I, GeneratorsOfSemigroup(U));
|
|
130
|
+
SetLambdaOrb(I, LambdaOrb(U));
|
|
131
|
+
SetRhoOrb(I, RhoOrb(U));
|
|
132
|
+
# JDM: maybe more is required here to remove U from the semigroup data, like
|
|
133
|
+
# replacing U with I in the first position of every entry of the data, and in
|
|
134
|
+
# the different internal components of the data.
|
|
135
|
+
return SemigroupData(U);
|
|
136
|
+
end);
|
|
137
|
+
|
|
138
|
+
InstallMethod(GeneratorsOfSemigroup, "for an acting semigroup ideal",
|
|
139
|
+
[IsActingSemigroup and IsSemigroupIdeal],
|
|
140
|
+
function(I)
|
|
141
|
+
local data, pos, partial, classes, D, U, inj, i, j;
|
|
142
|
+
|
|
143
|
+
if not IsRegularActingSemigroupRep(I) then
|
|
144
|
+
return SemigroupData(I)!.gens;
|
|
145
|
+
fi;
|
|
146
|
+
|
|
147
|
+
Info(InfoWarning, 2, "finding a generating set of a semigroup ideal!");
|
|
148
|
+
data := SemigroupIdealData(I);
|
|
149
|
+
Enumerate(data, infinity, ReturnFalse);
|
|
150
|
+
pos := [1 .. data!.genspos - 1];
|
|
151
|
+
# the D-classes of the generators in positions
|
|
152
|
+
# [1..n-1] in data!.dorbit
|
|
153
|
+
partial := data!.poset;
|
|
154
|
+
classes := data!.dorbit;
|
|
155
|
+
D := [];
|
|
156
|
+
for i in pos do
|
|
157
|
+
Add(D, classes[i]);
|
|
158
|
+
od;
|
|
159
|
+
|
|
160
|
+
# find generators for I...
|
|
161
|
+
U := Semigroup(GeneratorsOfSemigroupIdeal(I));
|
|
162
|
+
|
|
163
|
+
for i in [1 .. Length(D)] do
|
|
164
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(D[i]));
|
|
165
|
+
U := ClosureSemigroup(U, OnTuples(GeneratorsOfSemigroup(Source(inj)),
|
|
166
|
+
inj));
|
|
167
|
+
od;
|
|
168
|
+
|
|
169
|
+
i := 0;
|
|
170
|
+
classes := data!.dorbit;
|
|
171
|
+
|
|
172
|
+
while Size(U) <> Size(I) do
|
|
173
|
+
i := i + 1;
|
|
174
|
+
j := 0;
|
|
175
|
+
while Size(U) <> Size(I) and j < Length(partial[i]) do
|
|
176
|
+
j := j + 1;
|
|
177
|
+
if Length(partial[i]) = 1 or partial[i][j] <> i then
|
|
178
|
+
inj := InjectionPrincipalFactor(classes[partial[i][j]]);
|
|
179
|
+
inj := InverseGeneralMapping(inj);
|
|
180
|
+
U := ClosureSemigroup(U, OnTuples(GeneratorsOfSemigroup(Source(inj)),
|
|
181
|
+
inj));
|
|
182
|
+
fi;
|
|
183
|
+
od;
|
|
184
|
+
od;
|
|
185
|
+
|
|
186
|
+
return GeneratorsOfSemigroup(U);
|
|
187
|
+
end);
|
|
188
|
+
|
|
189
|
+
# Don't think that this applies to semigroups of matrices over finite fields,
|
|
190
|
+
# so this doesn't require us to use ConvertToInternalElement
|
|
191
|
+
# TODO(FixExtremeTests): check that this is really correct
|
|
192
|
+
|
|
193
|
+
InstallMethod(GeneratorsOfSemigroup,
|
|
194
|
+
"for an inverse acting semigroup rep ideal",
|
|
195
|
+
[IsInverseActingSemigroupRep and IsSemigroupIdeal],
|
|
196
|
+
function(I)
|
|
197
|
+
local U, partial, D, pos, inj, i, j, C, gens;
|
|
198
|
+
|
|
199
|
+
Info(InfoWarning, 2, "finding a generating set of a semigroup ideal!");
|
|
200
|
+
|
|
201
|
+
# find generators for I...
|
|
202
|
+
U := InverseSemigroup(MinimalIdealGeneratingSet(I));
|
|
203
|
+
partial := OutNeighbours(PartialOrderOfDClasses(I));
|
|
204
|
+
D := GreensDClasses(I);
|
|
205
|
+
|
|
206
|
+
# positions of the D-classes containing generators of the ideal...
|
|
207
|
+
pos := Set(GeneratorsOfSemigroupIdeal(I),
|
|
208
|
+
x -> OrbSCCLookup(LambdaOrb(I))[Position(LambdaOrb(I),
|
|
209
|
+
LambdaFunc(I)(x))] - 1);
|
|
210
|
+
|
|
211
|
+
for i in pos do
|
|
212
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(D[i]));
|
|
213
|
+
U := ClosureInverseSemigroup(U,
|
|
214
|
+
OnTuples(GeneratorsOfSemigroup(Source(inj)),
|
|
215
|
+
inj));
|
|
216
|
+
od;
|
|
217
|
+
|
|
218
|
+
i := 0;
|
|
219
|
+
while Size(U) <> Size(I) do
|
|
220
|
+
i := i + 1;
|
|
221
|
+
j := 0;
|
|
222
|
+
while Size(U) <> Size(I) and j < Length(partial[i]) do
|
|
223
|
+
j := j + 1;
|
|
224
|
+
if Length(partial[i]) = 1 or partial[i][j] <> i then
|
|
225
|
+
C := D[partial[i][j]];
|
|
226
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(C));
|
|
227
|
+
gens := GeneratorsOfSemigroup(Source(inj));
|
|
228
|
+
U := ClosureInverseSemigroup(U, OnTuples(gens, inj));
|
|
229
|
+
fi;
|
|
230
|
+
od;
|
|
231
|
+
od;
|
|
232
|
+
|
|
233
|
+
return GeneratorsOfSemigroup(U);
|
|
234
|
+
end);
|
|
235
|
+
|
|
236
|
+
InstallMethod(GeneratorsOfInverseSemigroup,
|
|
237
|
+
"for an inverse acting semigroup ideal rep",
|
|
238
|
+
[IsInverseActingSemigroupRep and IsSemigroupIdeal],
|
|
239
|
+
function(I)
|
|
240
|
+
local U, i, partial, D, pos, inj, gens, j, C;
|
|
241
|
+
|
|
242
|
+
if HasGeneratorsOfSemigroup(I) then
|
|
243
|
+
return GeneratorsOfSemigroup(I);
|
|
244
|
+
fi;
|
|
245
|
+
|
|
246
|
+
Info(InfoWarning, 2, "finding a generating set of a semigroup ideal!");
|
|
247
|
+
|
|
248
|
+
# find generators for I...
|
|
249
|
+
U := InverseSemigroup(GeneratorsOfSemigroupIdeal(I));
|
|
250
|
+
partial := OutNeighbours(PartialOrderOfDClasses(I));
|
|
251
|
+
D := GreensDClasses(I);
|
|
252
|
+
|
|
253
|
+
# positions of the D-classes containing generators of the ideal...
|
|
254
|
+
pos := Set(GeneratorsOfSemigroupIdeal(I),
|
|
255
|
+
x -> OrbSCCLookup(LambdaOrb(I))[Position(LambdaOrb(I),
|
|
256
|
+
LambdaFunc(I)(x))] - 1);
|
|
257
|
+
|
|
258
|
+
for i in pos do
|
|
259
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(D[i]));
|
|
260
|
+
gens := GeneratorsOfSemigroup(Source(inj));
|
|
261
|
+
U := ClosureInverseSemigroup(U, OnTuples(gens, inj));
|
|
262
|
+
od;
|
|
263
|
+
|
|
264
|
+
i := 0;
|
|
265
|
+
|
|
266
|
+
while Size(U) <> Size(I) do
|
|
267
|
+
i := i + 1;
|
|
268
|
+
j := 0;
|
|
269
|
+
while Size(U) <> Size(I) and j < Length(partial[i]) do
|
|
270
|
+
j := j + 1;
|
|
271
|
+
if Length(partial[i]) = 1 or partial[i][j] <> i then
|
|
272
|
+
C := D[partial[i][j]];
|
|
273
|
+
inj := InverseGeneralMapping(InjectionPrincipalFactor(C));
|
|
274
|
+
gens := GeneratorsOfSemigroup(Source(inj));
|
|
275
|
+
U := ClosureInverseSemigroup(U, OnTuples(gens, inj));
|
|
276
|
+
fi;
|
|
277
|
+
od;
|
|
278
|
+
od;
|
|
279
|
+
|
|
280
|
+
return GeneratorsOfInverseSemigroup(U);
|
|
281
|
+
end);
|
|
282
|
+
|
|
283
|
+
# this could be simpler for ideals which know they are regular a priori.
|
|
284
|
+
|
|
285
|
+
InstallMethod(SemigroupIdealData, "for an acting semigroup ideal",
|
|
286
|
+
[IsActingSemigroup and IsSemigroupIdeal],
|
|
287
|
+
function(I)
|
|
288
|
+
local S, gens, data, filt;
|
|
289
|
+
|
|
290
|
+
S := SupersemigroupOfIdeal(I);
|
|
291
|
+
gens := GeneratorsOfSemigroup(S);
|
|
292
|
+
if IsActingSemigroup(S) then
|
|
293
|
+
gens := List(gens, x -> ConvertToInternalElement(S, x));
|
|
294
|
+
fi;
|
|
295
|
+
|
|
296
|
+
data := rec();
|
|
297
|
+
data.gens := gens;
|
|
298
|
+
data.parent := I;
|
|
299
|
+
data.log := [1];
|
|
300
|
+
data.genspos := 0;
|
|
301
|
+
data.ht := HTCreate(gens[1], rec(treehashsize :=
|
|
302
|
+
SEMIGROUPS.OptionsRec(I).hashlen));
|
|
303
|
+
data.pos := 0;
|
|
304
|
+
data.init := false;
|
|
305
|
+
data.reps := [];
|
|
306
|
+
data.repslookup := [];
|
|
307
|
+
data.orblookup1 := [];
|
|
308
|
+
data.orblookup2 := [];
|
|
309
|
+
data.rholookup := [fail];
|
|
310
|
+
data.lenreps := [0];
|
|
311
|
+
data.orbit := [fail];
|
|
312
|
+
data.dorbit := [];
|
|
313
|
+
data.repslens := [];
|
|
314
|
+
data.lambdarhoht := [];
|
|
315
|
+
data.regular := [];
|
|
316
|
+
data.genstoapply := [1 .. Length(gens)];
|
|
317
|
+
data.stopper := false;
|
|
318
|
+
data.poset := [];
|
|
319
|
+
data.scc_lookup := [];
|
|
320
|
+
|
|
321
|
+
if HasIsRegularSemigroup(I) and IsRegularSemigroup(I) then
|
|
322
|
+
filt := IsRegularIdealData;
|
|
323
|
+
else
|
|
324
|
+
filt := IsSemigroupIdealData;
|
|
325
|
+
fi;
|
|
326
|
+
Objectify(NewType(FamilyObj(I), filt), data);
|
|
327
|
+
|
|
328
|
+
return data;
|
|
329
|
+
end);
|
|
330
|
+
|
|
331
|
+
InstallMethod(SemigroupIdealData,
|
|
332
|
+
"for an inverse acting semigroup rep ideal",
|
|
333
|
+
[IsInverseActingSemigroupRep and IsSemigroupIdeal],
|
|
334
|
+
ReturnFail);
|
|
335
|
+
|
|
336
|
+
InstallMethod(ViewObj, [IsSemigroupIdealData],
|
|
337
|
+
function(data)
|
|
338
|
+
Print("<");
|
|
339
|
+
if IsClosedData(data) then
|
|
340
|
+
Print("closed ");
|
|
341
|
+
else
|
|
342
|
+
Print("open ");
|
|
343
|
+
fi;
|
|
344
|
+
Print("semigroup ideal ");
|
|
345
|
+
|
|
346
|
+
Print("data with ", Length(data!.orbit) - 1, " reps, ",
|
|
347
|
+
Length(LambdaOrb(data!.parent)) - 1, " lambda-values, ",
|
|
348
|
+
Length(RhoOrb(data!.parent)) - 1, " rho-values>");
|
|
349
|
+
return;
|
|
350
|
+
end);
|
|
351
|
+
|
|
352
|
+
InstallMethod(Enumerate, "for semigroup ideal data, limit, looking function",
|
|
353
|
+
[IsSemigroupIdealData, IsCyclotomic, IsFunction],
|
|
354
|
+
{data, limit, lookfunc} -> Enumerate(data, limit, rec(lookfunc := lookfunc)));
|
|
355
|
+
|
|
356
|
+
# We concentrate on the case when nothing is known about the parent of the
|
|
357
|
+
# ideal.
|
|
358
|
+
|
|
359
|
+
# we make the R-class centered data structure as in SemigroupIdealData but at
|
|
360
|
+
# the same time have an additional "orbit" consisting of D-class reps.
|
|
361
|
+
|
|
362
|
+
InstallMethod(Enumerate,
|
|
363
|
+
"for semigroup ideal data, limit, and record",
|
|
364
|
+
[IsSemigroupIdealData, IsCyclotomic, IsRecord],
|
|
365
|
+
function(data, limit, record)
|
|
366
|
+
local lookfunc, looking, lambdalookfunc, lambdalooking, rholookfunc,
|
|
367
|
+
rholooking, ht, orb, nr_r, d, nr_d, reps, repslens, lenreps, lambdarhoht,
|
|
368
|
+
repslookup, orblookup1, orblookup2, rholookup, stopper, gens, genstoapply, I,
|
|
369
|
+
lambda, lambdao, lambdaoht, lambdalookup, lambdascc, lenscc, lambdaperm, rho,
|
|
370
|
+
rhoo, rhooht, rhoolookup, rhoscc, act, htadd, htvalue, drel, dtype, poset,
|
|
371
|
+
datalookup, log, tester, regular, UpdateSemigroupIdealData, idealgens, i, x,
|
|
372
|
+
rreps, pos, j, k, z;
|
|
373
|
+
|
|
374
|
+
if IsBound(record.lookfunc) and not record.lookfunc <> ReturnFalse then
|
|
375
|
+
lookfunc := record.lookfunc;
|
|
376
|
+
looking := true;
|
|
377
|
+
data!.found := false;
|
|
378
|
+
else
|
|
379
|
+
looking := false;
|
|
380
|
+
fi;
|
|
381
|
+
|
|
382
|
+
if IsBound(record.lambdalookfunc) then
|
|
383
|
+
lambdalookfunc := record.lambdalookfunc;
|
|
384
|
+
lambdalooking := true;
|
|
385
|
+
else
|
|
386
|
+
lambdalookfunc := ReturnFalse;
|
|
387
|
+
lambdalooking := false;
|
|
388
|
+
fi;
|
|
389
|
+
|
|
390
|
+
if IsBound(record.rholookfunc) then
|
|
391
|
+
rholookfunc := record.rholookfunc;
|
|
392
|
+
rholooking := true;
|
|
393
|
+
else
|
|
394
|
+
rholookfunc := ReturnFalse;
|
|
395
|
+
rholooking := false;
|
|
396
|
+
fi;
|
|
397
|
+
|
|
398
|
+
if IsClosedData(data) then
|
|
399
|
+
if looking then
|
|
400
|
+
data!.found := false;
|
|
401
|
+
fi;
|
|
402
|
+
return data;
|
|
403
|
+
fi;
|
|
404
|
+
|
|
405
|
+
data!.looking := looking;
|
|
406
|
+
|
|
407
|
+
ht := data!.ht; # so far found R-reps
|
|
408
|
+
orb := data!.orbit; # the so far found R-reps data
|
|
409
|
+
nr_r := Length(orb);
|
|
410
|
+
d := data!.dorbit; # the so far found D-classes
|
|
411
|
+
nr_d := Length(d);
|
|
412
|
+
reps := data!.reps; # reps grouped by equal lambda-scc-index and
|
|
413
|
+
# rho-value-index
|
|
414
|
+
|
|
415
|
+
repslens := data!.repslens; # Length(reps[m][i])=repslens[m][i]
|
|
416
|
+
lenreps := data!.lenreps; # lenreps[m]=Length(reps[m])
|
|
417
|
+
|
|
418
|
+
lambdarhoht := data!.lambdarhoht;
|
|
419
|
+
# HTValue(lambdarhoht, [m,l])=position in reps[m]
|
|
420
|
+
# of R-reps with lambda-scc-index=m and
|
|
421
|
+
# rho-value-index=l
|
|
422
|
+
|
|
423
|
+
repslookup := data!.repslookup; # Position(orb, reps[m][i][j])
|
|
424
|
+
# = repslookup[m][i][j]
|
|
425
|
+
# = HTValue(ht, reps[m][i][j])
|
|
426
|
+
|
|
427
|
+
orblookup1 := data!.orblookup1; # orblookup1[i] position in reps[m]
|
|
428
|
+
# containing orb[i][4] (the R-rep)
|
|
429
|
+
|
|
430
|
+
orblookup2 := data!.orblookup2; # orblookup2[i] position in
|
|
431
|
+
# reps[m][orblookup1[i]]
|
|
432
|
+
# containing orb[i][4] (the R-rep)
|
|
433
|
+
|
|
434
|
+
rholookup := data!.rholookup; # rholookup[i]=rho-value-index of orb[i][4]
|
|
435
|
+
|
|
436
|
+
stopper := data!.stopper; # stop at this place in the orbit
|
|
437
|
+
|
|
438
|
+
# generators
|
|
439
|
+
gens := data!.gens; # generators of the parent semigroup
|
|
440
|
+
genstoapply := data!.genstoapply;
|
|
441
|
+
|
|
442
|
+
I := data!.parent;
|
|
443
|
+
|
|
444
|
+
# lambda
|
|
445
|
+
lambda := LambdaFunc(I);
|
|
446
|
+
lambdao := LambdaOrb(I);
|
|
447
|
+
lambdaoht := lambdao!.ht;
|
|
448
|
+
lambdalookup := lambdao!.scc_lookup;
|
|
449
|
+
lambdascc := OrbSCC(lambdao);
|
|
450
|
+
lenscc := Length(lambdascc);
|
|
451
|
+
|
|
452
|
+
lambdaperm := LambdaPerm(I);
|
|
453
|
+
|
|
454
|
+
# rho
|
|
455
|
+
rho := RhoFunc(I);
|
|
456
|
+
rhoo := RhoOrb(I);
|
|
457
|
+
rhooht := rhoo!.ht;
|
|
458
|
+
rhoolookup := rhoo!.scc_lookup;
|
|
459
|
+
rhoscc := OrbSCC(rhoo);
|
|
460
|
+
|
|
461
|
+
act := StabilizerAction(I);
|
|
462
|
+
|
|
463
|
+
if IsBoundGlobal("ORBC") then
|
|
464
|
+
htadd := HTAdd_TreeHash_C;
|
|
465
|
+
htvalue := HTValue_TreeHash_C;
|
|
466
|
+
else
|
|
467
|
+
htadd := HTAdd;
|
|
468
|
+
htvalue := HTValue;
|
|
469
|
+
fi;
|
|
470
|
+
|
|
471
|
+
# new stuff
|
|
472
|
+
drel := GreensDRelation(I);
|
|
473
|
+
dtype := DClassType(I);
|
|
474
|
+
|
|
475
|
+
poset := data!.poset; # the D-class poset
|
|
476
|
+
datalookup := data!.scc_lookup;
|
|
477
|
+
|
|
478
|
+
log := data!.log;
|
|
479
|
+
# log[i+1] is the last position in orb=data!.orbit where the R-class reps
|
|
480
|
+
# of d[i] appear...
|
|
481
|
+
|
|
482
|
+
tester := IdempotentTester(I);
|
|
483
|
+
regular := data!.regular;
|
|
484
|
+
|
|
485
|
+
#############################################################################
|
|
486
|
+
|
|
487
|
+
# the function which checks if x is already R/D-related to something in the
|
|
488
|
+
# data and if not adds it in the appropriate place
|
|
489
|
+
|
|
490
|
+
UpdateSemigroupIdealData := function(x, pos, gen, idealpos)
|
|
491
|
+
local new, xx, l, m, mm, schutz, mults, cosets, y, n, z, ind, val;
|
|
492
|
+
new := false;
|
|
493
|
+
|
|
494
|
+
# check, update, rectify the lambda value
|
|
495
|
+
xx := lambda(x);
|
|
496
|
+
l := htvalue(lambdaoht, xx);
|
|
497
|
+
if l = fail then
|
|
498
|
+
l := UpdateIdealLambdaOrb(lambdao, xx, x, pos, gen, idealpos,
|
|
499
|
+
lambdalookfunc);
|
|
500
|
+
|
|
501
|
+
# update the lists of reps
|
|
502
|
+
for n in [lenscc + 1 .. lenscc + Length(lambdascc)] do
|
|
503
|
+
reps[n] := [];
|
|
504
|
+
repslookup[n] := [];
|
|
505
|
+
repslens[n] := [];
|
|
506
|
+
lenreps[n] := 0;
|
|
507
|
+
lenscc := Length(lambdascc);
|
|
508
|
+
od;
|
|
509
|
+
new := true; # x is a new R-rep
|
|
510
|
+
fi;
|
|
511
|
+
m := lambdalookup[l];
|
|
512
|
+
if l <> lambdascc[m][1] then
|
|
513
|
+
x := x * LambdaOrbMult(lambdao, m, l)[2];
|
|
514
|
+
fi;
|
|
515
|
+
|
|
516
|
+
# check if x is identical to one of the known R-reps
|
|
517
|
+
if not new then
|
|
518
|
+
val := htvalue(ht, x);
|
|
519
|
+
if val <> fail then
|
|
520
|
+
if pos <> fail then # we are multiplying the <i>th D-rep by a generator
|
|
521
|
+
AddSet(poset[i], datalookup[val]);
|
|
522
|
+
fi;
|
|
523
|
+
return; # x is one of the old R-reps
|
|
524
|
+
fi;
|
|
525
|
+
fi;
|
|
526
|
+
|
|
527
|
+
# check, update, rectify the rho value
|
|
528
|
+
xx := rho(x);
|
|
529
|
+
l := htvalue(rhooht, xx);
|
|
530
|
+
if l = fail then
|
|
531
|
+
l := UpdateIdealRhoOrb(rhoo, xx, x, pos, gen, idealpos, rholookfunc);
|
|
532
|
+
new := true; # x is a new R-rep
|
|
533
|
+
fi;
|
|
534
|
+
schutz := LambdaOrbStabChain(lambdao, m);
|
|
535
|
+
|
|
536
|
+
# check if x is R-related to one of the known R-reps
|
|
537
|
+
if not new and schutz <> false and IsBound(lambdarhoht[l])
|
|
538
|
+
and IsBound(lambdarhoht[l][m]) then
|
|
539
|
+
# if schutz=false or these are not bound, then x is a new R-rep
|
|
540
|
+
|
|
541
|
+
ind := lambdarhoht[l][m];
|
|
542
|
+
if schutz = true then
|
|
543
|
+
if pos <> fail then
|
|
544
|
+
AddSet(poset[i], datalookup[repslookup[m][ind][1]]);
|
|
545
|
+
fi;
|
|
546
|
+
return;
|
|
547
|
+
fi;
|
|
548
|
+
|
|
549
|
+
for n in [1 .. repslens[m][ind]] do
|
|
550
|
+
if SchutzGpMembership(I)(schutz, lambdaperm(reps[m][ind][n], x)) then
|
|
551
|
+
if pos <> fail then
|
|
552
|
+
AddSet(poset[i], datalookup[repslookup[m][ind][n]]);
|
|
553
|
+
fi;
|
|
554
|
+
return; # x is on of the old R-reps
|
|
555
|
+
fi;
|
|
556
|
+
od;
|
|
557
|
+
fi;
|
|
558
|
+
|
|
559
|
+
# if we reach here, then x is a new R-rep, and hence a new D-rep
|
|
560
|
+
mm := rhoolookup[l];
|
|
561
|
+
if l <> rhoscc[mm][1] then
|
|
562
|
+
x := RhoOrbMult(rhoo, mm, l)[2] * x;
|
|
563
|
+
fi;
|
|
564
|
+
|
|
565
|
+
nr_d := nr_d + 1;
|
|
566
|
+
d[nr_d] := rec(rep := x);
|
|
567
|
+
ObjectifyWithAttributes(d[nr_d], dtype,
|
|
568
|
+
ParentAttr, I,
|
|
569
|
+
EquivalenceClassRelation, drel,
|
|
570
|
+
IsGreensClassNC, false,
|
|
571
|
+
Representative, ConvertToExternalElement(I, x),
|
|
572
|
+
LambdaOrb, lambdao,
|
|
573
|
+
LambdaOrbSCCIndex, m,
|
|
574
|
+
RhoOrb, rhoo,
|
|
575
|
+
RhoOrbSCCIndex, mm,
|
|
576
|
+
RhoOrbSCC, rhoscc[mm]);
|
|
577
|
+
regular[nr_d] := false;
|
|
578
|
+
|
|
579
|
+
# install the point in the poset
|
|
580
|
+
|
|
581
|
+
if pos <> fail then
|
|
582
|
+
AddSet(poset[i], nr_d);
|
|
583
|
+
fi;
|
|
584
|
+
|
|
585
|
+
# install the R-class reps of the new D-rep
|
|
586
|
+
mults := RhoOrbMults(rhoo, mm);
|
|
587
|
+
cosets := RhoCosets(d[nr_d]);
|
|
588
|
+
|
|
589
|
+
for l in rhoscc[mm] do # install the R-class reps
|
|
590
|
+
if not IsBound(lambdarhoht[l]) then
|
|
591
|
+
lambdarhoht[l] := [];
|
|
592
|
+
fi;
|
|
593
|
+
if not IsBound(lambdarhoht[l][m]) then
|
|
594
|
+
lenreps[m] := lenreps[m] + 1;
|
|
595
|
+
ind := lenreps[m];
|
|
596
|
+
lambdarhoht[l][m] := ind;
|
|
597
|
+
repslens[m][ind] := 0;
|
|
598
|
+
reps[m][ind] := [];
|
|
599
|
+
repslookup[m][ind] := [];
|
|
600
|
+
else
|
|
601
|
+
ind := lambdarhoht[l][m];
|
|
602
|
+
if not HasIsRegularSemigroup(I) then
|
|
603
|
+
SetIsRegularSemigroup(I, false);
|
|
604
|
+
fi;
|
|
605
|
+
fi;
|
|
606
|
+
if not HasIsRegularSemigroup(I) and not regular[nr_d] then
|
|
607
|
+
regular[nr_d] := tester(lambdao[lambdascc[m][1]], rhoo[l]);
|
|
608
|
+
fi;
|
|
609
|
+
y := mults[l][1] * x;
|
|
610
|
+
|
|
611
|
+
for z in cosets do
|
|
612
|
+
nr_r := nr_r + 1;
|
|
613
|
+
|
|
614
|
+
repslens[m][ind] := repslens[m][ind] + 1;
|
|
615
|
+
reps[m][ind][repslens[m][ind]] := act(y, z ^ -1);
|
|
616
|
+
repslookup[m][ind][repslens[m][ind]] := nr_r;
|
|
617
|
+
orblookup1[nr_r] := ind;
|
|
618
|
+
orblookup2[nr_r] := repslens[m][ind];
|
|
619
|
+
rholookup[nr_r] := l;
|
|
620
|
+
datalookup[nr_r] := nr_d;
|
|
621
|
+
|
|
622
|
+
orb[nr_r] := [I, m, lambdao, reps[m][ind][repslens[m][ind]],
|
|
623
|
+
false, nr_r];
|
|
624
|
+
htadd(ht, reps[m][ind][repslens[m][ind]], nr_r);
|
|
625
|
+
|
|
626
|
+
if looking then
|
|
627
|
+
# did we find it?
|
|
628
|
+
if lookfunc(data, orb[nr_r]) then
|
|
629
|
+
data!.found := nr_r;
|
|
630
|
+
fi;
|
|
631
|
+
fi;
|
|
632
|
+
|
|
633
|
+
od;
|
|
634
|
+
od;
|
|
635
|
+
log[nr_d + 1] := nr_r;
|
|
636
|
+
end;
|
|
637
|
+
#############################################################################
|
|
638
|
+
|
|
639
|
+
# initialise the data if necessary
|
|
640
|
+
if data!.init = false then
|
|
641
|
+
# add the generators of the ideal...
|
|
642
|
+
idealgens := List(GeneratorsOfSemigroupIdeal(I),
|
|
643
|
+
x -> ConvertToInternalElement(I, x));
|
|
644
|
+
for i in [1 .. Length(idealgens)] do
|
|
645
|
+
UpdateSemigroupIdealData(idealgens[i], fail, fail, i);
|
|
646
|
+
od;
|
|
647
|
+
|
|
648
|
+
data!.init := true;
|
|
649
|
+
data!.genspos := nr_d + 1;
|
|
650
|
+
fi;
|
|
651
|
+
|
|
652
|
+
i := data!.pos; # points in orb in position at most i have descendants
|
|
653
|
+
|
|
654
|
+
while nr_d <= limit and i < nr_d and i <> stopper do
|
|
655
|
+
i := i + 1; # advance in the dorb
|
|
656
|
+
poset[i] := [];
|
|
657
|
+
x := Representative(d[i]);
|
|
658
|
+
|
|
659
|
+
# left multiply the R-class reps by the generators of the semigroup
|
|
660
|
+
rreps := [];
|
|
661
|
+
pos := Position(lambdao, lambda(x));
|
|
662
|
+
for j in [log[i] + 1 .. log[i + 1]] do # the R-class reps of d[i]
|
|
663
|
+
rreps[j - log[i]] := orb[j][4];
|
|
664
|
+
for k in genstoapply do
|
|
665
|
+
UpdateSemigroupIdealData(gens[k] * orb[j][4], pos, k, fail);
|
|
666
|
+
if (looking and data!.found <> false)
|
|
667
|
+
or (lambdalooking and lambdao!.found <> false)
|
|
668
|
+
or (rholooking and rhoo!.found <> false) then
|
|
669
|
+
data!.pos := i - 1;
|
|
670
|
+
return data;
|
|
671
|
+
fi;
|
|
672
|
+
od;
|
|
673
|
+
od;
|
|
674
|
+
SetRClassReps(d[i], rreps);
|
|
675
|
+
|
|
676
|
+
# right multiply the L-class reps by the generators of the semigroup
|
|
677
|
+
pos := Position(rhoo, rho(x));
|
|
678
|
+
for z in LClassReps(d[i]) do
|
|
679
|
+
for k in genstoapply do
|
|
680
|
+
UpdateSemigroupIdealData(z * gens[k], pos, k, fail);
|
|
681
|
+
if (looking and data!.found <> false)
|
|
682
|
+
or (lambdalooking and lambdao!.found <> false)
|
|
683
|
+
or (rholooking and rhoo!.found <> false) then
|
|
684
|
+
data!.pos := i - 1;
|
|
685
|
+
return data;
|
|
686
|
+
fi;
|
|
687
|
+
od;
|
|
688
|
+
od;
|
|
689
|
+
od;
|
|
690
|
+
|
|
691
|
+
# for the data-orbit
|
|
692
|
+
data!.pos := i;
|
|
693
|
+
|
|
694
|
+
if nr_d = i then
|
|
695
|
+
SetFilterObj(lambdao, IsClosedOrbit);
|
|
696
|
+
SetFilterObj(rhoo, IsClosedOrbit);
|
|
697
|
+
SetFilterObj(data, IsClosedData);
|
|
698
|
+
if not HasIsRegularSemigroup(I) then
|
|
699
|
+
SetIsRegularSemigroup(I, ForAll(regular, x -> x));
|
|
700
|
+
fi;
|
|
701
|
+
if IsRegularSemigroup(I) then
|
|
702
|
+
SetFilterObj(I, IsRegularActingSemigroupRep);
|
|
703
|
+
SetGreensDClasses(I, d);
|
|
704
|
+
fi;
|
|
705
|
+
fi;
|
|
706
|
+
return data;
|
|
707
|
+
end);
|
|
708
|
+
|
|
709
|
+
# TODO(FixExtremeTests): use ConvertToInternalElement here
|
|
710
|
+
|
|
711
|
+
InstallMethod(\in,
|
|
712
|
+
"for a multiplicative element and regular acting semigroup ideal",
|
|
713
|
+
[IsMultiplicativeElement,
|
|
714
|
+
IsSemigroupIdeal and IsRegularActingSemigroupRep],
|
|
715
|
+
function(x, I)
|
|
716
|
+
local data, ht, xx, o, l, lookfunc, m, lambdarhoht,
|
|
717
|
+
schutz, ind, reps;
|
|
718
|
+
|
|
719
|
+
if IsInverseActingSemigroupRep(I) then
|
|
720
|
+
TryNextMethod();
|
|
721
|
+
elif ElementsFamily(FamilyObj(I)) <> FamilyObj(x)
|
|
722
|
+
or (IsActingSemigroupWithFixedDegreeMultiplication(I)
|
|
723
|
+
and ActionDegree(x) <> ActionDegree(I))
|
|
724
|
+
or (ActionDegree(x) > ActionDegree(I)) then
|
|
725
|
+
return false;
|
|
726
|
+
elif ActionRank(I)(x) >
|
|
727
|
+
MaximumList(List(Generators(I), y -> ActionRank(I)(y))) then
|
|
728
|
+
Info(InfoSemigroups, 2, "element has larger rank than any element of ",
|
|
729
|
+
"semigroup.");
|
|
730
|
+
return false;
|
|
731
|
+
elif HasMinimalIdeal(I) then
|
|
732
|
+
if ActionRank(I)(x) < ActionRank(I)(Representative(MinimalIdeal(I))) then
|
|
733
|
+
Info(InfoSemigroups, 2, "element has smaller rank than any element of ",
|
|
734
|
+
"semigroup.");
|
|
735
|
+
return false;
|
|
736
|
+
fi;
|
|
737
|
+
fi;
|
|
738
|
+
|
|
739
|
+
data := SemigroupIdealData(I);
|
|
740
|
+
ht := data!.ht;
|
|
741
|
+
|
|
742
|
+
# look for lambda!
|
|
743
|
+
xx := LambdaFunc(I)(x);
|
|
744
|
+
o := LambdaOrb(I);
|
|
745
|
+
|
|
746
|
+
l := Position(o, xx);
|
|
747
|
+
|
|
748
|
+
if l = fail then
|
|
749
|
+
if IsClosedOrbit(o) then
|
|
750
|
+
return false;
|
|
751
|
+
fi;
|
|
752
|
+
|
|
753
|
+
# this function checks if <pt> has the same lambda-value as x
|
|
754
|
+
lookfunc := {lambdao, pt} -> pt = xx;
|
|
755
|
+
Enumerate(data, infinity, rec(lambdalookfunc := lookfunc));
|
|
756
|
+
l := PositionOfFound(o);
|
|
757
|
+
|
|
758
|
+
# rho is not found, so f not in s
|
|
759
|
+
if l = false then
|
|
760
|
+
return false;
|
|
761
|
+
fi;
|
|
762
|
+
l := Position(o, xx);
|
|
763
|
+
fi;
|
|
764
|
+
|
|
765
|
+
# strongly connected component of lambda orb
|
|
766
|
+
m := OrbSCCLookup(o)[l];
|
|
767
|
+
|
|
768
|
+
# make sure lambda of <x> is in the first place of its scc
|
|
769
|
+
if l <> OrbSCC(o)[m][1] then
|
|
770
|
+
x := x * LambdaOrbMult(o, m, l)[2];
|
|
771
|
+
fi;
|
|
772
|
+
|
|
773
|
+
schutz := LambdaOrbStabChain(o, m);
|
|
774
|
+
|
|
775
|
+
# check if <x> is an existing R-rep
|
|
776
|
+
if HTValue(ht, x) <> fail then
|
|
777
|
+
return true;
|
|
778
|
+
elif schutz = false then
|
|
779
|
+
# If <x> in <I> and the Schutz gp is trivial, then <x> is an R-class rep.
|
|
780
|
+
# Since we have found the D-class containing an element of <I> with the
|
|
781
|
+
# same lambda-val as <x>, we have found all of the R-class reps of <I>
|
|
782
|
+
# with the same lambda-val as <x>, and so we should have found <x>. We
|
|
783
|
+
# didn't and so <x> is not in <I>.
|
|
784
|
+
return false;
|
|
785
|
+
fi;
|
|
786
|
+
|
|
787
|
+
# look for rho!
|
|
788
|
+
o := RhoOrb(I);
|
|
789
|
+
l := Position(o, RhoFunc(I)(x));
|
|
790
|
+
|
|
791
|
+
if l = fail then
|
|
792
|
+
Assert(1, IsClosedOrbit(o));
|
|
793
|
+
# Because I is regular once we have found the lambda-val we have found the
|
|
794
|
+
# (unique) D-class of I containing something with the same lambda-val. If x
|
|
795
|
+
# in I, then the D-class we've found must contain x and so we already know
|
|
796
|
+
# the rho-val. So, if l = fail, then x is not in I.
|
|
797
|
+
return false;
|
|
798
|
+
fi;
|
|
799
|
+
|
|
800
|
+
lambdarhoht := data!.lambdarhoht;
|
|
801
|
+
|
|
802
|
+
# look for the R-class rep
|
|
803
|
+
if not IsBound(lambdarhoht[l]) or not IsBound(lambdarhoht[l][m]) then
|
|
804
|
+
# lambda-rho-combination not yet seen
|
|
805
|
+
if IsClosedData(data) then
|
|
806
|
+
return false;
|
|
807
|
+
fi;
|
|
808
|
+
|
|
809
|
+
lookfunc := {d, x} -> IsBound(lambdarhoht[l])
|
|
810
|
+
and IsBound(lambdarhoht[l][m]);
|
|
811
|
+
data := Enumerate(data, infinity, lookfunc);
|
|
812
|
+
if not IsBound(lambdarhoht[l]) or not IsBound(lambdarhoht[l][m]) then
|
|
813
|
+
return false;
|
|
814
|
+
fi;
|
|
815
|
+
fi;
|
|
816
|
+
|
|
817
|
+
ind := lambdarhoht[l][m];
|
|
818
|
+
# the index of the list of reps with same lambda-rho value as <x>.
|
|
819
|
+
# Note that since <I> is regular, there is only one such rep at most.
|
|
820
|
+
|
|
821
|
+
reps := data!.reps;
|
|
822
|
+
|
|
823
|
+
# if the Schutzenberger group is the symmetric group, then <x> in <I>!
|
|
824
|
+
if schutz = true then
|
|
825
|
+
return true;
|
|
826
|
+
fi;
|
|
827
|
+
Assert(1, schutz <> false);
|
|
828
|
+
return SchutzGpMembership(I)(schutz, LambdaPerm(I)(reps[m][ind][1], x));
|
|
829
|
+
end);
|
|
830
|
+
|
|
831
|
+
# JDM; this method could be removed later...
|
|
832
|
+
|
|
833
|
+
InstallMethod(Size, "for an acting semigroup ideal",
|
|
834
|
+
[IsActingSemigroup and IsSemigroupIdeal],
|
|
835
|
+
function(s)
|
|
836
|
+
local data, lenreps, repslens, o, scc, size, n, m, i;
|
|
837
|
+
|
|
838
|
+
data := Enumerate(SemigroupIdealData(s), infinity, ReturnFalse);
|
|
839
|
+
lenreps := data!.lenreps;
|
|
840
|
+
repslens := data!.repslens;
|
|
841
|
+
o := LambdaOrb(s);
|
|
842
|
+
scc := OrbSCC(o);
|
|
843
|
+
|
|
844
|
+
size := 0;
|
|
845
|
+
|
|
846
|
+
for m in [2 .. Length(scc)] do
|
|
847
|
+
n := Size(LambdaOrbSchutzGp(o, m)) * Length(scc[m]);
|
|
848
|
+
for i in [1 .. lenreps[m]] do
|
|
849
|
+
size := size + n * repslens[m][i];
|
|
850
|
+
od;
|
|
851
|
+
od;
|
|
852
|
+
|
|
853
|
+
return size;
|
|
854
|
+
end);
|
|
855
|
+
|
|
856
|
+
InstallMethod(Enumerate,
|
|
857
|
+
"for regular ideal data, limit, and func",
|
|
858
|
+
[IsRegularIdealData, IsCyclotomic, IsRecord],
|
|
859
|
+
function(data, limit, record)
|
|
860
|
+
local lookfunc, looking, lambdalookfunc, lambdalooking, rholookfunc,
|
|
861
|
+
rholooking, ht, orb, nr_r, d, nr_d, reps, repslens, lenreps, lambdarhoht,
|
|
862
|
+
repslookup, orblookup1, orblookup2, rholookup, stopper, gens, genstoapply, I,
|
|
863
|
+
lambda, lambdao, lambdaoht, lambdalookup, lambdascc, lenscc, rho, rhoo,
|
|
864
|
+
rhooht, rhoolookup, rhoscc, rholen, htadd, htvalue, drel, dtype, poset,
|
|
865
|
+
datalookup, log, UpdateSemigroupIdealData, idealgens, i, x, rreps, pos, j, k,
|
|
866
|
+
z;
|
|
867
|
+
|
|
868
|
+
if IsBound(record.lookfunc) and record.lookfunc <> ReturnFalse then
|
|
869
|
+
lookfunc := record.lookfunc;
|
|
870
|
+
looking := true;
|
|
871
|
+
data!.found := false;
|
|
872
|
+
else
|
|
873
|
+
looking := false;
|
|
874
|
+
fi;
|
|
875
|
+
|
|
876
|
+
if IsBound(record.lambdalookfunc) then
|
|
877
|
+
lambdalookfunc := record.lambdalookfunc;
|
|
878
|
+
lambdalooking := true;
|
|
879
|
+
else
|
|
880
|
+
lambdalookfunc := ReturnFalse;
|
|
881
|
+
lambdalooking := false;
|
|
882
|
+
fi;
|
|
883
|
+
|
|
884
|
+
if IsBound(record.rholookfunc) then
|
|
885
|
+
rholookfunc := record.rholookfunc;
|
|
886
|
+
rholooking := true;
|
|
887
|
+
else
|
|
888
|
+
rholookfunc := ReturnFalse;
|
|
889
|
+
rholooking := false;
|
|
890
|
+
fi;
|
|
891
|
+
|
|
892
|
+
if IsClosedData(data) then
|
|
893
|
+
if looking then
|
|
894
|
+
data!.found := false;
|
|
895
|
+
fi;
|
|
896
|
+
return data;
|
|
897
|
+
fi;
|
|
898
|
+
|
|
899
|
+
data!.looking := looking;
|
|
900
|
+
|
|
901
|
+
ht := data!.ht; # so far found R-reps
|
|
902
|
+
orb := data!.orbit; # the so far found R-reps data
|
|
903
|
+
nr_r := Length(orb);
|
|
904
|
+
d := data!.dorbit; # the so far found D-classes
|
|
905
|
+
nr_d := Length(d);
|
|
906
|
+
reps := data!.reps;
|
|
907
|
+
# reps grouped by equal lambda-scc-index and rho-value-index
|
|
908
|
+
|
|
909
|
+
repslens := data!.repslens; # Length(reps[m][i])=repslens[m][i]
|
|
910
|
+
lenreps := data!.lenreps; # lenreps[m]=Length(reps[m])
|
|
911
|
+
|
|
912
|
+
lambdarhoht := data!.lambdarhoht;
|
|
913
|
+
# HTValue(lambdarhoht, [m,l])=position in
|
|
914
|
+
# reps[m] of R-reps with lambda-scc-index=m
|
|
915
|
+
# and rho-value-index=l
|
|
916
|
+
|
|
917
|
+
repslookup := data!.repslookup; # Position(orb, reps[m][i][j])
|
|
918
|
+
# = repslookup[m][i][j]
|
|
919
|
+
# = HTValue(ht, reps[m][i][j])
|
|
920
|
+
|
|
921
|
+
orblookup1 := data!.orblookup1; # orblookup1[i] position in reps[m]
|
|
922
|
+
# containing orb[i][4] (the R-rep)
|
|
923
|
+
|
|
924
|
+
orblookup2 := data!.orblookup2; # orblookup2[i] position in
|
|
925
|
+
# reps[m][orblookup1[i]]
|
|
926
|
+
# containing orb[i][4] (the R-rep)
|
|
927
|
+
|
|
928
|
+
rholookup := data!.rholookup; # rholookup[i]=rho-value-index of orb[i][4]
|
|
929
|
+
|
|
930
|
+
stopper := data!.stopper; # stop at this place in the orbit
|
|
931
|
+
|
|
932
|
+
# generators
|
|
933
|
+
gens := data!.gens; # generators of the parent semigroup
|
|
934
|
+
genstoapply := data!.genstoapply;
|
|
935
|
+
|
|
936
|
+
I := data!.parent;
|
|
937
|
+
|
|
938
|
+
# lambda
|
|
939
|
+
lambda := LambdaFunc(I);
|
|
940
|
+
lambdao := LambdaOrb(I);
|
|
941
|
+
lambdaoht := lambdao!.ht;
|
|
942
|
+
lambdalookup := lambdao!.scc_lookup;
|
|
943
|
+
lambdascc := OrbSCC(lambdao);
|
|
944
|
+
lenscc := Length(lambdascc);
|
|
945
|
+
|
|
946
|
+
# rho
|
|
947
|
+
rho := RhoFunc(I);
|
|
948
|
+
rhoo := RhoOrb(I);
|
|
949
|
+
rhooht := rhoo!.ht;
|
|
950
|
+
rhoolookup := rhoo!.scc_lookup;
|
|
951
|
+
rhoscc := OrbSCC(rhoo);
|
|
952
|
+
rholen := Length(rhoo);
|
|
953
|
+
|
|
954
|
+
if IsBoundGlobal("ORBC") then
|
|
955
|
+
htadd := HTAdd_TreeHash_C;
|
|
956
|
+
htvalue := HTValue_TreeHash_C;
|
|
957
|
+
else
|
|
958
|
+
htadd := HTAdd;
|
|
959
|
+
htvalue := HTValue;
|
|
960
|
+
fi;
|
|
961
|
+
|
|
962
|
+
# new stuff
|
|
963
|
+
drel := GreensDRelation(I);
|
|
964
|
+
dtype := DClassType(I);
|
|
965
|
+
|
|
966
|
+
poset := data!.poset; # the D-class poset
|
|
967
|
+
datalookup := data!.scc_lookup;
|
|
968
|
+
|
|
969
|
+
log := data!.log;
|
|
970
|
+
# log[i+1] is the last position in orb=data!.orbit where the
|
|
971
|
+
# R-class reps of d[i] appear...
|
|
972
|
+
|
|
973
|
+
#############################################################################
|
|
974
|
+
|
|
975
|
+
# the function which checks if x is already R/D-related to something in the
|
|
976
|
+
# data and if not adds it in the appropriate place
|
|
977
|
+
|
|
978
|
+
UpdateSemigroupIdealData := function(x, pos, gen, idealpos)
|
|
979
|
+
local new, xx, l, m, mm, schutz, mults, y, n, ind, val;
|
|
980
|
+
new := false;
|
|
981
|
+
|
|
982
|
+
# check, update, rectify the lambda value
|
|
983
|
+
xx := lambda(x);
|
|
984
|
+
l := htvalue(lambdaoht, xx);
|
|
985
|
+
if l = fail then
|
|
986
|
+
l := UpdateIdealLambdaOrb(lambdao, xx, x, pos, gen, idealpos,
|
|
987
|
+
lambdalookfunc);
|
|
988
|
+
|
|
989
|
+
# update the lists of reps
|
|
990
|
+
for n in [lenscc + 1 .. lenscc + Length(lambdascc)] do
|
|
991
|
+
reps[n] := [];
|
|
992
|
+
repslookup[n] := [];
|
|
993
|
+
repslens[n] := [];
|
|
994
|
+
lenreps[n] := 0;
|
|
995
|
+
lenscc := Length(lambdascc);
|
|
996
|
+
od;
|
|
997
|
+
new := true; # x is a new R-rep
|
|
998
|
+
fi;
|
|
999
|
+
m := lambdalookup[l];
|
|
1000
|
+
if l <> lambdascc[m][1] then
|
|
1001
|
+
x := x * LambdaOrbMult(lambdao, m, l)[2];
|
|
1002
|
+
fi;
|
|
1003
|
+
|
|
1004
|
+
# check if x is identical to one of the known R-reps
|
|
1005
|
+
if not new then
|
|
1006
|
+
val := htvalue(ht, x);
|
|
1007
|
+
if val <> fail then
|
|
1008
|
+
if pos <> fail then # we are multiplying the <i>th D-rep by a generator
|
|
1009
|
+
AddSet(poset[i], datalookup[val]);
|
|
1010
|
+
fi;
|
|
1011
|
+
return; # x is one of the old R-reps
|
|
1012
|
+
fi;
|
|
1013
|
+
fi;
|
|
1014
|
+
|
|
1015
|
+
# check, update, rectify the rho value
|
|
1016
|
+
xx := rho(x);
|
|
1017
|
+
l := htvalue(rhooht, xx);
|
|
1018
|
+
if l = fail then
|
|
1019
|
+
l := UpdateIdealRhoOrb(rhoo, xx, x, pos, gen, idealpos, rholookfunc);
|
|
1020
|
+
for n in [rholen + 1 .. rholen + Length(rhoo)] do
|
|
1021
|
+
lambdarhoht[n] := [];
|
|
1022
|
+
od;
|
|
1023
|
+
rholen := Length(rhoo);
|
|
1024
|
+
new := true; # x is a new R-rep
|
|
1025
|
+
fi;
|
|
1026
|
+
schutz := LambdaOrbStabChain(lambdao, m);
|
|
1027
|
+
|
|
1028
|
+
# check if x is R-related to one of the known R-reps
|
|
1029
|
+
if not new and schutz <> false and IsBound(lambdarhoht[l][m]) then
|
|
1030
|
+
ind := lambdarhoht[l][m];
|
|
1031
|
+
if pos <> fail then
|
|
1032
|
+
AddSet(poset[i], datalookup[repslookup[m][ind][1]]);
|
|
1033
|
+
fi;
|
|
1034
|
+
return;
|
|
1035
|
+
fi;
|
|
1036
|
+
|
|
1037
|
+
# if we reach here, then x is a new R-rep, and hence a new D-rep
|
|
1038
|
+
mm := rhoolookup[l];
|
|
1039
|
+
if l <> rhoscc[mm][1] then
|
|
1040
|
+
x := RhoOrbMult(rhoo, mm, l)[2] * x;
|
|
1041
|
+
fi;
|
|
1042
|
+
|
|
1043
|
+
nr_d := nr_d + 1;
|
|
1044
|
+
d[nr_d] := rec(rep := x);
|
|
1045
|
+
ObjectifyWithAttributes(d[nr_d], dtype,
|
|
1046
|
+
ParentAttr, I,
|
|
1047
|
+
EquivalenceClassRelation, drel,
|
|
1048
|
+
IsGreensClassNC, false,
|
|
1049
|
+
Representative, ConvertToExternalElement(I, x),
|
|
1050
|
+
LambdaOrb, lambdao,
|
|
1051
|
+
LambdaOrbSCCIndex, m,
|
|
1052
|
+
RhoOrb, rhoo,
|
|
1053
|
+
RhoOrbSCCIndex, mm,
|
|
1054
|
+
RhoOrbSCC, rhoscc[mm]);
|
|
1055
|
+
|
|
1056
|
+
# install the point in the poset
|
|
1057
|
+
if pos <> fail then
|
|
1058
|
+
AddSet(poset[i], nr_d);
|
|
1059
|
+
fi;
|
|
1060
|
+
|
|
1061
|
+
# install the R-class reps of the new D-rep
|
|
1062
|
+
mults := RhoOrbMults(rhoo, mm);
|
|
1063
|
+
|
|
1064
|
+
for l in rhoscc[mm] do # install the R-class reps
|
|
1065
|
+
nr_r := nr_r + 1;
|
|
1066
|
+
y := mults[l][1] * x;
|
|
1067
|
+
orb[nr_r] := [I, m, lambdao, y, false, nr_r];
|
|
1068
|
+
htadd(ht, y, nr_r);
|
|
1069
|
+
|
|
1070
|
+
lenreps[m] := lenreps[m] + 1;
|
|
1071
|
+
ind := lenreps[m];
|
|
1072
|
+
lambdarhoht[l][m] := ind; # this can't have been seen before
|
|
1073
|
+
reps[m][ind] := [y];
|
|
1074
|
+
repslookup[m][ind] := [nr_r];
|
|
1075
|
+
repslens[m][ind] := 1;
|
|
1076
|
+
orblookup1[nr_r] := ind;
|
|
1077
|
+
orblookup2[nr_r] := 1;
|
|
1078
|
+
rholookup[nr_r] := l;
|
|
1079
|
+
datalookup[nr_r] := nr_d;
|
|
1080
|
+
|
|
1081
|
+
if looking then
|
|
1082
|
+
# did we find it?
|
|
1083
|
+
if lookfunc(data, orb[nr_r]) then
|
|
1084
|
+
data!.found := nr_r;
|
|
1085
|
+
fi;
|
|
1086
|
+
fi;
|
|
1087
|
+
|
|
1088
|
+
od;
|
|
1089
|
+
log[nr_d + 1] := nr_r;
|
|
1090
|
+
end;
|
|
1091
|
+
#############################################################################
|
|
1092
|
+
|
|
1093
|
+
# initialise the data if necessary
|
|
1094
|
+
if data!.init = false then
|
|
1095
|
+
# add the generators of the ideal...
|
|
1096
|
+
idealgens := List(GeneratorsOfSemigroupIdeal(I),
|
|
1097
|
+
x -> ConvertToInternalElement(I, x));
|
|
1098
|
+
for i in [1 .. Length(idealgens)] do
|
|
1099
|
+
UpdateSemigroupIdealData(idealgens[i], fail, fail, i);
|
|
1100
|
+
od;
|
|
1101
|
+
|
|
1102
|
+
data!.init := true;
|
|
1103
|
+
data!.genspos := nr_d + 1;
|
|
1104
|
+
fi;
|
|
1105
|
+
|
|
1106
|
+
i := data!.pos; # points in orb in position at most i have descendants
|
|
1107
|
+
|
|
1108
|
+
while nr_d <= limit and i < nr_d and i <> stopper do
|
|
1109
|
+
i := i + 1; # advance in the dorb
|
|
1110
|
+
poset[i] := [];
|
|
1111
|
+
x := Representative(d[i]);
|
|
1112
|
+
|
|
1113
|
+
# left multiply the R-class reps by the generators of the semigroup
|
|
1114
|
+
rreps := [];
|
|
1115
|
+
pos := Position(lambdao, lambda(x));
|
|
1116
|
+
for j in [log[i] + 1 .. log[i + 1]] do # the R-class reps of d[i]
|
|
1117
|
+
rreps[j - log[i]] := orb[j][4];
|
|
1118
|
+
for k in genstoapply do
|
|
1119
|
+
UpdateSemigroupIdealData(gens[k] * orb[j][4], pos, k, fail);
|
|
1120
|
+
if (looking and data!.found <> false)
|
|
1121
|
+
or (lambdalooking and lambdao!.found <> false)
|
|
1122
|
+
or (rholooking and rhoo!.found <> false) then
|
|
1123
|
+
data!.pos := i - 1;
|
|
1124
|
+
return data;
|
|
1125
|
+
fi;
|
|
1126
|
+
od;
|
|
1127
|
+
od;
|
|
1128
|
+
SetRClassReps(d[i], rreps);
|
|
1129
|
+
|
|
1130
|
+
# right multiply the L-class reps by the generators of the semigroup
|
|
1131
|
+
pos := Position(rhoo, rho(x));
|
|
1132
|
+
for z in LClassReps(d[i]) do
|
|
1133
|
+
for k in genstoapply do
|
|
1134
|
+
UpdateSemigroupIdealData(z * gens[k], pos, k, fail);
|
|
1135
|
+
if (looking and data!.found <> false)
|
|
1136
|
+
or (lambdalooking and lambdao!.found <> false)
|
|
1137
|
+
or (rholooking and rhoo!.found <> false) then
|
|
1138
|
+
data!.pos := i - 1;
|
|
1139
|
+
return data;
|
|
1140
|
+
fi;
|
|
1141
|
+
od;
|
|
1142
|
+
od;
|
|
1143
|
+
od;
|
|
1144
|
+
|
|
1145
|
+
# for the data-orbit
|
|
1146
|
+
data!.pos := i;
|
|
1147
|
+
|
|
1148
|
+
if nr_d = i then
|
|
1149
|
+
SetFilterObj(lambdao, IsClosedOrbit);
|
|
1150
|
+
SetFilterObj(rhoo, IsClosedOrbit);
|
|
1151
|
+
SetFilterObj(data, IsClosedData);
|
|
1152
|
+
fi;
|
|
1153
|
+
|
|
1154
|
+
return data;
|
|
1155
|
+
end);
|