passagemath-gap-pkg-semigroups 10.6.30__cp310-cp310-macosx_13_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passagemath-gap-pkg-semigroups might be problematic. Click here for more details.

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-apple-darwin23-default64-kv10/semigroups.so +0 -0
  15. gap/pkg/semigroups/config.guess +1807 -0
  16. gap/pkg/semigroups/config.log +1158 -0
  17. gap/pkg/semigroups/config.status +1131 -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.30.dist-info/METADATA +93 -0
  347. passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA.bak +94 -0
  348. passagemath_gap_pkg_semigroups-10.6.30.dist-info/RECORD +354 -0
  349. passagemath_gap_pkg_semigroups-10.6.30.dist-info/WHEEL +6 -0
  350. passagemath_gap_pkg_semigroups-10.6.30.dist-info/top_level.txt +1 -0
  351. passagemath_gap_pkg_semigroups.dylibs/libsemigroups.2.dylib +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.cpython-310-darwin.so +0 -0
@@ -0,0 +1,1214 @@
1
+ #############################################################################
2
+ ##
3
+ ## attributes/attr.gi
4
+ ## Copyright (C) 2013-2022 James D. Mitchell
5
+ ##
6
+ ## Licensing information can be found in the README file of this package.
7
+ ##
8
+ #############################################################################
9
+ ##
10
+
11
+ # This file contains methods for finding various attributes of finite
12
+ # semigroups, which satisfy CanUseFroidurePin or where no better method is
13
+ # known.
14
+
15
+ # Note about the difference between One and MultiplicativeNeutralElement
16
+ # (the same goes for Zero and MultplicativeZero):
17
+ #
18
+ # One(s) returns One(Representative(s)) if it belongs to s, so that
19
+ # One(s) = Transformation([1 .. DegreeOfTransformationSemigroup(s)]) if s is a
20
+ # transformation semigroup and it returns fail otherwise, or it returns
21
+ # PartialPerm([1 .. DegreeOfPartialPermSemigroup]) if this belongs to s.
22
+ #
23
+ # MultiplicativeNeutralElement on the other hand returns the element of s that
24
+ # acts as the identity, note that this can be equal to One(s) but it can also
25
+ # not be equal to One(s).
26
+ #
27
+ # A semigroup satisfies IsMonoidAsSemigroup(s) if
28
+ # MultiplicativeNeutralElement(x) <> fail, so it could be that One(s) returns
29
+ # fail but IsMonoidAsSemigroup is still true.
30
+
31
+ SEMIGROUPS.InjectionPrincipalFactor := function(D, constructor)
32
+ local map, inv, G, mat, rep, R, L, x, RR, LL, rms, iso, hom, i, j;
33
+
34
+ map := IsomorphismPermGroup(GroupHClass(D));
35
+ inv := InverseGeneralMapping(map);
36
+
37
+ G := Range(map);
38
+ mat := [];
39
+ rep := MultiplicativeNeutralElement(GroupHClass(D));
40
+ R := HClassReps(LClass(D, rep));
41
+ L := HClassReps(RClass(D, rep));
42
+
43
+ for i in [1 .. Length(L)] do
44
+ mat[i] := [];
45
+ for j in [1 .. Length(R)] do
46
+ x := L[i] * R[j];
47
+ if x in D then
48
+ mat[i][j] := x ^ map;
49
+ else
50
+ mat[i][j] := 0;
51
+ fi;
52
+ od;
53
+ od;
54
+
55
+ RR := EmptyPlist(Length(R));
56
+ LL := EmptyPlist(Length(L));
57
+
58
+ for j in [1 .. Length(R)] do
59
+ for i in [1 .. Length(L)] do
60
+ if mat[i][j] <> 0 then
61
+ RR[j] := ((mat[i][j] ^ -1) ^ inv) * L[i];
62
+ break;
63
+ fi;
64
+ od;
65
+ od;
66
+
67
+ for i in [1 .. Length(L)] do
68
+ for j in [1 .. Length(R)] do
69
+ if mat[i][j] <> 0 then
70
+ LL[i] := R[j] * (mat[i][j] ^ -1) ^ inv;
71
+ break;
72
+ fi;
73
+ od;
74
+ od;
75
+
76
+ rms := constructor(G, mat);
77
+
78
+ iso := function(x)
79
+ local i, j;
80
+
81
+ if not x in D then
82
+ return fail;
83
+ fi;
84
+
85
+ i := PositionProperty(R, y -> y in RClass(D, x));
86
+ j := PositionProperty(L, y -> y in LClass(D, x));
87
+
88
+ return Objectify(TypeReesMatrixSemigroupElements(rms),
89
+ [i, (rep * RR[i] * x * LL[j]) ^ map, j, mat]);
90
+ end;
91
+
92
+ inv := function(x)
93
+ if x![1] = 0 then
94
+ return fail;
95
+ fi;
96
+ return R[x![1]] * (x![2] ^ InverseGeneralMapping(map)) * L[x![3]];
97
+ end;
98
+ hom := MappingByFunction(D, rms, iso, inv);
99
+ SetIsInjective(hom, true);
100
+ SetIsTotal(hom, true);
101
+ return hom;
102
+ end;
103
+
104
+ #############################################################################
105
+ ## 1. Default methods, for which there are currently no better methods.
106
+ #############################################################################
107
+
108
+ # Don't use ClosureSemigroup here since the order of the generators matters
109
+ # and ClosureSemigroup shuffles the generators.
110
+
111
+ InstallMethod(GeneratorsSmallest,
112
+ "for a semigroup with CanUseFroidurePin",
113
+ [CanUseFroidurePin],
114
+ function(S)
115
+ local iter, gens, T, closure, x;
116
+
117
+ iter := IteratorSorted(S);
118
+ gens := [NextIterator(iter)];
119
+ T := Semigroup(gens);
120
+
121
+ if CanUseLibsemigroupsFroidurePin(S) then
122
+ closure := {S, coll, opts} ->
123
+ ClosureSemigroupOrMonoidNC(Semigroup, S, coll, opts);
124
+ else
125
+ closure := ClosureSemigroup;
126
+ fi;
127
+
128
+ for x in iter do
129
+ if not x in T then
130
+ T := closure(T, [x], SEMIGROUPS.OptionsRec(T));
131
+ Add(gens, x);
132
+ if T = S then
133
+ break;
134
+ fi;
135
+ fi;
136
+ od;
137
+ return gens;
138
+ end);
139
+
140
+ InstallMethod(SmallestElementSemigroup, "for a semigroup",
141
+ [IsSemigroup],
142
+ function(S)
143
+ if not IsFinite(S) then
144
+ TryNextMethod();
145
+ fi;
146
+ return NextIterator(IteratorSorted(S));
147
+ end);
148
+
149
+ InstallMethod(LargestElementSemigroup, "for a semigroup",
150
+ [IsSemigroup],
151
+ function(S)
152
+ if not IsFinite(S) then
153
+ TryNextMethod();
154
+ fi;
155
+ return EnumeratorSorted(S)[Size(S)];
156
+ end);
157
+
158
+ InstallMethod(NrIdempotents, "for a semigroup", [IsSemigroup],
159
+ S -> Length(Idempotents(S)));
160
+
161
+ InstallMethod(GroupOfUnits, "for a semigroup", [IsSemigroup],
162
+ function(S)
163
+ local H, map, U, iso;
164
+
165
+ if not IsFinite(S) then
166
+ TryNextMethod();
167
+ elif MultiplicativeNeutralElement(S) = fail then
168
+ return fail;
169
+ fi;
170
+
171
+ H := GreensHClassOfElementNC(S, MultiplicativeNeutralElement(S));
172
+ map := IsomorphismPermGroup(H);
173
+
174
+ U := Semigroup(List(GeneratorsOfGroup(Range(map)),
175
+ x -> x ^ InverseGeneralMapping(map)));
176
+
177
+ iso := SemigroupIsomorphismByFunctionNC(U,
178
+ Range(map),
179
+ x -> x ^ map,
180
+ x -> x ^ InverseGeneralMapping(map));
181
+ SetIsomorphismPermGroup(U, iso);
182
+ SetIsGroupAsSemigroup(U, true);
183
+ UseIsomorphismRelation(U, Range(iso));
184
+ return U;
185
+ end);
186
+
187
+ # same method for ideals
188
+
189
+ InstallMethod(IsomorphismReesMatrixSemigroup, "for a D-class",
190
+ [IsGreensDClass],
191
+ function(D)
192
+ if NrIdempotents(D) <> NrHClasses(D) then
193
+ ErrorNoReturn("the argument (a Green's D-class) is not a semigroup");
194
+ fi;
195
+
196
+ return InjectionPrincipalFactor(D);
197
+ end);
198
+
199
+ # same method for ideal
200
+
201
+ InstallMethod(IrredundantGeneratingSubset,
202
+ "for a multiplicative element collection",
203
+ [IsMultiplicativeElementCollection],
204
+ function(coll)
205
+ local gens, nrgens, deg, out, redund, i, x;
206
+
207
+ if (IsSemigroup(coll) and HasGeneratorsOfSemigroup(coll))
208
+ or (HasIsSemigroupIdeal(coll) and IsSemigroupIdeal(coll)) then
209
+ coll := ShallowCopy(GeneratorsOfSemigroup(coll));
210
+ elif not IsMutable(coll) then
211
+ coll := ShallowCopy(coll);
212
+ fi;
213
+
214
+ if Size(coll) = 1 then
215
+ return coll;
216
+ fi;
217
+
218
+ gens := Set(coll);
219
+ nrgens := Length(gens);
220
+
221
+ if nrgens = 1 then
222
+ return gens;
223
+ elif IsGeneratorsOfActingSemigroup(coll) then
224
+ deg := ActionDegree(coll);
225
+ Shuffle(coll);
226
+ Sort(coll, {x, y} -> ActionRank(x, deg) > ActionRank(y, deg));
227
+ fi;
228
+
229
+ out := EmptyPlist(Length(coll));
230
+ redund := EmptyPlist(Length(coll));
231
+ i := 0;
232
+
233
+ repeat
234
+ i := i + 1;
235
+ x := coll[i];
236
+ if InfoLevel(InfoSemigroups) >= 3 then
237
+ PrintFormatted(
238
+ "at \t{} of \t{} with \t{} redundant, \t{} non-redundant\n",
239
+ i,
240
+ Length(coll),
241
+ Length(redund),
242
+ Length(out));
243
+ fi;
244
+
245
+ if not x in redund and not x in out then
246
+ if Length(gens) > 1 and x in Semigroup(Difference(gens, [x])) then
247
+ AddSet(redund, x);
248
+ gens := Difference(gens, [x]);
249
+ else
250
+ AddSet(out, x);
251
+ fi;
252
+ fi;
253
+ until Length(redund) + Length(out) = nrgens;
254
+
255
+ if InfoLevel(InfoSemigroups) >= 3 then
256
+ Print("\n");
257
+ fi;
258
+
259
+ return out;
260
+ end);
261
+
262
+ # same method for ideals
263
+
264
+ InstallMethod(MinimalIdeal, "for a semigroup",
265
+ [IsSemigroup],
266
+ function(S)
267
+ local I;
268
+ if not IsFinite(S) then
269
+ TryNextMethod();
270
+ fi;
271
+ I := SemigroupIdealByGeneratorsNC(S,
272
+ [RepresentativeOfMinimalIdeal(S)],
273
+ SEMIGROUPS.OptionsRec(S));
274
+ SetIsSimpleSemigroup(I, true);
275
+ return I;
276
+ end);
277
+
278
+ InstallMethod(PrincipalFactor, "for a Green's D-class",
279
+ [IsGreensDClass], D -> Range(InjectionPrincipalFactor(D)));
280
+
281
+ InstallMethod(NormalizedPrincipalFactor, "for a Green's D-class",
282
+ [IsGreensDClass], D -> Range(InjectionNormalizedPrincipalFactor(D)));
283
+
284
+ # different method for ideals, not yet implemented
285
+
286
+ InstallMethod(SmallSemigroupGeneratingSet, "for a list or collection",
287
+ [IsListOrCollection],
288
+ function(coll)
289
+ if Length(coll) < 2 then
290
+ return coll;
291
+ fi;
292
+ return GeneratorsOfSemigroup(Semigroup(coll, rec(small := true)));
293
+ end);
294
+
295
+ # different method for ideals, not yet implemented
296
+
297
+ InstallMethod(SmallSemigroupGeneratingSet,
298
+ "for a finite semigroup", [IsSemigroup and IsFinite],
299
+ S -> SmallSemigroupGeneratingSet(GeneratorsOfSemigroup(S)));
300
+
301
+ InstallMethod(SmallMonoidGeneratingSet,
302
+ "for a multiplicative element with one collection",
303
+ [IsMultiplicativeElementWithOneCollection],
304
+ function(coll)
305
+ if Length(coll) < 2 then
306
+ return coll;
307
+ fi;
308
+ return GeneratorsOfMonoid(Monoid(coll, rec(small := true)));
309
+ end);
310
+
311
+ # same method for ideals
312
+
313
+ InstallMethod(SmallMonoidGeneratingSet, "for a finite monoid",
314
+ [IsFinite and IsMonoid],
315
+ function(S)
316
+ if Length(GeneratorsOfMonoid(S)) < 2 then
317
+ return GeneratorsOfMonoid(S);
318
+ fi;
319
+ return SmallMonoidGeneratingSet(GeneratorsOfMonoid(S));
320
+ end);
321
+
322
+ InstallMethod(SmallInverseSemigroupGeneratingSet,
323
+ "for a multiplicative element coll",
324
+ [IsMultiplicativeElementCollection],
325
+ function(coll)
326
+ if not IsGeneratorsOfInverseSemigroup(coll) then
327
+ ErrorNoReturn("the argument (a mult. elt. coll.) does not ",
328
+ "satisfy IsGeneratorsOfInverseSemigroup");
329
+ fi;
330
+ if Length(coll) < 2 then
331
+ return coll;
332
+ fi;
333
+ return GeneratorsOfInverseSemigroup(InverseSemigroup(coll,
334
+ rec(small := true)));
335
+ end);
336
+
337
+ InstallMethod(SmallInverseSemigroupGeneratingSet,
338
+ "for an inverse semigroup with inverse op",
339
+ [IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
340
+ S -> SmallSemigroupGeneratingSet(GeneratorsOfInverseSemigroup(S)));
341
+
342
+ InstallMethod(SmallInverseMonoidGeneratingSet,
343
+ "for generators of an inverse monoid",
344
+ [IsMultiplicativeElementWithOneCollection],
345
+ function(coll)
346
+ if not IsGeneratorsOfInverseSemigroup(coll) then
347
+ ErrorNoReturn("the argument (a mult. elt. coll.) do not satisfy ",
348
+ "IsGeneratorsOfInverseSemigroup");
349
+ fi;
350
+ # The empty list does not satisfy IsGeneratorsOfInverseSemigroup
351
+ Assert(1, not IsEmpty(coll));
352
+ if Length(coll) = 1 then
353
+ if coll[1] = One(coll) then
354
+ return [];
355
+ fi;
356
+ return coll;
357
+ fi;
358
+ return GeneratorsOfInverseMonoid(InverseMonoid(coll, rec(small := true)));
359
+ end);
360
+
361
+ InstallMethod(SmallInverseMonoidGeneratingSet,
362
+ "for an inverse monoid with inverse op",
363
+ [IsInverseMonoid and IsGeneratorsOfInverseSemigroup],
364
+ function(S)
365
+ if IsEmpty(GeneratorsOfInverseMonoid(S)) then
366
+ return GeneratorsOfInverseMonoid(S);
367
+ fi;
368
+ return SmallMonoidGeneratingSet(GeneratorsOfInverseMonoid(S));
369
+ end);
370
+
371
+ InstallMethod(SmallGeneratingSet, "for a semigroup",
372
+ [IsSemigroup],
373
+ function(S)
374
+
375
+ if HasGeneratorsOfSemigroupIdeal(S) then
376
+ return MinimalIdealGeneratingSet(S);
377
+ elif HasGeneratorsOfInverseMonoid(S) then
378
+ return SmallInverseMonoidGeneratingSet(S);
379
+ elif HasGeneratorsOfInverseSemigroup(S) then
380
+ return SmallInverseSemigroupGeneratingSet(S);
381
+ elif HasGeneratorsOfMonoid(S) then
382
+ return SmallMonoidGeneratingSet(S);
383
+ fi;
384
+
385
+ return SmallSemigroupGeneratingSet(S);
386
+ end);
387
+
388
+ InstallMethod(StructureDescription, "for a Brandt semigroup",
389
+ [IsBrandtSemigroup],
390
+ function(S)
391
+ local D;
392
+ D := MaximalDClasses(S)[1];
393
+ return Concatenation("B(", StructureDescription(GroupHClass(D)), ", ",
394
+ String(NrRClasses(D)), ")");
395
+ end);
396
+
397
+ # same method for ideals
398
+
399
+ InstallMethod(StructureDescription, "for a group as semigroup",
400
+ [IsGroupAsSemigroup],
401
+ function(S)
402
+ if IsGroup(S) then
403
+ TryNextMethod();
404
+ fi;
405
+ return StructureDescription(Range(IsomorphismPermGroup(S)));
406
+ end);
407
+
408
+ # same method for ideals
409
+
410
+ InstallMethod(MultiplicativeZero, "for a semigroup",
411
+ [IsSemigroup],
412
+ function(S)
413
+ local gens, D, rep;
414
+
415
+ if IsSemigroupIdeal(S)
416
+ and HasMultiplicativeZero(SupersemigroupOfIdeal(S)) then
417
+ return MultiplicativeZero(SupersemigroupOfIdeal(S));
418
+ elif HasMinimalDClass(S) then
419
+ D := MinimalDClass(S);
420
+ if HasSize(D) then
421
+ if IsTrivial(D) then
422
+ return Representative(D);
423
+ fi;
424
+ return fail;
425
+ fi;
426
+ elif IsSemigroupIdeal(S) then
427
+ return MultiplicativeZero(SupersemigroupOfIdeal(S));
428
+ elif not IsFinite(S) then
429
+ Info(InfoWarning,
430
+ 1,
431
+ "may not be able to find the multiplicative zero, ",
432
+ "the semigroup is infinite");
433
+ # Cannot currently test this line, because the next method runs forever
434
+ TryNextMethod();
435
+ fi;
436
+
437
+ rep := RepresentativeOfMinimalIdeal(S);
438
+ gens := GeneratorsOfSemigroup(S);
439
+
440
+ if ForAll(gens, x -> x * rep = rep and rep * x = rep) then
441
+ return rep;
442
+ fi;
443
+
444
+ return fail;
445
+ end);
446
+
447
+ InstallMethod(MultiplicativeZero, "for a free semigroup",
448
+ [IsFreeSemigroup], ReturnFail);
449
+
450
+ InstallMethod(MultiplicativeZero, "for a free inverse semigroup",
451
+ [IsFreeInverseSemigroup], ReturnFail);
452
+
453
+ InstallMethod(LengthOfLongestDClassChain, "for a semigroup",
454
+ [IsSemigroup],
455
+ function(S)
456
+ local D, min;
457
+
458
+ if not IsFinite(S) then
459
+ TryNextMethod();
460
+ fi;
461
+
462
+ D := DigraphReverse(PartialOrderOfDClasses(S));
463
+ Assert(1, Length(DigraphSources(D)) = 1);
464
+ min := DigraphSources(D)[1]; # minimal D-class
465
+ SetMinimalDClass(S, GreensDClasses(S)[min]);
466
+ SetRepresentativeOfMinimalIdeal(S, Representative(
467
+ GreensDClasses(S)[min]));
468
+
469
+ return DigraphLongestDistanceFromVertex(D, min);
470
+ end);
471
+
472
+ InstallMethod(NilpotencyDegree, "for a finite semigroup",
473
+ [IsSemigroup and IsFinite],
474
+ function(S)
475
+ if not IsNilpotentSemigroup(S) then
476
+ return fail;
477
+ fi;
478
+ return LengthOfLongestDClassChain(S) + 1;
479
+ end);
480
+
481
+ InstallMethod(MinimalDClass, "for a semigroup", [IsSemigroup],
482
+ S -> GreensDClassOfElementNC(S, RepresentativeOfMinimalIdeal(S)));
483
+
484
+ #############################################################################
485
+ ## 2. Methods for attributes where there are known better methods for acting
486
+ ## semigroups.
487
+ #############################################################################
488
+
489
+ InstallMethod(IsGreensDGreaterThanFunc,
490
+ "for a semigroup with CanUseFroidurePin",
491
+ [IsSemigroup and CanUseFroidurePin],
492
+ function(S)
493
+ local D, id;
494
+
495
+ if not IsFinite(S) then
496
+ TryNextMethod();
497
+ fi;
498
+
499
+ D := PartialOrderOfDClasses(S);
500
+ id := GreensDRelation(S)!.data.id;
501
+
502
+ return function(x, y)
503
+ local u, v;
504
+ if x = y then
505
+ return false;
506
+ fi;
507
+ u := id[PositionCanonical(S, x)];
508
+ v := id[PositionCanonical(S, y)];
509
+ return u <> v and IsReachable(D, u, v);
510
+ end;
511
+ end);
512
+
513
+ InstallMethod(MaximalDClasses,
514
+ "for a semigroup with CanUseFroidurePin",
515
+ [IsSemigroup and CanUseFroidurePin],
516
+ function(S)
517
+ local D;
518
+ if NrDClasses(S) = 1 then
519
+ return DClasses(S);
520
+ fi;
521
+ D := PartialOrderOfDClasses(S);
522
+ return DClasses(S){DigraphSources(D)};
523
+ end);
524
+
525
+ InstallMethod(MaximalDClasses,
526
+ "for a finite monoid as semigroup with mult. neutral elt",
527
+ [IsFinite and IsMonoidAsSemigroup and HasMultiplicativeNeutralElement],
528
+ S -> [DClass(S, MultiplicativeNeutralElement(S))]);
529
+
530
+ InstallMethod(MaximalLClasses,
531
+ "for a semigroup that CanUseFroidurePin",
532
+ [IsSemigroup and CanUseFroidurePin],
533
+ function(S)
534
+
535
+ if NrLClasses(S) = 1 then
536
+ return LClasses(S);
537
+ fi;
538
+
539
+ return LClasses(S){DigraphSources(PartialOrderOfLClasses(S))};
540
+ end);
541
+
542
+ InstallMethod(MaximalRClasses,
543
+ "for a semigroup that CanUseFroidurePin",
544
+ [IsSemigroup and CanUseFroidurePin],
545
+ function(S)
546
+
547
+ if NrRClasses(S) = 1 then
548
+ return RClasses(S);
549
+ fi;
550
+
551
+ return RClasses(S){DigraphSources(PartialOrderOfRClasses(S))};
552
+ end);
553
+
554
+ # same method for ideals
555
+
556
+ InstallMethod(StructureDescriptionMaximalSubgroups,
557
+ "for a semigroup", [IsSemigroup],
558
+ function(S)
559
+ local out, D;
560
+
561
+ if not IsFinite(S) then
562
+ TryNextMethod();
563
+ fi;
564
+
565
+ out := [];
566
+ for D in RegularDClasses(S) do
567
+ AddSet(out, StructureDescription(GroupHClass(D)));
568
+ od;
569
+
570
+ return out;
571
+ end);
572
+
573
+ InstallMethod(IdempotentGeneratedSubsemigroup, "for a semigroup",
574
+ [IsSemigroup],
575
+ function(S)
576
+ local out;
577
+ if not IsFinite(S) then
578
+ TryNextMethod();
579
+ fi;
580
+ out := Semigroup(Idempotents(S), rec(small := true));
581
+ SetIsIdempotentGenerated(out, true);
582
+ if HasIsSemigroupWithCommutingIdempotents(S)
583
+ and IsSemigroupWithCommutingIdempotents(S) then
584
+ SetIsSemigroupWithCommutingIdempotents(out, true);
585
+ fi;
586
+ return out;
587
+ end);
588
+
589
+ InstallMethod(IdempotentGeneratedSubsemigroup,
590
+ "for a Rees matrix subsemigroup",
591
+ [IsReesMatrixSubsemigroup],
592
+ function(R)
593
+ local mat, I, J, nrrows, nrcols, min, max, gens, out, i;
594
+
595
+ if not IsFinite(R) or not IsReesMatrixSemigroup(R)
596
+ or not IsGroup(UnderlyingSemigroup(R)) then
597
+ TryNextMethod();
598
+ fi;
599
+
600
+ mat := Matrix(R);
601
+ I := Rows(R);
602
+ J := Columns(R);
603
+ nrrows := Length(I);
604
+ nrcols := Length(J);
605
+
606
+ min := Minimum(nrrows, nrcols);
607
+ max := Maximum(nrrows, nrcols);
608
+ gens := EmptyPlist(max);
609
+ for i in [1 .. min] do
610
+ Add(gens, RMSElement(R, I[i], mat[J[i]][I[i]] ^ -1, J[i]));
611
+ od;
612
+ for i in [min + 1 .. nrrows] do
613
+ Add(gens, RMSElement(R, I[i], mat[J[1]][I[i]] ^ -1, J[1]));
614
+ od;
615
+ for i in [min + 1 .. nrcols] do
616
+ Add(gens, RMSElement(R, I[1], mat[J[i]][I[1]] ^ -1, J[i]));
617
+ od;
618
+ out := Semigroup(gens);
619
+ SetIsRegularSemigroup(out, true);
620
+ SetIsIdempotentGenerated(out, true);
621
+ SetIsSimpleSemigroup(out, true);
622
+ return out;
623
+ end);
624
+
625
+ InstallMethod(IdempotentGeneratedSubsemigroup,
626
+ "for a Rees 0-matrix subsemigroup",
627
+ [IsReesZeroMatrixSubsemigroup],
628
+ function(R)
629
+ local mat, gr, gens, I, J, nrrows, k, out, i, j;
630
+
631
+ if not IsFinite(R) or not IsReesZeroMatrixSemigroup(R)
632
+ or not IsGroup(UnderlyingSemigroup(R)) then
633
+ TryNextMethod();
634
+ fi;
635
+
636
+ mat := Matrix(R);
637
+ gr := RZMSDigraph(R);
638
+ gens := [];
639
+
640
+ if IsCompleteBipartiteDigraph(ReducedDigraph(gr)) or IsEmptyDigraph(gr) then
641
+ Add(gens, MultiplicativeZero(R));
642
+ fi;
643
+
644
+ gr := OutNeighbours(UndirectedSpanningForest(gr));
645
+ I := Rows(R);
646
+ J := Columns(R);
647
+ nrrows := Length(I);
648
+
649
+ for i in [1 .. nrrows] do
650
+ for j in gr[i] do
651
+ k := J[j - nrrows];
652
+ Add(gens, RMSElement(R, I[i], mat[k][I[i]] ^ -1, k));
653
+ od;
654
+ od;
655
+
656
+ out := Semigroup(gens);
657
+ SetIsRegularSemigroup(out, true);
658
+ SetIsIdempotentGenerated(out, true);
659
+ return out;
660
+ end);
661
+
662
+ InstallMethod(InjectionPrincipalFactor, "for a Green's D-class (Semigroups)",
663
+ [IsGreensDClass],
664
+ function(D)
665
+ if not IsRegularDClass(D) then
666
+ ErrorNoReturn("the argument (a Green's D-class) is not regular");
667
+ elif NrHClasses(D) = NrIdempotents(D) then
668
+ return SEMIGROUPS.InjectionPrincipalFactor(D, ReesMatrixSemigroup);
669
+ fi;
670
+ return SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
671
+ end);
672
+
673
+ InstallMethod(InjectionNormalizedPrincipalFactor,
674
+ "for a Green's D-class (Semigroups)",
675
+ [IsGreensDClass],
676
+ function(D)
677
+ local iso1, iso2, rms, inv1, inv2, iso, inv, hom;
678
+
679
+ if not IsRegularDClass(D) then
680
+ ErrorNoReturn("the argument (a Green's D-class) is not regular");
681
+ elif NrHClasses(D) = NrIdempotents(D) then
682
+ iso1 := SEMIGROUPS.InjectionPrincipalFactor(D, ReesMatrixSemigroup);
683
+ iso2 := RMSNormalization(Range(iso1));
684
+ else
685
+ iso1 := SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
686
+ iso2 := RZMSNormalization(Range(iso1));
687
+ fi;
688
+
689
+ rms := Range(iso2);
690
+ inv1 := InverseGeneralMapping(iso1);
691
+ inv2 := InverseGeneralMapping(iso2);
692
+ iso := x -> (x ^ iso1) ^ iso2;
693
+ inv := x -> (x ^ inv2) ^ inv1;
694
+ hom := MappingByFunction(D, rms, iso, inv);
695
+ SetIsInjective(hom, true);
696
+ SetIsTotal(hom, true);
697
+ return hom;
698
+ end);
699
+
700
+ InstallMethod(MultiplicativeNeutralElement,
701
+ "for a semigroup with CanUseFroidurePin + generators",
702
+ [IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup],
703
+ function(S)
704
+ local D, e;
705
+
706
+ if not IsFinite(S) then
707
+ TryNextMethod();
708
+ elif IsMultiplicativeElementWithOneCollection(S) and One(S) in S then
709
+ return One(S);
710
+ elif Length(MaximalDClasses(S)) > 1 then
711
+ return fail;
712
+ fi;
713
+
714
+ D := MaximalDClasses(S)[1];
715
+
716
+ if NrHClasses(D) <> 1 or not IsRegularDClass(D) then
717
+ return fail;
718
+ fi;
719
+
720
+ e := Idempotents(D)[1];
721
+
722
+ if ForAll(GeneratorsOfSemigroup(S), x -> e * x = x and x * e = x) then
723
+ return e;
724
+ fi;
725
+ return fail;
726
+ end);
727
+
728
+ # same method for inverse/ideals
729
+
730
+ InstallMethod(RepresentativeOfMinimalIdeal, "for a semigroup",
731
+ [IsSemigroup],
732
+ function(S)
733
+
734
+ if HasMultiplicativeZero(S) and MultiplicativeZero(S) <> fail then
735
+ return MultiplicativeZero(S);
736
+ elif HasIsSimpleSemigroup(S) and IsSimpleSemigroup(S) then
737
+ # This catches known trivial semigroups
738
+ return Representative(S);
739
+ elif IsSemigroupIdeal(S) and
740
+ (HasRepresentativeOfMinimalIdeal(SupersemigroupOfIdeal(S))
741
+ or not HasGeneratorsOfSemigroup(S)) then
742
+ return RepresentativeOfMinimalIdeal(SupersemigroupOfIdeal(S));
743
+ elif not IsFinite(S) then
744
+ TryNextMethod();
745
+ fi;
746
+
747
+ return RepresentativeOfMinimalIdealNC(S);
748
+ end);
749
+
750
+ InstallMethod(RepresentativeOfMinimalIdealNC, "for a finite semigroup",
751
+ [IsSemigroup and IsFinite],
752
+ function(S)
753
+ local D, pos;
754
+ D := PartialOrderOfDClasses(S);
755
+ pos := DigraphSinks(D)[1];
756
+ Assert(1, Length(DigraphSinks(D)) = 1);
757
+ return Representative(DClasses(S)[pos]);
758
+ end);
759
+
760
+ InstallMethod(InversesOfSemigroupElementNC,
761
+ "for a group as semigroup and a multiplicative element",
762
+ [IsGroupAsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
763
+ function(G, x)
764
+ local i, iso, inv;
765
+ if IsMultiplicativeElementWithInverse(x) then
766
+ i := InverseOp(x);
767
+ if i <> fail then
768
+ return [i];
769
+ fi;
770
+ fi;
771
+ iso := IsomorphismPermGroup(G);
772
+ inv := InverseGeneralMapping(iso);
773
+ return [((x ^ iso) ^ -1) ^ inv];
774
+ end);
775
+
776
+ InstallMethod(InversesOfSemigroupElementNC,
777
+ "for a semigroup that can use froidure-pin and a multiplicative element",
778
+ [CanUseFroidurePin, IsMultiplicativeElement],
779
+ function(S, a)
780
+ local R, L, inverses, e, f, s;
781
+ R := RClass(S, a);
782
+ L := LClass(S, a);
783
+ inverses := EmptyPlist(NrIdempotents(R) * NrIdempotents(L));
784
+
785
+ for e in Idempotents(R) do
786
+ s := RightGreensMultiplierNC(S, a, e) * e;
787
+ for f in Idempotents(L) do
788
+ Add(inverses, f * s);
789
+ od;
790
+ od;
791
+ return inverses;
792
+ end);
793
+
794
+ InstallMethod(InversesOfSemigroupElement,
795
+ "for a semigroup that can use froidure-pin and a multiplicative element",
796
+ [CanUseFroidurePin, IsMultiplicativeElement], # to beat the library method
797
+ function(S, x)
798
+ if not IsFinite(S) then
799
+ TryNextMethod();
800
+ elif not x in S then
801
+ ErrorNoReturn("the 2nd argument (a mult. element) must belong to the 1st ",
802
+ "argument (a semigroup)");
803
+ fi;
804
+ return InversesOfSemigroupElementNC(S, x);
805
+ end);
806
+
807
+ InstallMethod(OneInverseOfSemigroupElementNC,
808
+ "for a semigroup and a multiplicative element",
809
+ [IsSemigroup, IsMultiplicativeElement],
810
+ function(S, x)
811
+ if not IsFinite(S) then
812
+ TryNextMethod();
813
+ fi;
814
+ return First(EnumeratorSorted(S),
815
+ y -> x * y * x = x and y * x * y = y);
816
+ end);
817
+
818
+ InstallMethod(OneInverseOfSemigroupElementNC,
819
+ "for CanUseFroidurePin and a multiplicative element",
820
+ [CanUseFroidurePin, IsMultiplicativeElement],
821
+ function(S, a)
822
+ local R, L, e, f, s;
823
+ R := RClass(S, a);
824
+ L := LClass(S, a);
825
+ e := Idempotents(R);
826
+ if IsEmpty(e) then
827
+ return fail;
828
+ fi;
829
+ e := e[1];
830
+ f := Idempotents(L);
831
+ if IsEmpty(f) then
832
+ return fail;
833
+ fi;
834
+ f := f[1];
835
+ s := RightGreensMultiplierNC(S, a, e);
836
+ return f * s * e;
837
+ end);
838
+
839
+ InstallMethod(OneInverseOfSemigroupElement,
840
+ "for a semigroup and a multiplicative element",
841
+ [IsSemigroup, IsMultiplicativeElement],
842
+ function(S, x)
843
+ if not IsFinite(S) then
844
+ ErrorNoReturn("the semigroup is not finite");
845
+ elif not x in S then
846
+ ErrorNoReturn("the 2nd argument (a mult. element) must belong to the 1st ",
847
+ "argument (a semigroup)");
848
+ fi;
849
+ return OneInverseOfSemigroupElementNC(S, x);
850
+ end);
851
+
852
+ InstallMethod(UnderlyingSemigroupOfSemigroupWithAdjoinedZero,
853
+ "for a semigroup",
854
+ [IsSemigroup],
855
+ function(S)
856
+ local zero, gens, T;
857
+
858
+ if HasIsSemigroupWithAdjoinedZero(S)
859
+ and not IsSemigroupWithAdjoinedZero(S) then
860
+ return fail;
861
+ fi;
862
+
863
+ zero := MultiplicativeZero(S);
864
+ if zero = fail then
865
+ return fail;
866
+ fi;
867
+
868
+ gens := GeneratorsOfSemigroup(S);
869
+ if Length(gens) = 1 then
870
+ return fail;
871
+ elif not zero in gens then
872
+ return fail;
873
+ fi;
874
+
875
+ T := Semigroup(Difference(gens, [zero]));
876
+
877
+ if zero in T then
878
+ return fail;
879
+ fi;
880
+ return T;
881
+ end);
882
+
883
+ BindGlobal("_SemigroupSizeByIndexPeriod",
884
+ function(S)
885
+ local gen, ind;
886
+ gen := MinimalSemigroupGeneratingSet(S)[1];
887
+ ind := IndexPeriodOfSemigroupElement(gen);
888
+ if ind[1] = 1 then
889
+ SetIsGroupAsSemigroup(S, true);
890
+ fi;
891
+ return Sum(ind) - 1;
892
+ end);
893
+
894
+ InstallMethod(Size,
895
+ "for a monogenic transformation semigroup with minimal generating set",
896
+ [IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
897
+ IsTransformationSemigroup],
898
+ 10, # to beat IsActingSemigroup
899
+ _SemigroupSizeByIndexPeriod);
900
+
901
+ InstallMethod(Size,
902
+ "for a monogenic partial perm semigroup with minimal generating set",
903
+ [IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
904
+ IsPartialPermSemigroup],
905
+ 10, # to beat IsActingSemigroup
906
+ _SemigroupSizeByIndexPeriod);
907
+
908
+ InstallMethod(Size,
909
+ "for a monogenic bipartition semigroup with minimal generating set",
910
+ [IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
911
+ IsBipartitionSemigroup],
912
+ 10, # to beat IsActingSemigroup
913
+ _SemigroupSizeByIndexPeriod);
914
+
915
+ InstallMethod(Size,
916
+ "for a monogenic semigroup of matrices over finite field with minimal gen set",
917
+ [IsMonogenicSemigroup and HasMinimalSemigroupGeneratingSet and
918
+ IsMatrixOverFiniteFieldSemigroup],
919
+ _SemigroupSizeByIndexPeriod);
920
+
921
+ MakeReadWriteGlobal("_SemigroupSizeByIndexPeriod");
922
+ Unbind(_SemigroupSizeByIndexPeriod);
923
+
924
+ InstallMethod(IndecomposableElements, "for a semigroup", [IsSemigroup],
925
+ function(S)
926
+ local out, D;
927
+
928
+ if HasIsSurjectiveSemigroup(S) and IsSurjectiveSemigroup(S) then
929
+ return [];
930
+ fi;
931
+ out := [];
932
+ for D in MaximalDClasses(S) do
933
+ if not IsRegularDClass(D) then
934
+ AddSet(out, Representative(D));
935
+ fi;
936
+ od;
937
+ return out;
938
+ end);
939
+
940
+ InstallMethod(MinimalSemigroupGeneratingSet, "for a free semigroup",
941
+ [IsFreeSemigroup], GeneratorsOfSemigroup);
942
+
943
+ InstallMethod(MinimalSemigroupGeneratingSet, "for a semigroup",
944
+ [IsSemigroup],
945
+ function(S)
946
+ local gens, indecomp, id, T, zero, iso, inv, G, x, D, non_unit_gens, classes,
947
+ po, nbs;
948
+
949
+ if IsTrivial(S) then
950
+ return [Representative(S)];
951
+ elif IsGroupAsSemigroup(S) then
952
+ iso := IsomorphismPermGroup(S);
953
+ inv := InverseGeneralMapping(iso);
954
+ G := Range(iso);
955
+ return Images(inv, MinimalGeneratingSet(G));
956
+ elif IsMonogenicSemigroup(S) then
957
+ return [Representative(MaximalDClasses(S)[1])];
958
+ fi;
959
+
960
+ gens := IrredundantGeneratingSubset(S);
961
+
962
+ # A semigroup that has a 2-generating set but is not monogenic has rank 2.
963
+ if Length(gens) = 2 then
964
+ return gens;
965
+ fi;
966
+
967
+ # A generating set for a semigroup that has either a one/zero adjoined is
968
+ # minimal if and only if it contains that one/zero, and is minimal for the
969
+ # semigroup without the one/zero.
970
+ if IsMonoidAsSemigroup(S) and IsTrivial(GroupOfUnits(S)) then
971
+ id := MultiplicativeNeutralElement(S);
972
+ T := Semigroup(Filtered(gens, x -> x <> id));
973
+ return Concatenation([id], MinimalSemigroupGeneratingSet(T));
974
+ elif IsSemigroupWithAdjoinedZero(S) then
975
+ zero := MultiplicativeZero(S);
976
+ T := Semigroup(Filtered(gens, x -> x <> zero));
977
+ return Concatenation([zero], MinimalSemigroupGeneratingSet(T));
978
+ fi;
979
+
980
+ # The indecomposable elements are contains in any generating set. If the
981
+ # indecomposable elements (or if not, the indecomposable elements plus a
982
+ # single element) generate the semigroup, then you have a minimal generating
983
+ # set.
984
+ indecomp := IndecomposableElements(S);
985
+ if Length(gens) = Length(indecomp) then
986
+ return indecomp;
987
+ elif not IsEmpty(indecomp) then
988
+ x := Difference(gens, Semigroup(indecomp));
989
+ if Length(x) = 1 then
990
+ return Concatenation(x, indecomp);
991
+ fi;
992
+ fi;
993
+
994
+ # A generating set for a monoid that consists of a minimal generating set for
995
+ # the group of units and exactly one generator in each D-class immediately
996
+ # below the group of units is minimal.
997
+ if IsMonoidAsSemigroup(S) then
998
+ D := DClass(S, MultiplicativeNeutralElement(S));
999
+ non_unit_gens := Filtered(gens, x -> not x in D);
1000
+ classes := List(non_unit_gens, x -> Position(DClasses(S), DClass(S, x)));
1001
+ if IsDuplicateFreeList(classes) then
1002
+ po := PartialOrderOfDClasses(S);
1003
+ po := DigraphReflexiveTransitiveReduction(po);
1004
+ nbs := OutNeighboursOfVertex(po, Position(DClasses(S), D));
1005
+ if ForAll(classes, x -> x in nbs) then
1006
+ iso := IsomorphismPermGroup(GroupOfUnits(S));
1007
+ inv := InverseGeneralMapping(iso);
1008
+ G := Range(iso);
1009
+ return Concatenation(Images(inv, MinimalGeneratingSet(G)),
1010
+ non_unit_gens);
1011
+ fi;
1012
+ fi;
1013
+ fi;
1014
+
1015
+ # An irredundant generating set of a finite semigroup that contains at most
1016
+ # one generator per D-class is minimal.
1017
+ if IsFinite(S) and (IsDTrivial(S) or
1018
+ Length(Set(gens, x -> DClass(S, x))) = Length(gens)) then
1019
+ return gens;
1020
+ fi;
1021
+
1022
+ ErrorNoReturn("no further methods for computing minimal generating sets ",
1023
+ "are implemented");
1024
+ end);
1025
+
1026
+ InstallMethod(MinimalMonoidGeneratingSet, "for a free monoid",
1027
+ [IsFreeMonoid], GeneratorsOfMonoid);
1028
+
1029
+ InstallMethod(MinimalMonoidGeneratingSet, "for a monoid",
1030
+ [IsMonoid],
1031
+ function(S)
1032
+ local one, gens, new;
1033
+
1034
+ one := One(S);
1035
+ if IsTrivial(S) then
1036
+ return [one];
1037
+ fi;
1038
+
1039
+ gens := MinimalSemigroupGeneratingSet(S);
1040
+ if not IsTrivial(GroupOfUnits(S)) then
1041
+ return gens;
1042
+ fi;
1043
+ new := Difference(gens, [one]);
1044
+ if One(new) = one then
1045
+ # The One of the non-identity generators is the One, so One is not needed.
1046
+ return new;
1047
+ fi;
1048
+
1049
+ # This currently applies to only partial perm monoids: sometimes, the One
1050
+ # of the non-One generators is not the One of the monoid. Therefore the One
1051
+ # has to be included in the GeneratorsOfMonoid. WARNING: therefore
1052
+ # MinimalMonoidGeneratingSet may include the One even though, mathematically,
1053
+ # it shouldn't be needed. For example, see symmetric inverse monoid on 1 pt.
1054
+ return gens;
1055
+ end);
1056
+
1057
+ InstallMethod(NambooripadPartialOrder, "for a semigroup",
1058
+ [IsSemigroup],
1059
+ function(S)
1060
+ local elts, p, func, out, i, j;
1061
+
1062
+ if not IsFinite(S) then
1063
+ ErrorNoReturn("the argument (a semigroup) is not finite");
1064
+ elif not IsRegularSemigroup(S) then
1065
+ ErrorNoReturn("the argument (a semigroup) is not regular");
1066
+ elif IsInverseSemigroup(S) then
1067
+ return NaturalPartialOrder(S);
1068
+ fi;
1069
+
1070
+ Info(InfoWarning, 2, "NambooripadPartialOrder: this method ",
1071
+ "fully enumerates its argument!");
1072
+
1073
+ elts := ShallowCopy(Elements(S));
1074
+ p := Sortex(elts, {x, y} -> IsGreensDGreaterThanFunc(S)(y, x)) ^ -1;
1075
+ func := NambooripadLeqRegularSemigroup(S);
1076
+ out := List([1 .. Size(S)], x -> []);
1077
+
1078
+ for i in [1 .. Size(S)] do
1079
+ for j in [i + 1 .. Size(S)] do
1080
+ if func(elts[i], elts[j]) then
1081
+ AddSet(out[j ^ p], i ^ p);
1082
+ fi;
1083
+ od;
1084
+ od;
1085
+ return out;
1086
+ end);
1087
+
1088
+ InstallMethod(NambooripadLeqRegularSemigroup, "for a semigroup",
1089
+ [IsSemigroup],
1090
+ function(S)
1091
+ if not IsFinite(S) then
1092
+ ErrorNoReturn("the argument (a semigroup) is not finite");
1093
+ elif not IsRegularSemigroup(S) then
1094
+ ErrorNoReturn("the argument (a semigroup) is not regular");
1095
+ elif IsInverseSemigroup(S) then
1096
+ return NaturalLeqInverseSemigroup(S);
1097
+ fi;
1098
+
1099
+ return
1100
+ function(x, y)
1101
+ local E;
1102
+ E := Idempotents(S);
1103
+ return ForAny(E, e -> e * y = x)
1104
+ and ForAny(E, f -> y * f = x);
1105
+ end;
1106
+ end);
1107
+
1108
+ InstallMethod(LeftIdentity,
1109
+ "for semigroup with CanUseFroidurePin and mult. elt.",
1110
+ [IsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
1111
+ function(S, x)
1112
+ local i, p, result;
1113
+ if not x in S then
1114
+ Error("the 2nd argument (a mult. elt.) does not belong to the 1st ",
1115
+ "argument (a semigroup)");
1116
+ elif IsMonoid(S) then
1117
+ return One(S);
1118
+ elif IsMonoidAsSemigroup(S) then
1119
+ return MultiplicativeNeutralElement(S);
1120
+ elif IsIdempotent(x) then
1121
+ return x;
1122
+ fi;
1123
+
1124
+ i := PositionCanonical(S, x);
1125
+ p := DigraphPath(LeftCayleyDigraph(S), i, i);
1126
+ if p = fail then
1127
+ return fail;
1128
+ fi;
1129
+ result := EvaluateWord(GeneratorsOfSemigroup(S), Reversed(p[2]));
1130
+ return result ^ SmallestIdempotentPower(result);
1131
+ end);
1132
+
1133
+ InstallMethod(RightIdentity,
1134
+ "for semgroup with CanUseFroidurePin and mult. elt.",
1135
+ [IsSemigroup and CanUseFroidurePin, IsMultiplicativeElement],
1136
+ function(S, x)
1137
+ local i, p, result;
1138
+ if not x in S then
1139
+ Error("the 2nd argument (a mult. elt.) does not belong to the 1st ",
1140
+ "argument (a semigroup)");
1141
+ elif IsMonoid(S) then
1142
+ return One(S);
1143
+ elif IsMonoidAsSemigroup(S) then
1144
+ return MultiplicativeNeutralElement(S);
1145
+ elif IsIdempotent(x) then
1146
+ return x;
1147
+ fi;
1148
+
1149
+ i := PositionCanonical(S, x);
1150
+ p := DigraphPath(RightCayleyDigraph(S), i, i);
1151
+ if p = fail then
1152
+ return fail;
1153
+ fi;
1154
+ result := EvaluateWord(GeneratorsOfSemigroup(S), p[2]);
1155
+ return result ^ SmallestIdempotentPower(result);
1156
+ end);
1157
+
1158
+ InstallMethod(MultiplicationTableWithCanonicalPositions,
1159
+ "for a semigroup with CanUseFroidurePin",
1160
+ [IsSemigroup and CanUseFroidurePin],
1161
+ function(S)
1162
+ local n, sortedlist, t, tinv, M;
1163
+ n := Size(S);
1164
+ sortedlist := AsSortedList(S);
1165
+
1166
+ t := PermList(List([1 .. n], i -> PositionCanonical(S, sortedlist[i])));
1167
+ tinv := t ^ -1;
1168
+ M := MultiplicationTable(S);
1169
+
1170
+ return List([1 .. n], i -> List([1 .. n], j -> M[i ^ tinv][j ^ tinv] ^ t));
1171
+ end);
1172
+
1173
+ InstallMethod(TransposedMultiplicationTableWithCanonicalPositions,
1174
+ "for a semigroup with CanUseFroidurePin",
1175
+ [IsSemigroup and CanUseFroidurePin],
1176
+ S -> TransposedMat(MultiplicationTableWithCanonicalPositions(S)));
1177
+
1178
+ InstallMethod(MinimalFaithfulTransformationDegree, "for a right zero semigroup",
1179
+ [IsRightZeroSemigroup],
1180
+ function(S)
1181
+ local max, deg;
1182
+
1183
+ max := 0;
1184
+ deg := 0;
1185
+ while max < Size(S) do
1186
+ deg := deg + 1;
1187
+ if (deg mod 3) = 0 then
1188
+ max := 3 ^ (deg / 3);
1189
+ elif (deg mod 3) = 1 then
1190
+ max := 4 * 3 ^ ((deg - 4) / 3);
1191
+ else
1192
+ max := 2 * 3 ^ ((deg - 2) / 3);
1193
+ fi;
1194
+ od;
1195
+ return deg;
1196
+ end);
1197
+
1198
+ InstallMethod(MinimalFaithfulTransformationDegree, "for a left zero semigroup",
1199
+ [IsLeftZeroSemigroup],
1200
+ function(S)
1201
+ local max, deg, N, r;
1202
+ max := 0;
1203
+ deg := 0;
1204
+ while max < Size(S) do
1205
+ deg := deg + 1;
1206
+ for r in [1 .. deg - 1] do
1207
+ N := r ^ (deg - r);
1208
+ if N > max then
1209
+ max := N;
1210
+ fi;
1211
+ od;
1212
+ od;
1213
+ return deg;
1214
+ end);