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,980 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.combinat sage.graphs sage.modules
3
+ r"""
4
+ Highest Weight Crystals
5
+ """
6
+ # ****************************************************************************
7
+ # Copyright (C) 2010 Anne Schilling <anne at math.ucdavis.edu>
8
+ #
9
+ # Distributed under the terms of the GNU General Public License (GPL)
10
+ # https://www.gnu.org/licenses/
11
+ # *****************************************************************************
12
+
13
+ from sage.misc.cachefunc import cached_method
14
+ from sage.categories.category_singleton import Category_singleton
15
+ from sage.categories.crystals import (Crystals, CrystalHomset,
16
+ CrystalMorphismByGenerators)
17
+ from sage.categories.tensor import TensorProductsCategory
18
+
19
+
20
+ class HighestWeightCrystals(Category_singleton):
21
+ """
22
+ The category of highest weight crystals.
23
+
24
+ A crystal is highest weight if it is acyclic; in particular, every
25
+ connected component has a unique highest weight element, and that
26
+ element generate the component.
27
+
28
+ EXAMPLES::
29
+
30
+ sage: C = HighestWeightCrystals()
31
+ sage: C
32
+ Category of highest weight crystals
33
+ sage: C.super_categories()
34
+ [Category of crystals]
35
+ sage: C.example()
36
+ Highest weight crystal of type A_3 of highest weight omega_1
37
+
38
+ TESTS::
39
+
40
+ sage: TestSuite(C).run()
41
+ sage: B = HighestWeightCrystals().example()
42
+ sage: TestSuite(B).run(verbose = True)
43
+ running ._test_an_element() . . . pass
44
+ running ._test_cardinality() . . . pass
45
+ running ._test_category() . . . pass
46
+ running ._test_construction() . . . pass
47
+ running ._test_elements() . . .
48
+ Running the test suite of self.an_element()
49
+ running ._test_category() . . . pass
50
+ running ._test_eq() . . . pass
51
+ running ._test_new() . . . pass
52
+ running ._test_not_implemented_methods() . . . pass
53
+ running ._test_pickling() . . . pass
54
+ running ._test_stembridge_local_axioms() . . . pass
55
+ pass
56
+ running ._test_elements_eq_reflexive() . . . pass
57
+ running ._test_elements_eq_symmetric() . . . pass
58
+ running ._test_elements_eq_transitive() . . . pass
59
+ running ._test_elements_neq() . . . pass
60
+ running ._test_enumerated_set_contains() . . . pass
61
+ running ._test_enumerated_set_iter_cardinality() . . . pass
62
+ running ._test_enumerated_set_iter_list() . . . pass
63
+ running ._test_eq() . . . pass
64
+ running ._test_fast_iter() . . . pass
65
+ running ._test_new() . . . pass
66
+ running ._test_not_implemented_methods() . . . pass
67
+ running ._test_pickling() . . . pass
68
+ running ._test_some_elements() . . . pass
69
+ running ._test_stembridge_local_axioms() . . . pass
70
+ """
71
+
72
+ def super_categories(self):
73
+ r"""
74
+ EXAMPLES::
75
+
76
+ sage: HighestWeightCrystals().super_categories()
77
+ [Category of crystals]
78
+ """
79
+ return [Crystals()]
80
+
81
+ def example(self):
82
+ """
83
+ Return an example of highest weight crystals, as per
84
+ :meth:`Category.example`.
85
+
86
+ EXAMPLES::
87
+
88
+ sage: B = HighestWeightCrystals().example(); B
89
+ Highest weight crystal of type A_3 of highest weight omega_1
90
+ """
91
+ from sage.categories.crystals import Crystals
92
+ return Crystals().example()
93
+
94
+ def additional_structure(self):
95
+ r"""
96
+ Return ``None``.
97
+
98
+ Indeed, the category of highest weight crystals defines no
99
+ additional structure: it only guarantees the existence of a
100
+ unique highest weight element in each component.
101
+
102
+ .. SEEALSO:: :meth:`Category.additional_structure`
103
+
104
+ .. TODO:: Should this category be a :class:`CategoryWithAxiom`?
105
+
106
+ EXAMPLES::
107
+
108
+ sage: HighestWeightCrystals().additional_structure()
109
+ """
110
+ return None
111
+
112
+ class ParentMethods:
113
+
114
+ @cached_method
115
+ def highest_weight_vectors(self):
116
+ r"""
117
+ Return the highest weight vectors of ``self``.
118
+
119
+ This default implementation selects among the module
120
+ generators those that are highest weight, and caches the result.
121
+ A crystal element `b` is highest weight if `e_i(b)=0` for all `i` in the
122
+ index set.
123
+
124
+ EXAMPLES::
125
+
126
+ sage: C = crystals.Letters(['A',5])
127
+ sage: C.highest_weight_vectors()
128
+ (1,)
129
+
130
+ ::
131
+
132
+ sage: C = crystals.Letters(['A',2])
133
+ sage: T = crystals.TensorProduct(C, C, C, generators=[[C(2),C(1),C(1)],
134
+ ....: [C(1),C(2),C(1)]])
135
+ sage: T.highest_weight_vectors()
136
+ ([2, 1, 1], [1, 2, 1])
137
+ """
138
+ return tuple(g for g in self.module_generators if g.is_highest_weight())
139
+
140
+ def highest_weight_vector(self):
141
+ r"""
142
+ Return the highest weight vector if there is a single one;
143
+ otherwise, raises an error.
144
+
145
+ Caveat: this assumes that :meth:`.highest_weight_vectors`
146
+ returns a list or tuple.
147
+
148
+ EXAMPLES::
149
+
150
+ sage: C = crystals.Letters(['A',5])
151
+ sage: C.highest_weight_vector()
152
+ 1
153
+ """
154
+ hw = self.highest_weight_vectors()
155
+ if len(hw) == 1:
156
+ return hw[0]
157
+ else:
158
+ raise RuntimeError("The crystal does not have exactly one highest weight vector")
159
+
160
+ # TODO: Not every highest weight crystal is a lowest weight crystal
161
+ @cached_method
162
+ def lowest_weight_vectors(self):
163
+ r"""
164
+ Return the lowest weight vectors of ``self``.
165
+
166
+ This default implementation selects among all elements of the crystal
167
+ those that are lowest weight, and cache the result.
168
+ A crystal element `b` is lowest weight if `f_i(b)=0` for all `i` in the
169
+ index set.
170
+
171
+ EXAMPLES::
172
+
173
+ sage: C = crystals.Letters(['A',5])
174
+ sage: C.lowest_weight_vectors()
175
+ (6,)
176
+
177
+ ::
178
+
179
+ sage: C = crystals.Letters(['A',2])
180
+ sage: T = crystals.TensorProduct(C, C, C,generators=[[C(2),C(1),C(1)],
181
+ ....: [C(1),C(2),C(1)]])
182
+ sage: T.lowest_weight_vectors()
183
+ ([3, 2, 3], [3, 3, 2])
184
+ """
185
+ return tuple(g for g in self if g.is_lowest_weight())
186
+
187
+ def __iter__(self, index_set=None, max_depth=float("inf")):
188
+ """
189
+ Return the iterator of ``self``.
190
+
191
+ INPUT:
192
+
193
+ - ``index_set`` -- (default: ``None``) the index set; if ``None``
194
+ then use the index set of the crystal
195
+
196
+ - ``max_depth`` -- (default: infinity) the maximum depth to build
197
+
198
+ EXAMPLES::
199
+
200
+ sage: C = crystals.LSPaths(['A',2,1],[0,1,0])
201
+ sage: sorted([p for p in C.__iter__(max_depth=3)], key=str)
202
+ [(-Lambda[0] + 2*Lambda[2] - delta,),
203
+ (-Lambda[0] + Lambda[1] + 1/2*Lambda[2] - delta, Lambda[0] - 1/2*Lambda[2]),
204
+ (1/2*Lambda[0] + Lambda[1] - Lambda[2] - 1/2*delta, -1/2*Lambda[0] + Lambda[2] - 1/2*delta),
205
+ (2*Lambda[0] - Lambda[2],),
206
+ (Lambda[0] - Lambda[1] + Lambda[2],),
207
+ (Lambda[1],)]
208
+ sage: [p for p in C.__iter__(index_set=[0, 1], max_depth=3)]
209
+ [(Lambda[1],), (Lambda[0] - Lambda[1] + Lambda[2],), (-Lambda[0] + 2*Lambda[2] - delta,)]
210
+ """
211
+ if index_set is None:
212
+ index_set = self.index_set()
213
+ from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet
214
+ return RecursivelyEnumeratedSet(self.module_generators,
215
+ lambda x: [x.f(i) for i in index_set],
216
+ structure='graded',
217
+ max_depth=max_depth).breadth_first_search_iterator()
218
+
219
+ @cached_method
220
+ def q_dimension(self, q=None, prec=None, use_product=False):
221
+ r"""
222
+ Return the `q`-dimension of ``self``.
223
+
224
+ Let `B(\lambda)` denote a highest weight crystal. Recall that
225
+ the degree of the `\mu`-weight space of `B(\lambda)` (under
226
+ the principal gradation) is equal to
227
+ `\langle \rho^{\vee}, \lambda - \mu \rangle` where
228
+ `\langle \rho^{\vee}, \alpha_i \rangle = 1` for all `i \in I`
229
+ (in particular, take `\rho^{\vee} = \sum_{i \in I} h_i`).
230
+
231
+ The `q`-dimension of a highest weight crystal `B(\lambda)` is
232
+ defined as
233
+
234
+ .. MATH::
235
+
236
+ \dim_q B(\lambda) := \sum_{j \geq 0} \dim(B_j) q^j,
237
+
238
+ where `B_j` denotes the degree `j` portion of `B(\lambda)`. This
239
+ can be expressed as the product
240
+
241
+ .. MATH::
242
+
243
+ \dim_q B(\lambda) = \prod_{\alpha^{\vee} \in \Delta_+^{\vee}}
244
+ \left( \frac{1 - q^{\langle \lambda + \rho, \alpha^{\vee}
245
+ \rangle}}{1 - q^{\langle \rho, \alpha^{\vee} \rangle}}
246
+ \right)^{\mathrm{mult}\, \alpha},
247
+
248
+ where `\Delta_+^{\vee}` denotes the set of positive coroots.
249
+ Taking the limit as `q \to 1` gives the dimension of `B(\lambda)`.
250
+ For more information, see [Ka1990]_ Section 10.10.
251
+
252
+ INPUT:
253
+
254
+ - ``q`` -- the (generic) parameter `q`
255
+
256
+ - ``prec`` -- (default: ``None``) the precision of the power
257
+ series ring to use if the crystal is not known to be finite
258
+ (i.e. the number of terms returned).
259
+ If ``None``, then the result is returned as a lazy power series.
260
+
261
+ - ``use_product`` -- boolean (default: ``False``); if we have a
262
+ finite crystal and ``True``, use the product formula
263
+
264
+ EXAMPLES::
265
+
266
+ sage: C = crystals.Tableaux(['A',2], shape=[2,1])
267
+ sage: qdim = C.q_dimension(); qdim
268
+ q^4 + 2*q^3 + 2*q^2 + 2*q + 1
269
+ sage: qdim(1)
270
+ 8
271
+ sage: len(C) == qdim(1)
272
+ True
273
+ sage: C.q_dimension(use_product=True) == qdim
274
+ True
275
+ sage: C.q_dimension(prec=20)
276
+ q^4 + 2*q^3 + 2*q^2 + 2*q + 1
277
+ sage: C.q_dimension(prec=2)
278
+ 2*q + 1
279
+
280
+ sage: R.<t> = QQ[]
281
+ sage: C.q_dimension(q=t^2)
282
+ t^8 + 2*t^6 + 2*t^4 + 2*t^2 + 1
283
+
284
+ sage: C = crystals.Tableaux(['A',2], shape=[5,2])
285
+ sage: C.q_dimension()
286
+ q^10 + 2*q^9 + 4*q^8 + 5*q^7 + 6*q^6 + 6*q^5
287
+ + 6*q^4 + 5*q^3 + 4*q^2 + 2*q + 1
288
+
289
+ sage: C = crystals.Tableaux(['B',2], shape=[2,1])
290
+ sage: qdim = C.q_dimension(); qdim
291
+ q^10 + 2*q^9 + 3*q^8 + 4*q^7 + 5*q^6 + 5*q^5
292
+ + 5*q^4 + 4*q^3 + 3*q^2 + 2*q + 1
293
+ sage: qdim == C.q_dimension(use_product=True)
294
+ True
295
+
296
+ sage: C = crystals.Tableaux(['D',4], shape=[2,1])
297
+ sage: C.q_dimension()
298
+ q^16 + 2*q^15 + 4*q^14 + 7*q^13 + 10*q^12 + 13*q^11
299
+ + 16*q^10 + 18*q^9 + 18*q^8 + 18*q^7 + 16*q^6 + 13*q^5
300
+ + 10*q^4 + 7*q^3 + 4*q^2 + 2*q + 1
301
+
302
+ We check with a finite tensor product::
303
+
304
+ sage: TP = crystals.TensorProduct(C, C)
305
+ sage: TP.cardinality()
306
+ 25600
307
+ sage: qdim = TP.q_dimension(use_product=True); qdim # long time
308
+ q^32 + 2*q^31 + 8*q^30 + 15*q^29 + 34*q^28 + 63*q^27 + 110*q^26
309
+ + 175*q^25 + 276*q^24 + 389*q^23 + 550*q^22 + 725*q^21
310
+ + 930*q^20 + 1131*q^19 + 1362*q^18 + 1548*q^17 + 1736*q^16
311
+ + 1858*q^15 + 1947*q^14 + 1944*q^13 + 1918*q^12 + 1777*q^11
312
+ + 1628*q^10 + 1407*q^9 + 1186*q^8 + 928*q^7 + 720*q^6
313
+ + 498*q^5 + 342*q^4 + 201*q^3 + 117*q^2 + 48*q + 26
314
+ sage: qdim(1) # long time
315
+ 25600
316
+ sage: TP.q_dimension() == qdim # long time
317
+ True
318
+
319
+ The `q`-dimensions of infinite crystals are returned
320
+ as formal power series::
321
+
322
+ sage: C = crystals.LSPaths(['A',2,1], [1,0,0])
323
+ sage: C.q_dimension(prec=5)
324
+ 1 + q + 2*q^2 + 2*q^3 + 4*q^4 + O(q^5)
325
+ sage: C.q_dimension(prec=10)
326
+ 1 + q + 2*q^2 + 2*q^3 + 4*q^4 + 5*q^5 + 7*q^6
327
+ + 9*q^7 + 13*q^8 + 16*q^9 + O(q^10)
328
+ sage: qdim = C.q_dimension(); qdim
329
+ 1 + q + 2*q^2 + 2*q^3 + 4*q^4 + 5*q^5 + 7*q^6 + O(q^7)
330
+ sage: qdim[:16]
331
+ [1, 1, 2, 2, 4, 5, 7, 9, 13, 16, 22, 27, 36, 44, 57, 70]
332
+ """
333
+ from sage.rings.integer_ring import ZZ
334
+ WLR = self.weight_lattice_realization()
335
+ I = self.index_set()
336
+ mg = self.highest_weight_vectors()
337
+ max_deg = float('inf') if prec is None else prec - 1
338
+
339
+ def iter_by_deg(gens):
340
+ next = set(gens)
341
+ deg = -1
342
+ while next and deg < max_deg:
343
+ deg += 1
344
+ yield len(next)
345
+ todo = next
346
+ next = set()
347
+ while todo:
348
+ x = todo.pop()
349
+ for i in I:
350
+ y = x.f(i)
351
+ if y is not None:
352
+ next.add(y)
353
+ # def iter_by_deg
354
+
355
+ from sage.categories.finite_crystals import FiniteCrystals
356
+ if self in FiniteCrystals():
357
+ if q is None:
358
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
359
+ q = PolynomialRing(ZZ, 'q').gen(0)
360
+
361
+ if use_product:
362
+ # Since we are in the classical case, all roots occur with multiplicity 1
363
+ pos_coroots = [x.associated_coroot() for x in WLR.positive_roots()]
364
+ rho = WLR.rho()
365
+ P = q.parent()
366
+ ret = P.zero()
367
+ for v in self.highest_weight_vectors():
368
+ hw = v.weight()
369
+ ret += P.prod((1 - q**(rho+hw).scalar(ac)) / (1 - q**rho.scalar(ac))
370
+ for ac in pos_coroots)
371
+ # We do a cast since the result would otherwise live in the fraction field
372
+ return P(ret)
373
+
374
+ elif prec is None:
375
+ # If we're here, we may not be a finite crystal.
376
+ # In fact, we're probably infinite.
377
+ from sage.rings.lazy_series_ring import LazyPowerSeriesRing
378
+ if q is None:
379
+ P = LazyPowerSeriesRing(ZZ, names='q')
380
+ else:
381
+ P = q.parent()
382
+ if not isinstance(P, LazyPowerSeriesRing):
383
+ raise TypeError("the parent of q must be a lazy power series ring")
384
+ ret = P(iter_by_deg(mg))
385
+ return ret
386
+
387
+ from sage.rings.power_series_ring import PowerSeriesRing, PowerSeriesRing_generic
388
+ if q is None:
389
+ q = PowerSeriesRing(ZZ, 'q', default_prec=prec).gen(0)
390
+ P = q.parent()
391
+ ret = P.sum(c * q**deg for deg, c in enumerate(iter_by_deg(mg)))
392
+ if ret.degree() == max_deg and isinstance(P, PowerSeriesRing_generic):
393
+ ret = P(ret, prec)
394
+ return ret
395
+
396
+ # TODO: This is not correct if a factor has multiple heads (i.e., we
397
+ # should have a category for uniqueness of highest/lowest weights)
398
+ connected_components_generators = highest_weight_vectors
399
+
400
+ def _Hom_(self, Y, category=None, **options):
401
+ r"""
402
+ Return the homset from ``self`` to ``Y`` in the
403
+ category ``category``.
404
+
405
+ INPUT:
406
+
407
+ - ``Y`` -- a crystal
408
+ - ``category`` -- a subcategory of :class:`HighestWeightCrysals`()
409
+ or ``None``
410
+
411
+ The sole purpose of this method is to construct the homset as a
412
+ :class:`~sage.categories.highest_weight_crystals.HighestWeightCrystalHomset`.
413
+ If ``category`` is specified and is not a subcategory of
414
+ :class:`HighestWeightCrystals`, a :exc:`TypeError` is raised
415
+ instead
416
+
417
+ This method is not meant to be called directly. Please use
418
+ :func:`sage.categories.homset.Hom` instead.
419
+
420
+ EXAMPLES::
421
+
422
+ sage: B = crystals.Tableaux(['A',2], shape=[2,1])
423
+ sage: H = B._Hom_(B)
424
+ sage: H
425
+ Set of Crystal Morphisms from The crystal of tableaux of type ['A', 2] and shape(s) [[2, 1]]
426
+ to The crystal of tableaux of type ['A', 2] and shape(s) [[2, 1]]
427
+ sage: type(H)
428
+ <class 'sage.categories.highest_weight_crystals.HighestWeightCrystalHomset_with_category'>
429
+
430
+ TESTS:
431
+
432
+ Check that we fallback first to trying a crystal homset
433
+ (:issue:`19458`)::
434
+
435
+ sage: Binf = crystals.infinity.Tableaux(['A',2])
436
+ sage: Bi = crystals.elementary.Elementary(Binf.cartan_type(), 1)
437
+ sage: tens = Bi.tensor(Binf)
438
+ sage: Hom(Binf, tens)
439
+ Set of Crystal Morphisms from ...
440
+ """
441
+ if category is None:
442
+ category = self.category()
443
+ elif not category.is_subcategory(Crystals()):
444
+ raise TypeError("{} is not a subcategory of Crystals()".format(category))
445
+ if Y not in Crystals():
446
+ raise TypeError("{} is not a crystal".format(Y))
447
+ return HighestWeightCrystalHomset(self, Y, category=category, **options)
448
+
449
+ def digraph(self, subset=None, index_set=None, depth=None):
450
+ """
451
+ Return the DiGraph associated to ``self``.
452
+
453
+ INPUT:
454
+
455
+ - ``subset`` -- (optional) a subset of vertices for
456
+ which the digraph should be constructed
457
+
458
+ - ``index_set`` -- (optional) the index set to draw arrows
459
+
460
+ - ``depth`` -- the depth to draw; optional only for finite crystals
461
+
462
+ EXAMPLES::
463
+
464
+ sage: T = crystals.Tableaux(['A',2], shape=[2,1])
465
+ sage: T.digraph()
466
+ Digraph on 8 vertices
467
+ sage: S = T.subcrystal(max_depth=2)
468
+ sage: len(S)
469
+ 5
470
+ sage: G = T.digraph(subset=list(S))
471
+ sage: G.is_isomorphic(T.digraph(depth=2), edge_labels=True)
472
+ True
473
+
474
+ TESTS:
475
+
476
+ The following example demonstrates the speed improvement.
477
+ The speedup in non-affine types is small however::
478
+
479
+ sage: depth = 5
480
+ sage: C = crystals.AlcovePaths(['A',2,1], [1,1,0])
481
+ sage: general_digraph = Crystals().parent_class.digraph
482
+ sage: S = C.subcrystal(max_depth=depth, direction='lower')
483
+ sage: %timeit C.digraph(depth=depth) # not tested
484
+ 10 loops, best of 3: 48.9 ms per loop
485
+ sage: %timeit general_digraph(C, subset=S) # not tested
486
+ 10 loops, best of 3: 96.5 ms per loop
487
+ sage: G1 = C.digraph(depth=depth)
488
+ sage: G2 = general_digraph(C, subset=S)
489
+ sage: G1.is_isomorphic(G2, edge_labels=True)
490
+ True
491
+ """
492
+ if subset is not None:
493
+ return Crystals().parent_class.digraph(self, subset, index_set)
494
+
495
+ if self not in Crystals().Finite() and depth is None:
496
+ raise NotImplementedError("crystals not known to be finite must"
497
+ " specify either the subset or depth")
498
+
499
+ from sage.graphs.digraph import DiGraph
500
+ if index_set is None:
501
+ index_set = self.index_set()
502
+
503
+ rank = 0
504
+ d = {g: {} for g in self.module_generators}
505
+ visited = set(d.keys())
506
+
507
+ while depth is None or rank < depth:
508
+ recently_visited = set()
509
+ for x in visited:
510
+ d.setdefault(x, {}) # does nothing if there's a default
511
+ for i in index_set:
512
+ xfi = x.f(i)
513
+ if xfi is not None:
514
+ d[x][xfi] = i
515
+ recently_visited.add(xfi)
516
+ if not recently_visited: # No new nodes, nothing more to do
517
+ break
518
+ rank += 1
519
+ visited = recently_visited
520
+
521
+ G = DiGraph(d)
522
+ from sage.graphs.dot2tex_utils import have_dot2tex
523
+ if have_dot2tex():
524
+ G.set_latex_options(format='dot2tex',
525
+ edge_labels=True,
526
+ color_by_label=self.cartan_type()._index_set_coloring)
527
+ return G
528
+
529
+ class ElementMethods:
530
+ def string_parameters(self, word=None):
531
+ r"""
532
+ Return the string parameters of ``self`` corresponding to the
533
+ reduced word ``word``.
534
+
535
+ Given a reduced expression `w = s_{i_1} \cdots s_{i_k}`,
536
+ the string parameters of `b \in B` corresponding to `w`
537
+ are `(a_1, \ldots, a_k)` such that
538
+
539
+ .. MATH::
540
+
541
+ \begin{aligned}
542
+ e_{i_m}^{a_m} \cdots e_{i_1}^{a_1} b & \neq 0 \\
543
+ e_{i_m}^{a_m+1} \cdots e_{i_1}^{a_1} b & = 0
544
+ \end{aligned}
545
+
546
+ for all `1 \leq m \leq k`.
547
+
548
+ For connected components isomorphic to `B(\lambda)` or
549
+ `B(\infty)`, if `w = w_0` is the longest element of the
550
+ Weyl group, then the path determined by the string
551
+ parametrization terminates at the highest weight vector.
552
+
553
+ INPUT:
554
+
555
+ - ``word`` -- a word in the alphabet of the index set; if not
556
+ specified and we are in finite type, then this will be some
557
+ reduced expression for the long element determined by the
558
+ Weyl group
559
+
560
+ EXAMPLES::
561
+
562
+ sage: B = crystals.infinity.NakajimaMonomials(['A',3])
563
+ sage: mg = B.highest_weight_vector()
564
+ sage: w0 = [1,2,1,3,2,1]
565
+ sage: mg.string_parameters(w0)
566
+ [0, 0, 0, 0, 0, 0]
567
+ sage: mg.f_string([1]).string_parameters(w0)
568
+ [1, 0, 0, 0, 0, 0]
569
+ sage: mg.f_string([1,1,1]).string_parameters(w0)
570
+ [3, 0, 0, 0, 0, 0]
571
+ sage: mg.f_string([1,1,1,2,2]).string_parameters(w0)
572
+ [1, 2, 2, 0, 0, 0]
573
+ sage: mg.f_string([1,1,1,2,2]) == mg.f_string([1,1,2,2,1])
574
+ True
575
+ sage: x = mg.f_string([1,1,1,2,2,1,3,3,2,1,1,1])
576
+ sage: x.string_parameters(w0)
577
+ [4, 1, 1, 2, 2, 2]
578
+ sage: x.string_parameters([3,2,1,3,2,3])
579
+ [2, 3, 7, 0, 0, 0]
580
+ sage: x == mg.f_string([1]*7 + [2]*3 + [3]*2)
581
+ True
582
+
583
+ ::
584
+
585
+ sage: B = crystals.infinity.Tableaux("A5")
586
+ sage: b = B(rows=[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,6,6,6,6,6,6],
587
+ ....: [2,2,2,2,2,2,2,2,2,4,5,5,5,6],
588
+ ....: [3,3,3,3,3,3,3,5],
589
+ ....: [4,4,4,6,6,6],
590
+ ....: [5,6]])
591
+ sage: b.string_parameters([1,2,1,3,2,1,4,3,2,1,5,4,3,2,1])
592
+ [0, 1, 1, 1, 1, 0, 4, 4, 3, 0, 11, 10, 7, 7, 6]
593
+
594
+ sage: B = crystals.infinity.Tableaux("G2")
595
+ sage: b = B(rows=[[1,1,1,1,1,3,3,0,-3,-3,-2,-2,-1,-1,-1,-1],[2,3,3,3]])
596
+ sage: b.string_parameters([2,1,2,1,2,1])
597
+ [5, 13, 11, 15, 4, 4]
598
+ sage: b.string_parameters([1,2,1,2,1,2])
599
+ [7, 12, 15, 8, 10, 0]
600
+
601
+ ::
602
+
603
+ sage: C = crystals.Tableaux(['C',2], shape=[2,1])
604
+ sage: mg = C.highest_weight_vector()
605
+ sage: lw = C.lowest_weight_vectors()[0]
606
+ sage: lw.string_parameters([1,2,1,2])
607
+ [1, 2, 3, 1]
608
+ sage: lw.string_parameters([2,1,2,1])
609
+ [1, 3, 2, 1]
610
+ sage: lw.e_string([2,1,1,1,2,2,1]) == mg
611
+ True
612
+ sage: lw.e_string([1,2,2,1,1,1,2]) == mg
613
+ True
614
+
615
+ TESTS::
616
+
617
+ sage: B = crystals.infinity.NakajimaMonomials(['B',3])
618
+ sage: mg = B.highest_weight_vector()
619
+ sage: mg.string_parameters()
620
+ [0, 0, 0, 0, 0, 0, 0, 0, 0]
621
+ sage: w0 = WeylGroup(['B',3]).long_element().reduced_word()
622
+ sage: def f_word(params):
623
+ ....: return reversed([index for i, index in enumerate(w0)
624
+ ....: for _ in range(params[i])])
625
+ sage: all(mg.f_string( f_word(x.value.string_parameters(w0)) ) == x.value
626
+ ....: for x in B.subcrystal(max_depth=4))
627
+ True
628
+
629
+ sage: B = crystals.infinity.NakajimaMonomials(['A',2,1])
630
+ sage: mg = B.highest_weight_vector()
631
+ sage: mg.string_parameters()
632
+ Traceback (most recent call last):
633
+ ...
634
+ ValueError: the word must be specified because the
635
+ Weyl group is not finite
636
+ """
637
+ if word is None:
638
+ if not self.cartan_type().is_finite():
639
+ raise ValueError("the word must be specified because"
640
+ " the Weyl group is not finite")
641
+ from sage.combinat.root_system.weyl_group import WeylGroup
642
+ word = WeylGroup(self.cartan_type()).long_element().reduced_word()
643
+ x = self
644
+ params = []
645
+ for i in word:
646
+ count = 0
647
+ y = x.e(i)
648
+ while y is not None:
649
+ x = y
650
+ y = x.e(i)
651
+ count += 1
652
+ params.append(count)
653
+ return params
654
+
655
+ class TensorProducts(TensorProductsCategory):
656
+ """
657
+ The category of highest weight crystals constructed by tensor
658
+ product of highest weight crystals.
659
+ """
660
+ @cached_method
661
+ def extra_super_categories(self):
662
+ """
663
+ EXAMPLES::
664
+
665
+ sage: HighestWeightCrystals().TensorProducts().extra_super_categories()
666
+ [Category of highest weight crystals]
667
+ """
668
+ return [self.base_category()]
669
+
670
+ class ParentMethods:
671
+ """
672
+ Implement operations on tensor products of crystals.
673
+ """
674
+ @cached_method
675
+ def highest_weight_vectors(self):
676
+ r"""
677
+ Return the highest weight vectors of ``self``.
678
+
679
+ This works by using a backtracing algorithm since if
680
+ `b_2 \otimes b_1` is highest weight then `b_1` is
681
+ highest weight.
682
+
683
+ EXAMPLES::
684
+
685
+ sage: C = crystals.Tableaux(['D',4], shape=[2,2])
686
+ sage: D = crystals.Tableaux(['D',4], shape=[1])
687
+ sage: T = crystals.TensorProduct(D, C)
688
+ sage: T.highest_weight_vectors()
689
+ ([[[1]], [[1, 1], [2, 2]]],
690
+ [[[3]], [[1, 1], [2, 2]]],
691
+ [[[-2]], [[1, 1], [2, 2]]])
692
+ sage: L = filter(lambda x: x.is_highest_weight(), T)
693
+ sage: tuple(L) == T.highest_weight_vectors()
694
+ True
695
+
696
+ TESTS:
697
+
698
+ We check this works with Kashiwara's convention for
699
+ tensor products::
700
+
701
+ sage: C = crystals.Tableaux(['B',3], shape=[2,2])
702
+ sage: D = crystals.Tableaux(['B',3], shape=[1])
703
+ sage: T = crystals.TensorProduct(D, C)
704
+ sage: T.options(convention='Kashiwara')
705
+ sage: T.highest_weight_vectors()
706
+ ([[[1, 1], [2, 2]], [[1]]],
707
+ [[[1, 1], [2, 2]], [[3]]],
708
+ [[[1, 1], [2, 2]], [[-2]]])
709
+ sage: T.options._reset()
710
+ sage: T.highest_weight_vectors()
711
+ ([[[1]], [[1, 1], [2, 2]]],
712
+ [[[3]], [[1, 1], [2, 2]]],
713
+ [[[-2]], [[1, 1], [2, 2]]])
714
+ """
715
+ return tuple(self.highest_weight_vectors_iterator())
716
+
717
+ def highest_weight_vectors_iterator(self):
718
+ r"""
719
+ Iterate over the highest weight vectors of ``self``.
720
+
721
+ This works by using a backtracing algorithm since if
722
+ `b_2 \otimes b_1` is highest weight then `b_1` is
723
+ highest weight.
724
+
725
+ EXAMPLES::
726
+
727
+ sage: C = crystals.Tableaux(['D',4], shape=[2,2])
728
+ sage: D = crystals.Tableaux(['D',4], shape=[1])
729
+ sage: T = crystals.TensorProduct(D, C)
730
+ sage: tuple(T.highest_weight_vectors_iterator())
731
+ ([[[1]], [[1, 1], [2, 2]]],
732
+ [[[3]], [[1, 1], [2, 2]]],
733
+ [[[-2]], [[1, 1], [2, 2]]])
734
+ sage: L = filter(lambda x: x.is_highest_weight(), T)
735
+ sage: tuple(L) == tuple(T.highest_weight_vectors_iterator())
736
+ True
737
+
738
+ TESTS:
739
+
740
+ We check this works with Kashiwara's convention for
741
+ tensor products::
742
+
743
+ sage: C = crystals.Tableaux(['B',3], shape=[2,2])
744
+ sage: D = crystals.Tableaux(['B',3], shape=[1])
745
+ sage: T = crystals.TensorProduct(D, C)
746
+ sage: T.options(convention='Kashiwara')
747
+ sage: tuple(T.highest_weight_vectors_iterator())
748
+ ([[[1, 1], [2, 2]], [[1]]],
749
+ [[[1, 1], [2, 2]], [[3]]],
750
+ [[[1, 1], [2, 2]], [[-2]]])
751
+ sage: T.options._reset()
752
+ sage: tuple(T.highest_weight_vectors_iterator())
753
+ ([[[1]], [[1, 1], [2, 2]]],
754
+ [[[3]], [[1, 1], [2, 2]]],
755
+ [[[-2]], [[1, 1], [2, 2]]])
756
+
757
+ This currently is not implemented for infinite crystals::
758
+
759
+ sage: P = RootSystem(['A',3,1]).weight_lattice(extended=True)
760
+ sage: M = crystals.NakajimaMonomials(P.fundamental_weight(0))
761
+ sage: T = tensor([M, M])
762
+ sage: list(T.highest_weight_vectors_iterator())
763
+ Traceback (most recent call last):
764
+ ...
765
+ NotImplementedError: not implemented for infinite crystals
766
+
767
+ Check that :issue:`30493` is fixed::
768
+
769
+ sage: CW = CartanType("G", 2)
770
+ sage: C = crystals.Letters(CW)
771
+ sage: C.highest_weight_vectors()
772
+ (1,)
773
+ sage: T = crystals.TensorProduct(C)
774
+ sage: T.highest_weight_vectors()
775
+ ([1],)
776
+ """
777
+ if len(self.crystals) == 1:
778
+ for b in self.crystals[0].highest_weight_vectors():
779
+ yield self.element_class(self, [b])
780
+ return
781
+ I = self.index_set()
782
+ try:
783
+ T_elts = [C.list() for C in self.crystals[:-1]]
784
+ except (TypeError, NotImplementedError, AttributeError):
785
+ raise NotImplementedError("not implemented for infinite crystals")
786
+ from sage.categories.regular_crystals import RegularCrystals
787
+ if self in RegularCrystals:
788
+ def hw_test(b2, i, d):
789
+ return d < 0
790
+ else:
791
+ def hw_test(b2, i, d):
792
+ return d < 0 and b2.e(i) is not None
793
+ T_len = [len(elts) for elts in T_elts]
794
+ m = len(self.crystals) - 1
795
+ for b in self.crystals[-1].highest_weight_vectors():
796
+ T_pos = m - 1 # current tensor position
797
+ T_cur = [0]*m # index of current element for each tensor position
798
+ path = [None]*m + [b]
799
+ # cache phi for path up to current tensor position
800
+ T_phi = [None]*(m-1) + [{i: b.phi(i) for i in I}]
801
+ while T_pos < m:
802
+ if T_cur[T_pos] == T_len[T_pos]:
803
+ T_cur[T_pos] = 0
804
+ T_pos += 1
805
+ continue
806
+
807
+ b2 = T_elts[T_pos][T_cur[T_pos]]
808
+ T_cur[T_pos] += 1
809
+ b1_phi = T_phi[T_pos]
810
+ b1_phi_minus_b2_epsilon = {}
811
+ # break if (b2, b1) is not highest weight
812
+ for i in I:
813
+ d = b1_phi[i] - b2.epsilon(i)
814
+ # In the non-regular case, d may be nan.
815
+ # In this case b2.e(i) is None,
816
+ # and we may rely on max(0, nan) == 0.
817
+ # In the regular case, the next line is simply
818
+ # if d < 0:
819
+ if hw_test(b2, i, d):
820
+ break
821
+ b1_phi_minus_b2_epsilon[i] = d
822
+ else:
823
+ path[T_pos] = b2
824
+ if T_pos:
825
+ T_pos -= 1
826
+ # In the regular case, the next line is simply
827
+ # T_phi[T_pos] = {i: b2.phi(i) + b1_phi_minus_b2_epsilon[i] for i in I}
828
+ T_phi[T_pos] = {i: b2.phi(i) + max(0, b1_phi_minus_b2_epsilon[i])
829
+ for i in I}
830
+ else:
831
+ yield self.element_class(self, path)
832
+
833
+ ###############################################################################
834
+ ## Morphisms
835
+
836
+
837
+ class HighestWeightCrystalMorphism(CrystalMorphismByGenerators):
838
+ r"""
839
+ A virtual crystal morphism whose domain is a highest weight crystal.
840
+
841
+ INPUT:
842
+
843
+ - ``parent`` -- a homset
844
+ - ``on_gens`` -- a function or list that determines the image of the
845
+ generators (if given a list, then this uses the order of the
846
+ generators of the domain) of the domain under ``self``
847
+ - ``cartan_type`` -- (optional) a Cartan type; the default is the
848
+ Cartan type of the domain
849
+ - ``virtualization`` -- (optional) a dictionary whose keys are
850
+ in the index set of the domain and whose values are lists of
851
+ entries in the index set of the codomain
852
+ - ``scaling_factors`` -- (optional) a dictionary whose keys are in
853
+ the index set of the domain and whose values are scaling factors
854
+ for the weight, `\varepsilon` and `\varphi`
855
+ - ``gens`` -- (optional) a list of generators to define the morphism;
856
+ the default is to use the highest weight vectors of the crystal
857
+ - ``check`` -- boolean (default: ``True``); check if the crystal morphism
858
+ is valid
859
+ """
860
+ def __init__(self, parent, on_gens, cartan_type=None,
861
+ virtualization=None, scaling_factors=None,
862
+ gens=None, check=True):
863
+ """
864
+ Construct a crystal morphism.
865
+
866
+ TESTS::
867
+
868
+ sage: B = crystals.infinity.Tableaux(['B',2])
869
+ sage: C = crystals.infinity.NakajimaMonomials(['B',2])
870
+ sage: psi = B.crystal_morphism(C.module_generators)
871
+
872
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
873
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
874
+ sage: H = Hom(B, C)
875
+ sage: psi = H(C.module_generators)
876
+ """
877
+ if cartan_type is None:
878
+ cartan_type = parent.domain().cartan_type()
879
+ if isinstance(on_gens, dict):
880
+ gens = on_gens.keys()
881
+ I = cartan_type.index_set()
882
+ if gens is None:
883
+ if cartan_type == parent.domain().cartan_type():
884
+ gens = parent.domain().highest_weight_vectors()
885
+ else:
886
+ gens = tuple(x for x in parent.domain() if x.is_highest_weight(I))
887
+ self._hw_gens = True
888
+ elif check:
889
+ self._hw_gens = all(x.is_highest_weight(I) for x in gens)
890
+ else:
891
+ self._hw_gens = False
892
+ CrystalMorphismByGenerators.__init__(self, parent, on_gens, cartan_type,
893
+ virtualization, scaling_factors,
894
+ gens, check)
895
+
896
+ def _call_(self, x):
897
+ """
898
+ Return the image of ``x`` under ``self``.
899
+
900
+ TESTS::
901
+
902
+ sage: B = crystals.infinity.Tableaux(['B',2])
903
+ sage: C = crystals.infinity.NakajimaMonomials(['B',2])
904
+ sage: psi = B.crystal_morphism(C.module_generators)
905
+ sage: b = B.highest_weight_vector()
906
+ sage: psi(b)
907
+ 1
908
+ sage: c = psi(b.f_string([1,1,1,2,2,1,2,2])); c
909
+ Y(1,0)^-4 Y(2,0)^4 Y(2,1)^-4
910
+ sage: c == C.highest_weight_vector().f_string([1,1,1,2,2,1,2,2])
911
+ True
912
+
913
+ sage: B = crystals.Tableaux(['B',3], shape=[1])
914
+ sage: C = crystals.Tableaux(['D',4], shape=[2])
915
+ sage: H = Hom(B, C)
916
+ sage: psi = H(C.module_generators)
917
+ sage: psi(B.module_generators[0])
918
+ [[1, 1]]
919
+
920
+ We check with the morphism defined on the lowest weight vector::
921
+
922
+ sage: B = crystals.Tableaux(['A',2], shape=[1])
923
+ sage: La = RootSystem(['A',2]).weight_lattice().fundamental_weights()
924
+ sage: T = crystals.elementary.T(['A',2], La[2])
925
+ sage: Bp = T.tensor(B)
926
+ sage: C = crystals.Tableaux(['A',2], shape=[2,1])
927
+ sage: H = Hom(Bp, C)
928
+ sage: x = C.module_generators[0].f_string([1,2])
929
+ sage: psi = H({Bp.lowest_weight_vectors()[0]: x})
930
+ sage: psi
931
+ ['A', 2] Crystal morphism:
932
+ From: Full tensor product of the crystals
933
+ [The T crystal of type ['A', 2] and weight Lambda[2],
934
+ The crystal of tableaux of type ['A', 2] and shape(s) [[1]]]
935
+ To: The crystal of tableaux of type ['A', 2] and shape(s) [[2, 1]]
936
+ Defn: [Lambda[2], [[3]]] |--> [[1, 3], [2]]
937
+ sage: psi(Bp.highest_weight_vector())
938
+ [[1, 1], [2]]
939
+ """
940
+ if not self._hw_gens:
941
+ return CrystalMorphismByGenerators._call_(self, x)
942
+ mg, path = x.to_highest_weight(self._cartan_type.index_set())
943
+ cur = self._on_gens(mg)
944
+ for i in reversed(path):
945
+ if cur is None:
946
+ return None
947
+ s = []
948
+ sf = self._scaling_factors[i]
949
+ for j in self._virtualization[i]:
950
+ s += [j]*sf
951
+ cur = cur.f_string(s)
952
+ return cur
953
+
954
+
955
+ class HighestWeightCrystalHomset(CrystalHomset):
956
+ """
957
+ The set of crystal morphisms from a highest weight crystal to
958
+ another crystal.
959
+
960
+ .. SEEALSO::
961
+
962
+ See :class:`sage.categories.crystals.CrystalHomset` for more
963
+ information.
964
+ """
965
+ def __init__(self, X, Y, category=None):
966
+ """
967
+ Initialize ``self``.
968
+
969
+ TESTS::
970
+
971
+ sage: B = crystals.Tableaux(['A', 2], shape=[2,1])
972
+ sage: H = Hom(B, B)
973
+ sage: B = crystals.infinity.Tableaux(['B',2])
974
+ sage: H = Hom(B, B)
975
+ """
976
+ if category is None:
977
+ category = HighestWeightCrystals()
978
+ CrystalHomset.__init__(self, X, Y, category)
979
+
980
+ Element = HighestWeightCrystalMorphism