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,1383 @@
1
+ ############################################################################
2
+ ##
3
+ ## attributes/isorms.gi
4
+ ## Copyright (C) 2014-2022 James D. Mitchell
5
+ ##
6
+ ## Licensing information can be found in the README file of this package.
7
+ ##
8
+ #############################################################################
9
+ ##
10
+
11
+ #############################################################################
12
+ ## This file contains functions for isomorphisms and automorphisms of Rees
13
+ ## matrix and 0-matrix semigroup. The algorithm used in this file is described
14
+ ## in:
15
+ ##
16
+ ## J. Araújo, P. von Bünau, J. D. Mitchell, and M. Neunhoeffer,
17
+ ## ‘Computing automorphisms of semigroups’,
18
+ ## J. Symbolic Comput. 45 (2010) 373-392;
19
+ ## https://dx.doi.org/10.1016/j.jsc.2009.10.001.
20
+ ##
21
+ ## This file is organized as follows:
22
+ ##
23
+ ## 1. Internal functions for the avoidance of duplicate code.
24
+ ##
25
+ ## 2. Automorphism group functions (the main functions in this file)
26
+ ##
27
+ ## 3. Methods for automorphism group of RMS and RZMS (ViewObj,
28
+ ## IdentityMapping etc)
29
+ ##
30
+ ## 4. Isomorphisms
31
+ ##
32
+ ## 5. RMS/RZMSIsoByTriple (equality, <, ImagesRepresentative)
33
+ ##
34
+ #############################################################################
35
+
36
+ #############################################################################
37
+ # 1. Internal functions
38
+ #############################################################################
39
+
40
+ # Find the stabiliser of the matrix of a Rees (0-)matrix semigroup under the
41
+ # action of the automorphism group of the R(Z)MSGraph via rearranging rows and
42
+ # columns
43
+
44
+ SEMIGROUPS.StabOfRMSMatrix := function(G, R)
45
+ local OnMatrix, H, m, n;
46
+
47
+ m := Length(Matrix(R)[1]);
48
+ n := Length(Matrix(R));
49
+
50
+ OnMatrix := function(mat, x)
51
+ local rows;
52
+ mat := StructuralCopy(mat);
53
+ rows := Permutation(x, [1 .. n], {i, p} -> (i + m) ^ p - m);
54
+
55
+ return List(Permuted(mat, rows), y -> Permuted(y, x));
56
+ end;
57
+ H := Stabilizer(G, Matrix(R), OnMatrix);
58
+ Info(InfoSemigroups, 2, "the size of stabilizer of the matrix is ", Size(H));
59
+ return H;
60
+ end;
61
+
62
+ # Find the pointwise stabiliser of the entries in the matrix of a Rees
63
+ # (0-)matrix semigroup under the action of the automorphism group of the
64
+ # underlying group.
65
+
66
+ SEMIGROUPS.StabOfRMSEntries := function(G, R)
67
+ local H, entries, i;
68
+ H := G;
69
+ entries := MatrixEntries(R);
70
+ i := PositionProperty(entries, x -> x <> 0 and x <> ());
71
+
72
+ while not IsTrivial(H) and i <= Length(entries) do
73
+ H := Stabilizer(H, entries[i], OnPoints);
74
+ i := i + 1;
75
+ od;
76
+
77
+ Info(InfoSemigroups,
78
+ 2,
79
+ "the size of the stabilizer of the matrix entries is ",
80
+ Size(H));
81
+ return H;
82
+ end;
83
+
84
+ # Theorem 3.4.1 in Howie's book, Fundamentals of Semigroup Theory. This
85
+ # function finds the values of the elements u_i and v_lambda of the underlying
86
+ # group of R2 for the choice of l, and g, by propagating the initial value x
87
+ # from u_1 to v_1, ..., v_n, and then from v_1 to u_2, ..., u_m. It then
88
+ # checks that the equation in Theorem 3.4.1 holds for the values of u and v
89
+ # defined.
90
+
91
+ SEMIGROUPS.RMSInducedFunction := function(R1, R2, l, g, x)
92
+ local mat1, mat2, m, n, out, i, j;
93
+
94
+ mat1 := Matrix(R1);
95
+ mat2 := Matrix(R2);
96
+ m := Length(mat1[1]);
97
+ n := Length(mat1);
98
+ out := EmptyPlist(m + n);
99
+ out[1] := x;
100
+
101
+ for i in [m + 1 .. m + n] do
102
+ # This is the inverse of v_lambda from Howie's book
103
+ out[i] := mat2[i ^ l - m][1 ^ l] * x * ((mat1[i - m][1] ^ g) ^ -1);
104
+ od;
105
+
106
+ for i in [2 .. m] do
107
+ out[i] := mat2[(m + 1) ^ l - m][i ^ l] ^ -1 * out[m + 1]
108
+ * (mat1[1][i] ^ g);
109
+ od;
110
+
111
+ for j in [m + 2 .. n + m] do
112
+ for i in [2 .. m] do
113
+ if mat1[j - m][i] ^ g
114
+ <> out[j] ^ -1 * mat2[j ^ l - m][i ^ l] * out[i] then
115
+ return fail;
116
+ fi;
117
+ od;
118
+ od;
119
+
120
+ return out;
121
+ end;
122
+
123
+ SEMIGROUPS.RZMSInducedFunction := function(R, l, g, x, component)
124
+ local mat, m, n, adj, rep, out, Q, q, v;
125
+
126
+ mat := Matrix(R);
127
+ m := Length(mat[1]);
128
+ n := Length(mat);
129
+ adj := OutNeighbours(RZMSDigraph(R));
130
+ rep := component[1];
131
+ out := EmptyPlist(m + n);
132
+ out[rep] := x;
133
+ Q := [rep];
134
+ q := 1;
135
+
136
+ while q <= Length(Q) do
137
+ rep := Q[q];
138
+ q := q + 1;
139
+ if rep <= m then
140
+ for v in adj[rep] do
141
+ if not IsBound(out[v]) then
142
+ Add(Q, v);
143
+ out[v] := mat[v ^ l - m][rep ^ l] * out[rep] / mat[v - m][rep] ^ g;
144
+ elif mat[v - m][rep] ^ g
145
+ <> (out[v] ^ -1) * mat[v ^ l - m][rep ^ l] * out[rep] then
146
+ return fail;
147
+ fi;
148
+ od;
149
+ else
150
+ for v in adj[rep] do
151
+ if not IsBound(out[v]) then
152
+ Add(Q, v);
153
+ out[v] := mat[rep ^ l - m][v ^ l] ^ -1 * out[rep] ^ -1
154
+ * (mat[rep - m][v] ^ g);
155
+ elif mat[rep - m][v] ^ g
156
+ <> out[rep] ^ -1 * mat[rep ^ l - m][v ^ l] * out[v] then
157
+ return fail;
158
+ fi;
159
+ od;
160
+ fi;
161
+ od;
162
+ return out;
163
+ end;
164
+
165
+ # TODO(later) the next function should be combined with the previous one.
166
+
167
+ SEMIGROUPS.RZMStoRZMSInducedFunction := function(rms1, rms2, l, g, groupelts)
168
+ local mat1, mat2, m, rmsgraph, components, reps, imagelist, edges,
169
+ bicomps, sub, perm, defined, orb, j, Last, involved, verts, v, new, i, k;
170
+
171
+ mat1 := Matrix(rms1);
172
+ mat2 := Matrix(rms2);
173
+ m := Length(mat1[1]);
174
+ rmsgraph := RZMSDigraph(rms1);
175
+ components := DigraphConnectedComponents(rmsgraph).comps;
176
+
177
+ if Length(groupelts) <> Length(components) then
178
+ ErrorNoReturn("the 5th argument (a list) must have length ",
179
+ Length(components), ", but found ", Length(groupelts));
180
+ fi;
181
+
182
+ reps := List(components, Minimum);
183
+ imagelist := [];
184
+ imagelist{reps} := groupelts;
185
+
186
+ for i in [1 .. Length(components)] do
187
+ if Length(components) = 1 then
188
+ edges := DigraphEdges(rmsgraph);
189
+ bicomps := DigraphBicomponents(rmsgraph);
190
+ else
191
+ sub := InducedSubdigraph(rmsgraph, components[i]);
192
+ perm := MappingPermListList(DigraphVertexLabels(sub),
193
+ DigraphVertices(sub));
194
+ edges := OnTuplesTuples(DigraphEdges(sub), perm ^ -1);
195
+ bicomps := OnTuplesTuples(DigraphBicomponents(sub), perm ^ -1);
196
+ fi;
197
+
198
+ defined := [];
199
+ orb := [reps[i]];
200
+ j := 0;
201
+
202
+ repeat
203
+ j := j + 1;
204
+ Last := orb[j];
205
+ involved := Filtered(edges, x -> x[1] = Last and not x in defined);
206
+ if not IsEmpty(involved) then
207
+
208
+ verts := List(involved, x -> x[2]);
209
+ Append(orb, Filtered(verts, x -> not x in orb));
210
+
211
+ for k in [1 .. Length(verts)] do
212
+ v := verts[k];
213
+
214
+ if Last in bicomps[1] then
215
+ new := mat2[v ^ l - m][Last ^ l]
216
+ * imagelist[Last] * (mat1[v - m][Last] ^ g) ^ -1;
217
+ else
218
+ new := (mat2[Last ^ l - m][v ^ l]) ^ -1
219
+ * imagelist[Last] * (mat1[Last - m][v] ^ g);
220
+ fi;
221
+
222
+ if not IsBound(imagelist[v]) then
223
+ imagelist[v] := new;
224
+ elif not imagelist[v] = new then
225
+ return fail;
226
+ fi;
227
+ defined := Union(defined, [involved[k], Reversed(involved[k])]);
228
+ od;
229
+ fi;
230
+ until defined = edges;
231
+ od;
232
+ return imagelist;
233
+ end;
234
+
235
+ #############################################################################
236
+ # 2. Automorphism group functions
237
+ #############################################################################
238
+
239
+ # don't hit F5 for local variables here, it crashes vim!!
240
+ InstallMethod(AutomorphismGroup, "for a Rees 0-matrix semigroup",
241
+ [IsReesZeroMatrixSubsemigroup],
242
+ function(R)
243
+ local G, m, n, aut_graph, components, t, aut_group, stab_aut_graph,
244
+ hom, stab_aut_group, i, V, A, gens1, gens2, U, T, tester,
245
+ g, x, map, cart, RZMSInducedFunction;
246
+
247
+ G := UnderlyingSemigroup(R);
248
+
249
+ if not (IsReesZeroMatrixSemigroup(R) and IsPermGroup(G)
250
+ and IsZeroSimpleSemigroup(R)) then
251
+ TryNextMethod(); # There is no such method at present
252
+ fi;
253
+
254
+ m := Length(Rows(R));
255
+ n := Length(Columns(R));
256
+
257
+ # automorphism group of the graph . . .
258
+
259
+ aut_graph := AutomorphismGroup(RZMSDigraph(R), [[1 .. m], [m + 1 .. n + m]]);
260
+
261
+ Info(InfoSemigroups, 2, "the graph has ", Size(aut_graph), " automorphisms");
262
+
263
+ # stabiliser of the matrix under rearranging rows and columns by elements
264
+ # of the automorphism group of the graph
265
+ if m * n < 1000 then
266
+ stab_aut_graph := SEMIGROUPS.StabOfRMSMatrix(aut_graph, R);
267
+ else
268
+ stab_aut_graph := Group(());
269
+ fi;
270
+
271
+ # automorphism group of the underlying group
272
+ aut_group := AutomorphismGroup(G);
273
+ Info(InfoSemigroups,
274
+ 2,
275
+ "the underlying group has ",
276
+ Size(aut_group),
277
+ " automorphisms");
278
+
279
+ # pointwise stabiliser of the entries in the matrix of R under the
280
+ # automorphism group of the group
281
+ stab_aut_group := SEMIGROUPS.StabOfRMSEntries(aut_group, R);
282
+
283
+ # The following mathematically unnecessary separation of cases is needed to
284
+ # support the AutPGrp package, whose method for `AutomorphismGroup` for the
285
+ # trivial group does not set `InnerAutomorphismsAutomorphismGroup` at
286
+ # creation, and no method is installed to calculate it.
287
+
288
+ # homomorphism from Aut(G) to a perm rep of Aut(G) / Inn(G)
289
+ if IsTrivial(G) then
290
+ hom := IsomorphismPermGroup(aut_group);
291
+ else
292
+ hom := NaturalHomomorphismByNormalSubgroupNC(aut_group,
293
+ InnerAutomorphismsAutomorphismGroup(aut_group));
294
+ hom := CompositionMapping(IsomorphismPermGroup(ImagesSource(hom)), hom);
295
+ fi;
296
+
297
+ # V is isomorphic to Aut(Gamma) x (Aut(G) / Inn(G))
298
+ # U is a subgroup of V contained in the subgroup we are looking for.
299
+ V := DirectProduct(aut_graph, Image(hom));
300
+
301
+ if IsTrivial(stab_aut_graph) and IsTrivial(stab_aut_group) then
302
+ U := Group(());
303
+ else
304
+ gens1 := GeneratorsOfGroup(stab_aut_graph);
305
+ gens2 := GeneratorsOfGroup(Image(hom, stab_aut_group));
306
+ U := Group(Concatenation(Images(Embedding(V, 1), gens1),
307
+ Images(Embedding(V, 2), gens2)));
308
+ fi;
309
+
310
+ components := DigraphConnectedComponents(RZMSDigraph(R)).comps;
311
+ t := Length(components);
312
+ Info(InfoSemigroups, 2, "the graph has ", t, " connected components");
313
+
314
+ T := RightTransversal(G, Centre(G));
315
+ A := [];
316
+
317
+ ##########################################################################
318
+ # test whether for <x> in <V> there is a <map> such that
319
+ # phi := [x ^ Projection(V, 1), x ^ Projection(V, 2) ^ hom ^ -1, map]
320
+ # is a RZMSIsoByTriple, and add <phi> to <A> if it is!
321
+ ##########################################################################
322
+
323
+ RZMSInducedFunction := SEMIGROUPS.RZMSInducedFunction;
324
+
325
+ tester := function(x)
326
+ local y, found, g, i, tmp, map;
327
+ y := PreImagesRepresentative(hom, x ^ Projection(V, 2));
328
+ x := x ^ Projection(V, 1);
329
+ tmp := [];
330
+ found := false;
331
+ for g in T do
332
+ map := RZMSInducedFunction(R, x, y, g, components[1]);
333
+ if map <> fail then
334
+ tmp := tmp + map;
335
+ found := true;
336
+ break;
337
+ fi;
338
+ od;
339
+ i := 1;
340
+ while found and i < t do
341
+ i := i + 1;
342
+ found := false;
343
+ for g in G do
344
+ map := RZMSInducedFunction(R, x, y, g, components[i]);
345
+ if map <> fail then
346
+ tmp := tmp + map;
347
+ found := true;
348
+ break;
349
+ fi;
350
+ od;
351
+ od;
352
+
353
+ if found then
354
+ AddSet(A, RZMSIsoByTripleNC(R, R, [x, y, tmp]));
355
+ fi;
356
+ return found;
357
+ end;
358
+
359
+ ##########################################################################
360
+
361
+ if U <> V then # some search required
362
+ Info(InfoSemigroups, 2, "backtracking in the direct product of size ",
363
+ Size(V), " . . . ");
364
+ # This appears to do nothing, but the subgroup is computed when we call
365
+ # Size, and the resulting isomorphisms-by-triple are stored in A by the
366
+ # function tester
367
+ U := BacktrackSearchStabilizerChainSubgroup(StabilizerChain(V),
368
+ tester,
369
+ ReturnTrue);
370
+ Info(InfoSemigroups, 2, "found subgroup of size ", Size(U));
371
+ else
372
+ # U = V
373
+ # This appears to do nothing, but the the resulting isomorphisms-by-triple
374
+ # are stored in A by the function tester
375
+ Perform(GeneratorsOfGroup(V), tester);
376
+ fi;
377
+
378
+ cart := [[]];
379
+ for g in T do
380
+ map := RZMSInducedFunction(R,
381
+ One(aut_graph),
382
+ One(aut_group),
383
+ g,
384
+ components[1]);
385
+ if map <> fail then
386
+ Add(cart[1], map);
387
+ fi;
388
+ od;
389
+
390
+ for i in [2 .. t] do
391
+ cart[i] := [];
392
+ for g in G do
393
+ map := RZMSInducedFunction(R,
394
+ One(aut_graph),
395
+ One(aut_group),
396
+ g,
397
+ components[i]);
398
+ if map <> fail then
399
+ Add(cart[i], map);
400
+ fi;
401
+ od;
402
+ od;
403
+
404
+ # put B together
405
+ for map in EnumeratorOfCartesianProduct(cart) do
406
+ x := RZMSIsoByTripleNC(R, R, [One(aut_graph), One(aut_group), Sum(map)]);
407
+ AddSet(A, x);
408
+ od;
409
+
410
+ A := Group(A);
411
+ SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
412
+ SetIsFinite(A, true);
413
+
414
+ return A;
415
+ end);
416
+
417
+ # don't hit F5 for local variables here, it crashes vim!!
418
+ InstallMethod(AutomorphismGroup, "for a Rees matrix semigroup",
419
+ [IsReesMatrixSemigroup and IsWholeFamily],
420
+ function(R)
421
+ local G, m, n, aut_graph, aut_group, stab_aut_graph,
422
+ hom, stab_aut_group, V, A, gens1, gens2, U, T, tester,
423
+ g, map, gens, RMSInducedFunction;
424
+
425
+ G := UnderlyingSemigroup(R);
426
+ if not (IsReesMatrixSemigroup(R) and IsPermGroup(G)
427
+ and IsSimpleSemigroup(R)) then
428
+ TryNextMethod(); # TODO(never) write such a method
429
+ fi;
430
+
431
+ m := Length(Rows(R));
432
+ n := Length(Columns(R));
433
+
434
+ # this is easy since the graph is complete bipartite
435
+
436
+ if n = 1 and m = 1 then
437
+ gens := GeneratorsOfGroup(AutomorphismGroup(G));
438
+ if IsEmpty(gens) then
439
+ gens := [IdentityMapping(G)];
440
+ fi;
441
+ A := Group(List(gens, x -> RMSIsoByTripleNC(R, R,
442
+ [(), x, [One(G), One(G)]])));
443
+ SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
444
+ SetIsFinite(A, true);
445
+ return A;
446
+ elif n = 2 and m = 1 then
447
+ aut_graph := Group((2, 3));
448
+ SetSize(aut_graph, 2);
449
+ elif n > 2 and m = 1 then
450
+ aut_graph := Group((2, 3),
451
+ PermList(Concatenation([1], [3 .. n + m], [2])));
452
+ SetSize(aut_graph, Factorial(n));
453
+ else
454
+ aut_graph := DirectProduct(SymmetricGroup(m), SymmetricGroup(n));
455
+ fi;
456
+
457
+ Info(InfoSemigroups, 2, "the graph has ", Size(aut_graph), " automorphisms");
458
+
459
+ # stabiliser of the matrix under rearranging rows and columns by elements
460
+ # of the automorphism group of the graph
461
+ if m * n < 1000 then
462
+ stab_aut_graph := SEMIGROUPS.StabOfRMSMatrix(aut_graph, R);
463
+ else
464
+ stab_aut_graph := Group(());
465
+ fi;
466
+
467
+ # automorphism group of the underlying group
468
+ aut_group := AutomorphismGroup(G);
469
+ Info(InfoSemigroups,
470
+ 2,
471
+ StringFormatted("there are {} group automorphisms", Size(aut_group)));
472
+
473
+ # pointwise stabiliser of the entries in the matrix of R under the
474
+ # automorphism group of the group
475
+ stab_aut_group := SEMIGROUPS.StabOfRMSEntries(aut_group, R);
476
+
477
+ # The following mathematically unnecessary separation of cases is needed to
478
+ # support the AutPGrp package, whose method for `AutomorphismGroup` for the
479
+ # trivial group does not set `InnerAutomorphismsAutomorphismGroup` at
480
+ # creation, and no method is installed to calculate it.
481
+
482
+ # homomorphism from Aut(G) to a perm rep of Aut(G) / Inn(G)
483
+ if IsTrivial(G) then
484
+ hom := IsomorphismPermGroup(aut_group);
485
+ else
486
+ hom := NaturalHomomorphismByNormalSubgroupNC(aut_group,
487
+ InnerAutomorphismsAutomorphismGroup(aut_group));
488
+ hom := CompositionMapping(IsomorphismPermGroup(ImagesSource(hom)), hom);
489
+ fi;
490
+
491
+ # V is isomorphic to Aut(Gamma) x (Aut(G) / Inn(G))
492
+ # U is a subgroup of V contained in the subgroup we are looking for.
493
+ V := DirectProduct(aut_graph, Image(hom));
494
+
495
+ if IsTrivial(stab_aut_graph) and IsTrivial(stab_aut_group) then
496
+ U := Group(());
497
+ else
498
+ gens1 := GeneratorsOfGroup(stab_aut_graph);
499
+ gens2 := GeneratorsOfGroup(Image(hom, stab_aut_group));
500
+ U := Group(Concatenation(Images(Embedding(V, 1), gens1),
501
+ Images(Embedding(V, 2), gens2)));
502
+ fi;
503
+
504
+ T := RightTransversal(G, Centre(G));
505
+ A := [];
506
+
507
+ ##########################################################################
508
+ # test whether for <x> in <V> there is a <map> such that
509
+ # phi := [x ^ Projection(V, 1), x ^ Projection(V, 2) ^ hom ^ -1, map]
510
+ # is a RMSIsoByTriple, and add <phi> to <A> if it is!
511
+ ##########################################################################
512
+
513
+ RMSInducedFunction := SEMIGROUPS.RMSInducedFunction;
514
+
515
+ tester := function(x)
516
+ local y, map, g;
517
+ y := PreImagesRepresentative(hom, x ^ Projection(V, 2));
518
+ x := x ^ Projection(V, 1);
519
+ for g in T do
520
+ map := RMSInducedFunction(R, R, x, y, g);
521
+ if map <> fail then
522
+ AddSet(A, RMSIsoByTripleNC(R, R, [x, y, map]));
523
+ return true;
524
+ fi;
525
+ od;
526
+ return false;
527
+ end;
528
+
529
+ ##########################################################################
530
+
531
+ if U <> V then
532
+ Info(InfoSemigroups, 2, "backtracking in the direct product of size ",
533
+ Size(V), " . . . ");
534
+ # See the comments in the AutomorphismGroup(Rees 0-matrix semigroup) method
535
+ U := BacktrackSearchStabilizerChainSubgroup(StabilizerChain(V),
536
+ tester,
537
+ ReturnTrue);
538
+ Info(InfoSemigroups, 2, "found subgroup of size ", Size(U));
539
+ else # U = V
540
+ # See the comments in the AutomorphismGroup(Rees 0-matrix semigroup) method
541
+ Perform(GeneratorsOfGroup(V), tester);
542
+ fi;
543
+
544
+ for g in T do
545
+ map := RMSInducedFunction(R,
546
+ R,
547
+ One(aut_graph),
548
+ One(aut_group),
549
+ g);
550
+ if map <> fail then
551
+ AddSet(A, RMSIsoByTripleNC(R, R, [One(aut_graph), One(aut_group), map]));
552
+ fi;
553
+ od;
554
+
555
+ A := Group(A);
556
+ SetIsAutomorphismGroupOfRMSOrRZMS(A, true);
557
+ SetIsFinite(A, true);
558
+
559
+ return A;
560
+ end);
561
+
562
+ #############################################################################
563
+ # 3. Methods for automorphism groups
564
+ #############################################################################
565
+
566
+ InstallMethod(ViewObj,
567
+ "for the automorphism group of a Rees (0-)matrix semigroup",
568
+ [IsAutomorphismGroupOfRMSOrRZMS],
569
+ function(G)
570
+ Print("<automorphism group of ");
571
+ ViewObj(Source(G.1));
572
+ Print(" with ");
573
+ Print(Pluralize(Length(GeneratorsOfGroup(G)), "generator"));
574
+ Print(">");
575
+ end);
576
+
577
+ # InstallMethod(ViewString,
578
+ # "for the automorphism group of a Rees (0-)matrix semigroup",
579
+ # [IsAutomorphismGroupOfRMSOrRZMS],
580
+ # function(G)
581
+ # local plural;
582
+ #
583
+ # plural := "";
584
+ # if Length(GeneratorsOfGroup(G)) > 1 then
585
+ # plural := "s";
586
+ # fi;
587
+ #
588
+ # return StringFormatted(
589
+ # "<automorphism group of {!v} with {!v} generator{}>",
590
+ # Source(G.1),
591
+ # Length(GeneratorsOfGroup(G)),
592
+ # plural);
593
+ # end);
594
+
595
+ InstallMethod(IsomorphismPermGroup,
596
+ "for the automorphism group of a Rees (0-)matrix semigroup",
597
+ [IsAutomorphismGroupOfRMSOrRZMS],
598
+ function(G)
599
+ local R, H, iso, x;
600
+
601
+ R := Source(Representative(G)); # the Rees (0-)matrix semigroup
602
+ H := [];
603
+ for x in GeneratorsOfGroup(G) do
604
+ Add(H, Permutation(x, R, OnPoints));
605
+ od;
606
+ H := Group(H);
607
+
608
+ iso := GroupHomomorphismByImagesNC(G,
609
+ H,
610
+ GeneratorsOfGroup(G),
611
+ GeneratorsOfGroup(H));
612
+ SetInverseGeneralMapping(iso,
613
+ GroupHomomorphismByImagesNC(H,
614
+ G,
615
+ GeneratorsOfGroup(H),
616
+ GeneratorsOfGroup(G)));
617
+ SetIsBijective(iso, true);
618
+ SetNiceMonomorphism(G, iso);
619
+ SetIsHandledByNiceMonomorphism(G, true);
620
+ UseIsomorphismRelation(G, H);
621
+ return iso;
622
+ end);
623
+
624
+ InstallMethod(IdentityMapping, "for a Rees matrix semigroup",
625
+ [IsReesMatrixSemigroup and IsWholeFamily],
626
+ function(R)
627
+ local G;
628
+ G := UnderlyingSemigroup(R);
629
+ return RMSIsoByTripleNC(R, R,
630
+ [(),
631
+ IdentityMapping(G),
632
+ List([1 .. Length(Columns(R)) + Length(Rows(R))],
633
+ x -> One(G))]);
634
+ end);
635
+
636
+ InstallMethod(IdentityMapping, "for a Rees 0-matrix semigroup",
637
+ [IsReesZeroMatrixSemigroup and IsWholeFamily],
638
+ function(R)
639
+ local G, tup;
640
+ G := UnderlyingSemigroup(R);
641
+ tup := List([1 .. Length(Columns(R)) + Length(Rows(R))], x -> One(G));
642
+ return RZMSIsoByTripleNC(R, R, [(), IdentityMapping(G), tup]);
643
+ end);
644
+
645
+ #############################################################################
646
+ # 4. Isomorphisms
647
+ #############################################################################
648
+
649
+ InstallMethod(IsomorphismSemigroups,
650
+ "for finite whole family Rees matrix semigroups",
651
+ [IsReesMatrixSemigroup and IsWholeFamily and IsFinite,
652
+ IsReesMatrixSemigroup and IsWholeFamily and IsFinite],
653
+ (RankFilter(IsSimpleSemigroup and IsFinite) - RankFilter(IsReesMatrixSemigroup
654
+ and IsWholeFamily and IsFinite)) + 10, # to beat IsSimpleSemigroup and IsFinite
655
+ function(S, T)
656
+ local G, H, mat, m, n, f, isograph, isogroup, RMSInducedFunction, map, l, g,
657
+ tup;
658
+
659
+ G := UnderlyingSemigroup(S);
660
+ H := UnderlyingSemigroup(T);
661
+
662
+ if not (IsGroupAsSemigroup(G) and IsGroupAsSemigroup(H)) then
663
+ TryNextMethod();
664
+ elif Size(S) <> Size(T)
665
+ or Length(Columns(S)) <> Length(Columns(T))
666
+ or Length(Rows(T)) <> Length(Rows(T)) then
667
+ return fail;
668
+ elif not (IsPermGroup(G) and IsPermGroup(H)) then
669
+ TryNextMethod();
670
+ fi;
671
+
672
+ mat := Matrix(S);
673
+ m := Length(mat[1]);
674
+ n := Length(mat);
675
+
676
+ if S = T then
677
+ return RMSIsoByTriple(S, T, [(),
678
+ IdentityMapping(G),
679
+ ListWithIdenticalEntries(m + n, ())]);
680
+ fi;
681
+
682
+ f := IsomorphismGroups(G, H);
683
+ if f = fail then
684
+ return fail;
685
+ fi;
686
+
687
+ # for RMS without 0 the graphs are always isomorphic,
688
+ # being complete bipartite.
689
+
690
+ isograph := DirectProduct(SymmetricGroup(m), SymmetricGroup(n));
691
+ # all isomorphisms from g1 to g2
692
+ isogroup := List(Elements(AutomorphismGroup(G)), x -> x * f);
693
+
694
+ # find an induced function, if there is one
695
+ RMSInducedFunction := SEMIGROUPS.RMSInducedFunction;
696
+ for l in isograph do
697
+ for g in isogroup do
698
+ for tup in Elements(H) do
699
+ map := RMSInducedFunction(S, T, l, g, tup);
700
+ if map <> fail then
701
+ return RMSIsoByTriple(S, T, [l, g, map]);
702
+ fi;
703
+ od;
704
+ od;
705
+ od;
706
+ return fail;
707
+ end);
708
+
709
+ InstallMethod(IsomorphismSemigroups,
710
+ "for finite whole family Rees 0-matrix semigroups",
711
+ [IsReesZeroMatrixSemigroup and IsWholeFamily and IsFinite,
712
+ IsReesZeroMatrixSemigroup and IsWholeFamily and IsFinite],
713
+ function(S, T)
714
+ local G, H, mat, m, n, f, groupiso, grS, grT, g, graphiso, tuples,
715
+ RZMStoRZMSInducedFunction, map, l, tup;
716
+
717
+ G := UnderlyingSemigroup(S);
718
+ H := UnderlyingSemigroup(T);
719
+
720
+ if not (IsRegularSemigroup(S) and IsGroupAsSemigroup(G) and
721
+ IsRegularSemigroup(T) and IsGroupAsSemigroup(H)) then
722
+ TryNextMethod();
723
+ elif Size(S) <> Size(T)
724
+ or Length(Columns(S)) <> Length(Columns(T))
725
+ or Length(Rows(S)) <> Length(Rows(T)) then
726
+ return fail;
727
+ elif not (IsPermGroup(G) and IsPermGroup(H)) then
728
+ TryNextMethod();
729
+ fi;
730
+
731
+ mat := Matrix(S);
732
+ m := Length(mat[1]);
733
+ n := Length(mat);
734
+
735
+ if S = T then
736
+ return RZMSIsoByTripleNC(S, T, [(),
737
+ IdentityMapping(G),
738
+ ListWithIdenticalEntries(m + n, ())]);
739
+ fi;
740
+
741
+ # every isomorphism of the groups
742
+ f := IsomorphismGroups(G, H);
743
+ if f = fail then
744
+ return fail;
745
+ fi;
746
+ groupiso := List(AutomorphismGroup(G), x -> x * f);
747
+
748
+ # every isomorphism of the graphs
749
+ grS := RZMSDigraph(S);
750
+ grT := RZMSDigraph(T);
751
+ if grS <> grT then
752
+ g := IsomorphismDigraphs(grS, grT);
753
+ if g = fail then
754
+ return fail;
755
+ fi;
756
+ else
757
+ g := ();
758
+ fi;
759
+ graphiso := List(AutomorphismGroup(grS, [[1 .. m], [m + 1 .. n + m]]),
760
+ x -> x * g);
761
+
762
+ tuples := EnumeratorOfCartesianProduct(
763
+ List([1 .. Length(DigraphConnectedComponents(grS).comps)],
764
+ x -> H));
765
+ # find an induced function, if there is one
766
+ RZMStoRZMSInducedFunction := SEMIGROUPS.RZMStoRZMSInducedFunction;
767
+ for l in graphiso do
768
+ for g in groupiso do
769
+ for tup in tuples do
770
+ # TODO(never) it should be possible to cut this down
771
+ map := RZMStoRZMSInducedFunction(S, T, l, g, tup);
772
+ if map <> fail then
773
+ return RZMSIsoByTripleNC(S, T, [l, g, map]);
774
+ fi;
775
+ od;
776
+ od;
777
+ od;
778
+ return fail;
779
+ end);
780
+
781
+ #############################################################################
782
+ # 5. RMS/RZMSIsoByTriple
783
+ #############################################################################
784
+
785
+ InstallMethod(RMSIsoByTriple,
786
+ "for two Rees matrix semigroups and a dense list",
787
+ [IsReesMatrixSemigroup, IsReesMatrixSemigroup, IsDenseList],
788
+ function(R1, R2, triple)
789
+ local graph_iso, group_iso, g2_elms_list, nrrows, nrcols, G1, G2;
790
+ graph_iso := triple[1];
791
+ group_iso := triple[2];
792
+ g2_elms_list := triple[3];
793
+
794
+ # Check number of rows and cols
795
+ nrcols := Length(Rows(R1)); # rows of R1 are cols of the matrix
796
+ nrrows := Length(Columns(R1));
797
+ if nrcols <> Length(Rows(R2)) or nrrows <> Length(Columns(R2)) then
798
+ ErrorNoReturn("the 1st and 2nd arguments (Rees matrix semigroups) ",
799
+ "have different numbers of rows and columns");
800
+ fi;
801
+
802
+ # Check graph isomorphism
803
+ if not IsPerm(graph_iso) then
804
+ ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
805
+ "not a permutation");
806
+ elif LargestMovedPoint(graph_iso) > nrrows + nrcols then
807
+ ErrorNoReturn("the 1st entry (a permutation) in the 3rd argument ",
808
+ "(a triple) is not a permutation on [1 .. ",
809
+ nrrows + nrcols, "]");
810
+ elif ForAny([1 .. nrcols], x -> x ^ graph_iso > nrcols) then
811
+ ErrorNoReturn("the 1st entry (a permutation) in the 3rd argument ",
812
+ "(a triple) maps rows to columns");
813
+ fi;
814
+
815
+ # Check group isomorphism
816
+ G1 := UnderlyingSemigroup(R1);
817
+ G2 := UnderlyingSemigroup(R2);
818
+ if not (IsGroupHomomorphism(group_iso) and
819
+ IsBijective(group_iso) and
820
+ Source(group_iso) = G1 and
821
+ Range(group_iso) = G2) then
822
+ ErrorNoReturn("the 2nd entry in the 3rd argument (a triple)",
823
+ " is not an isomorphism between the underlying groups",
824
+ " of the 1st and 2nd arguments (Rees matrix semigroups)");
825
+ fi;
826
+
827
+ # Check map from rows and cols to H
828
+ if Length(g2_elms_list) <> nrrows + nrcols then
829
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
830
+ "does not have length equal to the number of rows and ",
831
+ "columns of the 1st argument (a Rees matrix semigroup)");
832
+ elif not ForAll(g2_elms_list, x -> x in G2) then
833
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
834
+ " does not consist of elements of the underlying group",
835
+ " of the 2nd argument (a Rees matrix semigroup)");
836
+ elif SEMIGROUPS.RMSInducedFunction(R1, R2, graph_iso, group_iso,
837
+ g2_elms_list[1]) <> g2_elms_list then
838
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
839
+ " does not define an isomorphism");
840
+ fi;
841
+
842
+ return RMSIsoByTripleNC(R1, R2, triple);
843
+ end);
844
+
845
+ InstallMethod(RZMSIsoByTriple,
846
+ "for two Rees 0-matrix semigroups and a dense list",
847
+ [IsReesZeroMatrixSemigroup, IsReesZeroMatrixSemigroup, IsDenseList],
848
+ function(R1, R2, triple)
849
+ local graph_iso, group_iso, g2_elms_list, nrrows, nrcols, graph1, graph2, G1,
850
+ G2, reps, map, rep;
851
+ graph_iso := triple[1];
852
+ group_iso := triple[2];
853
+ g2_elms_list := triple[3];
854
+
855
+ # Check number of rows and cols
856
+ nrrows := Length(Rows(R1));
857
+ nrcols := Length(Columns(R1));
858
+ if nrrows <> Length(Rows(R2)) or nrcols <> Length(Columns(R2)) then
859
+ ErrorNoReturn("the 1st and 2nd arguments (Rees 0-matrix semigroups) ",
860
+ "have different numbers of rows and columns");
861
+ fi;
862
+
863
+ # Check graph isomorphism
864
+ graph1 := RZMSDigraph(R1);
865
+ graph2 := RZMSDigraph(R2);
866
+ if not IsPerm(graph_iso) then
867
+ ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
868
+ "not a permutation");
869
+ elif not OnDigraphs(graph1, graph_iso) = graph2 then
870
+ ErrorNoReturn("the 1st entry in the 3rd argument (a triple) is ",
871
+ "not an isomorphism from the graph of the 1st argument (a",
872
+ " Rees 0-matrix semigroup) and the graph of the 2nd ",
873
+ "argument (a Rees 0-matrix semigroup)");
874
+ fi;
875
+
876
+ # Check group isomorphism
877
+ G1 := UnderlyingSemigroup(R1);
878
+ G2 := UnderlyingSemigroup(R2);
879
+ if not (IsGroupHomomorphism(group_iso) and
880
+ IsBijective(group_iso) and
881
+ Source(group_iso) = G1 and
882
+ Range(group_iso) = G2) then
883
+ ErrorNoReturn("the 2nd entry in the 3rd argument (a triple)",
884
+ " is not an isomorphism between the underlying groups",
885
+ " of the 1st and 2nd arguments (Rees 0-matrix semigroups)");
886
+ fi;
887
+
888
+ # Check map from rows and cols to H
889
+ if Length(g2_elms_list) <> nrrows + nrcols then
890
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
891
+ "does not have length equal to the number of rows and ",
892
+ "columns of the 1st argument (a Rees 0-matrix semigroup)");
893
+ elif not ForAll(g2_elms_list, x -> x in G2) then
894
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
895
+ " does not consist of elements of the underlying group",
896
+ " of the 2nd argument (a Rees 0-matrix semigroup)");
897
+ fi;
898
+ reps := List(DigraphConnectedComponents(graph1).comps, Representative);
899
+ map := EmptyPlist(Length(reps));
900
+ for rep in reps do
901
+ map[rep] := g2_elms_list[rep];
902
+ od;
903
+ if SEMIGROUPS.RZMStoRZMSInducedFunction(R1, R2, graph_iso, group_iso, map)
904
+ <> g2_elms_list then
905
+ ErrorNoReturn("the 3rd entry (a list) in the 3rd argument (a triple)",
906
+ " does not define an isomorphism");
907
+ fi;
908
+
909
+ return RZMSIsoByTripleNC(R1, R2, triple);
910
+ end);
911
+
912
+ InstallMethod(RMSIsoByTripleNC,
913
+ "for two Rees matrix semigroups and a dense list",
914
+ [IsReesMatrixSemigroup, IsReesMatrixSemigroup, IsDenseList],
915
+ function(R1, R2, triple)
916
+ local fam, out;
917
+ fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(R1)),
918
+ ElementsFamily(FamilyObj(R2)));
919
+ out := Objectify(NewType(fam, IsRMSIsoByTriple), rec(triple := triple));
920
+ SetSource(out, R1);
921
+ SetRange(out, R2);
922
+ return out;
923
+ end);
924
+
925
+ InstallMethod(RZMSIsoByTripleNC,
926
+ "for two Rees 0-matrix semigroups and a dense list",
927
+ [IsReesZeroMatrixSemigroup, IsReesZeroMatrixSemigroup, IsDenseList],
928
+ function(R1, R2, triple)
929
+ local fam, out;
930
+ fam := GeneralMappingsFamily(ElementsFamily(FamilyObj(R1)),
931
+ ElementsFamily(FamilyObj(R2)));
932
+ out := Objectify(NewType(fam, IsRZMSIsoByTriple), rec(triple := triple));
933
+ SetSource(out, R1);
934
+ SetRange(out, R2);
935
+ return out;
936
+ end);
937
+
938
+ InstallMethod(ELM_LIST, "for objects in `IsRMSIsoByTriple'",
939
+ [IsRMSIsoByTriple, IsPosInt], {x, i} -> x!.triple[i]);
940
+
941
+ InstallMethod(ELM_LIST, "for objects in `IsRZMSIsoByTriple'",
942
+ [IsRZMSIsoByTriple, IsPosInt], {x, i} -> x!.triple[i]);
943
+
944
+ InstallMethod(\=, "for isomorphisms of Rees (0-)matrix semigroups",
945
+ [IsRMSOrRZMSIsoByTriple, IsRMSOrRZMSIsoByTriple],
946
+ function(x, y)
947
+
948
+ if Source(x) <> Source(y) or Range(x) <> Range(y) then
949
+ return false;
950
+ elif x[1] = y[1] and x[2] = y[2] and x[3] = y[3] then
951
+ return true;
952
+ fi;
953
+
954
+ return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
955
+ = OnTuples(GeneratorsOfSemigroup(Source(x)), y);
956
+ end);
957
+
958
+ InstallMethod(\<, "for objects in `IsRMSIsoByTriple'",
959
+ IsIdenticalObj,
960
+ [IsRMSIsoByTriple, IsRMSIsoByTriple],
961
+ function(x, y)
962
+ return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
963
+ < OnTuples(GeneratorsOfSemigroup(Source(x)), y);
964
+ end);
965
+
966
+ InstallMethod(\<, "for objects in `IsRZMSIsoByTriple'",
967
+ IsIdenticalObj,
968
+ [IsRZMSIsoByTriple, IsRZMSIsoByTriple],
969
+ function(x, y)
970
+ return OnTuples(GeneratorsOfSemigroup(Source(x)), x)
971
+ < OnTuples(GeneratorsOfSemigroup(Source(x)), y);
972
+ end);
973
+
974
+ InstallMethod(CompositionMapping2, "for objects in `IsRMSIsoByTriple'",
975
+ [IsRMSIsoByTriple, IsRMSIsoByTriple],
976
+ function(map2, map1)
977
+ local n;
978
+ n := Length(Rows(Source(map2))) + Length(Columns(Source(map2)));
979
+ return RMSIsoByTripleNC(Source(map1),
980
+ Range(map2),
981
+ [map1[1] * map2[1],
982
+ map1[2] * map2[2],
983
+ List([1 .. n],
984
+ i -> map2[3][i ^ map1[1]] * map1[3][i] ^
985
+ map2[2])]);
986
+ end);
987
+
988
+ InstallMethod(CompositionMapping2, "for objects in `IsRZMSIsoByTriple'",
989
+ IsIdenticalObj, [IsRZMSIsoByTriple, IsRZMSIsoByTriple],
990
+ function(map2, map1)
991
+ local n;
992
+ n := Length(Rows(Source(map1))) + Length(Columns(Source(map1)));
993
+ return RZMSIsoByTripleNC(Source(map1),
994
+ Range(map2),
995
+ [map1[1] * map2[1],
996
+ map1[2] * map2[2],
997
+ List([1 .. n],
998
+ i -> map2[3][i ^ map1[1]] * map1[3][i] ^
999
+ map2[2])]);
1000
+ end);
1001
+
1002
+ InstallMethod(ImagesElm, "for an RMS element under a mapping by a triple",
1003
+ FamSourceEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
1004
+ {triple, x} -> [ImagesRepresentative(triple, x)]);
1005
+
1006
+ InstallMethod(ImagesElm, "for an RZMS element under a mapping by a triple",
1007
+ FamSourceEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
1008
+ {triple, x} -> [ImagesRepresentative(triple, x)]);
1009
+
1010
+ InstallMethod(ImagesRepresentative,
1011
+ "for an RMS element under a mapping by a triple",
1012
+ FamSourceEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
1013
+ function(map, x)
1014
+ local m;
1015
+ m := Length(Rows(Source(map)));
1016
+ return RMSElementNC(Range(map),
1017
+ x[1] ^ map[1],
1018
+ map[3][x[1]] * x[2] ^ map[2] / map[3][x[3] + m],
1019
+ (x[3] + m) ^ map[1] - m);
1020
+ end);
1021
+
1022
+ InstallMethod(ImagesRepresentative,
1023
+ "for an RZMS element under a mapping by a triple",
1024
+ FamSourceEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
1025
+ function(map, x)
1026
+ local m;
1027
+
1028
+ m := Length(Rows(Source(map)));
1029
+ if x = MultiplicativeZero(Source(map)) or map[3][x[1]] = 0
1030
+ or map[3][x[3] + m] = 0 then
1031
+ return MultiplicativeZero(Range(map));
1032
+ fi;
1033
+ return RMSElementNC(Range(map),
1034
+ x[1] ^ map[1],
1035
+ map[3][x[1]] * x[2] ^ map[2] / map[3][x[3] + m],
1036
+ (x[3] + m) ^ map[1] - m);
1037
+ end);
1038
+
1039
+ InstallMethod(InverseGeneralMapping, "for objects in `IsRMSIsoByTriple'",
1040
+ [IsRMSIsoByTriple],
1041
+ function(map)
1042
+ local n, inv;
1043
+ n := Length(Rows(Source(map))) + Length(Columns(Source(map)));
1044
+ inv := InverseGeneralMapping(map[2]);
1045
+ return RMSIsoByTripleNC(Range(map),
1046
+ Source(map),
1047
+ [map[1] ^ -1,
1048
+ inv,
1049
+ List([1 .. n],
1050
+ i -> ((map[3][i ^ (map[1] ^ -1)] ^ inv)
1051
+ ^ -1))]);
1052
+ end);
1053
+
1054
+ InstallMethod(InverseGeneralMapping, "for objects in `IsRMSIsoByTriple'",
1055
+ [IsRMSIsoByTriple and IsOne], x -> x);
1056
+
1057
+ InstallMethod(InverseGeneralMapping, "for objects in `IsRZMSIsoByTriple'",
1058
+ [IsRZMSIsoByTriple],
1059
+ function(map)
1060
+ local n, inv;
1061
+ n := Length(Rows(Source(map))) + Length(Columns(Source(map)));
1062
+ inv := InverseGeneralMapping(map[2]);
1063
+ return RZMSIsoByTripleNC(Range(map),
1064
+ Source(map),
1065
+ [map[1] ^ -1,
1066
+ inv,
1067
+ List([1 .. n],
1068
+ i -> (map[3][i ^ (map[1] ^ -1)] ^ inv) ^ -1)]);
1069
+ end);
1070
+
1071
+ InstallMethod(IsOne, "for objects in `IsRMSIsoByTriple'",
1072
+ [IsRMSIsoByTriple],
1073
+ {map} -> IsOne(map[1]) and IsOne(map[2]) and ForAll(map[3], IsOne));
1074
+
1075
+ InstallMethod(IsOne, "for objects in `IsRZMSIsoByTriple'",
1076
+ [IsEndoGeneralMapping and IsRZMSIsoByTriple],
1077
+ {map} -> IsOne(map[1]) and IsOne(map[2]) and ForAll(map[3], IsOne));
1078
+
1079
+ InstallMethod(PreImagesRepresentativeNC,
1080
+ "for an RMS element under a mapping by a triple",
1081
+ FamRangeEqFamElm, [IsRMSIsoByTriple, IsReesMatrixSemigroupElement],
1082
+ {map, x} -> ImagesRepresentative(InverseGeneralMapping(map), x));
1083
+
1084
+ InstallMethod(PreImagesRepresentativeNC,
1085
+ "for an RZMS element under a mapping by a triple",
1086
+ FamRangeEqFamElm, [IsRZMSIsoByTriple, IsReesZeroMatrixSemigroupElement],
1087
+ {map, x} -> ImagesRepresentative(InverseGeneralMapping(map), x));
1088
+
1089
+ InstallMethod(PrintObj, "for an object in `IsRMSIsoByTriple'",
1090
+ [IsRMSIsoByTriple],
1091
+ function(map)
1092
+ Print("RMSIsoByTriple ( ", Source(map), ", ", Range(map), ", [", map[1],
1093
+ ", ", map[2], ", ", map[3], "])");
1094
+ return;
1095
+ end);
1096
+
1097
+ InstallMethod(PrintObj, "for an object in `IsRZMSIsoByTriple'",
1098
+ [IsRZMSIsoByTriple],
1099
+ function(map)
1100
+ Print("RZMSIsoByTriple ( ", Source(map), ", ", Range(map), ", ", map[1],
1101
+ ", ", map[2], ", ", map[3], " )");
1102
+ return;
1103
+ end);
1104
+
1105
+ # InstallMethod(PrintString, "for an object in `IsRMSIsoByTriple'",
1106
+ # [IsRMSIsoByTriple],
1107
+ # function(map)
1108
+ # return StringFormatted("RMSIsoByTriple({}, {}, [{}, {}, {}])",
1109
+ # Source(map),
1110
+ # Range(map),
1111
+ # map[1],
1112
+ # map[2],
1113
+ # map[3]);
1114
+ # end);
1115
+ #
1116
+ # InstallMethod(PrintString, "for an object in `IsRZMSIsoByTriple'",
1117
+ # [IsRZMSIsoByTriple],
1118
+ # function(map)
1119
+ # return StringFormatted("RZMSIsoByTriple({}, {}, [{}, {}, {}])",
1120
+ # Source(map),
1121
+ # Range(map),
1122
+ # map[1],
1123
+ # map[2],
1124
+ # map[3]);
1125
+ # end);
1126
+
1127
+ InstallMethod(ViewObj, "for an object in `IsRMSIsoByTriple'",
1128
+ [IsRMSIsoByTriple],
1129
+ function(map)
1130
+ Print("(", map[1], ", ", map[2], ", ", map[3], ")");
1131
+ end);
1132
+
1133
+ InstallMethod(ViewObj, "for object in `IsRZMSIsoByTriple'",
1134
+ [IsRZMSIsoByTriple],
1135
+ function(map)
1136
+ Print("(", map[1], ", ", map[2], ", ", map[3], ")");
1137
+ end);
1138
+
1139
+ # InstallMethod(ViewString, "for an object in `IsRMSIsoByTriple'",
1140
+ # [IsRMSIsoByTriple],
1141
+ # {map} -> StringFormatted("({!v}, {!v}, {!v})", map[1], map[2], map[3]);
1142
+ #
1143
+ # InstallMethod(ViewString, "for object in `IsRZMSIsoByTriple'",
1144
+ # [IsRZMSIsoByTriple],
1145
+ # {map} -> StringFormatted("({!v}, {!v}, {!v})", map[1], map[2], map[3]);
1146
+
1147
+ InstallMethod(IsomorphismReesMatrixSemigroupOverPermGroup,
1148
+ "for a semigroup",
1149
+ [IsSemigroup],
1150
+ function(S)
1151
+ local iso, T, G, isoG, invG, s;
1152
+
1153
+ if not IsFinite(S) or not IsSimpleSemigroup(S) then
1154
+ ErrorNoReturn("the argument is not a finite simple semigroup");
1155
+ elif not IsReesMatrixSemigroup(S) then
1156
+ return IsomorphismReesMatrixSemigroup(S);
1157
+ elif not IsWholeFamily(S) then
1158
+ iso := IsomorphismReesMatrixSemigroup(S);
1159
+ T := Range(iso);
1160
+ if IsPermGroup(UnderlyingSemigroup(T)) then
1161
+ return iso;
1162
+ fi;
1163
+ return CompositionMapping(IsomorphismReesMatrixSemigroupOverPermGroup(T),
1164
+ iso);
1165
+ fi;
1166
+
1167
+ G := UnderlyingSemigroup(S);
1168
+ isoG := IsomorphismPermGroup(G);
1169
+ invG := InverseGeneralMapping(isoG);
1170
+ s := ReesMatrixSemigroup(Range(isoG),
1171
+ List(Matrix(S), x -> OnTuples(x, isoG)));
1172
+ return SemigroupIsomorphismByFunctionNC(S, s,
1173
+ x -> RMSElement(s, x![1], x![2] ^ isoG, x![3]),
1174
+ x -> RMSElement(S, x![1], x![2] ^ invG, x![3]));
1175
+ end);
1176
+
1177
+ InstallMethod(IsomorphismReesZeroMatrixSemigroupOverPermGroup,
1178
+ "for a semigroup",
1179
+ [IsSemigroup],
1180
+ function(S)
1181
+ local iso, T, G, isoG, invG, s, func;
1182
+
1183
+ if not IsFinite(S) or not IsZeroSimpleSemigroup(S) then
1184
+ ErrorNoReturn("the argument is not a finite 0-simple semigroup");
1185
+ elif not IsReesZeroMatrixSemigroup(S) then
1186
+ return IsomorphismReesZeroMatrixSemigroup(S);
1187
+ elif not IsWholeFamily(S) then
1188
+ iso := IsomorphismReesZeroMatrixSemigroup(S);
1189
+ T := Range(iso);
1190
+ if IsPermGroup(UnderlyingSemigroup(T)) then
1191
+ return iso;
1192
+ fi;
1193
+ return CompositionMapping(
1194
+ IsomorphismReesZeroMatrixSemigroupOverPermGroup(T), iso);
1195
+ fi;
1196
+
1197
+ func := function(x, map)
1198
+ if x = 0 then
1199
+ return 0;
1200
+ fi;
1201
+ return x ^ map;
1202
+ end;
1203
+
1204
+ G := UnderlyingSemigroup(S);
1205
+ isoG := IsomorphismPermGroup(G);
1206
+ invG := InverseGeneralMapping(isoG);
1207
+ s := ReesZeroMatrixSemigroup(Range(isoG),
1208
+ List(Matrix(S),
1209
+ x -> List(x, y -> func(y, isoG))));
1210
+
1211
+ return SemigroupIsomorphismByFunctionNC(S, s,
1212
+ function(x)
1213
+ if x![1] = 0 then
1214
+ return MultiplicativeZero(s);
1215
+ fi;
1216
+ return RMSElement(s, x![1], func(x![2], isoG), x![3]);
1217
+ end,
1218
+ function(x)
1219
+ if x![1] = 0 then
1220
+ return MultiplicativeZero(S);
1221
+ fi;
1222
+ return RMSElement(S, x![1], func(x![2], invG), x![3]);
1223
+ end);
1224
+ end);
1225
+
1226
+ InstallMethod(CanonicalReesZeroMatrixSemigroup,
1227
+ "for a Rees zero matrix semigroup",
1228
+ [IsReesZeroMatrixSemigroup],
1229
+ function(S)
1230
+ local Flatten3DPoint, Unflatten3DPoint, SetToZeroGroupMatrix,
1231
+ ZeroGroupMatrixToSet, RZMSMatrixIsomorphismGroup, M, G, m, n, setM, GG;
1232
+ # Go from a triple in I x J x {1 .. |G| + 1} to an integer in
1233
+ # [1 .. |I| * |J| * (|G| + 1)]. Inverse of Unflatten3DPoint.
1234
+ Flatten3DPoint := function(dimensions, point)
1235
+ return (point[1] - 1) * dimensions[2] * dimensions[3] +
1236
+ (point[2] - 1) * dimensions[3] + (point[3] - 1) + 1;
1237
+ end;
1238
+
1239
+ # Go from an integer in [1 .. |I| * |J| * (|G| + 1)] to an element of
1240
+ # I x J x {1 .. |G| + 1}. Inverse of Flatten3DPoint.
1241
+ Unflatten3DPoint := function(dimensions, value)
1242
+ local ret;
1243
+ ret := [];
1244
+ value := value - 1;
1245
+ ret[3] := value mod dimensions[3] + 1;
1246
+ value := value - (ret[3] - 1);
1247
+ value := value / dimensions[3];
1248
+ ret[2] := value mod dimensions[2] + 1;
1249
+ value := value - (ret[2] - 1);
1250
+ ret[1] := value / dimensions[2] + 1;
1251
+ return ret;
1252
+ end;
1253
+
1254
+ # Unflatten the entries of a set representing a matrix over a 0-group and
1255
+ # return the corresponding matrix. Inverse of ZeroGroupMatrixToSet.
1256
+ SetToZeroGroupMatrix := function(set, nr_rows, nr_cols, G)
1257
+ local 0G, mat, dim, point, x;
1258
+ 0G := Concatenation([0], Enumerator(G));
1259
+ mat := List([1 .. nr_rows], a -> EmptyPlist(nr_cols));
1260
+ dim := [nr_rows, nr_cols, Size(G) + 1];
1261
+ for x in set do
1262
+ point := Unflatten3DPoint(dim, x);
1263
+ mat[point[1]][point[2]] := 0G[point[3]];
1264
+ od;
1265
+ return mat;
1266
+ end;
1267
+
1268
+ # Flatten the entries of a matrix over a 0-group and return as a set of
1269
+ # integers. Inverse of SetToZeroGroupMatrix.
1270
+ ZeroGroupMatrixToSet := function(mat, nr_rows, nr_cols, G)
1271
+ local set, dim, i, j;
1272
+ set := [];
1273
+ dim := [nr_rows, nr_cols, Size(G) + 1];
1274
+ for i in [1 .. nr_rows] do
1275
+ for j in [1 .. nr_cols] do
1276
+ if mat[i][j] = 0 then
1277
+ Add(set, Flatten3DPoint(dim, [i, j, 1]));
1278
+ else
1279
+ Add(set,
1280
+ Flatten3DPoint(dim, [i, j, 1 + Position(Enumerator(G),
1281
+ mat[i][j])]));
1282
+ fi;
1283
+ od;
1284
+ od;
1285
+ return set;
1286
+ end;
1287
+
1288
+ # The representation of the group ((G \wr S_m) \times (G \wr S_n)) \rtimes
1289
+ # Aut(G) acting on [1 .. |I| * |J| * (|G| + 1)] where the integers correspond
1290
+ # to entries of a J x I matrix with entries from the 0-group G_0.
1291
+ RZMSMatrixIsomorphismGroup := function(nr_rows, nr_cols, G)
1292
+ local ApplyPermWholeDimension, ApplyPermSingleAssignDimension, dim, S, rows,
1293
+ cols, gens, elms, rmlt, grswaps, lmlt, gcswaps, auto;
1294
+
1295
+ ApplyPermWholeDimension := function(dimensions, dim, perm)
1296
+ local map, point, i;
1297
+ map := [];
1298
+ for i in [1 .. Product(dimensions)] do
1299
+ point := Unflatten3DPoint(dimensions, i);
1300
+ point[dim] := point[dim] ^ perm;
1301
+ map[i] := Flatten3DPoint(dimensions, point);
1302
+ od;
1303
+ return PermList(map);
1304
+ end;
1305
+
1306
+ ApplyPermSingleAssignDimension := function(dimensions, dim,
1307
+ perm, fixdim, fixval)
1308
+ local map, point, i;
1309
+ map := [];
1310
+ for i in [1 .. Product(dimensions)] do
1311
+ point := Unflatten3DPoint(dimensions, i);
1312
+ if point[fixdim] = fixval then
1313
+ point[dim] := point[dim] ^ perm;
1314
+ fi;
1315
+ map[i] := Flatten3DPoint(dimensions, point);
1316
+ od;
1317
+ return PermList(map);
1318
+ end;
1319
+
1320
+ dim := [nr_rows, nr_cols, Size(G) + 1];
1321
+ # Row Swaps
1322
+ S := SymmetricGroup(nr_rows);
1323
+ rows := List(GeneratorsOfGroup(S),
1324
+ x -> ApplyPermWholeDimension(dim, 1, x));
1325
+
1326
+ # Col swaps
1327
+ S := SymmetricGroup(nr_cols);
1328
+ cols := List(GeneratorsOfGroup(S),
1329
+ x -> ApplyPermWholeDimension(dim, 2, x));
1330
+
1331
+ gens := GeneratorsOfGroup(G);
1332
+ elms := ShallowCopy(Enumerator(G));
1333
+
1334
+ # Apply g to each row (left multiplication by inverse):
1335
+ rmlt := List(gens, g -> PermList(Concatenation([1],
1336
+ 1 + List(elms, e -> Position(elms, g ^ -1 * e)))));
1337
+ grswaps := List(rmlt, g -> ApplyPermSingleAssignDimension(dim, 3, g, 1, 1));
1338
+
1339
+ # Apply g to each col (right multiplication):
1340
+ lmlt := List(gens, g -> PermList(Concatenation([1],
1341
+ 1 + List(elms, e -> Position(elms, e * g)))));
1342
+ gcswaps := List(lmlt, g -> ApplyPermSingleAssignDimension(dim, 3, g, 2, 1));
1343
+
1344
+ # Automorphisms of G
1345
+ S := AutomorphismGroup(G);
1346
+ auto := Filtered(GeneratorsOfGroup(S), x -> not IsInnerAutomorphism(x));
1347
+ auto := List(auto, x -> List(Enumerator(G), a ->
1348
+ Position(Enumerator(G), a ^ x)));
1349
+ Apply(auto, a -> PermList(Concatenation([1], a + 1)));
1350
+ auto := List(auto, x -> ApplyPermWholeDimension(dim, 3, x));
1351
+
1352
+ # The RZMS matrix isomorphism group
1353
+ return Group(Flat([rows, cols, grswaps, gcswaps, auto]));
1354
+ end;
1355
+
1356
+ M := Matrix(S);
1357
+ G := UnderlyingSemigroup(S);
1358
+ if not IsGroup(UnderlyingSemigroup(S)) then
1359
+ ErrorNoReturn("the underlying semigroup of the argument ",
1360
+ "(a Rees 0-matrix semigroup) is not a group");
1361
+ fi;
1362
+ m := Length(M);
1363
+ n := Length(M[1]);
1364
+ setM := ZeroGroupMatrixToSet(M, m, n, G);
1365
+ GG := RZMSMatrixIsomorphismGroup(m, n, G);
1366
+ return ReesZeroMatrixSemigroup(G, SetToZeroGroupMatrix(
1367
+ CanonicalImage(GG, setM, OnSets), m, n, G));
1368
+ end);
1369
+
1370
+ InstallMethod(CanonicalReesMatrixSemigroup,
1371
+ "for a Rees matrix semigroup",
1372
+ [IsReesMatrixSemigroup],
1373
+ function(S)
1374
+ local G, mat;
1375
+ G := UnderlyingSemigroup(S);
1376
+ if not IsGroup(G) then
1377
+ ErrorNoReturn("the underlying semigroup of the argument ",
1378
+ "(a Rees 0-matrix semigroup) is not a group");
1379
+ fi;
1380
+ mat := Matrix(CanonicalReesZeroMatrixSemigroup(
1381
+ ReesZeroMatrixSemigroup(G, Matrix(S))));
1382
+ return ReesMatrixSemigroup(G, mat);
1383
+ end);