passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,1506 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ r"""
3
+ Finite Complex Reflection Groups
4
+ """
5
+ # ****************************************************************************
6
+ # Copyright (C) 2011-2015 Christian Stump <christian.stump at gmail.com>
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ # https://www.gnu.org/licenses/
13
+ # ****************************************************************************
14
+
15
+ from sage.misc.abstract_method import abstract_method
16
+ from sage.misc.misc_c import prod
17
+ from sage.misc.cachefunc import cached_method
18
+ from sage.categories.category_with_axiom import CategoryWithAxiom
19
+ from sage.categories.coxeter_groups import CoxeterGroups
20
+
21
+
22
+ class FiniteComplexReflectionGroups(CategoryWithAxiom):
23
+ r"""
24
+ The category of finite complex reflection groups.
25
+
26
+ See :class:`ComplexReflectionGroups` for the definition of complex
27
+ reflection group. In the finite case, most of the information
28
+ about the group can be recovered from its *degrees* and
29
+ *codegrees*, and to a lesser extent to the explicit realization as
30
+ subgroup of `GL(V)`. Hence the most important optional methods to
31
+ implement are:
32
+
33
+ - :meth:`ComplexReflectionGroups.Finite.ParentMethods.degrees`,
34
+ - :meth:`ComplexReflectionGroups.Finite.ParentMethods.codegrees`,
35
+ - :meth:`ComplexReflectionGroups.Finite.ElementMethods.to_matrix`.
36
+
37
+ Finite complex reflection groups are completely classified. In
38
+ particular, if the group is irreducible, then it's uniquely
39
+ determined by its degrees and codegrees and whether it's
40
+ reflection representation is *primitive* or not (see [LT2009]_
41
+ Chapter 2.1 for the definition of primitive).
42
+
43
+ .. SEEALSO:: :wikipedia:`Complex_reflection_groups`
44
+
45
+ EXAMPLES::
46
+
47
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
48
+ sage: ComplexReflectionGroups().Finite()
49
+ Category of finite complex reflection groups
50
+ sage: ComplexReflectionGroups().Finite().super_categories()
51
+ [Category of complex reflection groups,
52
+ Category of finite groups,
53
+ Category of finite finitely generated semigroups]
54
+
55
+ An example of a finite reflection group::
56
+
57
+ sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
58
+ Reducible real reflection group of rank 4 and type A2 x B2
59
+
60
+ sage: W.reflections() # optional - gap3
61
+ Finite family {1: (1,8)(2,5)(9,12), 2: (1,5)(2,9)(8,12),
62
+ 3: (3,10)(4,7)(11,14), 4: (3,6)(4,11)(10,13),
63
+ 5: (1,9)(2,8)(5,12), 6: (4,14)(6,13)(7,11),
64
+ 7: (3,13)(6,10)(7,14)}
65
+
66
+ ``W`` is in the category of complex reflection groups::
67
+
68
+ sage: W in ComplexReflectionGroups().Finite() # optional - gap3
69
+ True
70
+ """
71
+ def example(self):
72
+ r"""
73
+ Return an example of a complex reflection group.
74
+
75
+ EXAMPLES::
76
+
77
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
78
+ sage: ComplexReflectionGroups().Finite().example() # optional - gap3
79
+ Reducible real reflection group of rank 4 and type A2 x B2
80
+ """
81
+ from sage.combinat.root_system.reflection_group_real import ReflectionGroup
82
+ return ReflectionGroup((1, 1, 3), (2, 1, 2))
83
+
84
+ class SubcategoryMethods:
85
+
86
+ @cached_method
87
+ def WellGenerated(self):
88
+ r"""
89
+ Return the full subcategory of well-generated objects of ``self``.
90
+
91
+ A finite complex generated group is *well generated* if it
92
+ is isomorphic to a subgroup of the general linear group
93
+ `GL_n` generated by `n` reflections.
94
+
95
+ .. SEEALSO::
96
+
97
+ :meth:`ComplexReflectionGroups.Finite.ParentMethods.is_well_generated`
98
+
99
+ EXAMPLES::
100
+
101
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
102
+ sage: C = ComplexReflectionGroups().Finite().WellGenerated(); C
103
+ Category of well generated finite complex reflection groups
104
+
105
+ Here is an example of a finite well-generated complex
106
+ reflection group::
107
+
108
+ sage: W = C.example(); W # optional - gap3
109
+ Reducible complex reflection group of rank 4 and type A2 x G(3,1,2)
110
+
111
+ All finite Coxeter groups are well generated::
112
+
113
+ sage: CoxeterGroups().Finite().is_subcategory(C)
114
+ True
115
+ sage: SymmetricGroup(3) in C # needs sage.groups
116
+ True
117
+
118
+ .. NOTE::
119
+
120
+ The category of well generated finite complex
121
+ reflection groups is currently implemented as an
122
+ axiom. See discussion on :issue:`11187`. This may be a
123
+ bit of overkill. Still it's nice to have a full
124
+ subcategory.
125
+
126
+ TESTS::
127
+
128
+ sage: TestSuite(W).run() # optional - gap3
129
+ sage: C = ComplexReflectionGroups().Finite().WellGenerated()
130
+ sage: TestSuite(C).run()
131
+ sage: CoxeterGroups().Finite().WellGenerated.__module__
132
+ 'sage.categories.finite_complex_reflection_groups'
133
+
134
+ We check that the axioms are properly ordered in
135
+ ``sage.categories.category_with_axiom.axioms`` and yield
136
+ desired output (well generated does not appear)::
137
+
138
+ sage: CoxeterGroups().Finite()
139
+ Category of finite Coxeter groups
140
+ """
141
+ return self._with_axiom('WellGenerated')
142
+
143
+ class ParentMethods:
144
+ @abstract_method(optional=True)
145
+ def degrees(self):
146
+ r"""
147
+ Return the degrees of ``self``.
148
+
149
+ OUTPUT: a tuple of Sage integers
150
+
151
+ EXAMPLES::
152
+
153
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
154
+ sage: W.degrees() # needs sage.combinat
155
+ (2, 3, 4)
156
+
157
+ sage: W = ColoredPermutations(3,3) # needs sage.combinat
158
+ sage: W.degrees() # needs sage.combinat
159
+ (3, 6, 9)
160
+
161
+ sage: W = ReflectionGroup(31) # optional - gap3
162
+ sage: W.degrees() # optional - gap3
163
+ (8, 12, 20, 24)
164
+ """
165
+
166
+ @abstract_method(optional=True)
167
+ def codegrees(self):
168
+ r"""
169
+ Return the codegrees of ``self``.
170
+
171
+ OUTPUT: a tuple of Sage integers
172
+
173
+ EXAMPLES::
174
+
175
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
176
+ sage: W.codegrees() # needs sage.combinat
177
+ (2, 1, 0)
178
+
179
+ sage: W = ColoredPermutations(3,3) # needs sage.combinat
180
+ sage: W.codegrees() # needs sage.combinat
181
+ (6, 3, 0)
182
+
183
+ sage: W = ReflectionGroup(31) # optional - gap3
184
+ sage: W.codegrees() # optional - gap3
185
+ (28, 16, 12, 0)
186
+ """
187
+
188
+ def _test_degrees(self, **options):
189
+ """
190
+ Test the method :meth:`degrees`.
191
+
192
+ INPUT:
193
+
194
+ - ``options`` -- any keyword arguments accepted by :meth:`_tester`
195
+
196
+ EXAMPLES::
197
+
198
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
199
+ sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
200
+ Reducible real reflection group of rank 4 and type A2 x B2
201
+ sage: W._test_degrees() # optional - gap3
202
+
203
+ sage: W = SymmetricGroup(5) # needs sage.groups
204
+ sage: W._test_degrees() # needs sage.groups sage.rings.number_field
205
+
206
+ We now break the implementation of W.degrees and check that this is caught::
207
+
208
+ sage: W.degrees = lambda: (1/1,5) # needs sage.groups
209
+ sage: W._test_degrees() # needs sage.groups
210
+ Traceback (most recent call last):
211
+ ...
212
+ AssertionError: the degrees should be integers
213
+
214
+ sage: W.degrees = lambda: (1,2,3) # needs sage.groups
215
+ sage: W._test_degrees() # needs sage.groups
216
+ Traceback (most recent call last):
217
+ ...
218
+ AssertionError: the degrees should be larger than 2
219
+
220
+ We restore W to its normal state::
221
+
222
+ sage: del W.degrees # needs sage.groups
223
+ sage: W._test_degrees() # needs sage.groups sage.rings.number_field
224
+
225
+ See the documentation for :class:`TestSuite` for more information.
226
+ """
227
+ from sage.structure.element import parent
228
+ from sage.rings.integer_ring import ZZ
229
+
230
+ tester = self._tester(**options)
231
+ degrees = self.degrees()
232
+ tester.assertIsInstance(degrees, tuple,
233
+ "the degrees method should return a tuple")
234
+ tester.assertTrue(all(parent(d) is ZZ for d in degrees),
235
+ "the degrees should be integers")
236
+ tester.assertTrue(all(d >= 2 for d in degrees),
237
+ "the degrees should be larger than 2")
238
+ tester.assertEqual(len(degrees), self.rank(),
239
+ "the number of degrees should coincide with the rank")
240
+ tester.assertEqual(sum(d - 1 for d in degrees), self.number_of_reflections(),
241
+ "the sum of the degrees should be consistent with the number of reflections")
242
+
243
+ def _test_codegrees(self, **options):
244
+ """
245
+ Test the method :meth:`degrees`.
246
+
247
+ INPUT:
248
+
249
+ - ``options`` -- any keyword arguments accepted by :meth:`_tester`
250
+
251
+ EXAMPLES::
252
+
253
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
254
+ sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
255
+ Reducible real reflection group of rank 4 and type A2 x B2
256
+ sage: W._test_codegrees() # optional - gap3
257
+
258
+ sage: W = SymmetricGroup(5) # needs sage.groups
259
+ sage: W._test_codegrees() # needs sage.groups sage.rings.number_field
260
+
261
+ We now break the implementation of W.degrees and check that this is caught::
262
+
263
+ sage: W.codegrees = lambda: (1/1,5) # needs sage.groups
264
+ sage: W._test_codegrees() # needs sage.groups
265
+ Traceback (most recent call last):
266
+ ...
267
+ AssertionError: the codegrees should be integers
268
+
269
+ sage: W.codegrees = lambda: (2,1,-1) # needs sage.groups
270
+ sage: W._test_codegrees() # needs sage.groups
271
+ Traceback (most recent call last):
272
+ ...
273
+ AssertionError: the codegrees should be nonnegative
274
+
275
+ We restore W to its normal state::
276
+
277
+ sage: del W.codegrees # needs sage.groups
278
+ sage: W._test_codegrees() # needs sage.groups sage.rings.number_field
279
+
280
+ See the documentation for :class:`TestSuite` for more information.
281
+ """
282
+ from sage.structure.element import parent
283
+ from sage.rings.integer_ring import ZZ
284
+
285
+ tester = self._tester(**options)
286
+ codegrees = self.codegrees()
287
+ tester.assertIsInstance(codegrees, tuple,
288
+ "the codegrees method should return a tuple")
289
+ tester.assertTrue(all(parent(d) is ZZ for d in codegrees),
290
+ "the codegrees should be integers")
291
+ tester.assertTrue(all(d >= 0 for d in codegrees),
292
+ "the codegrees should be nonnegative")
293
+ tester.assertEqual(len(codegrees), self.rank(),
294
+ "the number of codegrees should coincide with the rank")
295
+ tester.assertEqual(sum(d + 1 for d in codegrees),
296
+ self.number_of_reflection_hyperplanes(),
297
+ "the sum of the codegrees should be consistent with the number of reflection hyperplanes")
298
+
299
+ @cached_method
300
+ def number_of_reflection_hyperplanes(self):
301
+ r"""
302
+ Return the number of reflection hyperplanes of ``self``.
303
+
304
+ This is also the number of distinguished reflections. For
305
+ real groups, this coincides with the number of
306
+ reflections.
307
+
308
+ This implementation uses that it is given by the sum of
309
+ the codegrees of ``self`` plus its rank.
310
+
311
+ .. SEEALSO:: :meth:`number_of_reflections`
312
+
313
+ EXAMPLES::
314
+
315
+ sage: # needs sage.combinat
316
+ sage: W = ColoredPermutations(1,3)
317
+ sage: W.number_of_reflection_hyperplanes()
318
+ 3
319
+ sage: W = ColoredPermutations(2,3)
320
+ sage: W.number_of_reflection_hyperplanes()
321
+ 9
322
+ sage: W = ColoredPermutations(4,3)
323
+ sage: W.number_of_reflection_hyperplanes()
324
+ 15
325
+
326
+ sage: # optional - gap3, needs sage.combinat
327
+ sage: W = ReflectionGroup((4,2,3))
328
+ sage: W.number_of_reflection_hyperplanes()
329
+ 15
330
+ """
331
+ from sage.rings.integer_ring import ZZ
332
+ return ZZ.sum(codeg + 1 for codeg in self.codegrees())
333
+
334
+ @cached_method
335
+ def number_of_reflections(self):
336
+ r"""
337
+ Return the number of reflections of ``self``.
338
+
339
+ For real groups, this coincides with the number of
340
+ reflection hyperplanes.
341
+
342
+ This implementation uses that it is given by the sum of
343
+ the degrees of ``self`` minus its rank.
344
+
345
+ .. SEEALSO:: :meth:`number_of_reflection_hyperplanes`
346
+
347
+ EXAMPLES::
348
+
349
+ sage: [SymmetricGroup(i).number_of_reflections() # needs sage.groups sage.rings.number_field
350
+ ....: for i in range(int(8))]
351
+ [0, 0, 1, 3, 6, 10, 15, 21]
352
+
353
+ sage: # needs sage.combinat sage.groups
354
+ sage: W = ColoredPermutations(1,3)
355
+ sage: W.number_of_reflections()
356
+ 3
357
+ sage: W = ColoredPermutations(2,3)
358
+ sage: W.number_of_reflections()
359
+ 9
360
+ sage: W = ColoredPermutations(4,3)
361
+ sage: W.number_of_reflections()
362
+ 21
363
+ sage: W = ReflectionGroup((4,2,3)) # optional - gap3
364
+ sage: W.number_of_reflections() # optional - gap3
365
+ 15
366
+ """
367
+ from sage.rings.integer_ring import ZZ
368
+ return ZZ.sum(deg - 1 for deg in self.degrees())
369
+
370
+ @cached_method
371
+ def rank(self):
372
+ r"""
373
+ Return the rank of ``self``.
374
+
375
+ The rank of ``self`` is the dimension of the smallest
376
+ faithfull reflection representation of ``self``.
377
+
378
+ This default implementation uses that the rank is the
379
+ number of :meth:`degrees`.
380
+
381
+ .. SEEALSO:: :meth:`ComplexReflectionGroups.rank`
382
+
383
+ EXAMPLES::
384
+
385
+ sage: # needs sage.combinat sage.groups
386
+ sage: W = ColoredPermutations(1,3)
387
+ sage: W.rank()
388
+ 2
389
+ sage: W = ColoredPermutations(2,3)
390
+ sage: W.rank()
391
+ 3
392
+ sage: W = ColoredPermutations(4,3)
393
+ sage: W.rank()
394
+ 3
395
+
396
+ sage: # optional - gap3, needs sage.combinat sage.groups
397
+ sage: W = ReflectionGroup((4,2,3))
398
+ sage: W.rank()
399
+ 3
400
+ """
401
+ return len(self.degrees())
402
+
403
+ @cached_method
404
+ def cardinality(self):
405
+ r"""
406
+ Return the cardinality of ``self``.
407
+
408
+ It is given by the product of the degrees of ``self``.
409
+
410
+ EXAMPLES::
411
+
412
+ sage: # needs sage.combinat sage.groups
413
+ sage: W = ColoredPermutations(1,3)
414
+ sage: W.cardinality()
415
+ 6
416
+ sage: W = ColoredPermutations(2,3)
417
+ sage: W.cardinality()
418
+ 48
419
+ sage: W = ColoredPermutations(4,3)
420
+ sage: W.cardinality()
421
+ 384
422
+
423
+ sage: # optional - gap3, needs sage.combinat sage.groups
424
+ sage: W = ReflectionGroup((4,2,3))
425
+ sage: W.cardinality()
426
+ 192
427
+ """
428
+ from sage.rings.integer_ring import ZZ
429
+ return ZZ.prod(self.degrees())
430
+
431
+ def is_well_generated(self) -> bool:
432
+ r"""
433
+ Return whether ``self`` is well-generated.
434
+
435
+ A finite complex reflection group is *well generated* if
436
+ the number of its simple reflections coincides with its rank.
437
+
438
+ .. SEEALSO:: :meth:`ComplexReflectionGroups.Finite.WellGenerated`
439
+
440
+ .. NOTE::
441
+
442
+ - All finite real reflection groups are well generated.
443
+ - The complex reflection groups of type `G(r,1,n)` and
444
+ of type `G(r,r,n)` are well generated.
445
+ - The complex reflection groups of type `G(r,p,n)`
446
+ with `1 < p < r` are *not* well generated.
447
+
448
+ - The direct product of two well generated finite
449
+ complex reflection group is still well generated.
450
+
451
+ EXAMPLES::
452
+
453
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
454
+ sage: W.is_well_generated() # needs sage.combinat
455
+ True
456
+
457
+ sage: W = ColoredPermutations(4,3) # needs sage.combinat
458
+ sage: W.is_well_generated() # needs sage.combinat
459
+ True
460
+
461
+ sage: # optional - gap3, needs sage.combinat sage.groups
462
+ sage: W = ReflectionGroup((4,2,3))
463
+ sage: W.is_well_generated()
464
+ False
465
+ sage: W = ReflectionGroup((4,4,3))
466
+ sage: W.is_well_generated()
467
+ True
468
+ """
469
+ return self.number_of_simple_reflections() == self.rank()
470
+
471
+ def is_real(self):
472
+ r"""
473
+ Return whether ``self`` is real.
474
+
475
+ A complex reflection group is *real* if it is isomorphic
476
+ to a reflection group in `GL(V)` over a real vector space `V`.
477
+ Equivalently its character table has real entries.
478
+
479
+ This implementation uses the following statement: an
480
+ irreducible complex reflection group is real if and only
481
+ if `2` is a degree of ``self`` with multiplicity one.
482
+ Hence, in general we just need to compare the number of
483
+ occurrences of `2` as degree of ``self`` and the number of
484
+ irreducible components.
485
+
486
+ EXAMPLES::
487
+
488
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
489
+ sage: W.is_real() # needs sage.combinat
490
+ True
491
+
492
+ sage: W = ColoredPermutations(4,3) # needs sage.combinat
493
+ sage: W.is_real() # needs sage.combinat sage.graphs
494
+ False
495
+
496
+ .. TODO::
497
+
498
+ Add an example of non real finite complex reflection
499
+ group that is generated by order 2 reflections.
500
+ """
501
+ return self.degrees().count(2) == self.number_of_irreducible_components()
502
+
503
+ @cached_method
504
+ def base_change_matrix(self):
505
+ r"""
506
+ Return the base change from the standard basis of the vector
507
+ space of ``self`` to the basis given by the independent roots of
508
+ ``self``.
509
+
510
+ .. TODO::
511
+
512
+ For non-well-generated groups there is a conflict with
513
+ construction of the matrix for an element.
514
+
515
+ EXAMPLES::
516
+
517
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
518
+ sage: W.base_change_matrix() # optional - gap3
519
+ [1 0]
520
+ [0 1]
521
+
522
+ sage: W = ReflectionGroup(23) # optional - gap3
523
+ sage: W.base_change_matrix() # optional - gap3
524
+ [1 0 0]
525
+ [0 1 0]
526
+ [0 0 1]
527
+
528
+ sage: W = ReflectionGroup((3,1,2)) # optional - gap3
529
+ sage: W.base_change_matrix() # optional - gap3
530
+ [1 0]
531
+ [1 1]
532
+
533
+ sage: W = ReflectionGroup((4,2,2)) # optional - gap3
534
+ sage: W.base_change_matrix() # optional - gap3
535
+ [ 1 0]
536
+ [E(4) 1]
537
+ """
538
+ from sage.matrix.constructor import Matrix
539
+ return Matrix(list(self.independent_roots())).inverse()
540
+
541
+ def milnor_fiber_poset(self):
542
+ r"""
543
+ Return the Milnor fiber poset of ``self``.
544
+
545
+ The *Milnor fiber poset* of a finite complex reflection group `W`
546
+ is defined as the poset of (right) standard cosets `gW_J`,
547
+ where `J` is a subset of the index set `I` of `W`, ordered
548
+ by reverse inclusion. This is conjecturally a meet semilattice
549
+ if and only if `W` is well-generated.
550
+
551
+ EXAMPLES::
552
+
553
+ sage: # needs sage.combinat sage.graphs sage.modules
554
+ sage: W = ColoredPermutations(3, 2)
555
+ sage: P = W.milnor_fiber_poset()
556
+ sage: P
557
+ Finite meet-semilattice containing 34 elements
558
+ sage: R.<x> = ZZ[]
559
+ sage: sum(x**P.rank(elt) for elt in P)
560
+ 18*x^2 + 15*x + 1
561
+
562
+ sage: # optional - gap3
563
+ sage: W = ReflectionGroup(4)
564
+ sage: P = W.milnor_fiber_poset(); P
565
+ Finite meet-semilattice containing 41 elements
566
+ sage: sum(x**P.rank(elt) for elt in P)
567
+ 24*x^2 + 16*x + 1
568
+
569
+ sage: # optional - gap3
570
+ sage: W = ReflectionGroup([4,2,2])
571
+ sage: W.is_well_generated()
572
+ False
573
+ sage: P = W.milnor_fiber_poset(); P
574
+ Finite poset containing 47 elements
575
+ sage: sum(x**P.rank(elt) for elt in P)
576
+ 16*x^3 + 24*x^2 + 6*x + 1
577
+ sage: P.is_meet_semilattice()
578
+ False
579
+ """
580
+ I = self.index_set()
581
+ data = {}
582
+ next_reprs = {(): list(self)}
583
+ next_cosets = {(): [frozenset([g]) for g in next_reprs[()]]}
584
+ next_level = {(i, ()) for i in range(len(next_cosets[()]))}
585
+ while next_level:
586
+ cur = next_level
587
+ cosets = next_cosets
588
+ reprs = next_reprs
589
+ next_level = set()
590
+ next_cosets = {}
591
+ next_reprs = {}
592
+ for Y in cur:
593
+ index, J = Y
594
+ for i in I:
595
+ if i in J:
596
+ continue
597
+ Jp = tuple(sorted(J + (i,)))
598
+ # See if the coset is already there
599
+ found_coset = False
600
+ if Jp in next_cosets:
601
+ rep = reprs[J][index]
602
+ for ii, C in enumerate(next_cosets[Jp]):
603
+ if rep in C:
604
+ found_coset = True
605
+ Yp = (reprs[J][index], J)
606
+ Xp = (next_reprs[Jp][ii], Jp)
607
+ if Xp in data:
608
+ data[Xp].append(Yp)
609
+ else:
610
+ data[Xp] = [Yp]
611
+ else:
612
+ next_cosets[Jp] = []
613
+ next_reprs[Jp] = []
614
+ if found_coset:
615
+ continue
616
+
617
+ # Otherwise build the coset
618
+ next_level.add((len(next_cosets[Jp]), Jp))
619
+ H = set(cosets[J][index])
620
+ to_test = [(g, i) for g in H]
621
+ while to_test:
622
+ g, j = to_test.pop()
623
+ gp = g.apply_simple_reflection(j, side='right')
624
+ if gp in H:
625
+ continue
626
+ H.add(gp)
627
+ to_test.extend((gp, j) for j in Jp)
628
+ rep = min(H, key=lambda g: g.length())
629
+ next_cosets[Jp].append(frozenset(H))
630
+ next_reprs[Jp].append(rep)
631
+ Yp = (reprs[J][index], J)
632
+ Xp = (rep, Jp)
633
+ if Xp in data:
634
+ data[Xp].append(Yp)
635
+ else:
636
+ data[Xp] = [Yp]
637
+ if self.is_well_generated():
638
+ from sage.combinat.posets.lattices import MeetSemilattice
639
+ return MeetSemilattice(data)
640
+ from sage.combinat.posets.posets import Poset
641
+ return Poset(data)
642
+
643
+ class ElementMethods:
644
+
645
+ @abstract_method(optional=True)
646
+ def to_matrix(self):
647
+ r"""
648
+ Return the matrix presentation of ``self`` acting on a
649
+ vector space `V`.
650
+
651
+ EXAMPLES::
652
+
653
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
654
+ sage: [t.to_matrix() for t in W] # optional - gap3
655
+ [
656
+ [1 0] [ 1 1] [-1 0] [-1 -1] [ 0 1] [ 0 -1]
657
+ [0 1], [ 0 -1], [ 1 1], [ 1 0], [-1 -1], [-1 0]
658
+ ]
659
+
660
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
661
+ sage: [t.to_matrix() for t in W] # needs sage.combinat sage.groups
662
+ [
663
+ [1 0 0] [1 0 0] [0 1 0] [0 0 1] [0 1 0] [0 0 1]
664
+ [0 1 0] [0 0 1] [1 0 0] [1 0 0] [0 0 1] [0 1 0]
665
+ [0 0 1], [0 1 0], [0 0 1], [0 1 0], [1 0 0], [1 0 0]
666
+ ]
667
+
668
+ A different representation is given by the
669
+ colored permutations::
670
+
671
+ sage: W = ColoredPermutations(3, 1) # needs sage.combinat
672
+ sage: [t.to_matrix() for t in W] # needs sage.combinat sage.groups
673
+ [[1], [zeta3], [-zeta3 - 1]]
674
+ """
675
+
676
+ def _matrix_(self):
677
+ """
678
+ Return ``self`` as a matrix.
679
+
680
+ EXAMPLES::
681
+
682
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
683
+ sage: [matrix(t) for t in W] # optional - gap3
684
+ [
685
+ [1 0] [ 1 1] [-1 0] [-1 -1] [ 0 1] [ 0 -1]
686
+ [0 1], [ 0 -1], [ 1 1], [ 1 0], [-1 -1], [-1 0]
687
+ ]
688
+ """
689
+ return self.to_matrix()
690
+
691
+ def character_value(self):
692
+ r"""
693
+ Return the value at ``self`` of the character of the
694
+ reflection representation given by :meth:`to_matrix`.
695
+
696
+ EXAMPLES::
697
+
698
+ sage: W = ColoredPermutations(1,3); W # needs sage.combinat
699
+ 1-colored permutations of size 3
700
+ sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
701
+ [3, 1, 1, 0, 0, 1]
702
+
703
+ Note that this could be a different (faithful)
704
+ representation than that given by the corresponding root
705
+ system::
706
+
707
+ sage: W = ReflectionGroup((1,1,3)); W # optional - gap3
708
+ Irreducible real reflection group of rank 2 and type A2
709
+ sage: [t.character_value() for t in W] # optional - gap3
710
+ [2, 0, 0, -1, -1, 0]
711
+
712
+ sage: W = ColoredPermutations(2,2); W # needs sage.combinat
713
+ 2-colored permutations of size 2
714
+ sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
715
+ [2, 0, 0, -2, 0, 0, 0, 0]
716
+
717
+ sage: W = ColoredPermutations(3,1); W # needs sage.combinat
718
+ 3-colored permutations of size 1
719
+ sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
720
+ [1, zeta3, -zeta3 - 1]
721
+ """
722
+ return self.to_matrix().trace()
723
+
724
+ # @cached_in_parent_method
725
+ def reflection_length(self, in_unitary_group=False):
726
+ r"""
727
+ Return the reflection length of ``self``.
728
+
729
+ This is the minimal numbers of reflections needed to
730
+ obtain ``self``.
731
+
732
+ INPUT:
733
+
734
+ - ``in_unitary_group`` -- boolean (default: ``False``); if
735
+ ``True``, the reflection length is computed in the unitary group
736
+ which is the dimension of the move space of ``self``
737
+
738
+ EXAMPLES::
739
+
740
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
741
+ sage: sorted([t.reflection_length() for t in W]) # optional - gap3
742
+ [0, 1, 1, 1, 2, 2]
743
+
744
+ sage: W = ReflectionGroup((2,1,2)) # optional - gap3
745
+ sage: sorted([t.reflection_length() for t in W]) # optional - gap3
746
+ [0, 1, 1, 1, 1, 2, 2, 2]
747
+
748
+ sage: W = ReflectionGroup((2,2,2)) # optional - gap3
749
+ sage: sorted([t.reflection_length() for t in W]) # optional - gap3
750
+ [0, 1, 1, 2]
751
+
752
+ sage: W = ReflectionGroup((3,1,2)) # optional - gap3
753
+ sage: sorted([t.reflection_length() for t in W]) # optional - gap3
754
+ [0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
755
+ """
756
+ W = self.parent()
757
+ if in_unitary_group or W.is_real():
758
+ from sage.matrix.special import identity_matrix
759
+ I = identity_matrix(self.parent().rank())
760
+ return W.rank() - (self.canonical_matrix() - I).right_nullity()
761
+ else:
762
+ return len(self.reduced_word_in_reflections())
763
+
764
+ class Irreducible(CategoryWithAxiom):
765
+
766
+ def example(self):
767
+ r"""
768
+ Return an example of an irreducible complex reflection group.
769
+
770
+ EXAMPLES::
771
+
772
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
773
+ sage: C = ComplexReflectionGroups().Finite().Irreducible()
774
+ sage: C.example() # optional - gap3
775
+ Irreducible complex reflection group of rank 3 and type G(4,2,3)
776
+ """
777
+ from sage.combinat.root_system.reflection_group_real import ReflectionGroup
778
+ return ReflectionGroup((4, 2, 3))
779
+
780
+ class ParentMethods:
781
+ def coxeter_number(self):
782
+ r"""
783
+ Return the Coxeter number of an irreducible
784
+ reflection group.
785
+
786
+ This is defined as `\frac{N + N^*}{n}` where
787
+ `N` is the number of reflections, `N^*` is the
788
+ number of reflection hyperplanes, and `n` is the
789
+ rank of ``self``.
790
+
791
+ EXAMPLES::
792
+
793
+ sage: W = ReflectionGroup(31) # optional - gap3
794
+ sage: W.coxeter_number() # optional - gap3
795
+ 30
796
+ """
797
+ return (self.number_of_reflection_hyperplanes()
798
+ + self.number_of_reflections()) // self.rank()
799
+
800
+ def absolute_order_ideal(self, gens=None,
801
+ in_unitary_group=True,
802
+ return_lengths=False):
803
+ r"""
804
+ Return all elements in ``self`` below given elements in the
805
+ absolute order of ``self``.
806
+
807
+ This order is defined by
808
+
809
+ .. MATH::
810
+
811
+ \omega \leq_R \tau \Leftrightarrow \ell_R(\omega) +
812
+ \ell_R(\omega^{-1} \tau) = \ell_R(\tau),
813
+
814
+ where `\ell_R` denotes the reflection length.
815
+
816
+ This is, if ``in_unitary_group`` is ``False``, then
817
+
818
+ .. MATH::
819
+
820
+ \ell_R(w) = \min\{ \ell: w = r_1\cdots r_\ell, r_i \in R \},
821
+
822
+ and otherwise
823
+
824
+ .. MATH::
825
+
826
+ \ell_R(w) = \dim\operatorname{im}(w - 1).
827
+
828
+ .. NOTE::
829
+
830
+ If ``gens`` are not given, ``self`` is assumed to be
831
+ well-generated.
832
+
833
+ INPUT:
834
+
835
+ - ``gens`` -- (default: ``None``) if one or more elements
836
+ are given, the order ideal in the absolute order generated
837
+ by ``gens`` is returned.
838
+ Otherwise, the standard Coxeter element is used as unique
839
+ maximal element.
840
+
841
+ - ``in_unitary_group`` -- (default: ``True``) determines the
842
+ length function used to compute the order.
843
+ For real groups, both possible orders coincide, and for
844
+ complex non-real groups, the order in the unitary group
845
+ is much faster to compute.
846
+
847
+ - ``return_lengths`` -- (default: ``False``) whether or not
848
+ to also return the lengths of the elements
849
+
850
+ EXAMPLES::
851
+
852
+ sage: # optional - gap3
853
+ sage: W = ReflectionGroup((1,1,3))
854
+ sage: sorted(w.reduced_word()
855
+ ....: for w in W.absolute_order_ideal())
856
+ [[], [1], [1, 2], [1, 2, 1], [2]]
857
+ sage: sorted(w.reduced_word()
858
+ ....: for w in W.absolute_order_ideal(W.from_reduced_word([2,1])))
859
+ [[], [1], [1, 2, 1], [2], [2, 1]]
860
+ sage: sorted(w.reduced_word()
861
+ ....: for w in W.absolute_order_ideal(W.from_reduced_word([2])))
862
+ [[], [2]]
863
+
864
+ sage: W = CoxeterGroup(['A', 3]) # needs sage.combinat sage.groups
865
+ sage: len(list(W.absolute_order_ideal())) # needs sage.combinat sage.groups
866
+ 14
867
+
868
+ sage: W = CoxeterGroup(['A', 2]) # needs sage.combinat sage.groups
869
+ sage: for (w, l) in W.absolute_order_ideal(return_lengths=True): # needs sage.combinat sage.groups
870
+ ....: print(w.reduced_word(), l)
871
+ [1, 2] 2
872
+ [1, 2, 1] 1
873
+ [2] 1
874
+ [1] 1
875
+ [] 0
876
+ """
877
+ from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet
878
+
879
+ if gens is None:
880
+ seeds = [(self.coxeter_element(), self.rank())]
881
+ else:
882
+ if gens in self:
883
+ gens = [gens]
884
+ seeds = [(gen, gen.reflection_length(in_unitary_group=in_unitary_group)) for gen in gens]
885
+
886
+ R = self.reflections()
887
+
888
+ def succ(seed):
889
+ w, w_len = seed
890
+ w_len -= 1
891
+ resu = []
892
+ for t in R:
893
+ u = w * t
894
+ if u.reflection_length(in_unitary_group=in_unitary_group) == w_len:
895
+ resu.append((u, w_len))
896
+ return resu
897
+ step = RecursivelyEnumeratedSet(seeds, succ,
898
+ structure='graded',
899
+ enumeration='breadth')
900
+ if return_lengths:
901
+ return step
902
+ return (x[0] for x in step)
903
+
904
+ # TODO: have a cached and an uncached version
905
+ @cached_method
906
+ def noncrossing_partition_lattice(self, c=None, L=None,
907
+ in_unitary_group=True):
908
+ r"""
909
+ Return the interval `[1,c]` in the absolute order of
910
+ ``self`` as a finite lattice.
911
+
912
+ .. SEEALSO:: :meth:`absolute_order_ideal`
913
+
914
+ INPUT:
915
+
916
+ - ``c`` -- (default: ``None``) if an element ``c`` in ``self`` is
917
+ given, it is used as the maximal element in the interval
918
+
919
+ - ``L`` -- (default: ``None``) if a subset ``L`` (must be hashable!)
920
+ of ``self`` is given, it is used as the underlying set (only
921
+ cover relations are checked).
922
+
923
+ - ``in_unitary_group`` -- boolean (default: ``False``); if
924
+ ``False``, the relation is given by `\sigma \leq \tau` if
925
+ `l_R(\sigma) + l_R(\sigma^{-1}\tau) = l_R(\tau)`;
926
+ if ``True``, the relation is given by `\sigma \leq \tau` if
927
+ `\dim(\mathrm{Fix}(\sigma)) + \dim(\mathrm{Fix}(\sigma^{-1}\tau))
928
+ = \dim(\mathrm{Fix}(\tau))`
929
+
930
+ .. NOTE::
931
+
932
+ If ``L`` is given, the parameter ``c`` is ignored.
933
+
934
+ EXAMPLES::
935
+
936
+ sage: W = SymmetricGroup(4) # needs sage.groups
937
+ sage: W.noncrossing_partition_lattice() # needs sage.combinat sage.groups
938
+ Finite lattice containing 14 elements
939
+
940
+ sage: W = WeylGroup(['G', 2]) # needs sage.combinat sage.groups
941
+ sage: W.noncrossing_partition_lattice() # needs sage.combinat sage.groups
942
+ Finite lattice containing 8 elements
943
+
944
+ sage: # optional - gap3
945
+ sage: W = ReflectionGroup((1,1,3))
946
+ sage: sorted(w.reduced_word()
947
+ ....: for w in W.noncrossing_partition_lattice())
948
+ [[], [1], [1, 2], [1, 2, 1], [2]]
949
+ sage: c21 = W.from_reduced_word([2,1])
950
+ sage: sorted(w.reduced_word()
951
+ ....: for w in W.noncrossing_partition_lattice(c21))
952
+ [[], [1], [1, 2, 1], [2], [2, 1]]
953
+ sage: c2 = W.from_reduced_word([2])
954
+ sage: sorted(w.reduced_word()
955
+ ....: for w in W.noncrossing_partition_lattice(c2))
956
+ [[], [2]]
957
+ """
958
+ from sage.combinat.posets.posets import Poset
959
+ from sage.combinat.posets.lattices import LatticePoset
960
+
961
+ R = self.reflections()
962
+ if L is None:
963
+ L = list(self.absolute_order_ideal(gens=c,
964
+ in_unitary_group=in_unitary_group,
965
+ return_lengths=True))
966
+ else:
967
+ L = [(pi, pi.reflection_length()) for pi in L]
968
+ rels = []
969
+ ref_lens = dict(L)
970
+ for (pi, l) in L:
971
+ for t in R:
972
+ tau = pi * t
973
+ if tau in ref_lens and l + 1 == ref_lens[tau]:
974
+ rels.append((pi, tau))
975
+
976
+ P = Poset(([], rels), cover_relations=True, facade=True)
977
+ if P.is_lattice():
978
+ P = LatticePoset(P)
979
+ return P
980
+
981
+ def generalized_noncrossing_partitions(self, m, c=None, positive=False):
982
+ r"""
983
+ Return the set of all chains of length `m` in the
984
+ noncrossing partition lattice of ``self``, see
985
+ :meth:`noncrossing_partition_lattice`.
986
+
987
+ .. NOTE::
988
+
989
+ ``self`` is assumed to be well-generated.
990
+
991
+ INPUT:
992
+
993
+ - ``c`` -- (default: ``None``) if an element `c` in ``self``
994
+ is given, it is used as the maximal element in the interval
995
+
996
+ - ``positive`` -- boolean (default: ``False``); if ``True``,
997
+ only those generalized noncrossing partitions of full support
998
+ are returned
999
+
1000
+ EXAMPLES::
1001
+
1002
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
1003
+
1004
+ sage: chains = W.generalized_noncrossing_partitions(2) # optional - gap3
1005
+ sage: sorted([w.reduced_word() for w in chain] # optional - gap3
1006
+ ....: for chain in chains)
1007
+ [[[], [], [1, 2]],
1008
+ [[], [1], [2]],
1009
+ [[], [1, 2], []],
1010
+ [[], [1, 2, 1], [1]],
1011
+ [[], [2], [1, 2, 1]],
1012
+ [[1], [], [2]],
1013
+ [[1], [2], []],
1014
+ [[1, 2], [], []],
1015
+ [[1, 2, 1], [], [1]],
1016
+ [[1, 2, 1], [1], []],
1017
+ [[2], [], [1, 2, 1]],
1018
+ [[2], [1, 2, 1], []]]
1019
+
1020
+ sage: chains = W.generalized_noncrossing_partitions(2, # optional - gap3
1021
+ ....: positive=True)
1022
+ sage: sorted([w.reduced_word() for w in chain] # optional - gap3
1023
+ ....: for chain in chains)
1024
+ [[[], [1, 2], []],
1025
+ [[], [1, 2, 1], [1]],
1026
+ [[1], [2], []],
1027
+ [[1, 2], [], []],
1028
+ [[1, 2, 1], [], [1]],
1029
+ [[1, 2, 1], [1], []],
1030
+ [[2], [1, 2, 1], []]]
1031
+ """
1032
+ from sage.combinat.combination import Combinations
1033
+ NC = self.noncrossing_partition_lattice(c=c)
1034
+ one = self.one()
1035
+ if c is None:
1036
+ c = self.coxeter_element()
1037
+ chains = NC.chains()
1038
+ NCm = set()
1039
+ iter = chains.breadth_first_search_iterator()
1040
+ next(iter)
1041
+ chain = next(iter)
1042
+ while len(chain) <= m:
1043
+ chain.append(c)
1044
+ for i in range(len(chain) - 1, 0, -1):
1045
+ chain[i] = chain[i - 1]**-1 * chain[i]
1046
+ k = m + 1 - len(chain)
1047
+ for positions in Combinations(range(m + 1), k):
1048
+ ncm = []
1049
+ for l in range(m + 1):
1050
+ if l in positions:
1051
+ ncm.append(one)
1052
+ else:
1053
+ l_prime = l - len([i for i in positions if i <= l])
1054
+ ncm.append(chain[l_prime])
1055
+ if not positive or prod(ncm[:-1]).has_full_support():
1056
+ NCm.add(tuple(ncm))
1057
+ try:
1058
+ chain = next(iter)
1059
+ except StopIteration:
1060
+ chain = list(range(m + 1))
1061
+ return NCm
1062
+
1063
+ # TODO: have a cached and an uncached version
1064
+ def absolute_poset(self, in_unitary_group=False):
1065
+ r"""
1066
+ Return the poset induced by the absolute order of ``self``
1067
+ as a finite lattice.
1068
+
1069
+ INPUT:
1070
+
1071
+ - ``in_unitary_group`` -- boolean (default: ``False``); if
1072
+ ``False``, the relation is given by ``\sigma \leq \tau`` if
1073
+ `l_R(\sigma) + l_R(\sigma^{-1}\tau) = l_R(\tau)`
1074
+ If ``True``, the relation is given by `\sigma \leq \tau` if
1075
+ `\dim(\mathrm{Fix}(\sigma)) + \dim(\mathrm{Fix}(\sigma^{-1}\tau))
1076
+ = \dim(\mathrm{Fix}(\tau))`
1077
+
1078
+ .. SEEALSO:: :meth:`noncrossing_partition_lattice`
1079
+
1080
+ EXAMPLES::
1081
+
1082
+ sage: P = ReflectionGroup((1,1,3)).absolute_poset(); P # optional - gap3
1083
+ Finite poset containing 6 elements
1084
+
1085
+ sage: sorted(w.reduced_word() for w in P) # optional - gap3
1086
+ [[], [1], [1, 2], [1, 2, 1], [2], [2, 1]]
1087
+
1088
+ sage: W = ReflectionGroup(4); W # optional - gap3
1089
+ Irreducible complex reflection group of rank 2 and type ST4
1090
+ sage: W.absolute_poset() # optional - gap3
1091
+ Finite poset containing 24 elements
1092
+
1093
+ TESTS::
1094
+
1095
+ sage: # needs sage.combinat sage.groups
1096
+ sage: W1 = CoxeterGroup(['A', 2])
1097
+ sage: W2 = WeylGroup(['A', 2])
1098
+ sage: W3 = SymmetricGroup(3)
1099
+ sage: W1.absolute_poset()
1100
+ Finite poset containing 6 elements
1101
+ sage: W2.absolute_poset()
1102
+ Finite poset containing 6 elements
1103
+ sage: W3.absolute_poset()
1104
+ Finite poset containing 6 elements
1105
+ """
1106
+ return self.noncrossing_partition_lattice(L=tuple(self), in_unitary_group=in_unitary_group)
1107
+
1108
+ class WellGenerated(CategoryWithAxiom):
1109
+
1110
+ def example(self):
1111
+ r"""
1112
+ Return an example of a well-generated complex reflection group.
1113
+
1114
+ EXAMPLES::
1115
+
1116
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
1117
+ sage: C = ComplexReflectionGroups().Finite().WellGenerated()
1118
+ sage: C.example() # optional - gap3
1119
+ Reducible complex reflection group of rank 4 and type A2 x G(3,1,2)
1120
+ """
1121
+ from sage.combinat.root_system.reflection_group_real import ReflectionGroup
1122
+ return ReflectionGroup((1, 1, 3), (3, 1, 2))
1123
+
1124
+ class ParentMethods:
1125
+ def _test_well_generated(self, **options):
1126
+ """
1127
+ Check if ``self`` is well-generated.
1128
+
1129
+ EXAMPLES::
1130
+
1131
+ sage: W = ReflectionGroup((3,1,2)) # optional - gap3
1132
+ sage: W._test_well_generated() # optional - gap3
1133
+ """
1134
+ tester = self._tester(**options)
1135
+ tester.assertEqual(self.number_of_simple_reflections(), self.rank())
1136
+
1137
+ def is_well_generated(self):
1138
+ r"""
1139
+ Return ``True`` as ``self`` is well-generated.
1140
+
1141
+ EXAMPLES::
1142
+
1143
+ sage: W = ReflectionGroup((3,1,2)) # optional - gap3
1144
+ sage: W.is_well_generated() # optional - gap3
1145
+ True
1146
+ """
1147
+ return True
1148
+
1149
+ coxeter_element = CoxeterGroups.ParentMethods.coxeter_element
1150
+ standard_coxeter_elements = CoxeterGroups.ParentMethods.standard_coxeter_elements
1151
+
1152
+ @cached_method
1153
+ def coxeter_elements(self):
1154
+ r"""
1155
+ Return the (unique) conjugacy class in ``self`` containing all
1156
+ Coxeter elements.
1157
+
1158
+ A Coxeter element is an element that has an eigenvalue
1159
+ `e^{2\pi i/h}` where `h` is the Coxeter number.
1160
+
1161
+ In case of finite Coxeter groups, these are exactly the
1162
+ elements that are conjugate to one (or, equivalently,
1163
+ all) standard Coxeter element, this is, to an element
1164
+ that is the product of the simple generators in some
1165
+ order.
1166
+
1167
+ .. SEEALSO:: :meth:`~sage.categories.coxeter_groups.standard_coxeter_elements`
1168
+
1169
+ EXAMPLES::
1170
+
1171
+ sage: W = ReflectionGroup((1,1,3)) # optional - gap3
1172
+ sage: sorted(c.reduced_word() # optional - gap3
1173
+ ....: for c in W.coxeter_elements())
1174
+ [[1, 2], [2, 1]]
1175
+
1176
+ sage: W = ReflectionGroup((1,1,4)) # optional - gap3
1177
+ sage: sorted(c.reduced_word() # optional - gap3
1178
+ ....: for c in W.coxeter_elements())
1179
+ [[1, 2, 1, 3, 2], [1, 2, 3], [1, 3, 2],
1180
+ [2, 1, 3], [2, 1, 3, 2, 1], [3, 2, 1]]
1181
+ """
1182
+ return self.coxeter_element().conjugacy_class()
1183
+
1184
+ def milnor_fiber_complex(self):
1185
+ r"""
1186
+ Return the Milnor fiber complex of ``self``.
1187
+
1188
+ The *Milnor fiber complex* of a finite well-generated
1189
+ complex reflection group `W` is the simplicial complex whose
1190
+ face poset is given by :meth:`milnor_fiber_poset`. When `W`
1191
+ is an irreducible Shephard group, it is also an equivariant
1192
+ strong deformation retract of the Milnor fiber `f_1^{-1}(1)`,
1193
+ where `f_1: V \to \CC` is the polynomial invariant of smallest
1194
+ degree acting on the reflection representation `V`.
1195
+
1196
+ When `W` is a Coxeter group, this is isomorphic to the
1197
+ :wikipedia:`Coxeter complex <Coxeter_complex>` of `W`.
1198
+
1199
+ EXAMPLES::
1200
+
1201
+ sage: W = ColoredPermutations(3, 2) # needs sage.combinat
1202
+ sage: C = W.milnor_fiber_complex() # needs sage.combinat sage.graphs
1203
+ sage: C.homology() # needs sage.combinat sage.graphs sage.modules
1204
+ {0: 0, 1: Z x Z x Z x Z}
1205
+
1206
+ sage: W = ReflectionGroup(5) # optional - gap3
1207
+ sage: C = W.milnor_fiber_complex() # optional - gap3
1208
+ sage: C.homology() # optional - gap3
1209
+ {0: 0, 1: Z^25}
1210
+ """
1211
+ I = self.index_set()
1212
+ cosets = {}
1213
+ for i in I:
1214
+ Ip = tuple([j for j in I if j != i])
1215
+ cosets[Ip] = []
1216
+ for g in self:
1217
+ if any(g in C for C in cosets[Ip]):
1218
+ continue
1219
+ H = {g}
1220
+ to_test = [(g, j) for j in Ip]
1221
+ while to_test:
1222
+ h, j = to_test.pop()
1223
+ hp = h.apply_simple_reflection(j, side='right')
1224
+ if hp in H:
1225
+ continue
1226
+ H.add(hp)
1227
+ to_test.extend((hp, j) for j in Ip)
1228
+ cosets[Ip].append(frozenset(H))
1229
+ verts = {}
1230
+ for Ip, cosetsIp in cosets.items():
1231
+ for C in cosetsIp:
1232
+ verts[C, Ip] = len(verts)
1233
+ facets = [[verts[k] for k in verts if g in k[0]] for g in self]
1234
+ from sage.topology.simplicial_complex import SimplicialComplex
1235
+ return SimplicialComplex(facets)
1236
+
1237
+ class Irreducible(CategoryWithAxiom):
1238
+ r"""
1239
+ The category of finite irreducible well-generated
1240
+ finite complex reflection groups.
1241
+ """
1242
+ def example(self):
1243
+ r"""
1244
+ Return an example of an irreducible well-generated
1245
+ complex reflection group.
1246
+
1247
+ EXAMPLES::
1248
+
1249
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
1250
+ sage: C = ComplexReflectionGroups().Finite().WellGenerated().Irreducible()
1251
+ sage: C.example() # needs sage.combinat
1252
+ 4-colored permutations of size 3
1253
+ """
1254
+ from sage.combinat.colored_permutations import ColoredPermutations
1255
+ return ColoredPermutations(4, 3)
1256
+
1257
+ class ParentMethods:
1258
+ def coxeter_number(self):
1259
+ r"""
1260
+ Return the Coxeter number of a well-generated,
1261
+ irreducible reflection group. This is defined to be
1262
+ the order of a regular element in ``self``, and is
1263
+ equal to the highest degree of ``self``.
1264
+
1265
+ .. SEEALSO:: :meth:`ComplexReflectionGroups.Finite.Irreducible`
1266
+
1267
+ .. NOTE::
1268
+
1269
+ This method overwrites the more general
1270
+ method for complex reflection groups since
1271
+ the expression given here is quicker to
1272
+ compute.
1273
+
1274
+ EXAMPLES::
1275
+
1276
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
1277
+ sage: W.coxeter_number() # needs sage.combinat
1278
+ 3
1279
+
1280
+ sage: W = ColoredPermutations(4,3) # needs sage.combinat
1281
+ sage: W.coxeter_number() # needs sage.combinat
1282
+ 12
1283
+
1284
+ sage: W = ReflectionGroup((4,4,3)) # optional - gap3
1285
+ sage: W.coxeter_number() # optional - gap3
1286
+ 8
1287
+ """
1288
+ return max(self.degrees())
1289
+
1290
+ def number_of_reflections_of_full_support(self):
1291
+ r"""
1292
+ Return the number of reflections with full
1293
+ support.
1294
+
1295
+ EXAMPLES::
1296
+
1297
+ sage: W = Permutations(4)
1298
+ sage: W.number_of_reflections_of_full_support()
1299
+ 1
1300
+
1301
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
1302
+ sage: W.number_of_reflections_of_full_support()
1303
+ 1
1304
+
1305
+ sage: W = CoxeterGroup("B3") # needs sage.combinat sage.groups
1306
+ sage: W.number_of_reflections_of_full_support() # needs sage.combinat sage.groups
1307
+ 3
1308
+
1309
+ sage: W = ColoredPermutations(3,3) # needs sage.combinat
1310
+ sage: W.number_of_reflections_of_full_support() # needs sage.combinat
1311
+ 3
1312
+ """
1313
+ n = self.rank()
1314
+ h = self.coxeter_number()
1315
+ l = self.cardinality()
1316
+ return (n * h * prod(d for d in self.codegrees() if d != 0)) // l
1317
+
1318
+ @cached_method
1319
+ def rational_catalan_number(self, p, polynomial=False):
1320
+ r"""
1321
+ Return the ``p``-th rational Catalan number
1322
+ associated to ``self``.
1323
+
1324
+ It is defined by
1325
+
1326
+ .. MATH::
1327
+
1328
+ \prod_{i = 1}^n \frac{p + (p(d_i-1)) \mod h)}{d_i},
1329
+
1330
+ where `d_1, \ldots, d_n` are the degrees and
1331
+ `h` is the Coxeter number. See [STW2016]_
1332
+ for this formula.
1333
+
1334
+ INPUT:
1335
+
1336
+ - ``polynomial`` -- boolean (default: ``False``);
1337
+ if ``True``, return instead the `q`-analogue as a
1338
+ polynomial in `q`
1339
+
1340
+ EXAMPLES::
1341
+
1342
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
1343
+ sage: [W.rational_catalan_number(p) for p in [5,7,8]] # needs sage.combinat
1344
+ [7, 12, 15]
1345
+
1346
+ sage: W = ColoredPermutations(2,2) # needs sage.combinat
1347
+ sage: [W.rational_catalan_number(p) for p in [7,9,11]] # needs sage.combinat
1348
+ [10, 15, 21]
1349
+
1350
+ TESTS::
1351
+
1352
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
1353
+ sage: W.rational_catalan_number(3, polynomial=True) # needs sage.combinat
1354
+ q^6 + q^4 + q^3 + q^2 + 1
1355
+ """
1356
+ from sage.arith.misc import GCD as gcd
1357
+ from sage.combinat.q_analogues import q_int
1358
+
1359
+ h = self.coxeter_number()
1360
+ if not gcd(h, p) == 1:
1361
+ raise ValueError("parameter p = %s is not coprime to the Coxeter number %s" % (p, h))
1362
+
1363
+ if polynomial:
1364
+ f = q_int
1365
+ else:
1366
+
1367
+ def f(n):
1368
+ return n
1369
+
1370
+ num = prod(f(p + (p * (deg - 1)) % h)
1371
+ for deg in self.degrees())
1372
+ den = prod(f(deg) for deg in self.degrees())
1373
+ return num // den
1374
+
1375
+ def fuss_catalan_number(self, m, positive=False,
1376
+ polynomial=False):
1377
+ r"""
1378
+ Return the ``m``-th Fuss-Catalan number
1379
+ associated to ``self``.
1380
+
1381
+ This is defined by
1382
+
1383
+ .. MATH::
1384
+
1385
+ \prod_{i = 1}^n \frac{d_i + mh}{d_i},
1386
+
1387
+ where `d_1, \ldots, d_n` are the degrees and
1388
+ `h` is the Coxeter number.
1389
+
1390
+ INPUT:
1391
+
1392
+ - ``positive`` -- boolean (default: ``False``); if
1393
+ ``True``, return instead the positive Fuss-Catalan number
1394
+ - ``polynomial`` -- boolean (default: ``False``); if
1395
+ ``True``, return instead the `q`-analogue as a polynomial
1396
+ in `q`
1397
+
1398
+ See [Ar2006]_ for further information.
1399
+
1400
+ .. NOTE::
1401
+
1402
+ - For the symmetric group `S_n`, it reduces to the
1403
+ Fuss-Catalan number `\frac{1}{mn+1}\binom{(m+1)n}{n}`.
1404
+ - The Fuss-Catalan numbers for `G(r, 1, n)` all
1405
+ coincide for `r > 1`.
1406
+
1407
+ EXAMPLES::
1408
+
1409
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
1410
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1411
+ [5, 12, 22]
1412
+
1413
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
1414
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1415
+ [14, 55, 140]
1416
+
1417
+ sage: W = ColoredPermutations(1,5) # needs sage.combinat
1418
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1419
+ [42, 273, 969]
1420
+
1421
+ sage: W = ColoredPermutations(2,2) # needs sage.combinat
1422
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1423
+ [6, 15, 28]
1424
+
1425
+ sage: W = ColoredPermutations(2,3) # needs sage.combinat
1426
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1427
+ [20, 84, 220]
1428
+
1429
+ sage: W = ColoredPermutations(2,4) # needs sage.combinat
1430
+ sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
1431
+ [70, 495, 1820]
1432
+
1433
+ TESTS::
1434
+
1435
+ sage: # needs sage.combinat sage.groups
1436
+ sage: W = ColoredPermutations(2,4)
1437
+ sage: W.fuss_catalan_number(2, positive=True)
1438
+ 330
1439
+ sage: W = ColoredPermutations(2,2)
1440
+ sage: W.fuss_catalan_number(2, polynomial=True)
1441
+ q^16 + q^14 + 2*q^12 + 2*q^10 + 3*q^8 + 2*q^6 +
1442
+ 2*q^4 + q^2 + 1
1443
+ """
1444
+ h = self.coxeter_number()
1445
+ if positive:
1446
+ p = m * h - 1
1447
+ else:
1448
+ p = m * h + 1
1449
+
1450
+ return self.rational_catalan_number(p, polynomial=polynomial)
1451
+
1452
+ def catalan_number(self, positive=False, polynomial=False):
1453
+ r"""
1454
+ Return the Catalan number associated to ``self``.
1455
+
1456
+ It is defined by
1457
+
1458
+ .. MATH::
1459
+
1460
+ \prod_{i = 1}^n \frac{d_i + h}{d_i},
1461
+
1462
+ where `d_1, \ldots, d_n` are the degrees and where
1463
+ `h` is the Coxeter number.
1464
+ See [Ar2006]_ for further information.
1465
+
1466
+ INPUT:
1467
+
1468
+ - ``positive`` -- boolean (default: ``False``); if
1469
+ ``True``, return instead the positive Catalan number
1470
+ - ``polynomial`` -- boolean (default: ``False``); if
1471
+ ``True``, return instead the `q`-analogue as a polynomial
1472
+ in `q`
1473
+
1474
+ .. NOTE::
1475
+
1476
+ - For the symmetric group `S_n`, it reduces to the
1477
+ Catalan number `\frac{1}{n+1} \binom{2n}{n}`.
1478
+ - The Catalan numbers for `G(r,1,n)` all coincide
1479
+ for `r > 1`.
1480
+
1481
+ EXAMPLES::
1482
+
1483
+ sage: [ColoredPermutations(1,n).catalan_number() # needs sage.combinat
1484
+ ....: for n in [3,4,5]]
1485
+ [5, 14, 42]
1486
+
1487
+ sage: [ColoredPermutations(2,n).catalan_number() # needs sage.combinat
1488
+ ....: for n in [3,4,5]]
1489
+ [20, 70, 252]
1490
+
1491
+ sage: [ReflectionGroup((2,2,n)).catalan_number() # optional - gap3
1492
+ ....: for n in [3,4,5]]
1493
+ [14, 50, 182]
1494
+
1495
+ TESTS::
1496
+
1497
+ sage: # needs sage.combinat sage.groups
1498
+ sage: W = ColoredPermutations(3,6)
1499
+ sage: W.catalan_number(positive=True)
1500
+ 462
1501
+ sage: W = ColoredPermutations(2,2)
1502
+ sage: W.catalan_number(polynomial=True)
1503
+ q^8 + q^6 + 2*q^4 + q^2 + 1
1504
+ """
1505
+ return self.fuss_catalan_number(1, positive=positive,
1506
+ polynomial=polynomial)