passagemath-gap-pkg-semigroups 10.6.30__cp311-cp311-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-311-darwin.so +0 -0
@@ -0,0 +1,1658 @@
1
+ ###############################################################################
2
+ ##
3
+ ## attributes/properties.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 determining properties of arbitrary
12
+ # semigroups. There are not very many specialised methods for acting semigroups
13
+ # and so we only have a single file.
14
+
15
+ # Ecom (commuting idempotents), LI (locally trivial),
16
+ # LG (locally group), B1 (dot-depth one), DA (regular D-classes are idempotent)
17
+ # R v L (???), IsNilpotentSemigroup, inverses, local submonoid, right ideal,
18
+ # left ideal, kernel!?
19
+
20
+ # IsLeftCancellative,
21
+ # IsRightCancellative, IsRightGroup, IsLeftGroup, IsUnitarySemigroup,
22
+ # IsRightUnitarySemigp, IsLeftUnitarySemigp, IsCongruenceFree,
23
+ # PrimitiveIdempotents, IdempotentOrder,
24
+ # IsLeftNormalBand, IsRightNormalBand, IsNormalBand, IsEUnitarySemigroup
25
+ # IsRectangularGroup, IsBandOfGroups, IsFreeBand, IsFreeSemilattice,
26
+ # IsFreeNormalBand, , IsFundamentalInverseSemigp,
27
+ # IsFullSubsemigroup (of an inverse semigroup), IsFactorizableInverseMonoid,
28
+ # IsFInverseSemigroup, IsSemigroupWithCentralIdempotents, IsLeftUnipotent,
29
+ # IsRightUnipotent, IsSemigroupWithClosedIdempotents, .
30
+
31
+ # same method for ideals, works for finite and infinite
32
+
33
+ InstallMethod(IsBand, "for a semigroup",
34
+ [IsSemigroup],
35
+ function(S)
36
+ if HasParent(S) and HasIsBand(Parent(S)) and IsBand(Parent(S)) then
37
+ return true;
38
+ fi;
39
+ return IsCompletelyRegularSemigroup(S) and IsHTrivial(S);
40
+ end);
41
+
42
+ # same method for ideals, works for finite and infinite
43
+
44
+ InstallMethod(IsBand, "for an inverse semigroup", [IsInverseSemigroup],
45
+ IsSemilattice);
46
+
47
+ # same method for ideals
48
+
49
+ InstallMethod(IsBlockGroup, "for a semigroup",
50
+ [IsSemigroup],
51
+ function(S)
52
+ local D;
53
+
54
+ if HasParent(S) and HasIsBlockGroup(Parent(S))
55
+ and IsBlockGroup(Parent(S)) then
56
+ return true;
57
+ elif (HasIsRegularSemigroup(S) and IsRegularSemigroup(S))
58
+ and (HasIsInverseSemigroup(S) and not IsInverseSemigroup(S)) then
59
+ Info(InfoSemigroups, 2, "regular but non-inverse semigroup");
60
+ return false;
61
+ elif not IsFinite(S) then
62
+ TryNextMethod();
63
+ fi;
64
+
65
+ for D in DClasses(S) do
66
+ if IsRegularDClass(D)
67
+ and (ForAny(RClasses(D), x -> NrIdempotents(x) > 1)
68
+ or NrRClasses(D) <> NrLClasses(D)) then
69
+ return false;
70
+ fi;
71
+ od;
72
+ return true;
73
+ end);
74
+
75
+ InstallMethod(IsSemigroupWithCommutingIdempotents, "for a semigroup",
76
+ [IsSemigroup],
77
+ function(S)
78
+ local ids, n, i, j;
79
+ ids := Idempotents(S);
80
+ n := Length(ids);
81
+ for i in [1 .. n - 1] do
82
+ for j in [i + 1 .. n] do
83
+ if ids[i] * ids[j] <> ids[j] * ids[i] then
84
+ return false;
85
+ fi;
86
+ od;
87
+ od;
88
+ return true;
89
+ end);
90
+
91
+ InstallMethod(IsSemigroupWithCommutingIdempotents,
92
+ "for a semigroup with idempotent generated subsemigroup",
93
+ [IsSemigroup and HasIdempotentGeneratedSubsemigroup],
94
+ S -> IsCommutativeSemigroup(IdempotentGeneratedSubsemigroup(S)));
95
+
96
+ # same method for ideals
97
+
98
+ InstallMethod(IsBrandtSemigroup, "for a semigroup",
99
+ [IsSemigroup],
100
+ function(S)
101
+ if not IsFinite(S) then
102
+ return false;
103
+ fi;
104
+ return IsZeroSimpleSemigroup(S) and IsInverseSemigroup(S);
105
+ end);
106
+
107
+ # same method for ideals
108
+
109
+ InstallMethod(IsCongruenceFreeSemigroup, "for a semigroup",
110
+ [IsSemigroup],
111
+ function(S)
112
+ local rowsDiff, T, P;
113
+
114
+ if not IsFinite(S) then
115
+ TryNextMethod();
116
+ fi;
117
+
118
+ rowsDiff := function(p)
119
+ local i, j;
120
+ for i in [1 .. Size(p) - 1] do
121
+ for j in [i + 1 .. Size(p)] do
122
+ if p[i] = p[j] then
123
+ return false;
124
+ fi;
125
+ od;
126
+ od;
127
+ return true;
128
+ end;
129
+
130
+ if Size(S) <= 2 then
131
+ return true;
132
+ elif MultiplicativeZero(S) <> fail then
133
+ # CASE 1: S has zero
134
+ if IsZeroSimpleSemigroup(S) then
135
+ # Find an isomorphic RZMS
136
+ T := Range(IsomorphismReesZeroMatrixSemigroup(S));
137
+ if IsTrivial(UnderlyingSemigroup(T)) then
138
+ # Check that no two rows or columns are identical
139
+ P := Matrix(T);
140
+ if rowsDiff(P) and rowsDiff(TransposedMat(P)) then
141
+ return true;
142
+ fi;
143
+ fi;
144
+ fi;
145
+ return false;
146
+ fi;
147
+
148
+ # CASE 2: S has no zero
149
+ return (IsGroup(S) and IsSimpleGroup(S))
150
+ or (IsGroupAsSemigroup(S)
151
+ and IsSimpleGroup(Range(IsomorphismPermGroup(S))));
152
+ end);
153
+
154
+ # same method for regular ideals, or non-regular without a generating set
155
+
156
+ InstallMethod(IsCliffordSemigroup, "for a semigroup",
157
+ [IsSemigroup],
158
+ function(S)
159
+ if HasParent(S) and HasIsCliffordSemigroup(Parent(S))
160
+ and IsCliffordSemigroup(Parent(S)) then
161
+ return true;
162
+ elif not IsFinite(S) then
163
+ TryNextMethod();
164
+ fi;
165
+
166
+ return IsRegularSemigroup(S) and NrHClasses(S) = NrDClasses(S);
167
+ end);
168
+
169
+ # same method for non-regular ideals
170
+
171
+ InstallMethod(IsCliffordSemigroup,
172
+ "for a semigroup with generators",
173
+ [IsSemigroup and HasGeneratorsOfSemigroup],
174
+ function(S)
175
+ local gens, idem, f, g;
176
+
177
+ if HasParent(S) and HasIsCliffordSemigroup(Parent(S))
178
+ and IsCliffordSemigroup(Parent(S)) then
179
+ return true;
180
+ elif HasIsInverseSemigroup(S) and not IsInverseSemigroup(S) then
181
+ Info(InfoSemigroups, 2, "the semigroup is not inverse");
182
+ return false;
183
+ elif HasIsCompletelyRegularSemigroup(S)
184
+ and not IsCompletelyRegularSemigroup(S) then
185
+ Info(InfoSemigroups, 2, "the semigroup is not completely regular");
186
+ return false;
187
+ elif not IsFinite(S) then
188
+ TryNextMethod();
189
+ elif IsGroupAsSemigroup(S) then
190
+ Info(InfoSemigroups, 2, "the semigroup is a group");
191
+ return true;
192
+ elif not IsRegularSemigroup(S) then
193
+ Info(InfoSemigroups, 2, "the semigroup is not regular");
194
+ return false;
195
+ fi;
196
+
197
+ gens := GeneratorsOfSemigroup(S);
198
+ idem := List(gens, x -> One(GreensHClassOfElementNC(S, x)));
199
+
200
+ for f in gens do
201
+ for g in idem do
202
+ if not f * g = g * f then
203
+ Info(InfoSemigroups, 2, "the idempotents are not central:");
204
+ Info(InfoSemigroups, 2, " ", f, "\n#I and\n#I ", g,
205
+ "\n#I do not commute,");
206
+ return false;
207
+ fi;
208
+ od;
209
+ od;
210
+
211
+ return true;
212
+ end);
213
+
214
+ # same method for inverse ideals
215
+
216
+ InstallMethod(IsCliffordSemigroup, "for an inverse acting semigroup",
217
+ [IsInverseSemigroup and IsActingSemigroup],
218
+ S -> ForAll(OrbSCC(LambdaOrb(S)), x -> Length(x) = 1));
219
+
220
+ InstallMethod(IsCliffordSemigroup,
221
+ "for an partial perm semigroup with generators",
222
+ [IsPartialPermSemigroup and HasGeneratorsOfSemigroup], 100,
223
+ function(S)
224
+ local x, y;
225
+
226
+ for x in GeneratorsOfSemigroup(S) do
227
+ for y in GeneratorsOfSemigroup(S) do
228
+ if Intersection(DomainOfPartialPerm(x), DomainOfPartialPerm(y)) <>
229
+ DomainOfPartialPerm(x * y) then
230
+ return false;
231
+ fi;
232
+ od;
233
+ od;
234
+ return true;
235
+ end);
236
+
237
+ # different method for ideals
238
+
239
+ InstallMethod(IsCommutativeSemigroup, "for a semigroup with generators",
240
+ [IsSemigroup and HasGeneratorsOfSemigroup],
241
+ function(S)
242
+ local gens, n, i, j;
243
+
244
+ if not IsFinite(S) then
245
+ TryNextMethod();
246
+ fi;
247
+
248
+ gens := GeneratorsOfSemigroup(S);
249
+ n := Length(gens);
250
+
251
+ for i in [1 .. n - 1] do
252
+ for j in [i + 1 .. n] do
253
+ if not gens[i] * gens[j] = gens[j] * gens[i] then
254
+ Info(InfoSemigroups, 2, "generators ", i, " and ", j,
255
+ " do not commute");
256
+ return false;
257
+ fi;
258
+ od;
259
+ od;
260
+
261
+ return true;
262
+ end);
263
+
264
+ # same method for non-regular ideals with generators
265
+
266
+ InstallMethod(IsCompletelyRegularSemigroup,
267
+ "for an acting semigroup with generators",
268
+ [IsActingSemigroup and HasGeneratorsOfSemigroup],
269
+ function(S)
270
+ local record, gens, f, o, pos;
271
+
272
+ if HasParent(S) and HasIsCompletelyRegularSemigroup(Parent(S))
273
+ and IsCompletelyRegularSemigroup(Parent(S)) then
274
+ return true;
275
+ elif HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
276
+ Info(InfoSemigroups, 2, "semigroup is not regular");
277
+ return false;
278
+ fi;
279
+
280
+ record := ShallowCopy(LambdaOrbOpts(S));
281
+ record.treehashsize := SEMIGROUPS.OptionsRec(S).hashlen;
282
+ gens := List(GeneratorsOfSemigroup(S), x -> ConvertToInternalElement(S, x));
283
+
284
+ for f in GeneratorsOfSemigroup(S) do
285
+ f := ConvertToInternalElement(S, f);
286
+ o := Orb(gens, LambdaFunc(S)(f), LambdaAct(S), record);
287
+ pos := LookForInOrb(o,
288
+ {o, x} -> LambdaRank(S)(LambdaAct(S)(x, f))
289
+ <> LambdaRank(S)(x),
290
+ 1);
291
+ # for transformations we could use IsInjectiveListTrans instead
292
+ # and the performance would be better!
293
+
294
+ if pos <> false then
295
+ Info(InfoSemigroups, 2, "at least one H-class is not a subgroup");
296
+ return false;
297
+ fi;
298
+ od;
299
+
300
+ return true;
301
+ end);
302
+
303
+ # same method for regular ideals, or non-regular without a generating set
304
+
305
+ InstallMethod(IsCompletelyRegularSemigroup, "for a semigroup",
306
+ [IsSemigroup],
307
+ function(S)
308
+ if HasParent(S) and HasIsCompletelyRegularSemigroup(Parent(S))
309
+ and IsCompletelyRegularSemigroup(Parent(S)) then
310
+ return true;
311
+ elif HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
312
+ Info(InfoSemigroups, 2, "semigroup is not regular");
313
+ return false;
314
+ elif not IsFinite(S) then
315
+ TryNextMethod();
316
+ fi;
317
+
318
+ return NrHClasses(S) = NrIdempotents(S);
319
+ end);
320
+
321
+ # same method for inverse ideals
322
+
323
+ InstallMethod(IsCompletelyRegularSemigroup, "for an inverse semigroup",
324
+ [IsInverseSemigroup], IsCliffordSemigroup);
325
+
326
+ # Notes: this test required to avoid conflict with Smallsemi,
327
+ # DeclareSynonymAttr causes problems.
328
+
329
+ # same method for ideals
330
+
331
+ InstallMethod(IsCompletelySimpleSemigroup, "for a semigroup",
332
+ [IsSemigroup],
333
+ function(S)
334
+ if not IsFinite(S) then
335
+ TryNextMethod();
336
+ fi;
337
+ return IsSimpleSemigroup(S);
338
+ end);
339
+
340
+ # same method for ideals
341
+
342
+ InstallMethod(IsEUnitaryInverseSemigroup,
343
+ "for an inverse semigroup with inverse op",
344
+ [IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
345
+ function(S)
346
+ if not IsFinite(S) then
347
+ TryNextMethod();
348
+ fi;
349
+ return IsMajorantlyClosed(S, IdempotentGeneratedSubsemigroup(S));
350
+ end);
351
+
352
+ InstallMethod(IsEUnitaryInverseSemigroup, "for a semigroup",
353
+ [IsSemigroup],
354
+ function(S)
355
+ if not IsFinite(S) then
356
+ TryNextMethod();
357
+ elif not IsInverseSemigroup(S) then
358
+ return false;
359
+ fi;
360
+ return IsEUnitaryInverseSemigroup(AsSemigroup(IsPartialPermSemigroup, S));
361
+ end);
362
+
363
+ # different method for ideals TODO(later) or same?
364
+
365
+ InstallMethod(IsFactorisableInverseMonoid,
366
+ "for an inverse semigroup with generators",
367
+ [IsInverseSemigroup and HasGeneratorsOfSemigroup],
368
+ function(S)
369
+ local G, iso, enum, func, x;
370
+
371
+ if not IsFinite(S) then
372
+ TryNextMethod();
373
+ fi;
374
+
375
+ G := GroupOfUnits(S);
376
+
377
+ if G = fail then
378
+ return false;
379
+ elif IsTrivial(G) then
380
+ return IsSemilattice(S);
381
+ fi;
382
+
383
+ iso := InverseGeneralMapping(IsomorphismPermGroup(G));
384
+ enum := Enumerator(Source(iso));
385
+ func := NaturalLeqInverseSemigroup(S);
386
+
387
+ for x in Generators(S) do
388
+ if not x in G then
389
+ if not ForAny(enum, y -> func(x, y ^ iso)) then
390
+ return false;
391
+ fi;
392
+ fi;
393
+ od;
394
+ return true;
395
+ end);
396
+
397
+ InstallMethod(IsHTrivial, "for a trans. semigroup with known generators",
398
+ [IsTransformationSemigroup and HasGeneratorsOfSemigroup],
399
+ function(S)
400
+ local x;
401
+ for x in GeneratorsOfSemigroup(S) do
402
+ if IndexPeriodOfTransformation(x)[2] <> 1 then
403
+ return false;
404
+ fi;
405
+ od;
406
+ TryNextMethod();
407
+ end);
408
+
409
+ InstallMethod(IsHTrivial, "for a p. perm. semigroup with known generators",
410
+ [IsPartialPermSemigroup and HasGeneratorsOfSemigroup],
411
+ function(S)
412
+ local x;
413
+ for x in GeneratorsOfSemigroup(S) do
414
+ if IndexPeriodOfPartialPerm(x)[2] <> 1 then
415
+ return false;
416
+ fi;
417
+ od;
418
+ TryNextMethod();
419
+ end);
420
+
421
+ # same method for ideals
422
+
423
+ InstallMethod(IsHTrivial, "for an acting semigroup",
424
+ [IsActingSemigroup],
425
+ function(S)
426
+ local D;
427
+
428
+ if HasParent(S) and HasIsHTrivial(Parent(S)) and IsHTrivial(Parent(S)) then
429
+ return true;
430
+ fi;
431
+
432
+ for D in IteratorOfDClasses(S) do
433
+ if not IsTrivial(SchutzenbergerGroup(D)) then
434
+ return false;
435
+ fi;
436
+ od;
437
+ return true;
438
+ end);
439
+
440
+ InstallMethod(IsHTrivial, "for a semigroup", [IsSemigroup],
441
+ function(S)
442
+ if HasParent(S) and HasIsHTrivial(Parent(S)) and IsHTrivial(Parent(S)) then
443
+ return true;
444
+ elif not IsFinite(S) then
445
+ TryNextMethod();
446
+ fi;
447
+ # TODO(later) use IndexPeriodOfSemigroupElement as above
448
+ return NrHClasses(S) = Size(S);
449
+ end);
450
+
451
+ # same method for non-inverse ideals
452
+
453
+ InstallMethod(IsLTrivial, "for an acting semigroup",
454
+ [IsActingSemigroup],
455
+ function(S)
456
+ local D;
457
+
458
+ if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
459
+ return true;
460
+ fi;
461
+
462
+ for D in IteratorOfDClasses(S) do
463
+ if not IsTrivial(SchutzenbergerGroup(D)) or Length(RhoOrbSCC(D)) <> 1 then
464
+ return false;
465
+ fi;
466
+ od;
467
+
468
+ return true;
469
+ end);
470
+
471
+ # same method for inverse ideals
472
+
473
+ InstallMethod(IsLTrivial, "for an inverse acting semigroup",
474
+ [IsInverseActingSemigroupRep],
475
+ function(S)
476
+ if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
477
+ return true;
478
+ fi;
479
+ return ForAll(OrbSCC(LambdaOrb(S)), x -> Length(x) = 1);
480
+ end);
481
+
482
+ # same method for ideals
483
+
484
+ InstallMethod(IsLTrivial, "for a semigroup",
485
+ [IsSemigroup],
486
+ function(S)
487
+ if HasParent(S) and HasIsLTrivial(Parent(S)) and IsLTrivial(Parent(S)) then
488
+ return true;
489
+ elif not IsFinite(S) then
490
+ TryNextMethod();
491
+ fi;
492
+
493
+ return NrLClasses(S) = Size(S);
494
+ end);
495
+
496
+ # same method for ideals
497
+
498
+ InstallMethod(IsRTrivial, "for an inverse semigroup",
499
+ [IsInverseSemigroup], IsLTrivial);
500
+
501
+ # different method for ideals
502
+
503
+ InstallMethod(IsRTrivial, "for a transformation semigroup with generators",
504
+ [IsTransformationSemigroup and HasGeneratorsOfSemigroup],
505
+ 2, # to beat the method for acting semigroups
506
+ S -> IsAcyclicDigraph(DigraphRemoveLoops(DigraphOfActionOnPoints(S))));
507
+
508
+ # different method for ideals
509
+
510
+ InstallMethod(IsRTrivial, "for a partial perm semigroup with generators",
511
+ [IsPartialPermSemigroup and HasGeneratorsOfSemigroup],
512
+ function(S)
513
+ if ForAny(GeneratorsOfSemigroup(S),
514
+ x -> ForAny(CyclesOfPartialPerm(x), y -> Length(y) > 1)) then
515
+ return false;
516
+ fi;
517
+ return ForAll(CyclesOfPartialPermSemigroup(S), x -> Length(x) = 1);
518
+ end);
519
+
520
+ # same method for non-inverse ideals
521
+
522
+ InstallMethod(IsRTrivial, "for an acting semigroup",
523
+ [IsActingSemigroup],
524
+ function(S)
525
+ local x;
526
+
527
+ if HasParent(S) and HasIsRTrivial(Parent(S)) and IsRTrivial(Parent(S)) then
528
+ return true;
529
+ elif IsClosedData(SemigroupData(S)) and IsClosedOrbit(RhoOrb(S)) then
530
+ for x in GreensDClasses(S) do
531
+ if (not IsTrivial(SchutzenbergerGroup(x)))
532
+ or Length(LambdaOrbSCC(x)) > 1 then
533
+ return false;
534
+ fi;
535
+ od;
536
+ return true;
537
+ fi;
538
+
539
+ for x in IteratorOfRClasses(S) do
540
+ if (not IsTrivial(SchutzenbergerGroup(x)))
541
+ or Length(LambdaOrbSCC(x)) > 1 then
542
+ return false;
543
+ fi;
544
+ od;
545
+
546
+ return true;
547
+ end);
548
+
549
+ InstallMethod(IsRTrivial, "for a semigroup", [IsSemigroup],
550
+ function(S)
551
+ if HasParent(S) and HasIsRTrivial(Parent(S)) and IsRTrivial(Parent(S)) then
552
+ return true;
553
+ elif not IsFinite(S) then
554
+ TryNextMethod();
555
+ fi;
556
+
557
+ return Size(S) = NrRClasses(S);
558
+ end);
559
+
560
+ InstallMethod(IsGroupAsSemigroup, "for a semigroup",
561
+ [IsSemigroup],
562
+ function(S)
563
+ if HasParent(S) and HasIsGroupAsSemigroup(Parent(S))
564
+ and IsGroupAsSemigroup(Parent(S)) then
565
+ return true;
566
+ elif not IsFinite(S) then
567
+ TryNextMethod();
568
+ fi;
569
+ return NrRClasses(S) = 1 and NrLClasses(S) = 1;
570
+ end);
571
+
572
+ # same method for non-regular ideals
573
+
574
+ InstallMethod(IsGroupAsSemigroup, "for an acting semigroup",
575
+ [IsActingSemigroup],
576
+ function(S)
577
+ local gens, lambdafunc, lambda, rhofunc, rho, tester, lambda_f, rho_f, f;
578
+
579
+ if HasParent(S) and HasIsGroupAsSemigroup(Parent(S))
580
+ and IsGroupAsSemigroup(Parent(S)) then
581
+ return true;
582
+ fi;
583
+
584
+ gens := GeneratorsOfSemigroup(S); # not GeneratorsOfMonoid!
585
+
586
+ if IsActingSemigroupWithFixedDegreeMultiplication(S)
587
+ and ForAll(gens, x -> ActionRank(S)(x) = ActionDegree(x)) then
588
+ return true;
589
+ fi;
590
+
591
+ lambdafunc := LambdaFunc(S);
592
+ lambda := lambdafunc(gens[1]);
593
+ rhofunc := RhoFunc(S);
594
+ rho := rhofunc(gens[1]);
595
+ tester := IdempotentTester(S);
596
+
597
+ for f in gens do
598
+ lambda_f := lambdafunc(f);
599
+ rho_f := rhofunc(f);
600
+ if lambda_f <> lambda or rho_f <> rho or not tester(lambda_f, rho_f) then
601
+ return false;
602
+ fi;
603
+ od;
604
+
605
+ return true;
606
+ end);
607
+
608
+ # same method for ideals
609
+
610
+ InstallMethod(IsIdempotentGenerated, "for a semigroup",
611
+ [IsSemigroup],
612
+ function(S)
613
+ local gens, T, ranks, min, new, max, i;
614
+
615
+ if not IsFinite(S) then
616
+ TryNextMethod();
617
+ elif HasIsMonoidAsSemigroup(S) and IsMonoidAsSemigroup(S)
618
+ and not IsTrivial(GroupOfUnits(S)) then
619
+ return false;
620
+ fi;
621
+
622
+ gens := GeneratorsOfSemigroup(S);
623
+
624
+ if ForAll(gens, IsIdempotent) then
625
+ Info(InfoSemigroups, 2, "all the generators are idempotents");
626
+ return true;
627
+ elif HasIdempotentGeneratedSubsemigroup(S) or not IsActingSemigroup(S) then
628
+ T := IdempotentGeneratedSubsemigroup(S);
629
+ else
630
+ ranks := List(gens, x -> ActionRank(S)(x));
631
+ min := MinimumList(ranks);
632
+ if HasIdempotents(S) then
633
+ new := Filtered(Idempotents(S), x -> ActionRank(S)(x) >= min);
634
+ else
635
+ max := MaximumList(ranks);
636
+ new := [];
637
+ for i in [min .. max] do
638
+ Append(new, Idempotents(S, i));
639
+ od;
640
+ fi;
641
+ if IsEmpty(new) then
642
+ return false;
643
+ fi;
644
+ T := Semigroup(new, rec(acting := true));
645
+ fi;
646
+
647
+ # T is not always the idempotent generated subsemigroup!
648
+ return ForAll(gens, x -> x in T);
649
+ end);
650
+
651
+ # same method for inverse ideals
652
+
653
+ InstallMethod(IsIdempotentGenerated, "for an inverse semigroup",
654
+ [IsInverseSemigroup], IsSemilattice);
655
+
656
+ # same method for ideals
657
+
658
+ InstallMethod(IsInverseSemigroup, "for a semigroup",
659
+ [IsSemigroup],
660
+ 1, # to beat sgpviz
661
+ function(S)
662
+ local lambda, rho, x;
663
+
664
+ if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
665
+ Info(InfoSemigroups, 2, "the semigroup is not regular");
666
+ return false;
667
+ elif not IsFinite(S) then
668
+ TryNextMethod();
669
+ elif HasGeneratorsOfSemigroup(S) and
670
+ IsGeneratorsOfInverseSemigroup(GeneratorsOfSemigroup(S)) and
671
+ ForAll(GeneratorsOfSemigroup(S), x -> x ^ -1 in S) then
672
+ return true;
673
+ elif IsCompletelyRegularSemigroup(S) then
674
+ Info(InfoSemigroups, 2, "the semigroup is completely regular");
675
+ return IsCliffordSemigroup(S);
676
+ elif IsActingSemigroup(S) then
677
+ lambda := LambdaOrb(S);
678
+ Enumerate(lambda);
679
+ rho := RhoOrb(S);
680
+ Enumerate(rho, Length(lambda) + 1);
681
+ if not (IsClosedOrbit(rho) and Length(rho) = Length(lambda)) then
682
+ Info(InfoSemigroups, 2,
683
+ "the numbers of lambda and rho values are not equal");
684
+ return false;
685
+ fi;
686
+ fi;
687
+
688
+ if HasGreensDClasses(S) then
689
+ for x in GreensDClasses(S) do
690
+ if not IsRegularGreensClass(x)
691
+ or NrRClasses(x) <> NrLClasses(x)
692
+ or NrIdempotents(x) <> NrRClasses(x) then
693
+ return false;
694
+ fi;
695
+ od;
696
+ return true;
697
+ fi;
698
+
699
+ return NrLClasses(S) = NrRClasses(S)
700
+ and IsRegularSemigroup(S)
701
+ and NrIdempotents(S) = NrRClasses(S);
702
+ end);
703
+
704
+ # same method for ideals
705
+
706
+ InstallMethod(IsLeftSimple, "for a semigroup", [IsSemigroup],
707
+ function(S)
708
+ if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
709
+ return false;
710
+ elif not IsFinite(S) then
711
+ TryNextMethod();
712
+ fi;
713
+ return NrLClasses(S) = 1;
714
+ end);
715
+
716
+ # same method for ideals
717
+
718
+ InstallMethod(IsLeftSimple, "for an inverse semigroup",
719
+ [IsInverseSemigroup], IsGroupAsSemigroup);
720
+
721
+ # different method for ideals without generators
722
+
723
+ InstallMethod(IsLeftZeroSemigroup,
724
+ "for an acting semigroup with generators",
725
+ [IsActingSemigroup and HasGeneratorsOfSemigroup],
726
+ function(S)
727
+ local gens, lambda, val, x;
728
+
729
+ if HasParent(S) and HasIsLeftZeroSemigroup(Parent(S))
730
+ and IsLeftZeroSemigroup(Parent(S)) then
731
+ return true;
732
+ fi;
733
+
734
+ gens := GeneratorsOfSemigroup(S);
735
+ lambda := LambdaFunc(S);
736
+ val := lambda(gens[1]);
737
+
738
+ for x in gens do
739
+ if lambda(x) <> val then
740
+ return false;
741
+ fi;
742
+ od;
743
+
744
+ return ForAll(gens, IsIdempotent);
745
+ end);
746
+
747
+ # works for finite and infinite
748
+
749
+ InstallMethod(IsLeftZeroSemigroup, "for a semigroup", [IsSemigroup],
750
+ function(S)
751
+ if HasParent(S) and HasIsLeftZeroSemigroup(Parent(S))
752
+ and IsLeftZeroSemigroup(Parent(S)) then
753
+ return true;
754
+ elif not IsFinite(S) then
755
+ TryNextMethod();
756
+ fi;
757
+ return IsLeftSimple(S) and IsRTrivial(S);
758
+ end);
759
+
760
+ # same method for ideals
761
+
762
+ InstallMethod(IsLeftZeroSemigroup, "for an inverse semigroup",
763
+ [IsInverseSemigroup], IsTrivial);
764
+
765
+ # not applicable for ideals
766
+
767
+ InstallImmediateMethod(IsMonogenicSemigroup,
768
+ IsSemigroup and IsFinite and HasGeneratorsOfSemigroup,
769
+ 0,
770
+ function(S)
771
+ local gens;
772
+
773
+ gens := GeneratorsOfSemigroup(S);
774
+ if Length(gens) <= 1 then
775
+ SetMinimalSemigroupGeneratingSet(S, gens);
776
+ return Length(gens) = 1;
777
+ elif CanEasilyCompareElements(gens)
778
+ and ForAll([2 .. Length(gens)], i -> gens[1] = gens[i]) then
779
+ SetMinimalSemigroupGeneratingSet(S, [gens[1]]);
780
+ return true;
781
+ fi;
782
+ TryNextMethod();
783
+ end);
784
+
785
+ InstallImmediateMethod(IsMonogenicMonoid,
786
+ IsMonoid and IsFinite and HasGeneratorsOfMonoid,
787
+ 0,
788
+ function(S)
789
+ local gens;
790
+
791
+ gens := GeneratorsOfMonoid(S);
792
+ if Length(gens) <= 1 then
793
+ SetMinimalMonoidGeneratingSet(S, gens);
794
+ return true;
795
+ elif CanEasilyCompareElements(gens)
796
+ and ForAll([2 .. Length(gens)], i -> gens[1] = gens[i]) then
797
+ SetMinimalMonoidGeneratingSet(S, [gens[1]]);
798
+ return true;
799
+ fi;
800
+ TryNextMethod();
801
+ end);
802
+
803
+ # same method for ideals
804
+
805
+ InstallMethod(IsMonogenicSemigroup, "for a semigroup",
806
+ [IsSemigroup],
807
+ function(S)
808
+ local I, gens, y, i;
809
+
810
+ if HasGeneratorsOfSemigroup(S) then
811
+ gens := GeneratorsOfSemigroup(S);
812
+
813
+ if not IsDuplicateFreeList(gens) then
814
+ gens := ShallowCopy(DuplicateFreeList(gens));
815
+ Info(InfoSemigroups, 2, "there are repeated generators");
816
+ fi;
817
+
818
+ if Length(gens) = 1 then
819
+ Info(InfoSemigroups, 2, "the semigroup only has one generator");
820
+ SetMinimalSemigroupGeneratingSet(S, gens);
821
+ return true;
822
+ fi;
823
+ fi;
824
+
825
+ if not IsFinite(S) then
826
+ TryNextMethod();
827
+ fi;
828
+
829
+ I := MinimalIdeal(S);
830
+
831
+ if not (IsGroup(I) or IsGroupAsSemigroup(I)) then
832
+ Info(InfoSemigroups, 2, "the minimal ideal is not a group.");
833
+ return false;
834
+ elif not IsCyclic(Range(IsomorphismPermGroup(I))) then
835
+ Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
836
+ return false;
837
+ elif HasGreensDClasses(S) then
838
+ i := NrDClasses(S);
839
+ if not IsTrivial(I) then
840
+ i := i - 1;
841
+ fi;
842
+ if i <> Number(GreensDClasses(S), IsTrivial) then
843
+ return false;
844
+ fi;
845
+ fi;
846
+
847
+ gens := GeneratorsOfSemigroup(S);
848
+
849
+ for i in [1 .. Length(gens)] do
850
+ y := gens[i];
851
+ if ForAll(gens, x -> x in Semigroup(y)) then
852
+ Info(InfoSemigroups, 2, "the semigroup is generated by generator ", i);
853
+ SetMinimalSemigroupGeneratingSet(S, [y]);
854
+ return true;
855
+ fi;
856
+ od;
857
+ Info(InfoSemigroups, 2, "at least one generator does not belong to the",
858
+ " semigroup generated by any ");
859
+ Info(InfoSemigroups, 2, "other generator.");
860
+ return false;
861
+ end);
862
+
863
+ # same method for ideals
864
+
865
+ InstallMethod(IsMonogenicInverseSemigroup, "for a semigroup",
866
+ [IsSemigroup],
867
+ function(S)
868
+ if not IsInverseSemigroup(S) then
869
+ return false;
870
+ elif not IsFinite(S) then
871
+ TryNextMethod();
872
+ fi;
873
+ return IsMonogenicInverseSemigroup(AsSemigroup(IsPartialPermSemigroup, S));
874
+ end);
875
+
876
+ # same method for ideals
877
+
878
+ InstallMethod(IsMonogenicInverseSemigroup,
879
+ "for an inverse semigroup with inverse op",
880
+ [IsInverseSemigroup and IsGeneratorsOfInverseSemigroup],
881
+ function(S)
882
+ local gens, I, y, i;
883
+
884
+ if HasGeneratorsOfInverseSemigroup(S) then
885
+ gens := GeneratorsOfInverseSemigroup(S);
886
+
887
+ if not IsDuplicateFreeList(gens) then
888
+ gens := ShallowCopy(DuplicateFreeList(gens));
889
+ Info(InfoSemigroups, 2, "there are repeated generators");
890
+ fi;
891
+
892
+ if Length(gens) = 1 then
893
+ Info(InfoSemigroups, 2, "the inverse semigroup only has one generator");
894
+ SetMinimalInverseSemigroupGeneratingSet(S, gens);
895
+ return true;
896
+ fi;
897
+ fi;
898
+
899
+ if not IsFinite(S) then
900
+ TryNextMethod();
901
+ fi;
902
+
903
+ I := MinimalIdeal(S);
904
+
905
+ if not IsCyclic(Range(IsomorphismPermGroup(I))) then
906
+ Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
907
+ return false;
908
+ fi;
909
+
910
+ gens := GeneratorsOfInverseSemigroup(S);
911
+
912
+ for i in [1 .. Length(gens)] do
913
+ y := gens[i];
914
+ if ForAll(gens, x -> x in InverseSemigroup(y)) then
915
+ Info(InfoSemigroups, 2, "the inverse semigroup is generated by ",
916
+ "generator ", i);
917
+ SetMinimalInverseSemigroupGeneratingSet(S, [y]);
918
+ return true;
919
+ fi;
920
+ od;
921
+
922
+ Info(InfoSemigroups, 2, "at least one generator does not belong to the",
923
+ " inverse semigroup generated by any ");
924
+ Info(InfoSemigroups, 2, "other generator.");
925
+ return false;
926
+ end);
927
+
928
+ InstallMethod(IsMonogenicMonoid, "for a monoid",
929
+ [IsMonoid],
930
+ function(S)
931
+ local I, gens, y, i;
932
+
933
+ if HasGeneratorsOfMonoid(S) then
934
+ gens := GeneratorsOfMonoid(S);
935
+
936
+ if not IsDuplicateFreeList(gens) then
937
+ gens := ShallowCopy(DuplicateFreeList(gens));
938
+ Info(InfoSemigroups, 2, "there are repeated generators");
939
+ fi;
940
+
941
+ if Length(gens) = 1 then
942
+ Info(InfoSemigroups, 2, "the monoid only has one generator");
943
+ SetMinimalMonoidGeneratingSet(S, gens);
944
+ return true;
945
+ fi;
946
+ fi;
947
+
948
+ if not IsFinite(S) then
949
+ TryNextMethod();
950
+ fi;
951
+
952
+ I := MinimalIdeal(S);
953
+
954
+ if not (IsGroup(I) or IsGroupAsSemigroup(I)) then
955
+ Info(InfoSemigroups, 2, "the minimal ideal is not a group.");
956
+ return false;
957
+ elif not IsCyclic(Range(IsomorphismPermGroup(I))) then
958
+ Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
959
+ return false;
960
+ elif HasGreensDClasses(S) then
961
+ i := NrDClasses(S);
962
+ if not IsTrivial(I) then
963
+ i := i - 1;
964
+ fi;
965
+ if i <> Number(GreensDClasses(S), IsTrivial) then
966
+ return false;
967
+ fi;
968
+ fi;
969
+
970
+ gens := GeneratorsOfMonoid(S);
971
+
972
+ for i in [1 .. Length(gens)] do
973
+ y := gens[i];
974
+ if ForAll(gens, x -> x in Monoid(y)) then
975
+ Info(InfoSemigroups, 2, "the monoid is generated by generator ", i);
976
+ SetMinimalMonoidGeneratingSet(S, [y]);
977
+ return true;
978
+ fi;
979
+ od;
980
+ Info(InfoSemigroups, 2, "at least one generator does not belong to the",
981
+ " monoid generated by any ");
982
+ Info(InfoSemigroups, 2, "other generator.");
983
+ return false;
984
+ end);
985
+
986
+ InstallMethod(IsMonogenicInverseMonoid, "for a monoid",
987
+ [IsMonoid],
988
+ function(S)
989
+ if not IsInverseMonoid(S) then
990
+ return false;
991
+ elif not IsFinite(S) then
992
+ TryNextMethod();
993
+ fi;
994
+ return IsMonogenicInverseMonoid(AsMonoid(IsPartialPermMonoid, S));
995
+ end);
996
+
997
+ InstallMethod(IsMonogenicInverseMonoid,
998
+ "for an inverse monoid with inverse op",
999
+ [IsInverseMonoid and IsGeneratorsOfInverseSemigroup],
1000
+ function(S)
1001
+ local gens, I, y, i;
1002
+
1003
+ if HasGeneratorsOfInverseMonoid(S) then
1004
+ gens := GeneratorsOfInverseMonoid(S);
1005
+
1006
+ if not IsDuplicateFreeList(gens) then
1007
+ gens := ShallowCopy(DuplicateFreeList(gens));
1008
+ Info(InfoSemigroups, 2, "there are repeated generators");
1009
+ fi;
1010
+
1011
+ if Length(gens) = 1 then
1012
+ Info(InfoSemigroups, 2, "the inverse monoid only has one generator");
1013
+ SetMinimalInverseMonoidGeneratingSet(S, gens);
1014
+ return true;
1015
+ fi;
1016
+ fi;
1017
+
1018
+ if not IsFinite(S) then
1019
+ # WW I cannot find an example of an infinite inverse monoid
1020
+ # with InverseOp - FreeGroup(1) should work, but it is not in the category
1021
+ TryNextMethod();
1022
+ fi;
1023
+
1024
+ I := MinimalIdeal(S);
1025
+
1026
+ if not IsCyclic(Range(IsomorphismPermGroup(I))) then
1027
+ Info(InfoSemigroups, 2, "the minimal ideal is a non-cyclic group.");
1028
+ return false;
1029
+ fi;
1030
+
1031
+ gens := GeneratorsOfInverseMonoid(S);
1032
+
1033
+ for i in [1 .. Length(gens)] do
1034
+ y := gens[i];
1035
+ if ForAll(gens, x -> x in InverseMonoid(y)) then
1036
+ Info(InfoSemigroups, 2, "the inverse monoid is generated by generator ",
1037
+ i);
1038
+ SetMinimalInverseMonoidGeneratingSet(S, [y]);
1039
+ return true;
1040
+ fi;
1041
+ od;
1042
+
1043
+ Info(InfoSemigroups, 2, "at least one generator does not belong to the",
1044
+ " inverse monoid generated by any ");
1045
+ Info(InfoSemigroups, 2, "other generator.");
1046
+ return false;
1047
+ end);
1048
+
1049
+ # same method for ideals
1050
+
1051
+ InstallMethod(IsMonoidAsSemigroup, "for a semigroup",
1052
+ [IsSemigroup], S -> MultiplicativeNeutralElement(S) <> fail);
1053
+
1054
+ # same method for ideals
1055
+
1056
+ InstallMethod(IsOrthodoxSemigroup, "for a semigroup",
1057
+ [IsSemigroup], SUM_FLAGS, # to beat the Smallsemi method
1058
+ function(S)
1059
+ if not IsFinite(S) then
1060
+ # WW we cannot test the following line, since the error message we
1061
+ # eventually get depends on whether or not Smallsemi is loaded
1062
+ TryNextMethod();
1063
+ elif not IsRegularSemigroup(S) then
1064
+ Info(InfoSemigroups, 2, "the semigroup is not regular");
1065
+ return false;
1066
+ fi;
1067
+ Info(InfoSemigroups, 2, "the idempotents do not form a subsemigroup");
1068
+ return IsSemigroupWithClosedIdempotents(S);
1069
+ end);
1070
+
1071
+ InstallMethod(IsSemigroupWithClosedIdempotents, "for a semigroup",
1072
+ [IsSemigroup],
1073
+ function(S)
1074
+ local e, m, i, j;
1075
+
1076
+ if not IsFinite(S) then
1077
+ TryNextMethod();
1078
+ fi;
1079
+
1080
+ e := Idempotents(S);
1081
+ m := NrIdempotents(S);
1082
+
1083
+ for i in [1 .. m] do
1084
+ for j in [i + 1 .. m] do
1085
+ if not IsIdempotent(e[i] * e[j]) or not IsIdempotent(e[j] * e[i]) then
1086
+ Info(InfoSemigroups, 2, "the product of idempotents ", i, " and ", j,
1087
+ " (in some order) is not idempotent");
1088
+ return false;
1089
+ fi;
1090
+ od;
1091
+ od;
1092
+ return true;
1093
+ end);
1094
+
1095
+ InstallTrueMethod(IsSemigroupWithClosedIdempotents,
1096
+ IsSemigroupWithCommutingIdempotents);
1097
+
1098
+ # same method for ideals, works for finite and infinite
1099
+
1100
+ InstallMethod(IsRectangularBand, "for a semigroup",
1101
+ [IsSemigroup],
1102
+ function(S)
1103
+
1104
+ if HasParent(S) and HasIsRectangularBand(Parent(S))
1105
+ and IsRectangularBand(Parent(S)) then
1106
+ return true;
1107
+ elif not IsFinite(S) then
1108
+ TryNextMethod();
1109
+ elif not IsSimpleSemigroup(S) then
1110
+ # this case is not true for infinite semigroups:
1111
+ # the bicyclic monoid is a simple h-trivial semigroup which is not a band
1112
+ Info(InfoSemigroups, 2, "the semigroup is not simple");
1113
+ return false;
1114
+ elif HasIsBand(S) then
1115
+ return IsBand(S);
1116
+ fi;
1117
+
1118
+ return IsHTrivial(S);
1119
+ end);
1120
+
1121
+ # same method for ideals
1122
+
1123
+ InstallMethod(IsRectangularBand, "for an inverse semigroup",
1124
+ [IsInverseSemigroup], IsTrivial);
1125
+
1126
+ # different method for ideals (ideals know at their point of creation if they
1127
+ # are regular or not)
1128
+
1129
+ InstallMethod(IsRegularSemigroup, "for an acting semigroup with generators",
1130
+ [IsActingSemigroup and HasGeneratorsOfSemigroup],
1131
+ function(S)
1132
+ local tester, rhofunc, lookfunc, data, i;
1133
+
1134
+ if IsSimpleSemigroup(S) then
1135
+ Info(InfoSemigroups, 2, "the semigroup is simple");
1136
+ return true;
1137
+ elif HasIsCompletelyRegularSemigroup(S)
1138
+ and IsCompletelyRegularSemigroup(S) then
1139
+ Info(InfoSemigroups, 2, "the semigroup is completely regular");
1140
+ return true;
1141
+ elif HasGreensDClasses(S) then
1142
+ return ForAll(GreensDClasses(S), IsRegularDClass);
1143
+ fi;
1144
+
1145
+ tester := IdempotentTester(S);
1146
+ rhofunc := RhoFunc(S);
1147
+
1148
+ # look for <S> not being regular
1149
+ lookfunc := function(data, x)
1150
+ local rho, scc, i;
1151
+ if data!.repslens[x[2]][data!.orblookup1[x[6]]] > 1 then
1152
+ return true;
1153
+ elif IsActingSemigroupWithFixedDegreeMultiplication(S)
1154
+ and ActionRank(S)(x[4]) = ActionDegree(x[4]) then
1155
+ return false;
1156
+ fi;
1157
+
1158
+ rho := rhofunc(x[4]);
1159
+ scc := OrbSCC(x[3])[x[2]];
1160
+ for i in scc do
1161
+ if tester(x[3][i], rho) then
1162
+ return false;
1163
+ fi;
1164
+ od;
1165
+ return true;
1166
+ end;
1167
+
1168
+ data := SemigroupData(S);
1169
+
1170
+ for i in [2 .. Length(data)] do
1171
+ if lookfunc(data, data[i]) then
1172
+ return false;
1173
+ fi;
1174
+ od;
1175
+
1176
+ if IsClosedData(data) then
1177
+ return true;
1178
+ fi;
1179
+
1180
+ data := Enumerate(data, infinity, lookfunc);
1181
+ return data!.found = false;
1182
+ end);
1183
+
1184
+ # same method for ideals
1185
+
1186
+ InstallMethod(IsRegularSemigroupElement,
1187
+ "for an acting semigroup and multiplicative element",
1188
+ [IsActingSemigroup, IsMultiplicativeElement],
1189
+ function(S, x)
1190
+ local o, scc, rho, tester, i;
1191
+
1192
+ if not x in S then
1193
+ Info(InfoSemigroups, 2, "the element does not belong to the semigroup,");
1194
+ return false;
1195
+ elif HasIsRegularSemigroup(S) and IsRegularSemigroup(S) then
1196
+ Info(InfoSemigroups, 2, "the semigroup is regular,");
1197
+ return true;
1198
+ fi;
1199
+
1200
+ o := LambdaOrb(S);
1201
+ scc := OrbSCC(o)[OrbSCCLookup(o)[Position(o, LambdaFunc(S)(x))]];
1202
+ rho := RhoFunc(S)(x);
1203
+ tester := IdempotentTester(S);
1204
+
1205
+ for i in scc do
1206
+ if tester(o[i], rho) then
1207
+ return true;
1208
+ fi;
1209
+ od;
1210
+ return false;
1211
+ end);
1212
+
1213
+ # same method for ideals
1214
+
1215
+ InstallMethod(IsRegularSemigroupElementNC,
1216
+ "for an acting semigroup and multiplicative element",
1217
+ [IsActingSemigroup, IsMultiplicativeElement],
1218
+ function(S, x)
1219
+ local o, l, scc, rho, tester, i;
1220
+
1221
+ if IsClosedOrbit(LambdaOrb(S)) then
1222
+ o := LambdaOrb(S);
1223
+ l := Position(o, LambdaFunc(S)(x));
1224
+ if l = fail then
1225
+ return false;
1226
+ fi;
1227
+ else
1228
+ # this has to be false, since we're not sure if <x> in <S>
1229
+ o := GradedLambdaOrb(S, x, false);
1230
+ l := 1;
1231
+ fi;
1232
+
1233
+ scc := OrbSCC(o)[OrbSCCLookup(o)[l]];
1234
+ rho := RhoFunc(S)(x);
1235
+ tester := IdempotentTester(S);
1236
+
1237
+ for i in scc do
1238
+ if tester(o[i], rho) then
1239
+ return true;
1240
+ fi;
1241
+ od;
1242
+ return false;
1243
+ end);
1244
+
1245
+ InstallMethod(IsRegularSemigroupElementNC,
1246
+ [IsSemigroup, IsMultiplicativeElement], IsRegularSemigroupElement);
1247
+
1248
+ InstallMethod(IsRegularSemigroupElement, "for semigroup", IsCollsElms,
1249
+ [IsSemigroup, IsMultiplicativeElement],
1250
+ {S, x} -> x in S and IsRegularGreensClass(RClass(S, x)));
1251
+
1252
+ # same method for ideals
1253
+
1254
+ InstallMethod(IsRightSimple, "for a semigroup", [IsSemigroup],
1255
+ function(S)
1256
+ if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
1257
+ return false;
1258
+ elif not IsFinite(S) then
1259
+ TryNextMethod();
1260
+ fi;
1261
+ return NrRClasses(S) = 1;
1262
+ end);
1263
+
1264
+ # same method for ideals
1265
+
1266
+ InstallMethod(IsRightSimple, "for an inverse semigroup",
1267
+ [IsInverseSemigroup], IsGroupAsSemigroup);
1268
+
1269
+ # different method for ideals
1270
+
1271
+ InstallMethod(IsRightZeroSemigroup,
1272
+ "for an acting semigroup with generators",
1273
+ [IsActingSemigroup and HasGeneratorsOfSemigroup],
1274
+ function(S)
1275
+ local gens, rho, val, x;
1276
+
1277
+ if HasParent(S) and HasIsRightZeroSemigroup(Parent(S))
1278
+ and IsRightZeroSemigroup(Parent(S)) then
1279
+ return true;
1280
+ fi;
1281
+
1282
+ gens := GeneratorsOfSemigroup(S);
1283
+ rho := RhoFunc(S);
1284
+ val := rho(gens[1]);
1285
+ for x in gens do
1286
+ if rho(x) <> val or not IsIdempotent(x) then
1287
+ return false;
1288
+ fi;
1289
+ od;
1290
+
1291
+ return true;
1292
+ end);
1293
+
1294
+ InstallMethod(IsRightZeroSemigroup, "for a semigroup", [IsSemigroup],
1295
+ function(S)
1296
+ if HasParent(S) and HasIsRightZeroSemigroup(Parent(S))
1297
+ and IsRightZeroSemigroup(Parent(S)) then
1298
+ return true;
1299
+ elif not IsFinite(S) then
1300
+ TryNextMethod();
1301
+ fi;
1302
+ return NrRClasses(S) = 1 and Size(S) = NrLClasses(S);
1303
+ end);
1304
+
1305
+ # same method for ideals
1306
+
1307
+ InstallMethod(IsRightZeroSemigroup, "for an inverse semigroup",
1308
+ [IsInverseSemigroup], IsTrivial);
1309
+
1310
+ # same method for ideals
1311
+
1312
+ InstallMethod(IsSemiband, "for a semigroup", [IsSemigroup],
1313
+ IsIdempotentGenerated);
1314
+
1315
+ # same method for ideals
1316
+
1317
+ InstallMethod(IsSemilattice, "for a semigroup", [IsSemigroup],
1318
+ function(S)
1319
+ # Do not have to check if HasParent(S) and HasIsSemilattice(Parent(S)) and
1320
+ # IsSemilattice(Parent(S)) since if this is true, then S is an inverse
1321
+ # semigroup and the method after the next is used in preference to this one
1322
+ return IsCommutativeSemigroup(S) and IsBand(S);
1323
+ end);
1324
+
1325
+ # not applicable to ideals
1326
+
1327
+ InstallMethod(IsSemilattice,
1328
+ "for an inverse semigroup with generators",
1329
+ [IsInverseSemigroup and HasGeneratorsOfSemigroup],
1330
+ function(S)
1331
+ if not IsFinite(S) then
1332
+ TryNextMethod();
1333
+ elif HasParent(S) and HasIsSemilattice(Parent(S))
1334
+ and IsSemilattice(Parent(S)) then
1335
+ return true;
1336
+ fi;
1337
+ return ForAll(GeneratorsOfSemigroup(S), IsIdempotent);
1338
+ end);
1339
+
1340
+ # same method for ideals
1341
+
1342
+ InstallMethod(IsSemilattice, "for an inverse semigroup",
1343
+ [IsInverseSemigroup],
1344
+ function(S)
1345
+ if HasParent(S) and HasIsSemilattice(Parent(S))
1346
+ and IsSemilattice(Parent(S)) then
1347
+ return true;
1348
+ elif not IsFinite(S) then
1349
+ TryNextMethod();
1350
+ fi;
1351
+ return IsDTrivial(S);
1352
+ end);
1353
+
1354
+ InstallMethod(IsSimpleSemigroup, "for a finite semigroup",
1355
+ [IsSemigroup and IsFinite], S -> NrDClasses(S) = 1);
1356
+
1357
+ # same method for ideals
1358
+
1359
+ InstallMethod(IsSimpleSemigroup, "for an acting semigroup",
1360
+ [IsActingSemigroup],
1361
+ function(S)
1362
+ local gens, lambdafunc, lambdarank, rank, opts, o, pos, iter, name, f;
1363
+
1364
+ if HasIsRegularSemigroup(S) and not IsRegularSemigroup(S) then
1365
+ Info(InfoSemigroups, 2, "the semigroup is not regular");
1366
+ return false;
1367
+ elif HasIsCompletelyRegularSemigroup(S)
1368
+ and not IsCompletelyRegularSemigroup(S) then
1369
+ Info(InfoSemigroups, 2, "the semigroup is not completely regular");
1370
+ return false;
1371
+ elif HasNrDClasses(S) then
1372
+ return NrDClasses(S) = 1;
1373
+ elif HasGeneratorsOfSemigroup(S) then
1374
+ gens := GeneratorsOfSemigroup(S); # not GeneratorsOfMonoid!
1375
+ lambdafunc := LambdaFunc(S);
1376
+ lambdarank := LambdaRank(S);
1377
+ rank := lambdarank(lambdafunc(gens[1]));
1378
+
1379
+ if not ForAll([2 .. Length(gens)],
1380
+ i -> lambdarank(lambdafunc(gens[i])) = rank) then
1381
+ return false;
1382
+ fi;
1383
+
1384
+ opts := rec(treehashsize := SEMIGROUPS.OptionsRec(S).hashlen);
1385
+
1386
+ for name in RecNames(LambdaOrbOpts(S)) do
1387
+ opts.(name) := LambdaOrbOpts(S).(name);
1388
+ od;
1389
+
1390
+ for f in gens do
1391
+ o := Orb(S, LambdaFunc(S)(f), LambdaAct(S), opts);
1392
+ pos := LookForInOrb(o, {o, x} -> LambdaRank(S)(x) < rank, 1);
1393
+ if pos <> false then
1394
+ return false;
1395
+ fi;
1396
+ od;
1397
+
1398
+ return true;
1399
+ fi;
1400
+
1401
+ # regular ideal case
1402
+ iter := IteratorOfDClasses(S);
1403
+ NextIterator(iter);
1404
+ return IsDoneIterator(iter);
1405
+ end);
1406
+
1407
+ # same method for ideals
1408
+
1409
+ InstallMethod(IsSimpleSemigroup, "for a finite inverse semigroup",
1410
+ [IsInverseSemigroup and IsFinite], IsGroupAsSemigroup);
1411
+
1412
+ # different method for ideals
1413
+
1414
+ InstallMethod(IsTrivial, "for a semigroup with generators",
1415
+ [IsSemigroup and HasGeneratorsOfSemigroup],
1416
+ function(S)
1417
+ local gens;
1418
+
1419
+ if not IsFinite(S) then
1420
+ return false;
1421
+ fi;
1422
+ gens := GeneratorsOfSemigroup(S);
1423
+ return Length(gens) > 0 and IsIdempotent(gens[1])
1424
+ and ForAll(gens, x -> gens[1] = x);
1425
+ end);
1426
+
1427
+ InstallMethod(IsUnitRegularMonoid, "for a semigroup",
1428
+ [IsSemigroup],
1429
+ function(S)
1430
+ local G, x;
1431
+
1432
+ if not IsRegularSemigroup(S) then
1433
+ return false;
1434
+ elif not IsFinite(S) then
1435
+ TryNextMethod();
1436
+ fi;
1437
+
1438
+ G := GroupOfUnits(S);
1439
+
1440
+ if G = fail then
1441
+ return false;
1442
+ elif IsTrivial(G) then
1443
+ return IsBand(S);
1444
+ fi;
1445
+
1446
+ for x in S do
1447
+ if ForAll(G, y -> x * y * x <> x) then
1448
+ return false;
1449
+ fi;
1450
+ od;
1451
+ return true;
1452
+ end);
1453
+
1454
+ # same method for ideals
1455
+
1456
+ InstallMethod(IsZeroGroup, "for a semigroup", [IsSemigroup],
1457
+ function(S)
1458
+
1459
+ if HasParent(S) and HasIsZeroGroup(Parent(S)) and IsZeroGroup(Parent(S)) then
1460
+ return S = Parent(S);
1461
+ elif not IsFinite(S) then
1462
+ TryNextMethod();
1463
+ elif MultiplicativeZero(S) = fail then
1464
+ Info(InfoSemigroups, 2, "the semigroup does not have a zero");
1465
+ return false;
1466
+ elif NrHClasses(S) = 2 then
1467
+ return ForAll(GreensHClasses(S), IsGroupHClass);
1468
+ fi;
1469
+
1470
+ Info(InfoSemigroups, 2, "the semigroup has more than two H-classes");
1471
+ return false;
1472
+ end);
1473
+
1474
+ # same method for ideals
1475
+
1476
+ InstallMethod(IsZeroRectangularBand, "for a semigroup",
1477
+ [IsSemigroup],
1478
+ function(S)
1479
+ if not IsFinite(S) then
1480
+ TryNextMethod();
1481
+ elif not IsZeroSimpleSemigroup(S) then
1482
+ Info(InfoSemigroups, 2, "the semigroup is not 0-simple");
1483
+ return false;
1484
+ fi;
1485
+ return IsHTrivial(S);
1486
+ end);
1487
+
1488
+ # different method for ideals
1489
+
1490
+ InstallMethod(IsZeroSemigroup, "for a semigroup", [IsSemigroup],
1491
+ function(S)
1492
+ local z, gens, i, j;
1493
+
1494
+ if HasParent(S) and HasIsZeroSemigroup(Parent(S))
1495
+ and IsZeroSemigroup(Parent(S)) then
1496
+ return true;
1497
+ elif not IsFinite(S) then
1498
+ TryNextMethod();
1499
+ fi;
1500
+
1501
+ z := MultiplicativeZero(S);
1502
+
1503
+ if z = fail then
1504
+ Info(InfoSemigroups, 2, "the semigroup does not have a zero");
1505
+ return false;
1506
+ fi;
1507
+
1508
+ gens := GeneratorsOfSemigroup(S);
1509
+ for i in [1 .. Length(gens)] do
1510
+ for j in [1 .. Length(gens)] do
1511
+ if not gens[i] * gens[j] = z then
1512
+ Info(InfoSemigroups, 2, "the product of generators ", i, " and ", j,
1513
+ " is not the multiplicative zero \n", z);
1514
+ return false;
1515
+ fi;
1516
+ od;
1517
+ od;
1518
+
1519
+ return true;
1520
+ end);
1521
+
1522
+ # same method for ideals
1523
+
1524
+ InstallMethod(IsZeroSemigroup, "for an inverse semigroup",
1525
+ [IsInverseSemigroup], IsTrivial);
1526
+
1527
+ # same method for ideals
1528
+
1529
+ InstallMethod(IsZeroSimpleSemigroup, "for an acting semigroup",
1530
+ [IsActingSemigroup],
1531
+ function(S)
1532
+ local iter, D;
1533
+
1534
+ if MultiplicativeZero(S) = fail then
1535
+ return false;
1536
+ elif IsClosedData(SemigroupData(S)) then
1537
+ return IsRegularSemigroup(S) and NrDClasses(S) = 2;
1538
+ fi;
1539
+ iter := IteratorOfDClasses(S);
1540
+ D := NextIterator(iter);
1541
+ if IsDoneIterator(iter) or not IsRegularDClass(D) then
1542
+ return false;
1543
+ fi;
1544
+ D := NextIterator(iter);
1545
+ return IsDoneIterator(iter) and IsRegularDClass(D);
1546
+ end);
1547
+
1548
+ # same method for ideals
1549
+
1550
+ InstallMethod(IsZeroSimpleSemigroup, "for a semigroup",
1551
+ [IsSemigroup], 1, # to beat the library method
1552
+ function(S)
1553
+ if not IsFinite(S) then
1554
+ TryNextMethod();
1555
+ fi;
1556
+
1557
+ return MultiplicativeZero(S) <> fail and NrDClasses(S) = 2 and
1558
+ IsRegularSemigroup(S);
1559
+ end);
1560
+
1561
+ # same method for ideals
1562
+
1563
+ InstallMethod(IsZeroSimpleSemigroup, "for a finite inverse semigroup",
1564
+ [IsInverseSemigroup and IsFinite],
1565
+ S -> MultiplicativeZero(S) <> fail and NrDClasses(S) = 2);
1566
+
1567
+ InstallMethod(IsNilpotentSemigroup, "for a semigroup",
1568
+ [IsSemigroup],
1569
+ function(S)
1570
+ if not IsFinite(S) then
1571
+ TryNextMethod();
1572
+ elif HasNrIdempotents(S) and NrIdempotents(S) <> 1 then
1573
+ return false;
1574
+ elif MultiplicativeZero(S) = fail then
1575
+ return false;
1576
+ fi;
1577
+ return NrIdempotents(S) = 1;
1578
+ end);
1579
+
1580
+ # WW the following lets us get higher code coverage
1581
+
1582
+ InstallMethod(IsFinite, "for a finitely presented semigroup",
1583
+ [IsFpSemigroup],
1584
+ function(S)
1585
+ if IsEmpty(RelationsOfFpSemigroup(S)) or
1586
+ ForAll(RelationsOfFpSemigroup(S),
1587
+ x -> IsIdenticalObj(x[1], x[2]))
1588
+ or Length(GeneratorsOfSemigroup(S)) >
1589
+ Length(RelationsOfFpSemigroup(S)) then
1590
+ return false;
1591
+ fi;
1592
+ TryNextMethod();
1593
+ end);
1594
+
1595
+ InstallMethod(IsSemigroupWithAdjoinedZero, "for a semigroup", [IsSemigroup],
1596
+ x -> UnderlyingSemigroupOfSemigroupWithAdjoinedZero(x) <> fail);
1597
+
1598
+ InstallMethod(IsSurjectiveSemigroup, "for a semigroup",
1599
+ [IsSemigroup],
1600
+ S -> IsEmpty(IndecomposableElements(S)));
1601
+
1602
+ InstallMethod(IsFullInverseSubsemigroup,
1603
+ "for an inverse semigroup and an inverse subsemigroup",
1604
+ [IsInverseSemigroup, IsInverseSemigroup],
1605
+ function(S, T)
1606
+ return IsSubsemigroup(S, T) and IsInverseSemigroup(T)
1607
+ and NrIdempotents(S) = NrIdempotents(T);
1608
+ end);
1609
+
1610
+ # The filter IsActingSemigroup is added here because otherwise we don't know
1611
+ # that G and N in the loop in the method below act on the same set.
1612
+
1613
+ InstallMethod(IsNormalInverseSubsemigroup,
1614
+ "for an inverse acting semigroup and subsemigroup",
1615
+ [IsInverseSemigroup and IsActingSemigroup,
1616
+ IsInverseSemigroup and IsActingSemigroup],
1617
+ function(S, T)
1618
+ local DS, G, N, p, DT;
1619
+
1620
+ if not IsSubsemigroup(S, T) then
1621
+ return false;
1622
+ fi;
1623
+
1624
+ for DT in DClasses(T) do
1625
+ DS := DClass(S, Representative(DT));
1626
+ G := Image(IsomorphismPermGroup(GroupHClass(DS)));
1627
+ N := Image(IsomorphismPermGroup(GroupHClass(DT)));
1628
+ if not IsSubset(MovedPoints(G), MovedPoints(N)) then
1629
+ p := MappingPermListList(MovedPoints(N), MovedPoints(G));
1630
+ N := N ^ p;
1631
+ fi;
1632
+ Assert(0, IsSubset(MovedPoints(G), MovedPoints(N)));
1633
+ if not IsNormal(G, N) then
1634
+ return false;
1635
+ fi;
1636
+ od;
1637
+ return true;
1638
+ end);
1639
+
1640
+ InstallMethod(IsSelfDualSemigroup,
1641
+ "for a finite semigroup with CanUseFroidurePin",
1642
+ [IsSemigroup and CanUseFroidurePin],
1643
+ function(S)
1644
+ local T, map;
1645
+ if IsCommutativeSemigroup(S) then # TODO(later) any more?
1646
+ return true;
1647
+ elif NrRClasses(S) <> NrLClasses(S) then
1648
+ return false;
1649
+ fi;
1650
+
1651
+ T := AsSemigroup(IsFpSemigroup, S);
1652
+ map := AntiIsomorphismDualFpSemigroup(T);
1653
+ return SemigroupIsomorphismByImages(T,
1654
+ Range(map),
1655
+ GeneratorsOfSemigroup(T),
1656
+ List(GeneratorsOfSemigroup(T),
1657
+ x -> x ^ map)) <> fail;
1658
+ end);