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,1138 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.combinat sage.groups
3
+ r"""
4
+ Finite Coxeter Groups
5
+ """
6
+ # ****************************************************************************
7
+ # Copyright (C) 2009 Nicolas M. Thiery <nthiery at users.sf.net>
8
+ # Copyright (C) 2009 Nicolas Borie <nicolas dot borie at math.u-psud.fr>
9
+ #
10
+ # Distributed under the terms of the GNU General Public License (GPL)
11
+ # https://www.gnu.org/licenses/
12
+ # *****************************************************************************
13
+
14
+ import sage.rings.abc
15
+
16
+ from sage.misc.cachefunc import cached_method, cached_in_parent_method
17
+ from sage.misc.lazy_attribute import lazy_attribute
18
+ from sage.categories.category_with_axiom import CategoryWithAxiom
19
+ from sage.categories.coxeter_groups import CoxeterGroups
20
+
21
+
22
+ class FiniteCoxeterGroups(CategoryWithAxiom):
23
+ r"""
24
+ The category of finite Coxeter groups.
25
+
26
+ EXAMPLES::
27
+
28
+ sage: CoxeterGroups.Finite()
29
+ Category of finite Coxeter groups
30
+ sage: FiniteCoxeterGroups().super_categories()
31
+ [Category of finite generalized Coxeter groups,
32
+ Category of Coxeter groups]
33
+
34
+ sage: G = CoxeterGroups().Finite().example()
35
+ sage: G.cayley_graph(side="right").plot() # needs sage.plot
36
+ Graphics object consisting of 40 graphics primitives
37
+
38
+ Here are some further examples::
39
+
40
+ sage: WeylGroups().Finite().example()
41
+ The symmetric group on {0, ..., 3}
42
+
43
+ sage: WeylGroup(["B", 3])
44
+ Weyl Group of type ['B', 3] (as a matrix group acting on the ambient space)
45
+
46
+ Those other examples will eventually be also in this category::
47
+
48
+ sage: SymmetricGroup(4)
49
+ Symmetric group of order 4! as a permutation group
50
+ sage: DihedralGroup(5)
51
+ Dihedral group of order 10 as a permutation group
52
+ """
53
+ def extra_super_categories(self):
54
+ r"""
55
+ EXAMPLES::
56
+
57
+ sage: CoxeterGroups().Finite().super_categories()
58
+ [Category of finite generalized Coxeter groups,
59
+ Category of Coxeter groups]
60
+ """
61
+ from sage.categories.complex_reflection_groups import ComplexReflectionGroups
62
+ return [ComplexReflectionGroups().Finite().WellGenerated()]
63
+
64
+ class ParentMethods:
65
+ """
66
+ Ambiguity resolution: the implementation of ``some_elements``
67
+ is preferable to that of :class:`FiniteGroups`. The same holds
68
+ for ``__iter__``, although a breadth first search would be more
69
+ natural; at least this maintains backward compatibility after
70
+ :issue:`13589`.
71
+
72
+ TESTS::
73
+
74
+ sage: W = FiniteCoxeterGroups().example(3)
75
+
76
+ sage: W.some_elements.__module__
77
+ 'sage.categories.complex_reflection_or_generalized_coxeter_groups'
78
+ sage: W.__iter__.__module__
79
+ 'sage.categories.coxeter_groups'
80
+
81
+ sage: W.some_elements()
82
+ [(1,), (2,), (), (1, 2)]
83
+ sage: list(W)
84
+ [(), (1,), (2,), (1, 2), (2, 1), (1, 2, 1)]
85
+ """
86
+ __iter__ = CoxeterGroups.ParentMethods.__dict__["__iter__"]
87
+
88
+ @lazy_attribute
89
+ def w0(self):
90
+ r"""
91
+ Return the longest element of ``self``.
92
+
93
+ This attribute is deprecated, use :meth:`long_element` instead.
94
+
95
+ EXAMPLES::
96
+
97
+ sage: D8 = FiniteCoxeterGroups().example(8)
98
+ sage: D8.w0
99
+ (1, 2, 1, 2, 1, 2, 1, 2)
100
+ sage: D3 = FiniteCoxeterGroups().example(3)
101
+ sage: D3.w0
102
+ (1, 2, 1)
103
+ """
104
+ return self.long_element()
105
+
106
+ def long_element(self, index_set=None, as_word=False):
107
+ r"""
108
+ Return the longest element of ``self``, or of the
109
+ parabolic subgroup corresponding to the given ``index_set``.
110
+
111
+ INPUT:
112
+
113
+ - ``index_set`` -- a subset (as a list or iterable) of the
114
+ nodes of the Dynkin diagram; (default: all of them)
115
+
116
+ - ``as_word`` -- boolean (default: ``False``); if ``True``, then
117
+ return instead a reduced decomposition of the longest element
118
+
119
+ Should this method be called maximal_element? longest_element?
120
+
121
+ EXAMPLES::
122
+
123
+ sage: D10 = FiniteCoxeterGroups().example(10)
124
+ sage: D10.long_element()
125
+ (1, 2, 1, 2, 1, 2, 1, 2, 1, 2)
126
+ sage: D10.long_element([1])
127
+ (1,)
128
+ sage: D10.long_element([2])
129
+ (2,)
130
+ sage: D10.long_element([])
131
+ ()
132
+
133
+ sage: D7 = FiniteCoxeterGroups().example(7)
134
+ sage: D7.long_element()
135
+ (1, 2, 1, 2, 1, 2, 1)
136
+
137
+ One can require instead a reduced word for w0::
138
+
139
+ sage: A3 = CoxeterGroup(['A', 3])
140
+ sage: A3.long_element(as_word=True)
141
+ [1, 2, 1, 3, 2, 1]
142
+ """
143
+ if index_set is None:
144
+ index_set = self.index_set()
145
+ w = self.one()
146
+ if as_word:
147
+ word = []
148
+ while True:
149
+ i = w.first_descent(index_set=index_set, positive=True)
150
+ if i is None:
151
+ if as_word:
152
+ return word
153
+ else:
154
+ return w
155
+ else:
156
+ if as_word:
157
+ word.append(i)
158
+ w = w.apply_simple_reflection(i)
159
+
160
+ @cached_method
161
+ def bruhat_poset(self, facade=False):
162
+ """
163
+ Return the Bruhat poset of ``self``.
164
+
165
+ .. SEEALSO::
166
+
167
+ :meth:`bhz_poset`, :meth:`shard_poset`, :meth:`weak_poset`
168
+
169
+ EXAMPLES::
170
+
171
+ sage: W = WeylGroup(["A", 2])
172
+ sage: P = W.bruhat_poset()
173
+ sage: P
174
+ Finite poset containing 6 elements
175
+ sage: P.show() # needs sage.plot
176
+
177
+ Here are some typical operations on this poset::
178
+
179
+ sage: W = WeylGroup(["A", 3])
180
+ sage: P = W.bruhat_poset()
181
+ sage: u = W.from_reduced_word([3,1])
182
+ sage: v = W.from_reduced_word([3,2,1,2,3])
183
+ sage: P(u) <= P(v)
184
+ True
185
+ sage: len(P.interval(P(u), P(v)))
186
+ 10
187
+ sage: P.is_join_semilattice()
188
+ False
189
+
190
+ By default, the elements of `P` are aware that they belong
191
+ to `P`::
192
+
193
+ sage: P.an_element().parent()
194
+ Finite poset containing 24 elements
195
+
196
+ If instead one wants the elements to be plain elements of
197
+ the Coxeter group, one can use the ``facade`` option::
198
+
199
+ sage: P = W.bruhat_poset(facade = True)
200
+ sage: P.an_element().parent()
201
+ Weyl Group of type ['A', 3] (as a matrix group acting on the ambient space)
202
+
203
+ .. SEEALSO:: :func:`Poset` for more on posets and facade posets.
204
+
205
+ TESTS::
206
+
207
+ sage: [len(WeylGroup(["A", n]).bruhat_poset().cover_relations()) for n in [1,2,3]]
208
+ [1, 8, 58]
209
+
210
+ .. TODO::
211
+
212
+ - Use the symmetric group in the examples (for nicer
213
+ output), and print the edges for a stronger test.
214
+ - The constructed poset should be lazy, in order to
215
+ handle large / infinite Coxeter groups.
216
+ """
217
+ from sage.combinat.posets.posets import Poset
218
+ covers = tuple([u, v] for v in self for u in v.bruhat_lower_covers())
219
+ return Poset((self, covers), cover_relations=True, facade=facade)
220
+
221
+ def shard_poset(self, side='right'):
222
+ """
223
+ Return the shard intersection order attached to `W`.
224
+
225
+ This is a lattice structure on `W`, introduced in [Rea2009]_. It
226
+ contains the noncrossing partition lattice, as the induced lattice
227
+ on the subset of `c`-sortable elements.
228
+
229
+ The partial order is given by simultaneous inclusion of inversion sets
230
+ and subgroups attached to every element.
231
+
232
+ The precise description used here can be found in [STW2018]_.
233
+
234
+ Another implementation for the symmetric groups is
235
+ available as :func:`~sage.combinat.shard_order.shard_poset`.
236
+
237
+ .. SEEALSO::
238
+
239
+ :meth:`bhz_poset`, :meth:`bruhat_poset`, :meth:`weak_poset`
240
+
241
+ EXAMPLES::
242
+
243
+ sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
244
+ sage: SH = W.shard_poset(); SH
245
+ Finite lattice containing 24 elements
246
+ sage: SH.is_graded()
247
+ True
248
+ sage: SH.characteristic_polynomial()
249
+ q^3 - 11*q^2 + 23*q - 13
250
+ sage: SH.f_polynomial()
251
+ 34*q^3 + 22*q^2 + q
252
+ """
253
+ from sage.combinat.posets.lattices import LatticePoset
254
+ data = {w: (frozenset(u.lift()
255
+ for u in w.covered_reflections_subgroup()),
256
+ frozenset((~w).inversions_as_reflections()))
257
+ for w in self}
258
+
259
+ def shard_comparison(u, v):
260
+ Gu, Nu = data[u]
261
+ Gv, Nv = data[v]
262
+ return Gu.issubset(Gv) and Nu.issubset(Nv)
263
+
264
+ return LatticePoset([self, shard_comparison])
265
+
266
+ def bhz_poset(self):
267
+ r"""
268
+ Return the Bergeron-Hohlweg-Zabrocki partial order on the Coxeter
269
+ group.
270
+
271
+ This is a partial order on the elements of a finite
272
+ Coxeter group `W`, which is distinct from the Bruhat
273
+ order, the weak order and the shard intersection order. It
274
+ was defined in [BHZ2005]_.
275
+
276
+ This partial order is not a lattice, as there is no unique
277
+ maximal element. It can be succinctly defined as follows.
278
+
279
+ Let `u` and `v` be two elements of the Coxeter group `W`. Let
280
+ `S(u)` be the support of `u`. Then `u \leq v` if and only
281
+ if `v_{S(u)} = u` (here `v = v^I v_I` denotes the usual
282
+ parabolic decomposition with respect to the standard parabolic
283
+ subgroup `W_I`).
284
+
285
+ .. SEEALSO::
286
+
287
+ :meth:`bruhat_poset`, :meth:`shard_poset`, :meth:`weak_poset`
288
+
289
+ EXAMPLES::
290
+
291
+ sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
292
+ sage: P = W.bhz_poset(); P
293
+ Finite poset containing 24 elements
294
+ sage: P.relations_number()
295
+ 103
296
+ sage: P.chain_polynomial()
297
+ 34*q^4 + 90*q^3 + 79*q^2 + 24*q + 1
298
+ sage: len(P.maximal_elements())
299
+ 13
300
+ """
301
+ from sage.graphs.digraph import DiGraph
302
+ from sage.combinat.posets.posets import Poset
303
+
304
+ def covered_by(ux, vy):
305
+ u, iu, Su = ux
306
+ v, iv, Sv = vy
307
+ if len(Sv) != len(Su) + 1:
308
+ return False
309
+ if not all(u in Sv for u in Su):
310
+ return False
311
+ return all((v * iu).has_descent(x, positive=True) for x in Su)
312
+
313
+ vertices = [(u, u.inverse(),
314
+ tuple(set(u.reduced_word_reverse_iterator())))
315
+ for u in self]
316
+ dg = DiGraph([vertices, covered_by])
317
+ dg.relabel(lambda x: x[0])
318
+ return Poset(dg, cover_relations=True)
319
+
320
+ def degrees(self):
321
+ """
322
+ Return the degrees of the Coxeter group.
323
+
324
+ The output is an increasing list of integers.
325
+
326
+ EXAMPLES::
327
+
328
+ sage: CoxeterGroup(['A', 4]).degrees()
329
+ (2, 3, 4, 5)
330
+ sage: CoxeterGroup(['B', 4]).degrees()
331
+ (2, 4, 6, 8)
332
+ sage: CoxeterGroup(['D', 4]).degrees()
333
+ (2, 4, 4, 6)
334
+ sage: CoxeterGroup(['F', 4]).degrees()
335
+ (2, 6, 8, 12)
336
+ sage: CoxeterGroup(['E', 8]).degrees()
337
+ (2, 8, 12, 14, 18, 20, 24, 30)
338
+ sage: CoxeterGroup(['H', 3]).degrees()
339
+ (2, 6, 10)
340
+
341
+ sage: WeylGroup([["A",3], ["A",3], ["B",2]]).degrees()
342
+ (2, 3, 4, 2, 3, 4, 2, 4)
343
+
344
+ TESTS::
345
+
346
+ sage: CoxeterGroup(['A', 4]).degrees()
347
+ (2, 3, 4, 5)
348
+ sage: SymmetricGroup(3).degrees()
349
+ (2, 3)
350
+ """
351
+ from sage.rings.qqbar import QQbar
352
+ from sage.rings.integer_ring import ZZ
353
+
354
+ def degrees_of_irreducible_component(I):
355
+ """Return the degrees for the irreducible component indexed by I"""
356
+ # A Coxeter element
357
+ s = self.simple_reflections()
358
+ c = self.prod(s[i] for i in I)
359
+ roots = c.matrix().change_ring(QQbar).charpoly().roots()
360
+ args = ((z.rational_argument(), m) for z, m in roots)
361
+ args = [(z if z >= 0 else 1 + z, m) for z, m in args]
362
+ h = max(z.denominator() for z, m in args)
363
+ return tuple(sorted(ZZ(z * h + 1)
364
+ for z, m in args if z
365
+ for i in range(m)))
366
+
367
+ return sum((degrees_of_irreducible_component(I)
368
+ for I in self.irreducible_component_index_sets()), ())
369
+
370
+ def codegrees(self):
371
+ """
372
+ Return the codegrees of the Coxeter group.
373
+
374
+ These are just the degrees minus 2.
375
+
376
+ EXAMPLES::
377
+
378
+ sage: CoxeterGroup(['A', 4]).codegrees()
379
+ (0, 1, 2, 3)
380
+ sage: CoxeterGroup(['B', 4]).codegrees()
381
+ (0, 2, 4, 6)
382
+ sage: CoxeterGroup(['D', 4]).codegrees()
383
+ (0, 2, 2, 4)
384
+ sage: CoxeterGroup(['F', 4]).codegrees()
385
+ (0, 4, 6, 10)
386
+ sage: CoxeterGroup(['E', 8]).codegrees()
387
+ (0, 6, 10, 12, 16, 18, 22, 28)
388
+ sage: CoxeterGroup(['H', 3]).codegrees()
389
+ (0, 4, 8)
390
+
391
+ sage: WeylGroup([["A",3], ["A",3], ["B",2]]).codegrees()
392
+ (0, 1, 2, 0, 1, 2, 0, 2)
393
+ """
394
+ return tuple(d - 2 for d in self.degrees())
395
+
396
+ @cached_method
397
+ def weak_poset(self, side='right', facade=False):
398
+ """
399
+ INPUT:
400
+
401
+ - ``side`` -- "left", "right", or "twosided" (default: ``'right'``)
402
+ - ``facade`` -- boolean (default: ``False``)
403
+
404
+ Returns the left (resp. right) poset for weak order. In
405
+ this poset, `u` is smaller than `v` if some reduced word
406
+ of `u` is a right (resp. left) factor of some reduced word
407
+ of `v`.
408
+
409
+ .. SEEALSO::
410
+
411
+ :meth:`bhz_poset`, :meth:`bruhat_poset`, :meth:`shard_poset`
412
+
413
+ EXAMPLES::
414
+
415
+ sage: W = WeylGroup(["A", 2])
416
+ sage: P = W.weak_poset()
417
+ sage: P
418
+ Finite lattice containing 6 elements
419
+ sage: P.show() # needs sage.plot
420
+
421
+ This poset is in fact a lattice::
422
+
423
+ sage: W = WeylGroup(["B", 3])
424
+ sage: P = W.weak_poset(side = "left")
425
+ sage: P.is_lattice()
426
+ True
427
+
428
+ so this method has an alias :meth:`weak_lattice`::
429
+
430
+ sage: W.weak_lattice(side = "left") is W.weak_poset(side = "left")
431
+ True
432
+
433
+ As a bonus feature, one can create the left-right weak
434
+ poset::
435
+
436
+ sage: W = WeylGroup(["A",2])
437
+ sage: P = W.weak_poset(side = "twosided")
438
+ sage: P.show() # needs sage.plot
439
+ sage: len(P.hasse_diagram().edges(sort=False))
440
+ 8
441
+
442
+ This is the transitive closure of the union of left and
443
+ right order. In this poset, `u` is smaller than `v` if
444
+ some reduced word of `u` is a factor of some reduced word
445
+ of `v`. Note that this is not a lattice::
446
+
447
+ sage: P.is_lattice()
448
+ False
449
+
450
+ By default, the elements of `P` are aware of that they
451
+ belong to `P`::
452
+
453
+ sage: P.an_element().parent()
454
+ Finite poset containing 6 elements
455
+
456
+ If instead one wants the elements to be plain elements of
457
+ the Coxeter group, one can use the ``facade`` option::
458
+
459
+ sage: P = W.weak_poset(facade = True)
460
+ sage: P.an_element().parent()
461
+ Weyl Group of type ['A', 2] (as a matrix group acting on the ambient space)
462
+
463
+ .. SEEALSO:: :func:`Poset` for more on posets and facade posets.
464
+
465
+ TESTS::
466
+
467
+ sage: [len(WeylGroup(["A", n]).weak_poset(side = "right").cover_relations()) for n in [1,2,3]]
468
+ [1, 6, 36]
469
+ sage: [len(WeylGroup(["A", n]).weak_poset(side = "left" ).cover_relations()) for n in [1,2,3]]
470
+ [1, 6, 36]
471
+
472
+ .. TODO::
473
+
474
+ - Use the symmetric group in the examples (for nicer
475
+ output), and print the edges for a stronger test.
476
+ - The constructed poset should be lazy, in order to
477
+ handle large / infinite Coxeter groups.
478
+ """
479
+ from sage.combinat.posets.posets import Poset
480
+ from sage.combinat.posets.lattices import LatticePoset
481
+ if side == "twosided":
482
+ covers = tuple([u, v] for u in self for v in u.upper_covers(side='left') + u.upper_covers(side='right'))
483
+ return Poset((self, covers), cover_relations=True,
484
+ facade=facade)
485
+ covers = tuple([u, v] for u in self for v in u.upper_covers(side=side))
486
+ return LatticePoset((self, covers), cover_relations=True,
487
+ facade=facade)
488
+
489
+ weak_lattice = weak_poset
490
+
491
+ def inversion_sequence(self, word):
492
+ r"""
493
+ Return the inversion sequence corresponding to the ``word``
494
+ in indices of simple generators of ``self``.
495
+
496
+ If ``word`` corresponds to `[w_0,w_1,...w_k]`, the output is
497
+ `[w_0,w_0w_1w_0,\ldots,w_0w_1\cdots w_k \cdots w_1 w_0]`.
498
+
499
+ INPUT:
500
+
501
+ - ``word`` -- a word in the indices of the simple
502
+ generators of ``self``
503
+
504
+ EXAMPLES::
505
+
506
+ sage: CoxeterGroup(["A", 2]).inversion_sequence([1,2,1])
507
+ [
508
+ [-1 1] [ 0 -1] [ 1 0]
509
+ [ 0 1], [-1 0], [ 1 -1]
510
+ ]
511
+
512
+ sage: [t.reduced_word() for t in CoxeterGroup(["A",3]).inversion_sequence([2,1,3,2,1,3])]
513
+ [[2], [1, 2, 1], [2, 3, 2], [1, 2, 3, 2, 1], [3], [1]]
514
+ """
515
+ return [self.from_reduced_word(word[:i+1]+list(reversed(word[:i])))
516
+ for i in range(len(word))]
517
+
518
+ def reflections_from_w0(self):
519
+ """
520
+ Return the reflections of ``self`` using the inversion set
521
+ of ``w_0``.
522
+
523
+ EXAMPLES::
524
+
525
+ sage: WeylGroup(['A',2]).reflections_from_w0()
526
+ [
527
+ [0 1 0] [0 0 1] [1 0 0]
528
+ [1 0 0] [0 1 0] [0 0 1]
529
+ [0 0 1], [1 0 0], [0 1 0]
530
+ ]
531
+
532
+ sage: WeylGroup(['A',3]).reflections_from_w0()
533
+ [
534
+ [0 1 0 0] [0 0 1 0] [1 0 0 0] [0 0 0 1] [1 0 0 0] [1 0 0 0]
535
+ [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 1 0 0] [0 0 0 1] [0 1 0 0]
536
+ [0 0 1 0] [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 1 0] [0 0 0 1]
537
+ [0 0 0 1], [0 0 0 1], [0 0 0 1], [1 0 0 0], [0 1 0 0], [0 0 1 0]
538
+ ]
539
+ """
540
+ return self.long_element().inversions_as_reflections()
541
+
542
+ @cached_method
543
+ def m_cambrian_lattice(self, c, m=1, on_roots=False):
544
+ """
545
+ Return the `m`-Cambrian lattice on `m`-delta sequences.
546
+
547
+ See :arxiv:`1503.00710` and :arxiv:`math/0611106`.
548
+
549
+ The `m`-delta sequences are certain `m`-colored minimal
550
+ factorizations of `c` into reflections.
551
+
552
+ INPUT:
553
+
554
+ - ``c`` -- a Coxeter element of ``self`` (as a tuple, or
555
+ as an element of ``self``)
556
+
557
+ - ``m`` -- positive integer (default: 1)
558
+
559
+ - ``on_roots`` -- boolean (default: ``False``); if
560
+ ``on_roots`` is ``True``, the lattice is realized on
561
+ roots rather than on reflections. In order for this to
562
+ work, the ElementMethod ``reflection_to_root`` must be
563
+ available.
564
+
565
+ EXAMPLES::
566
+
567
+ sage: CoxeterGroup(["A",2]).m_cambrian_lattice((1,2))
568
+ Finite lattice containing 5 elements
569
+
570
+ sage: CoxeterGroup(["A",2]).m_cambrian_lattice((1,2),2)
571
+ Finite lattice containing 12 elements
572
+ """
573
+ from sage.combinat.posets.lattices import LatticePoset
574
+ if hasattr(c, "reduced_word"):
575
+ c = c.reduced_word()
576
+ c = list(c)
577
+
578
+ sorting_word = self.long_element().coxeter_sorting_word(c)
579
+
580
+ if on_roots:
581
+ if not hasattr(self.long_element(), "reflection_to_root"):
582
+ raise ValueError("The parameter 'on_root=True' needs "
583
+ "the ElementMethod 'reflection_to_root'")
584
+
585
+ inv_woc = [t.reflection_to_root()
586
+ for t in self.inversion_sequence(sorting_word)]
587
+ S = [s.reflection_to_root() for s in self.simple_reflections()]
588
+ PhiP = [t.reflection_to_root() for t in self.reflections()]
589
+ else:
590
+ inv_woc = self.inversion_sequence(sorting_word)
591
+ S = self.simple_reflections()
592
+ T = self.reflections_from_w0()
593
+ Twords = {t: t.reduced_word() for t in T}
594
+
595
+ elements = set()
596
+ covers = []
597
+
598
+ bottom_elt = frozenset((s, 0) for s in S)
599
+ new = {bottom_elt}
600
+ while new:
601
+ new_element = new.pop()
602
+ elements.add(new_element)
603
+ for t in new_element:
604
+ if t[1] < m:
605
+ cov_element = [s for s in new_element if s != t]
606
+ cov_element.append((t[0], t[1] + 1))
607
+ idx_t0 = inv_woc.index(t[0])
608
+ for t_conj in [(i, t[1]) for i in inv_woc[idx_t0:]] + [(i, t[1] + 1) for i in inv_woc[:idx_t0]]:
609
+ if t_conj in cov_element:
610
+ cov_element.remove(t_conj)
611
+ if on_roots:
612
+ tmp = t_conj[0].weyl_action(t[0].associated_reflection())
613
+ if tmp in PhiP:
614
+ cov_element.append((tmp, t_conj[1]))
615
+ else:
616
+ cov_element.append((-tmp, t_conj[1] - 1))
617
+ else:
618
+ tmp = t[0] * t_conj[0] * t[0]
619
+ invs = self.inversion_sequence(Twords[t[0]]+Twords[t_conj[0]])
620
+ plus_or_minus = invs.count(tmp)
621
+ if plus_or_minus % 2:
622
+ cov_element.append((tmp, t_conj[1]))
623
+ else:
624
+ cov_element.append((tmp, t_conj[1] - 1))
625
+
626
+ cov_element = frozenset(cov_element)
627
+ if cov_element not in elements:
628
+ new.add(cov_element)
629
+ covers.append((new_element, cov_element))
630
+ return LatticePoset([elements, covers], cover_relations=True)
631
+
632
+ def cambrian_lattice(self, c, on_roots=False):
633
+ """
634
+ Return the `c`-Cambrian lattice on delta sequences.
635
+
636
+ See :arxiv:`1503.00710` and :arxiv:`math/0611106`.
637
+
638
+ Delta sequences are certain 2-colored minimal factorizations
639
+ of `c` into reflections.
640
+
641
+ INPUT:
642
+
643
+ - ``c`` -- a standard Coxeter element in ``self``
644
+ (as a tuple, or as an element of ``self``)
645
+
646
+ - ``on_roots`` -- boolean (default: ``False``); if
647
+ ``on_roots`` is ``True``, the lattice is realized on
648
+ roots rather than on reflections. In order for this to
649
+ work, the ElementMethod ``reflection_to_root`` must be
650
+ available.
651
+
652
+ EXAMPLES::
653
+
654
+ sage: CoxeterGroup(["A", 2]).cambrian_lattice((1,2))
655
+ Finite lattice containing 5 elements
656
+
657
+ sage: CoxeterGroup(["B", 2]).cambrian_lattice((1,2))
658
+ Finite lattice containing 6 elements
659
+
660
+ sage: CoxeterGroup(["G", 2]).cambrian_lattice((1,2))
661
+ Finite lattice containing 8 elements
662
+ """
663
+ return self.m_cambrian_lattice(c=c, m=1, on_roots=on_roots)
664
+
665
+ def is_real(self):
666
+ """
667
+ Return ``True`` since ``self`` is a real reflection group.
668
+
669
+ EXAMPLES::
670
+
671
+ sage: CoxeterGroup(['F',4]).is_real()
672
+ True
673
+ sage: CoxeterGroup(['H',4]).is_real()
674
+ True
675
+ """
676
+ return True
677
+
678
+ def permutahedron(self, point=None, base_ring=None):
679
+ r"""
680
+ Return the permutahedron of ``self``.
681
+
682
+ This is the convex hull of the point ``point`` in the weight
683
+ basis under the action of ``self`` on the underlying vector
684
+ space `V`.
685
+
686
+ .. SEEALSO::
687
+
688
+ :meth:`~sage.combinat.root_system.reflection_group_real.permutahedron`
689
+
690
+ INPUT:
691
+
692
+ - ``point`` -- (optional) a point given by its coordinates in
693
+ the weight basis (default: `(1, 1, 1, \ldots)`)
694
+ - ``base_ring`` -- (optional) the base ring of the polytope
695
+
696
+ .. NOTE::
697
+
698
+ The result is expressed in the root basis coordinates.
699
+
700
+ .. NOTE::
701
+
702
+ If function is too slow, switching the base ring to
703
+ :class:`RDF` will almost certainly speed things up.
704
+
705
+ EXAMPLES::
706
+
707
+ sage: W = CoxeterGroup(['H',3], base_ring=RDF) # needs sage.symbolic
708
+ sage: W.permutahedron() # needs sage.symbolic
709
+ doctest:warning
710
+ ...
711
+ UserWarning: This polyhedron data is numerically complicated; cdd could not convert between the inexact V and H representation without loss of data. The resulting object might show inconsistencies.
712
+ A 3-dimensional polyhedron in RDF^3 defined as the convex hull of 120 vertices
713
+
714
+ sage: W = CoxeterGroup(['I',7])
715
+ sage: W.permutahedron()
716
+ A 2-dimensional polyhedron in AA^2 defined as the convex hull of 14 vertices
717
+ sage: W.permutahedron(base_ring=RDF)
718
+ A 2-dimensional polyhedron in RDF^2 defined as the convex hull of 14 vertices
719
+
720
+ sage: W = ReflectionGroup(['A',3]) # optional - gap3
721
+ sage: W.permutahedron() # optional - gap3
722
+ A 3-dimensional polyhedron in QQ^3 defined as the convex hull
723
+ of 24 vertices
724
+
725
+ sage: W = ReflectionGroup(['A',3],['B',2]) # optional - gap3
726
+ sage: W.permutahedron() # optional - gap3
727
+ A 5-dimensional polyhedron in QQ^5 defined as the convex hull of 192 vertices
728
+
729
+ TESTS::
730
+
731
+ sage: W = ReflectionGroup(['A',3]) # optional - gap3
732
+ sage: W.permutahedron([3,5,8]) # optional - gap3
733
+ A 3-dimensional polyhedron in QQ^3 defined as the convex hull
734
+ of 24 vertices
735
+
736
+
737
+ .. PLOT::
738
+ :width: 300 px
739
+
740
+ W = CoxeterGroup(['I',7])
741
+ p = W.permutahedron()
742
+ sphinx_plot(p)
743
+ """
744
+ n = self.one().canonical_matrix().rank()
745
+ weights = self.fundamental_weights()
746
+ if point is None:
747
+ from sage.rings.integer_ring import ZZ
748
+ point = [ZZ.one()] * n
749
+ v = sum(point[i-1] * weights[i] for i in weights.keys())
750
+ vertices = [v*w for w in self]
751
+ if base_ring is None:
752
+ if isinstance(v.base_ring(), (sage.rings.abc.UniversalCyclotomicField,
753
+ sage.rings.abc.AlgebraicField_common)):
754
+ from sage.rings.qqbar import AA
755
+ vertices = [v.change_ring(AA) for v in vertices]
756
+ base_ring = AA
757
+ from sage.geometry.polyhedron.constructor import Polyhedron
758
+ return Polyhedron(vertices=vertices, base_ring=base_ring)
759
+
760
+ def coxeter_poset(self):
761
+ r"""
762
+ Return the Coxeter poset of ``self``.
763
+
764
+ Let `W` be a Coxeter group. The *Coxeter poset* is defined as
765
+ the set of (right) standard cosets `gW_J`, where `J` is a
766
+ subset of the index set `I` of `W`, ordered by reverse inclusion.
767
+
768
+ This is equal to the face poset of the :meth:`Coxeter complex
769
+ <coxeter_complex()>`.
770
+
771
+ EXAMPLES::
772
+
773
+ sage: W = CoxeterGroup(['A', 3])
774
+ sage: P = W.coxeter_poset()
775
+ sage: P
776
+ Finite meet-semilattice containing 75 elements
777
+ sage: P.rank()
778
+ 3
779
+
780
+ sage: W = WeylGroup(['B', 3])
781
+ sage: P = W.coxeter_poset()
782
+ sage: P
783
+ Finite meet-semilattice containing 147 elements
784
+ sage: P.rank()
785
+ 3
786
+
787
+ sage: W = CoxeterGroup(['I', 7])
788
+ sage: P = W.coxeter_poset()
789
+ sage: P
790
+ Finite meet-semilattice containing 29 elements
791
+ sage: P.rank()
792
+ 2
793
+
794
+ sage: W = CoxeterGroup(['H', 3])
795
+ sage: P = W.coxeter_poset()
796
+ sage: P
797
+ Finite meet-semilattice containing 363 elements
798
+ sage: P.rank()
799
+ 3
800
+
801
+ sage: # optional - gap3
802
+ sage: W = CoxeterGroup(['H', 3], implementation='permutation')
803
+ sage: P = W.coxeter_poset()
804
+ sage: P
805
+ Finite meet-semilattice containing 363 elements
806
+ sage: P.rank()
807
+ 3
808
+ """
809
+ I = self.index_set()
810
+ data = {}
811
+ next_level = {(g, ()) for g in self}
812
+ while next_level:
813
+ cur = next_level
814
+ next_level = set()
815
+ for Y in cur:
816
+ g, J = Y
817
+ for i in I:
818
+ if i in J:
819
+ continue
820
+ Jp = tuple(sorted(J + (i,)))
821
+ gp = g.coset_representative(Jp, side='right')
822
+ X = (gp, Jp)
823
+ if X in data:
824
+ data[X].append(Y)
825
+ else:
826
+ data[X] = [Y]
827
+ next_level.add(X)
828
+ from sage.combinat.posets.lattices import MeetSemilattice
829
+ return MeetSemilattice(data)
830
+
831
+ def coxeter_complex(self):
832
+ r"""
833
+ Return the Coxeter complex of ``self``.
834
+
835
+ Let `W` be a Coxeter group, and let `X` be the corresponding Tits
836
+ cone, which is constructed as the `W` orbit of the fundamental
837
+ chamber in the reflection representation. The *Coxeter complex*
838
+ of `W` is the simplicial complex `(X \setminus \{0\}) / \RR_{>0}`.
839
+ The face poset of this simplicial complex is given by the
840
+ :meth:`coxeter_poset()`. When `W` is a finite group, then the
841
+ Coxeter complex is homeomorphic to an `(n-1)`-dimensional sphere,
842
+ where `n` is the rank of `W`.
843
+
844
+ EXAMPLES::
845
+
846
+ sage: W = CoxeterGroup(['A', 3])
847
+ sage: C = W.coxeter_complex()
848
+ sage: C
849
+ Simplicial complex with 14 vertices and 24 facets
850
+ sage: C.homology()
851
+ {0: 0, 1: 0, 2: Z}
852
+
853
+ sage: W = WeylGroup(['B', 3])
854
+ sage: C = W.coxeter_complex()
855
+ sage: C
856
+ Simplicial complex with 26 vertices and 48 facets
857
+ sage: C.homology()
858
+ {0: 0, 1: 0, 2: Z}
859
+
860
+ sage: W = CoxeterGroup(['I', 7])
861
+ sage: C = W.coxeter_complex()
862
+ sage: C
863
+ Simplicial complex with 14 vertices and 14 facets
864
+ sage: C.homology()
865
+ {0: 0, 1: Z}
866
+
867
+ sage: W = CoxeterGroup(['H', 3])
868
+ sage: C = W.coxeter_complex()
869
+ sage: C
870
+ Simplicial complex with 62 vertices and 120 facets
871
+ sage: C.homology()
872
+ {0: 0, 1: 0, 2: Z}
873
+
874
+ sage: # optional - gap3
875
+ sage: W = CoxeterGroup(['H', 3], implementation='permutation')
876
+ sage: C = W.coxeter_complex()
877
+ sage: C
878
+ Simplicial complex with 62 vertices and 120 facets
879
+ sage: C.homology()
880
+ {0: 0, 1: 0, 2: Z}
881
+ """
882
+ I = self.index_set()
883
+ facets = {}
884
+ Ip = {i: tuple([j for j in I if j != i]) for i in I}
885
+ for g in self:
886
+ V = []
887
+ for i in I:
888
+ gp = g
889
+ D = gp.descents(side='right')
890
+ if D and D[0] == i:
891
+ D.pop(0)
892
+ while D:
893
+ gp = gp.apply_simple_reflection(D[0])
894
+ D = gp.descents(side='right')
895
+ if D and D[0] == i:
896
+ D.pop(0)
897
+ V.append((gp, Ip[i]))
898
+ facets[g] = V
899
+ verts = set()
900
+ for F in facets.values():
901
+ verts.update(F)
902
+ labels = {x: i for i, x in enumerate(verts)}
903
+ result = [[labels[v] for v in F] for F in facets.values()]
904
+ from sage.topology.simplicial_complex import SimplicialComplex
905
+ return SimplicialComplex(result)
906
+
907
+ class ElementMethods:
908
+
909
+ def absolute_length(self):
910
+ """
911
+ Return the absolute length of ``self``.
912
+
913
+ The absolute length is the length of the shortest expression
914
+ of the element as a product of reflections. For finite Coxeter
915
+ groups, the absolute length is the codimension of the
916
+ 1-eigenspace of the element (Lemmas 1-3 in [Car1972a]_).
917
+
918
+ For permutations in the symmetric groups, the absolute
919
+ length is the size minus the number of its disjoint
920
+ cycles.
921
+
922
+ .. SEEALSO::
923
+
924
+ :meth:`~sage.categories.coxeter_groups.absolute_le`
925
+
926
+ EXAMPLES::
927
+
928
+ sage: W = WeylGroup(["A", 3]) # needs sage.combinat sage.groups
929
+ sage: s = W.simple_reflections() # needs sage.combinat sage.groups
930
+ sage: (s[1]*s[2]*s[3]).absolute_length() # needs sage.combinat sage.groups
931
+ 3
932
+
933
+ sage: W = SymmetricGroup(4) # needs sage.groups
934
+ sage: s = W.simple_reflections() # needs sage.groups
935
+ sage: (s[3]*s[2]*s[1]).absolute_length() # needs sage.combinat sage.groups
936
+ 3
937
+ """
938
+ M = self.canonical_matrix()
939
+ return (M - 1).image().dimension()
940
+
941
+ @cached_in_parent_method
942
+ def bruhat_upper_covers(self):
943
+ r"""
944
+ Return all the elements that cover ``self`` in Bruhat order.
945
+
946
+ EXAMPLES::
947
+
948
+ sage: W = WeylGroup(["A",4])
949
+ sage: w = W.from_reduced_word([3,2])
950
+ sage: print([v.reduced_word() for v in w.bruhat_upper_covers()])
951
+ [[4, 3, 2], [3, 4, 2], [2, 3, 2], [3, 1, 2], [3, 2, 1]]
952
+
953
+ sage: W = WeylGroup(["B",6])
954
+ sage: w = W.from_reduced_word([1,2,1,4,5])
955
+ sage: C = w.bruhat_upper_covers()
956
+ sage: len(C)
957
+ 9
958
+ sage: print([v.reduced_word() for v in C])
959
+ [[6, 4, 5, 1, 2, 1], [4, 5, 6, 1, 2, 1], [3, 4, 5, 1, 2, 1], [2, 3, 4, 5, 1, 2],
960
+ [1, 2, 3, 4, 5, 1], [4, 5, 4, 1, 2, 1], [4, 5, 3, 1, 2, 1], [4, 5, 2, 3, 1, 2],
961
+ [4, 5, 1, 2, 3, 1]]
962
+ sage: ww = W.from_reduced_word([5,6,5])
963
+ sage: CC = ww.bruhat_upper_covers()
964
+ sage: print([v.reduced_word() for v in CC])
965
+ [[6, 5, 6, 5], [4, 5, 6, 5], [5, 6, 4, 5], [5, 6, 5, 4], [5, 6, 5, 3], [5, 6, 5, 2],
966
+ [5, 6, 5, 1]]
967
+
968
+ Recursive algorithm: write `w` for ``self``. If `i` is a
969
+ non-descent of `w`, then the covers of `w` are exactly
970
+ `\{ws_i, u_1s_i, u_2s_i,..., u_js_i\}`, where the `u_k`
971
+ are those covers of `ws_i` that have a descent at `i`.
972
+ """
973
+
974
+ i = self.first_descent(positive=True, side='right')
975
+ if i is not None:
976
+ wsi = self.apply_simple_reflection(i, side='right')
977
+ return [u.apply_simple_reflection(i, side='right')
978
+ for u in wsi.bruhat_upper_covers()
979
+ if u.has_descent(i, side='right')] + [wsi]
980
+ return []
981
+
982
+ def coxeter_knuth_neighbor(self, w):
983
+ r"""
984
+ Return the Coxeter-Knuth (oriented) neighbors of the reduced word `w` of ``self``.
985
+
986
+ INPUT:
987
+
988
+ - ``w`` -- reduced word of ``self``
989
+
990
+ The Coxeter-Knuth relations are given by `a a+1 a \sim a+1 a a+1`, `abc \sim acb`
991
+ if `b<a<c` and `abc \sim bac` if `a<c<b`. This method returns all neighbors of
992
+ ``w`` under the Coxeter-Knuth relations oriented from left to right.
993
+
994
+ EXAMPLES::
995
+
996
+ sage: W = WeylGroup(['A',4], prefix='s')
997
+ sage: word = [1,2,1,3,2]
998
+ sage: w = W.from_reduced_word(word)
999
+ sage: w.coxeter_knuth_neighbor(word)
1000
+ {(1, 2, 3, 1, 2), (2, 1, 2, 3, 2)}
1001
+
1002
+ sage: word = [1,2,1,3,2,4,3]
1003
+ sage: w = W.from_reduced_word(word)
1004
+ sage: w.coxeter_knuth_neighbor(word)
1005
+ {(1, 2, 1, 3, 4, 2, 3), (1, 2, 3, 1, 2, 4, 3), (2, 1, 2, 3, 2, 4, 3)}
1006
+
1007
+ TESTS::
1008
+
1009
+ sage: W = WeylGroup(['B',4], prefix='s')
1010
+ sage: word = [1,2]
1011
+ sage: w = W.from_reduced_word(word)
1012
+ sage: w.coxeter_knuth_neighbor(word)
1013
+ Traceback (most recent call last):
1014
+ ...
1015
+ NotImplementedError: this has only been implemented in finite type A so far
1016
+ """
1017
+ C = self.parent().cartan_type()
1018
+ if not C[0] == 'A':
1019
+ raise NotImplementedError("this has only been implemented in finite type A so far")
1020
+ d = []
1021
+ for i in range(2, len(w)):
1022
+ v = list(w)
1023
+ if w[i-2] == w[i]:
1024
+ if w[i] == w[i-1] - 1:
1025
+ v[i-2] = w[i-1]
1026
+ v[i] = w[i-1]
1027
+ v[i-1] = w[i]
1028
+ d += [tuple(v)]
1029
+ elif w[i-1] < w[i-2] and w[i-2] < w[i]:
1030
+ v[i] = w[i-1]
1031
+ v[i-1] = w[i]
1032
+ d += [tuple(v)]
1033
+ elif w[i-2] < w[i] and w[i] < w[i-1]:
1034
+ v[i-2] = w[i-1]
1035
+ v[i-1] = w[i-2]
1036
+ d += [tuple(v)]
1037
+ return set(d)
1038
+
1039
+ def coxeter_knuth_graph(self):
1040
+ r"""
1041
+ Return the Coxeter-Knuth graph of type `A`.
1042
+
1043
+ The Coxeter-Knuth graph of type `A` is generated by the Coxeter-Knuth relations which are
1044
+ given by `a a+1 a \sim a+1 a a+1`, `abc \sim acb` if `b<a<c` and `abc \sim bac` if `a<c<b`.
1045
+
1046
+ EXAMPLES::
1047
+
1048
+ sage: W = WeylGroup(['A',4], prefix='s')
1049
+ sage: w = W.from_reduced_word([1,2,1,3,2])
1050
+ sage: D = w.coxeter_knuth_graph()
1051
+ sage: D.vertices(sort=True)
1052
+ [(1, 2, 1, 3, 2),
1053
+ (1, 2, 3, 1, 2),
1054
+ (2, 1, 2, 3, 2),
1055
+ (2, 1, 3, 2, 3),
1056
+ (2, 3, 1, 2, 3)]
1057
+ sage: D.edges(sort=True)
1058
+ [((1, 2, 1, 3, 2), (1, 2, 3, 1, 2), None),
1059
+ ((1, 2, 1, 3, 2), (2, 1, 2, 3, 2), None),
1060
+ ((2, 1, 2, 3, 2), (2, 1, 3, 2, 3), None),
1061
+ ((2, 1, 3, 2, 3), (2, 3, 1, 2, 3), None)]
1062
+
1063
+ sage: w = W.from_reduced_word([1,3])
1064
+ sage: D = w.coxeter_knuth_graph()
1065
+ sage: D.vertices(sort=True)
1066
+ [(1, 3), (3, 1)]
1067
+ sage: D.edges(sort=False)
1068
+ []
1069
+
1070
+ TESTS::
1071
+
1072
+ sage: W = WeylGroup(['B',4], prefix='s')
1073
+ sage: w = W.from_reduced_word([1,2])
1074
+ sage: w.coxeter_knuth_graph()
1075
+ Traceback (most recent call last):
1076
+ ...
1077
+ NotImplementedError: this has only been implemented in finite type A so far
1078
+ """
1079
+ from sage.graphs.graph import Graph
1080
+ R = [tuple(v) for v in self.reduced_words()]
1081
+ G = Graph()
1082
+ G.add_vertices(R)
1083
+ G.add_edges([v, vp] for v in R for vp in self.coxeter_knuth_neighbor(v))
1084
+ return G
1085
+
1086
+ def is_coxeter_element(self):
1087
+ r"""
1088
+ Return whether this is a Coxeter element.
1089
+
1090
+ This is, whether ``self`` has an eigenvalue `e^{2\pi i/h}`
1091
+ where `h` is the Coxeter number.
1092
+
1093
+ .. SEEALSO:: :meth:`~sage.categories.finite_complex_reflection_groups.coxeter_elements`
1094
+
1095
+ EXAMPLES::
1096
+
1097
+ sage: W = CoxeterGroup(['A',2])
1098
+ sage: c = prod(W.gens())
1099
+ sage: c.is_coxeter_element()
1100
+ True
1101
+ sage: W.one().is_coxeter_element()
1102
+ False
1103
+
1104
+ sage: W = WeylGroup(['G', 2])
1105
+ sage: c = prod(W.gens())
1106
+ sage: c.is_coxeter_element()
1107
+ True
1108
+ sage: W.one().is_coxeter_element()
1109
+ False
1110
+ """
1111
+ return self in self.parent().coxeter_elements()
1112
+
1113
+ def covered_reflections_subgroup(self):
1114
+ """
1115
+ Return the subgroup of `W` generated by the conjugates by `w`
1116
+ of the simple reflections indexed by right descents of `w`.
1117
+
1118
+ This is used to compute the shard intersection order on `W`.
1119
+
1120
+ EXAMPLES::
1121
+
1122
+ sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
1123
+ sage: len(W.long_element().covered_reflections_subgroup())
1124
+ 24
1125
+ sage: s = W.simple_reflection(1)
1126
+ sage: Gs = s.covered_reflections_subgroup()
1127
+ sage: len(Gs)
1128
+ 2
1129
+ sage: s in [u.lift() for u in Gs]
1130
+ True
1131
+ sage: len(W.one().covered_reflections_subgroup())
1132
+ 1
1133
+ """
1134
+ W = self.parent()
1135
+ winv = ~self
1136
+ cov_down = [self * W.simple_reflection(i) * winv
1137
+ for i in self.descents(side='right')]
1138
+ return W.submonoid(cov_down)