passagemath-gap-pkg-semigroups 10.6.30__cp312-abi3-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.abi3.so +0 -0
|
@@ -0,0 +1,945 @@
|
|
|
1
|
+
###########################################################################
|
|
2
|
+
##
|
|
3
|
+
## libsemigroups/froidure-pin.gi
|
|
4
|
+
## Copyright (C) 2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
###########################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
# We have the following loop instead of IsMatrixOverSemiringSemigroup because
|
|
12
|
+
# semigroups of matrices over a finite field below to
|
|
13
|
+
# IsMatrixOverSemiringSemigroup, but cannot compute LibsemigroupsFroidurePin
|
|
14
|
+
|
|
15
|
+
InstallTrueMethod(CanUseFroidurePin, CanUseLibsemigroupsFroidurePin);
|
|
16
|
+
|
|
17
|
+
for x in [IsFpSemigroup,
|
|
18
|
+
IsFpMonoid,
|
|
19
|
+
IsTransformationSemigroup,
|
|
20
|
+
IsBooleanMatSemigroup,
|
|
21
|
+
IsIntegerMatrixSemigroup,
|
|
22
|
+
IsIntegerMatrixMonoid,
|
|
23
|
+
IsMaxPlusMatrixSemigroup,
|
|
24
|
+
IsMinPlusMatrixSemigroup,
|
|
25
|
+
IsTropicalMinPlusMatrixSemigroup,
|
|
26
|
+
IsTropicalMaxPlusMatrixSemigroup,
|
|
27
|
+
IsNTPMatrixSemigroup,
|
|
28
|
+
IsProjectiveMaxPlusMatrixSemigroup,
|
|
29
|
+
IsBipartitionSemigroup,
|
|
30
|
+
IsPBRSemigroup,
|
|
31
|
+
IsTransformationSemigroup,
|
|
32
|
+
IsPartialPermSemigroup] do
|
|
33
|
+
InstallTrueMethod(CanUseLibsemigroupsFroidurePin,
|
|
34
|
+
x and HasGeneratorsOfSemigroup);
|
|
35
|
+
InstallTrueMethod(CanUseLibsemigroupsFroidurePin,
|
|
36
|
+
x and IsSemigroupIdeal);
|
|
37
|
+
od;
|
|
38
|
+
|
|
39
|
+
InstallMethod(CanUseLibsemigroupsFroidurePin, "for a semigroup", [IsSemigroup],
|
|
40
|
+
ReturnFalse);
|
|
41
|
+
|
|
42
|
+
InstallImmediateMethod(CanUseLibsemigroupsFroidurePin,
|
|
43
|
+
IsQuotientSemigroup and HasQuotientSemigroupCongruence, 0,
|
|
44
|
+
Q -> CanUseLibsemigroupsCongruence(QuotientSemigroupCongruence(Q)));
|
|
45
|
+
|
|
46
|
+
###########################################################################
|
|
47
|
+
## Function for getting the correct record from the `libsemigroups` record.
|
|
48
|
+
###########################################################################
|
|
49
|
+
|
|
50
|
+
DeclareOperation("FroidurePinMemFnRec", [IsSemigroup]);
|
|
51
|
+
DeclareOperation("FroidurePinMemFnRec",
|
|
52
|
+
[IsSemigroup, IsListOrCollection]);
|
|
53
|
+
|
|
54
|
+
InstallMethod(FroidurePinMemFnRec, "for a semigroup",
|
|
55
|
+
[IsSemigroup], S -> FroidurePinMemFnRec(S, []));
|
|
56
|
+
|
|
57
|
+
InstallMethod(FroidurePinMemFnRec, "for a semigroup",
|
|
58
|
+
[IsSemigroup, IsListOrCollection], {S, coll} -> FroidurePinMemFnRec(S));
|
|
59
|
+
|
|
60
|
+
InstallMethod(FroidurePinMemFnRec,
|
|
61
|
+
"for a transformation semigroup and list or coll.",
|
|
62
|
+
[IsTransformationSemigroup, IsListOrCollection],
|
|
63
|
+
function(S, coll)
|
|
64
|
+
local N;
|
|
65
|
+
N := DegreeOfTransformationSemigroup(S);
|
|
66
|
+
if IsTransformationCollection(coll) then
|
|
67
|
+
N := Maximum(N, DegreeOfTransformationCollection(coll));
|
|
68
|
+
elif not IsEmpty(coll) then
|
|
69
|
+
Error("Expected a transf. coll. or empty list, found ",
|
|
70
|
+
TNAM_OBJ(coll));
|
|
71
|
+
fi;
|
|
72
|
+
if N <= 16
|
|
73
|
+
and IsBound(LIBSEMIGROUPS_HPCOMBI_ENABLED) then
|
|
74
|
+
return libsemigroups.FroidurePinTransf16;
|
|
75
|
+
elif N <= 2 ^ 16 then
|
|
76
|
+
return libsemigroups.FroidurePinTransfUInt2;
|
|
77
|
+
elif N <= 2 ^ 32 then
|
|
78
|
+
return libsemigroups.FroidurePinTransfUInt4;
|
|
79
|
+
else
|
|
80
|
+
# Cannot currently test the next line
|
|
81
|
+
Error("transformation degree is too high!");
|
|
82
|
+
fi;
|
|
83
|
+
end);
|
|
84
|
+
|
|
85
|
+
InstallMethod(FroidurePinMemFnRec,
|
|
86
|
+
"for a partial perm. semigroup and list or coll.",
|
|
87
|
+
[IsPartialPermSemigroup, IsListOrCollection],
|
|
88
|
+
function(S, coll)
|
|
89
|
+
local N;
|
|
90
|
+
N := Maximum(DegreeOfPartialPermSemigroup(S),
|
|
91
|
+
CodegreeOfPartialPermSemigroup(S));
|
|
92
|
+
if IsPartialPermCollection(coll) then
|
|
93
|
+
N := Maximum(N,
|
|
94
|
+
DegreeOfPartialPermCollection(coll),
|
|
95
|
+
CodegreeOfPartialPermCollection(coll));
|
|
96
|
+
elif not IsEmpty(coll) then
|
|
97
|
+
Error("Expected a partial perm. coll. or empty list, found ",
|
|
98
|
+
TNAM_OBJ(coll));
|
|
99
|
+
fi;
|
|
100
|
+
if N <= 16 and IsBound(LIBSEMIGROUPS_HPCOMBI_ENABLED) then
|
|
101
|
+
return libsemigroups.FroidurePinPPerm16;
|
|
102
|
+
elif N <= 2 ^ 16 then
|
|
103
|
+
return libsemigroups.FroidurePinPPermUInt2;
|
|
104
|
+
elif N <= 2 ^ 32 then
|
|
105
|
+
return libsemigroups.FroidurePinPPermUInt4;
|
|
106
|
+
else
|
|
107
|
+
# Cannot currently test the next line
|
|
108
|
+
Error("partial perm degree is too high!");
|
|
109
|
+
fi;
|
|
110
|
+
end);
|
|
111
|
+
|
|
112
|
+
InstallMethod(FroidurePinMemFnRec, "for a boolean matrix semigroup",
|
|
113
|
+
[IsBooleanMatSemigroup],
|
|
114
|
+
function(S)
|
|
115
|
+
local N;
|
|
116
|
+
N := DimensionOfMatrixOverSemiring(Representative(S));
|
|
117
|
+
if N <= 8 then
|
|
118
|
+
return libsemigroups.FroidurePinBMat8;
|
|
119
|
+
else
|
|
120
|
+
return libsemigroups.FroidurePinBMat;
|
|
121
|
+
fi;
|
|
122
|
+
end);
|
|
123
|
+
|
|
124
|
+
InstallMethod(FroidurePinMemFnRec, "for a bipartition semigroup",
|
|
125
|
+
[IsBipartitionSemigroup], S -> libsemigroups.FroidurePinBipart);
|
|
126
|
+
|
|
127
|
+
InstallMethod(FroidurePinMemFnRec, "for an integer matrix semigroup",
|
|
128
|
+
[IsIntegerMatrixSemigroup], S -> libsemigroups.FroidurePinIntMat);
|
|
129
|
+
|
|
130
|
+
InstallMethod(FroidurePinMemFnRec, "for an integer matrix monoid",
|
|
131
|
+
[IsIntegerMatrixMonoid], S -> libsemigroups.FroidurePinIntMat);
|
|
132
|
+
|
|
133
|
+
InstallMethod(FroidurePinMemFnRec, "for an max-plus matrix semigroup",
|
|
134
|
+
[IsMaxPlusMatrixSemigroup], S -> libsemigroups.FroidurePinMaxPlusMat);
|
|
135
|
+
|
|
136
|
+
InstallMethod(FroidurePinMemFnRec, "for an min-plus matrix semigroup",
|
|
137
|
+
[IsMinPlusMatrixSemigroup], S -> libsemigroups.FroidurePinMinPlusMat);
|
|
138
|
+
|
|
139
|
+
InstallMethod(FroidurePinMemFnRec, "for a tropical max-plus matrix semigroup",
|
|
140
|
+
[IsTropicalMaxPlusMatrixSemigroup],
|
|
141
|
+
S -> libsemigroups.FroidurePinMaxPlusTruncMat);
|
|
142
|
+
|
|
143
|
+
InstallMethod(FroidurePinMemFnRec, "for a tropical min-plus matrix semigroup",
|
|
144
|
+
[IsTropicalMinPlusMatrixSemigroup],
|
|
145
|
+
S -> libsemigroups.FroidurePinMinPlusTruncMat);
|
|
146
|
+
|
|
147
|
+
InstallMethod(FroidurePinMemFnRec, "for an ntp matrix semigroup",
|
|
148
|
+
[IsNTPMatrixSemigroup], S -> libsemigroups.FroidurePinNTPMat);
|
|
149
|
+
|
|
150
|
+
InstallMethod(FroidurePinMemFnRec,
|
|
151
|
+
"for a projective max-plus matrix semigroup",
|
|
152
|
+
[IsProjectiveMaxPlusMatrixSemigroup],
|
|
153
|
+
S -> libsemigroups.FroidurePinProjMaxPlusMat);
|
|
154
|
+
|
|
155
|
+
InstallMethod(FroidurePinMemFnRec, "for a pbr semigroup",
|
|
156
|
+
[IsPBRSemigroup], S -> libsemigroups.FroidurePinPBR);
|
|
157
|
+
|
|
158
|
+
InstallMethod(FroidurePinMemFnRec, "for an fp semigroup",
|
|
159
|
+
[IsFpSemigroup], S -> libsemigroups.FroidurePinBase);
|
|
160
|
+
|
|
161
|
+
InstallMethod(FroidurePinMemFnRec, "for an fp monoid",
|
|
162
|
+
[IsFpMonoid], S -> libsemigroups.FroidurePinBase);
|
|
163
|
+
|
|
164
|
+
InstallMethod(FroidurePinMemFnRec, "for quotient semigroup",
|
|
165
|
+
[IsQuotientSemigroup], S -> libsemigroups.FroidurePinBase);
|
|
166
|
+
|
|
167
|
+
BindGlobal("_GetElement",
|
|
168
|
+
function(coll, x)
|
|
169
|
+
Assert(1, IsMultiplicativeElementCollection(coll) or IsMatrixObj(x));
|
|
170
|
+
Assert(1, IsMultiplicativeElement(x) or IsMatrixObj(x));
|
|
171
|
+
if IsPartialPermCollection(coll) then
|
|
172
|
+
return [x, Maximum(DegreeOfPartialPermCollection(coll),
|
|
173
|
+
CodegreeOfPartialPermCollection(coll))];
|
|
174
|
+
elif IsTransformationCollection(coll) then
|
|
175
|
+
return [x, DegreeOfTransformationCollection(coll)];
|
|
176
|
+
elif IsElementOfFpSemigroupCollection(coll) then
|
|
177
|
+
return SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x)) - 1;
|
|
178
|
+
elif IsElementOfFpMonoidCollection(coll) then
|
|
179
|
+
if IsOne(x) then
|
|
180
|
+
return [0];
|
|
181
|
+
fi;
|
|
182
|
+
return SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x));
|
|
183
|
+
fi;
|
|
184
|
+
return x;
|
|
185
|
+
end);
|
|
186
|
+
|
|
187
|
+
###########################################################################
|
|
188
|
+
## Constructor - constructs a libsemigroups LibsemigroupsFroidurePin object, #
|
|
189
|
+
## and adds the generators of the semigroup to that.
|
|
190
|
+
###########################################################################
|
|
191
|
+
|
|
192
|
+
InstallMethod(HasLibsemigroupsFroidurePin,
|
|
193
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
194
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
195
|
+
function(S)
|
|
196
|
+
return IsBound(S!.LibsemigroupsFroidurePin)
|
|
197
|
+
and IsValidGapbind14Object(S!.LibsemigroupsFroidurePin);
|
|
198
|
+
end);
|
|
199
|
+
|
|
200
|
+
InstallMethod(HasLibsemigroupsFroidurePin,
|
|
201
|
+
"for a semigroup",
|
|
202
|
+
[IsSemigroup],
|
|
203
|
+
ReturnFalse);
|
|
204
|
+
|
|
205
|
+
InstallGlobalFunction(LibsemigroupsFroidurePin,
|
|
206
|
+
function(S)
|
|
207
|
+
local C, record, T, add_generator, coll, x;
|
|
208
|
+
Assert(1, IsSemigroup(S));
|
|
209
|
+
Assert(1, CanUseLibsemigroupsFroidurePin(S));
|
|
210
|
+
if HasLibsemigroupsFroidurePin(S) then
|
|
211
|
+
return S!.LibsemigroupsFroidurePin;
|
|
212
|
+
elif IsFpSemigroup(S) or IsFpMonoid(S) then
|
|
213
|
+
C := LibsemigroupsCongruence(UnderlyingCongruence(S));
|
|
214
|
+
return libsemigroups.Congruence.quotient_froidure_pin(C);
|
|
215
|
+
elif IsQuotientSemigroup(S) then
|
|
216
|
+
C := QuotientSemigroupCongruence(S);
|
|
217
|
+
if not HasGeneratingPairsOfMagmaCongruence(C) then
|
|
218
|
+
GeneratingPairsOfMagmaCongruence(C);
|
|
219
|
+
fi;
|
|
220
|
+
C := LibsemigroupsCongruence(C);
|
|
221
|
+
return libsemigroups.Congruence.quotient_froidure_pin(C);
|
|
222
|
+
fi;
|
|
223
|
+
Unbind(S!.LibsemigroupsFroidurePin);
|
|
224
|
+
record := FroidurePinMemFnRec(S);
|
|
225
|
+
T := record.make();
|
|
226
|
+
add_generator := record.add_generator;
|
|
227
|
+
coll := GeneratorsOfSemigroup(S);
|
|
228
|
+
for x in coll do
|
|
229
|
+
add_generator(T, _GetElement(coll, x));
|
|
230
|
+
od;
|
|
231
|
+
S!.LibsemigroupsFroidurePin := T;
|
|
232
|
+
return T;
|
|
233
|
+
end);
|
|
234
|
+
|
|
235
|
+
###########################################################################
|
|
236
|
+
## Size/IsFinite
|
|
237
|
+
###########################################################################
|
|
238
|
+
|
|
239
|
+
InstallMethod(Size, "for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
240
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
241
|
+
function(S)
|
|
242
|
+
if not IsFinite(S) then
|
|
243
|
+
return infinity;
|
|
244
|
+
fi;
|
|
245
|
+
return FroidurePinMemFnRec(S).size(LibsemigroupsFroidurePin(S));
|
|
246
|
+
end);
|
|
247
|
+
|
|
248
|
+
InstallMethod(IsFinite, "for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
249
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
250
|
+
function(S)
|
|
251
|
+
if IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
252
|
+
TryNextMethod();
|
|
253
|
+
fi;
|
|
254
|
+
return FroidurePinMemFnRec(S).size(LibsemigroupsFroidurePin(S)) < infinity;
|
|
255
|
+
end);
|
|
256
|
+
|
|
257
|
+
###########################################################################
|
|
258
|
+
## AsSet/AsList etc
|
|
259
|
+
###########################################################################
|
|
260
|
+
|
|
261
|
+
InstallMethod(AsSet, "for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
262
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
263
|
+
function(S)
|
|
264
|
+
local result, sorted_at, T, i;
|
|
265
|
+
if not IsFinite(S) then
|
|
266
|
+
Error("the argument (a semigroup) is not finite");
|
|
267
|
+
elif IsPartialPermSemigroup(S) or IsFpSemigroup(S) or IsFpMonoid(S)
|
|
268
|
+
or IsQuotientSemigroup(S) then
|
|
269
|
+
# Special case required because < for libsemigroups PartialPerms and < for
|
|
270
|
+
# GAP partial perms are different; and also for IsFpSemigroup and
|
|
271
|
+
# IsFpMonoid and IsQuotientSemigroup because there's no sorted_at
|
|
272
|
+
return AsSet(AsList(S));
|
|
273
|
+
fi;
|
|
274
|
+
result := EmptyPlist(Size(S));
|
|
275
|
+
sorted_at := FroidurePinMemFnRec(S).sorted_at;
|
|
276
|
+
T := LibsemigroupsFroidurePin(S);
|
|
277
|
+
for i in [1 .. Size(S)] do
|
|
278
|
+
result[i] := sorted_at(T, i - 1);
|
|
279
|
+
od;
|
|
280
|
+
SetIsSSortedList(result, true);
|
|
281
|
+
return result;
|
|
282
|
+
end);
|
|
283
|
+
|
|
284
|
+
InstallMethod(AsListCanonical,
|
|
285
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
286
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
287
|
+
function(S)
|
|
288
|
+
local result, at, T, i;
|
|
289
|
+
if not IsFinite(S) then
|
|
290
|
+
Error("the argument (a semigroup) is not finite");
|
|
291
|
+
elif IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
292
|
+
at := {T, i} -> EvaluateWord(GeneratorsOfSemigroup(S),
|
|
293
|
+
FroidurePinMemFnRec(S).factorisation(T, i) + 1);
|
|
294
|
+
else
|
|
295
|
+
at := FroidurePinMemFnRec(S).at;
|
|
296
|
+
fi;
|
|
297
|
+
result := EmptyPlist(Size(S));
|
|
298
|
+
T := LibsemigroupsFroidurePin(S);
|
|
299
|
+
for i in [1 .. Size(S)] do
|
|
300
|
+
result[i] := at(T, i - 1);
|
|
301
|
+
od;
|
|
302
|
+
return result;
|
|
303
|
+
end);
|
|
304
|
+
|
|
305
|
+
InstallMethod(AsList,
|
|
306
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
307
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin], AsListCanonical);
|
|
308
|
+
|
|
309
|
+
###########################################################################
|
|
310
|
+
## Position etc
|
|
311
|
+
###########################################################################
|
|
312
|
+
|
|
313
|
+
InstallMethod(PositionCanonical,
|
|
314
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
315
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
316
|
+
function(S, x)
|
|
317
|
+
local T, record, word, pos, C;
|
|
318
|
+
|
|
319
|
+
if IsPartialPermSemigroup(S) then
|
|
320
|
+
if DegreeOfPartialPermSemigroup(S) < DegreeOfPartialPerm(x)
|
|
321
|
+
or CodegreeOfPartialPermSemigroup(S) < CodegreeOfPartialPerm(x) then
|
|
322
|
+
return fail;
|
|
323
|
+
fi;
|
|
324
|
+
elif IsTransformationSemigroup(S) then
|
|
325
|
+
if DegreeOfTransformationSemigroup(S) < DegreeOfTransformation(x) then
|
|
326
|
+
return fail;
|
|
327
|
+
fi;
|
|
328
|
+
elif IsFpSemigroup(S) or IsFpMonoid(S) then
|
|
329
|
+
if not x in S then
|
|
330
|
+
return fail;
|
|
331
|
+
fi;
|
|
332
|
+
T := LibsemigroupsFroidurePin(S);
|
|
333
|
+
record := FroidurePinMemFnRec(S);
|
|
334
|
+
word := _GetElement(S, x);
|
|
335
|
+
pos := record.current_position(T, word);
|
|
336
|
+
while pos < 0 do
|
|
337
|
+
record.enumerate(T, record.current_size(T) + 1);
|
|
338
|
+
pos := record.current_position(T, word);
|
|
339
|
+
od;
|
|
340
|
+
return pos + 1;
|
|
341
|
+
elif IsQuotientSemigroup(S) then
|
|
342
|
+
T := QuotientSemigroupPreimage(S);
|
|
343
|
+
C := QuotientSemigroupCongruence(S);
|
|
344
|
+
return CongruenceWordToClassIndex(C, Factorization(T, Representative(x)));
|
|
345
|
+
fi;
|
|
346
|
+
pos := FroidurePinMemFnRec(S).position(LibsemigroupsFroidurePin(S),
|
|
347
|
+
_GetElement(S, x));
|
|
348
|
+
if pos < 0 then
|
|
349
|
+
return fail;
|
|
350
|
+
fi;
|
|
351
|
+
return pos + 1;
|
|
352
|
+
end);
|
|
353
|
+
|
|
354
|
+
InstallMethod(Position,
|
|
355
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin, mult. element, and zero",
|
|
356
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin,
|
|
357
|
+
IsMultiplicativeElement,
|
|
358
|
+
IsZeroCyc],
|
|
359
|
+
PositionOp);
|
|
360
|
+
|
|
361
|
+
InstallMethod(PositionOp,
|
|
362
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin, mult. element, and zero",
|
|
363
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin,
|
|
364
|
+
IsMultiplicativeElement,
|
|
365
|
+
IsZeroCyc],
|
|
366
|
+
function(S, x, _)
|
|
367
|
+
local pos;
|
|
368
|
+
if IsPartialPermSemigroup(S) then
|
|
369
|
+
if DegreeOfPartialPermSemigroup(S) < DegreeOfPartialPerm(x)
|
|
370
|
+
or CodegreeOfPartialPermSemigroup(S) < CodegreeOfPartialPerm(x) then
|
|
371
|
+
return fail;
|
|
372
|
+
fi;
|
|
373
|
+
elif IsTransformationSemigroup(S) then
|
|
374
|
+
if DegreeOfTransformationSemigroup(S) < DegreeOfTransformation(x) then
|
|
375
|
+
return fail;
|
|
376
|
+
fi;
|
|
377
|
+
fi;
|
|
378
|
+
|
|
379
|
+
pos := FroidurePinMemFnRec(S).current_position(LibsemigroupsFroidurePin(S),
|
|
380
|
+
_GetElement(S, x));
|
|
381
|
+
if pos < 0 then
|
|
382
|
+
return fail;
|
|
383
|
+
else
|
|
384
|
+
return pos + 1;
|
|
385
|
+
fi;
|
|
386
|
+
end);
|
|
387
|
+
|
|
388
|
+
InstallMethod(PositionSortedOp,
|
|
389
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
390
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
391
|
+
function(S, x)
|
|
392
|
+
local pos;
|
|
393
|
+
if not IsFinite(S) then
|
|
394
|
+
Error("the 1st argument (a semigroup) is not finite");
|
|
395
|
+
elif IsPartialPermSemigroup(S) then
|
|
396
|
+
if DegreeOfPartialPermSemigroup(S) < DegreeOfPartialPerm(x)
|
|
397
|
+
or CodegreeOfPartialPermSemigroup(S) < CodegreeOfPartialPerm(x) then
|
|
398
|
+
return fail;
|
|
399
|
+
fi;
|
|
400
|
+
# Special case required because < for libsemigroups PartialPerms and < for
|
|
401
|
+
# GAP partial perms are different.
|
|
402
|
+
return Position(AsSet(S), x);
|
|
403
|
+
elif IsTransformationSemigroup(S) then
|
|
404
|
+
if DegreeOfTransformationSemigroup(S) < DegreeOfTransformation(x) then
|
|
405
|
+
return fail;
|
|
406
|
+
fi;
|
|
407
|
+
fi;
|
|
408
|
+
pos := FroidurePinMemFnRec(S).sorted_position(LibsemigroupsFroidurePin(S),
|
|
409
|
+
_GetElement(S, x));
|
|
410
|
+
if pos < 0 then
|
|
411
|
+
return fail;
|
|
412
|
+
else
|
|
413
|
+
return pos + 1;
|
|
414
|
+
fi;
|
|
415
|
+
end);
|
|
416
|
+
|
|
417
|
+
###########################################################################
|
|
418
|
+
## Membership
|
|
419
|
+
###########################################################################
|
|
420
|
+
|
|
421
|
+
InstallMethod(\in,
|
|
422
|
+
"for mult. element and a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
423
|
+
[IsMultiplicativeElement, IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
424
|
+
{x, S} -> PositionCanonical(S, x) <> fail);
|
|
425
|
+
|
|
426
|
+
###########################################################################
|
|
427
|
+
## NrIdempotents
|
|
428
|
+
###########################################################################
|
|
429
|
+
|
|
430
|
+
InstallMethod(NrIdempotents,
|
|
431
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
432
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
433
|
+
function(S)
|
|
434
|
+
local F;
|
|
435
|
+
if not IsFinite(S) then
|
|
436
|
+
Error("the argument (a semigroup) is not finite");
|
|
437
|
+
elif IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
438
|
+
return Length(IdempotentsSubset(S, [1 .. Size(S)]));
|
|
439
|
+
fi;
|
|
440
|
+
F := LibsemigroupsFroidurePin(S);
|
|
441
|
+
return FroidurePinMemFnRec(S).number_of_idempotents(F);
|
|
442
|
+
end);
|
|
443
|
+
|
|
444
|
+
InstallMethod(Idempotents,
|
|
445
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
446
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
447
|
+
function(S)
|
|
448
|
+
if not IsFinite(S) then
|
|
449
|
+
Error("the argument (a semigroup) is not finite");
|
|
450
|
+
fi;
|
|
451
|
+
return FroidurePinMemFnRec(S).idempotents(LibsemigroupsFroidurePin(S));
|
|
452
|
+
end);
|
|
453
|
+
|
|
454
|
+
###########################################################################
|
|
455
|
+
## MinimalFactorization
|
|
456
|
+
###########################################################################
|
|
457
|
+
|
|
458
|
+
InstallMethod(MinimalFactorization,
|
|
459
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
460
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
461
|
+
function(S, i)
|
|
462
|
+
local F;
|
|
463
|
+
F := LibsemigroupsFroidurePin(S);
|
|
464
|
+
return FroidurePinMemFnRec(S).factorisation(F, i - 1) + 1;
|
|
465
|
+
end);
|
|
466
|
+
|
|
467
|
+
InstallMethod(MinimalFactorization,
|
|
468
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
469
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
470
|
+
function(S, x)
|
|
471
|
+
if not x in S then
|
|
472
|
+
Error("the 2nd argument (a mult. elt.) must belong to the ",
|
|
473
|
+
"1st argument (a semigroup)");
|
|
474
|
+
fi;
|
|
475
|
+
return MinimalFactorization(S, PositionCanonical(S, x));
|
|
476
|
+
end);
|
|
477
|
+
|
|
478
|
+
InstallMethod(Factorization,
|
|
479
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
480
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
481
|
+
MinimalFactorization);
|
|
482
|
+
|
|
483
|
+
InstallMethod(Factorization,
|
|
484
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
485
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
486
|
+
MinimalFactorization);
|
|
487
|
+
|
|
488
|
+
###########################################################################
|
|
489
|
+
## Prefixes, Suffixes, etc.
|
|
490
|
+
###########################################################################
|
|
491
|
+
|
|
492
|
+
InstallMethod(FirstLetter,
|
|
493
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
494
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
495
|
+
function(S, i)
|
|
496
|
+
local F;
|
|
497
|
+
F := LibsemigroupsFroidurePin(S);
|
|
498
|
+
return FroidurePinMemFnRec(S).first_letter(F, i - 1) + 1;
|
|
499
|
+
end);
|
|
500
|
+
|
|
501
|
+
InstallMethod(FirstLetter,
|
|
502
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
503
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
504
|
+
function(S, x)
|
|
505
|
+
if not x in S then
|
|
506
|
+
Error("the 2nd argument (a mult. elt.) must belong to the ",
|
|
507
|
+
"1st argument (a semigroup)");
|
|
508
|
+
fi;
|
|
509
|
+
return FirstLetter(S, PositionCanonical(S, x));
|
|
510
|
+
end);
|
|
511
|
+
|
|
512
|
+
InstallMethod(FinalLetter,
|
|
513
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
514
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
515
|
+
function(S, i)
|
|
516
|
+
local F;
|
|
517
|
+
F := LibsemigroupsFroidurePin(S);
|
|
518
|
+
return FroidurePinMemFnRec(S).final_letter(F, i - 1) + 1;
|
|
519
|
+
end);
|
|
520
|
+
|
|
521
|
+
InstallMethod(FinalLetter,
|
|
522
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
523
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
524
|
+
function(S, x)
|
|
525
|
+
if not x in S then
|
|
526
|
+
Error("the 2nd argument (a mult. elt.) must belong to the ",
|
|
527
|
+
"1st argument (a semigroup)");
|
|
528
|
+
fi;
|
|
529
|
+
return FinalLetter(S, PositionCanonical(S, x));
|
|
530
|
+
end);
|
|
531
|
+
|
|
532
|
+
InstallMethod(Prefix,
|
|
533
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
534
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
535
|
+
function(S, i)
|
|
536
|
+
local F;
|
|
537
|
+
F := LibsemigroupsFroidurePin(S);
|
|
538
|
+
return FroidurePinMemFnRec(S).prefix(F, i - 1) + 1;
|
|
539
|
+
end);
|
|
540
|
+
|
|
541
|
+
InstallMethod(Prefix,
|
|
542
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
543
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
544
|
+
function(S, x)
|
|
545
|
+
if not x in S then
|
|
546
|
+
Error("the 2nd argument (a mult. elt.) must belong to the ",
|
|
547
|
+
"1st argument (a semigroup)");
|
|
548
|
+
fi;
|
|
549
|
+
return Prefix(S, PositionCanonical(S, x));
|
|
550
|
+
end);
|
|
551
|
+
|
|
552
|
+
InstallMethod(Suffix,
|
|
553
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos. int",
|
|
554
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsPosInt],
|
|
555
|
+
function(S, i)
|
|
556
|
+
local F;
|
|
557
|
+
F := LibsemigroupsFroidurePin(S);
|
|
558
|
+
return FroidurePinMemFnRec(S).suffix(F, i - 1) + 1;
|
|
559
|
+
end);
|
|
560
|
+
|
|
561
|
+
InstallMethod(Suffix,
|
|
562
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and mult. element",
|
|
563
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsMultiplicativeElement],
|
|
564
|
+
function(S, x)
|
|
565
|
+
if not x in S then
|
|
566
|
+
Error("the 2nd argument (a mult. elt.) must belong to the ",
|
|
567
|
+
"1st argument (a semigroup)");
|
|
568
|
+
fi;
|
|
569
|
+
return Suffix(S, PositionCanonical(S, x));
|
|
570
|
+
end);
|
|
571
|
+
|
|
572
|
+
###########################################################################
|
|
573
|
+
## Enumerate
|
|
574
|
+
###########################################################################
|
|
575
|
+
|
|
576
|
+
InstallMethod(Enumerate,
|
|
577
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and pos int",
|
|
578
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsInt],
|
|
579
|
+
function(S, n)
|
|
580
|
+
FroidurePinMemFnRec(S).enumerate(LibsemigroupsFroidurePin(S), n);
|
|
581
|
+
return S;
|
|
582
|
+
end);
|
|
583
|
+
|
|
584
|
+
InstallMethod(Enumerate,
|
|
585
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
586
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
587
|
+
function(S)
|
|
588
|
+
FroidurePinMemFnRec(S).enumerate(LibsemigroupsFroidurePin(S), -1);
|
|
589
|
+
return S;
|
|
590
|
+
end);
|
|
591
|
+
|
|
592
|
+
InstallMethod(IsEnumerated,
|
|
593
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
594
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
595
|
+
S -> FroidurePinMemFnRec(S).finished(LibsemigroupsFroidurePin(S)));
|
|
596
|
+
|
|
597
|
+
###########################################################################
|
|
598
|
+
## Cayley graphs etc
|
|
599
|
+
###########################################################################
|
|
600
|
+
|
|
601
|
+
InstallMethod(LeftCayleyGraphSemigroup,
|
|
602
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
603
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
604
|
+
function(S)
|
|
605
|
+
local F;
|
|
606
|
+
if not IsFinite(S) then
|
|
607
|
+
Error("the argument (a semigroup) is not finite");
|
|
608
|
+
fi;
|
|
609
|
+
F := LibsemigroupsFroidurePin(S);
|
|
610
|
+
return FroidurePinMemFnRec(S).left_cayley_graph(F) + 1;
|
|
611
|
+
end);
|
|
612
|
+
|
|
613
|
+
InstallMethod(LeftCayleyDigraph,
|
|
614
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
615
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
616
|
+
function(S)
|
|
617
|
+
local D;
|
|
618
|
+
if not IsFinite(S) then
|
|
619
|
+
Error("the argument (a semigroup) is not finite");
|
|
620
|
+
fi;
|
|
621
|
+
D := DigraphNC(LeftCayleyGraphSemigroup(S));
|
|
622
|
+
SetFilterObj(D, IsCayleyDigraph);
|
|
623
|
+
SetSemigroupOfCayleyDigraph(D, S);
|
|
624
|
+
SetGeneratorsOfCayleyDigraph(D, GeneratorsOfSemigroup(S));
|
|
625
|
+
return D;
|
|
626
|
+
end);
|
|
627
|
+
|
|
628
|
+
InstallMethod(RightCayleyGraphSemigroup,
|
|
629
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
630
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
631
|
+
function(S)
|
|
632
|
+
local F;
|
|
633
|
+
if not IsFinite(S) then
|
|
634
|
+
Error("the argument (a semigroup) is not finite");
|
|
635
|
+
fi;
|
|
636
|
+
F := LibsemigroupsFroidurePin(S);
|
|
637
|
+
return FroidurePinMemFnRec(S).right_cayley_graph(F) + 1;
|
|
638
|
+
end);
|
|
639
|
+
|
|
640
|
+
InstallMethod(RightCayleyDigraph,
|
|
641
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
642
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
643
|
+
function(S)
|
|
644
|
+
local D;
|
|
645
|
+
if not IsFinite(S) then
|
|
646
|
+
Error("the argument (a semigroup) is not finite");
|
|
647
|
+
fi;
|
|
648
|
+
D := DigraphNC(RightCayleyGraphSemigroup(S));
|
|
649
|
+
SetFilterObj(D, IsCayleyDigraph);
|
|
650
|
+
SetSemigroupOfCayleyDigraph(D, S);
|
|
651
|
+
SetGeneratorsOfCayleyDigraph(D, GeneratorsOfSemigroup(S));
|
|
652
|
+
return D;
|
|
653
|
+
end);
|
|
654
|
+
|
|
655
|
+
########################################################################
|
|
656
|
+
## Enumerators
|
|
657
|
+
########################################################################
|
|
658
|
+
|
|
659
|
+
InstallMethod(EnumeratorSorted,
|
|
660
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
661
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
662
|
+
function(S)
|
|
663
|
+
local sorted_at, T, enum;
|
|
664
|
+
|
|
665
|
+
if not IsFinite(S) then
|
|
666
|
+
Error("the argument (a semigroup) is not finite");
|
|
667
|
+
elif IsPartialPermSemigroup(S) or IsFpSemigroup(S) or IsFpMonoid(S)
|
|
668
|
+
or IsQuotientSemigroup(S) then
|
|
669
|
+
# Special case required because < for libsemigroups ParialPerms and < for
|
|
670
|
+
# GAP partial perms are different.
|
|
671
|
+
return AsSet(S);
|
|
672
|
+
fi;
|
|
673
|
+
|
|
674
|
+
sorted_at := FroidurePinMemFnRec(S).sorted_at;
|
|
675
|
+
T := LibsemigroupsFroidurePin(S);
|
|
676
|
+
|
|
677
|
+
enum := rec();
|
|
678
|
+
|
|
679
|
+
enum.NumberElement := {enum, x} -> PositionSortedOp(S, x);
|
|
680
|
+
|
|
681
|
+
enum.ElementNumber := {enum, nr} -> sorted_at(T, nr - 1);
|
|
682
|
+
|
|
683
|
+
enum.Length := enum -> Size(S);
|
|
684
|
+
|
|
685
|
+
enum.Membership := {x, enum} -> PositionCanonical(S, x) <> fail;
|
|
686
|
+
|
|
687
|
+
enum.IsBound\[\] := {enum, nr} -> nr <= Size(S);
|
|
688
|
+
|
|
689
|
+
enum := EnumeratorByFunctions(S, enum);
|
|
690
|
+
SetIsSemigroupEnumerator(enum, true);
|
|
691
|
+
SetIsSSortedList(enum, true);
|
|
692
|
+
|
|
693
|
+
return enum;
|
|
694
|
+
end);
|
|
695
|
+
|
|
696
|
+
InstallMethod(Enumerator,
|
|
697
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
698
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin], 6, EnumeratorCanonical);
|
|
699
|
+
|
|
700
|
+
InstallMethod(EnumeratorCanonical,
|
|
701
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
702
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
703
|
+
function(S)
|
|
704
|
+
local T, enum, factorisation, at;
|
|
705
|
+
|
|
706
|
+
if HasAsListCanonical(S) then
|
|
707
|
+
return AsListCanonical(S);
|
|
708
|
+
fi;
|
|
709
|
+
|
|
710
|
+
T := LibsemigroupsFroidurePin(S);
|
|
711
|
+
|
|
712
|
+
enum := rec();
|
|
713
|
+
|
|
714
|
+
enum.NumberElement := {enum, x} -> PositionCanonical(S, x);
|
|
715
|
+
|
|
716
|
+
if IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
717
|
+
factorisation := FroidurePinMemFnRec(S).minimal_factorisation;
|
|
718
|
+
enum.ElementNumber := function(enum, nr)
|
|
719
|
+
if nr > Length(enum) then
|
|
720
|
+
return fail;
|
|
721
|
+
fi;
|
|
722
|
+
return EvaluateWord(GeneratorsOfSemigroup(S),
|
|
723
|
+
factorisation(T, nr - 1) + 1);
|
|
724
|
+
end;
|
|
725
|
+
else
|
|
726
|
+
at := FroidurePinMemFnRec(S).at;
|
|
727
|
+
enum.ElementNumber := function(enum, nr)
|
|
728
|
+
if nr > Length(enum) then
|
|
729
|
+
return fail;
|
|
730
|
+
else
|
|
731
|
+
return at(T, nr - 1);
|
|
732
|
+
fi;
|
|
733
|
+
end;
|
|
734
|
+
fi;
|
|
735
|
+
|
|
736
|
+
# TODO shouldn't S be stored in enum?
|
|
737
|
+
enum.Length := function(_)
|
|
738
|
+
if not IsFinite(S) then
|
|
739
|
+
return infinity;
|
|
740
|
+
else
|
|
741
|
+
return Size(S);
|
|
742
|
+
fi;
|
|
743
|
+
end;
|
|
744
|
+
|
|
745
|
+
enum.Membership := {x, enum} -> PositionCanonical(S, x) <> fail;
|
|
746
|
+
|
|
747
|
+
enum.IsBound\[\] := {enum, nr} -> nr <= Size(S);
|
|
748
|
+
|
|
749
|
+
enum := EnumeratorByFunctions(S, enum);
|
|
750
|
+
SetIsSemigroupEnumerator(enum, true);
|
|
751
|
+
|
|
752
|
+
return enum;
|
|
753
|
+
end);
|
|
754
|
+
|
|
755
|
+
# The next method is necessary since it does not necessarily involve
|
|
756
|
+
# enumerating the entire semigroup in the case that the semigroup is partially
|
|
757
|
+
# enumerated and <list> only contains indices that are within the so far
|
|
758
|
+
# enumerated range. The default methods in the library do, because they require
|
|
759
|
+
# the length of the enumerator to check that the list of positions is valid.
|
|
760
|
+
|
|
761
|
+
InstallMethod(ELMS_LIST, "for a semigroup enumerator and a list",
|
|
762
|
+
[IsSemigroupEnumerator, IsList],
|
|
763
|
+
function(enum, list)
|
|
764
|
+
local S, result, factorisation, at, T, i;
|
|
765
|
+
|
|
766
|
+
S := UnderlyingCollection(enum);
|
|
767
|
+
if not CanUseLibsemigroupsFroidurePin(S) then
|
|
768
|
+
TryNextMethod();
|
|
769
|
+
fi;
|
|
770
|
+
result := EmptyPlist(Length(list));
|
|
771
|
+
if IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
772
|
+
factorisation := FroidurePinMemFnRec(S).minimal_factorisation;
|
|
773
|
+
at := {T, nr} -> EvaluateWord(GeneratorsOfSemigroup(S),
|
|
774
|
+
factorisation(T, nr) + 1);
|
|
775
|
+
else
|
|
776
|
+
at := FroidurePinMemFnRec(S).at;
|
|
777
|
+
fi;
|
|
778
|
+
T := LibsemigroupsFroidurePin(S);
|
|
779
|
+
for i in list do
|
|
780
|
+
Add(result, at(T, i - 1));
|
|
781
|
+
od;
|
|
782
|
+
return result;
|
|
783
|
+
end);
|
|
784
|
+
|
|
785
|
+
########################################################################
|
|
786
|
+
## Iterators
|
|
787
|
+
########################################################################
|
|
788
|
+
|
|
789
|
+
InstallMethod(IteratorCanonical,
|
|
790
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
791
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
792
|
+
S -> IteratorList(EnumeratorCanonical(S)));
|
|
793
|
+
|
|
794
|
+
InstallMethod(Iterator,
|
|
795
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
796
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin], IteratorCanonical);
|
|
797
|
+
|
|
798
|
+
InstallMethod(IteratorSorted,
|
|
799
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
800
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
801
|
+
S -> IteratorList(EnumeratorSorted(S)));
|
|
802
|
+
|
|
803
|
+
########################################################################
|
|
804
|
+
## MultiplicationTable
|
|
805
|
+
########################################################################
|
|
806
|
+
|
|
807
|
+
InstallMethod(MultiplicationTable,
|
|
808
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
809
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
810
|
+
function(S)
|
|
811
|
+
local N, result, pos_to_pos_sorted, product, T, next, k, i, j;
|
|
812
|
+
|
|
813
|
+
if not IsFinite(S) then
|
|
814
|
+
Error("the argument (a semigroup) is not finite");
|
|
815
|
+
fi;
|
|
816
|
+
N := Size(S);
|
|
817
|
+
result := List([1 .. N], x -> EmptyPlist(N));
|
|
818
|
+
T := LibsemigroupsFroidurePin(S);
|
|
819
|
+
if IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
820
|
+
pos_to_pos_sorted := {T, i} -> i;
|
|
821
|
+
product := FroidurePinMemFnRec(S).product_by_reduction;
|
|
822
|
+
FroidurePinMemFnRec(S).enumerate(T, N + 1);
|
|
823
|
+
else
|
|
824
|
+
pos_to_pos_sorted := FroidurePinMemFnRec(S).position_to_sorted_position;
|
|
825
|
+
product := FroidurePinMemFnRec(S).fast_product;
|
|
826
|
+
fi;
|
|
827
|
+
for i in [0 .. N - 1] do
|
|
828
|
+
next := result[pos_to_pos_sorted(T, i) + 1];
|
|
829
|
+
for j in [0 .. N - 1] do
|
|
830
|
+
k := pos_to_pos_sorted(T, j) + 1;
|
|
831
|
+
next[k] := pos_to_pos_sorted(T, product(T, i, j)) + 1;
|
|
832
|
+
od;
|
|
833
|
+
od;
|
|
834
|
+
return result;
|
|
835
|
+
end);
|
|
836
|
+
|
|
837
|
+
########################################################################
|
|
838
|
+
## ClosureSemigroupOrMonoidNC
|
|
839
|
+
########################################################################
|
|
840
|
+
|
|
841
|
+
# TODO(later) require a ClosureSemigroupDestructive that uses closure directly,
|
|
842
|
+
# not copy then closure.
|
|
843
|
+
|
|
844
|
+
InstallMethod(ClosureSemigroupOrMonoidNC,
|
|
845
|
+
"for fn, CanUseLibsemigroupsFroidurePin, finite list, and record",
|
|
846
|
+
[IsFunction,
|
|
847
|
+
IsSemigroup and CanUseLibsemigroupsFroidurePin,
|
|
848
|
+
IsFinite and IsList,
|
|
849
|
+
IsRecord],
|
|
850
|
+
function(Constructor, S, coll, opts)
|
|
851
|
+
local n, R, M, N, CppT, add_generator, generator, T, x, i;
|
|
852
|
+
|
|
853
|
+
# opts must be copied and processed before calling this function
|
|
854
|
+
# coll must be copied before calling this function
|
|
855
|
+
if ForAll(coll, x -> x in S) then
|
|
856
|
+
# To avoid copying unless necessary!
|
|
857
|
+
return S;
|
|
858
|
+
fi;
|
|
859
|
+
|
|
860
|
+
if not IsMutable(coll) then
|
|
861
|
+
coll := ShallowCopy(coll);
|
|
862
|
+
fi;
|
|
863
|
+
|
|
864
|
+
coll := Shuffle(coll);
|
|
865
|
+
if IsGeneratorsOfActingSemigroup(coll) then
|
|
866
|
+
n := ActionDegree(coll);
|
|
867
|
+
Sort(coll, {x, y} -> ActionRank(x, n) > ActionRank(y, n));
|
|
868
|
+
elif Length(coll) < 120 then
|
|
869
|
+
Sort(coll, IsGreensDGreaterThanFunc(Semigroup(coll)));
|
|
870
|
+
fi;
|
|
871
|
+
|
|
872
|
+
R := FroidurePinMemFnRec(S, coll);
|
|
873
|
+
|
|
874
|
+
# Perform the closure
|
|
875
|
+
if IsPartialPermSemigroup(S) or IsTransformationSemigroup(S) then
|
|
876
|
+
if IsPartialPermSemigroup(S) then
|
|
877
|
+
M := Maximum(DegreeOfPartialPermCollection(coll),
|
|
878
|
+
CodegreeOfPartialPermCollection(coll));
|
|
879
|
+
N := Maximum(DegreeOfPartialPermSemigroup(S),
|
|
880
|
+
CodegreeOfPartialPermSemigroup(S));
|
|
881
|
+
else
|
|
882
|
+
M := DegreeOfTransformationCollection(coll);
|
|
883
|
+
N := DegreeOfTransformationSemigroup(S);
|
|
884
|
+
fi;
|
|
885
|
+
if M > N then
|
|
886
|
+
# Can't use closure, TODO(later) use copy_closure
|
|
887
|
+
CppT := R.make();
|
|
888
|
+
add_generator := R.add_generator;
|
|
889
|
+
for x in GeneratorsOfSemigroup(S) do
|
|
890
|
+
add_generator(CppT, [x, M]);
|
|
891
|
+
od;
|
|
892
|
+
R.closure(CppT, List(coll, x -> [x, M]));
|
|
893
|
+
else
|
|
894
|
+
CppT := R.copy(LibsemigroupsFroidurePin(S));
|
|
895
|
+
R.closure(CppT, List(coll, x -> [x, N]));
|
|
896
|
+
fi;
|
|
897
|
+
else
|
|
898
|
+
CppT := R.copy(LibsemigroupsFroidurePin(S));
|
|
899
|
+
R.closure(CppT, coll);
|
|
900
|
+
fi;
|
|
901
|
+
|
|
902
|
+
generator := R.generator;
|
|
903
|
+
|
|
904
|
+
# Recover the new generating set from the closure
|
|
905
|
+
coll := EmptyPlist(R.number_of_generators(CppT));
|
|
906
|
+
for i in [1 .. R.number_of_generators(CppT)] do
|
|
907
|
+
Add(coll, generator(CppT, i - 1));
|
|
908
|
+
od;
|
|
909
|
+
# Construct new semigroup so as to reset all attributes
|
|
910
|
+
T := Constructor(coll, opts);
|
|
911
|
+
T!.LibsemigroupsFroidurePin := CppT;
|
|
912
|
+
return T;
|
|
913
|
+
end);
|
|
914
|
+
|
|
915
|
+
########################################################################
|
|
916
|
+
## New in v4
|
|
917
|
+
########################################################################
|
|
918
|
+
|
|
919
|
+
InstallMethod(RulesOfSemigroup,
|
|
920
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin",
|
|
921
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin],
|
|
922
|
+
function(S)
|
|
923
|
+
if not IsFinite(S) then
|
|
924
|
+
Error("the argument (a semigroup) is not finite");
|
|
925
|
+
fi;
|
|
926
|
+
Enumerate(S);
|
|
927
|
+
return FroidurePinMemFnRec(S).rules(LibsemigroupsFroidurePin(S)) + 1;
|
|
928
|
+
end);
|
|
929
|
+
|
|
930
|
+
InstallMethod(IdempotentsSubset,
|
|
931
|
+
"for a semigroup with CanUseLibsemigroupsFroidurePin and hom. list",
|
|
932
|
+
[IsSemigroup and CanUseLibsemigroupsFroidurePin, IsHomogeneousList],
|
|
933
|
+
function(S, list)
|
|
934
|
+
local product_by_reduction, is_idempotent, T;
|
|
935
|
+
if not IsFinite(S) then
|
|
936
|
+
Error("the 1st argument (a semigroup) is not finite");
|
|
937
|
+
elif IsFpSemigroup(S) or IsFpMonoid(S) or IsQuotientSemigroup(S) then
|
|
938
|
+
product_by_reduction := FroidurePinMemFnRec(S).product_by_reduction;
|
|
939
|
+
is_idempotent := {T, x} -> product_by_reduction(T, x, x) = x;
|
|
940
|
+
else
|
|
941
|
+
is_idempotent := FroidurePinMemFnRec(S).is_idempotent;
|
|
942
|
+
fi;
|
|
943
|
+
T := LibsemigroupsFroidurePin(S);
|
|
944
|
+
return Filtered(list, x -> is_idempotent(T, x - 1));
|
|
945
|
+
end);
|