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

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

Potentially problematic release.


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

Files changed (354) hide show
  1. gap/pkg/semigroups/CHANGELOG.md +1699 -0
  2. gap/pkg/semigroups/CONTRIBUTING.md +91 -0
  3. gap/pkg/semigroups/GNUmakefile +110 -0
  4. gap/pkg/semigroups/GNUmakefile.in +110 -0
  5. gap/pkg/semigroups/GPL +674 -0
  6. gap/pkg/semigroups/LICENSE +16 -0
  7. gap/pkg/semigroups/Makefile +26 -0
  8. gap/pkg/semigroups/Makefile.gappkg +225 -0
  9. gap/pkg/semigroups/PackageInfo.g +529 -0
  10. gap/pkg/semigroups/README.md +102 -0
  11. gap/pkg/semigroups/VERSIONS +112 -0
  12. gap/pkg/semigroups/aclocal.m4 +375 -0
  13. gap/pkg/semigroups/autogen.sh +25 -0
  14. gap/pkg/semigroups/bin/aarch64-apple-darwin23-default64-kv10/semigroups.so +0 -0
  15. gap/pkg/semigroups/config.guess +1807 -0
  16. gap/pkg/semigroups/config.log +1158 -0
  17. gap/pkg/semigroups/config.status +1131 -0
  18. gap/pkg/semigroups/config.sub +1960 -0
  19. gap/pkg/semigroups/configure +9742 -0
  20. gap/pkg/semigroups/configure.ac +71 -0
  21. gap/pkg/semigroups/data/doc/greens.pickle +1 -0
  22. gap/pkg/semigroups/data/gens/fullbool-8.pickle.gz +0 -0
  23. gap/pkg/semigroups/data/gens/fullbool.pickle.gz +0 -0
  24. gap/pkg/semigroups/data/gens/hall.pickle.gz +0 -0
  25. gap/pkg/semigroups/data/gens/reflex-6.pickle.gz +0 -0
  26. gap/pkg/semigroups/data/gens/reflex.pickle.gz +0 -0
  27. gap/pkg/semigroups/data/tst/bipart4 +10 -0
  28. gap/pkg/semigroups/data/tst/pperm10 +1 -0
  29. gap/pkg/semigroups/data/tst/tables.gz +0 -0
  30. gap/pkg/semigroups/data/tst/testdata +1 -0
  31. gap/pkg/semigroups/data/tst/testinstall.pickle +1 -0
  32. gap/pkg/semigroups/data/tst/trans3 +7 -0
  33. gap/pkg/semigroups/data/tst/trans3-old +7 -0
  34. gap/pkg/semigroups/environment.yml +7 -0
  35. gap/pkg/semigroups/gap/attributes/acting.gd +15 -0
  36. gap/pkg/semigroups/gap/attributes/acting.gi +297 -0
  37. gap/pkg/semigroups/gap/attributes/attr.gd +91 -0
  38. gap/pkg/semigroups/gap/attributes/attr.gi +1214 -0
  39. gap/pkg/semigroups/gap/attributes/dual.gd +25 -0
  40. gap/pkg/semigroups/gap/attributes/dual.gi +209 -0
  41. gap/pkg/semigroups/gap/attributes/factor.gd +17 -0
  42. gap/pkg/semigroups/gap/attributes/factor.gi +453 -0
  43. gap/pkg/semigroups/gap/attributes/homomorph.gd +84 -0
  44. gap/pkg/semigroups/gap/attributes/homomorph.gi +591 -0
  45. gap/pkg/semigroups/gap/attributes/inverse.gd +38 -0
  46. gap/pkg/semigroups/gap/attributes/inverse.gi +708 -0
  47. gap/pkg/semigroups/gap/attributes/isomorph.gd +16 -0
  48. gap/pkg/semigroups/gap/attributes/isomorph.gi +377 -0
  49. gap/pkg/semigroups/gap/attributes/isorms.gd +49 -0
  50. gap/pkg/semigroups/gap/attributes/isorms.gi +1383 -0
  51. gap/pkg/semigroups/gap/attributes/maximal.gd +16 -0
  52. gap/pkg/semigroups/gap/attributes/maximal.gi +1876 -0
  53. gap/pkg/semigroups/gap/attributes/properties.gd +109 -0
  54. gap/pkg/semigroups/gap/attributes/properties.gi +1658 -0
  55. gap/pkg/semigroups/gap/attributes/rms-translat.gd +39 -0
  56. gap/pkg/semigroups/gap/attributes/rms-translat.gi +1078 -0
  57. gap/pkg/semigroups/gap/attributes/semifp.gd +12 -0
  58. gap/pkg/semigroups/gap/attributes/semifp.gi +84 -0
  59. gap/pkg/semigroups/gap/attributes/translat.gd +474 -0
  60. gap/pkg/semigroups/gap/attributes/translat.gi +1779 -0
  61. gap/pkg/semigroups/gap/congruences/cong.gd +154 -0
  62. gap/pkg/semigroups/gap/congruences/cong.gi +351 -0
  63. gap/pkg/semigroups/gap/congruences/conginv.gd +38 -0
  64. gap/pkg/semigroups/gap/congruences/conginv.gi +589 -0
  65. gap/pkg/semigroups/gap/congruences/conglatt.gd +101 -0
  66. gap/pkg/semigroups/gap/congruences/conglatt.gi +886 -0
  67. gap/pkg/semigroups/gap/congruences/congpairs.gd +21 -0
  68. gap/pkg/semigroups/gap/congruences/congpairs.gi +272 -0
  69. gap/pkg/semigroups/gap/congruences/congpart.gd +90 -0
  70. gap/pkg/semigroups/gap/congruences/congpart.gi +449 -0
  71. gap/pkg/semigroups/gap/congruences/congrees.gd +20 -0
  72. gap/pkg/semigroups/gap/congruences/congrees.gi +313 -0
  73. gap/pkg/semigroups/gap/congruences/congrms.gd +54 -0
  74. gap/pkg/semigroups/gap/congruences/congrms.gi +1467 -0
  75. gap/pkg/semigroups/gap/congruences/congsemigraph.gd +28 -0
  76. gap/pkg/semigroups/gap/congruences/congsemigraph.gi +289 -0
  77. gap/pkg/semigroups/gap/congruences/congsimple.gd +27 -0
  78. gap/pkg/semigroups/gap/congruences/congsimple.gi +236 -0
  79. gap/pkg/semigroups/gap/congruences/conguniv.gd +20 -0
  80. gap/pkg/semigroups/gap/congruences/conguniv.gi +271 -0
  81. gap/pkg/semigroups/gap/congruences/congwordgraph.gd +21 -0
  82. gap/pkg/semigroups/gap/congruences/congwordgraph.gi +250 -0
  83. gap/pkg/semigroups/gap/elements/bipart.gd +71 -0
  84. gap/pkg/semigroups/gap/elements/bipart.gi +995 -0
  85. gap/pkg/semigroups/gap/elements/blocks.gd +31 -0
  86. gap/pkg/semigroups/gap/elements/blocks.gi +134 -0
  87. gap/pkg/semigroups/gap/elements/boolmat.gd +74 -0
  88. gap/pkg/semigroups/gap/elements/boolmat.gi +726 -0
  89. gap/pkg/semigroups/gap/elements/elements.gd +11 -0
  90. gap/pkg/semigroups/gap/elements/elements.gi +121 -0
  91. gap/pkg/semigroups/gap/elements/ffmat.gd +71 -0
  92. gap/pkg/semigroups/gap/elements/ffmat.gi +311 -0
  93. gap/pkg/semigroups/gap/elements/maxplusmat.gd +131 -0
  94. gap/pkg/semigroups/gap/elements/maxplusmat.gi +782 -0
  95. gap/pkg/semigroups/gap/elements/pbr.gd +51 -0
  96. gap/pkg/semigroups/gap/elements/pbr.gi +740 -0
  97. gap/pkg/semigroups/gap/elements/pperm.gd +11 -0
  98. gap/pkg/semigroups/gap/elements/pperm.gi +14 -0
  99. gap/pkg/semigroups/gap/elements/semiringmat.gd +136 -0
  100. gap/pkg/semigroups/gap/elements/semiringmat.gi +717 -0
  101. gap/pkg/semigroups/gap/elements/star.gd +21 -0
  102. gap/pkg/semigroups/gap/elements/star.gi +21 -0
  103. gap/pkg/semigroups/gap/elements/trans.gd +13 -0
  104. gap/pkg/semigroups/gap/elements/trans.gi +50 -0
  105. gap/pkg/semigroups/gap/fp/freeband.gd +22 -0
  106. gap/pkg/semigroups/gap/fp/freeband.gi +502 -0
  107. gap/pkg/semigroups/gap/fp/freeinverse.gd +30 -0
  108. gap/pkg/semigroups/gap/fp/freeinverse.gi +465 -0
  109. gap/pkg/semigroups/gap/fp/tietze.gd +89 -0
  110. gap/pkg/semigroups/gap/fp/tietze.gi +1578 -0
  111. gap/pkg/semigroups/gap/fp/word.gd +15 -0
  112. gap/pkg/semigroups/gap/fp/word.gi +67 -0
  113. gap/pkg/semigroups/gap/greens/acting-inverse.gi +774 -0
  114. gap/pkg/semigroups/gap/greens/acting-regular.gi +553 -0
  115. gap/pkg/semigroups/gap/greens/acting.gd +81 -0
  116. gap/pkg/semigroups/gap/greens/acting.gi +2433 -0
  117. gap/pkg/semigroups/gap/greens/froidure-pin.gd +25 -0
  118. gap/pkg/semigroups/gap/greens/froidure-pin.gi +741 -0
  119. gap/pkg/semigroups/gap/greens/generic.gd +117 -0
  120. gap/pkg/semigroups/gap/greens/generic.gi +630 -0
  121. gap/pkg/semigroups/gap/ideals/acting.gd +17 -0
  122. gap/pkg/semigroups/gap/ideals/acting.gi +1155 -0
  123. gap/pkg/semigroups/gap/ideals/froidure-pin.gd +11 -0
  124. gap/pkg/semigroups/gap/ideals/froidure-pin.gi +105 -0
  125. gap/pkg/semigroups/gap/ideals/ideals.gd +45 -0
  126. gap/pkg/semigroups/gap/ideals/ideals.gi +442 -0
  127. gap/pkg/semigroups/gap/ideals/lambda-rho.gd +16 -0
  128. gap/pkg/semigroups/gap/ideals/lambda-rho.gi +614 -0
  129. gap/pkg/semigroups/gap/libsemigroups/cong.gd +24 -0
  130. gap/pkg/semigroups/gap/libsemigroups/cong.gi +431 -0
  131. gap/pkg/semigroups/gap/libsemigroups/fpsemi.gd +16 -0
  132. gap/pkg/semigroups/gap/libsemigroups/fpsemi.gi +53 -0
  133. gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gd +17 -0
  134. gap/pkg/semigroups/gap/libsemigroups/froidure-pin.gi +945 -0
  135. gap/pkg/semigroups/gap/libsemigroups/sims1.gd +38 -0
  136. gap/pkg/semigroups/gap/libsemigroups/sims1.gi +308 -0
  137. gap/pkg/semigroups/gap/main/acting.gd +36 -0
  138. gap/pkg/semigroups/gap/main/acting.gi +779 -0
  139. gap/pkg/semigroups/gap/main/froidure-pin.gd +72 -0
  140. gap/pkg/semigroups/gap/main/froidure-pin.gi +655 -0
  141. gap/pkg/semigroups/gap/main/graded.gd +26 -0
  142. gap/pkg/semigroups/gap/main/graded.gi +355 -0
  143. gap/pkg/semigroups/gap/main/lambda-rho.gd +29 -0
  144. gap/pkg/semigroups/gap/main/lambda-rho.gi +514 -0
  145. gap/pkg/semigroups/gap/main/orbits.gd +24 -0
  146. gap/pkg/semigroups/gap/main/orbits.gi +512 -0
  147. gap/pkg/semigroups/gap/main/semiact.gd +20 -0
  148. gap/pkg/semigroups/gap/main/semiact.gi +821 -0
  149. gap/pkg/semigroups/gap/main/setup.gd +61 -0
  150. gap/pkg/semigroups/gap/main/setup.gi +1094 -0
  151. gap/pkg/semigroups/gap/obsolete.gd +9 -0
  152. gap/pkg/semigroups/gap/obsolete.gi +14 -0
  153. gap/pkg/semigroups/gap/options.g +55 -0
  154. gap/pkg/semigroups/gap/semigroups/grpperm.gd +12 -0
  155. gap/pkg/semigroups/gap/semigroups/grpperm.gi +177 -0
  156. gap/pkg/semigroups/gap/semigroups/semibipart.gd +28 -0
  157. gap/pkg/semigroups/gap/semigroups/semibipart.gi +570 -0
  158. gap/pkg/semigroups/gap/semigroups/semiboolmat.gd +20 -0
  159. gap/pkg/semigroups/gap/semigroups/semiboolmat.gi +104 -0
  160. gap/pkg/semigroups/gap/semigroups/semicons.gd +52 -0
  161. gap/pkg/semigroups/gap/semigroups/semicons.gi +1194 -0
  162. gap/pkg/semigroups/gap/semigroups/semidp.gd +13 -0
  163. gap/pkg/semigroups/gap/semigroups/semidp.gi +509 -0
  164. gap/pkg/semigroups/gap/semigroups/semieunit.gd +126 -0
  165. gap/pkg/semigroups/gap/semigroups/semieunit.gi +889 -0
  166. gap/pkg/semigroups/gap/semigroups/semiex.gd +104 -0
  167. gap/pkg/semigroups/gap/semigroups/semiex.gi +1590 -0
  168. gap/pkg/semigroups/gap/semigroups/semiffmat.gd +37 -0
  169. gap/pkg/semigroups/gap/semigroups/semiffmat.gi +565 -0
  170. gap/pkg/semigroups/gap/semigroups/semifp.gd +28 -0
  171. gap/pkg/semigroups/gap/semigroups/semifp.gi +1364 -0
  172. gap/pkg/semigroups/gap/semigroups/semigraph.gd +40 -0
  173. gap/pkg/semigroups/gap/semigroups/semigraph.gi +292 -0
  174. gap/pkg/semigroups/gap/semigroups/semigrp.gd +165 -0
  175. gap/pkg/semigroups/gap/semigroups/semigrp.gi +1225 -0
  176. gap/pkg/semigroups/gap/semigroups/semimaxplus.gd +72 -0
  177. gap/pkg/semigroups/gap/semigroups/semimaxplus.gi +710 -0
  178. gap/pkg/semigroups/gap/semigroups/semintmat.gd +13 -0
  179. gap/pkg/semigroups/gap/semigroups/semintmat.gi +74 -0
  180. gap/pkg/semigroups/gap/semigroups/semipbr.gd +19 -0
  181. gap/pkg/semigroups/gap/semigroups/semipbr.gi +139 -0
  182. gap/pkg/semigroups/gap/semigroups/semipperm.gd +27 -0
  183. gap/pkg/semigroups/gap/semigroups/semipperm.gi +711 -0
  184. gap/pkg/semigroups/gap/semigroups/semiquo.gd +14 -0
  185. gap/pkg/semigroups/gap/semigroups/semiquo.gi +97 -0
  186. gap/pkg/semigroups/gap/semigroups/semiringmat.gd +16 -0
  187. gap/pkg/semigroups/gap/semigroups/semiringmat.gi +21 -0
  188. gap/pkg/semigroups/gap/semigroups/semirms.gd +19 -0
  189. gap/pkg/semigroups/gap/semigroups/semirms.gi +977 -0
  190. gap/pkg/semigroups/gap/semigroups/semitrans.gd +49 -0
  191. gap/pkg/semigroups/gap/semigroups/semitrans.gi +909 -0
  192. gap/pkg/semigroups/gap/tools/display.gd +24 -0
  193. gap/pkg/semigroups/gap/tools/display.gi +749 -0
  194. gap/pkg/semigroups/gap/tools/io.gd +17 -0
  195. gap/pkg/semigroups/gap/tools/io.gi +543 -0
  196. gap/pkg/semigroups/gap/tools/iterators.gd +16 -0
  197. gap/pkg/semigroups/gap/tools/iterators.gi +253 -0
  198. gap/pkg/semigroups/gap/tools/utils.gd +19 -0
  199. gap/pkg/semigroups/gap/tools/utils.gi +756 -0
  200. gap/pkg/semigroups/gapbind14/.ccls +18 -0
  201. gap/pkg/semigroups/gapbind14/.clang-format +104 -0
  202. gap/pkg/semigroups/gapbind14/CPPLINT.cfg +5 -0
  203. gap/pkg/semigroups/gapbind14/LICENSE +674 -0
  204. gap/pkg/semigroups/gapbind14/README.md +76 -0
  205. gap/pkg/semigroups/gapbind14/demo/.gitignore +4 -0
  206. gap/pkg/semigroups/gapbind14/demo/LICENSE +293 -0
  207. gap/pkg/semigroups/gapbind14/demo/Makefile.gappkg +220 -0
  208. gap/pkg/semigroups/gapbind14/demo/Makefile.in +19 -0
  209. gap/pkg/semigroups/gapbind14/demo/PackageInfo.g +87 -0
  210. gap/pkg/semigroups/gapbind14/demo/README.md +17 -0
  211. gap/pkg/semigroups/gapbind14/demo/configure +34 -0
  212. gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gd +19 -0
  213. gap/pkg/semigroups/gapbind14/demo/gap/gapbind_demo.gi +10 -0
  214. gap/pkg/semigroups/gapbind14/demo/init.g +16 -0
  215. gap/pkg/semigroups/gapbind14/demo/makedoc.g +10 -0
  216. gap/pkg/semigroups/gapbind14/demo/read.g +6 -0
  217. gap/pkg/semigroups/gapbind14/demo/src/gapbind_demo.cc +142 -0
  218. gap/pkg/semigroups/gapbind14/demo/tst/testall.g +12 -0
  219. gap/pkg/semigroups/gapbind14/include/gapbind14/cpp_fn.hpp +223 -0
  220. gap/pkg/semigroups/gapbind14/include/gapbind14/gap_include.hpp +26 -0
  221. gap/pkg/semigroups/gapbind14/include/gapbind14/gapbind14.hpp +445 -0
  222. gap/pkg/semigroups/gapbind14/include/gapbind14/tame_free_fn.hpp +420 -0
  223. gap/pkg/semigroups/gapbind14/include/gapbind14/tame_mem_fn.hpp +556 -0
  224. gap/pkg/semigroups/gapbind14/include/gapbind14/to_cpp.hpp +162 -0
  225. gap/pkg/semigroups/gapbind14/include/gapbind14/to_gap.hpp +158 -0
  226. gap/pkg/semigroups/gapbind14/src/.clang-format +108 -0
  227. gap/pkg/semigroups/gapbind14/src/gapbind14.cpp +334 -0
  228. gap/pkg/semigroups/init.g +150 -0
  229. gap/pkg/semigroups/m4/ax_append_flag.m4 +50 -0
  230. gap/pkg/semigroups/m4/ax_check_compile_flag.m4 +53 -0
  231. gap/pkg/semigroups/m4/ax_check_hpcombi.m4 +121 -0
  232. gap/pkg/semigroups/m4/ax_check_libsemigroup.m4 +68 -0
  233. gap/pkg/semigroups/m4/ax_compare_version.m4 +177 -0
  234. gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
  235. gap/pkg/semigroups/m4/ax_cxx_compile_stdcxx_14.m4 +34 -0
  236. gap/pkg/semigroups/m4/ax_prefix_config_h.m4 +203 -0
  237. gap/pkg/semigroups/m4/ax_pthread.m4 +522 -0
  238. gap/pkg/semigroups/m4/find_gap.m4 +94 -0
  239. gap/pkg/semigroups/makedoc.g +153 -0
  240. gap/pkg/semigroups/prerequisites.sh +62 -0
  241. gap/pkg/semigroups/read.g +105 -0
  242. gap/pkg/semigroups/release.toml +6 -0
  243. gap/pkg/semigroups/tst/extreme/README +2 -0
  244. gap/pkg/semigroups/tst/extreme/attrinv.tst +703 -0
  245. gap/pkg/semigroups/tst/extreme/bipart.tst +2803 -0
  246. gap/pkg/semigroups/tst/extreme/closure.tst +652 -0
  247. gap/pkg/semigroups/tst/extreme/cong.tst +286 -0
  248. gap/pkg/semigroups/tst/extreme/conginv.tst +43 -0
  249. gap/pkg/semigroups/tst/extreme/examples.tst +2449 -0
  250. gap/pkg/semigroups/tst/extreme/freeband.tst +37 -0
  251. gap/pkg/semigroups/tst/extreme/greens-acting-regular.tst +27 -0
  252. gap/pkg/semigroups/tst/extreme/greens-acting.tst +1999 -0
  253. gap/pkg/semigroups/tst/extreme/ideals.tst +858 -0
  254. gap/pkg/semigroups/tst/extreme/inverse.tst +1025 -0
  255. gap/pkg/semigroups/tst/extreme/maximal.tst +856 -0
  256. gap/pkg/semigroups/tst/extreme/misc.tst +4236 -0
  257. gap/pkg/semigroups/tst/extreme/monoid_pkg.tst +1488 -0
  258. gap/pkg/semigroups/tst/extreme/properties.tst +914 -0
  259. gap/pkg/semigroups/tst/extreme/semibipart.tst +2837 -0
  260. gap/pkg/semigroups/tst/extreme/semieunit.tst +49 -0
  261. gap/pkg/semigroups/tst/extreme/semiffmat.tst +353 -0
  262. gap/pkg/semigroups/tst/extreme/semigroups.tst +245 -0
  263. gap/pkg/semigroups/tst/extreme/semiiter.tst +58 -0
  264. gap/pkg/semigroups/tst/extreme/semirms.tst +1091 -0
  265. gap/pkg/semigroups/tst/extreme/transform.tst +305 -0
  266. gap/pkg/semigroups/tst/extreme/translat.tst +44 -0
  267. gap/pkg/semigroups/tst/standard/README +2 -0
  268. gap/pkg/semigroups/tst/standard/attributes/acting.tst +388 -0
  269. gap/pkg/semigroups/tst/standard/attributes/attr.tst +2404 -0
  270. gap/pkg/semigroups/tst/standard/attributes/dual.tst +308 -0
  271. gap/pkg/semigroups/tst/standard/attributes/factor.tst +629 -0
  272. gap/pkg/semigroups/tst/standard/attributes/homomorph.tst +1134 -0
  273. gap/pkg/semigroups/tst/standard/attributes/inverse.tst +1521 -0
  274. gap/pkg/semigroups/tst/standard/attributes/isomorph.tst +435 -0
  275. gap/pkg/semigroups/tst/standard/attributes/isorms.tst +1147 -0
  276. gap/pkg/semigroups/tst/standard/attributes/maximal.tst +853 -0
  277. gap/pkg/semigroups/tst/standard/attributes/properties.tst +2028 -0
  278. gap/pkg/semigroups/tst/standard/attributes/semifp.tst +53 -0
  279. gap/pkg/semigroups/tst/standard/attributes/translat.tst +796 -0
  280. gap/pkg/semigroups/tst/standard/congruences/cong.tst +1044 -0
  281. gap/pkg/semigroups/tst/standard/congruences/conginv.tst +292 -0
  282. gap/pkg/semigroups/tst/standard/congruences/conglatt.tst +421 -0
  283. gap/pkg/semigroups/tst/standard/congruences/congpairs.tst +1011 -0
  284. gap/pkg/semigroups/tst/standard/congruences/congrees.tst +288 -0
  285. gap/pkg/semigroups/tst/standard/congruences/congrms.tst +701 -0
  286. gap/pkg/semigroups/tst/standard/congruences/congsemigraph.tst +422 -0
  287. gap/pkg/semigroups/tst/standard/congruences/congsimple.tst +311 -0
  288. gap/pkg/semigroups/tst/standard/congruences/conguniv.tst +259 -0
  289. gap/pkg/semigroups/tst/standard/congruences/congwordgraph.tst +330 -0
  290. gap/pkg/semigroups/tst/standard/elements/bipart.tst +783 -0
  291. gap/pkg/semigroups/tst/standard/elements/blocks.tst +166 -0
  292. gap/pkg/semigroups/tst/standard/elements/boolmat.tst +608 -0
  293. gap/pkg/semigroups/tst/standard/elements/elements.tst +117 -0
  294. gap/pkg/semigroups/tst/standard/elements/ffmat.tst +349 -0
  295. gap/pkg/semigroups/tst/standard/elements/maxplusmat.tst +613 -0
  296. gap/pkg/semigroups/tst/standard/elements/pbr.tst +506 -0
  297. gap/pkg/semigroups/tst/standard/elements/pperm.tst +32 -0
  298. gap/pkg/semigroups/tst/standard/elements/semiringmat.tst +601 -0
  299. gap/pkg/semigroups/tst/standard/elements/trans.tst +58 -0
  300. gap/pkg/semigroups/tst/standard/fp/freeband.tst +311 -0
  301. gap/pkg/semigroups/tst/standard/fp/freeinverse.tst +147 -0
  302. gap/pkg/semigroups/tst/standard/fp/tietze.tst +780 -0
  303. gap/pkg/semigroups/tst/standard/fp/word.tst +106 -0
  304. gap/pkg/semigroups/tst/standard/greens/acting-inverse.tst +545 -0
  305. gap/pkg/semigroups/tst/standard/greens/acting-regular.tst +396 -0
  306. gap/pkg/semigroups/tst/standard/greens/acting.tst +2033 -0
  307. gap/pkg/semigroups/tst/standard/greens/froidure-pin.tst +1831 -0
  308. gap/pkg/semigroups/tst/standard/greens/generic.tst +1436 -0
  309. gap/pkg/semigroups/tst/standard/ideals/acting.tst +279 -0
  310. gap/pkg/semigroups/tst/standard/ideals/froidure-pin.tst +178 -0
  311. gap/pkg/semigroups/tst/standard/ideals/ideals.tst +380 -0
  312. gap/pkg/semigroups/tst/standard/libsemigroups/cong.tst +310 -0
  313. gap/pkg/semigroups/tst/standard/libsemigroups/froidure-pin.tst +778 -0
  314. gap/pkg/semigroups/tst/standard/libsemigroups/sims1.tst +379 -0
  315. gap/pkg/semigroups/tst/standard/main/acting.tst +411 -0
  316. gap/pkg/semigroups/tst/standard/main/froidure-pin.tst +392 -0
  317. gap/pkg/semigroups/tst/standard/main/semiact.tst +203 -0
  318. gap/pkg/semigroups/tst/standard/main/setup.tst +1144 -0
  319. gap/pkg/semigroups/tst/standard/obsolete.tst +19 -0
  320. gap/pkg/semigroups/tst/standard/options.tst +54 -0
  321. gap/pkg/semigroups/tst/standard/semigroups/grpperm.tst +581 -0
  322. gap/pkg/semigroups/tst/standard/semigroups/semibipart.tst +2635 -0
  323. gap/pkg/semigroups/tst/standard/semigroups/semiboolmat.tst +1871 -0
  324. gap/pkg/semigroups/tst/standard/semigroups/semicons.tst +1173 -0
  325. gap/pkg/semigroups/tst/standard/semigroups/semidp.tst +739 -0
  326. gap/pkg/semigroups/tst/standard/semigroups/semieunit.tst +339 -0
  327. gap/pkg/semigroups/tst/standard/semigroups/semiex.tst +2055 -0
  328. gap/pkg/semigroups/tst/standard/semigroups/semiffmat.tst +746 -0
  329. gap/pkg/semigroups/tst/standard/semigroups/semifp.tst +2702 -0
  330. gap/pkg/semigroups/tst/standard/semigroups/semigraph.tst +133 -0
  331. gap/pkg/semigroups/tst/standard/semigroups/semigrp.tst +1112 -0
  332. gap/pkg/semigroups/tst/standard/semigroups/semimaxplus.tst +654 -0
  333. gap/pkg/semigroups/tst/standard/semigroups/semipbr.tst +2142 -0
  334. gap/pkg/semigroups/tst/standard/semigroups/semipperm.tst +2169 -0
  335. gap/pkg/semigroups/tst/standard/semigroups/semiquo.tst +278 -0
  336. gap/pkg/semigroups/tst/standard/semigroups/semirms.tst +3010 -0
  337. gap/pkg/semigroups/tst/standard/semigroups/semitrans.tst +2758 -0
  338. gap/pkg/semigroups/tst/standard/tools/display.tst +1040 -0
  339. gap/pkg/semigroups/tst/standard/tools/io.tst +363 -0
  340. gap/pkg/semigroups/tst/testinstall.tst +1815 -0
  341. gap/pkg/semigroups/tst/teststandard.g +22 -0
  342. gap/pkg/semigroups/tst/workspaces/load-workspace.tst +142 -0
  343. gap/pkg/semigroups/tst/workspaces/load.g +11 -0
  344. gap/pkg/semigroups/tst/workspaces/save-workspace.tst +166 -0
  345. gap/pkg/semigroups/tst/workspaces/save.g +14 -0
  346. passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA +93 -0
  347. passagemath_gap_pkg_semigroups-10.6.30.dist-info/METADATA.bak +94 -0
  348. passagemath_gap_pkg_semigroups-10.6.30.dist-info/RECORD +354 -0
  349. passagemath_gap_pkg_semigroups-10.6.30.dist-info/WHEEL +6 -0
  350. passagemath_gap_pkg_semigroups-10.6.30.dist-info/top_level.txt +1 -0
  351. passagemath_gap_pkg_semigroups.dylibs/libsemigroups.2.dylib +0 -0
  352. sage/all__sagemath_gap_pkg_semigroups.py +1 -0
  353. sage/libs/all__sagemath_gap_pkg_semigroups.py +1 -0
  354. sage/libs/gap_pkg_semigroups.cpython-310-darwin.so +0 -0
@@ -0,0 +1,977 @@
1
+ ############################################################################
2
+ ##
3
+ ## semigroups/semirms.gi
4
+ ## Copyright (C) 2014-2022 James D. Mitchell
5
+ ## Wilf A. Wilson
6
+ ##
7
+ ## Licensing information can be found in the README file of this package.
8
+ ##
9
+ #############################################################################
10
+ ##
11
+
12
+ # this file contains methods for every operation/attribute/property that is
13
+ # specific to Rees 0-matrix semigroups.
14
+
15
+ #############################################################################
16
+ ## Random semigroups
17
+ #############################################################################
18
+
19
+ InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
20
+ [IsReesMatrixSemigroup, IsList],
21
+ function(_, params)
22
+ local order, i;
23
+ if Length(params) < 1 then # rows I
24
+ params[1] := Random(1, 100);
25
+ elif not IsPosInt(params[1]) then
26
+ return "the 2nd argument (number of rows) must be a positive integer";
27
+ fi;
28
+ if Length(params) < 2 then # cols J
29
+ params[2] := Random(1, 100);
30
+ elif not IsPosInt(params[2]) then
31
+ return "the 3rd argument (number of columns) must be a positive integer";
32
+ fi;
33
+ if Length(params) < 3 then # group
34
+ order := Random(1, 2047);
35
+ i := Random(1, NumberSmallGroups(order));
36
+ params[3] := Range(IsomorphismPermGroup(SmallGroup(order, i)));
37
+ elif not IsPermGroup(params[3]) then
38
+ return "the 4th argument must be a permutation group";
39
+ fi;
40
+ if Length(params) > 3 then
41
+ return Concatenation("expected at most 3 arguments, found ",
42
+ String(Length(params)));
43
+ fi;
44
+ return params;
45
+ end);
46
+
47
+ InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
48
+ [IsReesZeroMatrixSemigroup, IsList],
49
+ {filt, params}
50
+ -> SEMIGROUPS_ProcessRandomArgsCons(IsReesMatrixSemigroup, params));
51
+
52
+ InstallMethod(SEMIGROUPS_ProcessRandomArgsCons,
53
+ [IsReesZeroMatrixSemigroup and IsRegularSemigroup, IsList],
54
+ {filt, params}
55
+ -> SEMIGROUPS_ProcessRandomArgsCons(IsReesMatrixSemigroup, params));
56
+
57
+ InstallMethod(RandomSemigroupCons,
58
+ "for IsReesZeroMatrixSemigroup and list",
59
+ [IsReesZeroMatrixSemigroup, IsList],
60
+ function(_, params)
61
+ local I, G, J, mat, i, j;
62
+
63
+ I := [1 .. params[1]];
64
+ J := [1 .. params[2]];
65
+ G := params[3];
66
+ # could add nr connected components
67
+
68
+ mat := List(J, x -> I * 0);
69
+
70
+ for i in I do
71
+ for j in J do
72
+ if Random(1, 2) = 1 then
73
+ mat[j][i] := Random(G);
74
+ fi;
75
+ od;
76
+ od;
77
+
78
+ return ReesZeroMatrixSemigroup(G, mat);
79
+ end);
80
+
81
+ InstallMethod(RandomSemigroupCons,
82
+ "for IsReesMatrixSemigroup and list",
83
+ [IsReesMatrixSemigroup, IsList],
84
+ function(_, params)
85
+ local I, G, J, mat, i, j;
86
+
87
+ I := [1 .. params[1]];
88
+ J := [1 .. params[2]];
89
+ G := params[3];
90
+
91
+ mat := List(J, x -> List(I, x -> ()));
92
+
93
+ for i in I do
94
+ for j in J do
95
+ if Random(1, 2) = 1 then
96
+ mat[j][i] := Random(G);
97
+ fi;
98
+ od;
99
+ od;
100
+
101
+ return ReesMatrixSemigroup(G, mat);
102
+ end);
103
+
104
+ InstallMethod(RandomSemigroupCons,
105
+ "for IsReesZeroMatrixSemigroup and IsRegularSemigroup and list",
106
+ [IsReesZeroMatrixSemigroup and IsRegularSemigroup, IsList],
107
+ function(_, params)
108
+ local I, G, J, mat, i, j;
109
+
110
+ I := [1 .. params[1]];
111
+ J := [1 .. params[2]];
112
+ G := params[3];
113
+ # could add nr connected components
114
+
115
+ mat := List(J, x -> I * 0);
116
+
117
+ if I > J then
118
+ for i in J do
119
+ mat[i][i] := ();
120
+ od;
121
+ for i in [params[2] + 1 .. params[1]] do
122
+ mat[1][i] := ();
123
+ od;
124
+ else
125
+ for i in I do
126
+ mat[i][i] := ();
127
+ od;
128
+ for i in [params[1] + 1 .. params[2]] do
129
+ mat[i][1] := ();
130
+ od;
131
+ fi;
132
+
133
+ for i in I do
134
+ for j in J do
135
+ if Random(1, 2) = 1 then
136
+ mat[j][i] := Random(G);
137
+ fi;
138
+ od;
139
+ od;
140
+
141
+ return ReesZeroMatrixSemigroup(G, mat);
142
+ end);
143
+
144
+ #############################################################################
145
+ ## Isomorphisms
146
+ #############################################################################
147
+
148
+ InstallMethod(AsMonoid, "for a Rees matrix semigroup",
149
+ [IsReesMatrixSemigroup], ReturnFail);
150
+
151
+ InstallMethod(AsMonoid, "for a Rees 0-matrix semigroup",
152
+ [IsReesZeroMatrixSemigroup], ReturnFail);
153
+
154
+ InstallMethod(IsomorphismSemigroup,
155
+ "for IsReesMatrixSemigroup and a semigroup",
156
+ [IsReesMatrixSemigroup, IsSemigroup],
157
+ {filt, S} -> IsomorphismReesMatrixSemigroup(S));
158
+
159
+ InstallMethod(IsomorphismSemigroup,
160
+ "for IsReesZeroMatrixSemigroup and a semigroup",
161
+ [IsReesZeroMatrixSemigroup, IsSemigroup],
162
+ {filt, S} -> IsomorphismReesZeroMatrixSemigroup(S));
163
+
164
+ InstallMethod(IsomorphismReesMatrixSemigroup, "for a semigroup",
165
+ [IsSemigroup],
166
+ 3, # to beat IsReesMatrixSubsemigroup
167
+ function(S)
168
+ local D, iso, inv;
169
+
170
+ if not IsFinite(S) then
171
+ TryNextMethod();
172
+ elif not IsSimpleSemigroup(S) then
173
+ ErrorNoReturn("the argument (a semigroup) is not simple");
174
+ # TODO(later) is there another method? I.e. can we turn
175
+ # non-simple/non-0-simple semigroups into Rees (0-)matrix semigroups over
176
+ # non-groups?
177
+ fi;
178
+
179
+ D := GreensDClasses(S)[1];
180
+ iso := IsomorphismReesMatrixSemigroup(D);
181
+ inv := InverseGeneralMapping(iso);
182
+ UseIsomorphismRelation(S, Range(iso));
183
+
184
+ # We use object instead of x below to stop some GAP library tests from
185
+ # failing.
186
+ return SemigroupIsomorphismByFunctionNC(S,
187
+ Range(iso),
188
+ object -> object ^ iso,
189
+ object -> object ^ inv);
190
+ end);
191
+
192
+ InstallMethod(IsomorphismReesZeroMatrixSemigroup, "for a semigroup",
193
+ [IsSemigroup],
194
+ function(S)
195
+ local D, map, inj, inv;
196
+
197
+ if not IsFinite(S) then
198
+ TryNextMethod();
199
+ elif not IsZeroSimpleSemigroup(S) then
200
+ ErrorNoReturn("the argument (a semigroup) is not a 0-simple semigroup");
201
+ # TODO(later) is there another method? I.e. can we turn
202
+ # non-simple/non-0-simple semigroups into Rees (0-)matrix semigroups over
203
+ # non-groups?
204
+ fi;
205
+
206
+ D := First(GreensDClasses(S),
207
+ x -> not IsMultiplicativeZero(S, Representative(x)));
208
+ map := SEMIGROUPS.InjectionPrincipalFactor(D, ReesZeroMatrixSemigroup);
209
+
210
+ # the below is necessary since map is not defined on the zero of S
211
+ inj := function(x)
212
+ if x = MultiplicativeZero(S) then
213
+ return MultiplicativeZero(Range(map));
214
+ fi;
215
+ return x ^ map;
216
+ end;
217
+
218
+ inv := function(x)
219
+ if x = MultiplicativeZero(Range(map)) then
220
+ return MultiplicativeZero(S);
221
+ fi;
222
+ return x ^ InverseGeneralMapping(map);
223
+ end;
224
+
225
+ return SemigroupIsomorphismByFunctionNC(S,
226
+ Range(map),
227
+ inj,
228
+ inv);
229
+ end);
230
+
231
+ InstallGlobalFunction(RMSElementNC,
232
+ function(R, i, g, j)
233
+ return Objectify(TypeReesMatrixSemigroupElements(R),
234
+ [i, g, j, Matrix(R)]);
235
+ end);
236
+
237
+ InstallMethod(MultiplicativeZero, "for a Rees 0-matrix semigroup",
238
+ [IsReesZeroMatrixSubsemigroup],
239
+ function(R)
240
+ local super, x, gens, row, col, i;
241
+
242
+ super := ReesMatrixSemigroupOfFamily(FamilyObj(Representative(R)));
243
+ x := MultiplicativeZero(super);
244
+ if (HasIsReesZeroMatrixSemigroup(R) and IsReesZeroMatrixSemigroup(R))
245
+ or x in R then
246
+ return x;
247
+ fi;
248
+
249
+ gens := GeneratorsOfSemigroup(R);
250
+ row := RowOfReesZeroMatrixSemigroupElement(gens[1]);
251
+ col := ColumnOfReesZeroMatrixSemigroupElement(gens[1]);
252
+ for i in [2 .. Length(gens)] do
253
+ x := gens[i];
254
+ if RowOfReesZeroMatrixSemigroupElement(x) <> row or
255
+ ColumnOfReesZeroMatrixSemigroupElement(x) <> col then
256
+ return fail;
257
+ fi;
258
+ od;
259
+
260
+ TryNextMethod();
261
+ end);
262
+
263
+ # same method for ideals
264
+
265
+ InstallMethod(IsomorphismPermGroup,
266
+ "for a subsemigroup of a Rees 0-matrix semigroup",
267
+ [IsReesZeroMatrixSubsemigroup],
268
+ function(S)
269
+ local r, mat, G, map, inv;
270
+
271
+ if not IsGroupAsSemigroup(S) then
272
+ ErrorNoReturn("the underlying semigroup of the argument (a ",
273
+ " subsemigroup of a Rees 0-matrix ",
274
+ "semigroup) does not satisfy IsGroupAsSemigroup");
275
+ fi;
276
+
277
+ r := Representative(S);
278
+ if r![1] = 0 then # special case for the group consisting of 0
279
+ return SemigroupIsomorphismByFunctionNC(S, Group(()), x -> (), x -> r);
280
+ fi;
281
+
282
+ mat := Matrix(ReesMatrixSemigroupOfFamily(FamilyObj(r)));
283
+ G := Group(List(GeneratorsOfSemigroup(S), x -> x![2] * mat[x![3]][x![1]]));
284
+ UseIsomorphismRelation(S, G);
285
+
286
+ map := x -> x![2] * mat[x![3]][x![1]];
287
+ inv := x -> RMSElement(S, r![1], x * mat[r![3]][r![1]] ^ -1, r![3]);
288
+ return SemigroupIsomorphismByFunctionNC(S, G, map, inv);
289
+ end);
290
+
291
+ ################################################################################
292
+ # Attributes, operations, and properties
293
+ ################################################################################
294
+
295
+ # This method is only required because of some problems in the library code for
296
+ # Rees (0-)matrix semigroups.
297
+
298
+ InstallMethod(Representative,
299
+ "for a Rees 0-matrix subsemigroup with rows, columns and matrix",
300
+ [IsReesZeroMatrixSubsemigroup
301
+ and HasRowsOfReesZeroMatrixSemigroup
302
+ and HasColumnsOfReesZeroMatrixSemigroup
303
+ and HasMatrixOfReesZeroMatrixSemigroup],
304
+ function(R)
305
+ return Objectify(TypeReesMatrixSemigroupElements(R),
306
+ [RowsOfReesZeroMatrixSemigroup(R)[1],
307
+ Representative(UnderlyingSemigroup(R)),
308
+ ColumnsOfReesZeroMatrixSemigroup(R)[1],
309
+ MatrixOfReesZeroMatrixSemigroup(R)]);
310
+ end);
311
+
312
+ # This method is only required because of some problems in the library code for
313
+ # Rees (0-)matrix semigroups.
314
+
315
+ InstallMethod(Representative,
316
+ "for a Rees matrix subsemigroup with rows, columns, and matrix",
317
+ [IsReesMatrixSubsemigroup
318
+ and HasRowsOfReesMatrixSemigroup
319
+ and HasColumnsOfReesMatrixSemigroup
320
+ and HasMatrixOfReesMatrixSemigroup],
321
+ function(R)
322
+ return Objectify(TypeReesMatrixSemigroupElements(R),
323
+ [RowsOfReesMatrixSemigroup(R)[1],
324
+ Representative(UnderlyingSemigroup(R)),
325
+ ColumnsOfReesMatrixSemigroup(R)[1],
326
+ MatrixOfReesMatrixSemigroup(R)]);
327
+ end);
328
+
329
+ # same method for ideals
330
+
331
+ InstallMethod(GroupOfUnits, "for a Rees 0-matrix subsemigroup",
332
+ [IsReesZeroMatrixSubsemigroup],
333
+ function(S)
334
+ local x, U;
335
+
336
+ x := MultiplicativeNeutralElement(S);
337
+
338
+ if MultiplicativeNeutralElement(S) = fail then
339
+ return fail;
340
+ elif IsMultiplicativeZero(S, x) then
341
+ U := Semigroup(x);
342
+ else
343
+ U := Semigroup(RClassNC(S, x), rec(small := true));
344
+ fi;
345
+ SetIsGroupAsSemigroup(U, true);
346
+ return U;
347
+ end);
348
+
349
+ # This method is better than the one for acting semigroups.
350
+
351
+ InstallMethod(Random, "for a Rees 0-matrix semigroup",
352
+ [IsReesZeroMatrixSemigroup],
353
+ 3, # to beat the method for regular acting semigroups
354
+ function(R)
355
+ return Objectify(TypeReesMatrixSemigroupElements(R),
356
+ [Random(Rows(R)), Random(UnderlyingSemigroup(R)),
357
+ Random(Columns(R)), Matrix(ParentAttr(R))]);
358
+ end);
359
+
360
+ # TODO(later) a proper method here
361
+
362
+ InstallMethod(IsGeneratorsOfInverseSemigroup,
363
+ "for a collection of Rees 0-matrix semigroup elements",
364
+ [IsReesZeroMatrixSemigroupElementCollection], ReturnFalse);
365
+
366
+ InstallMethod(ViewString,
367
+ "for a Rees 0-matrix subsemigroup ideal with ideal generators",
368
+ [IsReesZeroMatrixSubsemigroup and IsSemigroupIdeal and
369
+ HasGeneratorsOfSemigroupIdeal],
370
+ 7, # to beat ViewString for a semigroup ideal with ideal generators
371
+ function(I)
372
+ local str, nrgens;
373
+
374
+ str := "\><";
375
+
376
+ if HasIsCommutative(I) and IsCommutative(I) then
377
+ Append(str, "\>commutative\< ");
378
+ fi;
379
+
380
+ if HasIsZeroSimpleSemigroup(I) and IsZeroSimpleSemigroup(I) then
381
+ Append(str, "\>0-simple\< ");
382
+ elif HasIsSimpleSemigroup(I) and IsSimpleSemigroup(I) then
383
+ Append(str, "\>simple\< ");
384
+ fi;
385
+
386
+ if HasIsInverseSemigroup(I) and IsInverseSemigroup(I) then
387
+ Append(str, "\>inverse\< ");
388
+ elif HasIsRegularSemigroup(I)
389
+ and not (HasIsSimpleSemigroup(I) and IsSimpleSemigroup(I)) then
390
+ if IsRegularSemigroup(I) then
391
+ Append(str, "\>regular\< ");
392
+ else
393
+ Append(str, "\>non-regular\< ");
394
+ fi;
395
+ fi;
396
+
397
+ Append(str, "\>Rees\< \>0-matrix\< \>semigroup\< \>ideal\< ");
398
+ Append(str, "\<with\> ");
399
+
400
+ nrgens := Length(GeneratorsOfSemigroupIdeal(I));
401
+ Append(str, ViewString(nrgens));
402
+ Append(str, "\< generator");
403
+
404
+ if nrgens > 1 or nrgens = 0 then
405
+ Append(str, "s\<");
406
+ else
407
+ Append(str, "\<");
408
+ fi;
409
+ Append(str, ">\<");
410
+
411
+ return str;
412
+ end);
413
+
414
+ InstallMethod(MatrixEntries, "for a Rees matrix semigroup",
415
+ [IsReesMatrixSemigroup],
416
+ function(R)
417
+ return Union(Matrix(R){Columns(R)}{Rows(R)});
418
+ # in case R is a proper subsemigroup of another RMS
419
+ end);
420
+
421
+ InstallMethod(MatrixEntries, "for a Rees 0-matrix semigroup",
422
+ [IsReesZeroMatrixSemigroup],
423
+ function(R)
424
+ local mat, elt, zero, i, j;
425
+
426
+ mat := Matrix(R);
427
+ elt := [];
428
+ zero := false;
429
+
430
+ for i in Rows(R) do
431
+ for j in Columns(R) do
432
+ if mat[j][i] = 0 then
433
+ zero := true;
434
+ else
435
+ AddSet(elt, mat[j][i]);
436
+ fi;
437
+ od;
438
+ od;
439
+
440
+ if zero then
441
+ return Concatenation([0], elt);
442
+ fi;
443
+ return elt;
444
+ end);
445
+
446
+ InstallMethod(GreensHClassOfElement, "for a RZMS, pos int, and pos int",
447
+ [IsReesZeroMatrixSemigroup, IsPosInt, IsPosInt],
448
+ function(R, i, j)
449
+ local rep;
450
+
451
+ rep := RMSElement(R, i, Representative(UnderlyingSemigroup(R)), j);
452
+ return GreensHClassOfElement(R, rep);
453
+ end);
454
+
455
+ InstallMethod(RZMSDigraph, "for a Rees 0-matrix semigroup",
456
+ [IsReesZeroMatrixSemigroup],
457
+ function(R)
458
+ local rows, cols, mat, n, m, nredges, out, gr, i, j;
459
+
460
+ rows := Rows(R);
461
+ cols := Columns(R);
462
+ mat := Matrix(R);
463
+ n := Length(Columns(R));
464
+ m := Length(Rows(R));
465
+ nredges := 0;
466
+ out := List([1 .. m + n], x -> []);
467
+ for i in [1 .. m] do
468
+ for j in [1 .. n] do
469
+ if mat[cols[j]][rows[i]] <> 0 then
470
+ nredges := nredges + 2;
471
+ Add(out[j + m], i);
472
+ Add(out[i], j + m);
473
+ fi;
474
+ od;
475
+ od;
476
+ gr := DigraphNC(out);
477
+ SetIsBipartiteDigraph(gr, true);
478
+ SetDigraphHasLoops(gr, false);
479
+ SetDigraphBicomponents(gr, [[1 .. m], [m + 1 .. m + n]]);
480
+ SetDigraphNrEdges(gr, nredges);
481
+ # SetDigraphVertexLabels(gr, Concatenation(rows, cols));
482
+ return gr;
483
+ end);
484
+
485
+ InstallMethod(RZMSConnectedComponents,
486
+ "for a Rees 0-matrix semigroup",
487
+ [IsReesZeroMatrixSemigroup],
488
+ function(R)
489
+ local gr, comps, new, n, m, i;
490
+
491
+ gr := RZMSDigraph(R);
492
+ comps := DigraphConnectedComponents(gr);
493
+ new := List([1 .. Length(comps.comps)], x -> [[], []]);
494
+ n := Length(Columns(R));
495
+ m := Length(Rows(R));
496
+
497
+ for i in [1 .. m] do
498
+ Add(new[comps.id[i]][1], Rows(R)[i]);
499
+ od;
500
+ for i in [m + 1 .. m + n] do
501
+ Add(new[comps.id[i]][2], Columns(R)[i - m]);
502
+ od;
503
+ return new;
504
+ end);
505
+
506
+ #############################################################################
507
+ ## Methods related to inverse semigroups
508
+ #############################################################################
509
+
510
+ InstallMethod(IsInverseSemigroup,
511
+ "for a Rees 0-matrix subsemigroup",
512
+ [IsReesZeroMatrixSubsemigroup],
513
+ function(R)
514
+ local U, elts, mat, row, seen, G, j, i;
515
+
516
+ if not IsReesZeroMatrixSemigroup(R) then
517
+ TryNextMethod();
518
+ fi;
519
+
520
+ U := UnderlyingSemigroup(R);
521
+
522
+ if (HasIsInverseSemigroup(U) and not IsInverseSemigroup(U))
523
+ or (HasIsRegularSemigroup(U) and not IsRegularSemigroup(U))
524
+ or (HasIsMonoidAsSemigroup(U) and not IsMonoidAsSemigroup(U))
525
+ or (HasGroupOfUnits(U) and GroupOfUnits(U) = fail)
526
+ or Length(Columns(R)) <> Length(Rows(R)) then
527
+ return false;
528
+ fi;
529
+
530
+ # Check each row and column of mat contains *exactly* one non-zero entry
531
+ elts := [];
532
+ mat := Matrix(R);
533
+ row := BlistList([1 .. Maximum(Rows(R))], []); # <row[i]> is <true> iff found
534
+ # a non-zero entry in row <i>
535
+ for j in Columns(R) do
536
+ seen := false; # <seen>: <true> iff found a non-zero entry in the col <j>
537
+ for i in Rows(R) do
538
+ if mat[j][i] <> 0 then
539
+ if seen or row[i] then
540
+ return false;
541
+ fi;
542
+ seen := true;
543
+ row[i] := true;
544
+ AddSet(elts, mat[j][i]);
545
+ fi;
546
+ od;
547
+ if not seen then
548
+ return false;
549
+ fi;
550
+ od;
551
+
552
+ # Check that non-zero matrix entries are units of the inverse monoid <U>
553
+ G := GroupOfUnits(U);
554
+
555
+ return G <> fail and ForAll(elts, x -> x in G) and IsInverseSemigroup(U);
556
+ end);
557
+
558
+ InstallMethod(Idempotents,
559
+ "for an inverse Rees 0-matrix subsemigroup",
560
+ [IsReesZeroMatrixSubsemigroup and IsInverseSemigroup],
561
+ function(R)
562
+ local mat, I, star, e, out, k, i, j, x;
563
+
564
+ if not IsReesZeroMatrixSemigroup(R) then
565
+ TryNextMethod();
566
+ fi;
567
+
568
+ mat := Matrix(R);
569
+ I := Rows(R);
570
+ star := EmptyPlist(Maximum(I));
571
+ for i in I do
572
+ for j in Columns(R) do
573
+ if mat[j][i] <> 0 then
574
+ star[i] := j; # <star[i]> is index such that mat[star[i]][i] <> 0
575
+ break;
576
+ fi;
577
+ od;
578
+ od;
579
+
580
+ e := Idempotents(UnderlyingSemigroup(R));
581
+ out := EmptyPlist(NrIdempotents(R));
582
+ out[1] := MultiplicativeZero(R);
583
+ k := 1;
584
+ for i in I do
585
+ for x in e do
586
+ k := k + 1;
587
+ out[k] := RMSElement(R, i, x * mat[star[i]][i] ^ -1, star[i]);
588
+ od;
589
+ od;
590
+
591
+ return out;
592
+ end);
593
+
594
+ # The following works for RZMS's over groups
595
+
596
+ InstallMethod(Idempotents,
597
+ "for a Rees 0-matrix subsemigroup",
598
+ [IsReesZeroMatrixSubsemigroup],
599
+ RankFilter(IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup) -
600
+ RankFilter(IsReesZeroMatrixSubsemigroup) + 2,
601
+ function(R)
602
+ local G, group, iso, inv, mat, out, k, i, j;
603
+
604
+ if not IsReesZeroMatrixSemigroup(R)
605
+ or not IsGroupAsSemigroup(UnderlyingSemigroup(R)) then
606
+ TryNextMethod();
607
+ fi;
608
+
609
+ G := UnderlyingSemigroup(R);
610
+ group := IsGroup(G);
611
+ if not IsGroup(R) then
612
+ iso := IsomorphismPermGroup(G);
613
+ inv := InverseGeneralMapping(iso);
614
+ fi;
615
+
616
+ mat := Matrix(R);
617
+ out := [];
618
+ out[1] := MultiplicativeZero(R);
619
+ k := 1;
620
+ for i in Rows(R) do
621
+ for j in Columns(R) do
622
+ if mat[j][i] <> 0 then
623
+ k := k + 1;
624
+ if group then
625
+ out[k] := RMSElement(R, i, mat[j][i] ^ -1, j);
626
+ else
627
+ out[k] := RMSElement(R, i, ((mat[j][i] ^ iso) ^ -1) ^ inv, j);
628
+ fi;
629
+ fi;
630
+ od;
631
+ od;
632
+
633
+ return out;
634
+ end);
635
+
636
+ InstallMethod(NrIdempotents,
637
+ "for an inverse Rees 0-matrix subsemigroup",
638
+ [IsReesZeroMatrixSubsemigroup and IsInverseSemigroup],
639
+ function(R)
640
+ if not IsReesZeroMatrixSemigroup(R) then
641
+ TryNextMethod();
642
+ fi;
643
+ return NrIdempotents(UnderlyingSemigroup(R)) * Length(Rows(R)) + 1;
644
+ end);
645
+
646
+ # The following works for RZMS's over groups
647
+
648
+ InstallMethod(NrIdempotents,
649
+ "for a Rees 0-matrix subsemigroup",
650
+ [IsReesZeroMatrixSubsemigroup],
651
+ RankFilter(IsSemigroup and CanUseFroidurePin and HasGeneratorsOfSemigroup) -
652
+ RankFilter(IsReesZeroMatrixSubsemigroup) + 2,
653
+ function(R)
654
+ local count, mat, i, j;
655
+
656
+ if not IsReesZeroMatrixSemigroup(R)
657
+ or not IsGroupAsSemigroup(UnderlyingSemigroup(R)) then
658
+ TryNextMethod();
659
+ fi;
660
+
661
+ count := 1;
662
+ mat := Matrix(R);
663
+ for i in Rows(R) do
664
+ for j in Columns(R) do
665
+ if mat[j][i] <> 0 then
666
+ count := count + 1;
667
+ fi;
668
+ od;
669
+ od;
670
+
671
+ return count;
672
+ end);
673
+
674
+ #############################################################################
675
+ ## Normalizations
676
+ #############################################################################
677
+
678
+ InstallMethod(RZMSNormalization,
679
+ "for a Rees 0-matrix semigroup",
680
+ [IsReesZeroMatrixSemigroup],
681
+ function(R)
682
+ local T, rows, cols, I, L, lookup_cols, lookup_rows, mat, group, one, r, c,
683
+ invert, GT, comp, size, p, rows_unsorted, cols_unsorted, x, j, cols_todo,
684
+ rows_todo, new, S, iso, inv, i, k;
685
+
686
+ T := UnderlyingSemigroup(R);
687
+
688
+ rows := Rows(R);
689
+ cols := Columns(R);
690
+ I := Length(rows);
691
+ L := Length(cols);
692
+
693
+ lookup_cols := EmptyPlist(Maximum(cols));
694
+ for i in [1 .. L] do
695
+ lookup_cols[cols[i]] := i;
696
+ od;
697
+ lookup_rows := EmptyPlist(Maximum(rows));
698
+ for i in [1 .. I] do
699
+ lookup_rows[rows[i]] := i;
700
+ od;
701
+
702
+ mat := Matrix(R);
703
+ group := IsGroupAsSemigroup(T);
704
+
705
+ if group then
706
+ one := MultiplicativeNeutralElement(T);
707
+ r := ListWithIdenticalEntries(I, one);
708
+ c := ListWithIdenticalEntries(L, one);
709
+ # Not every IsGroupAsSemigroup has the usual inverse operation
710
+ if IsGroup(T) then
711
+ invert := InverseOp;
712
+ else
713
+ invert := x -> InversesOfSemigroupElement(T, x)[1];
714
+ fi;
715
+ fi;
716
+
717
+ GT := {x, y} -> y < x;
718
+
719
+ # Sort the connected components of <R> by size (#rows * #columns) descending.
720
+ # This also sends any zero-columns or zero-rows to the end of the new matrix.
721
+ comp := ShallowCopy(RZMSConnectedComponents(R));
722
+ size := List(comp, x -> Length(x[1]) * Length(x[2]));
723
+ SortParallel(size, comp, GT); # comp[1] defines largest connected component.
724
+ p := rec(row := EmptyPlist(I), col := EmptyPlist(I));
725
+
726
+ for k in [1 .. Length(comp)] do
727
+ if size[k] = 0 then
728
+ Append(p.row, comp[k][1]);
729
+ Append(p.col, comp[k][2]);
730
+ continue;
731
+ fi;
732
+ # The rows and columns contained in the <k>^th largest conn. component.
733
+ rows := comp[k][1];
734
+ cols := comp[k][2];
735
+ rows_unsorted := BlistList(rows, rows);
736
+ cols_unsorted := BlistList(cols, cols);
737
+
738
+ # Choose a column with the max number of non-zero entries to go first
739
+ x := List(cols, j -> Number(rows, i -> mat[j][i] <> 0));
740
+ x := Position(x, Maximum(x));
741
+ j := cols[x];
742
+ cols_todo := [j];
743
+ cols_unsorted[x] := false;
744
+ Add(p.col, j);
745
+
746
+ # At each step, for the columns which have just been sorted:
747
+ # 1. It is necessary to identify <rows_todo>, those unsorted rows which have
748
+ # an idempotent in any of the just-sorted columns.
749
+ # 2. When doing this we also order these rows such that they are contiguous.
750
+ # 3. If <T> is a group, then for each of these rows <i> we define the
751
+ # element <r[i]> of <T> which will, in the normalization, ensure that the
752
+ # first non-zero entry of that row is <one>, the identity of <T>.
753
+ # It is necessary to do the same procedure again, swapping rows and columns.
754
+
755
+ while not IsEmpty(cols_todo) do
756
+ rows_todo := [];
757
+ for j in cols_todo do
758
+ x := ListBlist(rows, rows_unsorted);
759
+ for i in x do
760
+ if mat[j][i] <> 0 then
761
+ Add(rows_todo, i);
762
+ rows_unsorted[PositionSorted(rows, i)] := false;
763
+ if group then
764
+ r[i] := c[j] * mat[j][i];
765
+ fi;
766
+ Add(p.row, i);
767
+ fi;
768
+ od;
769
+ od;
770
+ cols_todo := [];
771
+ for i in rows_todo do
772
+ x := ListBlist(cols, cols_unsorted);
773
+ for j in x do
774
+ if mat[j][i] <> 0 then
775
+ Add(cols_todo, j);
776
+ cols_unsorted[PositionSorted(cols, j)] := false;
777
+ if group then
778
+ c[j] := r[i] * invert(mat[j][i]);
779
+ fi;
780
+ Add(p.col, j);
781
+ fi;
782
+ od;
783
+ od;
784
+ od;
785
+ od;
786
+
787
+ rows := Rows(R);
788
+ cols := Columns(R);
789
+
790
+ p.row := List(p.row, x -> lookup_rows[x]);
791
+ p.col := List(p.col, x -> lookup_cols[x]);
792
+
793
+ # p.row takes a row of <R> and gives the corresponding row of <S>.
794
+ # p.row_i is the inverse of this (to avoid inverting repeatedly).
795
+ p.row_i := PermList(p.row);
796
+ p.col_i := PermList(p.col);
797
+ p.row := p.row_i ^ -1;
798
+ p.col := p.col_i ^ -1;
799
+
800
+ # Construct the normalized RZMS <S>.
801
+ new := List(cols, x -> EmptyPlist(I));
802
+ for j in cols do
803
+ for i in rows do
804
+ if mat[j][i] <> 0 and group then
805
+ new[lookup_cols[j] ^ p.col][lookup_rows[i] ^ p.row] :=
806
+ c[j] * mat[j][i] * invert(r[i]);
807
+ else
808
+ new[lookup_cols[j] ^ p.col][lookup_rows[i] ^ p.row] := mat[j][i];
809
+ fi;
810
+ od;
811
+ od;
812
+ S := ReesZeroMatrixSemigroup(T, new);
813
+
814
+ # Construct isomorphisms between <R> and <S>.
815
+ # iso: (i, g, l) -> (i ^ p.row, r[i] * g * c[l] ^ -1, l ^ p.col)
816
+ iso := function(x)
817
+ if x![1] = 0 then
818
+ return MultiplicativeZero(S);
819
+ fi;
820
+ return RMSElement(S, lookup_rows[x![1]] ^ p.row,
821
+ r[x![1]] * x![2] * invert(c[x![3]]),
822
+ lookup_cols[x![3]] ^ p.col);
823
+ end;
824
+ # inv: (i, g, l) -> (a, r[a] ^ -1 * g * c[b], b)
825
+ # where a = i ^ (p.row ^ -1) and b = j ^ (r.col ^ -1)
826
+ inv := function(x)
827
+ if x![1] = 0 then
828
+ return MultiplicativeZero(R);
829
+ fi;
830
+ return RMSElement(R,
831
+ rows[x![1] ^ p.row_i],
832
+ invert(r[rows[x![1] ^ p.row_i]]) * x![2]
833
+ * c[cols[x![3] ^ p.col_i]],
834
+ cols[x![3] ^ p.col_i]);
835
+ end;
836
+
837
+ return SemigroupIsomorphismByFunctionNC(R, S, iso, inv);
838
+ end);
839
+
840
+ # Makes entries in the first row and col of the matrix equal to identity
841
+
842
+ InstallMethod(RMSNormalization,
843
+ "for a Rees matrix semigroup",
844
+ [IsReesMatrixSemigroup],
845
+ function(R)
846
+ local G, invert, new, r, c, S, lookup_rows, lookup_cols, iso, inv, j, i;
847
+
848
+ G := UnderlyingSemigroup(R);
849
+ if not IsGroupAsSemigroup(G) then
850
+ ErrorNoReturn("the underlying semigroup of the argument (a ",
851
+ " subsemigroup of a Rees matrix ",
852
+ "semigroup) does not satisfy IsGroupAsSemigroup");
853
+ fi;
854
+
855
+ if IsGroup(G) then
856
+ invert := InverseOp;
857
+ else
858
+ invert := x -> InversesOfSemigroupElement(G, x)[1];
859
+ fi;
860
+
861
+ new := ShallowCopy(Matrix(R)){Columns(R)}{Rows(R)};
862
+
863
+ # Construct the normalized RMS <S>
864
+ r := List([1 .. Length(Rows(R))], i -> invert(new[1][i]) * new[1][1]);
865
+ c := List([1 .. Length(Columns(R))], j -> invert(new[j][1]));
866
+ for j in [1 .. Length(Columns(R))] do
867
+ new[j] := ShallowCopy(new[j]);
868
+ for i in [1 .. Length(Rows(R))] do
869
+ new[j][i] := c[j] * new[j][i] * r[i];
870
+ od;
871
+ od;
872
+ S := ReesMatrixSemigroup(G, new);
873
+
874
+ lookup_rows := EmptyPlist(Maximum(Rows(R)));
875
+ lookup_cols := EmptyPlist(Maximum(Columns(R)));
876
+ for i in [1 .. Length(Rows(R))] do
877
+ lookup_rows[Rows(R)[i]] := i;
878
+ od;
879
+ for j in [1 .. Length(Columns(R))] do
880
+ lookup_cols[Columns(R)[j]] := j;
881
+ od;
882
+
883
+ # Construct isomorphisms between <R> and <S>
884
+ iso := x -> RMSElement(S, lookup_rows[x![1]],
885
+ invert(r[lookup_rows[x![1]]]) * x![2] *
886
+ invert(c[lookup_cols[x![3]]]),
887
+ lookup_cols[x![3]]);
888
+ inv := x -> RMSElement(R, Rows(R)[x![1]],
889
+ r[x![1]] * x![2] * c[x![3]],
890
+ Columns(R)[x![3]]);
891
+
892
+ return SemigroupIsomorphismByFunctionNC(R, S, iso, inv);
893
+ end);
894
+
895
+ InstallMethod(IsIdempotentGenerated, "for a Rees 0-matrix subsemigroup",
896
+ [IsReesZeroMatrixSubsemigroup],
897
+ function(R)
898
+ local U, N;
899
+ if not IsReesZeroMatrixSemigroup(R) then
900
+ TryNextMethod();
901
+ elif not IsConnectedDigraph(RZMSDigraph(R)) then
902
+ return false;
903
+ fi;
904
+ U := UnderlyingSemigroup(R);
905
+ if not IsGroupAsSemigroup(U) then
906
+ TryNextMethod();
907
+ fi;
908
+ N := Range(RZMSNormalization(R));
909
+ return Semigroup(Filtered(MatrixEntries(N), x -> x <> 0)) = U;
910
+ end);
911
+
912
+ InstallMethod(IsIdempotentGenerated, "for a Rees matrix subsemigroup",
913
+ [IsReesMatrixSubsemigroup],
914
+ function(R)
915
+ local U, N;
916
+ if not IsReesMatrixSemigroup(R) then
917
+ TryNextMethod();
918
+ fi;
919
+ U := UnderlyingSemigroup(R);
920
+ if not IsGroupAsSemigroup(U) then
921
+ TryNextMethod();
922
+ fi;
923
+ N := Range(RMSNormalization(R));
924
+ return Semigroup(MatrixEntries(N)) = U;
925
+ end);
926
+
927
+ InstallMethod(Size, "for a Rees matrix semigroup",
928
+ [IsReesMatrixSemigroup and HasUnderlyingSemigroup and HasRows and
929
+ HasColumns],
930
+ R -> Length(Rows(R)) * Size(UnderlyingSemigroup(R)) * Length(Columns(R)));
931
+
932
+ InstallMethod(Size, "for a Rees 0-matrix semigroup",
933
+ [IsReesZeroMatrixSemigroup and HasUnderlyingSemigroup and HasRows and
934
+ HasColumns],
935
+ function(R)
936
+ return Length(Rows(R)) * Size(UnderlyingSemigroup(R)) * Length(Columns(R))
937
+ + 1;
938
+ end);
939
+
940
+ #############################################################################
941
+ # Pickler
942
+ #############################################################################
943
+
944
+ SEMIGROUPS.PickleRMSOrRZMS := function(str)
945
+ Assert(1, IsString(str));
946
+ return function(file, x)
947
+ if IO_Write(file, str) = fail
948
+ or IO_Pickle(file, [UnderlyingSemigroup(x), Matrix(x)]) = IO_Error then
949
+ return IO_Error;
950
+ fi;
951
+ return IO_OK;
952
+ end;
953
+ end;
954
+
955
+ InstallMethod(IO_Pickle, "for a Rees matrix semigroup",
956
+ [IsFile, IsReesMatrixSemigroup], SEMIGROUPS.PickleRMSOrRZMS("RMSX"));
957
+
958
+ IO_Unpicklers.RMSX := function(file)
959
+ local x;
960
+ x := IO_Unpickle(file);
961
+ if x = IO_Error then
962
+ return IO_Error;
963
+ fi;
964
+ return ReesMatrixSemigroup(x[1], x[2]);
965
+ end;
966
+
967
+ InstallMethod(IO_Pickle, "for a Rees 0-matrix semigroup",
968
+ [IsFile, IsReesZeroMatrixSemigroup], SEMIGROUPS.PickleRMSOrRZMS("RZMS"));
969
+
970
+ IO_Unpicklers.RZMS := function(file)
971
+ local x;
972
+ x := IO_Unpickle(file);
973
+ if x = IO_Error then
974
+ return IO_Error;
975
+ fi;
976
+ return ReesZeroMatrixSemigroup(x[1], x[2]);
977
+ end;