passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-musllinux_1_2_x86_64.whl

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

Potentially problematic release.


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

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/x86_64-pc-linux-musl-default64-kv10/semigroups.so +0 -0
  15. gap/pkg/semigroups/config.guess +1807 -0
  16. gap/pkg/semigroups/config.log +1068 -0
  17. gap/pkg/semigroups/config.status +1133 -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-0cd532bd.so.1 +0 -0
  352. passagemath_gap_pkg_semigroups.libs/libsemigroups-f0b7066b.so.2.0.0 +0 -0
  353. passagemath_gap_pkg_semigroups.libs/libstdc++-5d72f927.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,2433 @@
1
+ #############################################################################
2
+ ##
3
+ ## greens/acting.gi
4
+ ## Copyright (C) 2015-2022 James D. Mitchell
5
+ ##
6
+ ## Licensing information can be found in the README file of this package.
7
+ ##
8
+ #############################################################################
9
+ ##
10
+
11
+ #############################################################################
12
+ ## This file contains methods for Green's classes etc for acting semigroups.
13
+ ## It is organized as follows:
14
+ ##
15
+ ## 1. Helper functions for the creation of Green's classes, and lambda-rho
16
+ ## stuff.
17
+ ##
18
+ ## 2. Technical Green's stuff (types, representative, etc)
19
+ ##
20
+ ## 3. Individual Green's classes (constructors, size, membership)
21
+ ##
22
+ ## 4. Collections of Green's classes (GreensXClasses, XClassReps, NrXClasses)
23
+ ##
24
+ ## 5. Idempotents and NrIdempotents
25
+ ##
26
+ ## 6. Regularity of Green's classes
27
+ ##
28
+ ## 7. Iterators and enumerators
29
+ ##
30
+ #############################################################################
31
+
32
+ #############################################################################
33
+ ## Green's classes are created as follows:
34
+ ##
35
+ ## 1. Create the class C using SEMIGROUPS.CreateXClass, this sets the type,
36
+ ## equivalence relations, whether or not the class is NC, the parent, and
37
+ ## the element used to create the class (stored in C!.rep)
38
+ ##
39
+ ## 2. Copy or set the lambda/rho orbits using SEMIGROUPS.CopyLambda/Rho and
40
+ ## SEMIGROUPS.SetLambda/Rho. After calling any combination of these two
41
+ ## functions Lambda/RhoOrb and Lambda/RhoOrbSCCIndex for the class are
42
+ ## set.
43
+ ##
44
+ ## The former simply copies the orbit and the index of the strongly
45
+ ## connected component containing the lambda/rho value of the element used
46
+ ## to create the class. This is useful, for example, when trying to create
47
+ ## an R-class of a D-class, when the lambda orbit and scc index are just
48
+ ## the same as those for the D-class.
49
+ ##
50
+ ## The latter uses the lambda/rho orbit of the whole semigroup if it is
51
+ ## known and the class is not nc. Otherwise it creates/finds the graded
52
+ ## lambda/rho orbit. If the graded lambda/rho orbit is created/found, then
53
+ ## the position of the lambda/rho value of C!.rep (the element used to
54
+ ## create the class) in the orbit is stored in C!.Lambda/RhoPos.
55
+ ##
56
+ ## 3. Rectify the lambda/rho value of the representative. The representative
57
+ ## of an R-class, for example, must have its lambda-value in the first
58
+ ## position of the scc containing it. Representatives of L-classes must
59
+ ## have the rho-value in the first position of the scc containing
60
+ ## it, D-class reps must have both lambda- and rho-values in the
61
+ ## respective first positions, the lambda- and rho-values of H-class reps
62
+ ## must not be modified. The functions SEMIGROUPS.RectifyLambda/Rho can
63
+ ## used to modify C!.rep (in place) so that its lambda/rho-value is in the
64
+ ## first place of its scc. These functions depend on the previous 2 steps
65
+ ## being called.
66
+ ##
67
+ ## Note that a Green's class does not satisfies IsGreensClassNC if it is known
68
+ ## that its representative is an element of the underlying semigroup, not if it
69
+ ## is known to be an element of another Green's class. Also a class in
70
+ ## IsGreensClassNC makes the assumption that the representative belongs to the
71
+ ## containing object, and reuses the lambda/rho orbit from the container. So,
72
+ ## it might be that the representative of a class created using an NC method,
73
+ ## has lambda/rho value not belonging to the lambda/rho orbit of the class.
74
+ #############################################################################
75
+
76
+ #############################################################################
77
+ ## 1. Helper functions for the creation of Green's classes . . .
78
+ #############################################################################
79
+
80
+ # same method for regular/different for inverse
81
+
82
+ SEMIGROUPS.CreateXClass := function(args, type, rel)
83
+ local S, nc, rep, irep, erep, C;
84
+
85
+ if Length(args) = 1 then # arg is a Green's class
86
+ # for creating bigger classes containing smaller ones
87
+ Assert(1, IsActingSemigroupGreensClass(args[1]));
88
+ S := Parent(args[1]);
89
+ nc := IsGreensClassNC(args[1]);
90
+ rep := args[1]!.rep;
91
+ else # arg is semigroup/Green's class, rep, and boolean
92
+ # for creating smaller classes inside bigger ones
93
+ if IsGreensClass(args[1]) then
94
+ S := Parent(args[1]);
95
+ else
96
+ S := args[1];
97
+ fi;
98
+ rep := args[2];
99
+ nc := args[3];
100
+ fi;
101
+
102
+ irep := ConvertToInternalElement(S, rep);
103
+ erep := ConvertToExternalElement(S, rep);
104
+
105
+ C := rec(rep := irep);
106
+ ObjectifyWithAttributes(C, type(S),
107
+ ParentAttr, S,
108
+ IsGreensClassNC, nc,
109
+ EquivalenceClassRelation, rel(S),
110
+ Representative, erep);
111
+
112
+ if IsInverseActingSemigroupRep(S) then
113
+ SetFilterObj(C, IsInverseActingRepGreensClass);
114
+ elif IsRegularActingSemigroupRep(S) then
115
+ SetFilterObj(C, IsRegularActingRepGreensClass);
116
+ elif HasIsRegularSemigroup(S) and IsRegularSemigroup(S) then
117
+ if type <> HClassType then
118
+ SetIsRegularGreensClass(C, true);
119
+ fi;
120
+ fi;
121
+
122
+ return C;
123
+ end;
124
+
125
+ # same method for regular/inverse
126
+
127
+ SEMIGROUPS.CreateDClass := function(arg...)
128
+ return SEMIGROUPS.CreateXClass(arg, DClassType, GreensDRelation);
129
+ end;
130
+
131
+ # same method for regular/inverse
132
+
133
+ SEMIGROUPS.CreateRClass := function(arg...)
134
+ return SEMIGROUPS.CreateXClass(arg, RClassType, GreensRRelation);
135
+ end;
136
+
137
+ # same method for regular/inverse
138
+
139
+ SEMIGROUPS.CreateLClass := function(arg...)
140
+ return SEMIGROUPS.CreateXClass(arg, LClassType, GreensLRelation);
141
+ end;
142
+
143
+ # same method for regular/inverse
144
+
145
+ SEMIGROUPS.CreateHClass := function(arg...)
146
+ return SEMIGROUPS.CreateXClass(arg, HClassType, GreensHRelation);
147
+ end;
148
+
149
+ SEMIGROUPS.SetLambda := function(C)
150
+ local S, o;
151
+
152
+ S := Parent(C);
153
+ if HasLambdaOrb(S) and IsClosedOrbit(LambdaOrb(S))
154
+ and not IsGreensClassNC(C) then
155
+ SetLambdaOrb(C, LambdaOrb(S));
156
+ SetLambdaOrbSCCIndex(C, OrbSCCIndex(LambdaOrb(S), LambdaFunc(S)(C!.rep)));
157
+ else
158
+ o := GradedLambdaOrb(S, C!.rep, IsGreensClassNC(C) <> true, C);
159
+ SetLambdaOrb(C, o);
160
+ SetLambdaOrbSCCIndex(C, OrbSCCLookup(o)[C!.LambdaPos]);
161
+ fi;
162
+ end;
163
+
164
+ SEMIGROUPS.SetRho := function(C)
165
+ local S, o;
166
+
167
+ S := Parent(C);
168
+ if HasRhoOrb(S) and IsClosedOrbit(RhoOrb(S)) and not IsGreensClassNC(C) then
169
+ SetRhoOrb(C, RhoOrb(S));
170
+ SetRhoOrbSCCIndex(C, OrbSCCIndex(RhoOrb(S), RhoFunc(S)(C!.rep)));
171
+ else
172
+ o := GradedRhoOrb(S, C!.rep, IsGreensClassNC(C) <> true, C);
173
+ SetRhoOrb(C, o);
174
+ SetRhoOrbSCCIndex(C, OrbSCCLookup(o)[C!.RhoPos]);
175
+ fi;
176
+ end;
177
+
178
+ SEMIGROUPS.CopyLambda := function(old, new)
179
+ SetLambdaOrb(new, LambdaOrb(old));
180
+ SetLambdaOrbSCCIndex(new, LambdaOrbSCCIndex(old));
181
+ return;
182
+ end;
183
+
184
+ SEMIGROUPS.CopyRho := function(old, new)
185
+ SetRhoOrb(new, RhoOrb(old));
186
+ SetRhoOrbSCCIndex(new, RhoOrbSCCIndex(old));
187
+ return;
188
+ end;
189
+
190
+ SEMIGROUPS.RectifyLambda := function(C)
191
+ local o, i, m;
192
+ Assert(1, not IsGreensHClass(C));
193
+
194
+ o := LambdaOrb(C);
195
+
196
+ if not IsBound(C!.LambdaPos) then
197
+ i := Position(o, LambdaFunc(Parent(C))(C!.rep));
198
+ else
199
+ i := C!.LambdaPos;
200
+ fi;
201
+
202
+ m := LambdaOrbSCCIndex(C);
203
+
204
+ if i <> OrbSCC(o)[m][1] then
205
+ C!.rep := C!.rep * LambdaOrbMult(o, m, i)[2];
206
+ # don't set Representative in case we must also rectify Rho
207
+ fi;
208
+
209
+ return;
210
+ end;
211
+
212
+ SEMIGROUPS.RectifyRho := function(C)
213
+ local o, i, m;
214
+ Assert(1, not IsGreensHClass(C));
215
+ o := RhoOrb(C);
216
+
217
+ if not IsBound(C!.RhoPos) then
218
+ i := Position(o, RhoFunc(Parent(C))(C!.rep));
219
+ else
220
+ i := C!.RhoPos;
221
+ fi;
222
+
223
+ m := RhoOrbSCCIndex(C);
224
+
225
+ if i <> OrbSCC(o)[m][1] then
226
+ C!.rep := RhoOrbMult(o, m, i)[2] * C!.rep;
227
+ # don't set Representative in case we must also rectify Lambda
228
+ fi;
229
+
230
+ return;
231
+ end;
232
+
233
+ # helper function, for: Green's class, lambda/rho value, rho/lambda scc,
234
+ # rho/lambda orbit, and boolean
235
+
236
+ SEMIGROUPS.Idempotents := function(x, value, scc, o, onright)
237
+ local S, out, j, tester, creator, i;
238
+ Assert(1, IsActingSemigroupGreensClass(x));
239
+
240
+ if HasIsRegularGreensClass(x) and not IsRegularGreensClass(x) then
241
+ return [];
242
+ fi;
243
+
244
+ S := Parent(x);
245
+
246
+ if IsActingSemigroupWithFixedDegreeMultiplication(S)
247
+ and IsMultiplicativeElementWithOneCollection(S)
248
+ and ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
249
+ return [One(S)];
250
+ fi;
251
+
252
+ out := EmptyPlist(Length(scc));
253
+ j := 0;
254
+ tester := IdempotentTester(S);
255
+ creator := IdempotentCreator(S);
256
+
257
+ if onright then
258
+ for i in scc do
259
+ if tester(o[i], value) then
260
+ j := j + 1;
261
+ out[j] := ConvertToExternalElement(S, creator(o[i], value));
262
+ fi;
263
+ od;
264
+ else
265
+ for i in scc do
266
+ if tester(value, o[i]) then
267
+ j := j + 1;
268
+ out[j] := ConvertToExternalElement(S, creator(value, o[i]));
269
+ fi;
270
+ od;
271
+ fi;
272
+
273
+ if not HasIsRegularGreensClass(x) then
274
+ SetIsRegularGreensClass(x, j <> 0);
275
+ fi;
276
+
277
+ # can't set NrIdempotents here since we sometimes input a D-class here.
278
+
279
+ ShrinkAllocationPlist(out);
280
+ return out;
281
+ end;
282
+
283
+ # helper function, for: Green's class, lambda/rho value, rho/lambda scc,
284
+ # rho/lambda orbit, and boolean
285
+
286
+ SEMIGROUPS.NrIdempotents := function(x, value, scc, o, onright)
287
+ local S, data, m, nr, tester, i;
288
+
289
+ if HasIsRegularGreensClass(x) and not IsRegularGreensClass(x) then
290
+ return 0;
291
+ fi;
292
+
293
+ S := Parent(x);
294
+
295
+ # check if we already know this...
296
+ if HasSemigroupDataIndex(x)
297
+ and not (HasIsRegularGreensClass(x) and IsRegularGreensClass(x)) then
298
+ data := SemigroupData(S);
299
+ m := LambdaOrbSCCIndex(x);
300
+ if data!.repslens[m][data!.orblookup1[SemigroupDataIndex(x)]] > 1 then
301
+ return 0;
302
+ fi;
303
+ fi;
304
+
305
+ # is r the group of units...
306
+ if IsActingSemigroupWithFixedDegreeMultiplication(S) and
307
+ ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
308
+ return 1;
309
+ fi;
310
+
311
+ nr := 0;
312
+ tester := IdempotentTester(S);
313
+
314
+ if onright then
315
+ for i in scc do
316
+ if tester(o[i], value) then
317
+ nr := nr + 1;
318
+ fi;
319
+ od;
320
+ else
321
+ for i in scc do
322
+ if tester(value, o[i]) then
323
+ nr := nr + 1;
324
+ fi;
325
+ od;
326
+ fi;
327
+
328
+ if not HasIsRegularGreensClass(x) then
329
+ SetIsRegularGreensClass(x, nr <> 0);
330
+ fi;
331
+
332
+ return nr;
333
+ end;
334
+
335
+ # helper function, for: Green's class, lambda/rho value, rho/lambda scc,
336
+ # rho/lambda orbit, and boolean
337
+
338
+ SEMIGROUPS.IsRegularGreensClass := function(x, value, scc, o, onright)
339
+ local S, data, m, tester, i;
340
+
341
+ if HasNrIdempotents(x) then
342
+ return NrIdempotents(x) <> 0;
343
+ fi;
344
+
345
+ S := Parent(x);
346
+
347
+ if HasSemigroupDataIndex(x) then
348
+ data := SemigroupData(S);
349
+ m := LambdaOrbSCCIndex(x);
350
+ if data!.repslens[m][data!.orblookup1[SemigroupDataIndex(x)]] > 1 then
351
+ return false;
352
+ fi;
353
+ fi;
354
+
355
+ # is x the group of units...
356
+ if IsActingSemigroupWithFixedDegreeMultiplication(S) and
357
+ ActionRank(S)(x!.rep) = ActionDegree(x!.rep) then
358
+ return true;
359
+ fi;
360
+
361
+ tester := IdempotentTester(S);
362
+
363
+ if onright then
364
+ for i in scc do
365
+ if tester(o[i], value) then
366
+ return true;
367
+ fi;
368
+ od;
369
+ else
370
+ for i in scc do
371
+ if tester(value, o[i]) then
372
+ return true;
373
+ fi;
374
+ od;
375
+ fi;
376
+
377
+ return false;
378
+ end;
379
+
380
+ # Lambda-Rho stuff
381
+
382
+ # same method for regular/inverse/ideals
383
+
384
+ InstallMethod(LambdaOrbSCC, "for a Green's class of an acting semigroup",
385
+ [IsActingSemigroupGreensClass and IsGreensClass],
386
+ C -> OrbSCC(LambdaOrb(C))[LambdaOrbSCCIndex(C)]);
387
+
388
+ # same method for regular/inverse/ideals
389
+
390
+ InstallMethod(RhoOrbSCC, "for a Green's class of an acting semigroup",
391
+ [IsActingSemigroupGreensClass and IsGreensClass],
392
+ C -> OrbSCC(RhoOrb(C))[RhoOrbSCCIndex(C)]);
393
+
394
+ # not required for regular/inverse, same method for ideals
395
+
396
+ InstallMethod(LambdaCosets, "for a D-class of an acting semigroup",
397
+ [IsGreensDClass and IsActingSemigroupGreensClass],
398
+ function(D)
399
+ return RightTransversal(LambdaOrbSchutzGp(LambdaOrb(D),
400
+ LambdaOrbSCCIndex(D)),
401
+ SchutzenbergerGroup(D));
402
+ end);
403
+
404
+ # not required for regular/inverse, same method for ideals
405
+
406
+ InstallMethod(RhoCosets, "for a D-class of an acting semigroup",
407
+ [IsGreensDClass and IsActingSemigroupGreensClass],
408
+ function(D)
409
+ local o, m, S;
410
+ o := RhoOrb(D);
411
+ m := RhoOrbSCCIndex(D);
412
+ S := Parent(D);
413
+ return RightTransversal(RhoOrbSchutzGp(o, m) ^
414
+ LambdaConjugator(S)(RhoOrbRep(o, m),
415
+ D!.rep),
416
+ SchutzenbergerGroup(D));
417
+ end);
418
+
419
+ # note that the RhoCosets of the D-class containing an L-class are not the same
420
+ # as the RhoCosets of the L-class. The RhoCosets of a D-class correspond to the
421
+ # lambda value of the rep of the D-class (which is in the first place of its
422
+ # scc) and the rep of the D-class but the RhoCosets of the L-class should
423
+ # correspond to the lambda value of the rep of the L-class which is not nec in
424
+ # the first place of its scc.
425
+
426
+ # different method for regular, same method for ideals
427
+
428
+ InstallMethod(RhoCosets, "for a L-class of an acting semigroup",
429
+ [IsGreensLClass and IsActingSemigroupGreensClass],
430
+ function(L)
431
+ local D, S, rep, m, o, pos, x, conj;
432
+
433
+ D := DClassOfLClass(L);
434
+ S := Parent(L);
435
+ o := LambdaOrb(D);
436
+ m := LambdaOrbSCCIndex(D);
437
+
438
+ if IsRegularGreensClass(L) or Length(RhoCosets(D)) = 1 then
439
+ # Maybe <L> is regular and doesn't know it!
440
+ return [LambdaIdentity(S)(LambdaRank(S)(o[OrbSCC(o)[m][1]]))];
441
+ fi;
442
+
443
+ rep := L!.rep;
444
+ pos := Position(o, LambdaFunc(S)(rep));
445
+
446
+ if pos = OrbSCC(o)[m][1] then
447
+ return RhoCosets(D);
448
+ else
449
+ x := rep * LambdaOrbMult(o, m, pos)[2];
450
+ conj := LambdaConjugator(S)(x, rep) * LambdaPerm(S)(x, D!.rep);
451
+ return List(RhoCosets(D), x -> x ^ conj);
452
+ fi;
453
+ end);
454
+
455
+ # different method for regular/inverse, same for ideals
456
+
457
+ InstallMethod(RhoOrbStabChain, "for a D-class of an acting semigroup",
458
+ [IsGreensDClass and IsActingSemigroupGreensClass],
459
+ D -> RhoOrbStabChain(GreensLClassOfElementNC(D, D!.rep)));
460
+
461
+ # same method for regular, not required for inverse, same for ideals
462
+
463
+ InstallMethod(RhoOrbStabChain, "for an L-class of an acting semigroup",
464
+ [IsGreensLClass and IsActingSemigroupGreensClass],
465
+ function(L)
466
+ local G;
467
+
468
+ G := SchutzenbergerGroup(L);
469
+
470
+ if IsTrivial(G) then
471
+ return false;
472
+ elif IsNaturalSymmetricGroup(G) and
473
+ NrMovedPoints(G) = ActionRank(Parent(L))(L!.rep) then
474
+ return true;
475
+ elif IsPermGroup(G) then
476
+ return StabChainImmutable(G);
477
+ else # if IsMatrixGroup(g)
478
+ return G;
479
+ fi;
480
+ end);
481
+
482
+ InstallMethod(SemigroupDataIndex,
483
+ "for an acting semigroup Green's class",
484
+ [IsActingSemigroupGreensClass],
485
+ C -> Position(SemigroupData(Parent(C)), Representative(C)));
486
+
487
+ # different method for regular/inverse/ideals
488
+
489
+ InstallMethod(SchutzenbergerGroup, "for a D-class of an acting semigroup",
490
+ [IsGreensDClass and IsActingSemigroupGreensClass],
491
+ function(D)
492
+ local o, m, lambda_schutz, lambda_stab, rho_schutz, rho_stab, schutz, p;
493
+
494
+ o := LambdaOrb(D);
495
+ m := LambdaOrbSCCIndex(D);
496
+ lambda_schutz := LambdaOrbSchutzGp(o, m);
497
+ lambda_stab := LambdaOrbStabChain(o, m);
498
+
499
+ o := RhoOrb(D);
500
+ m := RhoOrbSCCIndex(D);
501
+ rho_schutz := RhoOrbSchutzGp(o, m);
502
+ rho_stab := RhoOrbStabChain(o, m);
503
+
504
+ if rho_stab = true then
505
+ schutz := lambda_schutz;
506
+ if lambda_stab = true then
507
+ SetRhoOrbStabChain(D, true);
508
+ # Right transversal required so can use PositionCanonical
509
+ SetRhoCosets(D, RightTransversal(schutz, schutz));
510
+ return lambda_schutz;
511
+ fi;
512
+ elif rho_stab = false then
513
+ SetRhoOrbStabChain(D, false);
514
+ SetRhoCosets(D, RightTransversal(rho_schutz, rho_schutz));
515
+ return rho_schutz;
516
+ fi;
517
+
518
+ # Use D!.rep because it might be different that Representative(D)
519
+ p := LambdaConjugator(Parent(D))(RhoOrbRep(o, m), D!.rep);
520
+ rho_schutz := rho_schutz ^ p;
521
+
522
+ if IsPermGroup(rho_schutz) then
523
+ SetRhoOrbStabChain(D, StabChainImmutable(rho_schutz));
524
+ else # if IsMatrixGroup(g)
525
+ SetRhoOrbStabChain(D, rho_schutz);
526
+ fi;
527
+
528
+ if lambda_stab = false then
529
+ SetRhoCosets(D, Enumerator(rho_schutz));
530
+ return lambda_schutz;
531
+ elif lambda_stab = true then
532
+ schutz := rho_schutz;
533
+ else
534
+ schutz := Intersection(lambda_schutz, rho_schutz);
535
+ fi;
536
+
537
+ SetRhoCosets(D, RightTransversal(rho_schutz, schutz));
538
+ return schutz;
539
+ end);
540
+
541
+ # same method for regular/inverse/ideals
542
+
543
+ InstallMethod(SchutzenbergerGroup, "for an R-class of an acting semigroup",
544
+ [IsGreensRClass and IsActingSemigroupGreensClass],
545
+ R -> LambdaOrbSchutzGp(LambdaOrb(R), LambdaOrbSCCIndex(R)));
546
+
547
+ # same method for regular/ideals, different method for inverse
548
+
549
+ InstallMethod(SchutzenbergerGroup, "for an L-class of an acting semigroup",
550
+ [IsGreensLClass and IsActingSemigroupGreensClass],
551
+ function(L)
552
+ local o, m, p;
553
+ o := RhoOrb(L);
554
+ m := RhoOrbSCCIndex(L);
555
+ p := LambdaConjugator(Parent(L))(RhoOrbRep(o, m), L!.rep);
556
+ return RhoOrbSchutzGp(o, m) ^ p;
557
+ end);
558
+
559
+ # different method for regular/inverse, same method for ideals
560
+
561
+ InstallMethod(SchutzenbergerGroup, "for a H-class of an acting semigroup",
562
+ [IsGreensHClass and IsActingSemigroupGreensClass],
563
+ function(H)
564
+ local lambda_o, lambda_m, lambda_schutz, lambda_stab, rho_o, rho_m,
565
+ rho_schutz, rho_stab, S, rep, lambda_mult, lambda_p, rho_mult, rho_p;
566
+
567
+ lambda_o := LambdaOrb(H);
568
+ lambda_m := LambdaOrbSCCIndex(H);
569
+ lambda_schutz := LambdaOrbSchutzGp(lambda_o, lambda_m);
570
+ lambda_stab := LambdaOrbStabChain(lambda_o, lambda_m);
571
+
572
+ if lambda_stab = false then
573
+ return lambda_schutz;
574
+ fi;
575
+
576
+ rho_o := RhoOrb(H);
577
+ rho_m := RhoOrbSCCIndex(H);
578
+ rho_schutz := RhoOrbSchutzGp(rho_o, rho_m);
579
+ rho_stab := RhoOrbStabChain(rho_o, rho_m);
580
+
581
+ if rho_stab = false then
582
+ return rho_schutz;
583
+ fi;
584
+
585
+ S := Parent(H);
586
+ rep := H!.rep;
587
+
588
+ lambda_mult := LambdaOrbMult(lambda_o,
589
+ lambda_m,
590
+ Position(lambda_o, LambdaFunc(S)(rep)))[2];
591
+
592
+ # the points acted on by LambdaSchutzGp mapped to the lambda value of rep
593
+ lambda_p := LambdaConjugator(S)(rep * lambda_mult, rep);
594
+
595
+ if rho_stab = true then
596
+ return lambda_schutz ^ lambda_p;
597
+ fi;
598
+
599
+ rho_mult := RhoOrbMult(rho_o, rho_m, Position(rho_o, RhoFunc(S)(rep)))[2];
600
+ # the points acted on by RhoSchutzGp mapped to the corresponding points for
601
+ # rep (the rho value mapped through the rep so that it is on the right)
602
+ rho_p := LambdaConjugator(S)(RhoOrbRep(rho_o, rho_m), rho_mult * rep);
603
+
604
+ return Intersection(lambda_schutz ^ lambda_p, rho_schutz ^ rho_p);
605
+ end);
606
+
607
+ #############################################################################
608
+ ## 2. Technical Green's classes stuff . . .
609
+ #############################################################################
610
+
611
+ # Different method for regular/inverse
612
+
613
+ InstallMethod(\<, "for Green's D-classes of an acting semigroup",
614
+ [IsGreensDClass and IsActingSemigroupGreensClass,
615
+ IsGreensDClass and IsActingSemigroupGreensClass],
616
+ function(x, y)
617
+ local scc;
618
+ if Parent(x) <> Parent(y) or x = y then
619
+ return false;
620
+ fi;
621
+ scc := OrbSCCLookup(SemigroupData(Parent(x)));
622
+ return scc[SemigroupDataIndex(x)] < scc[SemigroupDataIndex(y)];
623
+ end);
624
+
625
+ # Different method for regular/inverse
626
+
627
+ InstallMethod(\<, "for Green's R-classes of an acting semigroup",
628
+ [IsGreensRClass and IsActingSemigroupGreensClass,
629
+ IsGreensRClass and IsActingSemigroupGreensClass],
630
+ function(x, y)
631
+ if Parent(x) <> Parent(y) or x = y then
632
+ return false;
633
+ fi;
634
+ return SemigroupDataIndex(x) < SemigroupDataIndex(y);
635
+ end);
636
+
637
+ # TODO(later) a method for L-classes?
638
+
639
+ InstallMethod(IsRegularDClass, "for a Green's D-class",
640
+ [IsGreensDClass and IsActingSemigroupGreensClass], IsRegularGreensClass);
641
+
642
+ # different method for regular/inverse
643
+
644
+ InstallMethod(DClassType, "for an acting semigroup",
645
+ [IsActingSemigroup],
646
+ function(S)
647
+ return NewType(FamilyObj(S), IsEquivalenceClass
648
+ and IsEquivalenceClassDefaultRep
649
+ and IsGreensDClass
650
+ and IsActingSemigroupGreensClass);
651
+ end);
652
+
653
+ # different method for regular/inverse
654
+
655
+ InstallMethod(HClassType, "for an acting semigroup",
656
+ [IsActingSemigroup],
657
+ function(S)
658
+ return NewType(FamilyObj(S), IsEquivalenceClass
659
+ and IsEquivalenceClassDefaultRep
660
+ and IsGreensHClass
661
+ and IsActingSemigroupGreensClass);
662
+ end);
663
+
664
+ # different method for regular/inverse
665
+
666
+ InstallMethod(LClassType, "for an acting semigroup",
667
+ [IsActingSemigroup],
668
+ function(S)
669
+ return NewType(FamilyObj(S), IsEquivalenceClass
670
+ and IsEquivalenceClassDefaultRep
671
+ and IsGreensLClass
672
+ and IsActingSemigroupGreensClass);
673
+ end);
674
+
675
+ # different method for regular/inverse
676
+
677
+ InstallMethod(RClassType, "for an acting semigroup",
678
+ [IsActingSemigroup],
679
+ function(S)
680
+ return NewType(FamilyObj(S), IsEquivalenceClass
681
+ and IsEquivalenceClassDefaultRep
682
+ and IsGreensRClass
683
+ and IsActingSemigroupGreensClass);
684
+ end);
685
+
686
+ #############################################################################
687
+ ## 3. Individual classes . . .
688
+ #############################################################################
689
+
690
+ # same method for regular/ideals, different method for inverse
691
+
692
+ InstallMethod(DClassOfLClass, "for an L-class of an acting semigroup",
693
+ [IsGreensLClass and IsActingSemigroupGreensClass],
694
+ function(L)
695
+ local D;
696
+ D := SEMIGROUPS.CreateDClass(L);
697
+ SEMIGROUPS.CopyRho(L, D);
698
+ SEMIGROUPS.SetLambda(D);
699
+ SEMIGROUPS.RectifyLambda(D);
700
+ return D;
701
+ end);
702
+
703
+ # same method for regular/ideals, different method for inverse
704
+
705
+ InstallMethod(DClassOfRClass, "for an R-class of an acting semigroup",
706
+ [IsGreensRClass and IsActingSemigroupGreensClass],
707
+ function(R)
708
+ local D;
709
+ D := SEMIGROUPS.CreateDClass(R);
710
+ SEMIGROUPS.CopyLambda(R, D);
711
+ SEMIGROUPS.SetRho(D);
712
+ SEMIGROUPS.RectifyRho(D);
713
+ return D;
714
+ end);
715
+
716
+ # same method for regular, different method for inverse semigroups,
717
+ # same for ideals
718
+
719
+ InstallMethod(DClassOfHClass, "for an H-class of an acting semigroup",
720
+ [IsGreensHClass and IsActingSemigroupGreensClass],
721
+ function(H)
722
+ local D;
723
+ D := SEMIGROUPS.CreateDClass(H);
724
+ SEMIGROUPS.CopyLambda(H, D);
725
+ SEMIGROUPS.RectifyLambda(D);
726
+ SEMIGROUPS.CopyRho(H, D);
727
+ SEMIGROUPS.RectifyRho(D);
728
+ return D;
729
+ end);
730
+
731
+ # same method for regular/ideals, different method for inverse
732
+
733
+ InstallMethod(LClassOfHClass, "for an H-class of an acting semigroup",
734
+ [IsGreensHClass and IsActingSemigroupGreensClass],
735
+ function(H)
736
+ local L;
737
+ L := SEMIGROUPS.CreateLClass(H);
738
+ SEMIGROUPS.CopyRho(H, L);
739
+ SEMIGROUPS.RectifyRho(L);
740
+ return L;
741
+ end);
742
+
743
+ # same method for regular/inverse/ideals
744
+
745
+ InstallMethod(RClassOfHClass, "for an H-class of an acting semigroup",
746
+ [IsGreensHClass and IsActingSemigroupGreensClass],
747
+ function(H)
748
+ local R;
749
+ R := SEMIGROUPS.CreateRClass(H);
750
+ SEMIGROUPS.CopyLambda(H, R);
751
+ SEMIGROUPS.RectifyLambda(R);
752
+ return R;
753
+ end);
754
+
755
+ # same method for regular/ideals/inverse
756
+
757
+ InstallMethod(GreensDClassOfElement, "for an acting semigroup and element",
758
+ [IsActingSemigroup, IsMultiplicativeElement],
759
+ function(S, x)
760
+ if not x in S then
761
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
762
+ "to the 1st argument (a semigroup)");
763
+ fi;
764
+ return GreensDClassOfElementNC(S, x, false);
765
+ end);
766
+
767
+ # same method for regular/ideals/inverse
768
+
769
+ InstallMethod(GreensDClassOfElementNC, "for an acting semigroup and element",
770
+ [IsActingSemigroup, IsMultiplicativeElement],
771
+ {S, x} -> GreensDClassOfElementNC(S, x, true));
772
+
773
+ # same method for regular/ideals, different method for inverse
774
+
775
+ InstallMethod(GreensDClassOfElementNC,
776
+ "for an acting semigroup, element, and bool",
777
+ [IsActingSemigroup, IsMultiplicativeElement, IsBool],
778
+ function(S, x, isGreensClassNC)
779
+ local D;
780
+ D := SEMIGROUPS.CreateDClass(S, x, isGreensClassNC);
781
+ SEMIGROUPS.SetLambda(D);
782
+ SEMIGROUPS.RectifyLambda(D);
783
+ SEMIGROUPS.SetRho(D);
784
+ SEMIGROUPS.RectifyRho(D);
785
+ return D;
786
+ end);
787
+
788
+ # same method for regular/ideals/inverse
789
+
790
+ InstallMethod(GreensLClassOfElement, "for an acting semigroup and element",
791
+ [IsActingSemigroup, IsMultiplicativeElement],
792
+ function(S, x)
793
+ if not x in S then
794
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
795
+ "to the 1st argument (a semigroup)");
796
+ fi;
797
+ return GreensLClassOfElementNC(S, x, false);
798
+ end);
799
+
800
+ # same method for regular/ideals/inverse
801
+
802
+ InstallMethod(GreensLClassOfElementNC, "for an acting semigroup and element",
803
+ [IsActingSemigroup, IsMultiplicativeElement],
804
+ {S, x} -> GreensLClassOfElementNC(S, x, true));
805
+
806
+ # same method for regular/ideals, different method for inverse
807
+
808
+ InstallMethod(GreensLClassOfElementNC,
809
+ "for an acting semigroup, element, and bool",
810
+ [IsActingSemigroup, IsMultiplicativeElement, IsBool],
811
+ function(S, x, isGreensClassNC)
812
+ local L;
813
+ L := SEMIGROUPS.CreateLClass(S, x, isGreensClassNC);
814
+ SEMIGROUPS.SetRho(L);
815
+ SEMIGROUPS.RectifyRho(L);
816
+ return L;
817
+ end);
818
+
819
+ # same method for regular/ideals/inverse
820
+
821
+ InstallMethod(GreensLClassOfElement,
822
+ "for D-class of acting semigroup and element",
823
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
824
+ function(D, x)
825
+ if not x in D then
826
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
827
+ "to the 1st argument (a Green's D-class)");
828
+ fi;
829
+ return GreensLClassOfElementNC(D, x, IsGreensClassNC(D));
830
+ end);
831
+
832
+ # same method for regular/ideals/inverse
833
+
834
+ InstallMethod(GreensLClassOfElementNC, "for D-class and multiplicative element",
835
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
836
+ {D, x} -> GreensLClassOfElementNC(D, x, true));
837
+
838
+ # same method for regular/ideals, different method for inverse
839
+
840
+ InstallMethod(GreensLClassOfElementNC,
841
+ "for D-class, multiplicative element, and bool",
842
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement,
843
+ IsBool],
844
+ function(D, x, isGreensClassNC)
845
+ local L;
846
+ L := SEMIGROUPS.CreateLClass(D, x, isGreensClassNC);
847
+ # this is a special case, D might not be an inverse-op class but
848
+ # L might be an inverse-op class.
849
+ if IsInverseActingRepGreensClass(L) then
850
+ SEMIGROUPS.CopyLambda(D, L);
851
+ SEMIGROUPS.InverseRectifyRho(L);
852
+ else
853
+ SEMIGROUPS.CopyRho(D, L);
854
+ SEMIGROUPS.RectifyRho(L);
855
+ fi;
856
+ SetDClassOfLClass(L, D);
857
+ return L;
858
+ end);
859
+
860
+ # same method for regular/inverse/ideals
861
+
862
+ InstallMethod(GreensRClassOfElement, "for an acting semigroup and element",
863
+ [IsActingSemigroup, IsMultiplicativeElement],
864
+ function(S, x)
865
+ if not x in S then
866
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
867
+ "to the 1st argument (a semigroup)");
868
+ fi;
869
+ return GreensRClassOfElementNC(S, x, false);
870
+ end);
871
+
872
+ # same method for regular/inverse/ideals
873
+
874
+ InstallMethod(GreensRClassOfElementNC, "for an acting semigroup and element",
875
+ [IsActingSemigroup, IsMultiplicativeElement],
876
+ {S, x} -> GreensRClassOfElementNC(S, x, true));
877
+
878
+ # same method for regular/inverse/ideals
879
+
880
+ InstallMethod(GreensRClassOfElementNC,
881
+ "for an acting semigroup, multiplicative element, and bool",
882
+ [IsActingSemigroup, IsMultiplicativeElement, IsBool],
883
+ function(S, x, isGreensClassNC)
884
+ local R;
885
+ R := SEMIGROUPS.CreateRClass(S, x, isGreensClassNC);
886
+ SEMIGROUPS.SetLambda(R);
887
+ SEMIGROUPS.RectifyLambda(R);
888
+ return R;
889
+ end);
890
+
891
+ # same method for regular/inverse/ideals
892
+
893
+ InstallMethod(GreensRClassOfElement,
894
+ "for an acting semigroup D-class and multiplicative element",
895
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
896
+ function(D, x)
897
+ if not x in D then
898
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
899
+ "to the 1st argument (a Green's D-class)");
900
+ fi;
901
+ return GreensRClassOfElementNC(D, x, IsGreensClassNC(D));
902
+ end);
903
+
904
+ # same method for regular/inverse/ideals
905
+
906
+ InstallMethod(GreensRClassOfElementNC, "for D-class and multiplicative element",
907
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement],
908
+ {D, x} -> GreensRClassOfElementNC(D, x, true));
909
+
910
+ # same method for regular/inverse/ideals
911
+
912
+ InstallMethod(GreensRClassOfElementNC,
913
+ "for a D-class, multiplicative element, and bool",
914
+ [IsGreensDClass and IsActingSemigroupGreensClass, IsMultiplicativeElement,
915
+ IsBool],
916
+ function(D, x, isGreensClassNC)
917
+ local R;
918
+ R := SEMIGROUPS.CreateRClass(D, x, isGreensClassNC);
919
+ SEMIGROUPS.CopyLambda(D, R);
920
+ SEMIGROUPS.RectifyLambda(R);
921
+ SetDClassOfRClass(R, D);
922
+ return R;
923
+ end);
924
+
925
+ # same method for regular/ideals/inverse
926
+
927
+ InstallMethod(GreensHClassOfElement, "for an acting semigroup and element",
928
+ [IsActingSemigroup, IsMultiplicativeElement],
929
+ function(S, x)
930
+ if not x in S then
931
+ ErrorNoReturn("the element does not belong to the semigroup");
932
+ fi;
933
+ return GreensHClassOfElementNC(S, x, false);
934
+ end);
935
+
936
+ # same method for regular/ideals/inverse
937
+
938
+ InstallMethod(GreensHClassOfElementNC, "for an acting semigroup and element",
939
+ [IsActingSemigroup, IsMultiplicativeElement],
940
+ {S, x} -> GreensHClassOfElementNC(S, x, true));
941
+
942
+ # same method for regular/ideals, different for inverse
943
+
944
+ InstallMethod(GreensHClassOfElementNC,
945
+ "for an acting semigroup, element, and bool",
946
+ [IsActingSemigroup, IsMultiplicativeElement, IsBool],
947
+ function(S, x, isGreensClassNC)
948
+ local H;
949
+ H := SEMIGROUPS.CreateHClass(S, x, isGreensClassNC);
950
+ SEMIGROUPS.SetLambda(H);
951
+ SEMIGROUPS.SetRho(H);
952
+ return H;
953
+ end);
954
+
955
+ # same method for regular/ideals/inverse
956
+
957
+ InstallMethod(GreensHClassOfElement, "for a D/H-class and element",
958
+ [IsActingSemigroupGreensClass and IsGreensClass, IsMultiplicativeElement],
959
+ function(C, x)
960
+ if not x in C then
961
+ ErrorNoReturn("the 2nd argument (a mult. elt.) does not belong ",
962
+ "to the 1st argument (a Green's class)");
963
+ fi;
964
+ return GreensHClassOfElementNC(C, x, IsGreensClassNC(C));
965
+ end);
966
+
967
+ # same method for regular/ideals/inverse
968
+
969
+ InstallMethod(GreensHClassOfElementNC, "for a D/H-class and element",
970
+ [IsActingSemigroupGreensClass and IsGreensClass, IsMultiplicativeElement],
971
+ {C, x} -> GreensHClassOfElementNC(C, x, true));
972
+
973
+ # same method for regular/ideals, different method for inverse
974
+
975
+ InstallMethod(GreensHClassOfElementNC, "for a D/H-class, element, and bool",
976
+ [IsActingSemigroupGreensClass and IsGreensClass,
977
+ IsMultiplicativeElement,
978
+ IsBool],
979
+ function(C, x, isGreensClassNC)
980
+ local H;
981
+ H := SEMIGROUPS.CreateHClass(C, x, isGreensClassNC);
982
+ SEMIGROUPS.CopyLambda(C, H);
983
+ SEMIGROUPS.CopyRho(C, H);
984
+ if IsGreensDClass(C) then
985
+ SetDClassOfHClass(H, C);
986
+ fi;
987
+ return H;
988
+ end);
989
+
990
+ # same method for regular/ideals, different method for inverse
991
+
992
+ InstallMethod(GreensHClassOfElementNC, "for an L-class, element, and bool",
993
+ [IsActingSemigroupGreensClass and IsGreensLClass, IsMultiplicativeElement,
994
+ IsBool],
995
+ function(L, x, isGreensClassNC)
996
+ local H;
997
+ H := SEMIGROUPS.CreateHClass(L, x, isGreensClassNC);
998
+ SEMIGROUPS.CopyRho(L, H);
999
+ SEMIGROUPS.SetLambda(H);
1000
+ SetLClassOfHClass(H, L);
1001
+ return H;
1002
+ end);
1003
+
1004
+ # same method for regular/ideals, different method for inverse
1005
+
1006
+ InstallMethod(GreensHClassOfElementNC, "for an R-class, element, and bool",
1007
+ [IsActingSemigroupGreensClass and IsGreensRClass, IsMultiplicativeElement,
1008
+ IsBool],
1009
+ function(R, x, isGreensClassNC)
1010
+ local H;
1011
+ H := SEMIGROUPS.CreateHClass(R, x, isGreensClassNC);
1012
+ SEMIGROUPS.CopyLambda(R, H);
1013
+ SEMIGROUPS.SetRho(H);
1014
+ SetRClassOfHClass(H, R);
1015
+ return H;
1016
+ end);
1017
+
1018
+ # different method for inverse/regular, same for ideals
1019
+
1020
+ InstallMethod(Size, "for a D-class of an acting semigroup",
1021
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1022
+ function(D)
1023
+ local L, R;
1024
+ L := LambdaOrbSchutzGp(LambdaOrb(D), LambdaOrbSCCIndex(D));
1025
+ R := RhoOrbSchutzGp(RhoOrb(D), RhoOrbSCCIndex(D));
1026
+ return Size(R) * Size(L) * Length(LambdaOrbSCC(D)) * Length(RhoOrbSCC(D)) /
1027
+ Size(SchutzenbergerGroup(D));
1028
+ end);
1029
+
1030
+ # same method for inverse/regular/ideals
1031
+
1032
+ InstallMethod(Size, "for an R-class of an acting semigroup",
1033
+ [IsGreensRClass and IsActingSemigroupGreensClass],
1034
+ R -> Size(SchutzenbergerGroup(R)) * Length(LambdaOrbSCC(R)));
1035
+
1036
+ # same method for regular/ideals, different method of inverse
1037
+
1038
+ InstallMethod(Size, "for an L-class of an acting semigroup",
1039
+ [IsGreensLClass and IsActingSemigroupGreensClass],
1040
+ L -> Size(SchutzenbergerGroup(L)) * Length(RhoOrbSCC(L)));
1041
+
1042
+ # same method for inverse/regular/ideals
1043
+
1044
+ InstallMethod(Size, "for an H-class of an acting semigroup",
1045
+ [IsGreensHClass and IsActingSemigroupGreensClass],
1046
+ H -> Size(SchutzenbergerGroup(H)));
1047
+
1048
+ # same method for regular/ideals, different for inverse
1049
+
1050
+ InstallMethod(\in, "for mult. elt. and D-class of acting semigroup",
1051
+ [IsMultiplicativeElement, IsGreensDClass and IsActingSemigroupGreensClass],
1052
+ function(x, D)
1053
+ local S, rep, o, m, scc, l, schutz, cosets, membership, one, p;
1054
+
1055
+ S := Parent(D);
1056
+ rep := Representative(D);
1057
+
1058
+ if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
1059
+ or (IsActingSemigroupWithFixedDegreeMultiplication(S)
1060
+ and ActionDegree(x) <> ActionDegree(rep))
1061
+ or ActionRank(S)(x) <> ActionRank(S)(rep) then
1062
+ return false;
1063
+ fi;
1064
+
1065
+ x := ConvertToInternalElement(S, x);
1066
+
1067
+ o := LambdaOrb(D);
1068
+ m := LambdaOrbSCCIndex(D);
1069
+ scc := OrbSCC(o);
1070
+ l := Position(o, LambdaFunc(S)(x));
1071
+
1072
+ if l = fail or OrbSCCLookup(o)[l] <> m then
1073
+ return false;
1074
+ elif l <> scc[m][1] then
1075
+ x := x * LambdaOrbMult(o, m, l)[2];
1076
+ fi;
1077
+
1078
+ o := RhoOrb(D);
1079
+ m := RhoOrbSCCIndex(D);
1080
+ scc := OrbSCC(o);
1081
+ l := Position(o, RhoFunc(S)(x));
1082
+ schutz := RhoOrbStabChain(D);
1083
+
1084
+ if l = fail or OrbSCCLookup(o)[l] <> m then
1085
+ return false;
1086
+ elif schutz = true then
1087
+ return true;
1088
+ elif l <> scc[m][1] then
1089
+ x := RhoOrbMult(o, m, l)[2] * x;
1090
+ fi;
1091
+
1092
+ cosets := LambdaCosets(D);
1093
+ rep := D!.rep;
1094
+ x := LambdaPerm(S)(rep, x);
1095
+ membership := SchutzGpMembership(S);
1096
+ one := LambdaIdentity(S)(ActionRank(S)(rep));
1097
+
1098
+ if schutz <> false then
1099
+ for p in cosets do
1100
+ if membership(schutz, x / p) then
1101
+ return true;
1102
+ fi;
1103
+ od;
1104
+ else
1105
+ for p in cosets do
1106
+ if x / p = one then
1107
+ return true;
1108
+ fi;
1109
+ od;
1110
+ fi;
1111
+
1112
+ return false;
1113
+ end);
1114
+
1115
+ # same method for regular/ideals, different method for inverse
1116
+
1117
+ InstallMethod(\in, "for multiplicative element and L-class of acting semigroup",
1118
+ [IsMultiplicativeElement, IsGreensLClass and IsActingSemigroupGreensClass],
1119
+ function(x, L)
1120
+ local S, rep, o, m, scc, l, schutz;
1121
+
1122
+ S := Parent(L);
1123
+ rep := Representative(L);
1124
+
1125
+ if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
1126
+ or (IsActingSemigroupWithFixedDegreeMultiplication(S)
1127
+ and ActionDegree(x) <> ActionDegree(rep))
1128
+ or ActionRank(S)(x) <> ActionRank(S)(rep)
1129
+ or LambdaFunc(S)(x) <> LambdaFunc(S)(rep) then
1130
+ return false;
1131
+ fi;
1132
+
1133
+ x := ConvertToInternalElement(S, x);
1134
+ rep := L!.rep;
1135
+
1136
+ o := RhoOrb(L);
1137
+ m := RhoOrbSCCIndex(L);
1138
+ scc := OrbSCC(o);
1139
+ l := Position(o, RhoFunc(S)(x));
1140
+ schutz := RhoOrbStabChain(L);
1141
+
1142
+ if l = fail or OrbSCCLookup(o)[l] <> m then
1143
+ return false;
1144
+ elif schutz = true then
1145
+ return true;
1146
+ elif l <> scc[m][1] then
1147
+ x := RhoOrbMult(o, m, l)[2] * x;
1148
+ fi;
1149
+
1150
+ if x = rep then
1151
+ return true;
1152
+ elif schutz = false then
1153
+ return false;
1154
+ fi;
1155
+
1156
+ return SchutzGpMembership(S)(schutz, LambdaPerm(S)(rep, x));
1157
+ end);
1158
+
1159
+ # same method for regular/inverse/ideals
1160
+
1161
+ InstallMethod(\in, "for multiplicative element and R-class of acting semigroup",
1162
+ [IsMultiplicativeElement, IsGreensRClass and IsActingSemigroupGreensClass],
1163
+ function(x, R)
1164
+ local S, rep, o, m, scc, l, schutz;
1165
+
1166
+ S := Parent(R);
1167
+ rep := Representative(R);
1168
+
1169
+ if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
1170
+ or (IsActingSemigroupWithFixedDegreeMultiplication(S)
1171
+ and ActionDegree(x) <> ActionDegree(rep))
1172
+ or ActionRank(S)(x) <> ActionRank(S)(rep)
1173
+ or RhoFunc(S)(x) <> RhoFunc(S)(rep) then
1174
+ return false;
1175
+ fi;
1176
+
1177
+ x := ConvertToInternalElement(S, x);
1178
+ rep := R!.rep;
1179
+
1180
+ o := LambdaOrb(R);
1181
+ m := LambdaOrbSCCIndex(R);
1182
+ scc := OrbSCC(o);
1183
+ l := Position(o, LambdaFunc(S)(x));
1184
+ schutz := LambdaOrbStabChain(o, m);
1185
+
1186
+ if l = fail or OrbSCCLookup(o)[l] <> m then
1187
+ return false;
1188
+ elif schutz = true then
1189
+ return true;
1190
+ elif l <> scc[m][1] then
1191
+ x := x * LambdaOrbMult(o, m, l)[2];
1192
+ fi;
1193
+
1194
+ if x = rep then
1195
+ return true;
1196
+ elif schutz = false then
1197
+ return false;
1198
+ fi;
1199
+
1200
+ return SchutzGpMembership(S)(schutz, LambdaPerm(S)(rep, x));
1201
+ end);
1202
+
1203
+ # same method for regular/inverse/ideals
1204
+
1205
+ InstallMethod(\in, "for element and acting semigroup H-class",
1206
+ [IsMultiplicativeElement, IsGreensHClass and IsActingSemigroupGreensClass],
1207
+ function(x, H)
1208
+ local S, rep;
1209
+
1210
+ S := Parent(H);
1211
+ rep := Representative(H);
1212
+
1213
+ if ElementsFamily(FamilyObj(S)) <> FamilyObj(x)
1214
+ or (IsActingSemigroupWithFixedDegreeMultiplication(S)
1215
+ and ActionDegree(x) <> ActionDegree(rep))
1216
+ or ActionRank(S)(x) <> ActionRank(S)(rep)
1217
+ or RhoFunc(S)(x) <> RhoFunc(S)(rep)
1218
+ or LambdaFunc(S)(x) <> LambdaFunc(S)(rep) then
1219
+ return false;
1220
+ fi;
1221
+
1222
+ x := ConvertToInternalElement(S, x);
1223
+ rep := H!.rep;
1224
+
1225
+ return LambdaPerm(S)(rep, x) in SchutzenbergerGroup(H);
1226
+ end);
1227
+
1228
+ #############################################################################
1229
+ ## 4. Collections of classes, and reps
1230
+ #############################################################################
1231
+
1232
+ # These are not rho-rectified!
1233
+
1234
+ # different methods for regular/inverse/ideals
1235
+
1236
+ InstallMethod(DClassReps, "for an acting semigroup",
1237
+ [IsActingSemigroup],
1238
+ function(S)
1239
+ local data, scc, out, i;
1240
+
1241
+ data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
1242
+ scc := OrbSCC(data);
1243
+ out := EmptyPlist(Length(scc) - 1);
1244
+
1245
+ for i in [2 .. Length(scc)] do
1246
+ out[i - 1] := ConvertToExternalElement(S, data[scc[i][1]][4]);
1247
+ od;
1248
+ return out;
1249
+ end);
1250
+
1251
+ InstallMethod(RelativeDClassReps, "for an acting semigroup and subsemigroup",
1252
+ [IsActingSemigroup, IsActingSemigroup],
1253
+ function(S, T)
1254
+ local data, D, gens, genstoapply, x, i, j;
1255
+
1256
+ if not IsSubsemigroup(S, T) then
1257
+ ErrorNoReturn("the 2nd argument (an acting semigroup) must be ",
1258
+ "a subsemigroup of the 1st argument (an acting semigroup)");
1259
+ fi;
1260
+
1261
+ data := Enumerate(SemigroupData(S, RelativeLambdaOrb(S, T)));
1262
+ D := List([1 .. Length(data)], x -> []);
1263
+ gens := GeneratorsOfSemigroup(T);
1264
+ genstoapply := [1 .. Length(gens)];
1265
+ for i in [2 .. Length(data)] do
1266
+ x := data[i][4];
1267
+ for j in genstoapply do
1268
+ Add(D[i], Position(data, gens[j] * x));
1269
+ od;
1270
+ od;
1271
+ D := DigraphStronglyConnectedComponents(Digraph(D)).comps;
1272
+ D := List(D, x -> x[1]){[2 .. Length(D)]};
1273
+ return List(data{D}, x -> x[4]);
1274
+ end);
1275
+
1276
+ InstallMethod(RelativeRClassReps, "for an acting semigroup and subsemigroup",
1277
+ [IsActingSemigroup, IsActingSemigroup],
1278
+ function(S, T)
1279
+ local data;
1280
+ if not IsSubsemigroup(S, T) then
1281
+ ErrorNoReturn("the 2nd argument (an acting semigroup) must be ",
1282
+ "a subsemigroup of the 1st argument (an acting semigroup)");
1283
+ fi;
1284
+
1285
+ data := Enumerate(SemigroupData(S, RelativeLambdaOrb(S, T)));
1286
+ return List(data, x -> x[4]);
1287
+ end);
1288
+
1289
+ # different method for regular/inverse/ideals
1290
+
1291
+ InstallMethod(GreensDClasses, "for an acting semigroup",
1292
+ [IsActingSemigroup],
1293
+ function(S)
1294
+ local data, scc, out, CreateDClass, RectifyRho, next, D, i;
1295
+
1296
+ data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
1297
+ scc := OrbSCC(data);
1298
+ out := EmptyPlist(Length(scc));
1299
+ CreateDClass := SEMIGROUPS.CreateDClass;
1300
+ RectifyRho := SEMIGROUPS.RectifyRho;
1301
+
1302
+ for i in [2 .. Length(scc)] do
1303
+ next := data[scc[i][1]];
1304
+ # don't use GreensDClassOfElementNC here since we don't have to lookup scc
1305
+ # indices or rectify lambda
1306
+ D := CreateDClass(S, next[4], false);
1307
+ SetLambdaOrb(D, LambdaOrb(S));
1308
+ SetLambdaOrbSCCIndex(D, next[2]);
1309
+ SetRhoOrb(D, RhoOrb(S));
1310
+ SetRhoOrbSCCIndex(D, OrbSCCLookup(RhoOrb(S))[data!.rholookup[next[6]]]);
1311
+ RectifyRho(D);
1312
+ SetSemigroupDataIndex(D, next[6]);
1313
+ out[i - 1] := D;
1314
+ od;
1315
+
1316
+ return out;
1317
+ end);
1318
+
1319
+ # same method for regular/inverse/ideals
1320
+
1321
+ InstallMethod(LClassReps, "for an acting semigroup",
1322
+ [IsActingSemigroup],
1323
+ S -> Concatenation(List(GreensDClasses(S), LClassReps)));
1324
+
1325
+ # same method for regular/inverse/ideals
1326
+
1327
+ InstallMethod(GreensLClasses, "for an acting semigroup",
1328
+ [IsActingSemigroup],
1329
+ S -> Concatenation(List(GreensDClasses(S), GreensLClasses)));
1330
+
1331
+ # same method for regular/inverse/ideals
1332
+
1333
+ InstallMethod(LClassReps, "for a D-class of an acting semigroup",
1334
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1335
+ function(D)
1336
+ local scc, mults, cosets, rep, act, out, nr, x, p, i;
1337
+
1338
+ scc := LambdaOrbSCC(D);
1339
+ mults := LambdaOrbMults(LambdaOrb(D), LambdaOrbSCCIndex(D));
1340
+ cosets := LambdaCosets(D);
1341
+ rep := D!.rep;
1342
+ act := StabilizerAction(Parent(D));
1343
+ out := EmptyPlist(Length(scc) * Length(cosets));
1344
+ nr := 0;
1345
+
1346
+ for p in cosets do
1347
+ x := act(rep, p);
1348
+ for i in scc do
1349
+ nr := nr + 1;
1350
+ # don't use GreensLClassOfElementNC cos we don't need to rectify the
1351
+ # rho-value
1352
+ out[nr] := x * mults[i][1];
1353
+ od;
1354
+ od;
1355
+
1356
+ return out;
1357
+ end);
1358
+
1359
+ # same method for regular/ideals, different for inverse
1360
+
1361
+ InstallMethod(GreensLClasses, "for a D-class of an acting semigroup",
1362
+ [IsActingSemigroupGreensClass and IsGreensDClass],
1363
+ function(D)
1364
+ local reps, out, CreateLClass, CopyRho, i;
1365
+
1366
+ reps := LClassReps(D);
1367
+ out := EmptyPlist(Length(reps));
1368
+ CreateLClass := SEMIGROUPS.CreateLClass;
1369
+ CopyRho := SEMIGROUPS.CopyRho;
1370
+
1371
+ for i in [1 .. Length(reps)] do
1372
+ # don't use GreensLClassOfElementNC cos we don't need to rectify the
1373
+ # rho-value
1374
+ out[i] := CreateLClass(D, reps[i], IsGreensClassNC(D));
1375
+ CopyRho(D, out[i]);
1376
+ SetDClassOfLClass(out[i], D);
1377
+ od;
1378
+ return out;
1379
+ end);
1380
+
1381
+ # different method for regular/inverse, same method for ideals
1382
+
1383
+ InstallMethod(RClassReps, "for an acting semigroup", [IsActingSemigroup],
1384
+ function(S)
1385
+ local data, out, i;
1386
+
1387
+ data := Enumerate(SemigroupData(S));
1388
+ out := EmptyPlist(Length(data) - 1);
1389
+
1390
+ for i in [2 .. Length(data)] do
1391
+ out[i - 1] := data[i][4];
1392
+ od;
1393
+ return out;
1394
+ end);
1395
+
1396
+ # different method for regular/inverse, same for ideals
1397
+
1398
+ InstallMethod(GreensRClasses, "for an acting semigroup",
1399
+ [IsActingSemigroup],
1400
+ function(S)
1401
+ local reps, out, data, CreateRClass, i;
1402
+
1403
+ reps := RClassReps(S);
1404
+ out := EmptyPlist(Length(reps));
1405
+ data := SemigroupData(S);
1406
+ CreateRClass := SEMIGROUPS.CreateRClass;
1407
+ for i in [1 .. Length(reps)] do
1408
+ # don't use GreensRClassOfElementNC cos we don't need to rectify the
1409
+ # lambda-value
1410
+ out[i] := CreateRClass(S, reps[i], false);
1411
+ SetLambdaOrb(out[i], LambdaOrb(S));
1412
+ SetLambdaOrbSCCIndex(out[i], data[i + 1][2]);
1413
+ SetSemigroupDataIndex(out[i], i + 1);
1414
+ od;
1415
+ return out;
1416
+ end);
1417
+
1418
+ # same method for regular/ideals, different method for inverse
1419
+
1420
+ InstallMethod(RClassReps, "for a D-class of an acting semigroup",
1421
+ [IsActingSemigroupGreensClass and IsGreensDClass],
1422
+ function(D)
1423
+ local scc, mults, cosets, rep, act, out, nr, x, i, p;
1424
+
1425
+ scc := RhoOrbSCC(D);
1426
+ mults := RhoOrbMults(RhoOrb(D), RhoOrbSCCIndex(D));
1427
+ cosets := RhoCosets(D);
1428
+ rep := D!.rep;
1429
+ act := StabilizerAction(Parent(D));
1430
+ out := EmptyPlist(Length(scc) * Length(cosets));
1431
+ nr := 0;
1432
+
1433
+ for p in cosets do
1434
+ x := act(rep, p ^ -1);
1435
+ for i in scc do
1436
+ nr := nr + 1;
1437
+ out[nr] := mults[i][1] * x;
1438
+ od;
1439
+ od;
1440
+
1441
+ return out;
1442
+ end);
1443
+
1444
+ # same method for regular/inverse/ideals
1445
+
1446
+ InstallMethod(GreensRClasses, "for a D-class of an acting semigroup",
1447
+ [IsActingSemigroupGreensClass and IsGreensDClass],
1448
+ function(D)
1449
+ local reps, out, CreateRClass, CopyLambda, i;
1450
+
1451
+ reps := RClassReps(D);
1452
+ out := EmptyPlist(Length(reps));
1453
+ CreateRClass := SEMIGROUPS.CreateRClass;
1454
+ CopyLambda := SEMIGROUPS.CopyLambda;
1455
+
1456
+ for i in [1 .. Length(reps)] do
1457
+ # don't use GreensRClassOfElementNC cos we don't need to rectify the
1458
+ # lambda-value
1459
+ out[i] := CreateRClass(D, reps[i], IsGreensClassNC(D));
1460
+ CopyLambda(D, out[i]);
1461
+ SetDClassOfRClass(out[i], D);
1462
+ od;
1463
+ return out;
1464
+ end);
1465
+
1466
+ # same method for regular/inverse/ideals
1467
+
1468
+ InstallMethod(HClassReps, "for an acting semigroup",
1469
+ [IsActingSemigroup], S -> Concatenation(List(GreensRClasses(S), HClassReps)));
1470
+
1471
+ # same method for regular/inverse/ideals
1472
+
1473
+ InstallMethod(GreensHClasses, "for an acting semigroup",
1474
+ [IsActingSemigroup],
1475
+ S -> Concatenation(List(GreensDClasses(S), GreensHClasses)));
1476
+
1477
+ # same method for regular/inverse/ideals
1478
+
1479
+ InstallMethod(HClassReps, "for a D-class of an acting semigroup",
1480
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1481
+ D -> Concatenation(List(GreensRClasses(D), HClassReps)));
1482
+
1483
+ # same method for regular/inverse/ideals
1484
+
1485
+ InstallMethod(GreensHClasses, "for a D-class of an acting semigroup",
1486
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1487
+ D -> Concatenation(List(GreensRClasses(D), GreensHClasses)));
1488
+
1489
+ # same method for regular/inverse/ideals
1490
+
1491
+ InstallMethod(HClassReps, "for an R-class of an acting semigroup",
1492
+ [IsGreensRClass and IsActingSemigroupGreensClass],
1493
+ function(R)
1494
+ local scc, mults, cosets, rep, act, out, nr, x, i, p;
1495
+
1496
+ scc := LambdaOrbSCC(R);
1497
+ mults := LambdaOrbMults(LambdaOrb(R), LambdaOrbSCCIndex(R));
1498
+ cosets := LambdaCosets(DClassOfRClass(R));
1499
+ rep := R!.rep;
1500
+ act := StabilizerAction(Parent(R));
1501
+ out := EmptyPlist(Length(scc) * Length(cosets));
1502
+ nr := 0;
1503
+
1504
+ for p in cosets do
1505
+ x := act(rep, p);
1506
+ for i in scc do
1507
+ nr := nr + 1;
1508
+ out[nr] := ConvertToExternalElement(Parent(R), x * mults[i][1]);
1509
+ od;
1510
+ od;
1511
+ return out;
1512
+ end);
1513
+
1514
+ # same method for regular/inverse/ideals
1515
+
1516
+ InstallMethod(GreensHClasses, "for an R-class of an acting semigroup",
1517
+ [IsGreensRClass and IsActingSemigroupGreensClass],
1518
+ function(R)
1519
+ local reps, out, i;
1520
+ reps := HClassReps(R);
1521
+ out := [GreensHClassOfElementNC(R, reps[1], IsGreensClassNC(R))];
1522
+ # do this rather than GreensHClassOfElement(R, reps[i]) to
1523
+ # avoid recomputing the RhoOrb.
1524
+ for i in [2 .. Length(reps)] do
1525
+ out[i] := GreensHClassOfElementNC(out[1], reps[i], IsGreensClassNC(R));
1526
+ SetRClassOfHClass(out[i], R);
1527
+ od;
1528
+ return out;
1529
+ end);
1530
+
1531
+ # same method for regular/ideals, different method for inverse
1532
+
1533
+ InstallMethod(HClassReps, "for an L-class of an acting semigroup",
1534
+ [IsGreensLClass and IsActingSemigroupGreensClass],
1535
+ function(L)
1536
+ local scc, mults, cosets, rep, act, out, nr, x, p, i;
1537
+
1538
+ scc := RhoOrbSCC(L);
1539
+ mults := RhoOrbMults(RhoOrb(L), RhoOrbSCCIndex(L));
1540
+ cosets := RhoCosets(L);
1541
+ # These are the rho cosets of the D-class containing L rectified so that they
1542
+ # correspond to the lambda value of the rep of L and not the lambda value of
1543
+ # the rep of the D-class.
1544
+ rep := L!.rep;
1545
+ act := StabilizerAction(Parent(L));
1546
+ out := EmptyPlist(Length(scc) * Length(cosets));
1547
+ nr := 0;
1548
+
1549
+ for p in cosets do
1550
+ x := act(rep, p ^ -1);
1551
+ for i in scc do
1552
+ nr := nr + 1;
1553
+ out[nr] := ConvertToExternalElement(Parent(L), mults[i][1] * x);
1554
+ od;
1555
+ od;
1556
+ return out;
1557
+ end);
1558
+
1559
+ # same method for regular/ideals, different for inverse
1560
+
1561
+ InstallMethod(GreensHClasses, "for an L-class of an acting semigroup",
1562
+ [IsGreensLClass and IsActingSemigroupGreensClass],
1563
+ function(L)
1564
+ local reps, out, i;
1565
+ reps := HClassReps(L);
1566
+ out := [GreensHClassOfElementNC(L, reps[1], IsGreensClassNC(L))];
1567
+ # do this rather than GreensHClassOfElement(L, reps[i]) to
1568
+ # avoid recomputing the RhoOrb.
1569
+ for i in [2 .. Length(reps)] do
1570
+ out[i] := GreensHClassOfElementNC(out[1], reps[i], IsGreensClassNC(L));
1571
+ SetLClassOfHClass(out[i], L);
1572
+ od;
1573
+ return out;
1574
+ end);
1575
+
1576
+ #############################################################################
1577
+
1578
+ # different method for regular/inverse, same for ideals
1579
+
1580
+ InstallMethod(NrDClasses, "for an acting semigroup",
1581
+ [IsActingSemigroup],
1582
+ S -> Length(OrbSCC(SemigroupData(S))) - 1);
1583
+
1584
+ # different method for regular/inverse, same for ideals
1585
+
1586
+ InstallMethod(NrLClasses, "for an acting semigroup",
1587
+ [IsActingSemigroup], S -> Sum(List(GreensDClasses(S), NrLClasses)));
1588
+
1589
+ # different method for regular/inverse, same for ideals
1590
+
1591
+ InstallMethod(NrLClasses, "for a D-class of an acting semigroup",
1592
+ [IsActingSemigroupGreensClass and IsGreensDClass],
1593
+ D -> Length(LambdaCosets(D)) * Length(LambdaOrbSCC(D)));
1594
+
1595
+ # different method for regular/inverse, same for ideals
1596
+
1597
+ InstallMethod(NrRClasses, "for an acting semigroup", [IsActingSemigroup],
1598
+ S -> Length(Enumerate(SemigroupData(S), infinity, ReturnFalse)) - 1);
1599
+
1600
+ # different method for regular/inverse, same for ideals
1601
+
1602
+ InstallMethod(NrRClasses, "for a D-class of an acting semigroup",
1603
+ [IsActingSemigroupGreensClass and IsGreensDClass],
1604
+ D -> Length(RhoCosets(D)) * Length(RhoOrbSCC(D)));
1605
+
1606
+ # same method for regular/inverse/ideals
1607
+
1608
+ InstallMethod(NrHClasses, "for an acting semigroup", [IsActingSemigroup],
1609
+ S -> Sum(List(GreensDClasses(S), NrHClasses)));
1610
+
1611
+ # same method for regular/ideals, different method for inverse
1612
+
1613
+ InstallMethod(GroupHClassOfGreensDClass,
1614
+ "for a D-class of an acting semigroup",
1615
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1616
+ function(D)
1617
+ local S, rho, o, scc, tester, rep, i;
1618
+
1619
+ if HasIsRegularGreensClass(D) and not IsRegularGreensClass(D) then
1620
+ return fail;
1621
+ fi;
1622
+
1623
+ S := Parent(D);
1624
+ rho := RhoFunc(S)(D!.rep);
1625
+ o := LambdaOrb(D);
1626
+ scc := LambdaOrbSCC(D);
1627
+ tester := IdempotentTester(S);
1628
+
1629
+ for i in scc do
1630
+ if tester(o[i], rho) then
1631
+ if not HasIsRegularGreensClass(D) then
1632
+ SetIsRegularGreensClass(D, true);
1633
+ fi;
1634
+ rep := ConvertToExternalElement(S, IdempotentCreator(S)(o[i], rho));
1635
+ return GreensHClassOfElementNC(D, rep, IsGreensClassNC(D));
1636
+ fi;
1637
+ od;
1638
+
1639
+ if not HasIsRegularGreensClass(D) then
1640
+ SetIsRegularGreensClass(D, false);
1641
+ fi;
1642
+ return fail;
1643
+ end);
1644
+
1645
+ # same method for regular/inverse/ideals
1646
+
1647
+ InstallMethod(IsGroupHClass, "for an H-class of an acting semigroup",
1648
+ [IsGreensHClass and IsActingSemigroupGreensClass],
1649
+ function(H)
1650
+ local S, x;
1651
+ S := Parent(H);
1652
+ x := H!.rep;
1653
+ return IdempotentTester(S)(LambdaFunc(S)(x), RhoFunc(S)(x));
1654
+ end);
1655
+
1656
+ # same method for regular/inverse/ideals
1657
+
1658
+ InstallMethod(IsomorphismPermGroup, "for H-class of an acting semigroup",
1659
+ [IsGreensHClass and IsActingSemigroupGreensClass],
1660
+ function(H)
1661
+ local map, id, iso, inv;
1662
+
1663
+ if not IsGroupHClass(H) then
1664
+ ErrorNoReturn("the argument (a Green's H-class) is not a group");
1665
+ elif not IsPermGroup(SchutzenbergerGroup(H)) then
1666
+ map := IsomorphismPermGroup(SchutzenbergerGroup(H));
1667
+ else
1668
+ map := IdentityMapping(SchutzenbergerGroup(H));
1669
+ fi;
1670
+
1671
+ id := ConvertToInternalElement(Parent(H), MultiplicativeNeutralElement(H));
1672
+
1673
+ iso := function(x)
1674
+ if not x in H then
1675
+ ErrorNoReturn("the argument does not belong to the domain of the ",
1676
+ "function");
1677
+ fi;
1678
+ x := ConvertToInternalElement(Parent(H), x);
1679
+ return LambdaPerm(Parent(H))(id, x) ^ map;
1680
+ end;
1681
+ inv := function(x)
1682
+ local S, act;
1683
+ if not x in Image(map) then
1684
+ ErrorNoReturn("the argument does not belong to the domain of the ",
1685
+ "function");
1686
+ fi;
1687
+ S := Parent(H);
1688
+ act := StabilizerAction(S);
1689
+ return ConvertToExternalElement(S,
1690
+ act(id, x ^ InverseGeneralMapping(map)));
1691
+ end;
1692
+ return MappingByFunction(H, Range(map), iso, inv);
1693
+ end);
1694
+
1695
+ # different method for regular/inverse/ideals
1696
+
1697
+ InstallMethod(PartialOrderOfDClasses, "for an acting semigroup",
1698
+ [IsActingSemigroup],
1699
+ function(S)
1700
+ local D, n, out, data, gens, graph, datalookup, i, j, k, x, f;
1701
+
1702
+ D := GreensDClasses(S);
1703
+ n := Length(D);
1704
+ out := List([1 .. n], x -> []);
1705
+
1706
+ data := SemigroupData(S);
1707
+ gens := data!.gens;
1708
+ graph := data!.graph;
1709
+ datalookup := OrbSCCLookup(data) - 1;
1710
+
1711
+ for i in [1 .. n] do
1712
+ # collect info about left multiplying R-class reps of D[i] by gens
1713
+ for j in OrbSCC(data)[OrbSCCLookup(data)[SemigroupDataIndex(D[i])]] do
1714
+ for k in graph[j] do
1715
+ AddSet(out[i], datalookup[k]);
1716
+ od;
1717
+ od;
1718
+
1719
+ for x in gens do
1720
+ for f in LClassReps(D[i]) do
1721
+ AddSet(out[i], datalookup[Position(data, f * x)]);
1722
+ od;
1723
+ od;
1724
+ od;
1725
+ Perform(out, ShrinkAllocationPlist);
1726
+ D := DigraphNC(IsMutableDigraph, out);
1727
+ DigraphRemoveLoops(D);
1728
+ MakeImmutable(D);
1729
+ return D;
1730
+ end);
1731
+
1732
+ InstallMethod(LeftGreensMultiplierNC,
1733
+ "for an acting semigroup and L-related elements",
1734
+ [IsActingSemigroup, IsMultiplicativeElement, IsMultiplicativeElement],
1735
+ function(S, a, b)
1736
+ local o, l, m, result, p;
1737
+
1738
+ o := Enumerate(RhoOrb(S));
1739
+ l := Position(o, RhoFunc(S)(a));
1740
+ m := OrbSCCLookup(o)[l];
1741
+
1742
+ # back to the first pos. in scc
1743
+ result := RhoOrbMult(o, m, l)[2];
1744
+ l := Position(o, RhoFunc(S)(b));
1745
+ # out to the same pos. as b
1746
+ result := RhoOrbMult(o, m, l)[1] * result;
1747
+
1748
+ # result * a * LambdaPerm(S)(result * a, b) = b
1749
+ p := LambdaPerm(S)(result * a, b);
1750
+ # Apply the inverse of the bijection \Psi in Proposition 3.11 of the Citrus
1751
+ # paper, to convert p from acting on the right to action on the left
1752
+ return result * StabilizerAction(S)(a, p) * WeakInverse(a);
1753
+ end);
1754
+
1755
+ InstallMethod(RightGreensMultiplierNC,
1756
+ "for an acting semigroup and R-related elements",
1757
+ [IsActingSemigroup, IsMultiplicativeElement, IsMultiplicativeElement],
1758
+ function(S, a, b)
1759
+ local o, l, m, result, p;
1760
+
1761
+ o := Enumerate(LambdaOrb(S));
1762
+ l := Position(o, LambdaFunc(S)(a));
1763
+ m := OrbSCCLookup(o)[l];
1764
+
1765
+ # back to the first pos. in scc
1766
+ result := LambdaOrbMult(o, m, l)[2];
1767
+ l := Position(o, LambdaFunc(S)(b));
1768
+ # out to the same pos. as b
1769
+ result := result * LambdaOrbMult(o, m, l)[1];
1770
+
1771
+ # At this point StabilizerAction(a * result, LambdaPerm(S)(a * result, b)) =
1772
+ # b.
1773
+ p := LambdaPerm(S)(a * result, b);
1774
+ return WeakInverse(a) * StabilizerAction(S)(a * result, p);
1775
+ end);
1776
+
1777
+ #############################################################################
1778
+ ## 5. Idempotents . . .
1779
+ #############################################################################
1780
+
1781
+ # same method for regular/ideals, different method for inverse
1782
+
1783
+ InstallMethod(Idempotents, "for an acting semigroup", [IsActingSemigroup],
1784
+ function(S)
1785
+ local out, nr, tester, creator, rho_o, scc, lambda_o, gens, rhofunc, lookup,
1786
+ rep, rho, j, i, k;
1787
+
1788
+ if HasRClasses(S) or not IsRegularSemigroup(S) then
1789
+ return Concatenation(List(GreensRClasses(S), Idempotents));
1790
+ fi;
1791
+
1792
+ out := [];
1793
+ nr := 0;
1794
+ tester := IdempotentTester(S);
1795
+ creator := IdempotentCreator(S);
1796
+ rho_o := RhoOrb(S);
1797
+ scc := OrbSCC(rho_o);
1798
+ lambda_o := LambdaOrb(S);
1799
+ Enumerate(lambda_o, infinity);
1800
+ gens := lambda_o!.gens;
1801
+ rhofunc := RhoFunc(S);
1802
+ lookup := OrbSCCLookup(rho_o);
1803
+
1804
+ for i in [2 .. Length(lambda_o)] do
1805
+ # TODO(later) this could be better, just take the product with the next
1806
+ # schreiergen every time
1807
+ rep := EvaluateWord(lambda_o, TraceSchreierTreeForward(lambda_o, i));
1808
+ rho := rhofunc(rep);
1809
+ j := lookup[Position(rho_o, rho)];
1810
+
1811
+ for k in scc[j] do
1812
+ if tester(lambda_o[i], rho_o[k]) then
1813
+ nr := nr + 1;
1814
+ out[nr] := creator(lambda_o[i], rho_o[k]);
1815
+ fi;
1816
+ od;
1817
+ od;
1818
+
1819
+ if not HasNrIdempotents(S) then
1820
+ SetNrIdempotents(S, nr);
1821
+ fi;
1822
+ return out;
1823
+ end);
1824
+
1825
+ # same method for regular/ideals, different method for inverse
1826
+
1827
+ InstallMethod(Idempotents,
1828
+ "for an acting semigroup and a positive integer",
1829
+ [IsActingSemigroup, IsInt],
1830
+ function(S, n)
1831
+ local out, nr, tester, creator, rho_o, scc, lambda_o, gens, rhofunc, lookup,
1832
+ rank, rep, rho, j, i, k;
1833
+
1834
+ if n < 0 then
1835
+ ErrorNoReturn("the 2nd argument (an integer) is not non-negative");
1836
+ elif n > Maximum(List(GeneratorsOfSemigroup(S), x -> ActionRank(S)(x))) then
1837
+ return [];
1838
+ elif HasIdempotents(S) or not IsRegularSemigroup(S) then
1839
+ return Filtered(Idempotents(S), x -> ActionRank(S)(x) = n);
1840
+ fi;
1841
+
1842
+ out := [];
1843
+ nr := 0;
1844
+ tester := IdempotentTester(S);
1845
+ creator := IdempotentCreator(S);
1846
+ rho_o := RhoOrb(S);
1847
+ scc := OrbSCC(rho_o);
1848
+ lambda_o := LambdaOrb(S);
1849
+ gens := lambda_o!.gens;
1850
+ rhofunc := RhoFunc(S);
1851
+ lookup := OrbSCCLookup(rho_o);
1852
+ rank := RhoRank(S);
1853
+
1854
+ Enumerate(lambda_o, infinity);
1855
+
1856
+ for i in [2 .. Length(lambda_o)] do
1857
+ # TODO(later) this could be better, just take the product with the next
1858
+ # schreiergen every time
1859
+ rep := EvaluateWord(lambda_o, TraceSchreierTreeForward(lambda_o, i));
1860
+ rho := rhofunc(rep);
1861
+ j := lookup[Position(rho_o, rho)];
1862
+ if rank(rho_o[scc[j][1]]) = n then
1863
+ for k in scc[j] do
1864
+ if tester(lambda_o[i], rho_o[k]) then
1865
+ nr := nr + 1;
1866
+ out[nr] := creator(lambda_o[i], rho_o[k]);
1867
+ fi;
1868
+ od;
1869
+ fi;
1870
+ od;
1871
+
1872
+ return out;
1873
+ end);
1874
+
1875
+ # same method for regular/ideals, different method for inverse
1876
+
1877
+ InstallMethod(Idempotents, "for a D-class of an acting semigroup",
1878
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1879
+ function(D)
1880
+ if HasIsRegularGreensClass(D) and not IsRegularGreensClass(D) then
1881
+ # this avoids creating the R-classes, which is an unnecessary overhead
1882
+ return [];
1883
+ fi;
1884
+ return Concatenation(List(GreensRClasses(D), Idempotents));
1885
+ end);
1886
+
1887
+ # same method for regular/ideals, different method for inverse
1888
+
1889
+ InstallMethod(Idempotents, "for an L-class of an acting semigroup",
1890
+ [IsGreensLClass and IsActingSemigroupGreensClass],
1891
+ L -> SEMIGROUPS.Idempotents(L,
1892
+ LambdaFunc(Parent(L))(L!.rep),
1893
+ RhoOrbSCC(L),
1894
+ RhoOrb(L),
1895
+ false));
1896
+
1897
+ # same method for regular/ideals, different method for inverse
1898
+
1899
+ InstallMethod(Idempotents, "for an R-class of an acting semigroup",
1900
+ [IsGreensRClass and IsActingSemigroupGreensClass],
1901
+ R -> SEMIGROUPS.Idempotents(R,
1902
+ RhoFunc(Parent(R))(R!.rep),
1903
+ LambdaOrbSCC(R),
1904
+ LambdaOrb(R),
1905
+ true));
1906
+
1907
+ # same method for regular/inverse/ideals
1908
+
1909
+ InstallMethod(Idempotents, "for an H-class of an acting semigroup",
1910
+ [IsGreensHClass and IsActingSemigroupGreensClass],
1911
+ function(H)
1912
+ local S, x;
1913
+
1914
+ if not IsGroupHClass(H) then
1915
+ return [];
1916
+ fi;
1917
+
1918
+ S := Parent(H);
1919
+ x := H!.rep;
1920
+ return [ConvertToExternalElement(S,
1921
+ IdempotentCreator(S)(LambdaFunc(S)(x),
1922
+ RhoFunc(S)(x)))];
1923
+ end);
1924
+
1925
+ # Number of idempotents . . .
1926
+
1927
+ # different method for regular/inverse, same for ideals
1928
+
1929
+ InstallMethod(NrIdempotents, "for an acting semigroup", [IsActingSemigroup],
1930
+ function(S)
1931
+ local data, lambda, rho, scc, lenreps, repslens, rholookup, repslookup,
1932
+ tester, nr, rhoval, m, ind, i;
1933
+
1934
+ if HasIdempotents(S) then
1935
+ return Length(Idempotents(S));
1936
+ fi;
1937
+
1938
+ data := Enumerate(SemigroupData(S), infinity, ReturnFalse);
1939
+
1940
+ lambda := LambdaOrb(S);
1941
+ rho := RhoOrb(S);
1942
+ scc := OrbSCC(lambda);
1943
+
1944
+ lenreps := data!.lenreps;
1945
+ repslens := data!.repslens;
1946
+ rholookup := data!.rholookup;
1947
+ repslookup := data!.repslookup;
1948
+
1949
+ tester := IdempotentTester(S);
1950
+
1951
+ nr := 0;
1952
+ for m in [2 .. Length(scc)] do
1953
+ for ind in [1 .. lenreps[m]] do
1954
+ if repslens[m][ind] = 1 then
1955
+ rhoval := rho[rholookup[repslookup[m][ind][1]]];
1956
+ for i in scc[m] do
1957
+ if tester(lambda[i], rhoval) then
1958
+ nr := nr + 1;
1959
+ fi;
1960
+ od;
1961
+ fi;
1962
+ od;
1963
+ od;
1964
+
1965
+ return nr;
1966
+ end);
1967
+
1968
+ # same method for regular/inverse/ideals
1969
+
1970
+ InstallMethod(NrIdempotents, "for a D-class of an acting semigroup",
1971
+ [IsGreensDClass and IsActingSemigroupGreensClass],
1972
+ D -> Sum(List(GreensRClasses(D), NrIdempotents)));
1973
+
1974
+ # same method for regular/ideals, different method for inverse
1975
+
1976
+ InstallMethod(NrIdempotents, "for an L-class of an acting semigroup",
1977
+ [IsGreensLClass and IsActingSemigroupGreensClass],
1978
+ L -> SEMIGROUPS.NrIdempotents(L,
1979
+ LambdaFunc(Parent(L))(L!.rep),
1980
+ RhoOrbSCC(L),
1981
+ RhoOrb(L),
1982
+ false));
1983
+
1984
+ # same method for regular/ideals, different method inverse
1985
+
1986
+ InstallMethod(NrIdempotents, "for an R-class of an acting semigroup",
1987
+ [IsGreensRClass and IsActingSemigroupGreensClass],
1988
+ R -> SEMIGROUPS.NrIdempotents(R,
1989
+ RhoFunc(Parent(R))(R!.rep),
1990
+ LambdaOrbSCC(R),
1991
+ LambdaOrb(R),
1992
+ true));
1993
+
1994
+ # same method for regular/inverse/ideals
1995
+
1996
+ InstallMethod(NrIdempotents, "for a H-class of an acting semigroup",
1997
+ [IsGreensHClass and IsActingSemigroupGreensClass],
1998
+ function(H)
1999
+ if IsGroupHClass(H) then
2000
+ return 1;
2001
+ fi;
2002
+ return 0;
2003
+ end);
2004
+
2005
+ #############################################################################
2006
+ ## 6. Regular classes . . .
2007
+ #############################################################################
2008
+
2009
+ # not required for regular/inverse, same for ideals
2010
+
2011
+ InstallMethod(IsRegularGreensClass, "for an D-class of an acting semigroup",
2012
+ [IsGreensDClass and IsActingSemigroupGreensClass],
2013
+ D -> SEMIGROUPS.IsRegularGreensClass(D,
2014
+ RhoFunc(Parent(D))(D!.rep),
2015
+ LambdaOrbSCC(D),
2016
+ LambdaOrb(D),
2017
+ true));
2018
+
2019
+ # not required for regular/inverse, same for ideals
2020
+
2021
+ InstallMethod(IsRegularGreensClass, "for an L-class of an acting semigroup",
2022
+ [IsGreensLClass and IsActingSemigroupGreensClass],
2023
+ L -> SEMIGROUPS.IsRegularGreensClass(L,
2024
+ LambdaFunc(Parent(L))(L!.rep),
2025
+ RhoOrbSCC(L),
2026
+ RhoOrb(L),
2027
+ false));
2028
+
2029
+ # not required for regular/inverse, same for ideals
2030
+
2031
+ InstallMethod(IsRegularGreensClass, "for an R-class of an acting semigroup",
2032
+ [IsGreensRClass and IsActingSemigroupGreensClass],
2033
+ R -> SEMIGROUPS.IsRegularGreensClass(R,
2034
+ RhoFunc(Parent(R))(R!.rep),
2035
+ LambdaOrbSCC(R),
2036
+ LambdaOrb(R),
2037
+ true));
2038
+
2039
+ # same method for regular/inverse, same method for ideals
2040
+
2041
+ InstallMethod(IsRegularGreensClass, "for an H-class of an acting semigroup",
2042
+ [IsGreensHClass and IsActingSemigroupGreensClass], IsGroupHClass);
2043
+
2044
+ # different method for regular/inverse/ideals
2045
+
2046
+ InstallMethod(NrRegularDClasses, "for an acting semigroup",
2047
+ [IsActingSemigroup],
2048
+ function(S)
2049
+ local data, datascc, rho, lambda, scc, rholookup, tester, nr, j, rhoval, i,
2050
+ k;
2051
+
2052
+ data := SemigroupData(S);
2053
+ datascc := OrbSCC(data);
2054
+ rho := RhoOrb(S);
2055
+ lambda := LambdaOrb(S);
2056
+ scc := OrbSCC(lambda);
2057
+ rholookup := data!.rholookup;
2058
+ tester := IdempotentTester(S);
2059
+ nr := 0;
2060
+
2061
+ for i in [2 .. Length(datascc)] do
2062
+ j := datascc[i][1];
2063
+ # data of the first R-class in the D-class corresponding to x
2064
+ rhoval := rho[rholookup[j]];
2065
+ for k in scc[data[j][2]] do
2066
+ if tester(lambda[k], rhoval) then
2067
+ nr := nr + 1;
2068
+ break;
2069
+ fi;
2070
+ od;
2071
+ od;
2072
+ return nr;
2073
+ end);
2074
+
2075
+ #############################################################################
2076
+ ## 7. Iterators and enumerators . . .
2077
+ #############################################################################
2078
+
2079
+ #############################################################################
2080
+ ## 7.a. for all classes
2081
+ #############################################################################
2082
+
2083
+ # different method for regular/inverse
2084
+
2085
+ InstallMethod(IteratorOfRClassReps, "for an acting semigroup",
2086
+ [IsActingSemigroup],
2087
+ function(S)
2088
+ local record;
2089
+
2090
+ record := rec();
2091
+
2092
+ record.i := 1;
2093
+
2094
+ record.parent := S;
2095
+
2096
+ record.NextIterator := function(iter)
2097
+ local data;
2098
+ iter!.i := iter!.i + 1;
2099
+ data := Enumerate(SemigroupData(iter!.parent), iter!.i, ReturnFalse);
2100
+ if iter!.i > Length(data!.orbit) then
2101
+ return fail;
2102
+ fi;
2103
+ return data[iter!.i][4];
2104
+ end;
2105
+
2106
+ record.ShallowCopy := iter -> rec(i := 1, parent := iter!.parent);
2107
+
2108
+ return IteratorByNextIterator(record);
2109
+ end);
2110
+
2111
+ # same method for regular/inverse
2112
+
2113
+ InstallMethod(IteratorOfRClasses, "for an acting semigroup",
2114
+ [IsActingSemigroup],
2115
+ function(S)
2116
+ local record;
2117
+
2118
+ if HasGreensRClasses(S) then
2119
+ return IteratorList(GreensRClasses(S));
2120
+ fi;
2121
+
2122
+ record := rec();
2123
+ record.parent := S;
2124
+
2125
+ return WrappedIterator(IteratorOfRClassReps(S),
2126
+ {iter, x} -> GreensRClassOfElementNC(iter!.parent, x),
2127
+ record);
2128
+ end);
2129
+
2130
+ # different method for regular/inverse
2131
+
2132
+ InstallMethod(IteratorOfDClasses, "for an acting semigroup",
2133
+ [IsActingSemigroup],
2134
+ function(S)
2135
+ local iter, convert, isnew;
2136
+
2137
+ if IsClosedData(SemigroupData(S)) then
2138
+ return IteratorList(GreensDClasses(S));
2139
+ fi;
2140
+
2141
+ convert := function(iter, x)
2142
+ local D;
2143
+ D := DClassOfRClass(GreensRClassOfElementNC(S, x));
2144
+ Add(iter!.classes, D);
2145
+ return D;
2146
+ end;
2147
+
2148
+ isnew := {iter, x} -> x = fail or ForAll(iter!.classes, D -> not x in D);
2149
+
2150
+ return WrappedIterator(IteratorOfRClassReps(S),
2151
+ convert,
2152
+ rec(classes := []),
2153
+ isnew);
2154
+ end);
2155
+
2156
+ ########################################################################
2157
+ # 7.b. for individual classes
2158
+ ########################################################################
2159
+
2160
+ # different method for regular/inverse
2161
+
2162
+ InstallMethod(Enumerator, "for a D-class of an acting semigroup",
2163
+ [IsGreensDClass and IsActingSemigroupGreensClass],
2164
+ function(D)
2165
+ local record, convert_out, convert_in, i;
2166
+
2167
+ record := rec();
2168
+
2169
+ record.parent := D; # required by WrappedEnumerator
2170
+ record.underlying_enums := List(GreensRClasses(D), Enumerator);
2171
+ record.lengths := [];
2172
+
2173
+ for i in [1 .. NrRClasses(D)] do
2174
+ record.lengths[i] := Sum(record.underlying_enums{[1 .. i]}, Length);
2175
+ od;
2176
+
2177
+ convert_out := function(enum, pos)
2178
+ local index;
2179
+ index := PositionSorted(enum!.lengths, pos);
2180
+ if index > 1 then
2181
+ pos := pos - enum!.lengths[index - 1];
2182
+ fi;
2183
+ return enum!.underlying_enums[index][pos];
2184
+ end;
2185
+
2186
+ convert_in := function(enum, elt)
2187
+ local R, index, pos;
2188
+ if not elt in enum!.parent then
2189
+ return fail;
2190
+ fi;
2191
+ R := GreensRClassOfElement(enum!.parent, elt);
2192
+ index := Position(GreensRClasses(D), R);
2193
+ pos := Position(enum!.underlying_enums[index], elt);
2194
+ if index <> 1 then
2195
+ return pos + enum!.lengths[index - 1];
2196
+ else
2197
+ return pos;
2198
+ fi;
2199
+ end;
2200
+
2201
+ return WrappedEnumerator(record, [1 .. Size(D)], convert_out, convert_in);
2202
+ end);
2203
+
2204
+ # different method for regular/inverse
2205
+
2206
+ InstallMethod(Iterator, "for a D-class of an acting semigroup",
2207
+ [IsGreensDClass and IsActingSemigroupGreensClass],
2208
+ function(D)
2209
+
2210
+ if HasAsList(D) then
2211
+ return IteratorList(AsList(D));
2212
+ fi;
2213
+ return ChainIterators(GreensRClasses(D));
2214
+ end);
2215
+
2216
+ # same method for inverse/regular
2217
+
2218
+ InstallMethod(Enumerator, "for an H-class of acting semigroup",
2219
+ [IsGreensHClass and IsActingSemigroupGreensClass],
2220
+ function(H)
2221
+ local convert_in, convert_out;
2222
+
2223
+ convert_in := function(enum, elt)
2224
+ local H, S, rep;
2225
+ H := enum!.parent;
2226
+ S := Parent(H);
2227
+ rep := H!.rep;
2228
+ elt := ConvertToInternalElement(S, elt);
2229
+
2230
+ if LambdaFunc(S)(elt) <> LambdaFunc(S)(rep)
2231
+ or RhoFunc(S)(elt) <> RhoFunc(S)(rep) then
2232
+ return fail;
2233
+ fi;
2234
+ return LambdaPerm(S)(rep, elt);
2235
+ end;
2236
+
2237
+ convert_out := function(enum, perm)
2238
+ local H, S;
2239
+ H := enum!.parent;
2240
+ S := Parent(H);
2241
+ return ConvertToExternalElement(S,
2242
+ StabilizerAction(S)(H!.rep, perm));
2243
+ end;
2244
+
2245
+ return WrappedEnumerator(H,
2246
+ Enumerator(SchutzenbergerGroup(H)),
2247
+ convert_out,
2248
+ convert_in);
2249
+ end);
2250
+
2251
+ # same method for regular/inverse
2252
+
2253
+ InstallMethod(Iterator, "for a H-class of an acting semigroup",
2254
+ [IsGreensHClass and IsActingSemigroupGreensClass],
2255
+ function(H)
2256
+ local record, unwrap;
2257
+
2258
+ if HasAsList(H) then
2259
+ return IteratorList(AsList(H));
2260
+ fi;
2261
+
2262
+ record := rec();
2263
+ record.parent := H;
2264
+ record.rep := H!.rep;
2265
+
2266
+ unwrap := function(iter, x)
2267
+ local S, rep;
2268
+ S := Parent(iter!.parent);
2269
+ rep := iter!.rep;
2270
+ return ConvertToExternalElement(S, StabilizerAction(S)(rep, x));
2271
+ end;
2272
+
2273
+ return WrappedIterator(Iterator(SchutzenbergerGroup(H)), unwrap, record);
2274
+ end);
2275
+
2276
+ # same method for regular, different method for inverse
2277
+
2278
+ InstallMethod(Enumerator, "for L-class of an acting semigroup",
2279
+ [IsGreensLClass and IsActingSemigroupGreensClass],
2280
+ function(L)
2281
+ local convert_out, convert_in, scc, enum;
2282
+
2283
+ convert_in := function(enum, elt)
2284
+ local L, S, i, f;
2285
+
2286
+ L := enum!.parent;
2287
+ S := Parent(L);
2288
+
2289
+ elt := ConvertToInternalElement(S, elt);
2290
+
2291
+ if LambdaFunc(S)(elt) <> LambdaFunc(S)(L!.rep) then
2292
+ return fail;
2293
+ fi;
2294
+
2295
+ i := Position(RhoOrb(L), RhoFunc(S)(elt));
2296
+ if i = fail or OrbSCCLookup(RhoOrb(L))[i] <> RhoOrbSCCIndex(L) then
2297
+ return fail;
2298
+ fi;
2299
+
2300
+ f := RhoOrbMult(RhoOrb(L), RhoOrbSCCIndex(L), i)[2] * elt;
2301
+
2302
+ return [i, LambdaPerm(S)(L!.rep, f)];
2303
+ end;
2304
+
2305
+ convert_out := function(enum, tuple)
2306
+ local L, S, rep, act, result;
2307
+
2308
+ L := enum!.parent;
2309
+ S := Parent(L);
2310
+ rep := L!.rep;
2311
+ act := StabilizerAction(S);
2312
+
2313
+ result := act(RhoOrbMult(RhoOrb(L),
2314
+ RhoOrbSCCIndex(L),
2315
+ tuple[1])[1] * rep,
2316
+ tuple[2]);
2317
+ return ConvertToExternalElement(S, result);
2318
+ end;
2319
+
2320
+ scc := OrbSCC(RhoOrb(L))[RhoOrbSCCIndex(L)];
2321
+ enum := EnumeratorOfCartesianProduct(scc, SchutzenbergerGroup(L));
2322
+ return WrappedEnumerator(L, enum, convert_out, convert_in);
2323
+ end);
2324
+
2325
+ # same method for regular, different method for inverse
2326
+
2327
+ InstallMethod(Iterator, "for an L-class of an acting semigroup",
2328
+ [IsGreensLClass and IsActingSemigroupGreensClass],
2329
+ function(L)
2330
+ local it, record, unwrap;
2331
+
2332
+ if HasAsSSortedList(L) then
2333
+ return IteratorList(AsSSortedList(L));
2334
+ fi;
2335
+
2336
+ it := IteratorOfCartesianProduct(OrbSCC(RhoOrb(L))[RhoOrbSCCIndex(L)],
2337
+ Enumerator(SchutzenbergerGroup(L)));
2338
+
2339
+ record := rec();
2340
+ record.parent := L;
2341
+
2342
+ unwrap := function(iter, x)
2343
+ local L, S, rep, result;
2344
+ L := iter!.parent;
2345
+ S := Parent(L);
2346
+ rep := L!.rep;
2347
+ result := StabilizerAction(S)(RhoOrbMult(RhoOrb(L),
2348
+ RhoOrbSCCIndex(L),
2349
+ x[1])[1] * rep,
2350
+ x[2]);
2351
+ return ConvertToExternalElement(S, result);
2352
+ end;
2353
+
2354
+ return WrappedIterator(it, unwrap, record);
2355
+ end);
2356
+
2357
+ # same method for regular/inverse
2358
+
2359
+ InstallMethod(Enumerator, "for R-class of an acting semigroup",
2360
+ [IsGreensRClass and IsActingSemigroupGreensClass],
2361
+ function(R)
2362
+ local convert_out, convert_in, scc, enum;
2363
+
2364
+ convert_in := function(enum, elt)
2365
+ local R, S, i, f;
2366
+
2367
+ R := enum!.parent;
2368
+ S := Parent(R);
2369
+
2370
+ elt := ConvertToInternalElement(S, elt);
2371
+
2372
+ if RhoFunc(S)(elt) <> RhoFunc(S)(R!.rep) then
2373
+ return fail;
2374
+ fi;
2375
+
2376
+ i := Position(LambdaOrb(R), LambdaFunc(S)(elt));
2377
+
2378
+ if i = fail or OrbSCCLookup(LambdaOrb(R))[i] <> LambdaOrbSCCIndex(R) then
2379
+ return fail;
2380
+ fi;
2381
+ f := elt * LambdaOrbMult(LambdaOrb(R), LambdaOrbSCCIndex(R), i)[2];
2382
+
2383
+ return [LambdaPerm(S)(R!.rep, f), i];
2384
+ end;
2385
+
2386
+ convert_out := function(enum, tuple)
2387
+ local R, S, rep, act, result;
2388
+
2389
+ R := enum!.parent;
2390
+ S := Parent(R);
2391
+ rep := R!.rep;
2392
+ act := StabilizerAction(S);
2393
+ result := act(rep, tuple[1]) * LambdaOrbMult(LambdaOrb(R),
2394
+ LambdaOrbSCCIndex(R),
2395
+ tuple[2])[1];
2396
+ return ConvertToExternalElement(S, result);
2397
+ end;
2398
+
2399
+ scc := OrbSCC(LambdaOrb(R))[LambdaOrbSCCIndex(R)];
2400
+ enum := EnumeratorOfCartesianProduct(SchutzenbergerGroup(R), scc);
2401
+ return WrappedEnumerator(R, enum, convert_out, convert_in);
2402
+ end);
2403
+
2404
+ # This method makes Iterator of a semigroup much better!!
2405
+ # same method for regular/inverse
2406
+
2407
+ InstallMethod(Iterator, "for an R-class of an acting semigroup",
2408
+ [IsGreensRClass and IsActingSemigroupGreensClass],
2409
+ function(R)
2410
+ local it, record, unwrap;
2411
+
2412
+ if HasAsSSortedList(R) then
2413
+ return IteratorList(AsSSortedList(R));
2414
+ fi;
2415
+
2416
+ it := IteratorOfCartesianProduct(Enumerator(SchutzenbergerGroup(R)),
2417
+ OrbSCC(LambdaOrb(R))[LambdaOrbSCCIndex(R)]);
2418
+
2419
+ record := rec();
2420
+ record.parent := R;
2421
+
2422
+ unwrap := function(iter, x)
2423
+ local R, S, rep, result;
2424
+ R := iter!.parent;
2425
+ S := Parent(R);
2426
+ rep := R!.rep;
2427
+ result := StabilizerAction(S)(rep, x[1])
2428
+ * LambdaOrbMult(LambdaOrb(R), LambdaOrbSCCIndex(R), x[2])[1];
2429
+ return ConvertToExternalElement(S, result);
2430
+ end;
2431
+
2432
+ return WrappedIterator(it, unwrap, record);
2433
+ end);