passagemath-gap-pkg-semigroups 10.6.29__cp312-abi3-macosx_14_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 +1157 -0
  17. gap/pkg/semigroups/config.status +1132 -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 +354 -0
  349. passagemath_gap_pkg_semigroups-10.6.29.dist-info/WHEEL +6 -0
  350. passagemath_gap_pkg_semigroups-10.6.29.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.abi3.so +0 -0
@@ -0,0 +1,1467 @@
1
+ ############################################################################
2
+ ##
3
+ ## congruences/congrms.gi
4
+ ## Copyright (C) 2015-2022 Michael C. Young
5
+ ##
6
+ ## Licensing information can be found in the README file of this package.
7
+ ##
8
+ #############################################################################
9
+ ##
10
+ ## This file contains methods for congruences on finite (0-)simple Rees
11
+ ## (0-)matrix semigroups, using linked triples. See Howie 3.5-6, and see
12
+ ## MT's reports "Computing with Congruences on Finite 0-Simple Semigroups"
13
+ ## and MSc thesis "Computing with Semigroup Congruences" chapter 3.
14
+ ##
15
+
16
+ # This file is organised as follows:
17
+ # 1. Congruences: representation specific operations/functions
18
+ # 2. Congruences: representation specific constructors
19
+ # 3. Congruences: changing representation, generating pairs
20
+ # 4. Congruences: printing and viewing
21
+ # 5. Congruences: mandatory methods for CanComputeEquivalenceRelationPartition
22
+ # 6. Congruences: non-mandatory methods for
23
+ # CanComputeEquivalenceRelationPartition, where we have a superior method
24
+ # for this particular representation.
25
+ # 7. Equivalence classes: representation specific constructors
26
+ # 8. Equivalence classes: mandatory methods for
27
+ # CanComputeEquivalenceRelationPartition
28
+ # 9. Congruence lattice
29
+
30
+ ###############################################################################
31
+ # 1. Congruences: representation specific operations/functions
32
+ ###############################################################################
33
+
34
+ InstallMethod(IsLinkedTriple,
35
+ "for Rees matrix semigroup, group, and two lists",
36
+ [IsReesMatrixSemigroup,
37
+ IsGroup, IsDenseList, IsDenseList],
38
+ function(S, n, colBlocks, rowBlocks)
39
+ local mat, block, bi, bj, i, j, u, v, bu, bv;
40
+ # Check the semigroup is valid
41
+ if not IsFinite(S) then
42
+ ErrorNoReturn("the 1st argument (a Rees matrix semigroup) is not finite");
43
+ elif not IsSimpleSemigroup(S) then
44
+ ErrorNoReturn("the 1st argument (a Rees matrix semigroup) is not simple");
45
+ fi;
46
+ mat := Matrix(S);
47
+ # Check axiom (L2) from Howie p.86, then call NC function
48
+ # Go through the column blocks
49
+ for block in colBlocks do
50
+ # Check q-condition for all pairs of columns in this block (L2)
51
+ for bi in [1 .. Size(block)] do
52
+ for bj in [bi + 1 .. Size(block)] do
53
+ i := block[bi];
54
+ j := block[bj];
55
+ # Check all pairs of rows (u,v)
56
+ for u in [1 .. Size(mat)] do
57
+ for v in [u + 1 .. Size(mat)] do
58
+ if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
59
+ in n then
60
+ return false;
61
+ fi;
62
+ od;
63
+ od;
64
+ od;
65
+ od;
66
+ od;
67
+
68
+ # Go through the row blocks
69
+ for block in rowBlocks do
70
+ # Check q-condition for all pairs of rows in this block (L2)
71
+ for bu in [1 .. Size(block)] do
72
+ for bv in [bu + 1 .. Size(block)] do
73
+ u := block[bu];
74
+ v := block[bv];
75
+ # Check all pairs of columns (i,j)
76
+ for i in [1 .. Size(mat[1])] do
77
+ for j in [i + 1 .. Size(mat[1])] do
78
+ if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
79
+ in n then
80
+ return false;
81
+ fi;
82
+ od;
83
+ od;
84
+ od;
85
+ od;
86
+ od;
87
+ return true;
88
+ end);
89
+
90
+ InstallMethod(IsLinkedTriple,
91
+ "for Rees 0-matrix semigroup, group, and two lists",
92
+ [IsReesZeroMatrixSemigroup,
93
+ IsGroup, IsDenseList, IsDenseList],
94
+ function(S, n, colBlocks, rowBlocks)
95
+ local mat, block, i, j, u, v, bi, bj, bu, bv;
96
+ # Check the semigroup is valid
97
+ if not IsFinite(S) then
98
+ ErrorNoReturn("the 1st argument (a Rees 0-matrix semigroup) is not finite");
99
+ elif not IsZeroSimpleSemigroup(S) then
100
+ ErrorNoReturn("the 1st argument (a Rees 0-matrix semigroup) is ",
101
+ "not 0-simple");
102
+ fi;
103
+ mat := Matrix(S);
104
+ # Check axioms (L1) and (L2) from Howie p.86, then call NC function
105
+ # Go through the column blocks
106
+ for block in colBlocks do
107
+ for bj in [2 .. Size(block)] do
108
+ # Check columns have zeroes in all the same rows (L1)
109
+ for u in [1 .. Size(mat)] do
110
+ if (mat[u][block[1]] = 0) <> (mat[u][block[bj]] = 0) then
111
+ return false;
112
+ fi;
113
+ od;
114
+ od;
115
+ # Check q-condition for all pairs of columns in this block (L2)
116
+ for bi in [1 .. Size(block)] do
117
+ for bj in [bi + 1 .. Size(block)] do
118
+ i := block[bi];
119
+ j := block[bj];
120
+ # Check all pairs of rows (u,v)
121
+ for u in [1 .. Size(mat)] do
122
+ if mat[u][i] = 0 then
123
+ continue;
124
+ fi;
125
+ for v in [u + 1 .. Size(mat)] do
126
+ if mat[v][i] = 0 then
127
+ continue;
128
+ fi;
129
+ if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
130
+ in n then
131
+ return false;
132
+ fi;
133
+ od;
134
+ od;
135
+ od;
136
+ od;
137
+ od;
138
+
139
+ # Go through the row blocks
140
+ for block in rowBlocks do
141
+ for bv in [2 .. Size(block)] do
142
+ # Check rows have zeroes in all the same columns (L1)
143
+ for i in [1 .. Size(mat[1])] do
144
+ if (mat[block[1]][i] = 0) <> (mat[block[bv]][i] = 0) then
145
+ return false;
146
+ fi;
147
+ od;
148
+ od;
149
+ # Check q-condition for all pairs of rows in this block (L2)
150
+ for bu in [1 .. Size(block)] do
151
+ for bv in [bu + 1 .. Size(block)] do
152
+ u := block[bu];
153
+ v := block[bv];
154
+ # Check all pairs of columns (i,j)
155
+ for i in [1 .. Size(mat[1])] do
156
+ if mat[u][i] = 0 then
157
+ continue;
158
+ fi;
159
+ for j in [i + 1 .. Size(mat[1])] do
160
+ if mat[u][j] = 0 then
161
+ continue;
162
+ fi;
163
+ if not (mat[u][i] * mat[v][i] ^ -1 * mat[v][j] * mat[u][j] ^ -1)
164
+ in n then
165
+ return false;
166
+ fi;
167
+ od;
168
+ od;
169
+ od;
170
+ od;
171
+ od;
172
+ return true;
173
+ end);
174
+
175
+ BindGlobal("LinkedElement",
176
+ function(x)
177
+ local mat, i, u, v, j;
178
+ mat := Matrix(ReesMatrixSemigroupOfFamily(FamilyObj(x)));
179
+ i := x[1]; # Column no
180
+ u := x[3]; # Row no
181
+ if IsReesMatrixSemigroupElement(x) then
182
+ # RMS case
183
+ return mat[1][i] * x[2] * mat[u][1];
184
+ else
185
+ # RZMS case
186
+ for v in [1 .. Size(mat)] do
187
+ if mat[v][i] <> 0 then
188
+ break;
189
+ fi;
190
+ od;
191
+ for j in [1 .. Size(mat[1])] do
192
+ if mat[u][j] <> 0 then
193
+ break;
194
+ fi;
195
+ od;
196
+ return mat[v][i] * x[2] * mat[u][j];
197
+ fi;
198
+ end);
199
+
200
+ #############################################################################
201
+ # 2. Congruences: representation specific constructors
202
+ #############################################################################
203
+
204
+ InstallGlobalFunction(RMSCongruenceByLinkedTriple,
205
+ function(S, n, colBlocks, rowBlocks)
206
+ local mat, g;
207
+ mat := Matrix(S);
208
+ g := UnderlyingSemigroup(S);
209
+
210
+ # Basic checks
211
+ if not IsNormal(g, n) then
212
+ ErrorNoReturn("the 2nd argument (a group) is not a normal ",
213
+ "subgroup of the underlying semigroup of the 1st ",
214
+ "argument (a Rees matrix semigroup)");
215
+ elif not IsList(colBlocks) or not ForAll(colBlocks, IsList) then
216
+ ErrorNoReturn("the 3rd argument must be a list of lists");
217
+ elif not IsList(rowBlocks) or not ForAll(rowBlocks, IsList) then
218
+ ErrorNoReturn("the 4th argument must be a list of lists");
219
+ elif SortedList(Flat(colBlocks)) <> [1 .. Size(mat[1])] then
220
+ ErrorNoReturn("the 3rd argument (a list of lists) does not partition ",
221
+ "the columns of the matrix of the 1st argument (a Rees",
222
+ " matrix semigroup)");
223
+ elif SortedList(Flat(rowBlocks)) <> [1 .. Size(mat)] then
224
+ ErrorNoReturn("the 4th argument (a list of lists) does not partition ",
225
+ "the columns of the matrix of the 1st argument (a Rees",
226
+ " matrix semigroup)");
227
+ fi;
228
+
229
+ if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
230
+ return RMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks);
231
+ else
232
+ ErrorNoReturn("invalid triple");
233
+ fi;
234
+ end);
235
+
236
+ InstallGlobalFunction(RZMSCongruenceByLinkedTriple,
237
+ function(S, n, colBlocks, rowBlocks)
238
+ local mat, g;
239
+ mat := Matrix(S);
240
+ g := UnderlyingSemigroup(S);
241
+
242
+ # Basic checks
243
+ if not (IsGroup(g) and IsGroup(n)) then
244
+ ErrorNoReturn("the underlying semigroup of the 1st argument ",
245
+ "(a Rees 0-matrix semigroup) is not a group");
246
+ elif not IsNormal(g, n) then
247
+ ErrorNoReturn("the 2nd argument (a group) is not a normal ",
248
+ "subgroup of the underlying semigroup of the 1st ",
249
+ "argument (a Rees 0-matrix semigroup)");
250
+ elif not IsList(colBlocks) or not ForAll(colBlocks, IsList) then
251
+ ErrorNoReturn("the 3rd argument is not a list of lists");
252
+ elif not IsList(rowBlocks) or not ForAll(rowBlocks, IsList) then
253
+ ErrorNoReturn("the 4th argument is not a list of lists");
254
+ elif SortedList(Flat(colBlocks)) <> [1 .. Size(mat[1])] then
255
+ ErrorNoReturn("the 3rd argument (a list of lists) does not partition ",
256
+ "the columns of the matrix of the 1st argument (a Rees",
257
+ " 0-matrix semigroup)");
258
+ elif SortedList(Flat(rowBlocks)) <> [1 .. Size(mat)] then
259
+ ErrorNoReturn("the 4th argument (a list of lists) does not partition ",
260
+ "the columns of the matrix of the 1st argument (a Rees",
261
+ " 0-matrix semigroup)");
262
+ fi;
263
+
264
+ if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
265
+ return RZMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks);
266
+ else
267
+ ErrorNoReturn("invalid triple");
268
+ fi;
269
+ end);
270
+
271
+ InstallGlobalFunction(RMSCongruenceByLinkedTripleNC,
272
+ function(S, n, colBlocks, rowBlocks)
273
+ local fam, C, colLookup, rowLookup, i, j;
274
+ # Sort the blocks
275
+ colBlocks := SSortedList(colBlocks);
276
+ rowBlocks := SSortedList(rowBlocks);
277
+ # Calculate lookup table for equivalence relations
278
+ colLookup := [];
279
+ rowLookup := [];
280
+ for i in [1 .. Length(colBlocks)] do
281
+ for j in colBlocks[i] do
282
+ colLookup[j] := i;
283
+ od;
284
+ od;
285
+ for i in [1 .. Length(rowBlocks)] do
286
+ for j in rowBlocks[i] do
287
+ rowLookup[j] := i;
288
+ od;
289
+ od;
290
+ # Construct the object
291
+ fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(S)),
292
+ ElementsFamily(FamilyObj(S)));
293
+ C := Objectify(NewType(fam, IsRMSCongruenceByLinkedTriple),
294
+ rec(n := n,
295
+ colBlocks := colBlocks,
296
+ colLookup := colLookup,
297
+ rowBlocks := rowBlocks,
298
+ rowLookup := rowLookup));
299
+ SetSource(C, S);
300
+ SetRange(C, S);
301
+ return C;
302
+ end);
303
+
304
+ InstallGlobalFunction(RZMSCongruenceByLinkedTripleNC,
305
+ function(S, n, colBlocks, rowBlocks)
306
+ local fam, C, colLookup, rowLookup, i, j;
307
+ # Sort the blocks
308
+ colBlocks := SSortedList(colBlocks);
309
+ rowBlocks := SSortedList(rowBlocks);
310
+ # Calculate lookup table for equivalence relations
311
+ colLookup := [];
312
+ rowLookup := [];
313
+ for i in [1 .. Length(colBlocks)] do
314
+ for j in colBlocks[i] do
315
+ colLookup[j] := i;
316
+ od;
317
+ od;
318
+ for i in [1 .. Length(rowBlocks)] do
319
+ for j in rowBlocks[i] do
320
+ rowLookup[j] := i;
321
+ od;
322
+ od;
323
+ # Construct the object
324
+ fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(S)),
325
+ ElementsFamily(FamilyObj(S)));
326
+ C := Objectify(NewType(fam, IsRZMSCongruenceByLinkedTriple),
327
+ rec(n := n,
328
+ colBlocks := colBlocks,
329
+ colLookup := colLookup,
330
+ rowBlocks := rowBlocks,
331
+ rowLookup := rowLookup));
332
+ SetSource(C, S);
333
+ SetRange(C, S);
334
+ return C;
335
+ end);
336
+
337
+ ###############################################################################
338
+ # 3. Congruences: changing representation, generating pairs
339
+ ###############################################################################
340
+
341
+ InstallMethod(GeneratingPairsOfMagmaCongruence,
342
+ "for Rees matrix semigroup congruence by linked triple",
343
+ [IsRMSCongruenceByLinkedTriple],
344
+ function(C)
345
+ local S, G, m, pairs, n_gens, col_pairs, bl, j, row_pairs, max, n, cp, rp,
346
+ pair_no, r, c;
347
+ S := Range(C);
348
+ G := UnderlyingSemigroup(S);
349
+ m := Matrix(S);
350
+ pairs := [];
351
+
352
+ # Normal subgroup elements to identify with id
353
+ n_gens := GeneratorsOfSemigroup(C!.n);
354
+
355
+ # Pairs that generate the columns relation
356
+ col_pairs := [];
357
+ for bl in C!.colBlocks do
358
+ for j in [2 .. Size(bl)] do
359
+ Add(col_pairs, [bl[1], bl[j]]);
360
+ od;
361
+ od;
362
+
363
+ # Pairs that generate the rows relation
364
+ row_pairs := [];
365
+ for bl in C!.rowBlocks do
366
+ for j in [2 .. Size(bl)] do
367
+ Add(row_pairs, [bl[1], bl[j]]);
368
+ od;
369
+ od;
370
+
371
+ # Collate into RMS element pairs
372
+ max := Maximum(Length(n_gens), Length(col_pairs), Length(row_pairs));
373
+ pairs := EmptyPlist(max);
374
+ # Set default values in case a list has length 0
375
+ n := One(G);
376
+ cp := [1, 1];
377
+ rp := [1, 1];
378
+ # Iterate through all 3 lists together
379
+ for pair_no in [1 .. max] do
380
+ # If any list has run out, just keep using the last entry or default value
381
+ if pair_no <= Length(n_gens) then
382
+ n := n_gens[pair_no];
383
+ fi;
384
+ if pair_no <= Length(col_pairs) then
385
+ cp := col_pairs[pair_no];
386
+ fi;
387
+ if pair_no <= Length(row_pairs) then
388
+ rp := row_pairs[pair_no];
389
+ fi;
390
+ # Choose r and c s.t. m[r][cp[1]] and m[rp[1]][c] are both non-zero
391
+ # (since there are no zeroes, we can just use 1 for both)
392
+ r := 1;
393
+ c := 1;
394
+ # Make the pair and add it
395
+ pairs[pair_no] :=
396
+ [RMSElement(S, cp[1], m[r][cp[1]] ^ -1 * n * m[rp[1]][c] ^ -1, rp[1]),
397
+ RMSElement(S, cp[2], m[r][cp[2]] ^ -1 * m[rp[2]][c] ^ -1, rp[2])];
398
+ od;
399
+ return pairs;
400
+ end);
401
+
402
+ InstallMethod(GeneratingPairsOfMagmaCongruence,
403
+ "for Rees 0-matrix semigroup congruence by linked triple",
404
+ [IsRZMSCongruenceByLinkedTriple],
405
+ function(C)
406
+ local S, G, m, pairs, n_gens, col_pairs, bl, j, row_pairs, max, n, cp, rp,
407
+ pair_no, r, c;
408
+ S := Range(C);
409
+ G := UnderlyingSemigroup(S);
410
+ m := Matrix(S);
411
+ pairs := [];
412
+
413
+ # Normal subgroup elements to identify with id
414
+ n_gens := GeneratorsOfSemigroup(C!.n);
415
+
416
+ # Pairs that generate the columns relation
417
+ col_pairs := [];
418
+ for bl in C!.colBlocks do
419
+ for j in [2 .. Size(bl)] do
420
+ Add(col_pairs, [bl[1], bl[j]]);
421
+ od;
422
+ od;
423
+
424
+ # Pairs that generate the rows relation
425
+ row_pairs := [];
426
+ for bl in C!.rowBlocks do
427
+ for j in [2 .. Size(bl)] do
428
+ Add(row_pairs, [bl[1], bl[j]]);
429
+ od;
430
+ od;
431
+
432
+ # Collate into RMS element pairs
433
+ max := Maximum(Length(n_gens), Length(col_pairs), Length(row_pairs));
434
+ pairs := EmptyPlist(max);
435
+ # Set default values in case a list has length 0
436
+ n := One(G);
437
+ cp := [1, 1];
438
+ rp := [1, 1];
439
+ # Iterate through all 3 lists together
440
+ for pair_no in [1 .. max] do
441
+ # If any list has run out, just keep using the last entry or default value
442
+ if pair_no <= Length(n_gens) then
443
+ n := n_gens[pair_no];
444
+ fi;
445
+ if pair_no <= Length(col_pairs) then
446
+ cp := col_pairs[pair_no];
447
+ fi;
448
+ if pair_no <= Length(row_pairs) then
449
+ rp := row_pairs[pair_no];
450
+ fi;
451
+ # Choose r and c s.t. m[r][cp[1]] and m[rp[1]][c] are both non-zero
452
+ r := First([1 .. Length(m)], r -> m[r][cp[1]] <> 0);
453
+ c := First([1 .. Length(m[1])], c -> m[rp[1]][c] <> 0);
454
+ # Make the pair and add it
455
+ pairs[pair_no] :=
456
+ [RMSElement(S, cp[1], m[r][cp[1]] ^ -1 * n * m[rp[1]][c] ^ -1, rp[1]),
457
+ RMSElement(S, cp[2], m[r][cp[2]] ^ -1 * m[rp[2]][c] ^ -1, rp[2])];
458
+ od;
459
+ return pairs;
460
+ end);
461
+
462
+ InstallMethod(SemigroupCongruenceByGeneratingPairs,
463
+ "for Rees matrix semigroup and list of pairs",
464
+ [IsReesMatrixSemigroup, IsHomogeneousList],
465
+ ToBeat([IsReesMatrixSemigroup, IsHomogeneousList],
466
+ [IsSemigroup and CanUseLibsemigroupsCongruences, IsList and IsEmpty],
467
+ [IsSimpleSemigroup, IsHomogeneousList])
468
+ +
469
+ ToBeat([IsSimpleSemigroup, IsHomogeneousList],
470
+ [IsSemigroup and CanUseLibsemigroupsCongruences,
471
+ IsList and IsEmpty]),
472
+ function(S, pairs)
473
+ local g, mat, colLookup, rowLookup, n, C, pair, v, j;
474
+
475
+ g := UnderlyingSemigroup(S);
476
+ mat := Matrix(S);
477
+
478
+ # Union-Find data structure for the column and row equivalences
479
+ colLookup := PartitionDS(IsPartitionDS, Size(mat[1]));
480
+ rowLookup := PartitionDS(IsPartitionDS, Size(mat));
481
+
482
+ # Normal subgroup
483
+ n := Subgroup(g, []);
484
+
485
+ for pair in pairs do
486
+ # If this pair adds no information, ignore it
487
+ if pair[1] = pair[2] then
488
+ continue;
489
+ fi;
490
+
491
+ # Associate the columns and rows
492
+ Unite(colLookup, pair[1][1], pair[2][1]);
493
+ Unite(rowLookup, pair[1][3], pair[2][3]);
494
+
495
+ # Associate group entries in the normal subgroup
496
+ n := ClosureGroup(n, LinkedElement(pair[1]) * LinkedElement(pair[2]) ^ -1);
497
+
498
+ # Ensure linkedness
499
+ for v in [2 .. Size(mat)] do
500
+ n := ClosureGroup(n, mat[1][pair[1][1]]
501
+ * mat[v][pair[1][1]] ^ -1
502
+ * mat[v][pair[2][1]]
503
+ * mat[1][pair[2][1]] ^ -1);
504
+ od;
505
+ for j in [2 .. Size(mat[1])] do
506
+ n := ClosureGroup(n, mat[pair[1][3]][1]
507
+ * mat[pair[2][3]][1] ^ -1
508
+ * mat[pair[2][3]][j]
509
+ * mat[pair[1][3]][j] ^ -1);
510
+ od;
511
+ od;
512
+
513
+ # Make n normal
514
+ n := NormalClosure(g, n);
515
+ C := RMSCongruenceByLinkedTriple(S,
516
+ n,
517
+ PartsOfPartitionDS(colLookup),
518
+ PartsOfPartitionDS(rowLookup));
519
+ SetGeneratingPairsOfMagmaCongruence(C, pairs);
520
+ return C;
521
+ end);
522
+
523
+ InstallMethod(SemigroupCongruenceByGeneratingPairs,
524
+ "for a Rees 0-matrix semigroup and list of pairs",
525
+ [IsReesZeroMatrixSemigroup, IsHomogeneousList],
526
+ ToBeat([IsReesZeroMatrixSemigroup, IsHomogeneousList],
527
+ [IsSemigroup and CanUseLibsemigroupsCongruences, IsList and IsEmpty],
528
+ [IsZeroSimpleSemigroup, IsHomogeneousList])
529
+ +
530
+ ToBeat([IsZeroSimpleSemigroup, IsHomogeneousList],
531
+ [IsSemigroup and CanUseLibsemigroupsCongruences,
532
+ IsList and IsEmpty]),
533
+ function(S, pairs)
534
+ local g, mat, colLookup, rowLookup, n, u, i, C, pair, v, j;
535
+
536
+ g := UnderlyingSemigroup(S);
537
+ mat := Matrix(S);
538
+
539
+ # Union-Find data structure for the column and row equivalences
540
+ colLookup := PartitionDS(IsPartitionDS, Size(mat[1]));
541
+ rowLookup := PartitionDS(IsPartitionDS, Size(mat));
542
+
543
+ # Normal subgroup
544
+ n := Subgroup(g, []);
545
+
546
+ for pair in pairs do
547
+ # If this pair adds no information, ignore it
548
+ if pair[1] = pair[2] then
549
+ continue;
550
+ fi;
551
+
552
+ # Does this relate any non-zero elements to zero?
553
+ if pair[1] = MultiplicativeZero(S)
554
+ or pair[2] = MultiplicativeZero(S)
555
+ or ForAny([1 .. Size(mat)],
556
+ u -> (mat[u][pair[1][1]] = 0)
557
+ <> (mat[u][pair[2][1]] = 0))
558
+ or ForAny([1 .. Size(mat[1])],
559
+ i -> (mat[pair[1][3]][i] = 0)
560
+ <> (mat[pair[2][3]][i] = 0)) then
561
+ return UniversalSemigroupCongruence(S);
562
+ fi;
563
+
564
+ # Associate the columns and rows
565
+ Unite(colLookup, pair[1][1], pair[2][1]);
566
+ Unite(rowLookup, pair[1][3], pair[2][3]);
567
+
568
+ # Associate group entries in the normal subgroup
569
+ n := ClosureGroup(n, LinkedElement(pair[1]) * LinkedElement(pair[2]) ^ -1);
570
+
571
+ # Ensure linkedness
572
+ u := PositionProperty([1 .. Size(mat)], u -> mat[u][pair[1][1]] <> 0);
573
+ for v in [u + 1 .. Size(mat)] do
574
+ if mat[v][pair[1][1]] = 0 then
575
+ continue;
576
+ fi;
577
+ n := ClosureGroup(n, mat[u][pair[1][1]]
578
+ * mat[v][pair[1][1]] ^ -1
579
+ * mat[v][pair[2][1]]
580
+ * mat[u][pair[2][1]] ^ -1);
581
+ od;
582
+ i := PositionProperty([1 .. Size(mat[1])], k -> mat[pair[1][3]][k] <> 0);
583
+ for j in [i + 1 .. Size(mat[1])] do
584
+ if mat[pair[1][3]][j] = 0 then
585
+ continue;
586
+ fi;
587
+ n := ClosureGroup(n, mat[pair[1][3]][i]
588
+ * mat[pair[2][3]][i] ^ -1
589
+ * mat[pair[2][3]][j]
590
+ * mat[pair[1][3]][j] ^ -1);
591
+ od;
592
+ od;
593
+
594
+ n := NormalClosure(g, n);
595
+ C := RZMSCongruenceByLinkedTriple(S,
596
+ n,
597
+ PartsOfPartitionDS(colLookup),
598
+ PartsOfPartitionDS(rowLookup));
599
+ SetGeneratingPairsOfMagmaCongruence(C, pairs);
600
+ return C;
601
+ end);
602
+
603
+ #############################################################################
604
+ # 4. Congruences: printing and viewing
605
+ #############################################################################
606
+
607
+ InstallMethod(ViewObj,
608
+ "for Rees (0-)matrix semigroup congruence by linked triple",
609
+ [IsRMSOrRZMSCongruenceByLinkedTriple],
610
+ function(C)
611
+ Print("<semigroup congruence over ");
612
+ ViewObj(Range(C));
613
+ Print(" with linked triple (",
614
+ StructureDescription(C!.n:short), ",",
615
+ Size(C!.colBlocks), ",",
616
+ Size(C!.rowBlocks), ")>");
617
+ end);
618
+
619
+ #############################################################################
620
+ # 5. Congruences: mandatory methods for CanComputeEquivalenceRelationPartition
621
+ #############################################################################
622
+
623
+ InstallMethod(EquivalenceRelationPartitionWithSingletons,
624
+ "for a Rees (0-)matrix semigroup congruence by linked triple",
625
+ [IsRMSOrRZMSCongruenceByLinkedTriple],
626
+ function(C)
627
+ local S, n, elms, table, next, part, class, i, x;
628
+
629
+ S := Range(C);
630
+ n := Size(S);
631
+ elms := EnumeratorCanonical(S);
632
+ table := EmptyPlist(n);
633
+ next := 1;
634
+ part := [];
635
+ for i in [1 .. n] do
636
+ if not IsBound(table[i]) then
637
+ class := ImagesElm(C, elms[i]);
638
+ for x in class do
639
+ table[PositionCanonical(S, x)] := next;
640
+ od;
641
+ Add(part, class);
642
+ next := next + 1;
643
+ fi;
644
+ od;
645
+ SetEquivalenceRelationCanonicalLookup(C, table);
646
+ return part;
647
+ end);
648
+
649
+ InstallMethod(ImagesElm,
650
+ "for Rees matrix semigroup congruence by linked triple and element",
651
+ [IsRMSCongruenceByLinkedTriple, IsReesMatrixSemigroupElement],
652
+ function(C, x)
653
+ local S, mat, images, i, a, u, j, v, nElm, b;
654
+ S := Range(C);
655
+ mat := Matrix(S);
656
+ if not x in S then
657
+ ErrorNoReturn("the 2nd argument (an element of a Rees matrix ",
658
+ "semigroup) does not belong to the range of the ",
659
+ "1st argument (a congruence)");
660
+ fi;
661
+ # List of all elements congruent to x under C
662
+ images := [];
663
+ # Read the element as (i,a,u)
664
+ i := x[1];
665
+ a := x[2];
666
+ u := x[3];
667
+ # Construct congruent elements as (j,b,v)
668
+ for j in C!.colBlocks[C!.colLookup[i]] do
669
+ for v in C!.rowBlocks[C!.rowLookup[u]] do
670
+ for nElm in C!.n do
671
+ # Might be better to use congruence classes after all
672
+ b := mat[1][j] ^ -1 * nElm * mat[1][i] * a * mat[u][1]
673
+ * mat[v][1] ^ -1;
674
+ Add(images, RMSElement(S, j, b, v));
675
+ od;
676
+ od;
677
+ od;
678
+ return images;
679
+ end);
680
+
681
+ InstallMethod(ImagesElm,
682
+ "for Rees 0-matrix semigroup congruence by linked triple and element",
683
+ [IsRZMSCongruenceByLinkedTriple, IsReesZeroMatrixSemigroupElement],
684
+ function(C, x)
685
+ local S, mat, images, i, a, u, row, col, j, b, v, nElm;
686
+ S := Range(C);
687
+ mat := Matrix(S);
688
+ if not x in S then
689
+ ErrorNoReturn("the 2nd argument (an element of a Rees 0-matrix ",
690
+ "semigroup) does not belong to the range of the ",
691
+ "1st argument (a congruence)");
692
+ fi;
693
+ # Special case for 0
694
+ if x = MultiplicativeZero(S) then
695
+ return [x];
696
+ fi;
697
+ # List of all elements congruent to x under C
698
+ images := [];
699
+ # Read the element as (i,a,u)
700
+ i := x[1];
701
+ a := x[2];
702
+ u := x[3];
703
+ # Find a non-zero row for this class of columns
704
+ for row in [1 .. Size(mat)] do
705
+ if mat[row][i] <> 0 then
706
+ break;
707
+ fi;
708
+ od;
709
+ # Find a non-zero column for this class of rows
710
+ for col in [1 .. Size(mat[1])] do
711
+ if mat[u][col] <> 0 then
712
+ break;
713
+ fi;
714
+ od;
715
+
716
+ # Construct congruent elements as (j,b,v)
717
+ for j in C!.colBlocks[C!.colLookup[i]] do
718
+ for v in C!.rowBlocks[C!.rowLookup[u]] do
719
+ for nElm in C!.n do
720
+ # Might be better to use congruence classes after all
721
+ b := mat[row][j] ^ -1
722
+ * nElm
723
+ * mat[row][i]
724
+ * a
725
+ * mat[u][col]
726
+ * mat[v][col] ^ -1;
727
+ Add(images, RMSElement(S, j, b, v));
728
+ od;
729
+ od;
730
+ od;
731
+ return images;
732
+ end);
733
+
734
+ InstallMethod(CongruenceTestMembershipNC,
735
+ "for RMS congruence by linked triple and two RMS elements",
736
+ [IsRMSCongruenceByLinkedTriple,
737
+ IsReesMatrixSemigroupElement, IsReesMatrixSemigroupElement],
738
+ function(C, lhop, rhop)
739
+ local i, a, u, j, b, v, mat, gpElm;
740
+ # Read the elements as (i,a,u) and (j,b,v)
741
+ i := lhop[1];
742
+ a := lhop[2];
743
+ u := lhop[3];
744
+ j := rhop[1];
745
+ b := rhop[2];
746
+ v := rhop[3];
747
+
748
+ # First, the columns and rows must be related
749
+ if C!.colLookup[i] <> C!.colLookup[j] or
750
+ C!.rowLookup[u] <> C!.rowLookup[v] then
751
+ return false;
752
+ fi;
753
+
754
+ # Finally, check Lemma 3.5.6(2) in Howie, with row 1 and column 1
755
+ mat := Matrix(Range(C));
756
+ gpElm := mat[1][i] * a * mat[u][1] * Inverse(mat[1][j] * b * mat[v][1]);
757
+ return gpElm in C!.n;
758
+ end);
759
+
760
+ InstallMethod(CongruenceTestMembershipNC,
761
+ "for RZMS congruence by linked triple and two RZMS elements",
762
+ [IsRZMSCongruenceByLinkedTriple,
763
+ IsReesZeroMatrixSemigroupElement, IsReesZeroMatrixSemigroupElement],
764
+ function(C, lhop, rhop)
765
+ local S, i, a, u, j, b, v, mat, rows, cols, col, row, gpElm;
766
+ S := Range(C);
767
+
768
+ # Handling the case when one or more of the pair are zero
769
+ if lhop = rhop then
770
+ return true;
771
+ elif lhop = MultiplicativeZero(S) or rhop = MultiplicativeZero(S) then
772
+ return false;
773
+ fi;
774
+
775
+ # Read the elements as (i,a,u) and (j,b,v)
776
+ i := lhop[1];
777
+ a := lhop[2];
778
+ u := lhop[3];
779
+ j := rhop[1];
780
+ b := rhop[2];
781
+ v := rhop[3];
782
+
783
+ # First, the columns and rows must be related
784
+ if C!.colLookup[i] <> C!.colLookup[j] or
785
+ C!.rowLookup[u] <> C!.rowLookup[v] then
786
+ return false;
787
+ fi;
788
+
789
+ # Finally, check Lemma 3.5.6(2) in Howie
790
+ mat := Matrix(S);
791
+ rows := mat;
792
+ cols := TransposedMat(mat);
793
+ # Pick a valid column and row
794
+ col := PositionProperty(rows[u], x -> x <> 0);
795
+ row := PositionProperty(cols[i], x -> x <> 0);
796
+ gpElm := mat[row][i] * a * mat[u][col] *
797
+ Inverse(mat[row][j] * b * mat[v][col]);
798
+ return gpElm in C!.n;
799
+ end);
800
+
801
+ ########################################################################
802
+ # 6. Congruences: non-mandatory methods for
803
+ # CanComputeEquivalenceRelationPartition, where we have a superior method
804
+ # for this particular representation.
805
+ ########################################################################
806
+
807
+ # Comparison operators
808
+
809
+ InstallMethod(\=,
810
+ "for Rees (0-)matrix semigroup congruences by linked triple",
811
+ [IsRMSOrRZMSCongruenceByLinkedTriple, IsRMSOrRZMSCongruenceByLinkedTriple],
812
+ function(lhop, rhop)
813
+ return(Range(lhop) = Range(rhop) and
814
+ lhop!.n = rhop!.n and
815
+ lhop!.colBlocks = rhop!.colBlocks and
816
+ lhop!.rowBlocks = rhop!.rowBlocks);
817
+ end);
818
+
819
+ InstallMethod(IsSubrelation,
820
+ "for Rees (0-)matrix semigroup congruences by linked triple",
821
+ [IsRMSOrRZMSCongruenceByLinkedTriple, IsRMSOrRZMSCongruenceByLinkedTriple],
822
+ function(lhop, rhop)
823
+ # Tests whether rhop is a subcongruence of lhop
824
+ if Range(lhop) <> Range(rhop) then
825
+ Error("the 1st and 2nd arguments are congruences over different",
826
+ " semigroups");
827
+ fi;
828
+ return IsSubgroup(lhop!.n, rhop!.n)
829
+ and ForAll(rhop!.colBlocks,
830
+ b2 -> ForAny(lhop!.colBlocks, b1 -> IsSubset(b1, b2)))
831
+ and ForAll(rhop!.rowBlocks,
832
+ b2 -> ForAny(lhop!.rowBlocks, b1 -> IsSubset(b1, b2)));
833
+ end);
834
+
835
+ # EquivalenceClasses
836
+
837
+ InstallMethod(EquivalenceClasses,
838
+ "for Rees matrix semigroup congruence by linked triple",
839
+ [IsRMSCongruenceByLinkedTriple],
840
+ function(C)
841
+ local list, S, g, n, colBlocks, rowBlocks, colClass, rowClass, rep, x;
842
+ list := [];
843
+ S := Range(C);
844
+ g := UnderlyingSemigroup(S);
845
+ n := C!.n;
846
+ colBlocks := C!.colBlocks;
847
+ rowBlocks := C!.rowBlocks;
848
+ for colClass in [1 .. Size(colBlocks)] do
849
+ for rowClass in [1 .. Size(rowBlocks)] do
850
+ for rep in List(RightCosets(g, n), Representative) do
851
+ x := RMSElement(S,
852
+ colBlocks[colClass][1],
853
+ rep,
854
+ rowBlocks[rowClass][1]);
855
+ Add(list, EquivalenceClassOfElement(C, x));
856
+ od;
857
+ od;
858
+ od;
859
+ return list;
860
+ end);
861
+
862
+ InstallMethod(EquivalenceClasses,
863
+ "for Rees 0-matrix semigroup congruence by linked triple",
864
+ [IsRZMSCongruenceByLinkedTriple],
865
+ function(C)
866
+ local list, S, g, n, colBlocks, rowBlocks, colClass, rowClass, rep, x;
867
+ list := [];
868
+ S := Range(C);
869
+ g := UnderlyingSemigroup(S);
870
+ n := C!.n;
871
+ colBlocks := C!.colBlocks;
872
+ rowBlocks := C!.rowBlocks;
873
+ for colClass in [1 .. Size(colBlocks)] do
874
+ for rowClass in [1 .. Size(rowBlocks)] do
875
+ for rep in List(RightCosets(g, n), Representative) do
876
+ x := RMSElement(S,
877
+ colBlocks[colClass][1],
878
+ rep,
879
+ rowBlocks[rowClass][1]);
880
+ Add(list, EquivalenceClassOfElement(C, x));
881
+ od;
882
+ od;
883
+ od;
884
+ # Add the zero class
885
+ Add(list, EquivalenceClassOfElement(C, MultiplicativeZero(S)));
886
+ return list;
887
+ end);
888
+
889
+ InstallMethod(NrEquivalenceClasses,
890
+ "for Rees matrix semigroup congruence by linked triple",
891
+ [IsRMSCongruenceByLinkedTriple],
892
+ function(C)
893
+ local S, g;
894
+ S := Range(C);
895
+ g := UnderlyingSemigroup(S);
896
+ return(Index(g, C!.n) # Number of cosets of n
897
+ * Size(C!.colBlocks) # Number of column blocks
898
+ * Size(C!.rowBlocks)); # Number of row blocks
899
+ end);
900
+
901
+ InstallMethod(NrEquivalenceClasses,
902
+ "for Rees 0-matrix semigroup congruence by linked triple",
903
+ [IsRZMSCongruenceByLinkedTriple],
904
+ function(C)
905
+ local S, g;
906
+ S := Range(C);
907
+ g := UnderlyingSemigroup(S);
908
+ return(Index(g, C!.n) # Number of cosets of n
909
+ * Size(C!.colBlocks) # Number of column blocks
910
+ * Size(C!.rowBlocks) # Number of row blocks
911
+ + 1); # Class containing zero
912
+ end);
913
+
914
+ # Algebraic operators
915
+
916
+ InstallMethod(JoinSemigroupCongruences,
917
+ "for two Rees matrix semigroup congruences by linked triple",
918
+ [IsRMSCongruenceByLinkedTriple, IsRMSCongruenceByLinkedTriple],
919
+ function(lhop, rhop)
920
+ local gens, n, colBlocks, rowBlocks, block, b1, j, pos;
921
+ if Range(lhop) <> Range(rhop) then
922
+ ErrorNoReturn("cannot form the join of congruences over different",
923
+ " semigroups");
924
+ fi;
925
+ # n is the product of the normal subgroups
926
+ gens := Concatenation(GeneratorsOfGroup(lhop!.n), GeneratorsOfGroup(rhop!.n));
927
+ n := Subgroup(UnderlyingSemigroup(Range(lhop)), gens);
928
+ # Calculate the join of the column and row relations
929
+ colBlocks := List(lhop!.colBlocks, ShallowCopy);
930
+ rowBlocks := List(lhop!.rowBlocks, ShallowCopy);
931
+ for block in rhop!.colBlocks do
932
+ b1 := PositionProperty(colBlocks, cb -> block[1] in cb);
933
+ for j in [2 .. Size(block)] do
934
+ if not block[j] in colBlocks[b1] then
935
+ # Combine the classes
936
+ pos := PositionProperty(colBlocks, cb -> block[j] in cb);
937
+ Append(colBlocks[b1], colBlocks[pos]);
938
+ Unbind(colBlocks[pos]);
939
+ fi;
940
+ od;
941
+ colBlocks := Compacted(colBlocks);
942
+ od;
943
+ for block in rhop!.rowBlocks do
944
+ b1 := PositionProperty(rowBlocks, rb -> block[1] in rb);
945
+ for j in [2 .. Size(block)] do
946
+ if not block[j] in rowBlocks[b1] then
947
+ # Combine the classes
948
+ pos := PositionProperty(rowBlocks, rb -> block[j] in rb);
949
+ Append(rowBlocks[b1], rowBlocks[pos]);
950
+ Unbind(rowBlocks[pos]);
951
+ fi;
952
+ od;
953
+ rowBlocks := Compacted(rowBlocks);
954
+ od;
955
+ colBlocks := SortedList(List(colBlocks, SortedList));
956
+ rowBlocks := SortedList(List(rowBlocks, SortedList));
957
+ # Make the congruence and return it
958
+ return RMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
959
+ end);
960
+
961
+ InstallMethod(JoinSemigroupCongruences,
962
+ "for two Rees 0-matrix semigroup congruences by linked triple",
963
+ [IsRZMSCongruenceByLinkedTriple, IsRZMSCongruenceByLinkedTriple],
964
+ function(lhop, rhop)
965
+ local gens, n, colBlocks, rowBlocks, block, b1, j, pos;
966
+ if Range(lhop) <> Range(rhop) then
967
+ ErrorNoReturn("cannot form the join of congruences over different",
968
+ " semigroups");
969
+ fi;
970
+ # n is the product of the normal subgroups
971
+ gens := Concatenation(GeneratorsOfGroup(lhop!.n), GeneratorsOfGroup(rhop!.n));
972
+ n := Subgroup(UnderlyingSemigroup(Range(lhop)), gens);
973
+ # Calculate the join of the column and row relations
974
+ colBlocks := List(lhop!.colBlocks, ShallowCopy);
975
+ rowBlocks := List(lhop!.rowBlocks, ShallowCopy);
976
+ for block in rhop!.colBlocks do
977
+ b1 := PositionProperty(colBlocks, cb -> block[1] in cb);
978
+ for j in [2 .. Size(block)] do
979
+ if not block[j] in colBlocks[b1] then
980
+ # Combine the classes
981
+ pos := PositionProperty(colBlocks, cb -> block[j] in cb);
982
+ Append(colBlocks[b1], colBlocks[pos]);
983
+ Unbind(colBlocks[pos]);
984
+ fi;
985
+ od;
986
+ colBlocks := Compacted(colBlocks);
987
+ od;
988
+ for block in rhop!.rowBlocks do
989
+ b1 := PositionProperty(rowBlocks, rb -> block[1] in rb);
990
+ for j in [2 .. Size(block)] do
991
+ if not block[j] in rowBlocks[b1] then
992
+ # Combine the classes
993
+ pos := PositionProperty(rowBlocks, rb -> block[j] in rb);
994
+ Append(rowBlocks[b1], rowBlocks[pos]);
995
+ Unbind(rowBlocks[pos]);
996
+ fi;
997
+ od;
998
+ rowBlocks := Compacted(rowBlocks);
999
+ od;
1000
+ colBlocks := SortedList(List(colBlocks, SortedList));
1001
+ rowBlocks := SortedList(List(rowBlocks, SortedList));
1002
+ # Make the congruence and return it
1003
+ return RZMSCongruenceByLinkedTriple(Range(lhop), n, colBlocks, rowBlocks);
1004
+ end);
1005
+
1006
+ InstallMethod(MeetSemigroupCongruences,
1007
+ "for two Rees matrix semigroup congruences by linked triple",
1008
+ [IsRMSCongruenceByLinkedTriple, IsRMSCongruenceByLinkedTriple],
1009
+ function(lhop, rhop)
1010
+ local n, colBlocks, cols, rowBlocks, rows, i, block, j, u, v;
1011
+ if Range(lhop) <> Range(rhop) then
1012
+ ErrorNoReturn("cannot form the meet of congruences over different",
1013
+ " semigroups");
1014
+ fi;
1015
+ # n is the intersection of the two normal subgroups
1016
+ n := Intersection(lhop!.n, rhop!.n);
1017
+ # Calculate the intersection of the column and row relations
1018
+ colBlocks := [];
1019
+ cols := [1 .. Size(lhop!.colLookup)];
1020
+ rowBlocks := [];
1021
+ rows := [1 .. Size(lhop!.rowLookup)];
1022
+ for i in [1 .. Size(cols)] do
1023
+ if cols[i] = 0 then
1024
+ continue;
1025
+ fi;
1026
+ block := Intersection(lhop!.colBlocks[lhop!.colLookup[i]],
1027
+ rhop!.colBlocks[rhop!.colLookup[i]]);
1028
+ for j in block do
1029
+ cols[j] := 0;
1030
+ od;
1031
+ Add(colBlocks, block);
1032
+ od;
1033
+ for u in [1 .. Size(rows)] do
1034
+ if rows[u] = 0 then
1035
+ continue;
1036
+ fi;
1037
+ block := Intersection(lhop!.rowBlocks[lhop!.rowLookup[u]],
1038
+ rhop!.rowBlocks[rhop!.rowLookup[u]]);
1039
+ for v in block do
1040
+ rows[v] := 0;
1041
+ od;
1042
+ Add(rowBlocks, block);
1043
+ od;
1044
+ # Make the congruence and return it
1045
+ return RMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
1046
+ end);
1047
+
1048
+ InstallMethod(MeetSemigroupCongruences,
1049
+ "for two Rees 0-matrix semigroup congruences by linked triple",
1050
+ [IsRZMSCongruenceByLinkedTriple, IsRZMSCongruenceByLinkedTriple],
1051
+ function(lhop, rhop)
1052
+ local n, colBlocks, cols, rowBlocks, rows, i, block, j, u, v;
1053
+ if Range(lhop) <> Range(rhop) then
1054
+ ErrorNoReturn("cannot form the meet of congruences over different",
1055
+ " semigroups");
1056
+ fi;
1057
+ # n is the intersection of the two normal subgroups
1058
+ n := Intersection(lhop!.n, rhop!.n);
1059
+ # Calculate the intersection of the column and row relations
1060
+ colBlocks := [];
1061
+ cols := [1 .. Size(lhop!.colLookup)];
1062
+ rowBlocks := [];
1063
+ rows := [1 .. Size(lhop!.rowLookup)];
1064
+ for i in [1 .. Size(cols)] do
1065
+ if cols[i] = 0 then
1066
+ continue;
1067
+ fi;
1068
+ block := Intersection(lhop!.colBlocks[lhop!.colLookup[i]],
1069
+ rhop!.colBlocks[rhop!.colLookup[i]]);
1070
+ for j in block do
1071
+ cols[j] := 0;
1072
+ od;
1073
+ Add(colBlocks, block);
1074
+ od;
1075
+ for u in [1 .. Size(rows)] do
1076
+ if rows[u] = 0 then
1077
+ continue;
1078
+ fi;
1079
+ block := Intersection(lhop!.rowBlocks[lhop!.rowLookup[u]],
1080
+ rhop!.rowBlocks[rhop!.rowLookup[u]]);
1081
+ for v in block do
1082
+ rows[v] := 0;
1083
+ od;
1084
+ Add(rowBlocks, block);
1085
+ od;
1086
+ # Make the congruence and return it
1087
+ return RZMSCongruenceByLinkedTripleNC(Range(lhop), n, colBlocks, rowBlocks);
1088
+ end);
1089
+
1090
+ ###############################################################################
1091
+ # 8. Equivalence classes: mandatory methods for
1092
+ # CanComputeEquivalenceRelationPartition
1093
+ ###############################################################################
1094
+
1095
+ InstallMethod(RMSCongruenceClassByLinkedTriple,
1096
+ "for semigroup congruence by linked triple, a coset and two positive integers",
1097
+ [IsRMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
1098
+ function(C, nCoset, colClass, rowClass)
1099
+ local g;
1100
+ g := UnderlyingSemigroup(Range(C));
1101
+ if ActingDomain(nCoset) <> C!.n or not IsSubset(g, nCoset) then
1102
+ ErrorNoReturn("the 2nd argument (a right coset) is not a coset of the",
1103
+ " normal subgroup of defining the 1st argument (a ",
1104
+ "congruence)");
1105
+ elif not colClass in [1 .. Size(C!.colBlocks)] then
1106
+ ErrorNoReturn("the 3rd argument (a pos. int.) is out of range");
1107
+ elif not rowClass in [1 .. Size(C!.rowBlocks)] then
1108
+ ErrorNoReturn("the 4th argument (a pos. int.) is out of range");
1109
+ fi;
1110
+ return RMSCongruenceClassByLinkedTripleNC(C, nCoset, colClass, rowClass);
1111
+ end);
1112
+
1113
+ InstallMethod(RZMSCongruenceClassByLinkedTriple,
1114
+ "for semigroup congruence by linked triple, a coset and two positive integers",
1115
+ [IsRZMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
1116
+ function(C, nCoset, colClass, rowClass)
1117
+ local g;
1118
+ g := UnderlyingSemigroup(Range(C));
1119
+ if ActingDomain(nCoset) <> C!.n or not IsSubset(g, nCoset) then
1120
+ ErrorNoReturn("the 2nd argument (a right coset) is not a coset of the",
1121
+ " normal subgroup of defining the 1st argument (a ",
1122
+ "congruence)");
1123
+ elif not colClass in [1 .. Size(C!.colBlocks)] then
1124
+ ErrorNoReturn("the 3rd argument (a pos. int.) is out of range");
1125
+ elif not rowClass in [1 .. Size(C!.rowBlocks)] then
1126
+ ErrorNoReturn("the 4th argument (a pos. int.) is out of range");
1127
+ fi;
1128
+ return RZMSCongruenceClassByLinkedTripleNC(C, nCoset, colClass, rowClass);
1129
+ end);
1130
+
1131
+ InstallMethod(RMSCongruenceClassByLinkedTripleNC,
1132
+ "for semigroup congruence by linked triple, a coset and two positive integers",
1133
+ [IsRMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
1134
+ function(C, nCoset, colClass, rowClass)
1135
+ local fam, class;
1136
+ fam := FamilyObj(Range(C));
1137
+ class := Objectify(NewType(fam, IsRMSCongruenceClassByLinkedTriple),
1138
+ rec(nCoset := nCoset,
1139
+ colClass := colClass,
1140
+ rowClass := rowClass));
1141
+ SetParentAttr(class, Range(C));
1142
+ SetEquivalenceClassRelation(class, C);
1143
+ return class;
1144
+ end);
1145
+
1146
+ InstallMethod(RZMSCongruenceClassByLinkedTripleNC,
1147
+ "for semigroup congruence by linked triple, a coset and two positive integers",
1148
+ [IsRZMSCongruenceByLinkedTriple, IsRightCoset, IsPosInt, IsPosInt],
1149
+ function(C, nCoset, colClass, rowClass)
1150
+ local fam, class;
1151
+ fam := FamilyObj(Range(C));
1152
+ class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
1153
+ rec(nCoset := nCoset,
1154
+ colClass := colClass,
1155
+ rowClass := rowClass));
1156
+ SetParentAttr(class, Range(C));
1157
+ SetEquivalenceClassRelation(class, C);
1158
+ return class;
1159
+ end);
1160
+
1161
+ ###############################################################################
1162
+ # 7. Equivalence classes - mandatory methods for
1163
+ # CanComputeEquivalenceRelationPartition
1164
+ ###############################################################################
1165
+
1166
+ InstallMethod(EquivalenceClassOfElementNC,
1167
+ "for Rees matrix semigroup congruence by linked triple and element",
1168
+ [IsRMSCongruenceByLinkedTriple, IsReesMatrixSemigroupElement],
1169
+ function(C, x)
1170
+ local fam, nCoset, colClass, rowClass, class;
1171
+ fam := CollectionsFamily(FamilyObj(x));
1172
+ nCoset := RightCoset(C!.n, LinkedElement(x));
1173
+ colClass := C!.colLookup[x[1]];
1174
+ rowClass := C!.rowLookup[x[3]];
1175
+ class := Objectify(NewType(fam, IsRMSCongruenceClassByLinkedTriple),
1176
+ rec(nCoset := nCoset,
1177
+ colClass := colClass,
1178
+ rowClass := rowClass));
1179
+ SetParentAttr(class, Range(C));
1180
+ SetEquivalenceClassRelation(class, C);
1181
+ SetRepresentative(class, x);
1182
+ return class;
1183
+ end);
1184
+
1185
+ InstallMethod(EquivalenceClassOfElementNC,
1186
+ "for Rees 0-matrix semigroup congruence by linked triple and element",
1187
+ [IsRZMSCongruenceByLinkedTriple, IsReesZeroMatrixSemigroupElement],
1188
+ function(C, x)
1189
+ local fam, class, nCoset, colClass, rowClass;
1190
+ fam := CollectionsFamily(FamilyObj(x));
1191
+ if x = MultiplicativeZero(Range(C)) then
1192
+ class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
1193
+ rec(nCoset := 0));
1194
+ else
1195
+ nCoset := RightCoset(C!.n, LinkedElement(x));
1196
+ colClass := C!.colLookup[x[1]];
1197
+ rowClass := C!.rowLookup[x[3]];
1198
+ class := Objectify(NewType(fam, IsRZMSCongruenceClassByLinkedTriple),
1199
+ rec(nCoset := nCoset,
1200
+ colClass := colClass,
1201
+ rowClass := rowClass));
1202
+ fi;
1203
+ SetParentAttr(class, Range(C));
1204
+ SetEquivalenceClassRelation(class, C);
1205
+ SetRepresentative(class, x);
1206
+ return class;
1207
+ end);
1208
+
1209
+ ###############################################################################
1210
+ # 7. Equivalence classes - superior representation specific methods
1211
+ ###############################################################################
1212
+
1213
+ InstallMethod(\in,
1214
+ "for Rees matrix semigroup element and a congruence class by linked triple",
1215
+ [IsReesMatrixSemigroupElement, IsRMSCongruenceClassByLinkedTriple],
1216
+ function(x, class)
1217
+ local S, C;
1218
+ C := EquivalenceClassRelation(class);
1219
+ S := Range(C);
1220
+ return(x in S and
1221
+ C!.colLookup[x[1]] = class!.colClass and
1222
+ C!.rowLookup[x[3]] = class!.rowClass and
1223
+ LinkedElement(x) in class!.nCoset);
1224
+ end);
1225
+
1226
+ InstallMethod(\in,
1227
+ "for Rees 0-matrix semigroup element and a congruence class by linked triple",
1228
+ [IsReesZeroMatrixSemigroupElement, IsRZMSCongruenceClassByLinkedTriple],
1229
+ function(x, class)
1230
+ local S, C;
1231
+ C := EquivalenceClassRelation(class);
1232
+ S := Range(C);
1233
+ # Special case for 0 and {0}
1234
+ if class!.nCoset = 0 then
1235
+ return x = MultiplicativeZero(S);
1236
+ elif IsMultiplicativeZero(S, x) then
1237
+ return false;
1238
+ fi;
1239
+ # Otherwise
1240
+ return x in S
1241
+ and C!.colLookup[x[1]] = class!.colClass
1242
+ and C!.rowLookup[x[3]] = class!.rowClass
1243
+ and LinkedElement(x) in class!.nCoset;
1244
+ end);
1245
+
1246
+ InstallMethod(Size,
1247
+ "for RMS congruence class by linked triple",
1248
+ [IsRMSCongruenceClassByLinkedTriple],
1249
+ function(class)
1250
+ local C;
1251
+ C := EquivalenceClassRelation(class);
1252
+ return(Size(C!.n) *
1253
+ Size(C!.colBlocks[class!.colClass]) *
1254
+ Size(C!.rowBlocks[class!.rowClass]));
1255
+ end);
1256
+
1257
+ InstallMethod(Size,
1258
+ "for RZMS congruence class by linked triple",
1259
+ [IsRZMSCongruenceClassByLinkedTriple],
1260
+ function(class)
1261
+ local C;
1262
+ # Special case for {0}
1263
+ if class!.nCoset = 0 then
1264
+ return 1;
1265
+ fi;
1266
+ # Otherwise
1267
+ C := EquivalenceClassRelation(class);
1268
+ return(Size(C!.n) *
1269
+ Size(C!.colBlocks[class!.colClass]) *
1270
+ Size(C!.rowBlocks[class!.rowClass]));
1271
+ end);
1272
+
1273
+ InstallMethod(\=,
1274
+ "for two congruence classes by linked triple",
1275
+ [IsRMSCongruenceClassByLinkedTriple, IsRMSCongruenceClassByLinkedTriple],
1276
+ function(lhop, rhop)
1277
+ return(lhop!.nCoset = rhop!.nCoset and
1278
+ lhop!.colClass = rhop!.colClass and
1279
+ lhop!.rowClass = rhop!.rowClass);
1280
+ end);
1281
+
1282
+ InstallMethod(\=,
1283
+ "for two congruence classes by linked triple",
1284
+ [IsRZMSCongruenceClassByLinkedTriple, IsRZMSCongruenceClassByLinkedTriple],
1285
+ function(lhop, rhop)
1286
+ # Special case for {0}
1287
+ if lhop!.nCoset = 0 and rhop!.nCoset = 0 then
1288
+ return true;
1289
+ fi;
1290
+ # Otherwise
1291
+ return(lhop!.nCoset = rhop!.nCoset and
1292
+ lhop!.colClass = rhop!.colClass and
1293
+ lhop!.rowClass = rhop!.rowClass);
1294
+ end);
1295
+
1296
+ InstallMethod(Representative,
1297
+ "for Rees matrix semigroup congruence class by linked triple",
1298
+ [IsRMSCongruenceClassByLinkedTriple],
1299
+ function(class)
1300
+ local C, S, i, u, mat, a;
1301
+ C := EquivalenceClassRelation(class);
1302
+ S := Range(C);
1303
+ # Pick the first row and column from the classes
1304
+ i := C!.colBlocks[class!.colClass][1];
1305
+ u := C!.rowBlocks[class!.rowClass][1];
1306
+ # Pick another row and column
1307
+ mat := Matrix(S);
1308
+ a := mat[1][i] ^ -1
1309
+ * CanonicalRightCosetElement(C!.n, Representative(class!.nCoset))
1310
+ * mat[u][1] ^ -1;
1311
+ return RMSElement(S, i, a, u);
1312
+ end);
1313
+
1314
+ InstallMethod(Representative,
1315
+ "for Rees 0-matrix semigroup congruence class by linked triple",
1316
+ [IsRZMSCongruenceClassByLinkedTriple],
1317
+ function(class)
1318
+ local C, S, mat, i, u, v, j, a;
1319
+ C := EquivalenceClassRelation(class);
1320
+ S := Range(C);
1321
+ # Seems to be impossible that a class does not know its Representative at
1322
+ # creation when nCoset is 0
1323
+ Assert(0, class!.nCoset <> 0);
1324
+ # Old code retained in case the assertion above is not correct!
1325
+ # if class!.nCoset = 0 then
1326
+ # return MultiplicativeZero(S);
1327
+ # fi;
1328
+
1329
+ # Pick the first row and column from the classes
1330
+ i := C!.colBlocks[class!.colClass][1];
1331
+ u := C!.rowBlocks[class!.rowClass][1];
1332
+ # Pick another row and column with appropriate non-zero entries
1333
+ mat := Matrix(S);
1334
+ for v in [1 .. Size(mat)] do
1335
+ if mat[v][i] <> 0 then
1336
+ break;
1337
+ fi;
1338
+ od;
1339
+ for j in [1 .. Size(mat[1])] do
1340
+ if mat[u][j] <> 0 then
1341
+ break;
1342
+ fi;
1343
+ od;
1344
+ a := mat[v][i] ^ -1
1345
+ * CanonicalRightCosetElement(C!.n, Representative(class!.nCoset))
1346
+ * mat[u][j] ^ -1;
1347
+ return RMSElement(S, i, a, u);
1348
+ end);
1349
+
1350
+ ###############################################################################
1351
+ # 9. Congruence lattice
1352
+ ###############################################################################
1353
+
1354
+ # Function to compute all subsets of a relation given by partitions
1355
+ SEMIGROUPS.Subpartitions := function(part)
1356
+ local l;
1357
+ # Replace each class with a list of all partitions of that class
1358
+ l := List(part, PartitionsSet);
1359
+ # Produce all the combinations of partitions of classes
1360
+ l := Cartesian(l);
1361
+ # Concatenate these lists to produce complete partitions of the set
1362
+ l := List(l, Concatenation);
1363
+ # Finally sort each of these into the canonical order of its new classes
1364
+ return List(l, SSortedList);
1365
+ end;
1366
+
1367
+ InstallMethod(CongruencesOfSemigroup,
1368
+ "for finite simple Rees matrix semigroup",
1369
+ [IsReesMatrixSemigroup and IsSimpleSemigroup and IsFinite],
1370
+ function(S)
1371
+ local subpartitions, congs, mat, g, colBlocksList,
1372
+ rowBlocksList, n, colBlocks, rowBlocks;
1373
+
1374
+ subpartitions := SEMIGROUPS.Subpartitions;
1375
+
1376
+ congs := [];
1377
+ mat := Matrix(S);
1378
+ g := UnderlyingSemigroup(S);
1379
+
1380
+ # No need to add the universal congruence
1381
+
1382
+ # Compute all column and row relations which are subsets of the max relations
1383
+ colBlocksList := subpartitions([[1 .. Size(mat[1])]]);
1384
+ rowBlocksList := subpartitions([[1 .. Size(mat)]]);
1385
+
1386
+ # Go through all triples and check
1387
+ for n in NormalSubgroups(g) do
1388
+ for colBlocks in colBlocksList do
1389
+ for rowBlocks in rowBlocksList do
1390
+ if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
1391
+ Add(congs,
1392
+ RMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks));
1393
+ fi;
1394
+ od;
1395
+ od;
1396
+ od;
1397
+
1398
+ return congs;
1399
+ end);
1400
+
1401
+ InstallMethod(CongruencesOfSemigroup,
1402
+ "for finite 0-simple Rees 0-matrix semigroup",
1403
+ [IsReesZeroMatrixSemigroup and IsZeroSimpleSemigroup and IsFinite],
1404
+ function(S)
1405
+ local congs, mat, g, AddRelation, maxColBlocks, maxRowBlocks,
1406
+ i, j, u, v, n, colBlocks, rowBlocks, colBlocksList, rowBlocksList,
1407
+ subpartitions;
1408
+
1409
+ subpartitions := SEMIGROUPS.Subpartitions;
1410
+ congs := [];
1411
+ mat := Matrix(S);
1412
+ g := UnderlyingSemigroup(S);
1413
+
1414
+ # This function combines two congruence classes
1415
+ AddRelation := function(R, x, y)
1416
+ local xClass, yClass;
1417
+ xClass := PositionProperty(R, class -> x in class);
1418
+ yClass := PositionProperty(R, class -> y in class);
1419
+ if xClass <> yClass then
1420
+ Append(R[xClass], R[yClass]);
1421
+ Remove(R, yClass);
1422
+ fi;
1423
+ end;
1424
+
1425
+ # Construct maximum column relation
1426
+ maxColBlocks := List([1 .. Size(mat[1])], i -> [i]);
1427
+ for i in [1 .. Size(mat[1])] do
1428
+ for j in [i + 1 .. Size(mat[1])] do
1429
+ if ForAll([1 .. Size(mat)],
1430
+ u -> ((mat[u][i] = 0) = (mat[u][j] = 0))) then
1431
+ AddRelation(maxColBlocks, i, j);
1432
+ fi;
1433
+ od;
1434
+ od;
1435
+
1436
+ # Construct maximum row relation
1437
+ maxRowBlocks := List([1 .. Size(mat)], u -> [u]);
1438
+ for u in [1 .. Size(mat)] do
1439
+ for v in [u + 1 .. Size(mat)] do
1440
+ if ForAll([1 .. Size(mat[1])],
1441
+ i -> ((mat[u][i] = 0) = (mat[v][i] = 0))) then
1442
+ AddRelation(maxRowBlocks, u, v);
1443
+ fi;
1444
+ od;
1445
+ od;
1446
+
1447
+ # Add the universal congruence
1448
+ Add(congs, UniversalSemigroupCongruence(S));
1449
+
1450
+ # Compute all column and row relations which are subsets of the max relations
1451
+ colBlocksList := subpartitions(maxColBlocks);
1452
+ rowBlocksList := subpartitions(maxRowBlocks);
1453
+
1454
+ # Go through all triples and check
1455
+ for n in NormalSubgroups(g) do
1456
+ for colBlocks in colBlocksList do
1457
+ for rowBlocks in rowBlocksList do
1458
+ if IsLinkedTriple(S, n, colBlocks, rowBlocks) then
1459
+ Add(congs,
1460
+ RZMSCongruenceByLinkedTripleNC(S, n, colBlocks, rowBlocks));
1461
+ fi;
1462
+ od;
1463
+ od;
1464
+ od;
1465
+
1466
+ return congs;
1467
+ end);