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,1249 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.groups
3
+ r"""
4
+ Common category for Generalized Coxeter Groups or Complex Reflection Groups
5
+ """
6
+ # ****************************************************************************
7
+ # Copyright (C) 2016 Nicolas M. Thiéry <nthiery at users.sf.net>
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 2 of the License, or
12
+ # (at your option) any later version.
13
+ # https://www.gnu.org/licenses/
14
+ # ****************************************************************************
15
+
16
+ import itertools
17
+ from sage.misc.abstract_method import abstract_method
18
+ from sage.misc.cachefunc import cached_method
19
+ from sage.categories.category_singleton import Category_singleton
20
+ from sage.categories.category_with_axiom import CategoryWithAxiom
21
+ from sage.categories.groups import Groups
22
+
23
+
24
+ class ComplexReflectionOrGeneralizedCoxeterGroups(Category_singleton):
25
+ r"""
26
+ The category of complex reflection groups or generalized Coxeter groups.
27
+
28
+ Finite Coxeter groups can be defined equivalently as groups
29
+ generated by reflections, or by presentations. Over the last
30
+ decades, the theory has been generalized in both directions,
31
+ leading to the study of (finite) complex reflection groups on the
32
+ one hand, and (finite) generalized Coxeter groups on the other
33
+ hand. Many of the features remain similar, yet, in the current
34
+ state of the art, there is no general theory covering both
35
+ directions.
36
+
37
+ This is reflected by the name of this category which is about
38
+ factoring out the common code, tests, and declarations.
39
+
40
+ A group in this category has:
41
+
42
+ - A distinguished finite set of generators `(s_i)_I`, called
43
+ *simple reflections*. The set `I` is called the *index set*. The
44
+ name "reflection" is somewhat of an abuse as they can have
45
+ higher order; still, they are all of finite order: `s_i^k=1` for
46
+ some `k`.
47
+
48
+ - A collection of *distinguished reflections* which are the
49
+ conjugates of the simple reflections. For complex reflection
50
+ groups, they are in one-to-one correspondence with the
51
+ reflection hyperplanes and share the same index set.
52
+
53
+ - A collection of *reflections* which are the conjugates of all
54
+ the non trivial powers of the simple reflections.
55
+
56
+ The usual notions of reduced words, length, irreducibility, etc.,
57
+ can be canonically defined from the above.
58
+
59
+ The following methods must be implemented:
60
+
61
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ParentMethods.index_set`
62
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ParentMethods.simple_reflection`
63
+
64
+ Optionally one can define analog methods for distinguished
65
+ reflections and reflections (see below).
66
+
67
+ At least one of the following methods must be implemented:
68
+
69
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection`
70
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection_left`
71
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection_right`
72
+ - :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods._mul_`
73
+
74
+ It's recommended to implement either ``_mul_`` or both
75
+ ``apply_simple_reflection_left`` and ``apply_simple_reflection_right``.
76
+
77
+ .. SEEALSO::
78
+
79
+ - :class:`complex_reflection_groups.ComplexReflectionGroups`
80
+ - :class:`generalized_coxeter_groups.GeneralizedCoxeterGroups`
81
+
82
+ EXAMPLES::
83
+
84
+ sage: from sage.categories.complex_reflection_or_generalized_coxeter_groups import ComplexReflectionOrGeneralizedCoxeterGroups
85
+ sage: C = ComplexReflectionOrGeneralizedCoxeterGroups(); C
86
+ Category of complex reflection or generalized Coxeter groups
87
+ sage: C.super_categories()
88
+ [Category of finitely generated enumerated groups]
89
+
90
+ sage: C.required_methods()
91
+ {'element': {'optional': ['reflection_length'],
92
+ 'required': []},
93
+ 'parent': {'optional': ['distinguished_reflection', 'hyperplane_index_set',
94
+ 'irreducible_components',
95
+ 'reflection', 'reflection_index_set'],
96
+ 'required': ['__contains__', 'index_set']}}
97
+
98
+ TESTS::
99
+
100
+ sage: TestSuite(C).run()
101
+ """
102
+
103
+ @cached_method
104
+ def super_categories(self):
105
+ r"""
106
+ Return the super categories of ``self``.
107
+
108
+ EXAMPLES::
109
+
110
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
111
+ sage: ComplexReflectionGroups().super_categories()
112
+ [Category of complex reflection or generalized Coxeter groups]
113
+ """
114
+ return [Groups().FinitelyGenerated()]
115
+
116
+ class SubcategoryMethods:
117
+ def Irreducible(self):
118
+ r"""
119
+ Return the full subcategory of irreducible objects of ``self``.
120
+
121
+ A complex reflection group, or generalized Coxeter group
122
+ is *reducible* if its simple reflections can be split in
123
+ two sets `X` and `Y` such that the elements of `X` commute
124
+ with that of `Y`. In particular, the group is then direct
125
+ product of `\langle X \rangle` and `\langle Y \rangle`.
126
+ It's *irreducible* otherwise.
127
+
128
+ EXAMPLES::
129
+
130
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
131
+ sage: ComplexReflectionGroups().Irreducible()
132
+ Category of irreducible complex reflection groups
133
+ sage: CoxeterGroups().Irreducible()
134
+ Category of irreducible Coxeter groups
135
+
136
+ TESTS::
137
+
138
+ sage: TestSuite(ComplexReflectionGroups().Irreducible()).run()
139
+ sage: CoxeterGroups().Irreducible.__module__
140
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
141
+ """
142
+ return self._with_axiom('Irreducible')
143
+
144
+ class ParentMethods:
145
+ @abstract_method
146
+ def index_set(self):
147
+ r"""
148
+ Return the index set of (the simple reflections of)
149
+ ``self``, as a list (or iterable).
150
+
151
+ .. SEEALSO::
152
+
153
+ - :meth:`simple_reflection`
154
+ - :meth:`simple_reflections`
155
+
156
+ EXAMPLES::
157
+
158
+ sage: W = CoxeterGroups().Finite().example(); W
159
+ The 5-th dihedral group of order 10
160
+ sage: W.index_set()
161
+ (1, 2)
162
+
163
+ sage: W = ColoredPermutations(1, 4) # needs sage.combinat
164
+ sage: W.index_set() # needs sage.combinat
165
+ (1, 2, 3)
166
+
167
+ sage: # optional - gap3
168
+ sage: W = ReflectionGroup((1,1,4), index_set=[1,3,'asdf'])
169
+ sage: W.index_set()
170
+ (1, 3, 'asdf')
171
+ sage: W = ReflectionGroup((1,1,4), index_set=('a','b','c'))
172
+ sage: W.index_set()
173
+ ('a', 'b', 'c')
174
+ """
175
+ # return self.simple_reflections().keys()
176
+
177
+ def simple_reflection(self, i):
178
+ """
179
+ Return the `i`-th simple reflection `s_i` of ``self``.
180
+
181
+ INPUT:
182
+
183
+ - ``i`` -- an element from the index set
184
+
185
+ .. SEEALSO::
186
+
187
+ - :meth:`index_set`
188
+ - :meth:`simple_reflections`
189
+
190
+ EXAMPLES::
191
+
192
+ sage: W = CoxeterGroups().example(); W
193
+ The symmetric group on {0, ..., 3}
194
+ sage: W.simple_reflection(1)
195
+ (0, 2, 1, 3)
196
+ sage: s = W.simple_reflections()
197
+ sage: s[1]
198
+ (0, 2, 1, 3)
199
+
200
+ sage: W = ReflectionGroup((1,1,4), index_set=[1,3,'asdf']) # optional - gap3
201
+ sage: for i in W.index_set(): # optional - gap3
202
+ ....: print('%s %s'%(i, W.simple_reflection(i)))
203
+ 1 (1,7)(2,4)(5,6)(8,10)(11,12)
204
+ 3 (1,4)(2,8)(3,5)(7,10)(9,11)
205
+ asdf (2,5)(3,9)(4,6)(8,11)(10,12)
206
+ """
207
+ if i not in self.index_set():
208
+ raise ValueError("%s is not in the Dynkin node set %s" % (i, self.index_set()))
209
+ return self.one().apply_simple_reflection(i) # don't care about left/right
210
+
211
+ @cached_method
212
+ def simple_reflections(self):
213
+ r"""
214
+ Return the simple reflections `(s_i)_{i\in I}` of ``self`` as
215
+ a family indexed by :meth:`index_set`.
216
+
217
+ .. SEEALSO::
218
+
219
+ - :meth:`simple_reflection`
220
+ - :meth:`index_set`
221
+
222
+ EXAMPLES:
223
+
224
+ For the symmetric group, we recognize the simple transpositions::
225
+
226
+ sage: W = SymmetricGroup(4); W
227
+ Symmetric group of order 4! as a permutation group
228
+ sage: s = W.simple_reflections(); s
229
+ Finite family {1: (1,2), 2: (2,3), 3: (3,4)}
230
+ sage: s[1]
231
+ (1,2)
232
+ sage: s[2]
233
+ (2,3)
234
+ sage: s[3]
235
+ (3,4)
236
+
237
+ Here are the simple reflections for a colored symmetric
238
+ group and a reflection group::
239
+
240
+ sage: W = ColoredPermutations(1,3) # needs sage.combinat
241
+ sage: W.simple_reflections() # needs sage.combinat
242
+ Finite family {1: [[0, 0, 0], [2, 1, 3]], 2: [[0, 0, 0], [1, 3, 2]]}
243
+
244
+ sage: W = ReflectionGroup((1,1,3), index_set=['a','b']) # optional - gap3
245
+ sage: W.simple_reflections() # optional - gap3
246
+ Finite family {'a': (1,4)(2,3)(5,6), 'b': (1,3)(2,5)(4,6)}
247
+
248
+ This default implementation uses :meth:`.index_set` and
249
+ :meth:`.simple_reflection`.
250
+ """
251
+ from sage.sets.family import Family
252
+ return Family(self.index_set(), self.simple_reflection)
253
+
254
+ def number_of_simple_reflections(self):
255
+ r"""
256
+ Return the number of simple reflections of ``self``.
257
+
258
+ EXAMPLES::
259
+
260
+ sage: # needs sage.combinat
261
+ sage: W = ColoredPermutations(1,3)
262
+ sage: W.number_of_simple_reflections()
263
+ 2
264
+ sage: W = ColoredPermutations(2,3)
265
+ sage: W.number_of_simple_reflections()
266
+ 3
267
+ sage: W = ColoredPermutations(4,3)
268
+ sage: W.number_of_simple_reflections()
269
+ 3
270
+
271
+ sage: W = ReflectionGroup((4,2,3)) # optional - gap3
272
+ sage: W.number_of_simple_reflections() # optional - gap3
273
+ 4
274
+ """
275
+ return len(self.index_set())
276
+
277
+ ##########################################################################
278
+ # Group generators, etc from simple reflections
279
+ ##########################################################################
280
+
281
+ def group_generators(self):
282
+ r"""
283
+ Return the simple reflections of ``self``, as
284
+ distinguished group generators.
285
+
286
+ .. SEEALSO::
287
+
288
+ - :meth:`simple_reflections`
289
+ - :meth:`Groups.ParentMethods.group_generators`
290
+ - :meth:`Semigroups.ParentMethods.semigroup_generators`
291
+
292
+ EXAMPLES::
293
+
294
+ sage: D10 = FiniteCoxeterGroups().example(10)
295
+ sage: D10.group_generators()
296
+ Finite family {1: (1,), 2: (2,)}
297
+ sage: SymmetricGroup(5).group_generators()
298
+ Finite family {1: (1,2), 2: (2,3), 3: (3,4), 4: (4,5)}
299
+
300
+ sage: W = ColoredPermutations(3,2) # needs sage.combinat
301
+ sage: W.group_generators() # needs sage.combinat
302
+ Finite family {1: [[0, 0],
303
+ [2, 1]],
304
+ 2: [[0, 1],
305
+ [1, 2]]}
306
+
307
+ The simple reflections are also semigroup generators, even
308
+ for an infinite group::
309
+
310
+ sage: W = WeylGroup(["A",2,1]) # needs sage.rings.number_field
311
+ sage: W.semigroup_generators() # needs sage.rings.number_field
312
+ Finite family {0: [-1 1 1]
313
+ [ 0 1 0]
314
+ [ 0 0 1],
315
+ 1: [ 1 0 0]
316
+ [ 1 -1 1]
317
+ [ 0 0 1],
318
+ 2: [ 1 0 0]
319
+ [ 0 1 0]
320
+ [ 1 1 -1]}
321
+ """
322
+ return self.simple_reflections()
323
+
324
+ semigroup_generators = group_generators
325
+
326
+ def simple_reflection_orders(self):
327
+ """
328
+ Return the orders of the simple reflections.
329
+
330
+ EXAMPLES::
331
+
332
+ sage: # needs sage.rings.number_field
333
+ sage: W = WeylGroup(['B',3])
334
+ sage: W.simple_reflection_orders()
335
+ [2, 2, 2]
336
+ sage: W = CoxeterGroup(['C',4])
337
+ sage: W.simple_reflection_orders()
338
+ [2, 2, 2, 2]
339
+
340
+ sage: SymmetricGroup(5).simple_reflection_orders()
341
+ [2, 2, 2, 2]
342
+
343
+ sage: C = ColoredPermutations(4, 3) # needs sage.combinat
344
+ sage: C.simple_reflection_orders() # needs sage.combinat
345
+ [2, 2, 4]
346
+ """
347
+ one = self.one()
348
+ s = self.simple_reflections()
349
+ from sage.rings.integer_ring import ZZ
350
+
351
+ def mult_order(x):
352
+ ct = ZZ.one()
353
+ cur = x
354
+ while cur != one:
355
+ cur *= x
356
+ ct += ZZ.one()
357
+ return ZZ(ct)
358
+ return [mult_order(s[i]) for i in self.index_set()]
359
+
360
+ def _an_element_(self):
361
+ """
362
+ Implement: :meth:`Sets.ParentMethods.an_element` by
363
+ returning the product of the simple reflections (a Coxeter
364
+ element).
365
+
366
+ EXAMPLES::
367
+
368
+ sage: W = SymmetricGroup(4); W
369
+ Symmetric group of order 4! as a permutation group
370
+ sage: W.an_element() # indirect doctest
371
+ (2,3,4)
372
+
373
+ For a complex reflection group::
374
+
375
+ sage: # needs sage.combinat
376
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
377
+ sage: W = ComplexReflectionGroups().example(); W
378
+ 5-colored permutations of size 3
379
+ sage: W.an_element()
380
+ [[1, 0, 0], [3, 1, 2]]
381
+ """
382
+ return self.prod(self.simple_reflections())
383
+
384
+ def some_elements(self):
385
+ r"""
386
+ Implement :meth:`Sets.ParentMethods.some_elements` by
387
+ returning some typical elements of ``self``.
388
+
389
+ The result is currently composed of the simple reflections
390
+ together with the unit and the result of :meth:`an_element`.
391
+
392
+ EXAMPLES::
393
+
394
+ sage: W = WeylGroup(['A',3]) # needs sage.rings.number_field
395
+ sage: W.some_elements() # needs sage.rings.number_field
396
+ [
397
+ [0 1 0 0] [1 0 0 0] [1 0 0 0] [1 0 0 0] [0 0 0 1]
398
+ [1 0 0 0] [0 0 1 0] [0 1 0 0] [0 1 0 0] [1 0 0 0]
399
+ [0 0 1 0] [0 1 0 0] [0 0 0 1] [0 0 1 0] [0 1 0 0]
400
+ [0 0 0 1], [0 0 0 1], [0 0 1 0], [0 0 0 1], [0 0 1 0]
401
+ ]
402
+
403
+ sage: W = ColoredPermutations(1,4) # needs sage.combinat
404
+ sage: W.some_elements() # needs sage.combinat
405
+ [[[0, 0, 0, 0], [2, 1, 3, 4]],
406
+ [[0, 0, 0, 0], [1, 3, 2, 4]],
407
+ [[0, 0, 0, 0], [1, 2, 4, 3]],
408
+ [[0, 0, 0, 0], [1, 2, 3, 4]],
409
+ [[0, 0, 0, 0], [4, 1, 2, 3]]]
410
+ """
411
+ return list(self.simple_reflections()) + [self.one(), self.an_element()]
412
+
413
+ ######################################################################
414
+ # Reflections
415
+ ######################################################################
416
+
417
+ @abstract_method(optional=True)
418
+ def reflection_index_set(self):
419
+ r"""
420
+ Return the index set of the reflections of ``self``.
421
+
422
+ .. SEEALSO::
423
+
424
+ - :meth:`reflection`
425
+ - :meth:`reflections`
426
+
427
+ EXAMPLES::
428
+
429
+ sage: # optional - gap3
430
+ sage: W = ReflectionGroup((1,1,4))
431
+ sage: W.reflection_index_set()
432
+ (1, 2, 3, 4, 5, 6)
433
+ sage: W = ReflectionGroup((1,1,4), reflection_index_set=[1,3,'asdf',7,9,11])
434
+ sage: W.reflection_index_set()
435
+ (1, 3, 'asdf', 7, 9, 11)
436
+ sage: W = ReflectionGroup((1,1,4), reflection_index_set=('a','b','c','d','e','f'))
437
+ sage: W.reflection_index_set()
438
+ ('a', 'b', 'c', 'd', 'e', 'f')
439
+ """
440
+
441
+ @abstract_method(optional=True)
442
+ def reflection(self, i):
443
+ r"""
444
+ Return the `i`-th reflection of ``self``.
445
+
446
+ For `i` in `1,\dots,N`, this gives the `i`-th reflection of
447
+ ``self``.
448
+
449
+ .. SEEALSO::
450
+
451
+ - :meth:`reflections_index_set`
452
+ - :meth:`reflections`
453
+
454
+ EXAMPLES::
455
+
456
+ sage: W = ReflectionGroup((1,1,4)) # optional - gap3
457
+ sage: for i in W.reflection_index_set(): # optional - gap3
458
+ ....: print('%s %s'%(i, W.reflection(i)))
459
+ 1 (1,7)(2,4)(5,6)(8,10)(11,12)
460
+ 2 (1,4)(2,8)(3,5)(7,10)(9,11)
461
+ 3 (2,5)(3,9)(4,6)(8,11)(10,12)
462
+ 4 (1,8)(2,7)(3,6)(4,10)(9,12)
463
+ 5 (1,6)(2,9)(3,8)(5,11)(7,12)
464
+ 6 (1,11)(3,10)(4,9)(5,7)(6,12)
465
+ """
466
+
467
+ @cached_method
468
+ def reflections(self):
469
+ r"""
470
+ Return a finite family containing the reflections of
471
+ ``self``, indexed by :meth:`reflection_index_set`.
472
+
473
+ .. SEEALSO::
474
+
475
+ - :meth:`reflection`
476
+ - :meth:`reflection_index_set`
477
+
478
+ EXAMPLES::
479
+
480
+ sage: # optional - gap3
481
+ sage: W = ReflectionGroup((1,1,3))
482
+ sage: reflections = W.reflections()
483
+ sage: for index in sorted(reflections.keys()):
484
+ ....: print('%s %s'%(index, reflections[index]))
485
+ 1 (1,4)(2,3)(5,6)
486
+ 2 (1,3)(2,5)(4,6)
487
+ 3 (1,5)(2,4)(3,6)
488
+ sage: W = ReflectionGroup((1,1,3),
489
+ ....: reflection_index_set=['a','b','c'])
490
+ sage: reflections = W.reflections()
491
+ sage: for index in sorted(reflections.keys()):
492
+ ....: print('%s %s'%(index, reflections[index]))
493
+ a (1,4)(2,3)(5,6)
494
+ b (1,3)(2,5)(4,6)
495
+ c (1,5)(2,4)(3,6)
496
+ sage: W = ReflectionGroup((3,1,1))
497
+ sage: reflections = W.reflections()
498
+ sage: for index in sorted(reflections.keys()):
499
+ ....: print('%s %s'%(index, reflections[index]))
500
+ 1 (1,2,3)
501
+ 2 (1,3,2)
502
+ sage: W = ReflectionGroup((1,1,3), (3,1,2))
503
+ sage: reflections = W.reflections()
504
+ sage: for index in sorted(reflections.keys()):
505
+ ....: print('%s %s'%(index, reflections[index]))
506
+ 1 (1,6)(2,5)(7,8)
507
+ 2 (1,5)(2,7)(6,8)
508
+ 3 (3,9,15)(4,10,16)(12,17,23)(14,18,24)(20,25,29)(21,22,26)(27,28,30)
509
+ 4 (3,11)(4,12)(9,13)(10,14)(15,19)(16,20)(17,21)(18,22)(23,27)(24,28)(25,26)(29,30)
510
+ 5 (1,7)(2,6)(5,8)
511
+ 6 (3,19)(4,25)(9,11)(10,17)(12,28)(13,15)(14,30)(16,18)(20,27)(21,29)(22,23)(24,26)
512
+ 7 (4,21,27)(10,22,28)(11,13,19)(12,14,20)(16,26,30)(17,18,25)(23,24,29)
513
+ 8 (3,13)(4,24)(9,19)(10,29)(11,15)(12,26)(14,21)(16,23)(17,30)(18,27)(20,22)(25,28)
514
+ 9 (3,15,9)(4,16,10)(12,23,17)(14,24,18)(20,29,25)(21,26,22)(27,30,28)
515
+ 10 (4,27,21)(10,28,22)(11,19,13)(12,20,14)(16,30,26)(17,25,18)(23,29,24)
516
+ """
517
+ from sage.sets.family import Family
518
+ return Family(self.reflection_index_set(), self.reflection)
519
+
520
+ ##########################################################################
521
+ # distinguished reflections
522
+ ##########################################################################
523
+
524
+ @abstract_method(optional=True)
525
+ def hyperplane_index_set(self):
526
+ r"""
527
+ Return the index set of the distinguished reflections of ``self``.
528
+
529
+ This is also the index set of the reflection hyperplanes
530
+ of ``self``, hence the name. This name is slightly abusive
531
+ since the concept of reflection hyperplanes is not defined
532
+ for all generalized Coxeter groups. However for all
533
+ practical purposes this is only used for complex
534
+ reflection groups, and there this is the desirable name.
535
+
536
+ .. SEEALSO::
537
+
538
+ - :meth:`distinguished_reflection`
539
+ - :meth:`distinguished_reflections`
540
+
541
+ EXAMPLES::
542
+
543
+ sage: # optional - gap3
544
+ sage: W = ReflectionGroup((1,1,4))
545
+ sage: W.hyperplane_index_set()
546
+ (1, 2, 3, 4, 5, 6)
547
+ sage: W = ReflectionGroup((1,1,4), hyperplane_index_set=[1,3,'asdf',7,9,11])
548
+ sage: W.hyperplane_index_set()
549
+ (1, 3, 'asdf', 7, 9, 11)
550
+ sage: W = ReflectionGroup((1,1,4),
551
+ ....: hyperplane_index_set=('a','b','c','d','e','f'))
552
+ sage: W.hyperplane_index_set()
553
+ ('a', 'b', 'c', 'd', 'e', 'f')
554
+ """
555
+
556
+ @abstract_method(optional=True)
557
+ def distinguished_reflection(self, i):
558
+ r"""
559
+ Return the `i`-th distinguished reflection of ``self``.
560
+
561
+ INPUT:
562
+
563
+ - ``i`` -- an element of the index set of the distinguished reflections
564
+
565
+ .. SEEALSO::
566
+
567
+ - :meth:`distinguished_reflections`
568
+ - :meth:`hyperplane_index_set`
569
+
570
+ EXAMPLES::
571
+
572
+ sage: # optional - gap3
573
+ sage: W = ReflectionGroup((1,1,4),
574
+ ....: hyperplane_index_set=('a','b','c','d','e','f'))
575
+ sage: for i in W.hyperplane_index_set():
576
+ ....: print('%s %s'%(i, W.distinguished_reflection(i)))
577
+ a (1,7)(2,4)(5,6)(8,10)(11,12)
578
+ b (1,4)(2,8)(3,5)(7,10)(9,11)
579
+ c (2,5)(3,9)(4,6)(8,11)(10,12)
580
+ d (1,8)(2,7)(3,6)(4,10)(9,12)
581
+ e (1,6)(2,9)(3,8)(5,11)(7,12)
582
+ f (1,11)(3,10)(4,9)(5,7)(6,12)
583
+ """
584
+
585
+ @cached_method
586
+ def distinguished_reflections(self):
587
+ r"""
588
+ Return a finite family containing the distinguished
589
+ reflections of ``self``, indexed by
590
+ :meth:`hyperplane_index_set`.
591
+
592
+ A *distinguished reflection* is a conjugate of a simple
593
+ reflection. For a Coxeter group, reflections and
594
+ distinguished reflections coincide. For a Complex
595
+ reflection groups this is a reflection acting on the
596
+ complement of the fixed hyperplane `H` as
597
+ `\operatorname{exp}(2 \pi i / n)`, where `n` is the order
598
+ of the reflection subgroup fixing `H`.
599
+
600
+ .. SEEALSO::
601
+
602
+ - :meth:`distinguished_reflection`
603
+ - :meth:`hyperplane_index_set`
604
+
605
+ EXAMPLES::
606
+
607
+ sage: # optional - gap3
608
+ sage: W = ReflectionGroup((1,1,3))
609
+ sage: distinguished_reflections = W.distinguished_reflections()
610
+ sage: for index in sorted(distinguished_reflections.keys()):
611
+ ....: print('%s %s'%(index, distinguished_reflections[index]))
612
+ 1 (1,4)(2,3)(5,6)
613
+ 2 (1,3)(2,5)(4,6)
614
+ 3 (1,5)(2,4)(3,6)
615
+ sage: W = ReflectionGroup((1,1,3), hyperplane_index_set=['a','b','c'])
616
+ sage: distinguished_reflections = W.distinguished_reflections()
617
+ sage: for index in sorted(distinguished_reflections.keys()):
618
+ ....: print('%s %s'%(index, distinguished_reflections[index]))
619
+ a (1,4)(2,3)(5,6)
620
+ b (1,3)(2,5)(4,6)
621
+ c (1,5)(2,4)(3,6)
622
+ sage: W = ReflectionGroup((3,1,1))
623
+ sage: distinguished_reflections = W.distinguished_reflections()
624
+ sage: for index in sorted(distinguished_reflections.keys()):
625
+ ....: print('%s %s'%(index, distinguished_reflections[index]))
626
+ 1 (1,2,3)
627
+ sage: W = ReflectionGroup((1,1,3), (3,1,2))
628
+ sage: distinguished_reflections = W.distinguished_reflections()
629
+ sage: for index in sorted(distinguished_reflections.keys()):
630
+ ....: print('%s %s'%(index, distinguished_reflections[index]))
631
+ 1 (1,6)(2,5)(7,8)
632
+ 2 (1,5)(2,7)(6,8)
633
+ 3 (3,9,15)(4,10,16)(12,17,23)(14,18,24)(20,25,29)(21,22,26)(27,28,30)
634
+ 4 (3,11)(4,12)(9,13)(10,14)(15,19)(16,20)(17,21)(18,22)(23,27)(24,28)(25,26)(29,30)
635
+ 5 (1,7)(2,6)(5,8)
636
+ 6 (3,19)(4,25)(9,11)(10,17)(12,28)(13,15)(14,30)(16,18)(20,27)(21,29)(22,23)(24,26)
637
+ 7 (4,21,27)(10,22,28)(11,13,19)(12,14,20)(16,26,30)(17,18,25)(23,24,29)
638
+ 8 (3,13)(4,24)(9,19)(10,29)(11,15)(12,26)(14,21)(16,23)(17,30)(18,27)(20,22)(25,28)
639
+ """
640
+ from sage.sets.family import Family
641
+ return Family(self.hyperplane_index_set(), self.distinguished_reflection)
642
+
643
+ ##########################################################################
644
+ # from_reduced_word
645
+ ##########################################################################
646
+
647
+ def from_reduced_word(self, word, word_type='simple'):
648
+ r"""
649
+ Return an element of ``self`` from its (reduced) word.
650
+
651
+ INPUT:
652
+
653
+ - ``word`` -- list (or iterable) of elements of the
654
+ index set of ``self`` (resp. of the distinguished
655
+ or of all reflections)
656
+ - ``word_type`` -- (default: ``'simple'``):
657
+ either ``'simple'``, ``'distinguished'``, or ``'all'``
658
+
659
+ If ``word`` is `[i_1,i_2,\ldots,i_k]`, then this returns
660
+ the corresponding product of simple reflections
661
+ `s_{i_1} s_{i_2} \cdots s_{i_k}`.
662
+
663
+ If ``word_type`` is ``'distinguished'`` (resp. ``'all'``),
664
+ then the product of the distinguished reflections (resp. all
665
+ reflections) is returned.
666
+
667
+ .. NOTE::
668
+
669
+ The main use case is for constructing elements from
670
+ reduced words, hence the name of this method.
671
+ However, the input word need *not* be reduced.
672
+
673
+ .. SEEALSO::
674
+
675
+ - :meth:`index_set`
676
+ - :meth:`reflection_index_set`
677
+ - :meth:`hyperplane_index_set`
678
+ - :meth:`~ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflections`
679
+ - :meth:`~CoxeterGroup.ElementMethods.reduced_word`
680
+ - :meth:`~CoxeterGroup.ParentMethods._test_reduced_word`
681
+
682
+ EXAMPLES::
683
+
684
+ sage: W = CoxeterGroups().example(); W
685
+ The symmetric group on {0, ..., 3}
686
+ sage: s = W.simple_reflections()
687
+ sage: W.from_reduced_word([0,2,0,1])
688
+ (0, 3, 1, 2)
689
+ sage: W.from_reduced_word((0,2,0,1))
690
+ (0, 3, 1, 2)
691
+ sage: s[0]*s[2]*s[0]*s[1]
692
+ (0, 3, 1, 2)
693
+
694
+ We now experiment with the different values for
695
+ ``word_type`` for the colored symmetric group::
696
+
697
+ sage: # needs sage.combinat
698
+ sage: W = ColoredPermutations(1,4)
699
+ sage: W.from_reduced_word([1,2,1,2,1,2])
700
+ [[0, 0, 0, 0], [1, 2, 3, 4]]
701
+ sage: W.from_reduced_word([1, 2, 3]).reduced_word()
702
+ [1, 2, 3]
703
+
704
+ sage: # needs sage.rings.number_field
705
+ sage: W = WeylGroup("A3", prefix='s')
706
+ sage: AS = W.domain()
707
+ sage: r1 = AS.roots()[4]; r1
708
+ (0, 1, 0, -1)
709
+ sage: r2 = AS.roots()[5]; r2
710
+ (0, 0, 1, -1)
711
+ sage: W.from_reduced_word([r1, r2], word_type='all')
712
+ s3*s2
713
+
714
+ sage: W = WeylGroup("G2", prefix='s') # needs sage.rings.number_field
715
+ sage: W.from_reduced_word(W.domain().positive_roots(), # needs sage.rings.number_field
716
+ ....: word_type='all')
717
+ s1*s2
718
+
719
+ sage: # optional - gap3
720
+ sage: W = ReflectionGroup((1,1,4))
721
+ sage: W.from_reduced_word([1,2,3], word_type='all').reduced_word()
722
+ [1, 2, 3]
723
+ sage: W.from_reduced_word([1,2,3], word_type='all').reduced_word_in_reflections()
724
+ [1, 2, 3]
725
+ sage: W.from_reduced_word([1,2,3]).reduced_word_in_reflections()
726
+ [1, 2, 3]
727
+
728
+ TESTS::
729
+
730
+ sage: W = WeylGroup(['E',6]) # needs sage.rings.number_field
731
+ sage: W.from_reduced_word([2,3,4,2]) # needs sage.rings.number_field
732
+ [ 0 1 0 0 0 0 0 0]
733
+ [ 0 0 -1 0 0 0 0 0]
734
+ [-1 0 0 0 0 0 0 0]
735
+ [ 0 0 0 1 0 0 0 0]
736
+ [ 0 0 0 0 1 0 0 0]
737
+ [ 0 0 0 0 0 1 0 0]
738
+ [ 0 0 0 0 0 0 1 0]
739
+ [ 0 0 0 0 0 0 0 1]
740
+ """
741
+ if word_type == 'simple':
742
+ return self.one().apply_simple_reflections(word)
743
+ else:
744
+ return self.one().apply_reflections(word, word_type=word_type)
745
+
746
+ ##########################################################################
747
+ # Irreducible components
748
+ ##########################################################################
749
+
750
+ def irreducible_component_index_sets(self):
751
+ r"""
752
+ Return a list containing the index sets of the irreducible components of
753
+ ``self`` as finite reflection groups.
754
+
755
+ EXAMPLES::
756
+
757
+ sage: # needs sage.graphs
758
+ sage: W = ReflectionGroup([1,1,3], [3,1,3], 4); W # optional - gap3
759
+ Reducible complex reflection group of rank 7 and type A2 x G(3,1,3) x ST4
760
+ sage: sorted(W.irreducible_component_index_sets()) # optional - gap3
761
+ [[1, 2], [3, 4, 5], [6, 7]]
762
+
763
+ ALGORITHM:
764
+
765
+ Take the connected components of the graph on the
766
+ index set with edges ``(i,j)``, where ``s[i]`` and
767
+ ``s[j]`` do not commute.
768
+ """
769
+ I = self.index_set()
770
+ s = self.simple_reflections()
771
+ from sage.graphs.graph import Graph
772
+ G = Graph([I,
773
+ [[i,j]
774
+ for i,j in itertools.combinations(I,2)
775
+ if s[i]*s[j] != s[j]*s[i] ]],
776
+ format='vertices_and_edges')
777
+ return G.connected_components(sort=False)
778
+
779
+ @abstract_method(optional=True)
780
+ def irreducible_components(self):
781
+ r"""
782
+ Return the irreducible components of ``self`` as finite
783
+ reflection groups.
784
+
785
+ EXAMPLES::
786
+
787
+ sage: # needs sage.graphs
788
+ sage: W = ReflectionGroup([1,1,3], [3,1,3], 4) # optional - gap3
789
+ sage: W.irreducible_components() # optional - gap3
790
+ [Irreducible real reflection group of rank 2 and type A2,
791
+ Irreducible complex reflection group of rank 3 and type G(3,1,3),
792
+ Irreducible complex reflection group of rank 2 and type ST4]
793
+ """
794
+ # TODO: provide a default implementation using the above and parabolic subgroups
795
+
796
+ def number_of_irreducible_components(self):
797
+ r"""
798
+ Return the number of irreducible components of ``self``.
799
+
800
+ EXAMPLES::
801
+
802
+ sage: # needs sage.graphs
803
+ sage: SymmetricGroup(3).number_of_irreducible_components()
804
+ 1
805
+ sage: ColoredPermutations(1,3).number_of_irreducible_components() # needs sage.combinat
806
+ 1
807
+ sage: ReflectionGroup((1,1,3),(2,1,3)).number_of_irreducible_components() # optional - gap3
808
+ 2
809
+
810
+ TESTS::
811
+
812
+ sage: SymmetricGroup(3).number_of_irreducible_components.__module__
813
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
814
+ """
815
+ return len(self.irreducible_component_index_sets())
816
+
817
+ def is_irreducible(self):
818
+ r"""
819
+ Return ``True`` if ``self`` is irreducible.
820
+
821
+ EXAMPLES::
822
+
823
+ sage: # needs sage.graphs
824
+ sage: W = ColoredPermutations(1,3); W # needs sage.combinat
825
+ 1-colored permutations of size 3
826
+ sage: W.is_irreducible() # needs sage.combinat
827
+ True
828
+ sage: W = ReflectionGroup((1,1,3),(2,1,3)); W # optional - gap3
829
+ Reducible real reflection group of rank 5 and type A2 x B3
830
+ sage: W.is_irreducible() # optional - gap3
831
+ False
832
+ """
833
+ return self.number_of_irreducible_components() == 1
834
+
835
+ def is_reducible(self):
836
+ r"""
837
+ Return ``True`` if ``self`` is not irreducible.
838
+
839
+ EXAMPLES::
840
+
841
+ sage: # needs sage.graphs
842
+ sage: W = ColoredPermutations(1,3); W # needs sage.combinat
843
+ 1-colored permutations of size 3
844
+ sage: W.is_reducible() # needs sage.combinat
845
+ False
846
+ sage: W = ReflectionGroup((1,1,3), (2,1,3)); W # optional - gap3
847
+ Reducible real reflection group of rank 5 and type A2 x B3
848
+ sage: W.is_reducible() # optional - gap3
849
+ True
850
+ """
851
+ return not self.is_irreducible()
852
+
853
+ class ElementMethods:
854
+ def apply_simple_reflection_left(self, i):
855
+ r"""
856
+ Return ``self`` multiplied by the simple reflection ``s[i]``
857
+ on the left.
858
+
859
+ This low level method is used intensively. Coxeter groups
860
+ are encouraged to override this straightforward
861
+ implementation whenever a faster approach exists.
862
+
863
+ EXAMPLES::
864
+
865
+ sage: W = CoxeterGroups().example()
866
+ sage: w = W.an_element(); w
867
+ (1, 2, 3, 0)
868
+ sage: w.apply_simple_reflection_left(0)
869
+ (0, 2, 3, 1)
870
+ sage: w.apply_simple_reflection_left(1)
871
+ (2, 1, 3, 0)
872
+ sage: w.apply_simple_reflection_left(2)
873
+ (1, 3, 2, 0)
874
+
875
+ EXAMPLES::
876
+
877
+ sage: # needs sage.combinat
878
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
879
+ sage: W = ComplexReflectionGroups().example()
880
+ sage: w = W.an_element(); w
881
+ [[1, 0, 0], [3, 1, 2]]
882
+ sage: w.apply_simple_reflection_left(1)
883
+ [[0, 1, 0], [1, 3, 2]]
884
+ sage: w.apply_simple_reflection_left(2)
885
+ [[1, 0, 0], [3, 2, 1]]
886
+ sage: w.apply_simple_reflection_left(3)
887
+ [[1, 0, 1], [3, 1, 2]]
888
+
889
+ TESTS::
890
+
891
+ sage: w.apply_simple_reflection_left.__module__ # needs sage.combinat
892
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
893
+ """
894
+ s = self.parent().simple_reflections()
895
+ return s[i] * self
896
+
897
+ def apply_simple_reflection_right(self, i):
898
+ """
899
+ Return ``self`` multiplied by the simple reflection ``s[i]``
900
+ on the right.
901
+
902
+ This low level method is used intensively. Coxeter groups
903
+ are encouraged to override this straightforward
904
+ implementation whenever a faster approach exists.
905
+
906
+ EXAMPLES::
907
+
908
+ sage: W = CoxeterGroups().example()
909
+ sage: w = W.an_element(); w
910
+ (1, 2, 3, 0)
911
+ sage: w.apply_simple_reflection_right(0)
912
+ (2, 1, 3, 0)
913
+ sage: w.apply_simple_reflection_right(1)
914
+ (1, 3, 2, 0)
915
+ sage: w.apply_simple_reflection_right(2)
916
+ (1, 2, 0, 3)
917
+
918
+ sage: # needs sage.combinat
919
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
920
+ sage: W = ComplexReflectionGroups().example()
921
+ sage: w = W.an_element(); w
922
+ [[1, 0, 0], [3, 1, 2]]
923
+ sage: w.apply_simple_reflection_right(1)
924
+ [[1, 0, 0], [3, 2, 1]]
925
+ sage: w.apply_simple_reflection_right(2)
926
+ [[1, 0, 0], [2, 1, 3]]
927
+ sage: w.apply_simple_reflection_right(3)
928
+ [[2, 0, 0], [3, 1, 2]]
929
+
930
+ TESTS::
931
+
932
+ sage: w.apply_simple_reflection_right.__module__
933
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
934
+ """
935
+ s = self.parent().simple_reflections()
936
+ return self * s[i]
937
+
938
+ def apply_simple_reflection(self, i, side='right'):
939
+ """
940
+ Return ``self`` multiplied by the simple reflection ``s[i]``.
941
+
942
+ INPUT:
943
+
944
+ - ``i`` -- an element of the index set
945
+ - ``side`` -- (default: ``'right'``) ``'left'`` or ``'right'``
946
+
947
+ This default implementation simply calls
948
+ :meth:`apply_simple_reflection_left` or
949
+ :meth:`apply_simple_reflection_right`.
950
+
951
+ EXAMPLES::
952
+
953
+ sage: W = CoxeterGroups().example()
954
+ sage: w = W.an_element(); w
955
+ (1, 2, 3, 0)
956
+ sage: w.apply_simple_reflection(0, side='left')
957
+ (0, 2, 3, 1)
958
+ sage: w.apply_simple_reflection(1, side='left')
959
+ (2, 1, 3, 0)
960
+ sage: w.apply_simple_reflection(2, side='left')
961
+ (1, 3, 2, 0)
962
+ sage: w.apply_simple_reflection(0, side='right')
963
+ (2, 1, 3, 0)
964
+ sage: w.apply_simple_reflection(1, side='right')
965
+ (1, 3, 2, 0)
966
+ sage: w.apply_simple_reflection(2, side='right')
967
+ (1, 2, 0, 3)
968
+
969
+ By default, ``side`` is ``'right'``::
970
+
971
+ sage: w.apply_simple_reflection(0)
972
+ (2, 1, 3, 0)
973
+
974
+ Some tests with a complex reflection group::
975
+
976
+ sage: # needs sage.combinat
977
+ sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
978
+ sage: W = ComplexReflectionGroups().example(); W
979
+ 5-colored permutations of size 3
980
+ sage: w = W.an_element(); w
981
+ [[1, 0, 0], [3, 1, 2]]
982
+ sage: w.apply_simple_reflection(1, side='left')
983
+ [[0, 1, 0], [1, 3, 2]]
984
+ sage: w.apply_simple_reflection(2, side='left')
985
+ [[1, 0, 0], [3, 2, 1]]
986
+ sage: w.apply_simple_reflection(3, side='left')
987
+ [[1, 0, 1], [3, 1, 2]]
988
+ sage: w.apply_simple_reflection(1, side='right')
989
+ [[1, 0, 0], [3, 2, 1]]
990
+ sage: w.apply_simple_reflection(2, side='right')
991
+ [[1, 0, 0], [2, 1, 3]]
992
+ sage: w.apply_simple_reflection(3, side='right')
993
+ [[2, 0, 0], [3, 1, 2]]
994
+
995
+ TESTS::
996
+
997
+ sage: w.apply_simple_reflection_right.__module__ # needs sage.combinat
998
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
999
+ """
1000
+ if side == 'right':
1001
+ return self.apply_simple_reflection_right(i)
1002
+ else:
1003
+ return self.apply_simple_reflection_left(i)
1004
+
1005
+ def apply_simple_reflections(self, word, side='right', type='simple'):
1006
+ r"""
1007
+ Return the result of the (left/right) multiplication of
1008
+ ``self`` by ``word``.
1009
+
1010
+ INPUT:
1011
+
1012
+ - ``word`` -- a sequence of indices of simple reflections
1013
+ - ``side`` -- (default: ``'right'``) indicates multiplying
1014
+ from left or right
1015
+
1016
+ This is a specialized implementation of
1017
+ :meth:`apply_reflections` for the simple reflections. The
1018
+ rationale for its existence are:
1019
+
1020
+ - It can take advantage of ``apply_simple_reflection``,
1021
+ which often is less expensive than computing a product.
1022
+
1023
+ - It reduced burden on implementations that would want to
1024
+ provide an optimized version of this method.
1025
+
1026
+ EXAMPLES::
1027
+
1028
+ sage: W = CoxeterGroups().example()
1029
+ sage: w = W.an_element(); w
1030
+ (1, 2, 3, 0)
1031
+ sage: w.apply_simple_reflections([0,1])
1032
+ (2, 3, 1, 0)
1033
+ sage: w
1034
+ (1, 2, 3, 0)
1035
+ sage: w.apply_simple_reflections([0,1],side='left')
1036
+ (0, 1, 3, 2)
1037
+ """
1038
+ for i in word:
1039
+ self = self.apply_simple_reflection(i, side)
1040
+ return self
1041
+
1042
+ def apply_reflections(self, word, side='right', word_type='all'):
1043
+ r"""
1044
+ Return the result of the (left/right) multiplication of
1045
+ ``self`` by ``word``.
1046
+
1047
+ INPUT:
1048
+
1049
+ - ``word`` -- a sequence of indices of reflections
1050
+ - ``side`` -- (default: ``'right'``) indicates multiplying
1051
+ from left or right
1052
+ - ``word_type`` -- (default: ``'all'``):
1053
+ either ``'simple'``, ``'distinguished'``, or ``'all'``
1054
+
1055
+ EXAMPLES::
1056
+
1057
+ sage: # optional - gap3
1058
+ sage: W = ReflectionGroup((1,1,3))
1059
+ sage: W.one().apply_reflections([1])
1060
+ (1,4)(2,3)(5,6)
1061
+ sage: W.one().apply_reflections([2])
1062
+ (1,3)(2,5)(4,6)
1063
+ sage: W.one().apply_reflections([2,1])
1064
+ (1,2,6)(3,4,5)
1065
+
1066
+
1067
+ sage: W = CoxeterGroups().example()
1068
+ sage: w = W.an_element(); w
1069
+ (1, 2, 3, 0)
1070
+ sage: w.apply_reflections([0,1], word_type='simple')
1071
+ (2, 3, 1, 0)
1072
+ sage: w
1073
+ (1, 2, 3, 0)
1074
+ sage: w.apply_reflections([0,1], side='left', word_type='simple')
1075
+ (0, 1, 3, 2)
1076
+
1077
+ sage: # needs sage.rings.number_field
1078
+ sage: W = WeylGroup("A3", prefix='s')
1079
+ sage: w = W.an_element(); w
1080
+ s1*s2*s3
1081
+ sage: AS = W.domain()
1082
+ sage: r1 = AS.roots()[4]; r1
1083
+ (0, 1, 0, -1)
1084
+ sage: r2 = AS.roots()[5]; r2
1085
+ (0, 0, 1, -1)
1086
+ sage: w.apply_reflections([r1, r2], word_type='all')
1087
+ s1
1088
+
1089
+ sage: # optional - gap3
1090
+ sage: W = ReflectionGroup((1,1,3))
1091
+ sage: W.one().apply_reflections([1], word_type='distinguished')
1092
+ (1,4)(2,3)(5,6)
1093
+ sage: W.one().apply_reflections([2], word_type='distinguished')
1094
+ (1,3)(2,5)(4,6)
1095
+ sage: W.one().apply_reflections([3], word_type='distinguished')
1096
+ (1,5)(2,4)(3,6)
1097
+ sage: W.one().apply_reflections([2,1], word_type='distinguished')
1098
+ (1,2,6)(3,4,5)
1099
+
1100
+ sage: # optional - gap3
1101
+ sage: W = ReflectionGroup((1,1,3), hyperplane_index_set=['A','B','C']); W
1102
+ Irreducible real reflection group of rank 2 and type A2
1103
+ sage: W.one().apply_reflections(['A'], word_type='distinguished')
1104
+ (1,4)(2,3)(5,6)
1105
+ """
1106
+ if word_type == 'simple':
1107
+ reflections = self.parent().simple_reflections()
1108
+ elif word_type == 'distinguished':
1109
+ reflections = self.parent().distinguished_reflections()
1110
+ else:
1111
+ reflections = self.parent().reflections()
1112
+ if side == 'left':
1113
+ for i in word:
1114
+ self = reflections[i] * self
1115
+ else:
1116
+ for i in word:
1117
+ self = self * reflections[i]
1118
+ return self
1119
+
1120
+ def _mul_(self, other):
1121
+ r"""
1122
+ Return the product of ``self`` and ``other``.
1123
+
1124
+ This default implementation computes a reduced word of
1125
+ ``other`` using :meth:`reduced_word`, and applies the
1126
+ corresponding simple reflections on ``self`` using
1127
+ :meth:`apply_simple_reflections`.
1128
+
1129
+ EXAMPLES::
1130
+
1131
+ sage: W = FiniteCoxeterGroups().example(); W
1132
+ The 5-th dihedral group of order 10
1133
+ sage: w = W.an_element()
1134
+ sage: w
1135
+ (1, 2)
1136
+ sage: w._mul_(w)
1137
+ (1, 2, 1, 2)
1138
+ sage: w._mul_(w)._mul_(w)
1139
+ (2, 1, 2, 1)
1140
+
1141
+ This method is called when computing ``self * other``::
1142
+
1143
+ sage: w * w
1144
+ (1, 2, 1, 2)
1145
+
1146
+ TESTS::
1147
+
1148
+ sage: w._mul_.__module__
1149
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
1150
+ """
1151
+ return self.apply_simple_reflections(other.reduced_word())
1152
+
1153
+ def __invert__(self):
1154
+ """
1155
+ Return the inverse of ``self``.
1156
+
1157
+ EXAMPLES::
1158
+
1159
+ sage: # needs sage.rings.number_field
1160
+ sage: W = WeylGroup(['B',7])
1161
+ sage: w = W.an_element()
1162
+ sage: u = w.inverse() # indirect doctest
1163
+ sage: u == ~w
1164
+ True
1165
+ sage: u * w == w * u
1166
+ True
1167
+ sage: u * w
1168
+ [1 0 0 0 0 0 0]
1169
+ [0 1 0 0 0 0 0]
1170
+ [0 0 1 0 0 0 0]
1171
+ [0 0 0 1 0 0 0]
1172
+ [0 0 0 0 1 0 0]
1173
+ [0 0 0 0 0 1 0]
1174
+ [0 0 0 0 0 0 1]
1175
+ """
1176
+ return self.parent().one().apply_simple_reflections(self.reduced_word_reverse_iterator())
1177
+
1178
+ def apply_conjugation_by_simple_reflection(self, i):
1179
+ r"""
1180
+ Conjugate ``self`` by the ``i``-th simple reflection.
1181
+
1182
+ EXAMPLES::
1183
+
1184
+ sage: W = WeylGroup(['A',3]) # needs sage.rings.number_field
1185
+ sage: w = W.from_reduced_word([3,1,2,1]) # needs sage.rings.number_field
1186
+ sage: w.apply_conjugation_by_simple_reflection(1).reduced_word() # needs sage.rings.number_field
1187
+ [3, 2]
1188
+ """
1189
+ return self.apply_simple_reflection(i).apply_simple_reflection(i, side='left')
1190
+
1191
+ @abstract_method(optional=True)
1192
+ def reflection_length(self):
1193
+ r"""
1194
+ Return the reflection length of ``self``.
1195
+
1196
+ This is the minimal length of a factorization of ``self``
1197
+ into reflections.
1198
+
1199
+ EXAMPLES::
1200
+
1201
+ sage: # optional - gap3
1202
+ sage: W = ReflectionGroup((1,1,2))
1203
+ sage: sorted([t.reflection_length() for t in W])
1204
+ [0, 1]
1205
+ sage: W = ReflectionGroup((2,1,2))
1206
+ sage: sorted([t.reflection_length() for t in W])
1207
+ [0, 1, 1, 1, 1, 2, 2, 2]
1208
+ sage: W = ReflectionGroup((3,1,2))
1209
+ sage: sorted([t.reflection_length() for t in W])
1210
+ [0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
1211
+ sage: W = ReflectionGroup((2,2,2))
1212
+ sage: sorted([t.reflection_length() for t in W])
1213
+ [0, 1, 1, 2]
1214
+ """
1215
+
1216
+ def is_reflection(self):
1217
+ r"""
1218
+ Return whether ``self`` is a reflection.
1219
+
1220
+ EXAMPLES::
1221
+
1222
+ sage: # optional - gap3
1223
+ sage: W = ReflectionGroup((1,1,4))
1224
+ sage: [t.is_reflection() for t in W.reflections()]
1225
+ [True, True, True, True, True, True]
1226
+ sage: len([t for t in W.reflections() if t.is_reflection()])
1227
+ 6
1228
+ sage: W = ReflectionGroup((2,1,3))
1229
+ sage: [t.is_reflection() for t in W.reflections()]
1230
+ [True, True, True, True, True, True, True, True, True]
1231
+ sage: len([t for t in W.reflections() if t.is_reflection()])
1232
+ 9
1233
+ """
1234
+ return self.reflection_length() == 1
1235
+
1236
+ class Irreducible(CategoryWithAxiom):
1237
+ class ParentMethods:
1238
+ def irreducible_components(self):
1239
+ r"""
1240
+ Return a list containing all irreducible components of
1241
+ ``self`` as finite reflection groups.
1242
+
1243
+ EXAMPLES::
1244
+
1245
+ sage: W = ColoredPermutations(4, 3) # needs sage.combinat
1246
+ sage: W.irreducible_components() # needs sage.combinat
1247
+ [4-colored permutations of size 3]
1248
+ """
1249
+ return [self]