passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.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.

Files changed (354) hide show
  1. gap/pkg/semigroups/CHANGELOG.md +1699 -0
  2. gap/pkg/semigroups/CONTRIBUTING.md +91 -0
  3. gap/pkg/semigroups/GNUmakefile +110 -0
  4. gap/pkg/semigroups/GNUmakefile.in +110 -0
  5. gap/pkg/semigroups/GPL +674 -0
  6. gap/pkg/semigroups/LICENSE +16 -0
  7. gap/pkg/semigroups/Makefile +26 -0
  8. gap/pkg/semigroups/Makefile.gappkg +225 -0
  9. gap/pkg/semigroups/PackageInfo.g +529 -0
  10. gap/pkg/semigroups/README.md +102 -0
  11. gap/pkg/semigroups/VERSIONS +112 -0
  12. gap/pkg/semigroups/aclocal.m4 +375 -0
  13. gap/pkg/semigroups/autogen.sh +25 -0
  14. gap/pkg/semigroups/bin/aarch64-unknown-linux-gnu-default64-kv10/semigroups.so +0 -0
  15. gap/pkg/semigroups/config.guess +1807 -0
  16. gap/pkg/semigroups/config.log +1016 -0
  17. gap/pkg/semigroups/config.status +1132 -0
  18. gap/pkg/semigroups/config.sub +1960 -0
  19. gap/pkg/semigroups/configure +9742 -0
  20. gap/pkg/semigroups/configure.ac +71 -0
  21. gap/pkg/semigroups/data/doc/greens.pickle +1 -0
  22. gap/pkg/semigroups/data/gens/fullbool-8.pickle.gz +0 -0
  23. gap/pkg/semigroups/data/gens/fullbool.pickle.gz +0 -0
  24. gap/pkg/semigroups/data/gens/hall.pickle.gz +0 -0
  25. gap/pkg/semigroups/data/gens/reflex-6.pickle.gz +0 -0
  26. gap/pkg/semigroups/data/gens/reflex.pickle.gz +0 -0
  27. gap/pkg/semigroups/data/tst/bipart4 +10 -0
  28. gap/pkg/semigroups/data/tst/pperm10 +1 -0
  29. gap/pkg/semigroups/data/tst/tables.gz +0 -0
  30. gap/pkg/semigroups/data/tst/testdata +1 -0
  31. gap/pkg/semigroups/data/tst/testinstall.pickle +1 -0
  32. gap/pkg/semigroups/data/tst/trans3 +7 -0
  33. gap/pkg/semigroups/data/tst/trans3-old +7 -0
  34. gap/pkg/semigroups/environment.yml +7 -0
  35. gap/pkg/semigroups/gap/attributes/acting.gd +15 -0
  36. gap/pkg/semigroups/gap/attributes/acting.gi +297 -0
  37. gap/pkg/semigroups/gap/attributes/attr.gd +91 -0
  38. gap/pkg/semigroups/gap/attributes/attr.gi +1214 -0
  39. gap/pkg/semigroups/gap/attributes/dual.gd +25 -0
  40. gap/pkg/semigroups/gap/attributes/dual.gi +209 -0
  41. gap/pkg/semigroups/gap/attributes/factor.gd +17 -0
  42. gap/pkg/semigroups/gap/attributes/factor.gi +453 -0
  43. gap/pkg/semigroups/gap/attributes/homomorph.gd +84 -0
  44. gap/pkg/semigroups/gap/attributes/homomorph.gi +591 -0
  45. gap/pkg/semigroups/gap/attributes/inverse.gd +38 -0
  46. gap/pkg/semigroups/gap/attributes/inverse.gi +708 -0
  47. gap/pkg/semigroups/gap/attributes/isomorph.gd +16 -0
  48. gap/pkg/semigroups/gap/attributes/isomorph.gi +377 -0
  49. gap/pkg/semigroups/gap/attributes/isorms.gd +49 -0
  50. gap/pkg/semigroups/gap/attributes/isorms.gi +1383 -0
  51. gap/pkg/semigroups/gap/attributes/maximal.gd +16 -0
  52. gap/pkg/semigroups/gap/attributes/maximal.gi +1876 -0
  53. gap/pkg/semigroups/gap/attributes/properties.gd +109 -0
  54. gap/pkg/semigroups/gap/attributes/properties.gi +1658 -0
  55. gap/pkg/semigroups/gap/attributes/rms-translat.gd +39 -0
  56. gap/pkg/semigroups/gap/attributes/rms-translat.gi +1078 -0
  57. gap/pkg/semigroups/gap/attributes/semifp.gd +12 -0
  58. gap/pkg/semigroups/gap/attributes/semifp.gi +84 -0
  59. gap/pkg/semigroups/gap/attributes/translat.gd +474 -0
  60. gap/pkg/semigroups/gap/attributes/translat.gi +1779 -0
  61. gap/pkg/semigroups/gap/congruences/cong.gd +154 -0
  62. gap/pkg/semigroups/gap/congruences/cong.gi +351 -0
  63. gap/pkg/semigroups/gap/congruences/conginv.gd +38 -0
  64. gap/pkg/semigroups/gap/congruences/conginv.gi +589 -0
  65. gap/pkg/semigroups/gap/congruences/conglatt.gd +101 -0
  66. gap/pkg/semigroups/gap/congruences/conglatt.gi +886 -0
  67. gap/pkg/semigroups/gap/congruences/congpairs.gd +21 -0
  68. gap/pkg/semigroups/gap/congruences/congpairs.gi +272 -0
  69. gap/pkg/semigroups/gap/congruences/congpart.gd +90 -0
  70. gap/pkg/semigroups/gap/congruences/congpart.gi +449 -0
  71. gap/pkg/semigroups/gap/congruences/congrees.gd +20 -0
  72. gap/pkg/semigroups/gap/congruences/congrees.gi +313 -0
  73. gap/pkg/semigroups/gap/congruences/congrms.gd +54 -0
  74. gap/pkg/semigroups/gap/congruences/congrms.gi +1467 -0
  75. gap/pkg/semigroups/gap/congruences/congsemigraph.gd +28 -0
  76. gap/pkg/semigroups/gap/congruences/congsemigraph.gi +289 -0
  77. gap/pkg/semigroups/gap/congruences/congsimple.gd +27 -0
  78. gap/pkg/semigroups/gap/congruences/congsimple.gi +236 -0
  79. gap/pkg/semigroups/gap/congruences/conguniv.gd +20 -0
  80. gap/pkg/semigroups/gap/congruences/conguniv.gi +271 -0
  81. gap/pkg/semigroups/gap/congruences/congwordgraph.gd +21 -0
  82. gap/pkg/semigroups/gap/congruences/congwordgraph.gi +250 -0
  83. gap/pkg/semigroups/gap/elements/bipart.gd +71 -0
  84. gap/pkg/semigroups/gap/elements/bipart.gi +995 -0
  85. gap/pkg/semigroups/gap/elements/blocks.gd +31 -0
  86. gap/pkg/semigroups/gap/elements/blocks.gi +134 -0
  87. gap/pkg/semigroups/gap/elements/boolmat.gd +74 -0
  88. gap/pkg/semigroups/gap/elements/boolmat.gi +726 -0
  89. gap/pkg/semigroups/gap/elements/elements.gd +11 -0
  90. gap/pkg/semigroups/gap/elements/elements.gi +121 -0
  91. gap/pkg/semigroups/gap/elements/ffmat.gd +71 -0
  92. gap/pkg/semigroups/gap/elements/ffmat.gi +311 -0
  93. gap/pkg/semigroups/gap/elements/maxplusmat.gd +131 -0
  94. gap/pkg/semigroups/gap/elements/maxplusmat.gi +782 -0
  95. gap/pkg/semigroups/gap/elements/pbr.gd +51 -0
  96. gap/pkg/semigroups/gap/elements/pbr.gi +740 -0
  97. gap/pkg/semigroups/gap/elements/pperm.gd +11 -0
  98. gap/pkg/semigroups/gap/elements/pperm.gi +14 -0
  99. gap/pkg/semigroups/gap/elements/semiringmat.gd +136 -0
  100. gap/pkg/semigroups/gap/elements/semiringmat.gi +717 -0
  101. gap/pkg/semigroups/gap/elements/star.gd +21 -0
  102. gap/pkg/semigroups/gap/elements/star.gi +21 -0
  103. gap/pkg/semigroups/gap/elements/trans.gd +13 -0
  104. gap/pkg/semigroups/gap/elements/trans.gi +50 -0
  105. gap/pkg/semigroups/gap/fp/freeband.gd +22 -0
  106. gap/pkg/semigroups/gap/fp/freeband.gi +502 -0
  107. gap/pkg/semigroups/gap/fp/freeinverse.gd +30 -0
  108. gap/pkg/semigroups/gap/fp/freeinverse.gi +465 -0
  109. gap/pkg/semigroups/gap/fp/tietze.gd +89 -0
  110. gap/pkg/semigroups/gap/fp/tietze.gi +1578 -0
  111. gap/pkg/semigroups/gap/fp/word.gd +15 -0
  112. gap/pkg/semigroups/gap/fp/word.gi +67 -0
  113. gap/pkg/semigroups/gap/greens/acting-inverse.gi +774 -0
  114. gap/pkg/semigroups/gap/greens/acting-regular.gi +553 -0
  115. gap/pkg/semigroups/gap/greens/acting.gd +81 -0
  116. gap/pkg/semigroups/gap/greens/acting.gi +2433 -0
  117. gap/pkg/semigroups/gap/greens/froidure-pin.gd +25 -0
  118. gap/pkg/semigroups/gap/greens/froidure-pin.gi +741 -0
  119. gap/pkg/semigroups/gap/greens/generic.gd +117 -0
  120. gap/pkg/semigroups/gap/greens/generic.gi +630 -0
  121. gap/pkg/semigroups/gap/ideals/acting.gd +17 -0
  122. gap/pkg/semigroups/gap/ideals/acting.gi +1155 -0
  123. gap/pkg/semigroups/gap/ideals/froidure-pin.gd +11 -0
  124. gap/pkg/semigroups/gap/ideals/froidure-pin.gi +105 -0
  125. gap/pkg/semigroups/gap/ideals/ideals.gd +45 -0
  126. gap/pkg/semigroups/gap/ideals/ideals.gi +442 -0
  127. gap/pkg/semigroups/gap/ideals/lambda-rho.gd +16 -0
  128. gap/pkg/semigroups/gap/ideals/lambda-rho.gi +614 -0
  129. gap/pkg/semigroups/gap/libsemigroups/cong.gd +24 -0
  130. gap/pkg/semigroups/gap/libsemigroups/cong.gi +431 -0
  131. gap/pkg/semigroups/gap/libsemigroups/fpsemi.gd +16 -0
  132. gap/pkg/semigroups/gap/libsemigroups/fpsemi.gi +53 -0
  133. gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gd +17 -0
  134. gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gi +945 -0
  135. gap/pkg/semigroups/gap/libsemigroups/sims1.gd +38 -0
  136. gap/pkg/semigroups/gap/libsemigroups/sims1.gi +308 -0
  137. gap/pkg/semigroups/gap/main/acting.gd +36 -0
  138. gap/pkg/semigroups/gap/main/acting.gi +779 -0
  139. gap/pkg/semigroups/gap/main/froidure-pin.gd +72 -0
  140. gap/pkg/semigroups/gap/main/froidure-pin.gi +655 -0
  141. gap/pkg/semigroups/gap/main/graded.gd +26 -0
  142. gap/pkg/semigroups/gap/main/graded.gi +355 -0
  143. gap/pkg/semigroups/gap/main/lambda-rho.gd +29 -0
  144. gap/pkg/semigroups/gap/main/lambda-rho.gi +514 -0
  145. gap/pkg/semigroups/gap/main/orbits.gd +24 -0
  146. gap/pkg/semigroups/gap/main/orbits.gi +512 -0
  147. gap/pkg/semigroups/gap/main/semiact.gd +20 -0
  148. gap/pkg/semigroups/gap/main/semiact.gi +821 -0
  149. gap/pkg/semigroups/gap/main/setup.gd +61 -0
  150. gap/pkg/semigroups/gap/main/setup.gi +1094 -0
  151. gap/pkg/semigroups/gap/obsolete.gd +9 -0
  152. gap/pkg/semigroups/gap/obsolete.gi +14 -0
  153. gap/pkg/semigroups/gap/options.g +55 -0
  154. gap/pkg/semigroups/gap/semigroups/grpperm.gd +12 -0
  155. gap/pkg/semigroups/gap/semigroups/grpperm.gi +177 -0
  156. gap/pkg/semigroups/gap/semigroups/semibipart.gd +28 -0
  157. gap/pkg/semigroups/gap/semigroups/semibipart.gi +570 -0
  158. gap/pkg/semigroups/gap/semigroups/semiboolmat.gd +20 -0
  159. gap/pkg/semigroups/gap/semigroups/semiboolmat.gi +104 -0
  160. gap/pkg/semigroups/gap/semigroups/semicons.gd +52 -0
  161. gap/pkg/semigroups/gap/semigroups/semicons.gi +1194 -0
  162. gap/pkg/semigroups/gap/semigroups/semidp.gd +13 -0
  163. gap/pkg/semigroups/gap/semigroups/semidp.gi +509 -0
  164. gap/pkg/semigroups/gap/semigroups/semieunit.gd +126 -0
  165. gap/pkg/semigroups/gap/semigroups/semieunit.gi +889 -0
  166. gap/pkg/semigroups/gap/semigroups/semiex.gd +104 -0
  167. gap/pkg/semigroups/gap/semigroups/semiex.gi +1590 -0
  168. gap/pkg/semigroups/gap/semigroups/semiffmat.gd +37 -0
  169. gap/pkg/semigroups/gap/semigroups/semiffmat.gi +565 -0
  170. gap/pkg/semigroups/gap/semigroups/semifp.gd +28 -0
  171. gap/pkg/semigroups/gap/semigroups/semifp.gi +1364 -0
  172. gap/pkg/semigroups/gap/semigroups/semigraph.gd +40 -0
  173. gap/pkg/semigroups/gap/semigroups/semigraph.gi +292 -0
  174. gap/pkg/semigroups/gap/semigroups/semigrp.gd +165 -0
  175. gap/pkg/semigroups/gap/semigroups/semigrp.gi +1225 -0
  176. gap/pkg/semigroups/gap/semigroups/semimaxplus.gd +72 -0
  177. gap/pkg/semigroups/gap/semigroups/semimaxplus.gi +710 -0
  178. gap/pkg/semigroups/gap/semigroups/semintmat.gd +13 -0
  179. gap/pkg/semigroups/gap/semigroups/semintmat.gi +74 -0
  180. gap/pkg/semigroups/gap/semigroups/semipbr.gd +19 -0
  181. gap/pkg/semigroups/gap/semigroups/semipbr.gi +139 -0
  182. gap/pkg/semigroups/gap/semigroups/semipperm.gd +27 -0
  183. gap/pkg/semigroups/gap/semigroups/semipperm.gi +711 -0
  184. gap/pkg/semigroups/gap/semigroups/semiquo.gd +14 -0
  185. gap/pkg/semigroups/gap/semigroups/semiquo.gi +97 -0
  186. gap/pkg/semigroups/gap/semigroups/semiringmat.gd +16 -0
  187. gap/pkg/semigroups/gap/semigroups/semiringmat.gi +21 -0
  188. gap/pkg/semigroups/gap/semigroups/semirms.gd +19 -0
  189. gap/pkg/semigroups/gap/semigroups/semirms.gi +977 -0
  190. gap/pkg/semigroups/gap/semigroups/semitrans.gd +49 -0
  191. gap/pkg/semigroups/gap/semigroups/semitrans.gi +909 -0
  192. gap/pkg/semigroups/gap/tools/display.gd +24 -0
  193. gap/pkg/semigroups/gap/tools/display.gi +749 -0
  194. gap/pkg/semigroups/gap/tools/io.gd +17 -0
  195. gap/pkg/semigroups/gap/tools/io.gi +543 -0
  196. gap/pkg/semigroups/gap/tools/iterators.gd +16 -0
  197. gap/pkg/semigroups/gap/tools/iterators.gi +253 -0
  198. gap/pkg/semigroups/gap/tools/utils.gd +19 -0
  199. gap/pkg/semigroups/gap/tools/utils.gi +756 -0
  200. gap/pkg/semigroups/gapbind14/.ccls +18 -0
  201. gap/pkg/semigroups/gapbind14/.clang-format +104 -0
  202. gap/pkg/semigroups/gapbind14/CPPLINT.cfg +5 -0
  203. gap/pkg/semigroups/gapbind14/LICENSE +674 -0
  204. gap/pkg/semigroups/gapbind14/README.md +76 -0
  205. gap/pkg/semigroups/gapbind14/demo/.gitignore +4 -0
  206. gap/pkg/semigroups/gapbind14/demo/LICENSE +293 -0
  207. gap/pkg/semigroups/gapbind14/demo/Makefile.gappkg +220 -0
  208. gap/pkg/semigroups/gapbind14/demo/Makefile.in +19 -0
  209. gap/pkg/semigroups/gapbind14/demo/PackageInfo.g +87 -0
  210. gap/pkg/semigroups/gapbind14/demo/README.md +17 -0
  211. gap/pkg/semigroups/gapbind14/demo/configure +34 -0
  212. gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gd +19 -0
  213. gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gi +10 -0
  214. gap/pkg/semigroups/gapbind14/demo/init.g +16 -0
  215. gap/pkg/semigroups/gapbind14/demo/makedoc.g +10 -0
  216. gap/pkg/semigroups/gapbind14/demo/read.g +6 -0
  217. gap/pkg/semigroups/gapbind14/demo/src/gapbind_demo.cc +142 -0
  218. gap/pkg/semigroups/gapbind14/demo/tst/testall.g +12 -0
  219. gap/pkg/semigroups/gapbind14/include/gapbind14/cpp_fn.hpp +223 -0
  220. gap/pkg/semigroups/gapbind14/include/gapbind14/gap_include.hpp +26 -0
  221. gap/pkg/semigroups/gapbind14/include/gapbind14/gapbind14.hpp +445 -0
  222. gap/pkg/semigroups/gapbind14/include/gapbind14/tame_free_fn.hpp +420 -0
  223. gap/pkg/semigroups/gapbind14/include/gapbind14/tame_mem_fn.hpp +556 -0
  224. gap/pkg/semigroups/gapbind14/include/gapbind14/to_cpp.hpp +162 -0
  225. gap/pkg/semigroups/gapbind14/include/gapbind14/to_gap.hpp +158 -0
  226. gap/pkg/semigroups/gapbind14/src/.clang-format +108 -0
  227. gap/pkg/semigroups/gapbind14/src/gapbind14.cpp +334 -0
  228. gap/pkg/semigroups/init.g +150 -0
  229. gap/pkg/semigroups/m4/ax_append_flag.m4 +50 -0
  230. gap/pkg/semigroups/m4/ax_check_compile_flag.m4 +53 -0
  231. gap/pkg/semigroups/m4/ax_check_hpcombi.m4 +121 -0
  232. gap/pkg/semigroups/m4/ax_check_libsemigroup.m4 +68 -0
  233. gap/pkg/semigroups/m4/ax_compare_version.m4 +177 -0
  234. gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
  235. gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx_14.m4 +34 -0
  236. gap/pkg/semigroups/m4/ax_prefix_config_h.m4 +203 -0
  237. gap/pkg/semigroups/m4/ax_pthread.m4 +522 -0
  238. gap/pkg/semigroups/m4/find_gap.m4 +94 -0
  239. gap/pkg/semigroups/makedoc.g +153 -0
  240. gap/pkg/semigroups/prerequisites.sh +62 -0
  241. gap/pkg/semigroups/read.g +105 -0
  242. gap/pkg/semigroups/release.toml +6 -0
  243. gap/pkg/semigroups/tst/extreme/README +2 -0
  244. gap/pkg/semigroups/tst/extreme/attrinv.tst +703 -0
  245. gap/pkg/semigroups/tst/extreme/bipart.tst +2803 -0
  246. gap/pkg/semigroups/tst/extreme/closure.tst +652 -0
  247. gap/pkg/semigroups/tst/extreme/cong.tst +286 -0
  248. gap/pkg/semigroups/tst/extreme/conginv.tst +43 -0
  249. gap/pkg/semigroups/tst/extreme/examples.tst +2449 -0
  250. gap/pkg/semigroups/tst/extreme/freeband.tst +37 -0
  251. gap/pkg/semigroups/tst/extreme/greens-acting-regular.tst +27 -0
  252. gap/pkg/semigroups/tst/extreme/greens-acting.tst +1999 -0
  253. gap/pkg/semigroups/tst/extreme/ideals.tst +858 -0
  254. gap/pkg/semigroups/tst/extreme/inverse.tst +1025 -0
  255. gap/pkg/semigroups/tst/extreme/maximal.tst +856 -0
  256. gap/pkg/semigroups/tst/extreme/misc.tst +4236 -0
  257. gap/pkg/semigroups/tst/extreme/monoid_pkg.tst +1488 -0
  258. gap/pkg/semigroups/tst/extreme/properties.tst +914 -0
  259. gap/pkg/semigroups/tst/extreme/semibipart.tst +2837 -0
  260. gap/pkg/semigroups/tst/extreme/semieunit.tst +49 -0
  261. gap/pkg/semigroups/tst/extreme/semiffmat.tst +353 -0
  262. gap/pkg/semigroups/tst/extreme/semigroups.tst +245 -0
  263. gap/pkg/semigroups/tst/extreme/semiiter.tst +58 -0
  264. gap/pkg/semigroups/tst/extreme/semirms.tst +1091 -0
  265. gap/pkg/semigroups/tst/extreme/transform.tst +305 -0
  266. gap/pkg/semigroups/tst/extreme/translat.tst +44 -0
  267. gap/pkg/semigroups/tst/standard/README +2 -0
  268. gap/pkg/semigroups/tst/standard/attributes/acting.tst +388 -0
  269. gap/pkg/semigroups/tst/standard/attributes/attr.tst +2404 -0
  270. gap/pkg/semigroups/tst/standard/attributes/dual.tst +308 -0
  271. gap/pkg/semigroups/tst/standard/attributes/factor.tst +629 -0
  272. gap/pkg/semigroups/tst/standard/attributes/homomorph.tst +1134 -0
  273. gap/pkg/semigroups/tst/standard/attributes/inverse.tst +1521 -0
  274. gap/pkg/semigroups/tst/standard/attributes/isomorph.tst +435 -0
  275. gap/pkg/semigroups/tst/standard/attributes/isorms.tst +1147 -0
  276. gap/pkg/semigroups/tst/standard/attributes/maximal.tst +853 -0
  277. gap/pkg/semigroups/tst/standard/attributes/properties.tst +2028 -0
  278. gap/pkg/semigroups/tst/standard/attributes/semifp.tst +53 -0
  279. gap/pkg/semigroups/tst/standard/attributes/translat.tst +796 -0
  280. gap/pkg/semigroups/tst/standard/congruences/cong.tst +1044 -0
  281. gap/pkg/semigroups/tst/standard/congruences/conginv.tst +292 -0
  282. gap/pkg/semigroups/tst/standard/congruences/conglatt.tst +421 -0
  283. gap/pkg/semigroups/tst/standard/congruences/congpairs.tst +1011 -0
  284. gap/pkg/semigroups/tst/standard/congruences/congrees.tst +288 -0
  285. gap/pkg/semigroups/tst/standard/congruences/congrms.tst +701 -0
  286. gap/pkg/semigroups/tst/standard/congruences/congsemigraph.tst +422 -0
  287. gap/pkg/semigroups/tst/standard/congruences/congsimple.tst +311 -0
  288. gap/pkg/semigroups/tst/standard/congruences/conguniv.tst +259 -0
  289. gap/pkg/semigroups/tst/standard/congruences/congwordgraph.tst +330 -0
  290. gap/pkg/semigroups/tst/standard/elements/bipart.tst +783 -0
  291. gap/pkg/semigroups/tst/standard/elements/blocks.tst +166 -0
  292. gap/pkg/semigroups/tst/standard/elements/boolmat.tst +608 -0
  293. gap/pkg/semigroups/tst/standard/elements/elements.tst +117 -0
  294. gap/pkg/semigroups/tst/standard/elements/ffmat.tst +349 -0
  295. gap/pkg/semigroups/tst/standard/elements/maxplusmat.tst +613 -0
  296. gap/pkg/semigroups/tst/standard/elements/pbr.tst +506 -0
  297. gap/pkg/semigroups/tst/standard/elements/pperm.tst +32 -0
  298. gap/pkg/semigroups/tst/standard/elements/semiringmat.tst +601 -0
  299. gap/pkg/semigroups/tst/standard/elements/trans.tst +58 -0
  300. gap/pkg/semigroups/tst/standard/fp/freeband.tst +311 -0
  301. gap/pkg/semigroups/tst/standard/fp/freeinverse.tst +147 -0
  302. gap/pkg/semigroups/tst/standard/fp/tietze.tst +780 -0
  303. gap/pkg/semigroups/tst/standard/fp/word.tst +106 -0
  304. gap/pkg/semigroups/tst/standard/greens/acting-inverse.tst +545 -0
  305. gap/pkg/semigroups/tst/standard/greens/acting-regular.tst +396 -0
  306. gap/pkg/semigroups/tst/standard/greens/acting.tst +2033 -0
  307. gap/pkg/semigroups/tst/standard/greens/froidure-pin.tst +1831 -0
  308. gap/pkg/semigroups/tst/standard/greens/generic.tst +1436 -0
  309. gap/pkg/semigroups/tst/standard/ideals/acting.tst +279 -0
  310. gap/pkg/semigroups/tst/standard/ideals/froidure-pin.tst +178 -0
  311. gap/pkg/semigroups/tst/standard/ideals/ideals.tst +380 -0
  312. gap/pkg/semigroups/tst/standard/libsemigroups/cong.tst +310 -0
  313. gap/pkg/semigroups/tst/standard/libsemigroups/froidure-pin.tst +778 -0
  314. gap/pkg/semigroups/tst/standard/libsemigroups/sims1.tst +379 -0
  315. gap/pkg/semigroups/tst/standard/main/acting.tst +411 -0
  316. gap/pkg/semigroups/tst/standard/main/froidure-pin.tst +392 -0
  317. gap/pkg/semigroups/tst/standard/main/semiact.tst +203 -0
  318. gap/pkg/semigroups/tst/standard/main/setup.tst +1144 -0
  319. gap/pkg/semigroups/tst/standard/obsolete.tst +19 -0
  320. gap/pkg/semigroups/tst/standard/options.tst +54 -0
  321. gap/pkg/semigroups/tst/standard/semigroups/grpperm.tst +581 -0
  322. gap/pkg/semigroups/tst/standard/semigroups/semibipart.tst +2635 -0
  323. gap/pkg/semigroups/tst/standard/semigroups/semiboolmat.tst +1871 -0
  324. gap/pkg/semigroups/tst/standard/semigroups/semicons.tst +1173 -0
  325. gap/pkg/semigroups/tst/standard/semigroups/semidp.tst +739 -0
  326. gap/pkg/semigroups/tst/standard/semigroups/semieunit.tst +339 -0
  327. gap/pkg/semigroups/tst/standard/semigroups/semiex.tst +2055 -0
  328. gap/pkg/semigroups/tst/standard/semigroups/semiffmat.tst +746 -0
  329. gap/pkg/semigroups/tst/standard/semigroups/semifp.tst +2702 -0
  330. gap/pkg/semigroups/tst/standard/semigroups/semigraph.tst +133 -0
  331. gap/pkg/semigroups/tst/standard/semigroups/semigrp.tst +1112 -0
  332. gap/pkg/semigroups/tst/standard/semigroups/semimaxplus.tst +654 -0
  333. gap/pkg/semigroups/tst/standard/semigroups/semipbr.tst +2142 -0
  334. gap/pkg/semigroups/tst/standard/semigroups/semipperm.tst +2169 -0
  335. gap/pkg/semigroups/tst/standard/semigroups/semiquo.tst +278 -0
  336. gap/pkg/semigroups/tst/standard/semigroups/semirms.tst +3010 -0
  337. gap/pkg/semigroups/tst/standard/semigroups/semitrans.tst +2758 -0
  338. gap/pkg/semigroups/tst/standard/tools/display.tst +1040 -0
  339. gap/pkg/semigroups/tst/standard/tools/io.tst +363 -0
  340. gap/pkg/semigroups/tst/testinstall.tst +1815 -0
  341. gap/pkg/semigroups/tst/teststandard.g +22 -0
  342. gap/pkg/semigroups/tst/workspaces/load-workspace.tst +142 -0
  343. gap/pkg/semigroups/tst/workspaces/load.g +11 -0
  344. gap/pkg/semigroups/tst/workspaces/save-workspace.tst +166 -0
  345. gap/pkg/semigroups/tst/workspaces/save.g +14 -0
  346. passagemath_gap_pkg_semigroups-10.6.29.dist-info/METADATA +93 -0
  347. passagemath_gap_pkg_semigroups-10.6.29.dist-info/METADATA.bak +94 -0
  348. passagemath_gap_pkg_semigroups-10.6.29.dist-info/RECORD +354 -0
  349. passagemath_gap_pkg_semigroups-10.6.29.dist-info/WHEEL +6 -0
  350. passagemath_gap_pkg_semigroups-10.6.29.dist-info/top_level.txt +1 -0
  351. passagemath_gap_pkg_semigroups.libs/libsemigroups-8ea3c4e7.so.2.0.0 +0 -0
  352. sage/all__sagemath_gap_pkg_semigroups.py +1 -0
  353. sage/libs/all__sagemath_gap_pkg_semigroups.py +1 -0
  354. 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);