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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- 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]
|