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