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