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,1290 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.graphs sage.combinat sage.modules
3
+ r"""
4
+ Loop Crystals
5
+ """
6
+ # ****************************************************************************
7
+ # Copyright (C) 2015 Travis Scrimshaw <tcscrims at gmail.com>
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 2 of the License, or
12
+ # (at your option) any later version.
13
+ # https://www.gnu.org/licenses/
14
+ # ****************************************************************************
15
+
16
+
17
+ from sage.misc.abstract_method import abstract_method
18
+ from sage.misc.cachefunc import cached_method
19
+ from sage.categories.category_singleton import Category_singleton
20
+ from sage.categories.crystals import Crystals
21
+ from sage.categories.regular_crystals import RegularCrystals
22
+ from sage.categories.tensor import TensorProductsCategory
23
+ from sage.categories.map import Map
24
+
25
+
26
+ class LoopCrystals(Category_singleton):
27
+ r"""
28
+ The category of `U_q'(\mathfrak{g})`-crystals, where `\mathfrak{g}`
29
+ is of affine type.
30
+
31
+ The category is called loop crystals as we can also consider them
32
+ as crystals corresponding to the loop algebra `\mathfrak{g}_0[t]`,
33
+ where `\mathfrak{g}_0` is the corresponding classical type.
34
+
35
+ EXAMPLES::
36
+
37
+ sage: from sage.categories.loop_crystals import LoopCrystals
38
+ sage: C = LoopCrystals()
39
+ sage: C
40
+ Category of loop crystals
41
+ sage: C.super_categories()
42
+ [Category of crystals]
43
+ sage: C.example()
44
+ Kirillov-Reshetikhin crystal of type ['A', 3, 1] with (r,s)=(1,1)
45
+
46
+ TESTS::
47
+
48
+ sage: TestSuite(C).run()
49
+ sage: B = FiniteCrystals().example()
50
+ sage: TestSuite(B).run()
51
+ """
52
+ @cached_method
53
+ def super_categories(self):
54
+ r"""
55
+ EXAMPLES::
56
+
57
+ sage: from sage.categories.loop_crystals import LoopCrystals
58
+ sage: LoopCrystals().super_categories()
59
+ [Category of crystals]
60
+ """
61
+ return [Crystals()]
62
+
63
+ def example(self, n=3):
64
+ """
65
+ Return an example of Kirillov-Reshetikhin crystals, as per
66
+ :meth:`Category.example`.
67
+
68
+ EXAMPLES::
69
+
70
+ sage: from sage.categories.loop_crystals import LoopCrystals
71
+ sage: B = LoopCrystals().example(); B
72
+ Kirillov-Reshetikhin crystal of type ['A', 3, 1] with (r,s)=(1,1)
73
+ """
74
+ from sage.combinat.crystals.kirillov_reshetikhin import KirillovReshetikhinCrystal
75
+ return KirillovReshetikhinCrystal(['A', n, 1], 1, 1)
76
+
77
+ class ParentMethods:
78
+ def weight_lattice_realization(self):
79
+ """
80
+ Return the weight lattice realization used to express weights
81
+ of elements in ``self``.
82
+
83
+ The default is to use the non-extended affine weight lattice.
84
+
85
+ EXAMPLES::
86
+
87
+ sage: C = crystals.Letters(['A', 5])
88
+ sage: C.weight_lattice_realization()
89
+ Ambient space of the Root system of type ['A', 5]
90
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1)
91
+ sage: K.weight_lattice_realization()
92
+ Weight lattice of the Root system of type ['A', 2, 1]
93
+ """
94
+ F = self.cartan_type().root_system()
95
+ return F.weight_lattice(extended=False)
96
+
97
+ def digraph(self, subset=None, index_set=None):
98
+ r"""
99
+ Return the :class:`DiGraph` associated to ``self``.
100
+
101
+ INPUT:
102
+
103
+ - ``subset`` -- (optional) a subset of vertices for
104
+ which the digraph should be constructed
105
+
106
+ - ``index_set`` -- (optional) the index set to draw arrows
107
+
108
+ .. SEEALSO::
109
+
110
+ :meth:`sage.categories.crystals.Crystals.ParentMethods.digraph`
111
+
112
+ EXAMPLES::
113
+
114
+ sage: C = crystals.KirillovReshetikhin(['D',4,1], 2, 1)
115
+ sage: G = C.digraph()
116
+ sage: G.latex_options() # optional - dot2tex graphviz
117
+ LaTeX options for Digraph on 29 vertices:
118
+ {...'edge_options': <function ... at ...>...}
119
+ sage: view(G, tightpage=True) # optional - dot2tex graphviz, not tested (opens external window)
120
+ """
121
+ from sage.graphs.dot2tex_utils import have_dot2tex
122
+
123
+ G = Crystals().parent_class.digraph(self, subset, index_set)
124
+ if have_dot2tex():
125
+ def eopt(u_v_label):
126
+ return {"backward": u_v_label[2] == 0}
127
+ G.set_latex_options(edge_options=eopt)
128
+ return G
129
+
130
+ # TODO: Should we make "regular" an axiom?
131
+
132
+
133
+ class RegularLoopCrystals(Category_singleton):
134
+ r"""
135
+ The category of regular `U_q'(\mathfrak{g})`-crystals, where
136
+ `\mathfrak{g}` is of affine type.
137
+ """
138
+ @cached_method
139
+ def super_categories(self):
140
+ """
141
+ EXAMPLES::
142
+
143
+ sage: from sage.categories.loop_crystals import RegularLoopCrystals
144
+ sage: RegularLoopCrystals().super_categories()
145
+ [Category of regular crystals,
146
+ Category of loop crystals]
147
+ """
148
+ return [RegularCrystals(), LoopCrystals()]
149
+
150
+ class ElementMethods:
151
+ def classical_weight(self):
152
+ """
153
+ Return the classical weight of ``self``.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: R = RootSystem(['A',2,1])
158
+ sage: La = R.weight_space().basis()
159
+ sage: LS = crystals.ProjectedLevelZeroLSPaths(2*La[1])
160
+ sage: hw = LS.classically_highest_weight_vectors()
161
+ sage: [(v.weight(), v.classical_weight()) for v in hw]
162
+ [(-2*Lambda[0] + 2*Lambda[1], (2, 0, 0)),
163
+ (-Lambda[0] + Lambda[2], (1, 1, 0))]
164
+ """
165
+ CT = self.cartan_type().classical()
166
+ I0 = CT.index_set()
167
+ La = CT.root_system().ambient_space().fundamental_weights()
168
+ return sum(La[i] * (self.phi(i) - self.epsilon(i)) for i in I0)
169
+
170
+
171
+ class KirillovReshetikhinCrystals(Category_singleton):
172
+ """
173
+ Category of Kirillov-Reshetikhin crystals.
174
+ """
175
+ @cached_method
176
+ def super_categories(self):
177
+ r"""
178
+ EXAMPLES::
179
+
180
+ sage: from sage.categories.loop_crystals import KirillovReshetikhinCrystals
181
+ sage: KirillovReshetikhinCrystals().super_categories()
182
+ [Category of finite regular loop crystals]
183
+ """
184
+ return [RegularLoopCrystals().Finite()]
185
+
186
+ class ParentMethods:
187
+ @abstract_method
188
+ def r(self):
189
+ r"""
190
+ Return the value `r` in ``self`` written as `B^{r,s}`.
191
+
192
+ EXAMPLES::
193
+
194
+ sage: K = crystals.KirillovReshetikhin(['A',3,1], 2,4)
195
+ sage: K.r()
196
+ 2
197
+ """
198
+
199
+ @abstract_method
200
+ def s(self):
201
+ r"""
202
+ Return the value `s` in ``self`` written as `B^{r,s}`.
203
+
204
+ EXAMPLES::
205
+
206
+ sage: K = crystals.KirillovReshetikhin(['A',3,1], 2,4)
207
+ sage: K.s()
208
+ 4
209
+ """
210
+
211
+ @abstract_method(optional=True)
212
+ def classical_decomposition(self):
213
+ """
214
+ Return the classical decomposition of ``self``.
215
+
216
+ EXAMPLES::
217
+
218
+ sage: K = crystals.KirillovReshetikhin(['A',3,1], 2,2)
219
+ sage: K.classical_decomposition()
220
+ The crystal of tableaux of type ['A', 3] and shape(s) [[2, 2]]
221
+ """
222
+
223
+ @cached_method
224
+ def classically_highest_weight_vectors(self):
225
+ """
226
+ Return the classically highest weight elements of ``self``.
227
+
228
+ EXAMPLES::
229
+
230
+ sage: K = crystals.KirillovReshetikhin(['E',6,1],1,1)
231
+ sage: K.classically_highest_weight_vectors()
232
+ ([(1,)],)
233
+ """
234
+ I0 = self.cartan_type().classical().index_set()
235
+ return tuple([x for x in self if x.is_highest_weight(I0)])
236
+
237
+ # TODO: This is duplicated in tensor product category
238
+ def cardinality(self):
239
+ """
240
+ Return the cardinality of ``self``.
241
+
242
+ EXAMPLES::
243
+
244
+ sage: K = crystals.KirillovReshetikhin(['E',6,1], 1,1)
245
+ sage: K.cardinality()
246
+ 27
247
+ sage: K = crystals.KirillovReshetikhin(['C',6,1], 4,3)
248
+ sage: K.cardinality()
249
+ 4736732
250
+ """
251
+ CWLR = self.cartan_type().classical().root_system().ambient_space()
252
+ return sum(CWLR.weyl_dimension(mg.classical_weight())
253
+ for mg in self.classically_highest_weight_vectors())
254
+
255
+ @cached_method
256
+ def maximal_vector(self):
257
+ r"""
258
+ Return the unique element of classical weight `s \Lambda_r`
259
+ in ``self``.
260
+
261
+ EXAMPLES::
262
+
263
+ sage: K = crystals.KirillovReshetikhin(['C',2,1],1,2)
264
+ sage: K.maximal_vector()
265
+ [[1, 1]]
266
+ sage: K = crystals.KirillovReshetikhin(['E',6,1],1,1)
267
+ sage: K.maximal_vector()
268
+ [(1,)]
269
+
270
+ sage: K = crystals.KirillovReshetikhin(['D',4,1],2,1)
271
+ sage: K.maximal_vector()
272
+ [[1], [2]]
273
+
274
+ TESTS:
275
+
276
+ Check that :issue:`23028` is fixed::
277
+
278
+ sage: ct = CartanType(['A',8,2]).dual()
279
+ sage: K = crystals.KirillovReshetikhin(ct, 4, 1)
280
+ sage: K.maximal_vector()
281
+ [[1], [2], [3], [4]]
282
+ sage: K = crystals.KirillovReshetikhin(ct, 4, 2)
283
+ sage: K.maximal_vector()
284
+ [[1, 1], [2, 2], [3, 3], [4, 4]]
285
+ """
286
+ R = self.weight_lattice_realization()
287
+ Lambda = R.fundamental_weights()
288
+ r = self.r()
289
+ s = self.s()
290
+ if self.cartan_type().dual().type() == 'BC':
291
+ if self.cartan_type().rank() - 1 == r:
292
+ weight = 2*s*Lambda[r] - s*Lambda[0]
293
+ else:
294
+ weight = s*Lambda[r] - s*Lambda[0]
295
+ else:
296
+ weight = s*Lambda[r] - s*Lambda[0] * Lambda[r].level() / Lambda[0].level()
297
+
298
+ # First check the module generators as it is likely to be in here
299
+ for b in self.module_generators:
300
+ if b.weight() == weight:
301
+ return b
302
+
303
+ # Otherwise check all of the elements
304
+ for b in self:
305
+ if b not in self.module_generators and b.weight() == weight:
306
+ return b
307
+
308
+ assert False, "BUG: invalid Kirillov-Reshetikhin crystal"
309
+
310
+ def module_generator(self):
311
+ r"""
312
+ Return the unique module generator of classical weight
313
+ `s \Lambda_r` of the Kirillov-Reshetikhin crystal `B^{r,s}`.
314
+
315
+ EXAMPLES::
316
+
317
+ sage: La = RootSystem(['G',2,1]).weight_space().fundamental_weights()
318
+ sage: K = crystals.ProjectedLevelZeroLSPaths(La[1])
319
+ sage: K.module_generator()
320
+ (-Lambda[0] + Lambda[1],)
321
+ """
322
+ return self.maximal_vector()
323
+
324
+ # TODO: Should this be in one of the super categories?
325
+ def affinization(self):
326
+ """
327
+ Return the corresponding affinization crystal of ``self``.
328
+
329
+ EXAMPLES::
330
+
331
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1)
332
+ sage: K.affinization()
333
+ Affinization of Kirillov-Reshetikhin crystal of type ['A', 2, 1] with (r,s)=(1,1)
334
+
335
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1, model='KR')
336
+ sage: K.affinization()
337
+ Affinization of Kirillov-Reshetikhin tableaux of type ['A', 2, 1] and shape (1, 1)
338
+ """
339
+ from sage.combinat.crystals.affinization import AffinizationOfCrystal
340
+ return AffinizationOfCrystal(self)
341
+
342
+ @cached_method
343
+ def R_matrix(self, K):
344
+ r"""
345
+ Return the combinatorial `R`-matrix of ``self`` to ``K``.
346
+
347
+ The *combinatorial* `R`-*matrix* is the affine crystal
348
+ isomorphism `R : L \otimes K \to K \otimes L` which maps
349
+ `u_{L} \otimes u_K` to `u_K \otimes u_{L}`, where `u_K`
350
+ is the unique element in `K = B^{r,s}` of weight
351
+ `s\Lambda_r - s c \Lambda_0` (see :meth:`maximal_vector`).
352
+
353
+ INPUT:
354
+
355
+ - ``self`` -- a crystal `L`
356
+ - ``K`` -- a Kirillov-Reshetikhin crystal of the same type as `L`
357
+
358
+ EXAMPLES::
359
+
360
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
361
+ sage: L = crystals.KirillovReshetikhin(['A',2,1],1,2)
362
+ sage: f = K.R_matrix(L)
363
+ sage: [[b,f(b)] for b in crystals.TensorProduct(K,L)]
364
+ [[[[[1]], [[1, 1]]], [[[1, 1]], [[1]]]],
365
+ [[[[1]], [[1, 2]]], [[[1, 1]], [[2]]]],
366
+ [[[[1]], [[2, 2]]], [[[1, 2]], [[2]]]],
367
+ [[[[1]], [[1, 3]]], [[[1, 1]], [[3]]]],
368
+ [[[[1]], [[2, 3]]], [[[1, 2]], [[3]]]],
369
+ [[[[1]], [[3, 3]]], [[[1, 3]], [[3]]]],
370
+ [[[[2]], [[1, 1]]], [[[1, 2]], [[1]]]],
371
+ [[[[2]], [[1, 2]]], [[[2, 2]], [[1]]]],
372
+ [[[[2]], [[2, 2]]], [[[2, 2]], [[2]]]],
373
+ [[[[2]], [[1, 3]]], [[[2, 3]], [[1]]]],
374
+ [[[[2]], [[2, 3]]], [[[2, 2]], [[3]]]],
375
+ [[[[2]], [[3, 3]]], [[[2, 3]], [[3]]]],
376
+ [[[[3]], [[1, 1]]], [[[1, 3]], [[1]]]],
377
+ [[[[3]], [[1, 2]]], [[[1, 3]], [[2]]]],
378
+ [[[[3]], [[2, 2]]], [[[2, 3]], [[2]]]],
379
+ [[[[3]], [[1, 3]]], [[[3, 3]], [[1]]]],
380
+ [[[[3]], [[2, 3]]], [[[3, 3]], [[2]]]],
381
+ [[[[3]], [[3, 3]]], [[[3, 3]], [[3]]]]]
382
+
383
+ sage: K = crystals.KirillovReshetikhin(['D',4,1],1,1)
384
+ sage: L = crystals.KirillovReshetikhin(['D',4,1],2,1)
385
+ sage: f = K.R_matrix(L)
386
+ sage: T = crystals.TensorProduct(K,L)
387
+ sage: b = T( K(rows=[[1]]), L(rows=[]) )
388
+ sage: f(b)
389
+ [[[2], [-2]], [[1]]]
390
+
391
+ Alternatively, one can compute the combinatorial `R`-matrix
392
+ using the isomorphism method of digraphs::
393
+
394
+ sage: K1 = crystals.KirillovReshetikhin(['A',2,1],1,1)
395
+ sage: K2 = crystals.KirillovReshetikhin(['A',2,1],2,1)
396
+ sage: T1 = crystals.TensorProduct(K1,K2)
397
+ sage: T2 = crystals.TensorProduct(K2,K1)
398
+ sage: T1.digraph().is_isomorphic(T2.digraph(), edge_labels=True, # todo: not implemented (see #10904 and #10549)
399
+ ....: certificate=True)
400
+ (True, {[[[1]], [[2], [3]]]: [[[1], [3]], [[2]]],
401
+ [[[3]], [[2], [3]]]: [[[2], [3]], [[3]]],
402
+ [[[3]], [[1], [3]]]: [[[1], [3]], [[3]]],
403
+ [[[1]], [[1], [3]]]: [[[1], [3]], [[1]]], [[[1]],
404
+ [[1], [2]]]: [[[1], [2]], [[1]]],
405
+ [[[2]], [[1], [2]]]: [[[1], [2]], [[2]]], [[[3]],
406
+ [[1], [2]]]: [[[2], [3]], [[1]]],
407
+ [[[2]], [[1], [3]]]: [[[1], [2]], [[3]]],
408
+ [[[2]], [[2], [3]]]: [[[2], [3]], [[2]]]})
409
+ """
410
+ from sage.combinat.crystals.tensor_product import TensorProductOfCrystals
411
+ T1 = TensorProductOfCrystals(self, K)
412
+ T2 = TensorProductOfCrystals(K, self)
413
+ gen1 = T1(self.maximal_vector(), K.maximal_vector())
414
+ gen2 = T2(K.maximal_vector(), self.maximal_vector())
415
+ return T1.crystal_morphism({gen1: gen2}, check=False)
416
+
417
+ @cached_method
418
+ def local_energy_function(self, B):
419
+ r"""
420
+ Return the local energy function of ``self`` and ``B``.
421
+
422
+ See
423
+ :class:`~sage.categories.loop_crystals.LocalEnergyFunction`
424
+ for a definition.
425
+
426
+ EXAMPLES::
427
+
428
+ sage: K = crystals.KirillovReshetikhin(['A',6,2], 2,1)
429
+ sage: Kp = crystals.KirillovReshetikhin(['A',6,2], 1,1)
430
+ sage: H = K.local_energy_function(Kp); H
431
+ Local energy function of
432
+ Kirillov-Reshetikhin crystal of type ['BC', 3, 2] with (r,s)=(2,1)
433
+ tensor
434
+ Kirillov-Reshetikhin crystal of type ['BC', 3, 2] with (r,s)=(1,1)
435
+ """
436
+ return LocalEnergyFunction(self, B)
437
+
438
+ @cached_method
439
+ def b_sharp(self):
440
+ r"""
441
+ Return the element `b^{\sharp}` of ``self``.
442
+
443
+ Let `B` be a KR crystal. The element `b^{\sharp}` is the unique
444
+ element such that `\varphi(b^{\sharp}) = \ell \Lambda_0` with
445
+ `\ell = \min \{ \langle c, \varphi(b) \rangle \mid b \in B \}`.
446
+
447
+ EXAMPLES::
448
+
449
+ sage: K = crystals.KirillovReshetikhin(['A',6,2], 2,1)
450
+ sage: K.b_sharp()
451
+ []
452
+ sage: K.b_sharp().Phi()
453
+ Lambda[0]
454
+
455
+ sage: K = crystals.KirillovReshetikhin(['C',3,1], 1,3)
456
+ sage: K.b_sharp()
457
+ [[-1]]
458
+ sage: K.b_sharp().Phi()
459
+ 2*Lambda[0]
460
+
461
+ sage: K = crystals.KirillovReshetikhin(['D',6,2], 2,2)
462
+ sage: K.b_sharp() # long time
463
+ []
464
+ sage: K.b_sharp().Phi() # long time
465
+ 2*Lambda[0]
466
+ """
467
+ ell = float('inf')
468
+ bsharp = None
469
+ for b in self:
470
+ phi = b.Phi()
471
+ if list(phi.support()) == [0] and phi[0] < ell:
472
+ bsharp = b
473
+ ell = phi[0]
474
+ return bsharp
475
+
476
+ def is_perfect(self, ell=None):
477
+ r"""
478
+ Check if ``self`` is a perfect crystal of level ``ell``.
479
+
480
+ A crystal `\mathcal{B}` is perfect of level `\ell` if:
481
+
482
+ #. `\mathcal{B}` is isomorphic to the crystal graph of a
483
+ finite-dimensional `U_q'(\mathfrak{g})`-module.
484
+ #. `\mathcal{B} \otimes \mathcal{B}` is connected.
485
+ #. There exists a `\lambda\in X`, such that
486
+ `\mathrm{wt}(\mathcal{B}) \subset \lambda + \sum_{i\in I}
487
+ \ZZ_{\le 0} \alpha_i` and there is a unique element in
488
+ `\mathcal{B}` of classical weight `\lambda`.
489
+ #. For all `b \in \mathcal{B}`,
490
+ `\mathrm{level}(\varepsilon (b)) \geq \ell`.
491
+ #. For all `\Lambda` dominant weights of level `\ell`, there
492
+ exist unique elements `b_{\Lambda}, b^{\Lambda} \in
493
+ \mathcal{B}`, such that `\varepsilon(b_{\Lambda}) =
494
+ \Lambda = \varphi(b^{\Lambda})`.
495
+
496
+ Points (1)-(3) are known to hold. This method checks
497
+ points (4) and (5).
498
+
499
+ If ``self`` is the Kirillov-Reshetikhin crystal `B^{r,s}`,
500
+ then it was proven for non-exceptional types in [FOS2010]_
501
+ that it is perfect if and only if `s/c_r` is an integer
502
+ (where `c_r` is a constant related to the type of the crystal).
503
+
504
+ It is conjectured this is true for all affine types.
505
+
506
+ INPUT:
507
+
508
+ - ``ell`` -- (default: `s / c_r`) integer; the level
509
+
510
+ REFERENCES:
511
+
512
+ [FOS2010]_
513
+
514
+ EXAMPLES::
515
+
516
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1)
517
+ sage: K.is_perfect()
518
+ True
519
+
520
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 1)
521
+ sage: K.is_perfect()
522
+ False
523
+
524
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 2)
525
+ sage: K.is_perfect()
526
+ True
527
+
528
+ sage: K = crystals.KirillovReshetikhin(['E',6,1], 1, 3)
529
+ sage: K.is_perfect()
530
+ True
531
+
532
+ TESTS:
533
+
534
+ Check that this works correctly for `B^{n,s}`
535
+ of type `A_{2n}^{(2)\dagger}` (:issue:`24364`)::
536
+
537
+ sage: K = crystals.KirillovReshetikhin(CartanType(['A',6,2]).dual(), 3, 1)
538
+ sage: K.is_perfect()
539
+ True
540
+ sage: K.is_perfect(1)
541
+ True
542
+
543
+ .. TODO::
544
+
545
+ Implement a version for tensor products of KR crystals.
546
+ """
547
+ from sage.rings.integer_ring import ZZ
548
+ if ell is None:
549
+ if (self.cartan_type().dual().type() == 'BC'
550
+ and self.cartan_type().rank() - 1 == self.r()):
551
+ return True
552
+ ell = self.s() / self.cartan_type().c()[self.r()]
553
+ if ell not in ZZ:
554
+ return False
555
+
556
+ if ell not in ZZ:
557
+ raise ValueError("perfectness not defined for non-integral levels")
558
+
559
+ # [FOS2010]_ check
560
+ if self.cartan_type().classical().type() not in ['E', 'F', 'G']:
561
+ if (self.cartan_type().dual().type() == 'BC'
562
+ and self.cartan_type().rank() - 1 == self.r()):
563
+ return ell == self.s()
564
+ return ell == self.s() / self.cartan_type().c()[self.r()]
565
+
566
+ # Check by definition
567
+ # TODO: This is duplicated from ProjectedLevelZeroLSPaths, combine the two methods.
568
+ # TODO: Similarly, don't duplicate in the tensor product category, maybe
569
+ # move this to the derived affine category?
570
+ MPhi = []
571
+ for b in self:
572
+ p = b.Phi().level()
573
+ assert p == b.Epsilon().level()
574
+ if p < ell:
575
+ return False
576
+ if p == ell:
577
+ MPhi += [b]
578
+ weights = []
579
+ I = self.index_set()
580
+ rank = len(I)
581
+ La = self.weight_lattice_realization().basis()
582
+ from sage.combinat.integer_vector import IntegerVectors
583
+ for n in range(1, ell + 1):
584
+ for c in IntegerVectors(n, rank):
585
+ w = sum(c[i] * La[i] for i in I)
586
+ if w.level() == ell:
587
+ weights.append(w)
588
+ return sorted(b.Phi() for b in MPhi) == sorted(weights)
589
+
590
+ def level(self):
591
+ r"""
592
+ Return the level of ``self`` when ``self`` is a perfect crystal.
593
+
594
+ .. SEEALSO::
595
+
596
+ :meth:`~sage.categories.loop_crystals.KirillovReshetikhinCrystals.ParentMethods.is_perfect`
597
+
598
+ EXAMPLES::
599
+
600
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1)
601
+ sage: K.level()
602
+ 1
603
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 2)
604
+ sage: K.level()
605
+ 1
606
+ sage: K = crystals.KirillovReshetikhin(['D',4,1], 1, 3)
607
+ sage: K.level()
608
+ 3
609
+
610
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 1)
611
+ sage: K.level()
612
+ Traceback (most recent call last):
613
+ ...
614
+ ValueError: this crystal is not perfect
615
+
616
+ TESTS:
617
+
618
+ Check that this works correctly for `B^{n,s}`
619
+ of type `A_{2n}^{(2)\dagger}` (:issue:`24364`)::
620
+
621
+ sage: ct = CartanType(['A',6,2]).dual()
622
+ sage: K1 = crystals.KirillovReshetikhin(ct, 3,1)
623
+ sage: K1.level()
624
+ 1
625
+ sage: K4 = crystals.KirillovReshetikhin(ct, 3,4)
626
+ sage: K4.level()
627
+ 4
628
+ """
629
+ if not self.is_perfect():
630
+ raise ValueError("this crystal is not perfect")
631
+ if (self.cartan_type().dual().type() == 'BC'
632
+ and self.cartan_type().rank() - 1 == self.r()):
633
+ return self.s()
634
+ return self.s() / self.cartan_type().c()[self.r()]
635
+
636
+ def q_dimension(self, q=None, prec=None, use_product=False):
637
+ """
638
+ Return the `q`-dimension of ``self``.
639
+
640
+ The `q`-dimension of a KR crystal is defined as the `q`-dimension of
641
+ the underlying classical crystal.
642
+
643
+ EXAMPLES::
644
+
645
+ sage: KRC = crystals.KirillovReshetikhin(['A',2,1], 2,2)
646
+ sage: KRC.q_dimension()
647
+ q^4 + q^3 + 2*q^2 + q + 1
648
+ sage: KRC = crystals.KirillovReshetikhin(['D',4,1], 2,1)
649
+ sage: KRC.q_dimension()
650
+ q^10 + q^9 + 3*q^8 + 3*q^7 + 4*q^6 + 4*q^5 + 4*q^4 + 3*q^3 + 3*q^2 + q + 2
651
+ """
652
+ return self.classical_decomposition().q_dimension(q, prec, use_product)
653
+
654
+ class ElementMethods:
655
+ def lusztig_involution(self):
656
+ r"""
657
+ Return the result of the classical Lusztig involution on ``self``.
658
+
659
+ EXAMPLES::
660
+
661
+ sage: KRT = crystals.KirillovReshetikhin(['D',4,1], 2, 3, model='KR')
662
+ sage: mg = KRT.module_generators[1]
663
+ sage: mg.lusztig_involution()
664
+ [[-2, -2, 1], [-1, -1, 2]]
665
+ sage: elt = mg.f_string([2,1,3,2]); elt
666
+ [[3, -2, 1], [4, -1, 2]]
667
+ sage: elt.lusztig_involution()
668
+ [[-4, -2, 1], [-3, -1, 2]]
669
+ """
670
+ Cl = self.parent().cartan_type().classical()
671
+ I = Cl.index_set()
672
+ aut = Cl.opposition_automorphism()
673
+ hw = self.to_highest_weight(I)[1]
674
+ hw.reverse()
675
+ return self.to_lowest_weight(I)[0].e_string(aut[i] for i in hw)
676
+
677
+ @cached_method
678
+ def energy_function(self):
679
+ r"""
680
+ Return the energy function of ``self``.
681
+
682
+ Let `B` be a KR crystal. Let `b^{\sharp}` denote the unique
683
+ element such that `\varphi(b^{\sharp}) = \ell \Lambda_0` with
684
+ `\ell = \min \{ \langle c, \varphi(b) \mid b \in B \}`. Let
685
+ `u_B` denote the maximal element of `B`. The *energy* of
686
+ `b \in B` is given by
687
+
688
+ .. MATH::
689
+
690
+ D(b) = H(b \otimes b^{\sharp}) - H(u_B \otimes b^{\sharp}),
691
+
692
+ where `H` is the :meth:`local energy function
693
+ <sage.categories.loop_crystals.KirillovReshetikhinCrystals.ParentMethods.local_energy_function>`.
694
+
695
+ EXAMPLES::
696
+
697
+ sage: K = crystals.KirillovReshetikhin(['D',4,1], 2,1)
698
+ sage: for x in K.classically_highest_weight_vectors():
699
+ ....: x, x.energy_function()
700
+ ([], 1)
701
+ ([[1], [2]], 0)
702
+
703
+ sage: K = crystals.KirillovReshetikhin(['D',4,3], 1,2)
704
+ sage: for x in K.classically_highest_weight_vectors():
705
+ ....: x, x.energy_function()
706
+ ([], 2)
707
+ ([[1]], 1)
708
+ ([[1, 1]], 0)
709
+ """
710
+ B = self.parent()
711
+ bsharp = B.b_sharp()
712
+ T = B.tensor(B)
713
+ H = B.local_energy_function(B)
714
+ return H(T(self, bsharp)) - H(T(B.maximal_vector(), bsharp))
715
+
716
+ class TensorProducts(TensorProductsCategory):
717
+ """
718
+ The category of tensor products of Kirillov-Reshetikhin crystals.
719
+ """
720
+ @cached_method
721
+ def extra_super_categories(self):
722
+ """
723
+ EXAMPLES::
724
+
725
+ sage: from sage.categories.loop_crystals import KirillovReshetikhinCrystals
726
+ sage: KirillovReshetikhinCrystals().TensorProducts().extra_super_categories()
727
+ [Category of finite regular loop crystals]
728
+ """
729
+ return [RegularLoopCrystals().Finite()]
730
+
731
+ class ParentMethods:
732
+ @cached_method
733
+ def maximal_vector(self):
734
+ """
735
+ Return the maximal vector of ``self``.
736
+
737
+ EXAMPLES::
738
+
739
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
740
+ sage: T = crystals.TensorProduct(K,K,K)
741
+ sage: T.maximal_vector()
742
+ [[[1]], [[1]], [[1]]]
743
+ """
744
+ return self(*[K.maximal_vector() for K in self.crystals])
745
+
746
+ @cached_method
747
+ def classically_highest_weight_vectors(self):
748
+ r"""
749
+ Return the classically highest weight elements of ``self``.
750
+
751
+ This works by using a backtracking algorithm since if
752
+ `b_2 \otimes b_1` is classically highest weight then `b_1`
753
+ is classically highest weight.
754
+
755
+ EXAMPLES::
756
+
757
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
758
+ sage: T = crystals.TensorProduct(K,K,K)
759
+ sage: T.classically_highest_weight_vectors()
760
+ ([[[1]], [[1]], [[1]]],
761
+ [[[2]], [[1]], [[1]]],
762
+ [[[1]], [[2]], [[1]]],
763
+ [[[3]], [[2]], [[1]]])
764
+ """
765
+ n = len(self.crystals)
766
+ I0 = self.cartan_type().classical().index_set()
767
+ it = [iter(self.crystals[-1].classically_highest_weight_vectors())]
768
+ path = []
769
+ ret = []
770
+ while it:
771
+ try:
772
+ x = next(it[-1])
773
+ except StopIteration:
774
+ it.pop()
775
+ if path:
776
+ path.pop()
777
+ continue
778
+
779
+ path.append(x)
780
+ b = self.element_class(self, reversed(path))
781
+ if not b.is_highest_weight(index_set=I0):
782
+ path.pop()
783
+ continue
784
+ if len(path) == n:
785
+ ret.append(b)
786
+ path.pop()
787
+ else:
788
+ it.append(iter(self.crystals[-len(path) - 1]))
789
+ return tuple(ret)
790
+
791
+ # TODO: This is duplicated in KR crystals category
792
+ def cardinality(self):
793
+ """
794
+ Return the cardinality of ``self``.
795
+
796
+ EXAMPLES::
797
+
798
+ sage: RC = RiggedConfigurations(['A', 3, 1], [[3, 2], [1, 2]])
799
+ sage: RC.cardinality()
800
+ 100
801
+ sage: len(RC.list())
802
+ 100
803
+
804
+ sage: RC = RiggedConfigurations(['E', 7, 1], [[1,1]])
805
+ sage: RC.cardinality()
806
+ 134
807
+ sage: len(RC.list())
808
+ 134
809
+
810
+ sage: RC = RiggedConfigurations(['B', 3, 1], [[2,2],[1,2]])
811
+ sage: RC.cardinality()
812
+ 5130
813
+ """
814
+ CWLR = self.cartan_type().classical().root_system().ambient_space()
815
+ return sum(CWLR.weyl_dimension(mg.classical_weight())
816
+ for mg in self.classically_highest_weight_vectors())
817
+
818
+ def one_dimensional_configuration_sum(self, q=None, group_components=True):
819
+ r"""
820
+ Compute the one-dimensional configuration sum of ``self``.
821
+
822
+ INPUT:
823
+
824
+ - ``q`` -- (default: ``None``) a variable or ``None``;
825
+ if ``None``, a variable `q` is set in the code
826
+ - ``group_components`` -- boolean (default: ``True``); if
827
+ ``True``, then the terms are grouped by classical component
828
+
829
+ The one-dimensional configuration sum is the sum of the
830
+ weights of all elements in the crystal weighted by the
831
+ energy function.
832
+
833
+ EXAMPLES::
834
+
835
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
836
+ sage: T = crystals.TensorProduct(K,K)
837
+ sage: T.one_dimensional_configuration_sum()
838
+ B[-2*Lambda[1] + 2*Lambda[2]] + (q+1)*B[-Lambda[1]]
839
+ + (q+1)*B[Lambda[1] - Lambda[2]] + B[2*Lambda[1]]
840
+ + B[-2*Lambda[2]] + (q+1)*B[Lambda[2]]
841
+ sage: R.<t> = ZZ[]
842
+ sage: T.one_dimensional_configuration_sum(t, False)
843
+ B[-2*Lambda[1] + 2*Lambda[2]] + (t+1)*B[-Lambda[1]]
844
+ + (t+1)*B[Lambda[1] - Lambda[2]] + B[2*Lambda[1]]
845
+ + B[-2*Lambda[2]] + (t+1)*B[Lambda[2]]
846
+
847
+ sage: R = RootSystem(['A',2,1])
848
+ sage: La = R.weight_space().basis()
849
+ sage: LS = crystals.ProjectedLevelZeroLSPaths(2*La[1])
850
+ sage: (LS.one_dimensional_configuration_sum() # long time
851
+ ....: == T.one_dimensional_configuration_sum())
852
+ True
853
+
854
+ TESTS::
855
+
856
+ sage: K1 = crystals.KirillovReshetikhin(['A',2,1],1,1)
857
+ sage: K2 = crystals.KirillovReshetikhin(['A',2,1],2,1)
858
+ sage: T = crystals.TensorProduct(K1,K2)
859
+ sage: T.one_dimensional_configuration_sum() == T.one_dimensional_configuration_sum(group_components=False)
860
+ True
861
+
862
+ sage: RC = RiggedConfigurations(['A',3,1],[[1,1],[1,2]])
863
+ sage: B = crystals.KirillovReshetikhin(['A',3,1],1,1)
864
+ sage: B1 = crystals.KirillovReshetikhin(['A',3,1],1,2)
865
+ sage: T = crystals.TensorProduct(B,B1)
866
+ sage: RC.fermionic_formula() == T.one_dimensional_configuration_sum()
867
+ True
868
+ """
869
+ if q is None:
870
+ from sage.rings.rational_field import QQ
871
+ q = QQ['q'].gens()[0]
872
+ P0 = self.weight_lattice_realization().classical()
873
+ B = P0.algebra(q.parent())
874
+ if group_components:
875
+ G = self.digraph(index_set=self.cartan_type().classical().index_set())
876
+ C = G.connected_components(sort=False)
877
+ return B.sum(q**(c[0].energy_function()) * B.sum(B(P0(b.weight()))
878
+ for b in c)
879
+ for c in C)
880
+ return B.sum(q**(b.energy_function()) * B(P0(b.weight())) for b in self)
881
+
882
+ class ElementMethods:
883
+ def energy_function(self, algorithm=None):
884
+ r"""
885
+ Return the energy function of ``self``.
886
+
887
+ ALGORITHM:
888
+
889
+ .. RUBRIC:: definition
890
+
891
+ Let `T` be a tensor product of Kirillov-Reshetikhin
892
+ crystals. Let `R_i` and `H_i` be the combinatorial
893
+ `R`-matrix and local energy functions, respectively, acting
894
+ on the `i` and `i+1` factors. Let `D_B` be the energy
895
+ function of a single Kirillov-Reshetikhin crystal. The
896
+ *energy function* is given by
897
+
898
+ .. MATH::
899
+
900
+ D = \sum_{j > i} H_i R_{i+1} R_{i+2} \cdots R_{j-1}
901
+ + \sum_j D_B R_1 R_2 \cdots R_{j-1},
902
+
903
+ where `D_B` acts on the rightmost factor.
904
+
905
+ .. RUBRIC:: grading
906
+
907
+ If ``self`` is an element of `T`, a tensor product of
908
+ perfect crystals of the same level, then use the affine
909
+ grading to determine the energy. Specifically, let `g`
910
+ denote the affine grading of ``self`` and `d` the affine
911
+ grading of the maximal vector in `T`. Then the energy
912
+ of ``self`` is given by `d - g`.
913
+
914
+ For more details, see Theorem 7.5 in [ST2011]_.
915
+
916
+ INPUT:
917
+
918
+ - ``algorithm`` -- (default: ``None``) use one of the
919
+ following algorithms to determine the energy function:
920
+
921
+ * ``'definition'`` -- use the definition of the energy
922
+ function;
923
+ * ``'grading'`` -- use the affine grading;
924
+
925
+ if not specified, then this uses ``'grading'`` if all
926
+ factors are perfect of the same level and otherwise
927
+ this uses ``'definition'``
928
+
929
+ OUTPUT: integer
930
+
931
+ EXAMPLES::
932
+
933
+ sage: K = crystals.KirillovReshetikhin(['A',2,1], 1, 1)
934
+ sage: T = crystals.TensorProduct(K,K,K)
935
+ sage: hw = T.classically_highest_weight_vectors()
936
+ sage: for b in hw:
937
+ ....: print("{} {}".format(b, b.energy_function()))
938
+ [[[1]], [[1]], [[1]]] 0
939
+ [[[2]], [[1]], [[1]]] 1
940
+ [[[1]], [[2]], [[1]]] 2
941
+ [[[3]], [[2]], [[1]]] 3
942
+
943
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 2)
944
+ sage: T = crystals.TensorProduct(K,K)
945
+ sage: hw = T.classically_highest_weight_vectors()
946
+ sage: for b in hw:
947
+ ....: print("{} {}".format(b, b.energy_function()))
948
+ [[], []] 4
949
+ [[[1, 1]], []] 3
950
+ [[], [[1, 1]]] 1
951
+ [[[1, 1]], [[1, 1]]] 0
952
+ [[[1, 2]], [[1, 1]]] 1
953
+ [[[2, 2]], [[1, 1]]] 2
954
+ [[[-1, -1]], [[1, 1]]] 2
955
+ [[[1, -1]], [[1, 1]]] 2
956
+ [[[2, -1]], [[1, 1]]] 2
957
+
958
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 1)
959
+ sage: T = crystals.TensorProduct(K)
960
+ sage: t = T.module_generators[0]
961
+ sage: t.energy_function('grading')
962
+ Traceback (most recent call last):
963
+ ...
964
+ NotImplementedError: all crystals in the tensor product
965
+ need to be perfect of the same level
966
+
967
+ TESTS::
968
+
969
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1, 2)
970
+ sage: K2 = crystals.KirillovReshetikhin(['C',2,1], 2, 2)
971
+ sage: T = tensor([K, K2])
972
+ sage: hw = T.classically_highest_weight_vectors()
973
+ sage: all(b.energy_function() == b.energy_function(algorithm='definition')
974
+ ....: for b in hw)
975
+ True
976
+ """
977
+ from sage.arith.misc import integer_ceil as ceil
978
+
979
+ C = self.parent().crystals[0]
980
+ ell = ceil(C.s() / C.cartan_type().c()[C.r()])
981
+ is_perfect = all(ell == K.s() / K.cartan_type().c()[K.r()]
982
+ for K in self.parent().crystals)
983
+ if algorithm is None:
984
+ if is_perfect:
985
+ algorithm = 'grading'
986
+ else:
987
+ algorithm = 'definition'
988
+
989
+ if algorithm == 'grading':
990
+ if not is_perfect:
991
+ raise NotImplementedError("all crystals in the tensor product need to be perfect of the same level")
992
+ d = self.parent().maximal_vector().affine_grading()
993
+ return d - self.affine_grading()
994
+
995
+ if algorithm == 'definition':
996
+ # Setup
997
+ from sage.rings.integer_ring import ZZ
998
+ energy = ZZ.zero()
999
+ R_mats = [[K.R_matrix(Kp) for Kp in self.parent().crystals[i+1:]]
1000
+ for i, K in enumerate(self.parent().crystals)]
1001
+ H_funcs = [[K.local_energy_function(Kp) for Kp in self.parent().crystals[i+1:]]
1002
+ for i, K in enumerate(self.parent().crystals)]
1003
+
1004
+ for i, b in enumerate(self):
1005
+ for j, R in enumerate(R_mats[i]):
1006
+ H = H_funcs[i][j]
1007
+ bp = self[i+j+1]
1008
+ T = R.domain()
1009
+ t = T(b, bp)
1010
+ energy += H(t)
1011
+ b = R(t)[1]
1012
+ energy += b.energy_function() # D contribution
1013
+ return energy
1014
+ else:
1015
+ raise ValueError("invalid algorithm")
1016
+
1017
+ def affine_grading(self):
1018
+ r"""
1019
+ Return the affine grading of ``self``.
1020
+
1021
+ The affine grading is calculated by finding a path
1022
+ from ``self`` to a ground state path (using the helper method
1023
+ :meth:`e_string_to_ground_state`) and counting the number
1024
+ of affine Kashiwara operators `e_0` applied on the way.
1025
+
1026
+ OUTPUT: integer
1027
+
1028
+ EXAMPLES::
1029
+
1030
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
1031
+ sage: T = crystals.TensorProduct(K,K)
1032
+ sage: t = T.module_generators[0]
1033
+ sage: t.affine_grading()
1034
+ 1
1035
+
1036
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
1037
+ sage: T = crystals.TensorProduct(K,K,K)
1038
+ sage: hw = T.classically_highest_weight_vectors()
1039
+ sage: for b in hw:
1040
+ ....: print("{} {}".format(b, b.affine_grading()))
1041
+ [[[1]], [[1]], [[1]]] 3
1042
+ [[[2]], [[1]], [[1]]] 2
1043
+ [[[1]], [[2]], [[1]]] 1
1044
+ [[[3]], [[2]], [[1]]] 0
1045
+
1046
+ sage: K = crystals.KirillovReshetikhin(['C',2,1],1,1)
1047
+ sage: T = crystals.TensorProduct(K,K,K)
1048
+ sage: hw = T.classically_highest_weight_vectors()
1049
+ sage: for b in hw:
1050
+ ....: print("{} {}".format(b, b.affine_grading()))
1051
+ [[[1]], [[1]], [[1]]] 2
1052
+ [[[2]], [[1]], [[1]]] 1
1053
+ [[[-1]], [[1]], [[1]]] 1
1054
+ [[[1]], [[2]], [[1]]] 1
1055
+ [[[-2]], [[2]], [[1]]] 0
1056
+ [[[1]], [[-1]], [[1]]] 0
1057
+ """
1058
+ return self.e_string_to_ground_state().count(0)
1059
+
1060
+ @cached_method
1061
+ def e_string_to_ground_state(self):
1062
+ r"""
1063
+ Return a string of integers in the index set
1064
+ `(i_1, \ldots, i_k)` such that `e_{i_k} \cdots e_{i_1}`
1065
+ of ``self`` is the ground state.
1066
+
1067
+ This method calculates a path from ``self`` to a ground
1068
+ state path using Demazure arrows as defined in Lemma 7.3
1069
+ in [ST2011]_.
1070
+
1071
+ OUTPUT: a tuple of integers `(i_1, \ldots, i_k)`
1072
+
1073
+ EXAMPLES::
1074
+
1075
+ sage: K = crystals.KirillovReshetikhin(['A',2,1],1,1)
1076
+ sage: T = crystals.TensorProduct(K,K)
1077
+ sage: t = T.module_generators[0]
1078
+ sage: t.e_string_to_ground_state()
1079
+ (0, 2)
1080
+
1081
+ sage: K = crystals.KirillovReshetikhin(['C',2,1],1,1)
1082
+ sage: T = crystals.TensorProduct(K,K)
1083
+ sage: t = T.module_generators[0]; t
1084
+ [[[1]], [[1]]]
1085
+ sage: t.e_string_to_ground_state()
1086
+ (0,)
1087
+ sage: x = t.e(0)
1088
+ sage: x.e_string_to_ground_state()
1089
+ ()
1090
+ sage: y = t.f_string([1,2,1,1,0]); y
1091
+ [[[2]], [[1]]]
1092
+ sage: y.e_string_to_ground_state()
1093
+ ()
1094
+
1095
+ TESTS:
1096
+
1097
+ Check that :issue:`22882` is fixed::
1098
+
1099
+ sage: K = crystals.KirillovReshetikhin(CartanType(['A',6,2]).dual(), 1,1)
1100
+ sage: T = tensor([K,K,K])
1101
+ sage: hw = [x for x in T if x.is_highest_weight([1,2,3])]
1102
+ sage: gs = T(K(0), K(0), K(0))
1103
+ sage: all(elt.e_string(elt.e_string_to_ground_state()) == gs
1104
+ ....: for elt in hw)
1105
+ True
1106
+ sage: all(elt.energy_function() == elt.energy_function('definition')
1107
+ ....: for elt in hw)
1108
+ True
1109
+ """
1110
+ from sage.arith.misc import integer_ceil as ceil
1111
+
1112
+ ell = max(ceil(K.s()/K.cartan_type().c()[K.r()])
1113
+ for K in self.parent().crystals)
1114
+ if self.cartan_type().dual().type() == 'BC':
1115
+ I = self.cartan_type().index_set()
1116
+ for i in I[:-1]:
1117
+ if self.epsilon(i) > 0:
1118
+ return (i,) + (self.e(i)).e_string_to_ground_state()
1119
+ if self.epsilon(I[-1]) > ell:
1120
+ return (I[-1],) + (self.e(I[-1])).e_string_to_ground_state()
1121
+ return ()
1122
+
1123
+ I = self.cartan_type().classical().index_set()
1124
+ for i in I:
1125
+ if self.epsilon(i) > 0:
1126
+ return (i,) + self.e(i).e_string_to_ground_state()
1127
+ if self.epsilon(0) > ell:
1128
+ return (0,) + self.e(0).e_string_to_ground_state()
1129
+ return ()
1130
+
1131
+
1132
+ #####################################################################
1133
+ # Local energy function
1134
+
1135
+ class LocalEnergyFunction(Map):
1136
+ r"""
1137
+ The local energy function.
1138
+
1139
+ Let `B` and `B'` be Kirillov-Reshetikhin crystals with maximal
1140
+ vectors `u_B` and `u_{B'}` respectively. The *local energy function*
1141
+ `H : B \otimes B' \to \ZZ` is the function which satisfies
1142
+
1143
+ .. MATH::
1144
+
1145
+ H(e_0(b \otimes b')) = H(b \otimes b') + \begin{cases}
1146
+ 1 & \text{if } i = 0 \text{ and LL}, \\
1147
+ -1 & \text{if } i = 0 \text{ and RR}, \\
1148
+ 0 & \text{otherwise,}
1149
+ \end{cases}
1150
+
1151
+ where LL (resp. RR) denote `e_0` acts on the left (resp. right)
1152
+ on both `b \otimes b'` and `R(b \otimes b')`, and
1153
+ normalized by `H(u_B \otimes u_{B'}) = 0`.
1154
+
1155
+ INPUT:
1156
+
1157
+ - ``B`` -- a Kirillov-Reshetikhin crystal
1158
+ - ``Bp`` -- a Kirillov-Reshetikhin crystal
1159
+ - ``normalization`` -- (default: 0) the normalization value
1160
+
1161
+ EXAMPLES::
1162
+
1163
+ sage: K = crystals.KirillovReshetikhin(['C',2,1], 1,2)
1164
+ sage: K2 = crystals.KirillovReshetikhin(['C',2,1], 2,1)
1165
+ sage: H = K.local_energy_function(K2)
1166
+ sage: T = tensor([K, K2])
1167
+ sage: hw = T.classically_highest_weight_vectors()
1168
+ sage: for b in hw:
1169
+ ....: b, H(b)
1170
+ ([[], [[1], [2]]], 1)
1171
+ ([[[1, 1]], [[1], [2]]], 0)
1172
+ ([[[2, -2]], [[1], [2]]], 1)
1173
+ ([[[1, -2]], [[1], [2]]], 1)
1174
+
1175
+ REFERENCES:
1176
+
1177
+ [KKMMNN1992]_
1178
+ """
1179
+ def __init__(self, B, Bp, normalization=0):
1180
+ """
1181
+ Initialize ``self``.
1182
+
1183
+ EXAMPLES::
1184
+
1185
+ sage: K = crystals.KirillovReshetikhin(['A',7,2], 1,2)
1186
+ sage: K2 = crystals.KirillovReshetikhin(['A',7,2], 2,1)
1187
+ sage: H = K.local_energy_function(K2)
1188
+ sage: TestSuite(H).run(skip=['_test_category', '_test_pickling'])
1189
+
1190
+ TESTS:
1191
+
1192
+ Check that :issue:`23014` is fixed::
1193
+
1194
+ sage: La = RootSystem(['G',2,1]).weight_space().fundamental_weights()
1195
+ sage: K = crystals.ProjectedLevelZeroLSPaths(La[1])
1196
+ sage: H = K.local_energy_function(K)
1197
+ sage: hw = H.domain().classically_highest_weight_vectors()
1198
+ sage: [H(x) for x in hw]
1199
+ [0, 1, 2, 1]
1200
+ """
1201
+ from sage.rings.integer_ring import ZZ
1202
+ self._B = B
1203
+ self._Bp = Bp
1204
+ self._R_matrix = self._B.R_matrix(self._Bp)
1205
+ T = B.tensor(Bp)
1206
+ self._known_values = {T(*[K.maximal_vector() for K in T.crystals]):
1207
+ ZZ(normalization)}
1208
+ self._I0 = T.cartan_type().classical().index_set()
1209
+ from sage.categories.homset import Hom
1210
+ Map.__init__(self, Hom(T, ZZ))
1211
+
1212
+ def _repr_(self):
1213
+ """
1214
+ Return a string representation of ``self``.
1215
+
1216
+ EXAMPLES::
1217
+
1218
+ sage: K = crystals.KirillovReshetikhin(['A', 6, 2], 2, 1)
1219
+ sage: Kp = crystals.KirillovReshetikhin(['A', 6, 2], 1, 1)
1220
+ sage: H = K.local_energy_function(Kp); H
1221
+ Local energy function of
1222
+ Kirillov-Reshetikhin crystal of type ['BC', 3, 2] with (r,s)=(2,1)
1223
+ tensor
1224
+ Kirillov-Reshetikhin crystal of type ['BC', 3, 2] with (r,s)=(1,1)
1225
+ """
1226
+ return "Local energy function of {} tensor {}".format(self._B, self._Bp)
1227
+
1228
+ def _call_(self, x):
1229
+ """
1230
+ Return the local energy of ``x``.
1231
+
1232
+ EXAMPLES::
1233
+
1234
+ sage: K = crystals.KirillovReshetikhin(['B',4,1], 1,2)
1235
+ sage: K2 = crystals.KirillovReshetikhin(['B',4,1], 2,1)
1236
+ sage: H = K.local_energy_function(K2)
1237
+ sage: T = tensor([K, K2])
1238
+ sage: hw = [x for x in T if x.is_highest_weight([1,2])]
1239
+ sage: H(hw[0])
1240
+ 1
1241
+ """
1242
+ # Setup variables
1243
+ visited = {x: 0}
1244
+ check0 = [x]
1245
+
1246
+ # Helper function
1247
+ def to_classical_hw(cur):
1248
+ for i in self._I0:
1249
+ b = cur.e(i)
1250
+ if b is not None and b not in visited:
1251
+ visited[b] = visited[cur] # No change
1252
+ return b
1253
+ return None # is classically HW or all have been visited
1254
+
1255
+ cur = x
1256
+ # Get the affine node (it might not be 0 if the type
1257
+ # has been relabeled)
1258
+ i0 = x.parent().cartan_type().special_node()
1259
+ while cur not in self._known_values:
1260
+ # We first go towards the classically highest weight since
1261
+ # the maximal vector is classically highest weight
1262
+ b = to_classical_hw(cur)
1263
+
1264
+ # If classically HW, then try 0 arrows
1265
+ while b is None:
1266
+ b = check0.pop()
1267
+ c = b.e(i0)
1268
+ # If there is no 0 arrow or we have already seen c, move along
1269
+ if c is None or c in visited:
1270
+ b = None
1271
+ continue
1272
+
1273
+ bp = self._R_matrix(b)
1274
+ cp = bp.e(i0)
1275
+ if b[1] == c[1] and bp[1] == cp[1]: # LL case
1276
+ visited[c] = visited[b] + 1
1277
+ elif b[0] == c[0] and bp[0] == cp[0]: # RR case
1278
+ visited[c] = visited[b] - 1
1279
+ else:
1280
+ visited[c] = visited[b] # Otherwise no change
1281
+ b = c
1282
+
1283
+ cur = b
1284
+ check0.append(b)
1285
+
1286
+ baseline = self._known_values[cur] - visited[cur]
1287
+ for y, vy in visited.items():
1288
+ self._known_values[y] = baseline + vy
1289
+
1290
+ return self._known_values[x]