passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-macosx_13_0_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-gap-pkg-semigroups might be problematic. Click here for more details.
- gap/pkg/semigroups/CHANGELOG.md +1699 -0
- gap/pkg/semigroups/CONTRIBUTING.md +91 -0
- gap/pkg/semigroups/GNUmakefile +110 -0
- gap/pkg/semigroups/GNUmakefile.in +110 -0
- gap/pkg/semigroups/GPL +674 -0
- gap/pkg/semigroups/LICENSE +16 -0
- gap/pkg/semigroups/Makefile +26 -0
- gap/pkg/semigroups/Makefile.gappkg +225 -0
- gap/pkg/semigroups/PackageInfo.g +529 -0
- gap/pkg/semigroups/README.md +102 -0
- gap/pkg/semigroups/VERSIONS +112 -0
- gap/pkg/semigroups/aclocal.m4 +375 -0
- gap/pkg/semigroups/autogen.sh +25 -0
- gap/pkg/semigroups/bin/x86_64-apple-darwin22-default64-kv10/semigroups.so +0 -0
- gap/pkg/semigroups/config.guess +1807 -0
- gap/pkg/semigroups/config.log +1082 -0
- gap/pkg/semigroups/config.status +1134 -0
- gap/pkg/semigroups/config.sub +1960 -0
- gap/pkg/semigroups/configure +9742 -0
- gap/pkg/semigroups/configure.ac +71 -0
- gap/pkg/semigroups/data/doc/greens.pickle +1 -0
- gap/pkg/semigroups/data/gens/fullbool-8.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/fullbool.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/hall.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex-6.pickle.gz +0 -0
- gap/pkg/semigroups/data/gens/reflex.pickle.gz +0 -0
- gap/pkg/semigroups/data/tst/bipart4 +10 -0
- gap/pkg/semigroups/data/tst/pperm10 +1 -0
- gap/pkg/semigroups/data/tst/tables.gz +0 -0
- gap/pkg/semigroups/data/tst/testdata +1 -0
- gap/pkg/semigroups/data/tst/testinstall.pickle +1 -0
- gap/pkg/semigroups/data/tst/trans3 +7 -0
- gap/pkg/semigroups/data/tst/trans3-old +7 -0
- gap/pkg/semigroups/environment.yml +7 -0
- gap/pkg/semigroups/gap/attributes/acting.gd +15 -0
- gap/pkg/semigroups/gap/attributes/acting.gi +297 -0
- gap/pkg/semigroups/gap/attributes/attr.gd +91 -0
- gap/pkg/semigroups/gap/attributes/attr.gi +1214 -0
- gap/pkg/semigroups/gap/attributes/dual.gd +25 -0
- gap/pkg/semigroups/gap/attributes/dual.gi +209 -0
- gap/pkg/semigroups/gap/attributes/factor.gd +17 -0
- gap/pkg/semigroups/gap/attributes/factor.gi +453 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gd +84 -0
- gap/pkg/semigroups/gap/attributes/homomorph.gi +591 -0
- gap/pkg/semigroups/gap/attributes/inverse.gd +38 -0
- gap/pkg/semigroups/gap/attributes/inverse.gi +708 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gd +16 -0
- gap/pkg/semigroups/gap/attributes/isomorph.gi +377 -0
- gap/pkg/semigroups/gap/attributes/isorms.gd +49 -0
- gap/pkg/semigroups/gap/attributes/isorms.gi +1383 -0
- gap/pkg/semigroups/gap/attributes/maximal.gd +16 -0
- gap/pkg/semigroups/gap/attributes/maximal.gi +1876 -0
- gap/pkg/semigroups/gap/attributes/properties.gd +109 -0
- gap/pkg/semigroups/gap/attributes/properties.gi +1658 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gd +39 -0
- gap/pkg/semigroups/gap/attributes/rms-translat.gi +1078 -0
- gap/pkg/semigroups/gap/attributes/semifp.gd +12 -0
- gap/pkg/semigroups/gap/attributes/semifp.gi +84 -0
- gap/pkg/semigroups/gap/attributes/translat.gd +474 -0
- gap/pkg/semigroups/gap/attributes/translat.gi +1779 -0
- gap/pkg/semigroups/gap/congruences/cong.gd +154 -0
- gap/pkg/semigroups/gap/congruences/cong.gi +351 -0
- gap/pkg/semigroups/gap/congruences/conginv.gd +38 -0
- gap/pkg/semigroups/gap/congruences/conginv.gi +589 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gd +101 -0
- gap/pkg/semigroups/gap/congruences/conglatt.gi +886 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congpairs.gi +272 -0
- gap/pkg/semigroups/gap/congruences/congpart.gd +90 -0
- gap/pkg/semigroups/gap/congruences/congpart.gi +449 -0
- gap/pkg/semigroups/gap/congruences/congrees.gd +20 -0
- gap/pkg/semigroups/gap/congruences/congrees.gi +313 -0
- gap/pkg/semigroups/gap/congruences/congrms.gd +54 -0
- gap/pkg/semigroups/gap/congruences/congrms.gi +1467 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gd +28 -0
- gap/pkg/semigroups/gap/congruences/congsemigraph.gi +289 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gd +27 -0
- gap/pkg/semigroups/gap/congruences/congsimple.gi +236 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gd +20 -0
- gap/pkg/semigroups/gap/congruences/conguniv.gi +271 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gd +21 -0
- gap/pkg/semigroups/gap/congruences/congwordgraph.gi +250 -0
- gap/pkg/semigroups/gap/elements/bipart.gd +71 -0
- gap/pkg/semigroups/gap/elements/bipart.gi +995 -0
- gap/pkg/semigroups/gap/elements/blocks.gd +31 -0
- gap/pkg/semigroups/gap/elements/blocks.gi +134 -0
- gap/pkg/semigroups/gap/elements/boolmat.gd +74 -0
- gap/pkg/semigroups/gap/elements/boolmat.gi +726 -0
- gap/pkg/semigroups/gap/elements/elements.gd +11 -0
- gap/pkg/semigroups/gap/elements/elements.gi +121 -0
- gap/pkg/semigroups/gap/elements/ffmat.gd +71 -0
- gap/pkg/semigroups/gap/elements/ffmat.gi +311 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gd +131 -0
- gap/pkg/semigroups/gap/elements/maxplusmat.gi +782 -0
- gap/pkg/semigroups/gap/elements/pbr.gd +51 -0
- gap/pkg/semigroups/gap/elements/pbr.gi +740 -0
- gap/pkg/semigroups/gap/elements/pperm.gd +11 -0
- gap/pkg/semigroups/gap/elements/pperm.gi +14 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gd +136 -0
- gap/pkg/semigroups/gap/elements/semiringmat.gi +717 -0
- gap/pkg/semigroups/gap/elements/star.gd +21 -0
- gap/pkg/semigroups/gap/elements/star.gi +21 -0
- gap/pkg/semigroups/gap/elements/trans.gd +13 -0
- gap/pkg/semigroups/gap/elements/trans.gi +50 -0
- gap/pkg/semigroups/gap/fp/freeband.gd +22 -0
- gap/pkg/semigroups/gap/fp/freeband.gi +502 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gd +30 -0
- gap/pkg/semigroups/gap/fp/freeinverse.gi +465 -0
- gap/pkg/semigroups/gap/fp/tietze.gd +89 -0
- gap/pkg/semigroups/gap/fp/tietze.gi +1578 -0
- gap/pkg/semigroups/gap/fp/word.gd +15 -0
- gap/pkg/semigroups/gap/fp/word.gi +67 -0
- gap/pkg/semigroups/gap/greens/acting-inverse.gi +774 -0
- gap/pkg/semigroups/gap/greens/acting-regular.gi +553 -0
- gap/pkg/semigroups/gap/greens/acting.gd +81 -0
- gap/pkg/semigroups/gap/greens/acting.gi +2433 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gd +25 -0
- gap/pkg/semigroups/gap/greens/froidure-pin.gi +741 -0
- gap/pkg/semigroups/gap/greens/generic.gd +117 -0
- gap/pkg/semigroups/gap/greens/generic.gi +630 -0
- gap/pkg/semigroups/gap/ideals/acting.gd +17 -0
- gap/pkg/semigroups/gap/ideals/acting.gi +1155 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gd +11 -0
- gap/pkg/semigroups/gap/ideals/froidure-pin.gi +105 -0
- gap/pkg/semigroups/gap/ideals/ideals.gd +45 -0
- gap/pkg/semigroups/gap/ideals/ideals.gi +442 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gd +16 -0
- gap/pkg/semigroups/gap/ideals/lambda-rho.gi +614 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gd +24 -0
- gap/pkg/semigroups/gap/libsemigroups/cong.gi +431 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gd +16 -0
- gap/pkg/semigroups/gap/libsemigroups/fpsemi.gi +53 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gd +17 -0
- gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gi +945 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gd +38 -0
- gap/pkg/semigroups/gap/libsemigroups/sims1.gi +308 -0
- gap/pkg/semigroups/gap/main/acting.gd +36 -0
- gap/pkg/semigroups/gap/main/acting.gi +779 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gd +72 -0
- gap/pkg/semigroups/gap/main/froidure-pin.gi +655 -0
- gap/pkg/semigroups/gap/main/graded.gd +26 -0
- gap/pkg/semigroups/gap/main/graded.gi +355 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gd +29 -0
- gap/pkg/semigroups/gap/main/lambda-rho.gi +514 -0
- gap/pkg/semigroups/gap/main/orbits.gd +24 -0
- gap/pkg/semigroups/gap/main/orbits.gi +512 -0
- gap/pkg/semigroups/gap/main/semiact.gd +20 -0
- gap/pkg/semigroups/gap/main/semiact.gi +821 -0
- gap/pkg/semigroups/gap/main/setup.gd +61 -0
- gap/pkg/semigroups/gap/main/setup.gi +1094 -0
- gap/pkg/semigroups/gap/obsolete.gd +9 -0
- gap/pkg/semigroups/gap/obsolete.gi +14 -0
- gap/pkg/semigroups/gap/options.g +55 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gd +12 -0
- gap/pkg/semigroups/gap/semigroups/grpperm.gi +177 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semibipart.gi +570 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gd +20 -0
- gap/pkg/semigroups/gap/semigroups/semiboolmat.gi +104 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gd +52 -0
- gap/pkg/semigroups/gap/semigroups/semicons.gi +1194 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semidp.gi +509 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gd +126 -0
- gap/pkg/semigroups/gap/semigroups/semieunit.gi +889 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gd +104 -0
- gap/pkg/semigroups/gap/semigroups/semiex.gi +1590 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gd +37 -0
- gap/pkg/semigroups/gap/semigroups/semiffmat.gi +565 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gd +28 -0
- gap/pkg/semigroups/gap/semigroups/semifp.gi +1364 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gd +40 -0
- gap/pkg/semigroups/gap/semigroups/semigraph.gi +292 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gd +165 -0
- gap/pkg/semigroups/gap/semigroups/semigrp.gi +1225 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gd +72 -0
- gap/pkg/semigroups/gap/semigroups/semimaxplus.gi +710 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gd +13 -0
- gap/pkg/semigroups/gap/semigroups/semintmat.gi +74 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semipbr.gi +139 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gd +27 -0
- gap/pkg/semigroups/gap/semigroups/semipperm.gi +711 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gd +14 -0
- gap/pkg/semigroups/gap/semigroups/semiquo.gi +97 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gd +16 -0
- gap/pkg/semigroups/gap/semigroups/semiringmat.gi +21 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gd +19 -0
- gap/pkg/semigroups/gap/semigroups/semirms.gi +977 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gd +49 -0
- gap/pkg/semigroups/gap/semigroups/semitrans.gi +909 -0
- gap/pkg/semigroups/gap/tools/display.gd +24 -0
- gap/pkg/semigroups/gap/tools/display.gi +749 -0
- gap/pkg/semigroups/gap/tools/io.gd +17 -0
- gap/pkg/semigroups/gap/tools/io.gi +543 -0
- gap/pkg/semigroups/gap/tools/iterators.gd +16 -0
- gap/pkg/semigroups/gap/tools/iterators.gi +253 -0
- gap/pkg/semigroups/gap/tools/utils.gd +19 -0
- gap/pkg/semigroups/gap/tools/utils.gi +756 -0
- gap/pkg/semigroups/gapbind14/.ccls +18 -0
- gap/pkg/semigroups/gapbind14/.clang-format +104 -0
- gap/pkg/semigroups/gapbind14/CPPLINT.cfg +5 -0
- gap/pkg/semigroups/gapbind14/LICENSE +674 -0
- gap/pkg/semigroups/gapbind14/README.md +76 -0
- gap/pkg/semigroups/gapbind14/demo/.gitignore +4 -0
- gap/pkg/semigroups/gapbind14/demo/LICENSE +293 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.gappkg +220 -0
- gap/pkg/semigroups/gapbind14/demo/Makefile.in +19 -0
- gap/pkg/semigroups/gapbind14/demo/PackageInfo.g +87 -0
- gap/pkg/semigroups/gapbind14/demo/README.md +17 -0
- gap/pkg/semigroups/gapbind14/demo/configure +34 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gd +19 -0
- gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gi +10 -0
- gap/pkg/semigroups/gapbind14/demo/init.g +16 -0
- gap/pkg/semigroups/gapbind14/demo/makedoc.g +10 -0
- gap/pkg/semigroups/gapbind14/demo/read.g +6 -0
- gap/pkg/semigroups/gapbind14/demo/src/gapbind_demo.cc +142 -0
- gap/pkg/semigroups/gapbind14/demo/tst/testall.g +12 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/cpp_fn.hpp +223 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gap_include.hpp +26 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/gapbind14.hpp +445 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_free_fn.hpp +420 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/tame_mem_fn.hpp +556 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_cpp.hpp +162 -0
- gap/pkg/semigroups/gapbind14/include/gapbind14/to_gap.hpp +158 -0
- gap/pkg/semigroups/gapbind14/src/.clang-format +108 -0
- gap/pkg/semigroups/gapbind14/src/gapbind14.cpp +334 -0
- gap/pkg/semigroups/init.g +150 -0
- gap/pkg/semigroups/m4/ax_append_flag.m4 +50 -0
- gap/pkg/semigroups/m4/ax_check_compile_flag.m4 +53 -0
- gap/pkg/semigroups/m4/ax_check_hpcombi.m4 +121 -0
- gap/pkg/semigroups/m4/ax_check_libsemigroup.m4 +68 -0
- gap/pkg/semigroups/m4/ax_compare_version.m4 +177 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
- gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx_14.m4 +34 -0
- gap/pkg/semigroups/m4/ax_prefix_config_h.m4 +203 -0
- gap/pkg/semigroups/m4/ax_pthread.m4 +522 -0
- gap/pkg/semigroups/m4/find_gap.m4 +94 -0
- gap/pkg/semigroups/makedoc.g +153 -0
- gap/pkg/semigroups/prerequisites.sh +62 -0
- gap/pkg/semigroups/read.g +105 -0
- gap/pkg/semigroups/release.toml +6 -0
- gap/pkg/semigroups/tst/extreme/README +2 -0
- gap/pkg/semigroups/tst/extreme/attrinv.tst +703 -0
- gap/pkg/semigroups/tst/extreme/bipart.tst +2803 -0
- gap/pkg/semigroups/tst/extreme/closure.tst +652 -0
- gap/pkg/semigroups/tst/extreme/cong.tst +286 -0
- gap/pkg/semigroups/tst/extreme/conginv.tst +43 -0
- gap/pkg/semigroups/tst/extreme/examples.tst +2449 -0
- gap/pkg/semigroups/tst/extreme/freeband.tst +37 -0
- gap/pkg/semigroups/tst/extreme/greens-acting-regular.tst +27 -0
- gap/pkg/semigroups/tst/extreme/greens-acting.tst +1999 -0
- gap/pkg/semigroups/tst/extreme/ideals.tst +858 -0
- gap/pkg/semigroups/tst/extreme/inverse.tst +1025 -0
- gap/pkg/semigroups/tst/extreme/maximal.tst +856 -0
- gap/pkg/semigroups/tst/extreme/misc.tst +4236 -0
- gap/pkg/semigroups/tst/extreme/monoid_pkg.tst +1488 -0
- gap/pkg/semigroups/tst/extreme/properties.tst +914 -0
- gap/pkg/semigroups/tst/extreme/semibipart.tst +2837 -0
- gap/pkg/semigroups/tst/extreme/semieunit.tst +49 -0
- gap/pkg/semigroups/tst/extreme/semiffmat.tst +353 -0
- gap/pkg/semigroups/tst/extreme/semigroups.tst +245 -0
- gap/pkg/semigroups/tst/extreme/semiiter.tst +58 -0
- gap/pkg/semigroups/tst/extreme/semirms.tst +1091 -0
- gap/pkg/semigroups/tst/extreme/transform.tst +305 -0
- gap/pkg/semigroups/tst/extreme/translat.tst +44 -0
- gap/pkg/semigroups/tst/standard/README +2 -0
- gap/pkg/semigroups/tst/standard/attributes/acting.tst +388 -0
- gap/pkg/semigroups/tst/standard/attributes/attr.tst +2404 -0
- gap/pkg/semigroups/tst/standard/attributes/dual.tst +308 -0
- gap/pkg/semigroups/tst/standard/attributes/factor.tst +629 -0
- gap/pkg/semigroups/tst/standard/attributes/homomorph.tst +1134 -0
- gap/pkg/semigroups/tst/standard/attributes/inverse.tst +1521 -0
- gap/pkg/semigroups/tst/standard/attributes/isomorph.tst +435 -0
- gap/pkg/semigroups/tst/standard/attributes/isorms.tst +1147 -0
- gap/pkg/semigroups/tst/standard/attributes/maximal.tst +853 -0
- gap/pkg/semigroups/tst/standard/attributes/properties.tst +2028 -0
- gap/pkg/semigroups/tst/standard/attributes/semifp.tst +53 -0
- gap/pkg/semigroups/tst/standard/attributes/translat.tst +796 -0
- gap/pkg/semigroups/tst/standard/congruences/cong.tst +1044 -0
- gap/pkg/semigroups/tst/standard/congruences/conginv.tst +292 -0
- gap/pkg/semigroups/tst/standard/congruences/conglatt.tst +421 -0
- gap/pkg/semigroups/tst/standard/congruences/congpairs.tst +1011 -0
- gap/pkg/semigroups/tst/standard/congruences/congrees.tst +288 -0
- gap/pkg/semigroups/tst/standard/congruences/congrms.tst +701 -0
- gap/pkg/semigroups/tst/standard/congruences/congsemigraph.tst +422 -0
- gap/pkg/semigroups/tst/standard/congruences/congsimple.tst +311 -0
- gap/pkg/semigroups/tst/standard/congruences/conguniv.tst +259 -0
- gap/pkg/semigroups/tst/standard/congruences/congwordgraph.tst +330 -0
- gap/pkg/semigroups/tst/standard/elements/bipart.tst +783 -0
- gap/pkg/semigroups/tst/standard/elements/blocks.tst +166 -0
- gap/pkg/semigroups/tst/standard/elements/boolmat.tst +608 -0
- gap/pkg/semigroups/tst/standard/elements/elements.tst +117 -0
- gap/pkg/semigroups/tst/standard/elements/ffmat.tst +349 -0
- gap/pkg/semigroups/tst/standard/elements/maxplusmat.tst +613 -0
- gap/pkg/semigroups/tst/standard/elements/pbr.tst +506 -0
- gap/pkg/semigroups/tst/standard/elements/pperm.tst +32 -0
- gap/pkg/semigroups/tst/standard/elements/semiringmat.tst +601 -0
- gap/pkg/semigroups/tst/standard/elements/trans.tst +58 -0
- gap/pkg/semigroups/tst/standard/fp/freeband.tst +311 -0
- gap/pkg/semigroups/tst/standard/fp/freeinverse.tst +147 -0
- gap/pkg/semigroups/tst/standard/fp/tietze.tst +780 -0
- gap/pkg/semigroups/tst/standard/fp/word.tst +106 -0
- gap/pkg/semigroups/tst/standard/greens/acting-inverse.tst +545 -0
- gap/pkg/semigroups/tst/standard/greens/acting-regular.tst +396 -0
- gap/pkg/semigroups/tst/standard/greens/acting.tst +2033 -0
- gap/pkg/semigroups/tst/standard/greens/froidure-pin.tst +1831 -0
- gap/pkg/semigroups/tst/standard/greens/generic.tst +1436 -0
- gap/pkg/semigroups/tst/standard/ideals/acting.tst +279 -0
- gap/pkg/semigroups/tst/standard/ideals/froidure-pin.tst +178 -0
- gap/pkg/semigroups/tst/standard/ideals/ideals.tst +380 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/cong.tst +310 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/froidure-pin.tst +778 -0
- gap/pkg/semigroups/tst/standard/libsemigroups/sims1.tst +379 -0
- gap/pkg/semigroups/tst/standard/main/acting.tst +411 -0
- gap/pkg/semigroups/tst/standard/main/froidure-pin.tst +392 -0
- gap/pkg/semigroups/tst/standard/main/semiact.tst +203 -0
- gap/pkg/semigroups/tst/standard/main/setup.tst +1144 -0
- gap/pkg/semigroups/tst/standard/obsolete.tst +19 -0
- gap/pkg/semigroups/tst/standard/options.tst +54 -0
- gap/pkg/semigroups/tst/standard/semigroups/grpperm.tst +581 -0
- gap/pkg/semigroups/tst/standard/semigroups/semibipart.tst +2635 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiboolmat.tst +1871 -0
- gap/pkg/semigroups/tst/standard/semigroups/semicons.tst +1173 -0
- gap/pkg/semigroups/tst/standard/semigroups/semidp.tst +739 -0
- gap/pkg/semigroups/tst/standard/semigroups/semieunit.tst +339 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiex.tst +2055 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiffmat.tst +746 -0
- gap/pkg/semigroups/tst/standard/semigroups/semifp.tst +2702 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigraph.tst +133 -0
- gap/pkg/semigroups/tst/standard/semigroups/semigrp.tst +1112 -0
- gap/pkg/semigroups/tst/standard/semigroups/semimaxplus.tst +654 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipbr.tst +2142 -0
- gap/pkg/semigroups/tst/standard/semigroups/semipperm.tst +2169 -0
- gap/pkg/semigroups/tst/standard/semigroups/semiquo.tst +278 -0
- gap/pkg/semigroups/tst/standard/semigroups/semirms.tst +3010 -0
- gap/pkg/semigroups/tst/standard/semigroups/semitrans.tst +2758 -0
- gap/pkg/semigroups/tst/standard/tools/display.tst +1040 -0
- gap/pkg/semigroups/tst/standard/tools/io.tst +363 -0
- gap/pkg/semigroups/tst/testinstall.tst +1815 -0
- gap/pkg/semigroups/tst/teststandard.g +22 -0
- gap/pkg/semigroups/tst/workspaces/load-workspace.tst +142 -0
- gap/pkg/semigroups/tst/workspaces/load.g +11 -0
- gap/pkg/semigroups/tst/workspaces/save-workspace.tst +166 -0
- gap/pkg/semigroups/tst/workspaces/save.g +14 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/METADATA +93 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/METADATA.bak +94 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/RECORD +354 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/WHEEL +6 -0
- passagemath_gap_pkg_semigroups-10.6.29.dist-info/top_level.txt +1 -0
- passagemath_gap_pkg_semigroups.dylibs/libsemigroups.2.dylib +0 -0
- sage/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/all__sagemath_gap_pkg_semigroups.py +1 -0
- sage/libs/gap_pkg_semigroups.abi3.so +0 -0
|
@@ -0,0 +1,1364 @@
|
|
|
1
|
+
#############################################################################
|
|
2
|
+
##
|
|
3
|
+
## semigroups/semifp.gi
|
|
4
|
+
## Copyright (C) 2015-2022 James D. Mitchell
|
|
5
|
+
##
|
|
6
|
+
## Licensing information can be found in the README file of this package.
|
|
7
|
+
##
|
|
8
|
+
#############################################################################
|
|
9
|
+
##
|
|
10
|
+
|
|
11
|
+
# Many of the methods in this file should probably have the filter
|
|
12
|
+
# HasRelationsOfFpMonoid/Semigroup added to their requirements, but for some
|
|
13
|
+
# reason fp semigroups and monoids don't known their relations at creation.
|
|
14
|
+
|
|
15
|
+
# All methods for fp semigroups and monoids go via the underlying congruence on
|
|
16
|
+
# the free semigroup and free monoid.
|
|
17
|
+
|
|
18
|
+
# TODO methods for submonoids of fp monoids and subsemigroups of fp semigroups
|
|
19
|
+
InstallImmediateMethod(CanUseGapFroidurePin,
|
|
20
|
+
IsSubsemigroupOfFpMonoid and HasGeneratorsOfSemigroup, 0,
|
|
21
|
+
function(T)
|
|
22
|
+
local x;
|
|
23
|
+
x := Representative(GeneratorsOfSemigroup(T));
|
|
24
|
+
return CanUseFroidurePin(FpMonoidOfElementOfFpMonoid(x));
|
|
25
|
+
end);
|
|
26
|
+
|
|
27
|
+
InstallMethod(UnderlyingCongruence, "for an fp semigroup",
|
|
28
|
+
[IsFpSemigroup],
|
|
29
|
+
function(S)
|
|
30
|
+
local F, R;
|
|
31
|
+
F := FreeSemigroupOfFpSemigroup(S);
|
|
32
|
+
R := RelationsOfFpSemigroup(S);
|
|
33
|
+
return SemigroupCongruenceByGeneratingPairs(F, R);
|
|
34
|
+
end);
|
|
35
|
+
|
|
36
|
+
InstallMethod(UnderlyingCongruence, "for an fp monoid",
|
|
37
|
+
[IsFpMonoid],
|
|
38
|
+
function(S)
|
|
39
|
+
local F, R;
|
|
40
|
+
F := FreeMonoidOfFpMonoid(S);
|
|
41
|
+
R := RelationsOfFpMonoid(S);
|
|
42
|
+
return SemigroupCongruenceByGeneratingPairs(F, R);
|
|
43
|
+
end);
|
|
44
|
+
|
|
45
|
+
InstallMethod(ElementOfFpSemigroup,
|
|
46
|
+
"for an fp semigroup and an associative word",
|
|
47
|
+
[IsFpSemigroup, IsAssocWord],
|
|
48
|
+
{S, w} -> ElementOfFpSemigroup(FamilyObj(Representative(S)), w));
|
|
49
|
+
|
|
50
|
+
InstallMethod(ElementOfFpMonoid,
|
|
51
|
+
"for an fp monoid and an associative word",
|
|
52
|
+
[IsFpMonoid, IsAssocWord],
|
|
53
|
+
{M, w} -> ElementOfFpMonoid(FamilyObj(Representative(M)), w));
|
|
54
|
+
|
|
55
|
+
InstallMethod(Size, "for an fp semigroup", [IsFpSemigroup],
|
|
56
|
+
S -> NrEquivalenceClasses(UnderlyingCongruence(S)));
|
|
57
|
+
|
|
58
|
+
# TODO(later) more of these
|
|
59
|
+
|
|
60
|
+
InstallMethod(Size, "for an fp semigroup with nice monomorphism",
|
|
61
|
+
[IsFpSemigroup and HasNiceMonomorphism],
|
|
62
|
+
S -> Size(Range(NiceMonomorphism(S))));
|
|
63
|
+
|
|
64
|
+
InstallMethod(AsList, "for an fp semigroup with nice monomorphism",
|
|
65
|
+
[IsFpSemigroup and HasNiceMonomorphism],
|
|
66
|
+
function(S)
|
|
67
|
+
local map;
|
|
68
|
+
map := InverseGeneralMapping(NiceMonomorphism(S));
|
|
69
|
+
return List(Enumerator(Source(map)), x -> x ^ map);
|
|
70
|
+
end);
|
|
71
|
+
|
|
72
|
+
InstallMethod(Enumerator, "for an fp semigroup with nice monomorphism",
|
|
73
|
+
[IsFpSemigroup and HasNiceMonomorphism], 100,
|
|
74
|
+
function(S)
|
|
75
|
+
local enum;
|
|
76
|
+
enum := rec();
|
|
77
|
+
|
|
78
|
+
enum.map := NiceMonomorphism(S);
|
|
79
|
+
|
|
80
|
+
enum.NumberElement := {enum, x} ->
|
|
81
|
+
PositionCanonical(Range(enum!.map), x ^ enum!.map);
|
|
82
|
+
|
|
83
|
+
enum.ElementNumber := function(enum, nr)
|
|
84
|
+
return EnumeratorCanonical(Range(enum!.map))[nr]
|
|
85
|
+
^ InverseGeneralMapping(enum!.map);
|
|
86
|
+
end;
|
|
87
|
+
|
|
88
|
+
enum.Length := enum -> Size(S);
|
|
89
|
+
|
|
90
|
+
enum.Membership := {x, enum} -> x ^ enum!.map in Range(enum!.map);
|
|
91
|
+
|
|
92
|
+
enum.IsBound\[\] := {enum, nr} -> nr <= Size(S);
|
|
93
|
+
|
|
94
|
+
return EnumeratorByFunctions(S, enum);
|
|
95
|
+
end);
|
|
96
|
+
|
|
97
|
+
# TODO(later) EnumeratorSorted
|
|
98
|
+
|
|
99
|
+
InstallMethod(AsSSortedList, "for an fp semigroup with nice monomorphism",
|
|
100
|
+
[IsFpSemigroup and HasNiceMonomorphism],
|
|
101
|
+
22,
|
|
102
|
+
function(S)
|
|
103
|
+
local map;
|
|
104
|
+
map := InverseGeneralMapping(NiceMonomorphism(S));
|
|
105
|
+
# EnumeratorCanonical returns the elements of the Range(NiceMonomorphism(S))
|
|
106
|
+
# in short-lex order, which is sorted.
|
|
107
|
+
return List(EnumeratorCanonical(Source(map)), x -> x ^ map);
|
|
108
|
+
end);
|
|
109
|
+
|
|
110
|
+
InstallMethod(Size, "for an fp monoid", [IsFpMonoid],
|
|
111
|
+
S -> NrEquivalenceClasses(UnderlyingCongruence(S)));
|
|
112
|
+
|
|
113
|
+
InstallMethod(\=, "for elements of an f.p. semigroup",
|
|
114
|
+
IsIdenticalObj, [IsElementOfFpSemigroup, IsElementOfFpSemigroup],
|
|
115
|
+
function(x, y)
|
|
116
|
+
local C;
|
|
117
|
+
C := UnderlyingCongruence(FpSemigroupOfElementOfFpSemigroup(x));
|
|
118
|
+
return CongruenceTestMembershipNC(C,
|
|
119
|
+
UnderlyingElement(x),
|
|
120
|
+
UnderlyingElement(y));
|
|
121
|
+
end);
|
|
122
|
+
|
|
123
|
+
InstallMethod(\=, "for two elements of an f.p. monoid",
|
|
124
|
+
IsIdenticalObj, [IsElementOfFpMonoid, IsElementOfFpMonoid],
|
|
125
|
+
function(x, y)
|
|
126
|
+
local C;
|
|
127
|
+
C := UnderlyingCongruence(FpMonoidOfElementOfFpMonoid(x));
|
|
128
|
+
return CongruenceTestMembershipNC(C,
|
|
129
|
+
UnderlyingElement(x),
|
|
130
|
+
UnderlyingElement(y));
|
|
131
|
+
end);
|
|
132
|
+
|
|
133
|
+
InstallMethod(\<, "for elements of an f.p. semigroup",
|
|
134
|
+
IsIdenticalObj, [IsElementOfFpSemigroup, IsElementOfFpSemigroup],
|
|
135
|
+
function(x, y)
|
|
136
|
+
local S, map, C;
|
|
137
|
+
S := FpSemigroupOfElementOfFpSemigroup(x);
|
|
138
|
+
if HasNiceMonomorphism(S) then
|
|
139
|
+
map := NiceMonomorphism(S);
|
|
140
|
+
return PositionCanonical(Range(map), x ^ map)
|
|
141
|
+
< PositionCanonical(Range(map), y ^ map);
|
|
142
|
+
fi;
|
|
143
|
+
C := UnderlyingCongruence(S);
|
|
144
|
+
return CongruenceLessNC(C, UnderlyingElement(x), UnderlyingElement(y));
|
|
145
|
+
end);
|
|
146
|
+
|
|
147
|
+
InstallMethod(\<, "for two elements of an f.p. monoid",
|
|
148
|
+
IsIdenticalObj, [IsElementOfFpMonoid, IsElementOfFpMonoid],
|
|
149
|
+
function(x, y)
|
|
150
|
+
local C;
|
|
151
|
+
C := UnderlyingCongruence(FpMonoidOfElementOfFpMonoid(x));
|
|
152
|
+
return CongruenceLessNC(C, UnderlyingElement(x), UnderlyingElement(y));
|
|
153
|
+
end);
|
|
154
|
+
|
|
155
|
+
#############################################################################
|
|
156
|
+
# Methods not using the underlying congruence directly
|
|
157
|
+
#############################################################################
|
|
158
|
+
|
|
159
|
+
InstallMethod(ExtRepOfObj, "for an element of an fp semigroup",
|
|
160
|
+
[IsElementOfFpSemigroup], x -> ExtRepOfObj(UnderlyingElement(x)));
|
|
161
|
+
|
|
162
|
+
InstallMethod(ExtRepOfObj, "for an element of an fp monoid",
|
|
163
|
+
[IsElementOfFpMonoid], x -> ExtRepOfObj(UnderlyingElement(x)));
|
|
164
|
+
|
|
165
|
+
# TODO(later) AsSSortedList, RightCayleyDigraph, any more?
|
|
166
|
+
# - for both IsFpSemigroup/Monoid and IsFpSemigroup/Monoid +
|
|
167
|
+
# HasNiceMonomorphism
|
|
168
|
+
|
|
169
|
+
#############################################################################
|
|
170
|
+
# Viewing and printing - elements
|
|
171
|
+
#############################################################################
|
|
172
|
+
|
|
173
|
+
InstallMethod(ViewString, "for an f.p. semigroup element",
|
|
174
|
+
[IsElementOfFpSemigroup], String);
|
|
175
|
+
|
|
176
|
+
InstallMethod(ViewString, "for an f.p. monoid element",
|
|
177
|
+
[IsElementOfFpMonoid], String);
|
|
178
|
+
|
|
179
|
+
#############################################################################
|
|
180
|
+
# Viewing and printing - free monoids and semigroups
|
|
181
|
+
#############################################################################
|
|
182
|
+
|
|
183
|
+
InstallMethod(String, "for a free monoid with known generators",
|
|
184
|
+
[IsFreeMonoid and HasGeneratorsOfMonoid],
|
|
185
|
+
function(M)
|
|
186
|
+
|
|
187
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
188
|
+
TryNextMethod();
|
|
189
|
+
fi;
|
|
190
|
+
|
|
191
|
+
return StringFormatted("FreeMonoidAndAssignGeneratorVars({})",
|
|
192
|
+
List(GeneratorsOfMonoid(M), String));
|
|
193
|
+
end);
|
|
194
|
+
|
|
195
|
+
InstallMethod(PrintString, "for a free monoid with known generators",
|
|
196
|
+
[IsFreeMonoid and HasGeneratorsOfMonoid], String);
|
|
197
|
+
|
|
198
|
+
BindGlobal("SEMIGROUPS_FreeSemigroupMonoidPrintObj",
|
|
199
|
+
function(M)
|
|
200
|
+
|
|
201
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
202
|
+
TryNextMethod();
|
|
203
|
+
fi;
|
|
204
|
+
|
|
205
|
+
Print(PrintString(M));
|
|
206
|
+
return;
|
|
207
|
+
end);
|
|
208
|
+
|
|
209
|
+
BindGlobal("SEMIGROUPS_FreeSemigroupMonoidString",
|
|
210
|
+
function(M)
|
|
211
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
212
|
+
TryNextMethod();
|
|
213
|
+
fi;
|
|
214
|
+
return String(M);
|
|
215
|
+
end);
|
|
216
|
+
|
|
217
|
+
InstallMethod(PrintObj, "for a free monoid with known generators",
|
|
218
|
+
[IsFreeMonoid and HasGeneratorsOfMonoid],
|
|
219
|
+
SEMIGROUPS_FreeSemigroupMonoidPrintObj);
|
|
220
|
+
|
|
221
|
+
InstallMethod(String, "for a free semigroup with known generators",
|
|
222
|
+
[IsFreeSemigroup and HasGeneratorsOfSemigroup],
|
|
223
|
+
function(M)
|
|
224
|
+
|
|
225
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
226
|
+
TryNextMethod();
|
|
227
|
+
fi;
|
|
228
|
+
|
|
229
|
+
return StringFormatted("FreeSemigroupAndAssignGeneratorVars({})",
|
|
230
|
+
List(GeneratorsOfSemigroup(M), String));
|
|
231
|
+
end);
|
|
232
|
+
|
|
233
|
+
InstallMethod(PrintString, "for a free semigroup with known generators",
|
|
234
|
+
[IsFreeSemigroup and HasGeneratorsOfSemigroup], String);
|
|
235
|
+
|
|
236
|
+
InstallMethod(PrintObj, "for a free semigroup with known generators",
|
|
237
|
+
[IsFreeSemigroup and HasGeneratorsOfSemigroup],
|
|
238
|
+
SEMIGROUPS_FreeSemigroupMonoidPrintObj);
|
|
239
|
+
|
|
240
|
+
#############################################################################
|
|
241
|
+
# Viewing and printing - free monoids and semigroups
|
|
242
|
+
#############################################################################
|
|
243
|
+
|
|
244
|
+
InstallMethod(String, "for an f.p. monoid with known generators",
|
|
245
|
+
[IsFpMonoid and HasGeneratorsOfMonoid],
|
|
246
|
+
function(M)
|
|
247
|
+
local result, fam, id;
|
|
248
|
+
|
|
249
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
250
|
+
TryNextMethod();
|
|
251
|
+
fi;
|
|
252
|
+
|
|
253
|
+
result := PRINT_STRINGIFY(FreeMonoidOfFpMonoid(M),
|
|
254
|
+
" / ",
|
|
255
|
+
RelationsOfFpMonoid(M));
|
|
256
|
+
|
|
257
|
+
fam := ElementsFamily(FamilyObj(FreeMonoidOfFpMonoid(M)));
|
|
258
|
+
|
|
259
|
+
if IsEmpty(fam!.names) then
|
|
260
|
+
return result;
|
|
261
|
+
fi;
|
|
262
|
+
id := StringFormatted("One({})", fam!.names[1]);
|
|
263
|
+
return ReplacedString(result, "<identity ...>", id);
|
|
264
|
+
end);
|
|
265
|
+
|
|
266
|
+
InstallMethod(PrintString, "for an f.p. monoid with known generators",
|
|
267
|
+
[IsFpMonoid and HasGeneratorsOfMonoid],
|
|
268
|
+
SEMIGROUPS_FreeSemigroupMonoidString);
|
|
269
|
+
|
|
270
|
+
InstallMethod(PrintObj, "for an f.p. monoid with known generators",
|
|
271
|
+
[IsFpMonoid and HasGeneratorsOfMonoid],
|
|
272
|
+
4, # to beat the library method
|
|
273
|
+
SEMIGROUPS_FreeSemigroupMonoidPrintObj);
|
|
274
|
+
|
|
275
|
+
InstallMethod(ViewString, "for an f.p. monoid with known generators",
|
|
276
|
+
[IsFpMonoid and HasGeneratorsOfMonoid],
|
|
277
|
+
function(M)
|
|
278
|
+
|
|
279
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
280
|
+
TryNextMethod();
|
|
281
|
+
fi;
|
|
282
|
+
|
|
283
|
+
return PRINT_STRINGIFY(
|
|
284
|
+
StringFormatted("\>\><fp monoid with {} and {} of length {}>\<\<",
|
|
285
|
+
Pluralize(Length(GeneratorsOfMonoid(M)), "generator"),
|
|
286
|
+
Pluralize(Length(RelationsOfFpMonoid(M)), "relation"),
|
|
287
|
+
Length(M)));
|
|
288
|
+
end);
|
|
289
|
+
|
|
290
|
+
InstallMethod(ViewObj, "for an f.p. monoid with known generators",
|
|
291
|
+
[IsFpMonoid and HasGeneratorsOfMonoid],
|
|
292
|
+
4, # to beat the library method
|
|
293
|
+
function(M)
|
|
294
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
295
|
+
TryNextMethod();
|
|
296
|
+
fi;
|
|
297
|
+
Print(ViewString(M));
|
|
298
|
+
end);
|
|
299
|
+
|
|
300
|
+
InstallMethod(String, "for an f.p. semigroup with known generators",
|
|
301
|
+
[IsFpSemigroup and HasGeneratorsOfSemigroup],
|
|
302
|
+
function(M)
|
|
303
|
+
|
|
304
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
305
|
+
TryNextMethod();
|
|
306
|
+
fi;
|
|
307
|
+
|
|
308
|
+
return PRINT_STRINGIFY(FreeSemigroupOfFpSemigroup(M),
|
|
309
|
+
" / ",
|
|
310
|
+
RelationsOfFpSemigroup(M));
|
|
311
|
+
end);
|
|
312
|
+
|
|
313
|
+
InstallMethod(PrintString, "for an f.p. semigroup with known generators",
|
|
314
|
+
[IsFpSemigroup and HasGeneratorsOfSemigroup],
|
|
315
|
+
SEMIGROUPS_FreeSemigroupMonoidString);
|
|
316
|
+
|
|
317
|
+
InstallMethod(PrintObj, "for an f.p. semigroup with known generators",
|
|
318
|
+
[IsFpSemigroup and HasGeneratorsOfSemigroup],
|
|
319
|
+
4, # to beat the library method
|
|
320
|
+
SEMIGROUPS_FreeSemigroupMonoidPrintObj);
|
|
321
|
+
|
|
322
|
+
InstallMethod(ViewString, "for an f.p. semigroup with known generators",
|
|
323
|
+
[IsFpSemigroup and HasGeneratorsOfSemigroup],
|
|
324
|
+
function(S)
|
|
325
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
326
|
+
TryNextMethod();
|
|
327
|
+
fi;
|
|
328
|
+
|
|
329
|
+
return PRINT_STRINGIFY(
|
|
330
|
+
StringFormatted("\>\><fp semigroup with {} and {} of length {}>\<\<",
|
|
331
|
+
Pluralize(Length(GeneratorsOfSemigroup(S)), "generator"),
|
|
332
|
+
Pluralize(Length(RelationsOfFpSemigroup(S)), "relation"),
|
|
333
|
+
Length(S)));
|
|
334
|
+
end);
|
|
335
|
+
|
|
336
|
+
InstallMethod(ViewObj,
|
|
337
|
+
"for an f.p. semigroup with known generators",
|
|
338
|
+
[IsFpSemigroup and HasGeneratorsOfSemigroup],
|
|
339
|
+
4, # to beat the library method
|
|
340
|
+
function(S)
|
|
341
|
+
if UserPreference("semigroups", "ViewObj") <> "semigroups-pkg" then
|
|
342
|
+
TryNextMethod();
|
|
343
|
+
fi;
|
|
344
|
+
Print(ViewString(S));
|
|
345
|
+
end);
|
|
346
|
+
|
|
347
|
+
InstallGlobalFunction(FreeMonoidAndAssignGeneratorVars,
|
|
348
|
+
function(arg...)
|
|
349
|
+
local F;
|
|
350
|
+
F := CallFuncList(FreeMonoid, arg);
|
|
351
|
+
AssignGeneratorVariables(F);
|
|
352
|
+
return F;
|
|
353
|
+
end);
|
|
354
|
+
|
|
355
|
+
InstallGlobalFunction(FreeSemigroupAndAssignGeneratorVars,
|
|
356
|
+
function(arg...)
|
|
357
|
+
local F;
|
|
358
|
+
F := CallFuncList(FreeSemigroup, arg);
|
|
359
|
+
AssignGeneratorVariables(F);
|
|
360
|
+
return F;
|
|
361
|
+
end);
|
|
362
|
+
|
|
363
|
+
########################################################################
|
|
364
|
+
# Random
|
|
365
|
+
########################################################################
|
|
366
|
+
|
|
367
|
+
InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
|
|
368
|
+
[IsFpSemigroup, IsList],
|
|
369
|
+
function(_, params)
|
|
370
|
+
if Length(params) < 1 then # nr gens
|
|
371
|
+
params[1] := Random(1, 20);
|
|
372
|
+
params[2] := Random(1, 8);
|
|
373
|
+
elif Length(params) < 2 then # degree
|
|
374
|
+
params[2] := Random(1, 8);
|
|
375
|
+
fi;
|
|
376
|
+
if not ForAll(params, IsPosInt) then
|
|
377
|
+
ErrorNoReturn("the arguments must be positive integers");
|
|
378
|
+
fi;
|
|
379
|
+
return params;
|
|
380
|
+
end);
|
|
381
|
+
|
|
382
|
+
InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
|
|
383
|
+
[IsFpMonoid, IsList],
|
|
384
|
+
{filt, params} -> SEMIGROUPS_ProcessRandomArgsCons(IsFpSemigroup, params));
|
|
385
|
+
|
|
386
|
+
# this doesn't work very well
|
|
387
|
+
|
|
388
|
+
InstallMethod(RandomSemigroupCons, "for IsFpSemigroup and a list",
|
|
389
|
+
[IsFpSemigroup, IsList],
|
|
390
|
+
function(filt, params)
|
|
391
|
+
return AsSemigroup(filt,
|
|
392
|
+
CallFuncList(RandomSemigroup,
|
|
393
|
+
Concatenation([IsTransformationSemigroup],
|
|
394
|
+
params)));
|
|
395
|
+
end);
|
|
396
|
+
|
|
397
|
+
# this doesn't work very well
|
|
398
|
+
|
|
399
|
+
InstallMethod(RandomMonoidCons, "for IsFpMonoid and a list",
|
|
400
|
+
[IsFpMonoid, IsList],
|
|
401
|
+
function(filt, params)
|
|
402
|
+
return AsMonoid(filt,
|
|
403
|
+
CallFuncList(RandomMonoid,
|
|
404
|
+
Concatenation([IsTransformationMonoid],
|
|
405
|
+
params)));
|
|
406
|
+
end);
|
|
407
|
+
|
|
408
|
+
# this doesn't work very well
|
|
409
|
+
|
|
410
|
+
InstallMethod(RandomInverseSemigroupCons, "for IsFpSemigroup and a list",
|
|
411
|
+
[IsFpSemigroup, IsList],
|
|
412
|
+
function(filt, params)
|
|
413
|
+
return AsSemigroup(filt,
|
|
414
|
+
CallFuncList(RandomInverseSemigroup,
|
|
415
|
+
Concatenation([IsPartialPermSemigroup],
|
|
416
|
+
params)));
|
|
417
|
+
end);
|
|
418
|
+
|
|
419
|
+
# this doesn't work very well
|
|
420
|
+
|
|
421
|
+
InstallMethod(RandomInverseMonoidCons, "for IsFpMonoid and a list",
|
|
422
|
+
[IsFpMonoid, IsList],
|
|
423
|
+
function(filt, params)
|
|
424
|
+
return AsMonoid(filt,
|
|
425
|
+
CallFuncList(RandomInverseMonoid,
|
|
426
|
+
Concatenation([IsPartialPermMonoid],
|
|
427
|
+
params)));
|
|
428
|
+
end);
|
|
429
|
+
|
|
430
|
+
InstallMethod(IsomorphismSemigroup, "for IsFpSemigroup and a semigroup",
|
|
431
|
+
[IsFpSemigroup, IsSemigroup],
|
|
432
|
+
{filt, S} -> IsomorphismFpSemigroup(S));
|
|
433
|
+
|
|
434
|
+
InstallMethod(AsMonoid, "for an fp semigroup",
|
|
435
|
+
[IsFpSemigroup],
|
|
436
|
+
function(S)
|
|
437
|
+
if MultiplicativeNeutralElement(S) = fail then
|
|
438
|
+
return fail; # so that we do the same as the GAP/ref manual says
|
|
439
|
+
fi;
|
|
440
|
+
return Range(IsomorphismMonoid(IsFpMonoid, S));
|
|
441
|
+
end);
|
|
442
|
+
|
|
443
|
+
InstallMethod(IsomorphismMonoid, "for IsFpMonoid and a semigroup",
|
|
444
|
+
[IsFpMonoid, IsSemigroup],
|
|
445
|
+
{filt, S} -> IsomorphismFpMonoid(S));
|
|
446
|
+
|
|
447
|
+
# same method for ideals
|
|
448
|
+
|
|
449
|
+
InstallMethod(IsomorphismFpSemigroup,
|
|
450
|
+
"for a semigroup with CanUseFroidurePin",
|
|
451
|
+
[CanUseFroidurePin],
|
|
452
|
+
function(S)
|
|
453
|
+
local rules, F, A, rels, Q, B, map, inv, result;
|
|
454
|
+
|
|
455
|
+
if not IsFinite(S) or not CanUseFroidurePin(S) then
|
|
456
|
+
TryNextMethod();
|
|
457
|
+
fi;
|
|
458
|
+
|
|
459
|
+
rules := RulesOfSemigroup(S);
|
|
460
|
+
|
|
461
|
+
F := FreeSemigroup(Length(GeneratorsOfSemigroup(S)));
|
|
462
|
+
A := GeneratorsOfSemigroup(F);
|
|
463
|
+
rels := List(rules, x -> [EvaluateWord(A, x[1]), EvaluateWord(A, x[2])]);
|
|
464
|
+
|
|
465
|
+
Q := F / rels;
|
|
466
|
+
B := GeneratorsOfSemigroup(Q);
|
|
467
|
+
|
|
468
|
+
map := x -> EvaluateWord(B, Factorization(S, x));
|
|
469
|
+
inv := x -> MappedWord(UnderlyingElement(x), A, GeneratorsOfSemigroup(S));
|
|
470
|
+
result := SemigroupIsomorphismByFunctionNC(S, Q, map, inv);
|
|
471
|
+
if IsTransformationSemigroup(S) or IsPartialPermSemigroup(S)
|
|
472
|
+
or IsBipartitionSemigroup(S) then
|
|
473
|
+
SetNiceMonomorphism(Q, InverseGeneralMapping(result));
|
|
474
|
+
fi;
|
|
475
|
+
if IsTransformationSemigroup(S) then
|
|
476
|
+
SetIsomorphismTransformationSemigroup(Q, InverseGeneralMapping(result));
|
|
477
|
+
elif IsPartialPermSemigroup(S) then
|
|
478
|
+
SetIsomorphismPartialPermSemigroup(Q, InverseGeneralMapping(result));
|
|
479
|
+
fi;
|
|
480
|
+
return result;
|
|
481
|
+
end);
|
|
482
|
+
|
|
483
|
+
# same method for ideals
|
|
484
|
+
|
|
485
|
+
InstallMethod(IsomorphismFpMonoid, "for a semigroup with CanUseFroidurePin",
|
|
486
|
+
[CanUseFroidurePin],
|
|
487
|
+
function(S)
|
|
488
|
+
local sgens, mgens, F, A, start, lookup, spos, mpos, pos, rules, rels,
|
|
489
|
+
convert, word, is_redundant, Q, map, inv, i, rule;
|
|
490
|
+
|
|
491
|
+
if not IsMonoidAsSemigroup(S) then
|
|
492
|
+
ErrorNoReturn("the 1st argument (a semigroup) must ",
|
|
493
|
+
"satisfy `IsMonoidAsSemigroup`");
|
|
494
|
+
elif not IsFinite(S) then
|
|
495
|
+
TryNextMethod();
|
|
496
|
+
fi;
|
|
497
|
+
|
|
498
|
+
sgens := GeneratorsOfSemigroup(S);
|
|
499
|
+
mgens := Filtered(sgens,
|
|
500
|
+
x -> x <> MultiplicativeNeutralElement(S));
|
|
501
|
+
|
|
502
|
+
F := FreeMonoid(Length(mgens));
|
|
503
|
+
A := GeneratorsOfMonoid(F);
|
|
504
|
+
start := [1 .. Length(sgens)] * 0;
|
|
505
|
+
lookup := [];
|
|
506
|
+
# make sure we map duplicate generators to the correct values
|
|
507
|
+
for i in [1 .. Length(sgens)] do
|
|
508
|
+
spos := Position(sgens, sgens[i]);
|
|
509
|
+
mpos := Position(mgens, sgens[i], start[spos]);
|
|
510
|
+
lookup[i] := mpos;
|
|
511
|
+
if mpos <> fail then
|
|
512
|
+
start[spos] := mpos;
|
|
513
|
+
fi;
|
|
514
|
+
od;
|
|
515
|
+
|
|
516
|
+
pos := Position(lookup, fail);
|
|
517
|
+
|
|
518
|
+
rules := RulesOfSemigroup(S);
|
|
519
|
+
rels := [];
|
|
520
|
+
|
|
521
|
+
# convert a word in GeneratorsOfSemigroup to a word in GeneratorsOfMonoid
|
|
522
|
+
convert := function(word)
|
|
523
|
+
local out, i;
|
|
524
|
+
out := One(F);
|
|
525
|
+
for i in word do
|
|
526
|
+
if lookup[i] <> fail then
|
|
527
|
+
out := out * A[lookup[i]];
|
|
528
|
+
fi;
|
|
529
|
+
od;
|
|
530
|
+
return out;
|
|
531
|
+
end;
|
|
532
|
+
|
|
533
|
+
if mgens = sgens then
|
|
534
|
+
# the identity is not a generator, so to avoid adjoining an additional
|
|
535
|
+
# identity in the output, we must add a relation equating the identity with
|
|
536
|
+
# a word in the generators.
|
|
537
|
+
word := Factorization(S, MultiplicativeNeutralElement(S));
|
|
538
|
+
Add(rels, [convert(word), One(F)]);
|
|
539
|
+
# Note that the previously line depends on Factorization always giving a
|
|
540
|
+
# factorization in the GeneratorsOfSemigroup(S), and not in
|
|
541
|
+
# GeneratorsOfMonoid(S) if S happens to be a monoid.
|
|
542
|
+
fi;
|
|
543
|
+
|
|
544
|
+
# check if a rule is a consequence of the relation (word = one)
|
|
545
|
+
is_redundant := function(rule)
|
|
546
|
+
local prefix, suffix, i;
|
|
547
|
+
if not IsBound(word) or Length(rule[1]) < Length(word) then
|
|
548
|
+
return false;
|
|
549
|
+
fi;
|
|
550
|
+
|
|
551
|
+
# check if <word> is a prefix
|
|
552
|
+
prefix := true;
|
|
553
|
+
for i in [1 .. Length(word)] do
|
|
554
|
+
if word[i] <> rule[1][i] then
|
|
555
|
+
prefix := false;
|
|
556
|
+
break;
|
|
557
|
+
fi;
|
|
558
|
+
od;
|
|
559
|
+
if prefix then
|
|
560
|
+
return rule[1]{[Length(word) + 1 .. Length(rule[1])]} = rule[2];
|
|
561
|
+
fi;
|
|
562
|
+
|
|
563
|
+
# check if <word> is a suffix
|
|
564
|
+
suffix := true;
|
|
565
|
+
for i in [1 .. Length(word)] do
|
|
566
|
+
if word[i] <> rule[1][i] then
|
|
567
|
+
suffix := false;
|
|
568
|
+
break;
|
|
569
|
+
fi;
|
|
570
|
+
od;
|
|
571
|
+
if suffix then
|
|
572
|
+
return rule[1]{[1 .. Length(rule[1]) - Length(word)]} = rule[2];
|
|
573
|
+
fi;
|
|
574
|
+
return false;
|
|
575
|
+
end;
|
|
576
|
+
|
|
577
|
+
for rule in rules do
|
|
578
|
+
# only include non-redundant rules
|
|
579
|
+
if (Length(rule[1]) <> 2
|
|
580
|
+
or (rule[1][1] <> pos and rule[1][Length(rule[1])] <> pos))
|
|
581
|
+
and (not is_redundant(rule)) then
|
|
582
|
+
Add(rels, [convert(rule[1]), convert(rule[2])]);
|
|
583
|
+
fi;
|
|
584
|
+
od;
|
|
585
|
+
|
|
586
|
+
Q := F / rels;
|
|
587
|
+
|
|
588
|
+
if sgens = mgens then
|
|
589
|
+
map := x -> EvaluateWord(GeneratorsOfMonoid(Q),
|
|
590
|
+
Factorization(S, x));
|
|
591
|
+
else
|
|
592
|
+
map := x -> EvaluateWord(GeneratorsOfSemigroup(Q),
|
|
593
|
+
Factorization(S, x));
|
|
594
|
+
fi;
|
|
595
|
+
|
|
596
|
+
inv := function(x)
|
|
597
|
+
if not IsOne(UnderlyingElement(x)) then
|
|
598
|
+
return MappedWord(UnderlyingElement(x), A, mgens);
|
|
599
|
+
fi;
|
|
600
|
+
return MultiplicativeNeutralElement(S);
|
|
601
|
+
end;
|
|
602
|
+
|
|
603
|
+
return SemigroupIsomorphismByFunctionNC(S, Q, map, inv);
|
|
604
|
+
end);
|
|
605
|
+
|
|
606
|
+
InstallMethod(AssignGeneratorVariables, "for a free semigroup",
|
|
607
|
+
[IsFreeSemigroup],
|
|
608
|
+
function(S)
|
|
609
|
+
DoAssignGenVars(GeneratorsOfSemigroup(S));
|
|
610
|
+
end);
|
|
611
|
+
|
|
612
|
+
InstallMethod(AssignGeneratorVariables, "for an free monoid",
|
|
613
|
+
[IsFreeMonoid],
|
|
614
|
+
function(S)
|
|
615
|
+
DoAssignGenVars(GeneratorsOfMonoid(S));
|
|
616
|
+
end);
|
|
617
|
+
|
|
618
|
+
InstallMethod(AssignGeneratorVariables, "for an fp semigroup",
|
|
619
|
+
[IsFpSemigroup],
|
|
620
|
+
function(S)
|
|
621
|
+
DoAssignGenVars(GeneratorsOfSemigroup(S));
|
|
622
|
+
end);
|
|
623
|
+
|
|
624
|
+
InstallMethod(AssignGeneratorVariables, "for an fp monoid",
|
|
625
|
+
[IsFpMonoid],
|
|
626
|
+
function(S)
|
|
627
|
+
DoAssignGenVars(GeneratorsOfMonoid(S));
|
|
628
|
+
end);
|
|
629
|
+
|
|
630
|
+
InstallMethod(IsomorphismFpSemigroup, "for a group",
|
|
631
|
+
[IsGroup],
|
|
632
|
+
function(G)
|
|
633
|
+
local iso1, inv1, iso2, inv2;
|
|
634
|
+
# The next clause shouldn't be required, but for some reason in GAP 4.10 the
|
|
635
|
+
# rank of the method for IsomorphismFpMonoid for IsFpGroup is lower than this
|
|
636
|
+
# methods rank.
|
|
637
|
+
if IsFpGroup(G) then
|
|
638
|
+
TryNextMethod();
|
|
639
|
+
fi;
|
|
640
|
+
|
|
641
|
+
iso1 := IsomorphismFpGroup(G);
|
|
642
|
+
inv1 := InverseGeneralMapping(iso1);
|
|
643
|
+
# TODO(later) the method for IsomorphismFpSemigroup uses the generators of G
|
|
644
|
+
# and their inverses, since we know that G is finite this could be avoided.
|
|
645
|
+
iso2 := IsomorphismFpSemigroup(Range(iso1));
|
|
646
|
+
inv2 := InverseGeneralMapping(iso2);
|
|
647
|
+
|
|
648
|
+
return SemigroupIsomorphismByFunctionNC(G,
|
|
649
|
+
Range(iso2),
|
|
650
|
+
x -> (x ^ iso1) ^ iso2,
|
|
651
|
+
x -> (x ^ inv2) ^ inv1);
|
|
652
|
+
end);
|
|
653
|
+
|
|
654
|
+
InstallMethod(IsomorphismFpSemigroup, "for a free semigroup",
|
|
655
|
+
[IsFreeSemigroup],
|
|
656
|
+
function(S)
|
|
657
|
+
local T;
|
|
658
|
+
T := S / [];
|
|
659
|
+
return SemigroupIsomorphismByImagesNC(S,
|
|
660
|
+
T,
|
|
661
|
+
GeneratorsOfSemigroup(S),
|
|
662
|
+
GeneratorsOfSemigroup(T));
|
|
663
|
+
end);
|
|
664
|
+
|
|
665
|
+
InstallMethod(IsomorphismFpMonoid, "for a free monoid",
|
|
666
|
+
[IsFreeMonoid],
|
|
667
|
+
function(S)
|
|
668
|
+
local T;
|
|
669
|
+
T := S / [];
|
|
670
|
+
return SemigroupIsomorphismByImagesNC(S,
|
|
671
|
+
T,
|
|
672
|
+
GeneratorsOfMonoid(S),
|
|
673
|
+
GeneratorsOfMonoid(T));
|
|
674
|
+
end);
|
|
675
|
+
|
|
676
|
+
InstallMethod(IsomorphismFpSemigroup, "for a free monoid",
|
|
677
|
+
[IsFreeMonoid],
|
|
678
|
+
function(S)
|
|
679
|
+
local map1, map2;
|
|
680
|
+
map1 := IsomorphismFpMonoid(S);
|
|
681
|
+
map2 := IsomorphismFpSemigroup(Range(map1));
|
|
682
|
+
return CompositionMapping(map2, map1);
|
|
683
|
+
end);
|
|
684
|
+
|
|
685
|
+
InstallMethod(IsomorphismFpSemigroup, "for an fp semigroup",
|
|
686
|
+
[IsFpSemigroup],
|
|
687
|
+
function(S)
|
|
688
|
+
return SemigroupIsomorphismByImagesNC(S,
|
|
689
|
+
S,
|
|
690
|
+
GeneratorsOfSemigroup(S),
|
|
691
|
+
GeneratorsOfSemigroup(S));
|
|
692
|
+
end);
|
|
693
|
+
|
|
694
|
+
InstallMethod(IsomorphismFpMonoid, "for an fp monoid",
|
|
695
|
+
[IsFpMonoid],
|
|
696
|
+
function(M)
|
|
697
|
+
return SemigroupIsomorphismByImagesNC(M,
|
|
698
|
+
M,
|
|
699
|
+
GeneratorsOfSemigroup(M),
|
|
700
|
+
GeneratorsOfSemigroup(M));
|
|
701
|
+
end);
|
|
702
|
+
|
|
703
|
+
# The next method is copied directly from the GAP library the only change is
|
|
704
|
+
# the return value which uses SemigroupIsomorphismByFunctionNC here but
|
|
705
|
+
# MagmaIsomorphismByFunctionsNC in the GAP library; comments are also removed
|
|
706
|
+
# and other superficial changes to adhere to Semigroups package conventions.
|
|
707
|
+
|
|
708
|
+
InstallMethod(IsomorphismFpSemigroup, "for an fp group", [IsFpGroup],
|
|
709
|
+
function(G)
|
|
710
|
+
local freegp, gensfreegp, freesmg, gensfreesmg, idgen, newrels, rels, smgrel,
|
|
711
|
+
semi, gens, isomfun, id, invfun, i, rel;
|
|
712
|
+
|
|
713
|
+
freegp := FreeGroupOfFpGroup(G);
|
|
714
|
+
|
|
715
|
+
gensfreegp := List(GeneratorsOfSemigroup(freegp), String);
|
|
716
|
+
freesmg := FreeSemigroup(gensfreegp{[1 .. Length(gensfreegp)]});
|
|
717
|
+
|
|
718
|
+
gensfreesmg := GeneratorsOfSemigroup(freesmg);
|
|
719
|
+
idgen := gensfreesmg[1];
|
|
720
|
+
|
|
721
|
+
newrels := [[idgen * idgen, idgen]];
|
|
722
|
+
for i in [2 .. Length(gensfreesmg)] do
|
|
723
|
+
Add(newrels, [idgen * gensfreesmg[i], gensfreesmg[i]]);
|
|
724
|
+
Add(newrels, [gensfreesmg[i] * idgen, gensfreesmg[i]]);
|
|
725
|
+
od;
|
|
726
|
+
|
|
727
|
+
# then relations gens * gens ^ -1 = idgen (and the other way around)
|
|
728
|
+
for i in [2 .. Length(gensfreesmg)] do
|
|
729
|
+
if IsOddInt(i) then
|
|
730
|
+
Add(newrels, [gensfreesmg[i] * gensfreesmg[i - 1], idgen]);
|
|
731
|
+
else
|
|
732
|
+
Add(newrels, [gensfreesmg[i] * gensfreesmg[i + 1], idgen]);
|
|
733
|
+
fi;
|
|
734
|
+
od;
|
|
735
|
+
|
|
736
|
+
rels := RelatorsOfFpGroup(G);
|
|
737
|
+
for rel in rels do
|
|
738
|
+
smgrel := [Gpword2MSword(idgen, rel, 1), idgen];
|
|
739
|
+
Add(newrels, smgrel);
|
|
740
|
+
od;
|
|
741
|
+
|
|
742
|
+
# finally create the fp semigroup
|
|
743
|
+
semi := FactorFreeSemigroupByRelations(freesmg, newrels);
|
|
744
|
+
gens := GeneratorsOfSemigroup(semi);
|
|
745
|
+
|
|
746
|
+
isomfun := x -> ElementOfFpSemigroup(FamilyObj(gens[1]),
|
|
747
|
+
Gpword2MSword(idgen, UnderlyingElement(x), 1));
|
|
748
|
+
|
|
749
|
+
id := One(freegp);
|
|
750
|
+
invfun := x -> ElementOfFpGroup(FamilyObj(One(G)),
|
|
751
|
+
MSword2gpword(id, UnderlyingElement(x), 1));
|
|
752
|
+
|
|
753
|
+
return SemigroupIsomorphismByFunctionNC(G, semi, isomfun, invfun);
|
|
754
|
+
end);
|
|
755
|
+
|
|
756
|
+
# The next method is copied directly from the GAP library the only change is
|
|
757
|
+
# the return value which uses SemigroupIsomorphismByFunctionNC here but
|
|
758
|
+
# MagmaIsomorphismByFunctionsNC in the GAP library; comments are also removed
|
|
759
|
+
# and other superficial changes to adhere to Semigroups package conventions.
|
|
760
|
+
|
|
761
|
+
InstallMethod(IsomorphismFpMonoid, "for an fp group", [IsFpGroup],
|
|
762
|
+
function(G)
|
|
763
|
+
local freegp, gens, mongens, s, t, p, freemon, gensmon, id, newrels, rels, w,
|
|
764
|
+
monrel, mon, monfam, isomfun, idg, invfun, hom, i, j, rel;
|
|
765
|
+
|
|
766
|
+
freegp := FreeGroupOfFpGroup(G);
|
|
767
|
+
gens := GeneratorsOfGroup(G);
|
|
768
|
+
|
|
769
|
+
mongens := [];
|
|
770
|
+
for i in gens do
|
|
771
|
+
s := String(i);
|
|
772
|
+
Add(mongens, s);
|
|
773
|
+
if ForAll(s, x -> x in CHARS_UALPHA or x in CHARS_LALPHA) then
|
|
774
|
+
# inverse: change casification
|
|
775
|
+
t := "";
|
|
776
|
+
for j in [1 .. Length(s)] do
|
|
777
|
+
p := Position(CHARS_LALPHA, s[j]);
|
|
778
|
+
if p <> fail then
|
|
779
|
+
Add(t, CHARS_UALPHA[p]);
|
|
780
|
+
else
|
|
781
|
+
p := Position(CHARS_UALPHA, s[j]);
|
|
782
|
+
Add(t, CHARS_LALPHA[p]);
|
|
783
|
+
fi;
|
|
784
|
+
od;
|
|
785
|
+
s := t;
|
|
786
|
+
else
|
|
787
|
+
s := Concatenation(s, "^-1");
|
|
788
|
+
fi;
|
|
789
|
+
Add(mongens, s);
|
|
790
|
+
od;
|
|
791
|
+
|
|
792
|
+
freemon := FreeMonoid(mongens);
|
|
793
|
+
gensmon := GeneratorsOfMonoid(freemon);
|
|
794
|
+
id := Identity(freemon);
|
|
795
|
+
newrels := [];
|
|
796
|
+
# inverse relators
|
|
797
|
+
for i in [1 .. Length(gens)] do
|
|
798
|
+
Add(newrels, [gensmon[2 * i - 1] * gensmon[2 * i], id]);
|
|
799
|
+
Add(newrels, [gensmon[2 * i] * gensmon[2 * i - 1], id]);
|
|
800
|
+
od;
|
|
801
|
+
|
|
802
|
+
rels := ValueOption("relations");
|
|
803
|
+
if rels = fail then
|
|
804
|
+
rels := RelatorsOfFpGroup(G);
|
|
805
|
+
for rel in rels do
|
|
806
|
+
w := rel;
|
|
807
|
+
w := GroupwordToMonword(id, w);
|
|
808
|
+
monrel := [w, id];
|
|
809
|
+
Add(newrels, monrel);
|
|
810
|
+
od;
|
|
811
|
+
else
|
|
812
|
+
if not ForAll(Flat(rels), x -> x in FreeGroupOfFpGroup(G)) then
|
|
813
|
+
Info(InfoFpGroup, 1, "Converting relation words into free group");
|
|
814
|
+
rels := List(rels, i -> List(i, UnderlyingElement));
|
|
815
|
+
fi;
|
|
816
|
+
for rel in rels do
|
|
817
|
+
Add(newrels, List(rel, x -> GroupwordToMonword(id, x)));
|
|
818
|
+
od;
|
|
819
|
+
fi;
|
|
820
|
+
|
|
821
|
+
mon := FactorFreeMonoidByRelations(freemon, newrels);
|
|
822
|
+
gens := GeneratorsOfMonoid(mon);
|
|
823
|
+
monfam := FamilyObj(Representative(mon));
|
|
824
|
+
|
|
825
|
+
isomfun := x -> ElementOfFpMonoid(monfam,
|
|
826
|
+
GroupwordToMonword(id, UnderlyingElement(x)));
|
|
827
|
+
|
|
828
|
+
idg := One(freegp);
|
|
829
|
+
invfun := x -> ElementOfFpGroup(FamilyObj(One(G)),
|
|
830
|
+
MonwordToGroupword(idg, UnderlyingElement(x)));
|
|
831
|
+
hom := SemigroupIsomorphismByFunctionNC(G, mon, isomfun, invfun);
|
|
832
|
+
hom!.type := 1;
|
|
833
|
+
if not HasIsomorphismFpMonoid(G) then
|
|
834
|
+
SetIsomorphismFpMonoid(G, hom);
|
|
835
|
+
fi;
|
|
836
|
+
return hom;
|
|
837
|
+
end);
|
|
838
|
+
|
|
839
|
+
# The next method is copied directly from the GAP library the only change is
|
|
840
|
+
# the return value which uses SemigroupIsomorphismByFunctionNC here but
|
|
841
|
+
# MagmaIsomorphismByFunctionsNC in the GAP library; comments are also removed
|
|
842
|
+
# and other superficial changes to adhere to Semigroups package conventions.
|
|
843
|
+
|
|
844
|
+
InstallMethod(IsomorphismFpSemigroup, "for an fp monoid", [IsFpMonoid],
|
|
845
|
+
function(M)
|
|
846
|
+
local AddToExtRep, FMtoFS, FStoFM, FM, FS, id, rels, next, S, map, inv, x,
|
|
847
|
+
rel;
|
|
848
|
+
|
|
849
|
+
AddToExtRep := function(w, id, val)
|
|
850
|
+
local wlist, i;
|
|
851
|
+
|
|
852
|
+
wlist := ExtRepOfObj(w);
|
|
853
|
+
wlist := ShallowCopy(wlist);
|
|
854
|
+
for i in [1 .. 1 / 2 * (Length(wlist))] do
|
|
855
|
+
wlist[2 * i - 1] := wlist[2 * i - 1] + val;
|
|
856
|
+
od;
|
|
857
|
+
|
|
858
|
+
return ObjByExtRep(FamilyObj(id), wlist);
|
|
859
|
+
end;
|
|
860
|
+
|
|
861
|
+
FMtoFS := function(id, w)
|
|
862
|
+
if IsOne(w) then
|
|
863
|
+
return id;
|
|
864
|
+
fi;
|
|
865
|
+
return AddToExtRep(w, id, 1);
|
|
866
|
+
end;
|
|
867
|
+
|
|
868
|
+
FStoFM := function(id, w)
|
|
869
|
+
if ExtRepOfObj(w) = [1, 1] then
|
|
870
|
+
return id;
|
|
871
|
+
fi;
|
|
872
|
+
return AddToExtRep(w, id, -1);
|
|
873
|
+
end;
|
|
874
|
+
|
|
875
|
+
FM := FreeMonoidOfFpMonoid(M);
|
|
876
|
+
FS := FreeSemigroup(List(GeneratorsOfSemigroup(FM), String));
|
|
877
|
+
|
|
878
|
+
id := FS.(Position(GeneratorsOfSemigroup(FM), One(FM)));
|
|
879
|
+
|
|
880
|
+
rels := [[id * id, id]];
|
|
881
|
+
for x in GeneratorsOfSemigroup(FS) do
|
|
882
|
+
if x <> id then
|
|
883
|
+
Add(rels, [id * x, x]);
|
|
884
|
+
Add(rels, [x * id, x]);
|
|
885
|
+
fi;
|
|
886
|
+
od;
|
|
887
|
+
|
|
888
|
+
for rel in RelationsOfFpMonoid(M) do
|
|
889
|
+
next := [FMtoFS(id, rel[1]), FMtoFS(id, rel[2])];
|
|
890
|
+
Add(rels, next);
|
|
891
|
+
od;
|
|
892
|
+
|
|
893
|
+
S := FS / rels;
|
|
894
|
+
|
|
895
|
+
map := x -> ElementOfFpSemigroup(FamilyObj(S.1),
|
|
896
|
+
FMtoFS(id, UnderlyingElement(x)));
|
|
897
|
+
|
|
898
|
+
inv := x -> Image(NaturalHomomorphismByGenerators(FM, M),
|
|
899
|
+
FStoFM(One(FM), UnderlyingElement(x)));
|
|
900
|
+
|
|
901
|
+
return SemigroupIsomorphismByFunctionNC(M, S, map, inv);
|
|
902
|
+
end);
|
|
903
|
+
|
|
904
|
+
InstallMethod(IsomorphismFpMonoid, "for a group", [IsGroup],
|
|
905
|
+
function(G)
|
|
906
|
+
local iso1, inv1, iso2, inv2;
|
|
907
|
+
# The next clause shouldn't be required, but for some reason in GAP 4.10 the
|
|
908
|
+
# rank of the method for IsomorphismFpMonoid for IsFpGroup is lower than this
|
|
909
|
+
# methods rank.
|
|
910
|
+
if IsFpGroup(G) then
|
|
911
|
+
TryNextMethod();
|
|
912
|
+
fi;
|
|
913
|
+
iso1 := IsomorphismFpGroup(G);
|
|
914
|
+
inv1 := InverseGeneralMapping(iso1);
|
|
915
|
+
# TODO(later) the method for IsomorphismFpMonoid uses the generators of G and
|
|
916
|
+
# their inverses, since we know that G is finite this could be avoided.
|
|
917
|
+
iso2 := IsomorphismFpMonoid(Range(iso1));
|
|
918
|
+
inv2 := InverseGeneralMapping(iso2);
|
|
919
|
+
|
|
920
|
+
return SemigroupIsomorphismByFunctionNC(G,
|
|
921
|
+
Range(iso2),
|
|
922
|
+
x -> (x ^ iso1) ^ iso2,
|
|
923
|
+
x -> (x ^ inv2) ^ inv1);
|
|
924
|
+
end);
|
|
925
|
+
|
|
926
|
+
SEMIGROUPS.ExtRepObjToWord := function(ext_rep_obj)
|
|
927
|
+
local n, word, val, pow, i;
|
|
928
|
+
n := Length(ext_rep_obj);
|
|
929
|
+
word := [];
|
|
930
|
+
for i in [1, 3 .. n - 1] do
|
|
931
|
+
val := ext_rep_obj[i];
|
|
932
|
+
pow := ext_rep_obj[i + 1];
|
|
933
|
+
while pow > 0 do
|
|
934
|
+
Add(word, val);
|
|
935
|
+
pow := pow - 1;
|
|
936
|
+
od;
|
|
937
|
+
od;
|
|
938
|
+
return word;
|
|
939
|
+
end;
|
|
940
|
+
|
|
941
|
+
SEMIGROUPS.WordToExtRepObj := function(word)
|
|
942
|
+
local ext_rep_obj, i, j;
|
|
943
|
+
ext_rep_obj := [];
|
|
944
|
+
i := 1;
|
|
945
|
+
j := 1;
|
|
946
|
+
|
|
947
|
+
while i <= Length(word) do
|
|
948
|
+
Add(ext_rep_obj, word[i]);
|
|
949
|
+
Add(ext_rep_obj, 1);
|
|
950
|
+
i := i + 1;
|
|
951
|
+
while i <= Length(word) and word[i] = ext_rep_obj[j] do
|
|
952
|
+
ext_rep_obj[j + 1] := ext_rep_obj[j + 1] + 1;
|
|
953
|
+
i := i + 1;
|
|
954
|
+
od;
|
|
955
|
+
j := j + 2;
|
|
956
|
+
od;
|
|
957
|
+
return ext_rep_obj;
|
|
958
|
+
end;
|
|
959
|
+
|
|
960
|
+
SEMIGROUPS.ExtRepObjToString := function(ext_rep_obj)
|
|
961
|
+
local alphabet, out, i;
|
|
962
|
+
alphabet := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
963
|
+
out := "";
|
|
964
|
+
for i in [1, 3 .. Length(ext_rep_obj) - 1] do
|
|
965
|
+
if ext_rep_obj[i] > Length(alphabet) then
|
|
966
|
+
ErrorNoReturn("the maximum value in an odd position of the ",
|
|
967
|
+
"argument must be at most ", Length(alphabet));
|
|
968
|
+
fi;
|
|
969
|
+
Add(out, alphabet[ext_rep_obj[i]]);
|
|
970
|
+
if ext_rep_obj[i + 1] > 1 then
|
|
971
|
+
Append(out, " ^ ");
|
|
972
|
+
Append(out, String(ext_rep_obj[i + 1]));
|
|
973
|
+
fi;
|
|
974
|
+
od;
|
|
975
|
+
return out;
|
|
976
|
+
end;
|
|
977
|
+
|
|
978
|
+
SEMIGROUPS.WordToString := function(word)
|
|
979
|
+
local alphabet, out, letter;
|
|
980
|
+
alphabet := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
981
|
+
out := "";
|
|
982
|
+
for letter in word do
|
|
983
|
+
if letter > Length(alphabet) then
|
|
984
|
+
ErrorNoReturn("the argument be at most ", Length(alphabet));
|
|
985
|
+
fi;
|
|
986
|
+
Add(out, alphabet[letter]);
|
|
987
|
+
od;
|
|
988
|
+
return out;
|
|
989
|
+
end;
|
|
990
|
+
|
|
991
|
+
# This method is based on the following paper
|
|
992
|
+
# Presentations of Factorizable Inverse Monoids
|
|
993
|
+
# David Easdown, James East, and D. G. FitzGerald
|
|
994
|
+
# July 19, 2004
|
|
995
|
+
InstallMethod(IsomorphismFpSemigroup,
|
|
996
|
+
"for an inverse partial perm semigroup",
|
|
997
|
+
[IsPartialPermSemigroup and IsInverseActingSemigroupRep],
|
|
998
|
+
function(M)
|
|
999
|
+
local add_to_odd_positions, S, SS, G, GG, s, g, F, rels, fam, alpha,
|
|
1000
|
+
beta, lhs, rhs, map, H, o, comp, U, rhs_list, conj, MF, T, inv, rel, x, y, m,
|
|
1001
|
+
i;
|
|
1002
|
+
|
|
1003
|
+
if not IsFactorisableInverseMonoid(M) then
|
|
1004
|
+
TryNextMethod();
|
|
1005
|
+
fi;
|
|
1006
|
+
|
|
1007
|
+
add_to_odd_positions := function(list, s)
|
|
1008
|
+
list{[1, 3 .. Length(list) - 1]} := list{[1, 3 .. Length(list) - 1]} + s;
|
|
1009
|
+
return list;
|
|
1010
|
+
end;
|
|
1011
|
+
|
|
1012
|
+
S := Semigroup(IdempotentGeneratedSubsemigroup(M));
|
|
1013
|
+
SS := GeneratorsOfSemigroup(S);
|
|
1014
|
+
G := GroupOfUnits(M);
|
|
1015
|
+
GG := GeneratorsOfSemigroup(G);
|
|
1016
|
+
s := Length(GeneratorsOfSemigroup(S));
|
|
1017
|
+
g := Length(GeneratorsOfSemigroup(G));
|
|
1018
|
+
|
|
1019
|
+
F := FreeSemigroup(s + g);
|
|
1020
|
+
rels := [];
|
|
1021
|
+
fam := ElementsFamily(FamilyObj(F));
|
|
1022
|
+
|
|
1023
|
+
# R_S - semigroup relations for the idempotent generated subsemigroup
|
|
1024
|
+
alpha := IsomorphismFpSemigroup(S);
|
|
1025
|
+
for rel in RelationsOfFpSemigroup(Image(alpha)) do
|
|
1026
|
+
Add(rels, [ObjByExtRep(fam, ExtRepOfObj(rel[1])),
|
|
1027
|
+
ObjByExtRep(fam, ExtRepOfObj(rel[2]))]);
|
|
1028
|
+
od;
|
|
1029
|
+
|
|
1030
|
+
# R_G - semigroup relations for the group of units
|
|
1031
|
+
beta := IsomorphismFpSemigroup(G);
|
|
1032
|
+
for rel in RelationsOfFpSemigroup(Image(beta)) do
|
|
1033
|
+
lhs := add_to_odd_positions(ShallowCopy(ExtRepOfObj(rel[1])), s);
|
|
1034
|
+
rhs := add_to_odd_positions(ShallowCopy(ExtRepOfObj(rel[2])), s);
|
|
1035
|
+
Add(rels, [ObjByExtRep(fam, lhs), ObjByExtRep(fam, rhs)]);
|
|
1036
|
+
od;
|
|
1037
|
+
|
|
1038
|
+
# R_product - see page 4 of the paper
|
|
1039
|
+
for x in [1 .. s] do
|
|
1040
|
+
for y in [1 .. g] do
|
|
1041
|
+
rhs := Factorization(S, SS[x] ^ (GG[y] ^ -1));
|
|
1042
|
+
Add(rels, [F.(s + y) * F.(x),
|
|
1043
|
+
EvaluateWord(GeneratorsOfSemigroup(F), rhs) * F.(s + y)]);
|
|
1044
|
+
od;
|
|
1045
|
+
od;
|
|
1046
|
+
|
|
1047
|
+
map := InverseGeneralMapping(IsomorphismPermGroup(G));
|
|
1048
|
+
H := Source(map);
|
|
1049
|
+
o := Enumerate(LambdaOrb(M));
|
|
1050
|
+
# R_tilde - see page 4 of the paper
|
|
1051
|
+
for m in [2 .. Length(OrbSCC(o))] do
|
|
1052
|
+
comp := OrbSCC(o)[m];
|
|
1053
|
+
U := SmallGeneratingSet(Stabilizer(H,
|
|
1054
|
+
PartialPerm(o[comp[1]], o[comp[1]]),
|
|
1055
|
+
OnRight));
|
|
1056
|
+
|
|
1057
|
+
for i in comp do
|
|
1058
|
+
rhs_list := Factorization(S, PartialPerm(o[i], o[i]));
|
|
1059
|
+
rhs := EvaluateWord(GeneratorsOfSemigroup(F), rhs_list);
|
|
1060
|
+
conj := MappingPermListList(o[comp[1]], o[i]);
|
|
1061
|
+
for x in List(U, x -> x ^ conj) do
|
|
1062
|
+
lhs := ShallowCopy(rhs_list);
|
|
1063
|
+
Append(lhs, Factorization(G, x ^ map) + s);
|
|
1064
|
+
Add(rels, [EvaluateWord(GeneratorsOfSemigroup(F), lhs), rhs]);
|
|
1065
|
+
od;
|
|
1066
|
+
od;
|
|
1067
|
+
od;
|
|
1068
|
+
|
|
1069
|
+
# Relation to identify One(G) and One(S)
|
|
1070
|
+
Add(rels, [EvaluateWord(GeneratorsOfSemigroup(F),
|
|
1071
|
+
Factorization(G, One(G)) + s),
|
|
1072
|
+
EvaluateWord(GeneratorsOfSemigroup(F),
|
|
1073
|
+
Factorization(S, One(S)))]);
|
|
1074
|
+
|
|
1075
|
+
MF := F / rels; # FpSemigroup which is isomorphic to M, with different gens.
|
|
1076
|
+
fam := ElementsFamily(FamilyObj(MF));
|
|
1077
|
+
T := Semigroup(Concatenation(SS, GG)); # M with isomorphic generators to MF
|
|
1078
|
+
map := x -> ElementOfFpSemigroup(fam, EvaluateWord(GeneratorsOfSemigroup(F),
|
|
1079
|
+
Factorization(T, x)));
|
|
1080
|
+
inv := x -> EvaluateWord(GeneratorsOfSemigroup(T),
|
|
1081
|
+
SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x)));
|
|
1082
|
+
|
|
1083
|
+
return SemigroupIsomorphismByFunctionNC(M, MF, map, inv);
|
|
1084
|
+
end);
|
|
1085
|
+
|
|
1086
|
+
InstallMethod(ParseRelations,
|
|
1087
|
+
"for a list of free generators and a string",
|
|
1088
|
+
[IsDenseList, IsString],
|
|
1089
|
+
function(gens, inputstring)
|
|
1090
|
+
local newinputstring, g, chartoel, RemoveBrackets, ParseRelation, output,
|
|
1091
|
+
chars;
|
|
1092
|
+
|
|
1093
|
+
for g in gens do
|
|
1094
|
+
g := String(g);
|
|
1095
|
+
if Size(g) <> 1 or not IsAlphaChar(g[1]) then
|
|
1096
|
+
ErrorNoReturn(
|
|
1097
|
+
"expected the 1st argument to be a list of a free semigroup or monoid ",
|
|
1098
|
+
"generators represented by a single alphabet letter but found ",
|
|
1099
|
+
String(g));
|
|
1100
|
+
fi;
|
|
1101
|
+
od;
|
|
1102
|
+
|
|
1103
|
+
newinputstring := Filtered(inputstring, x -> x <> ' ');
|
|
1104
|
+
chars := List(gens, x -> String(x)[1]);
|
|
1105
|
+
if PositionSublist(newinputstring, "=1") <> fail then
|
|
1106
|
+
Add(chars, '1');
|
|
1107
|
+
fi;
|
|
1108
|
+
|
|
1109
|
+
for g in chars do
|
|
1110
|
+
newinputstring := ReplacedString(newinputstring,
|
|
1111
|
+
[g, '^'],
|
|
1112
|
+
['(', g, ')', '^']);
|
|
1113
|
+
newinputstring := ReplacedString(newinputstring,
|
|
1114
|
+
Concatenation(['(', g, ')'], "^1="),
|
|
1115
|
+
['(', g, ')', '=']);
|
|
1116
|
+
newinputstring := ReplacedString(newinputstring,
|
|
1117
|
+
Concatenation(['(', g, ')'], "^1)"),
|
|
1118
|
+
['(', g, ')', ')']);
|
|
1119
|
+
newinputstring := ReplacedString(newinputstring,
|
|
1120
|
+
Concatenation(['(', g, ')'], "^1("),
|
|
1121
|
+
['(', g, ')', '(']);
|
|
1122
|
+
|
|
1123
|
+
od;
|
|
1124
|
+
|
|
1125
|
+
RemoveBrackets := function(word)
|
|
1126
|
+
local i, product, lbracket, rbracket, nestcount, index, p, chartoel;
|
|
1127
|
+
if word = "" then
|
|
1128
|
+
ErrorNoReturn("expected the 2nd argument to be",
|
|
1129
|
+
" a string listing the relations of a semigroup",
|
|
1130
|
+
" but found an = symbol which isn't pairing two",
|
|
1131
|
+
" words");
|
|
1132
|
+
fi;
|
|
1133
|
+
|
|
1134
|
+
# if the number of left brackets is different from the number of right
|
|
1135
|
+
# brackets they can't possibly pair up
|
|
1136
|
+
if Number(word, x -> x = '(') <> Number(word, x -> x = ')') then
|
|
1137
|
+
ErrorNoReturn("expected the number of open brackets",
|
|
1138
|
+
" to match the number of closed brackets");
|
|
1139
|
+
fi;
|
|
1140
|
+
|
|
1141
|
+
# if the ^ is at the end of the string there is no exponent.
|
|
1142
|
+
# if the ^ is at the start of the string there is no base.
|
|
1143
|
+
if word[1] = '^' then
|
|
1144
|
+
ErrorNoReturn("expected ^ to be preceded by a ) or",
|
|
1145
|
+
" a generator but found beginning of string");
|
|
1146
|
+
elif word[Size(word)] = '^' then
|
|
1147
|
+
ErrorNoReturn("expected ^ to be followed by a ",
|
|
1148
|
+
"positive integer but found end of string");
|
|
1149
|
+
fi;
|
|
1150
|
+
# checks that all ^s have an exponent.
|
|
1151
|
+
for index in [1 .. Size(word)] do
|
|
1152
|
+
if word[index] = '^' then
|
|
1153
|
+
if not word[index + 1] in "0123456789" then
|
|
1154
|
+
ErrorNoReturn("expected ^ to be followed by",
|
|
1155
|
+
" a positive integer but found ", [word[index + 1]]);
|
|
1156
|
+
fi;
|
|
1157
|
+
if word[index - 1] in "0123456789^(" then
|
|
1158
|
+
ErrorNoReturn(
|
|
1159
|
+
"expected ^ to be preceded by a ) or a generator",
|
|
1160
|
+
" but found ", [word[index - 1]]);
|
|
1161
|
+
fi;
|
|
1162
|
+
fi;
|
|
1163
|
+
od;
|
|
1164
|
+
|
|
1165
|
+
# converts a character to the element it represents
|
|
1166
|
+
chartoel := function(char)
|
|
1167
|
+
local i;
|
|
1168
|
+
for i in [1 .. Size(gens)] do
|
|
1169
|
+
if char = String(gens[i])[1] then
|
|
1170
|
+
return gens[i];
|
|
1171
|
+
fi;
|
|
1172
|
+
od;
|
|
1173
|
+
if char = '1' and IsAssocWordWithOne(gens[1]) then
|
|
1174
|
+
return One(gens);
|
|
1175
|
+
fi;
|
|
1176
|
+
ErrorNoReturn("expected a free semigroup generator",
|
|
1177
|
+
" but found ", [char]);
|
|
1178
|
+
end;
|
|
1179
|
+
|
|
1180
|
+
# i acts as a pointer to positions in the string.
|
|
1181
|
+
product := "";
|
|
1182
|
+
i := 1;
|
|
1183
|
+
while i <= Size(word) do
|
|
1184
|
+
# if there are no brackets the character is left as it is.
|
|
1185
|
+
if word[i] <> '(' then
|
|
1186
|
+
if product = "" then
|
|
1187
|
+
product := chartoel(word[i]);
|
|
1188
|
+
else
|
|
1189
|
+
product := product * chartoel(word[i]);
|
|
1190
|
+
fi;
|
|
1191
|
+
else
|
|
1192
|
+
lbracket := i;
|
|
1193
|
+
rbracket := -1;
|
|
1194
|
+
# tracks how 'deep' the position of i is in terms of nested
|
|
1195
|
+
# brackets
|
|
1196
|
+
nestcount := 0;
|
|
1197
|
+
i := i + 1;
|
|
1198
|
+
while i <= Size(word) do
|
|
1199
|
+
if word[i] = '(' then
|
|
1200
|
+
nestcount := nestcount + 1;
|
|
1201
|
+
elif word[i] = ')' then
|
|
1202
|
+
if nestcount = 0 then
|
|
1203
|
+
rbracket := i;
|
|
1204
|
+
break;
|
|
1205
|
+
else
|
|
1206
|
+
nestcount := nestcount - 1;
|
|
1207
|
+
fi;
|
|
1208
|
+
fi;
|
|
1209
|
+
i := i + 1;
|
|
1210
|
+
od;
|
|
1211
|
+
# if rbracket is not followed by ^ then the value inside the
|
|
1212
|
+
# bracket is appended (recursion is used to remove any brackets
|
|
1213
|
+
# in this value)
|
|
1214
|
+
if rbracket = Size(word) or (not word[rbracket + 1] = '^') then
|
|
1215
|
+
if product = "" then
|
|
1216
|
+
product := RemoveBrackets(
|
|
1217
|
+
word{[lbracket + 1 .. rbracket - 1]});
|
|
1218
|
+
else
|
|
1219
|
+
product := product *
|
|
1220
|
+
RemoveBrackets(
|
|
1221
|
+
word{[lbracket + 1 .. rbracket - 1]});
|
|
1222
|
+
fi;
|
|
1223
|
+
# if rbracket is followed by ^ then the value inside the
|
|
1224
|
+
# bracket is appended the given number of time
|
|
1225
|
+
else
|
|
1226
|
+
i := i + 2;
|
|
1227
|
+
while i <= Size(word) do
|
|
1228
|
+
if word[i] in "0123456789" then
|
|
1229
|
+
i := i + 1;
|
|
1230
|
+
else
|
|
1231
|
+
break;
|
|
1232
|
+
fi;
|
|
1233
|
+
od;
|
|
1234
|
+
|
|
1235
|
+
p := Int(word{[rbracket + 2 .. i - 1]});
|
|
1236
|
+
if p = 0 then
|
|
1237
|
+
ErrorNoReturn("expected ^ to be followed",
|
|
1238
|
+
" by a positive integer but found 0");
|
|
1239
|
+
fi;
|
|
1240
|
+
if product = "" then
|
|
1241
|
+
product := RemoveBrackets(word{[lbracket + 1 ..
|
|
1242
|
+
rbracket - 1]}) ^ p;
|
|
1243
|
+
else
|
|
1244
|
+
product := product *
|
|
1245
|
+
RemoveBrackets(word{[lbracket + 1 ..
|
|
1246
|
+
rbracket - 1]}) ^ p;
|
|
1247
|
+
fi;
|
|
1248
|
+
i := i - 1;
|
|
1249
|
+
fi;
|
|
1250
|
+
fi;
|
|
1251
|
+
i := i + 1;
|
|
1252
|
+
od;
|
|
1253
|
+
return product;
|
|
1254
|
+
end;
|
|
1255
|
+
|
|
1256
|
+
ParseRelation := x -> List(SplitString(x, "="), RemoveBrackets);
|
|
1257
|
+
output := List(SplitString(newinputstring, ","), ParseRelation);
|
|
1258
|
+
if ForAny(output, x -> Size(x) = 1) then
|
|
1259
|
+
ErrorNoReturn("expected the 2nd argument to be",
|
|
1260
|
+
" a string listing the relations of a semigroup",
|
|
1261
|
+
" but found an = symbol which isn't pairing two",
|
|
1262
|
+
" words");
|
|
1263
|
+
fi;
|
|
1264
|
+
output := Filtered(output, x -> Size(x) >= 2);
|
|
1265
|
+
output := List(output,
|
|
1266
|
+
x -> List([1 .. Size(x) - 1], y -> [x[y], x[y + 1]]));
|
|
1267
|
+
return Concatenation(output);
|
|
1268
|
+
end);
|
|
1269
|
+
|
|
1270
|
+
InstallMethod(Factorization, "for an fp semigroup and element",
|
|
1271
|
+
IsCollsElms, [IsFpSemigroup, IsElementOfFpSemigroup],
|
|
1272
|
+
{S, x} -> SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x)));
|
|
1273
|
+
|
|
1274
|
+
# Returns a factorization of the semigroup generators of S, not the monoid
|
|
1275
|
+
# generators !!!
|
|
1276
|
+
InstallMethod(Factorization, "for an fp monoid and element",
|
|
1277
|
+
IsCollsElms, [IsFpMonoid, IsElementOfFpMonoid],
|
|
1278
|
+
function(_, x)
|
|
1279
|
+
local y;
|
|
1280
|
+
y := ExtRepOfObj(x);
|
|
1281
|
+
if IsEmpty(y) then
|
|
1282
|
+
return [1];
|
|
1283
|
+
else
|
|
1284
|
+
return SEMIGROUPS.ExtRepObjToWord(y) + 1;
|
|
1285
|
+
fi;
|
|
1286
|
+
end);
|
|
1287
|
+
|
|
1288
|
+
InstallMethod(Factorization, "for a free semigroup and word",
|
|
1289
|
+
[IsFreeSemigroup, IsWord],
|
|
1290
|
+
{S, x} -> SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x)));
|
|
1291
|
+
|
|
1292
|
+
InstallMethod(MinimalFactorization, "for a free semigroup and word",
|
|
1293
|
+
[IsFreeSemigroup, IsWord], Factorization);
|
|
1294
|
+
|
|
1295
|
+
# Returns a factorization of the semigroup generators of S, not the monoid
|
|
1296
|
+
# generators !!!
|
|
1297
|
+
InstallMethod(Factorization, "for a free monoid and word",
|
|
1298
|
+
[IsFreeMonoid, IsWord],
|
|
1299
|
+
function(_, x)
|
|
1300
|
+
if IsOne(x) then
|
|
1301
|
+
return [1];
|
|
1302
|
+
else
|
|
1303
|
+
return SEMIGROUPS.ExtRepObjToWord(ExtRepOfObj(x)) + 1;
|
|
1304
|
+
fi;
|
|
1305
|
+
end);
|
|
1306
|
+
|
|
1307
|
+
InstallMethod(MinimalFactorization, "for a free monoid and word",
|
|
1308
|
+
[IsFreeMonoid, IsWord], Factorization);
|
|
1309
|
+
|
|
1310
|
+
InstallMethod(Length, "for an fp semigroup", [IsFpSemigroup],
|
|
1311
|
+
function(S)
|
|
1312
|
+
return Length(GeneratorsOfSemigroup(S))
|
|
1313
|
+
+ Sum(RelationsOfFpSemigroup(S), x -> Length(x[1]) + Length(x[2]));
|
|
1314
|
+
end);
|
|
1315
|
+
|
|
1316
|
+
InstallMethod(Length, "for an fp monoid", [IsFpMonoid],
|
|
1317
|
+
function(S)
|
|
1318
|
+
return Length(GeneratorsOfMonoid(S))
|
|
1319
|
+
+ Sum(RelationsOfFpMonoid(S), x -> Length(x[1]) + Length(x[2]));
|
|
1320
|
+
end);
|
|
1321
|
+
|
|
1322
|
+
InstallMethod(ReversedOp, "for an element of an fp semigroup",
|
|
1323
|
+
[IsElementOfFpSemigroup],
|
|
1324
|
+
function(word)
|
|
1325
|
+
local rev;
|
|
1326
|
+
rev := Reversed(UnderlyingElement(word));
|
|
1327
|
+
return ElementOfFpSemigroup(FamilyObj(word), rev);
|
|
1328
|
+
end);
|
|
1329
|
+
|
|
1330
|
+
InstallMethod(ReversedOp, "for an element of an fp monoid",
|
|
1331
|
+
[IsElementOfFpMonoid],
|
|
1332
|
+
function(word)
|
|
1333
|
+
local rev;
|
|
1334
|
+
rev := Reversed(UnderlyingElement(word));
|
|
1335
|
+
return ElementOfFpMonoid(FamilyObj(word), rev);
|
|
1336
|
+
end);
|
|
1337
|
+
|
|
1338
|
+
InstallMethod(EmbeddingFpMonoid, "for an fp semigroup",
|
|
1339
|
+
[IsFpSemigroup],
|
|
1340
|
+
function(S)
|
|
1341
|
+
local F, R, map, T, hom, rel;
|
|
1342
|
+
|
|
1343
|
+
if HasIsMonoidAsSemigroup(S) and IsMonoidAsSemigroup(S) then
|
|
1344
|
+
return IsomorphismFpMonoid(S);
|
|
1345
|
+
fi;
|
|
1346
|
+
|
|
1347
|
+
F := FreeSemigroupOfFpSemigroup(S);
|
|
1348
|
+
F := FreeMonoid(List(GeneratorsOfSemigroup(F), String));
|
|
1349
|
+
R := [];
|
|
1350
|
+
|
|
1351
|
+
map := x -> ObjByExtRep(ElementsFamily(FamilyObj(F)), ExtRepOfObj(x));
|
|
1352
|
+
|
|
1353
|
+
for rel in RelationsOfFpSemigroup(S) do
|
|
1354
|
+
Add(R, [map(rel[1]), map(rel[2])]);
|
|
1355
|
+
od;
|
|
1356
|
+
|
|
1357
|
+
T := F / R;
|
|
1358
|
+
hom := SemigroupHomomorphismByImages_NC(S,
|
|
1359
|
+
T,
|
|
1360
|
+
GeneratorsOfSemigroup(S),
|
|
1361
|
+
GeneratorsOfMonoid(T));
|
|
1362
|
+
SetIsInjective(hom, true);
|
|
1363
|
+
return hom;
|
|
1364
|
+
end);
|