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,1506 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Finite Complex Reflection Groups
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2011-2015 Christian Stump <christian.stump at gmail.com>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
# https://www.gnu.org/licenses/
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
|
|
15
|
+
from sage.misc.abstract_method import abstract_method
|
|
16
|
+
from sage.misc.misc_c import prod
|
|
17
|
+
from sage.misc.cachefunc import cached_method
|
|
18
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
19
|
+
from sage.categories.coxeter_groups import CoxeterGroups
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FiniteComplexReflectionGroups(CategoryWithAxiom):
|
|
23
|
+
r"""
|
|
24
|
+
The category of finite complex reflection groups.
|
|
25
|
+
|
|
26
|
+
See :class:`ComplexReflectionGroups` for the definition of complex
|
|
27
|
+
reflection group. In the finite case, most of the information
|
|
28
|
+
about the group can be recovered from its *degrees* and
|
|
29
|
+
*codegrees*, and to a lesser extent to the explicit realization as
|
|
30
|
+
subgroup of `GL(V)`. Hence the most important optional methods to
|
|
31
|
+
implement are:
|
|
32
|
+
|
|
33
|
+
- :meth:`ComplexReflectionGroups.Finite.ParentMethods.degrees`,
|
|
34
|
+
- :meth:`ComplexReflectionGroups.Finite.ParentMethods.codegrees`,
|
|
35
|
+
- :meth:`ComplexReflectionGroups.Finite.ElementMethods.to_matrix`.
|
|
36
|
+
|
|
37
|
+
Finite complex reflection groups are completely classified. In
|
|
38
|
+
particular, if the group is irreducible, then it's uniquely
|
|
39
|
+
determined by its degrees and codegrees and whether it's
|
|
40
|
+
reflection representation is *primitive* or not (see [LT2009]_
|
|
41
|
+
Chapter 2.1 for the definition of primitive).
|
|
42
|
+
|
|
43
|
+
.. SEEALSO:: :wikipedia:`Complex_reflection_groups`
|
|
44
|
+
|
|
45
|
+
EXAMPLES::
|
|
46
|
+
|
|
47
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
48
|
+
sage: ComplexReflectionGroups().Finite()
|
|
49
|
+
Category of finite complex reflection groups
|
|
50
|
+
sage: ComplexReflectionGroups().Finite().super_categories()
|
|
51
|
+
[Category of complex reflection groups,
|
|
52
|
+
Category of finite groups,
|
|
53
|
+
Category of finite finitely generated semigroups]
|
|
54
|
+
|
|
55
|
+
An example of a finite reflection group::
|
|
56
|
+
|
|
57
|
+
sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
|
|
58
|
+
Reducible real reflection group of rank 4 and type A2 x B2
|
|
59
|
+
|
|
60
|
+
sage: W.reflections() # optional - gap3
|
|
61
|
+
Finite family {1: (1,8)(2,5)(9,12), 2: (1,5)(2,9)(8,12),
|
|
62
|
+
3: (3,10)(4,7)(11,14), 4: (3,6)(4,11)(10,13),
|
|
63
|
+
5: (1,9)(2,8)(5,12), 6: (4,14)(6,13)(7,11),
|
|
64
|
+
7: (3,13)(6,10)(7,14)}
|
|
65
|
+
|
|
66
|
+
``W`` is in the category of complex reflection groups::
|
|
67
|
+
|
|
68
|
+
sage: W in ComplexReflectionGroups().Finite() # optional - gap3
|
|
69
|
+
True
|
|
70
|
+
"""
|
|
71
|
+
def example(self):
|
|
72
|
+
r"""
|
|
73
|
+
Return an example of a complex reflection group.
|
|
74
|
+
|
|
75
|
+
EXAMPLES::
|
|
76
|
+
|
|
77
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
78
|
+
sage: ComplexReflectionGroups().Finite().example() # optional - gap3
|
|
79
|
+
Reducible real reflection group of rank 4 and type A2 x B2
|
|
80
|
+
"""
|
|
81
|
+
from sage.combinat.root_system.reflection_group_real import ReflectionGroup
|
|
82
|
+
return ReflectionGroup((1, 1, 3), (2, 1, 2))
|
|
83
|
+
|
|
84
|
+
class SubcategoryMethods:
|
|
85
|
+
|
|
86
|
+
@cached_method
|
|
87
|
+
def WellGenerated(self):
|
|
88
|
+
r"""
|
|
89
|
+
Return the full subcategory of well-generated objects of ``self``.
|
|
90
|
+
|
|
91
|
+
A finite complex generated group is *well generated* if it
|
|
92
|
+
is isomorphic to a subgroup of the general linear group
|
|
93
|
+
`GL_n` generated by `n` reflections.
|
|
94
|
+
|
|
95
|
+
.. SEEALSO::
|
|
96
|
+
|
|
97
|
+
:meth:`ComplexReflectionGroups.Finite.ParentMethods.is_well_generated`
|
|
98
|
+
|
|
99
|
+
EXAMPLES::
|
|
100
|
+
|
|
101
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
102
|
+
sage: C = ComplexReflectionGroups().Finite().WellGenerated(); C
|
|
103
|
+
Category of well generated finite complex reflection groups
|
|
104
|
+
|
|
105
|
+
Here is an example of a finite well-generated complex
|
|
106
|
+
reflection group::
|
|
107
|
+
|
|
108
|
+
sage: W = C.example(); W # optional - gap3
|
|
109
|
+
Reducible complex reflection group of rank 4 and type A2 x G(3,1,2)
|
|
110
|
+
|
|
111
|
+
All finite Coxeter groups are well generated::
|
|
112
|
+
|
|
113
|
+
sage: CoxeterGroups().Finite().is_subcategory(C)
|
|
114
|
+
True
|
|
115
|
+
sage: SymmetricGroup(3) in C # needs sage.groups
|
|
116
|
+
True
|
|
117
|
+
|
|
118
|
+
.. NOTE::
|
|
119
|
+
|
|
120
|
+
The category of well generated finite complex
|
|
121
|
+
reflection groups is currently implemented as an
|
|
122
|
+
axiom. See discussion on :issue:`11187`. This may be a
|
|
123
|
+
bit of overkill. Still it's nice to have a full
|
|
124
|
+
subcategory.
|
|
125
|
+
|
|
126
|
+
TESTS::
|
|
127
|
+
|
|
128
|
+
sage: TestSuite(W).run() # optional - gap3
|
|
129
|
+
sage: C = ComplexReflectionGroups().Finite().WellGenerated()
|
|
130
|
+
sage: TestSuite(C).run()
|
|
131
|
+
sage: CoxeterGroups().Finite().WellGenerated.__module__
|
|
132
|
+
'sage.categories.finite_complex_reflection_groups'
|
|
133
|
+
|
|
134
|
+
We check that the axioms are properly ordered in
|
|
135
|
+
``sage.categories.category_with_axiom.axioms`` and yield
|
|
136
|
+
desired output (well generated does not appear)::
|
|
137
|
+
|
|
138
|
+
sage: CoxeterGroups().Finite()
|
|
139
|
+
Category of finite Coxeter groups
|
|
140
|
+
"""
|
|
141
|
+
return self._with_axiom('WellGenerated')
|
|
142
|
+
|
|
143
|
+
class ParentMethods:
|
|
144
|
+
@abstract_method(optional=True)
|
|
145
|
+
def degrees(self):
|
|
146
|
+
r"""
|
|
147
|
+
Return the degrees of ``self``.
|
|
148
|
+
|
|
149
|
+
OUTPUT: a tuple of Sage integers
|
|
150
|
+
|
|
151
|
+
EXAMPLES::
|
|
152
|
+
|
|
153
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
154
|
+
sage: W.degrees() # needs sage.combinat
|
|
155
|
+
(2, 3, 4)
|
|
156
|
+
|
|
157
|
+
sage: W = ColoredPermutations(3,3) # needs sage.combinat
|
|
158
|
+
sage: W.degrees() # needs sage.combinat
|
|
159
|
+
(3, 6, 9)
|
|
160
|
+
|
|
161
|
+
sage: W = ReflectionGroup(31) # optional - gap3
|
|
162
|
+
sage: W.degrees() # optional - gap3
|
|
163
|
+
(8, 12, 20, 24)
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
@abstract_method(optional=True)
|
|
167
|
+
def codegrees(self):
|
|
168
|
+
r"""
|
|
169
|
+
Return the codegrees of ``self``.
|
|
170
|
+
|
|
171
|
+
OUTPUT: a tuple of Sage integers
|
|
172
|
+
|
|
173
|
+
EXAMPLES::
|
|
174
|
+
|
|
175
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
176
|
+
sage: W.codegrees() # needs sage.combinat
|
|
177
|
+
(2, 1, 0)
|
|
178
|
+
|
|
179
|
+
sage: W = ColoredPermutations(3,3) # needs sage.combinat
|
|
180
|
+
sage: W.codegrees() # needs sage.combinat
|
|
181
|
+
(6, 3, 0)
|
|
182
|
+
|
|
183
|
+
sage: W = ReflectionGroup(31) # optional - gap3
|
|
184
|
+
sage: W.codegrees() # optional - gap3
|
|
185
|
+
(28, 16, 12, 0)
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
def _test_degrees(self, **options):
|
|
189
|
+
"""
|
|
190
|
+
Test the method :meth:`degrees`.
|
|
191
|
+
|
|
192
|
+
INPUT:
|
|
193
|
+
|
|
194
|
+
- ``options`` -- any keyword arguments accepted by :meth:`_tester`
|
|
195
|
+
|
|
196
|
+
EXAMPLES::
|
|
197
|
+
|
|
198
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
199
|
+
sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
|
|
200
|
+
Reducible real reflection group of rank 4 and type A2 x B2
|
|
201
|
+
sage: W._test_degrees() # optional - gap3
|
|
202
|
+
|
|
203
|
+
sage: W = SymmetricGroup(5) # needs sage.groups
|
|
204
|
+
sage: W._test_degrees() # needs sage.groups sage.rings.number_field
|
|
205
|
+
|
|
206
|
+
We now break the implementation of W.degrees and check that this is caught::
|
|
207
|
+
|
|
208
|
+
sage: W.degrees = lambda: (1/1,5) # needs sage.groups
|
|
209
|
+
sage: W._test_degrees() # needs sage.groups
|
|
210
|
+
Traceback (most recent call last):
|
|
211
|
+
...
|
|
212
|
+
AssertionError: the degrees should be integers
|
|
213
|
+
|
|
214
|
+
sage: W.degrees = lambda: (1,2,3) # needs sage.groups
|
|
215
|
+
sage: W._test_degrees() # needs sage.groups
|
|
216
|
+
Traceback (most recent call last):
|
|
217
|
+
...
|
|
218
|
+
AssertionError: the degrees should be larger than 2
|
|
219
|
+
|
|
220
|
+
We restore W to its normal state::
|
|
221
|
+
|
|
222
|
+
sage: del W.degrees # needs sage.groups
|
|
223
|
+
sage: W._test_degrees() # needs sage.groups sage.rings.number_field
|
|
224
|
+
|
|
225
|
+
See the documentation for :class:`TestSuite` for more information.
|
|
226
|
+
"""
|
|
227
|
+
from sage.structure.element import parent
|
|
228
|
+
from sage.rings.integer_ring import ZZ
|
|
229
|
+
|
|
230
|
+
tester = self._tester(**options)
|
|
231
|
+
degrees = self.degrees()
|
|
232
|
+
tester.assertIsInstance(degrees, tuple,
|
|
233
|
+
"the degrees method should return a tuple")
|
|
234
|
+
tester.assertTrue(all(parent(d) is ZZ for d in degrees),
|
|
235
|
+
"the degrees should be integers")
|
|
236
|
+
tester.assertTrue(all(d >= 2 for d in degrees),
|
|
237
|
+
"the degrees should be larger than 2")
|
|
238
|
+
tester.assertEqual(len(degrees), self.rank(),
|
|
239
|
+
"the number of degrees should coincide with the rank")
|
|
240
|
+
tester.assertEqual(sum(d - 1 for d in degrees), self.number_of_reflections(),
|
|
241
|
+
"the sum of the degrees should be consistent with the number of reflections")
|
|
242
|
+
|
|
243
|
+
def _test_codegrees(self, **options):
|
|
244
|
+
"""
|
|
245
|
+
Test the method :meth:`degrees`.
|
|
246
|
+
|
|
247
|
+
INPUT:
|
|
248
|
+
|
|
249
|
+
- ``options`` -- any keyword arguments accepted by :meth:`_tester`
|
|
250
|
+
|
|
251
|
+
EXAMPLES::
|
|
252
|
+
|
|
253
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
254
|
+
sage: W = ComplexReflectionGroups().Finite().example(); W # optional - gap3
|
|
255
|
+
Reducible real reflection group of rank 4 and type A2 x B2
|
|
256
|
+
sage: W._test_codegrees() # optional - gap3
|
|
257
|
+
|
|
258
|
+
sage: W = SymmetricGroup(5) # needs sage.groups
|
|
259
|
+
sage: W._test_codegrees() # needs sage.groups sage.rings.number_field
|
|
260
|
+
|
|
261
|
+
We now break the implementation of W.degrees and check that this is caught::
|
|
262
|
+
|
|
263
|
+
sage: W.codegrees = lambda: (1/1,5) # needs sage.groups
|
|
264
|
+
sage: W._test_codegrees() # needs sage.groups
|
|
265
|
+
Traceback (most recent call last):
|
|
266
|
+
...
|
|
267
|
+
AssertionError: the codegrees should be integers
|
|
268
|
+
|
|
269
|
+
sage: W.codegrees = lambda: (2,1,-1) # needs sage.groups
|
|
270
|
+
sage: W._test_codegrees() # needs sage.groups
|
|
271
|
+
Traceback (most recent call last):
|
|
272
|
+
...
|
|
273
|
+
AssertionError: the codegrees should be nonnegative
|
|
274
|
+
|
|
275
|
+
We restore W to its normal state::
|
|
276
|
+
|
|
277
|
+
sage: del W.codegrees # needs sage.groups
|
|
278
|
+
sage: W._test_codegrees() # needs sage.groups sage.rings.number_field
|
|
279
|
+
|
|
280
|
+
See the documentation for :class:`TestSuite` for more information.
|
|
281
|
+
"""
|
|
282
|
+
from sage.structure.element import parent
|
|
283
|
+
from sage.rings.integer_ring import ZZ
|
|
284
|
+
|
|
285
|
+
tester = self._tester(**options)
|
|
286
|
+
codegrees = self.codegrees()
|
|
287
|
+
tester.assertIsInstance(codegrees, tuple,
|
|
288
|
+
"the codegrees method should return a tuple")
|
|
289
|
+
tester.assertTrue(all(parent(d) is ZZ for d in codegrees),
|
|
290
|
+
"the codegrees should be integers")
|
|
291
|
+
tester.assertTrue(all(d >= 0 for d in codegrees),
|
|
292
|
+
"the codegrees should be nonnegative")
|
|
293
|
+
tester.assertEqual(len(codegrees), self.rank(),
|
|
294
|
+
"the number of codegrees should coincide with the rank")
|
|
295
|
+
tester.assertEqual(sum(d + 1 for d in codegrees),
|
|
296
|
+
self.number_of_reflection_hyperplanes(),
|
|
297
|
+
"the sum of the codegrees should be consistent with the number of reflection hyperplanes")
|
|
298
|
+
|
|
299
|
+
@cached_method
|
|
300
|
+
def number_of_reflection_hyperplanes(self):
|
|
301
|
+
r"""
|
|
302
|
+
Return the number of reflection hyperplanes of ``self``.
|
|
303
|
+
|
|
304
|
+
This is also the number of distinguished reflections. For
|
|
305
|
+
real groups, this coincides with the number of
|
|
306
|
+
reflections.
|
|
307
|
+
|
|
308
|
+
This implementation uses that it is given by the sum of
|
|
309
|
+
the codegrees of ``self`` plus its rank.
|
|
310
|
+
|
|
311
|
+
.. SEEALSO:: :meth:`number_of_reflections`
|
|
312
|
+
|
|
313
|
+
EXAMPLES::
|
|
314
|
+
|
|
315
|
+
sage: # needs sage.combinat
|
|
316
|
+
sage: W = ColoredPermutations(1,3)
|
|
317
|
+
sage: W.number_of_reflection_hyperplanes()
|
|
318
|
+
3
|
|
319
|
+
sage: W = ColoredPermutations(2,3)
|
|
320
|
+
sage: W.number_of_reflection_hyperplanes()
|
|
321
|
+
9
|
|
322
|
+
sage: W = ColoredPermutations(4,3)
|
|
323
|
+
sage: W.number_of_reflection_hyperplanes()
|
|
324
|
+
15
|
|
325
|
+
|
|
326
|
+
sage: # optional - gap3, needs sage.combinat
|
|
327
|
+
sage: W = ReflectionGroup((4,2,3))
|
|
328
|
+
sage: W.number_of_reflection_hyperplanes()
|
|
329
|
+
15
|
|
330
|
+
"""
|
|
331
|
+
from sage.rings.integer_ring import ZZ
|
|
332
|
+
return ZZ.sum(codeg + 1 for codeg in self.codegrees())
|
|
333
|
+
|
|
334
|
+
@cached_method
|
|
335
|
+
def number_of_reflections(self):
|
|
336
|
+
r"""
|
|
337
|
+
Return the number of reflections of ``self``.
|
|
338
|
+
|
|
339
|
+
For real groups, this coincides with the number of
|
|
340
|
+
reflection hyperplanes.
|
|
341
|
+
|
|
342
|
+
This implementation uses that it is given by the sum of
|
|
343
|
+
the degrees of ``self`` minus its rank.
|
|
344
|
+
|
|
345
|
+
.. SEEALSO:: :meth:`number_of_reflection_hyperplanes`
|
|
346
|
+
|
|
347
|
+
EXAMPLES::
|
|
348
|
+
|
|
349
|
+
sage: [SymmetricGroup(i).number_of_reflections() # needs sage.groups sage.rings.number_field
|
|
350
|
+
....: for i in range(int(8))]
|
|
351
|
+
[0, 0, 1, 3, 6, 10, 15, 21]
|
|
352
|
+
|
|
353
|
+
sage: # needs sage.combinat sage.groups
|
|
354
|
+
sage: W = ColoredPermutations(1,3)
|
|
355
|
+
sage: W.number_of_reflections()
|
|
356
|
+
3
|
|
357
|
+
sage: W = ColoredPermutations(2,3)
|
|
358
|
+
sage: W.number_of_reflections()
|
|
359
|
+
9
|
|
360
|
+
sage: W = ColoredPermutations(4,3)
|
|
361
|
+
sage: W.number_of_reflections()
|
|
362
|
+
21
|
|
363
|
+
sage: W = ReflectionGroup((4,2,3)) # optional - gap3
|
|
364
|
+
sage: W.number_of_reflections() # optional - gap3
|
|
365
|
+
15
|
|
366
|
+
"""
|
|
367
|
+
from sage.rings.integer_ring import ZZ
|
|
368
|
+
return ZZ.sum(deg - 1 for deg in self.degrees())
|
|
369
|
+
|
|
370
|
+
@cached_method
|
|
371
|
+
def rank(self):
|
|
372
|
+
r"""
|
|
373
|
+
Return the rank of ``self``.
|
|
374
|
+
|
|
375
|
+
The rank of ``self`` is the dimension of the smallest
|
|
376
|
+
faithfull reflection representation of ``self``.
|
|
377
|
+
|
|
378
|
+
This default implementation uses that the rank is the
|
|
379
|
+
number of :meth:`degrees`.
|
|
380
|
+
|
|
381
|
+
.. SEEALSO:: :meth:`ComplexReflectionGroups.rank`
|
|
382
|
+
|
|
383
|
+
EXAMPLES::
|
|
384
|
+
|
|
385
|
+
sage: # needs sage.combinat sage.groups
|
|
386
|
+
sage: W = ColoredPermutations(1,3)
|
|
387
|
+
sage: W.rank()
|
|
388
|
+
2
|
|
389
|
+
sage: W = ColoredPermutations(2,3)
|
|
390
|
+
sage: W.rank()
|
|
391
|
+
3
|
|
392
|
+
sage: W = ColoredPermutations(4,3)
|
|
393
|
+
sage: W.rank()
|
|
394
|
+
3
|
|
395
|
+
|
|
396
|
+
sage: # optional - gap3, needs sage.combinat sage.groups
|
|
397
|
+
sage: W = ReflectionGroup((4,2,3))
|
|
398
|
+
sage: W.rank()
|
|
399
|
+
3
|
|
400
|
+
"""
|
|
401
|
+
return len(self.degrees())
|
|
402
|
+
|
|
403
|
+
@cached_method
|
|
404
|
+
def cardinality(self):
|
|
405
|
+
r"""
|
|
406
|
+
Return the cardinality of ``self``.
|
|
407
|
+
|
|
408
|
+
It is given by the product of the degrees of ``self``.
|
|
409
|
+
|
|
410
|
+
EXAMPLES::
|
|
411
|
+
|
|
412
|
+
sage: # needs sage.combinat sage.groups
|
|
413
|
+
sage: W = ColoredPermutations(1,3)
|
|
414
|
+
sage: W.cardinality()
|
|
415
|
+
6
|
|
416
|
+
sage: W = ColoredPermutations(2,3)
|
|
417
|
+
sage: W.cardinality()
|
|
418
|
+
48
|
|
419
|
+
sage: W = ColoredPermutations(4,3)
|
|
420
|
+
sage: W.cardinality()
|
|
421
|
+
384
|
|
422
|
+
|
|
423
|
+
sage: # optional - gap3, needs sage.combinat sage.groups
|
|
424
|
+
sage: W = ReflectionGroup((4,2,3))
|
|
425
|
+
sage: W.cardinality()
|
|
426
|
+
192
|
|
427
|
+
"""
|
|
428
|
+
from sage.rings.integer_ring import ZZ
|
|
429
|
+
return ZZ.prod(self.degrees())
|
|
430
|
+
|
|
431
|
+
def is_well_generated(self) -> bool:
|
|
432
|
+
r"""
|
|
433
|
+
Return whether ``self`` is well-generated.
|
|
434
|
+
|
|
435
|
+
A finite complex reflection group is *well generated* if
|
|
436
|
+
the number of its simple reflections coincides with its rank.
|
|
437
|
+
|
|
438
|
+
.. SEEALSO:: :meth:`ComplexReflectionGroups.Finite.WellGenerated`
|
|
439
|
+
|
|
440
|
+
.. NOTE::
|
|
441
|
+
|
|
442
|
+
- All finite real reflection groups are well generated.
|
|
443
|
+
- The complex reflection groups of type `G(r,1,n)` and
|
|
444
|
+
of type `G(r,r,n)` are well generated.
|
|
445
|
+
- The complex reflection groups of type `G(r,p,n)`
|
|
446
|
+
with `1 < p < r` are *not* well generated.
|
|
447
|
+
|
|
448
|
+
- The direct product of two well generated finite
|
|
449
|
+
complex reflection group is still well generated.
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
454
|
+
sage: W.is_well_generated() # needs sage.combinat
|
|
455
|
+
True
|
|
456
|
+
|
|
457
|
+
sage: W = ColoredPermutations(4,3) # needs sage.combinat
|
|
458
|
+
sage: W.is_well_generated() # needs sage.combinat
|
|
459
|
+
True
|
|
460
|
+
|
|
461
|
+
sage: # optional - gap3, needs sage.combinat sage.groups
|
|
462
|
+
sage: W = ReflectionGroup((4,2,3))
|
|
463
|
+
sage: W.is_well_generated()
|
|
464
|
+
False
|
|
465
|
+
sage: W = ReflectionGroup((4,4,3))
|
|
466
|
+
sage: W.is_well_generated()
|
|
467
|
+
True
|
|
468
|
+
"""
|
|
469
|
+
return self.number_of_simple_reflections() == self.rank()
|
|
470
|
+
|
|
471
|
+
def is_real(self):
|
|
472
|
+
r"""
|
|
473
|
+
Return whether ``self`` is real.
|
|
474
|
+
|
|
475
|
+
A complex reflection group is *real* if it is isomorphic
|
|
476
|
+
to a reflection group in `GL(V)` over a real vector space `V`.
|
|
477
|
+
Equivalently its character table has real entries.
|
|
478
|
+
|
|
479
|
+
This implementation uses the following statement: an
|
|
480
|
+
irreducible complex reflection group is real if and only
|
|
481
|
+
if `2` is a degree of ``self`` with multiplicity one.
|
|
482
|
+
Hence, in general we just need to compare the number of
|
|
483
|
+
occurrences of `2` as degree of ``self`` and the number of
|
|
484
|
+
irreducible components.
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
489
|
+
sage: W.is_real() # needs sage.combinat
|
|
490
|
+
True
|
|
491
|
+
|
|
492
|
+
sage: W = ColoredPermutations(4,3) # needs sage.combinat
|
|
493
|
+
sage: W.is_real() # needs sage.combinat sage.graphs
|
|
494
|
+
False
|
|
495
|
+
|
|
496
|
+
.. TODO::
|
|
497
|
+
|
|
498
|
+
Add an example of non real finite complex reflection
|
|
499
|
+
group that is generated by order 2 reflections.
|
|
500
|
+
"""
|
|
501
|
+
return self.degrees().count(2) == self.number_of_irreducible_components()
|
|
502
|
+
|
|
503
|
+
@cached_method
|
|
504
|
+
def base_change_matrix(self):
|
|
505
|
+
r"""
|
|
506
|
+
Return the base change from the standard basis of the vector
|
|
507
|
+
space of ``self`` to the basis given by the independent roots of
|
|
508
|
+
``self``.
|
|
509
|
+
|
|
510
|
+
.. TODO::
|
|
511
|
+
|
|
512
|
+
For non-well-generated groups there is a conflict with
|
|
513
|
+
construction of the matrix for an element.
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
518
|
+
sage: W.base_change_matrix() # optional - gap3
|
|
519
|
+
[1 0]
|
|
520
|
+
[0 1]
|
|
521
|
+
|
|
522
|
+
sage: W = ReflectionGroup(23) # optional - gap3
|
|
523
|
+
sage: W.base_change_matrix() # optional - gap3
|
|
524
|
+
[1 0 0]
|
|
525
|
+
[0 1 0]
|
|
526
|
+
[0 0 1]
|
|
527
|
+
|
|
528
|
+
sage: W = ReflectionGroup((3,1,2)) # optional - gap3
|
|
529
|
+
sage: W.base_change_matrix() # optional - gap3
|
|
530
|
+
[1 0]
|
|
531
|
+
[1 1]
|
|
532
|
+
|
|
533
|
+
sage: W = ReflectionGroup((4,2,2)) # optional - gap3
|
|
534
|
+
sage: W.base_change_matrix() # optional - gap3
|
|
535
|
+
[ 1 0]
|
|
536
|
+
[E(4) 1]
|
|
537
|
+
"""
|
|
538
|
+
from sage.matrix.constructor import Matrix
|
|
539
|
+
return Matrix(list(self.independent_roots())).inverse()
|
|
540
|
+
|
|
541
|
+
def milnor_fiber_poset(self):
|
|
542
|
+
r"""
|
|
543
|
+
Return the Milnor fiber poset of ``self``.
|
|
544
|
+
|
|
545
|
+
The *Milnor fiber poset* of a finite complex reflection group `W`
|
|
546
|
+
is defined as the poset of (right) standard cosets `gW_J`,
|
|
547
|
+
where `J` is a subset of the index set `I` of `W`, ordered
|
|
548
|
+
by reverse inclusion. This is conjecturally a meet semilattice
|
|
549
|
+
if and only if `W` is well-generated.
|
|
550
|
+
|
|
551
|
+
EXAMPLES::
|
|
552
|
+
|
|
553
|
+
sage: # needs sage.combinat sage.graphs sage.modules
|
|
554
|
+
sage: W = ColoredPermutations(3, 2)
|
|
555
|
+
sage: P = W.milnor_fiber_poset()
|
|
556
|
+
sage: P
|
|
557
|
+
Finite meet-semilattice containing 34 elements
|
|
558
|
+
sage: R.<x> = ZZ[]
|
|
559
|
+
sage: sum(x**P.rank(elt) for elt in P)
|
|
560
|
+
18*x^2 + 15*x + 1
|
|
561
|
+
|
|
562
|
+
sage: # optional - gap3
|
|
563
|
+
sage: W = ReflectionGroup(4)
|
|
564
|
+
sage: P = W.milnor_fiber_poset(); P
|
|
565
|
+
Finite meet-semilattice containing 41 elements
|
|
566
|
+
sage: sum(x**P.rank(elt) for elt in P)
|
|
567
|
+
24*x^2 + 16*x + 1
|
|
568
|
+
|
|
569
|
+
sage: # optional - gap3
|
|
570
|
+
sage: W = ReflectionGroup([4,2,2])
|
|
571
|
+
sage: W.is_well_generated()
|
|
572
|
+
False
|
|
573
|
+
sage: P = W.milnor_fiber_poset(); P
|
|
574
|
+
Finite poset containing 47 elements
|
|
575
|
+
sage: sum(x**P.rank(elt) for elt in P)
|
|
576
|
+
16*x^3 + 24*x^2 + 6*x + 1
|
|
577
|
+
sage: P.is_meet_semilattice()
|
|
578
|
+
False
|
|
579
|
+
"""
|
|
580
|
+
I = self.index_set()
|
|
581
|
+
data = {}
|
|
582
|
+
next_reprs = {(): list(self)}
|
|
583
|
+
next_cosets = {(): [frozenset([g]) for g in next_reprs[()]]}
|
|
584
|
+
next_level = {(i, ()) for i in range(len(next_cosets[()]))}
|
|
585
|
+
while next_level:
|
|
586
|
+
cur = next_level
|
|
587
|
+
cosets = next_cosets
|
|
588
|
+
reprs = next_reprs
|
|
589
|
+
next_level = set()
|
|
590
|
+
next_cosets = {}
|
|
591
|
+
next_reprs = {}
|
|
592
|
+
for Y in cur:
|
|
593
|
+
index, J = Y
|
|
594
|
+
for i in I:
|
|
595
|
+
if i in J:
|
|
596
|
+
continue
|
|
597
|
+
Jp = tuple(sorted(J + (i,)))
|
|
598
|
+
# See if the coset is already there
|
|
599
|
+
found_coset = False
|
|
600
|
+
if Jp in next_cosets:
|
|
601
|
+
rep = reprs[J][index]
|
|
602
|
+
for ii, C in enumerate(next_cosets[Jp]):
|
|
603
|
+
if rep in C:
|
|
604
|
+
found_coset = True
|
|
605
|
+
Yp = (reprs[J][index], J)
|
|
606
|
+
Xp = (next_reprs[Jp][ii], Jp)
|
|
607
|
+
if Xp in data:
|
|
608
|
+
data[Xp].append(Yp)
|
|
609
|
+
else:
|
|
610
|
+
data[Xp] = [Yp]
|
|
611
|
+
else:
|
|
612
|
+
next_cosets[Jp] = []
|
|
613
|
+
next_reprs[Jp] = []
|
|
614
|
+
if found_coset:
|
|
615
|
+
continue
|
|
616
|
+
|
|
617
|
+
# Otherwise build the coset
|
|
618
|
+
next_level.add((len(next_cosets[Jp]), Jp))
|
|
619
|
+
H = set(cosets[J][index])
|
|
620
|
+
to_test = [(g, i) for g in H]
|
|
621
|
+
while to_test:
|
|
622
|
+
g, j = to_test.pop()
|
|
623
|
+
gp = g.apply_simple_reflection(j, side='right')
|
|
624
|
+
if gp in H:
|
|
625
|
+
continue
|
|
626
|
+
H.add(gp)
|
|
627
|
+
to_test.extend((gp, j) for j in Jp)
|
|
628
|
+
rep = min(H, key=lambda g: g.length())
|
|
629
|
+
next_cosets[Jp].append(frozenset(H))
|
|
630
|
+
next_reprs[Jp].append(rep)
|
|
631
|
+
Yp = (reprs[J][index], J)
|
|
632
|
+
Xp = (rep, Jp)
|
|
633
|
+
if Xp in data:
|
|
634
|
+
data[Xp].append(Yp)
|
|
635
|
+
else:
|
|
636
|
+
data[Xp] = [Yp]
|
|
637
|
+
if self.is_well_generated():
|
|
638
|
+
from sage.combinat.posets.lattices import MeetSemilattice
|
|
639
|
+
return MeetSemilattice(data)
|
|
640
|
+
from sage.combinat.posets.posets import Poset
|
|
641
|
+
return Poset(data)
|
|
642
|
+
|
|
643
|
+
class ElementMethods:
|
|
644
|
+
|
|
645
|
+
@abstract_method(optional=True)
|
|
646
|
+
def to_matrix(self):
|
|
647
|
+
r"""
|
|
648
|
+
Return the matrix presentation of ``self`` acting on a
|
|
649
|
+
vector space `V`.
|
|
650
|
+
|
|
651
|
+
EXAMPLES::
|
|
652
|
+
|
|
653
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
654
|
+
sage: [t.to_matrix() for t in W] # optional - gap3
|
|
655
|
+
[
|
|
656
|
+
[1 0] [ 1 1] [-1 0] [-1 -1] [ 0 1] [ 0 -1]
|
|
657
|
+
[0 1], [ 0 -1], [ 1 1], [ 1 0], [-1 -1], [-1 0]
|
|
658
|
+
]
|
|
659
|
+
|
|
660
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
661
|
+
sage: [t.to_matrix() for t in W] # needs sage.combinat sage.groups
|
|
662
|
+
[
|
|
663
|
+
[1 0 0] [1 0 0] [0 1 0] [0 0 1] [0 1 0] [0 0 1]
|
|
664
|
+
[0 1 0] [0 0 1] [1 0 0] [1 0 0] [0 0 1] [0 1 0]
|
|
665
|
+
[0 0 1], [0 1 0], [0 0 1], [0 1 0], [1 0 0], [1 0 0]
|
|
666
|
+
]
|
|
667
|
+
|
|
668
|
+
A different representation is given by the
|
|
669
|
+
colored permutations::
|
|
670
|
+
|
|
671
|
+
sage: W = ColoredPermutations(3, 1) # needs sage.combinat
|
|
672
|
+
sage: [t.to_matrix() for t in W] # needs sage.combinat sage.groups
|
|
673
|
+
[[1], [zeta3], [-zeta3 - 1]]
|
|
674
|
+
"""
|
|
675
|
+
|
|
676
|
+
def _matrix_(self):
|
|
677
|
+
"""
|
|
678
|
+
Return ``self`` as a matrix.
|
|
679
|
+
|
|
680
|
+
EXAMPLES::
|
|
681
|
+
|
|
682
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
683
|
+
sage: [matrix(t) for t in W] # optional - gap3
|
|
684
|
+
[
|
|
685
|
+
[1 0] [ 1 1] [-1 0] [-1 -1] [ 0 1] [ 0 -1]
|
|
686
|
+
[0 1], [ 0 -1], [ 1 1], [ 1 0], [-1 -1], [-1 0]
|
|
687
|
+
]
|
|
688
|
+
"""
|
|
689
|
+
return self.to_matrix()
|
|
690
|
+
|
|
691
|
+
def character_value(self):
|
|
692
|
+
r"""
|
|
693
|
+
Return the value at ``self`` of the character of the
|
|
694
|
+
reflection representation given by :meth:`to_matrix`.
|
|
695
|
+
|
|
696
|
+
EXAMPLES::
|
|
697
|
+
|
|
698
|
+
sage: W = ColoredPermutations(1,3); W # needs sage.combinat
|
|
699
|
+
1-colored permutations of size 3
|
|
700
|
+
sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
|
|
701
|
+
[3, 1, 1, 0, 0, 1]
|
|
702
|
+
|
|
703
|
+
Note that this could be a different (faithful)
|
|
704
|
+
representation than that given by the corresponding root
|
|
705
|
+
system::
|
|
706
|
+
|
|
707
|
+
sage: W = ReflectionGroup((1,1,3)); W # optional - gap3
|
|
708
|
+
Irreducible real reflection group of rank 2 and type A2
|
|
709
|
+
sage: [t.character_value() for t in W] # optional - gap3
|
|
710
|
+
[2, 0, 0, -1, -1, 0]
|
|
711
|
+
|
|
712
|
+
sage: W = ColoredPermutations(2,2); W # needs sage.combinat
|
|
713
|
+
2-colored permutations of size 2
|
|
714
|
+
sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
|
|
715
|
+
[2, 0, 0, -2, 0, 0, 0, 0]
|
|
716
|
+
|
|
717
|
+
sage: W = ColoredPermutations(3,1); W # needs sage.combinat
|
|
718
|
+
3-colored permutations of size 1
|
|
719
|
+
sage: [t.character_value() for t in W] # needs sage.combinat sage.groups
|
|
720
|
+
[1, zeta3, -zeta3 - 1]
|
|
721
|
+
"""
|
|
722
|
+
return self.to_matrix().trace()
|
|
723
|
+
|
|
724
|
+
# @cached_in_parent_method
|
|
725
|
+
def reflection_length(self, in_unitary_group=False):
|
|
726
|
+
r"""
|
|
727
|
+
Return the reflection length of ``self``.
|
|
728
|
+
|
|
729
|
+
This is the minimal numbers of reflections needed to
|
|
730
|
+
obtain ``self``.
|
|
731
|
+
|
|
732
|
+
INPUT:
|
|
733
|
+
|
|
734
|
+
- ``in_unitary_group`` -- boolean (default: ``False``); if
|
|
735
|
+
``True``, the reflection length is computed in the unitary group
|
|
736
|
+
which is the dimension of the move space of ``self``
|
|
737
|
+
|
|
738
|
+
EXAMPLES::
|
|
739
|
+
|
|
740
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
741
|
+
sage: sorted([t.reflection_length() for t in W]) # optional - gap3
|
|
742
|
+
[0, 1, 1, 1, 2, 2]
|
|
743
|
+
|
|
744
|
+
sage: W = ReflectionGroup((2,1,2)) # optional - gap3
|
|
745
|
+
sage: sorted([t.reflection_length() for t in W]) # optional - gap3
|
|
746
|
+
[0, 1, 1, 1, 1, 2, 2, 2]
|
|
747
|
+
|
|
748
|
+
sage: W = ReflectionGroup((2,2,2)) # optional - gap3
|
|
749
|
+
sage: sorted([t.reflection_length() for t in W]) # optional - gap3
|
|
750
|
+
[0, 1, 1, 2]
|
|
751
|
+
|
|
752
|
+
sage: W = ReflectionGroup((3,1,2)) # optional - gap3
|
|
753
|
+
sage: sorted([t.reflection_length() for t in W]) # optional - gap3
|
|
754
|
+
[0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
|
|
755
|
+
"""
|
|
756
|
+
W = self.parent()
|
|
757
|
+
if in_unitary_group or W.is_real():
|
|
758
|
+
from sage.matrix.special import identity_matrix
|
|
759
|
+
I = identity_matrix(self.parent().rank())
|
|
760
|
+
return W.rank() - (self.canonical_matrix() - I).right_nullity()
|
|
761
|
+
else:
|
|
762
|
+
return len(self.reduced_word_in_reflections())
|
|
763
|
+
|
|
764
|
+
class Irreducible(CategoryWithAxiom):
|
|
765
|
+
|
|
766
|
+
def example(self):
|
|
767
|
+
r"""
|
|
768
|
+
Return an example of an irreducible complex reflection group.
|
|
769
|
+
|
|
770
|
+
EXAMPLES::
|
|
771
|
+
|
|
772
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
773
|
+
sage: C = ComplexReflectionGroups().Finite().Irreducible()
|
|
774
|
+
sage: C.example() # optional - gap3
|
|
775
|
+
Irreducible complex reflection group of rank 3 and type G(4,2,3)
|
|
776
|
+
"""
|
|
777
|
+
from sage.combinat.root_system.reflection_group_real import ReflectionGroup
|
|
778
|
+
return ReflectionGroup((4, 2, 3))
|
|
779
|
+
|
|
780
|
+
class ParentMethods:
|
|
781
|
+
def coxeter_number(self):
|
|
782
|
+
r"""
|
|
783
|
+
Return the Coxeter number of an irreducible
|
|
784
|
+
reflection group.
|
|
785
|
+
|
|
786
|
+
This is defined as `\frac{N + N^*}{n}` where
|
|
787
|
+
`N` is the number of reflections, `N^*` is the
|
|
788
|
+
number of reflection hyperplanes, and `n` is the
|
|
789
|
+
rank of ``self``.
|
|
790
|
+
|
|
791
|
+
EXAMPLES::
|
|
792
|
+
|
|
793
|
+
sage: W = ReflectionGroup(31) # optional - gap3
|
|
794
|
+
sage: W.coxeter_number() # optional - gap3
|
|
795
|
+
30
|
|
796
|
+
"""
|
|
797
|
+
return (self.number_of_reflection_hyperplanes()
|
|
798
|
+
+ self.number_of_reflections()) // self.rank()
|
|
799
|
+
|
|
800
|
+
def absolute_order_ideal(self, gens=None,
|
|
801
|
+
in_unitary_group=True,
|
|
802
|
+
return_lengths=False):
|
|
803
|
+
r"""
|
|
804
|
+
Return all elements in ``self`` below given elements in the
|
|
805
|
+
absolute order of ``self``.
|
|
806
|
+
|
|
807
|
+
This order is defined by
|
|
808
|
+
|
|
809
|
+
.. MATH::
|
|
810
|
+
|
|
811
|
+
\omega \leq_R \tau \Leftrightarrow \ell_R(\omega) +
|
|
812
|
+
\ell_R(\omega^{-1} \tau) = \ell_R(\tau),
|
|
813
|
+
|
|
814
|
+
where `\ell_R` denotes the reflection length.
|
|
815
|
+
|
|
816
|
+
This is, if ``in_unitary_group`` is ``False``, then
|
|
817
|
+
|
|
818
|
+
.. MATH::
|
|
819
|
+
|
|
820
|
+
\ell_R(w) = \min\{ \ell: w = r_1\cdots r_\ell, r_i \in R \},
|
|
821
|
+
|
|
822
|
+
and otherwise
|
|
823
|
+
|
|
824
|
+
.. MATH::
|
|
825
|
+
|
|
826
|
+
\ell_R(w) = \dim\operatorname{im}(w - 1).
|
|
827
|
+
|
|
828
|
+
.. NOTE::
|
|
829
|
+
|
|
830
|
+
If ``gens`` are not given, ``self`` is assumed to be
|
|
831
|
+
well-generated.
|
|
832
|
+
|
|
833
|
+
INPUT:
|
|
834
|
+
|
|
835
|
+
- ``gens`` -- (default: ``None``) if one or more elements
|
|
836
|
+
are given, the order ideal in the absolute order generated
|
|
837
|
+
by ``gens`` is returned.
|
|
838
|
+
Otherwise, the standard Coxeter element is used as unique
|
|
839
|
+
maximal element.
|
|
840
|
+
|
|
841
|
+
- ``in_unitary_group`` -- (default: ``True``) determines the
|
|
842
|
+
length function used to compute the order.
|
|
843
|
+
For real groups, both possible orders coincide, and for
|
|
844
|
+
complex non-real groups, the order in the unitary group
|
|
845
|
+
is much faster to compute.
|
|
846
|
+
|
|
847
|
+
- ``return_lengths`` -- (default: ``False``) whether or not
|
|
848
|
+
to also return the lengths of the elements
|
|
849
|
+
|
|
850
|
+
EXAMPLES::
|
|
851
|
+
|
|
852
|
+
sage: # optional - gap3
|
|
853
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
854
|
+
sage: sorted(w.reduced_word()
|
|
855
|
+
....: for w in W.absolute_order_ideal())
|
|
856
|
+
[[], [1], [1, 2], [1, 2, 1], [2]]
|
|
857
|
+
sage: sorted(w.reduced_word()
|
|
858
|
+
....: for w in W.absolute_order_ideal(W.from_reduced_word([2,1])))
|
|
859
|
+
[[], [1], [1, 2, 1], [2], [2, 1]]
|
|
860
|
+
sage: sorted(w.reduced_word()
|
|
861
|
+
....: for w in W.absolute_order_ideal(W.from_reduced_word([2])))
|
|
862
|
+
[[], [2]]
|
|
863
|
+
|
|
864
|
+
sage: W = CoxeterGroup(['A', 3]) # needs sage.combinat sage.groups
|
|
865
|
+
sage: len(list(W.absolute_order_ideal())) # needs sage.combinat sage.groups
|
|
866
|
+
14
|
|
867
|
+
|
|
868
|
+
sage: W = CoxeterGroup(['A', 2]) # needs sage.combinat sage.groups
|
|
869
|
+
sage: for (w, l) in W.absolute_order_ideal(return_lengths=True): # needs sage.combinat sage.groups
|
|
870
|
+
....: print(w.reduced_word(), l)
|
|
871
|
+
[1, 2] 2
|
|
872
|
+
[1, 2, 1] 1
|
|
873
|
+
[2] 1
|
|
874
|
+
[1] 1
|
|
875
|
+
[] 0
|
|
876
|
+
"""
|
|
877
|
+
from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet
|
|
878
|
+
|
|
879
|
+
if gens is None:
|
|
880
|
+
seeds = [(self.coxeter_element(), self.rank())]
|
|
881
|
+
else:
|
|
882
|
+
if gens in self:
|
|
883
|
+
gens = [gens]
|
|
884
|
+
seeds = [(gen, gen.reflection_length(in_unitary_group=in_unitary_group)) for gen in gens]
|
|
885
|
+
|
|
886
|
+
R = self.reflections()
|
|
887
|
+
|
|
888
|
+
def succ(seed):
|
|
889
|
+
w, w_len = seed
|
|
890
|
+
w_len -= 1
|
|
891
|
+
resu = []
|
|
892
|
+
for t in R:
|
|
893
|
+
u = w * t
|
|
894
|
+
if u.reflection_length(in_unitary_group=in_unitary_group) == w_len:
|
|
895
|
+
resu.append((u, w_len))
|
|
896
|
+
return resu
|
|
897
|
+
step = RecursivelyEnumeratedSet(seeds, succ,
|
|
898
|
+
structure='graded',
|
|
899
|
+
enumeration='breadth')
|
|
900
|
+
if return_lengths:
|
|
901
|
+
return step
|
|
902
|
+
return (x[0] for x in step)
|
|
903
|
+
|
|
904
|
+
# TODO: have a cached and an uncached version
|
|
905
|
+
@cached_method
|
|
906
|
+
def noncrossing_partition_lattice(self, c=None, L=None,
|
|
907
|
+
in_unitary_group=True):
|
|
908
|
+
r"""
|
|
909
|
+
Return the interval `[1,c]` in the absolute order of
|
|
910
|
+
``self`` as a finite lattice.
|
|
911
|
+
|
|
912
|
+
.. SEEALSO:: :meth:`absolute_order_ideal`
|
|
913
|
+
|
|
914
|
+
INPUT:
|
|
915
|
+
|
|
916
|
+
- ``c`` -- (default: ``None``) if an element ``c`` in ``self`` is
|
|
917
|
+
given, it is used as the maximal element in the interval
|
|
918
|
+
|
|
919
|
+
- ``L`` -- (default: ``None``) if a subset ``L`` (must be hashable!)
|
|
920
|
+
of ``self`` is given, it is used as the underlying set (only
|
|
921
|
+
cover relations are checked).
|
|
922
|
+
|
|
923
|
+
- ``in_unitary_group`` -- boolean (default: ``False``); if
|
|
924
|
+
``False``, the relation is given by `\sigma \leq \tau` if
|
|
925
|
+
`l_R(\sigma) + l_R(\sigma^{-1}\tau) = l_R(\tau)`;
|
|
926
|
+
if ``True``, the relation is given by `\sigma \leq \tau` if
|
|
927
|
+
`\dim(\mathrm{Fix}(\sigma)) + \dim(\mathrm{Fix}(\sigma^{-1}\tau))
|
|
928
|
+
= \dim(\mathrm{Fix}(\tau))`
|
|
929
|
+
|
|
930
|
+
.. NOTE::
|
|
931
|
+
|
|
932
|
+
If ``L`` is given, the parameter ``c`` is ignored.
|
|
933
|
+
|
|
934
|
+
EXAMPLES::
|
|
935
|
+
|
|
936
|
+
sage: W = SymmetricGroup(4) # needs sage.groups
|
|
937
|
+
sage: W.noncrossing_partition_lattice() # needs sage.combinat sage.groups
|
|
938
|
+
Finite lattice containing 14 elements
|
|
939
|
+
|
|
940
|
+
sage: W = WeylGroup(['G', 2]) # needs sage.combinat sage.groups
|
|
941
|
+
sage: W.noncrossing_partition_lattice() # needs sage.combinat sage.groups
|
|
942
|
+
Finite lattice containing 8 elements
|
|
943
|
+
|
|
944
|
+
sage: # optional - gap3
|
|
945
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
946
|
+
sage: sorted(w.reduced_word()
|
|
947
|
+
....: for w in W.noncrossing_partition_lattice())
|
|
948
|
+
[[], [1], [1, 2], [1, 2, 1], [2]]
|
|
949
|
+
sage: c21 = W.from_reduced_word([2,1])
|
|
950
|
+
sage: sorted(w.reduced_word()
|
|
951
|
+
....: for w in W.noncrossing_partition_lattice(c21))
|
|
952
|
+
[[], [1], [1, 2, 1], [2], [2, 1]]
|
|
953
|
+
sage: c2 = W.from_reduced_word([2])
|
|
954
|
+
sage: sorted(w.reduced_word()
|
|
955
|
+
....: for w in W.noncrossing_partition_lattice(c2))
|
|
956
|
+
[[], [2]]
|
|
957
|
+
"""
|
|
958
|
+
from sage.combinat.posets.posets import Poset
|
|
959
|
+
from sage.combinat.posets.lattices import LatticePoset
|
|
960
|
+
|
|
961
|
+
R = self.reflections()
|
|
962
|
+
if L is None:
|
|
963
|
+
L = list(self.absolute_order_ideal(gens=c,
|
|
964
|
+
in_unitary_group=in_unitary_group,
|
|
965
|
+
return_lengths=True))
|
|
966
|
+
else:
|
|
967
|
+
L = [(pi, pi.reflection_length()) for pi in L]
|
|
968
|
+
rels = []
|
|
969
|
+
ref_lens = dict(L)
|
|
970
|
+
for (pi, l) in L:
|
|
971
|
+
for t in R:
|
|
972
|
+
tau = pi * t
|
|
973
|
+
if tau in ref_lens and l + 1 == ref_lens[tau]:
|
|
974
|
+
rels.append((pi, tau))
|
|
975
|
+
|
|
976
|
+
P = Poset(([], rels), cover_relations=True, facade=True)
|
|
977
|
+
if P.is_lattice():
|
|
978
|
+
P = LatticePoset(P)
|
|
979
|
+
return P
|
|
980
|
+
|
|
981
|
+
def generalized_noncrossing_partitions(self, m, c=None, positive=False):
|
|
982
|
+
r"""
|
|
983
|
+
Return the set of all chains of length `m` in the
|
|
984
|
+
noncrossing partition lattice of ``self``, see
|
|
985
|
+
:meth:`noncrossing_partition_lattice`.
|
|
986
|
+
|
|
987
|
+
.. NOTE::
|
|
988
|
+
|
|
989
|
+
``self`` is assumed to be well-generated.
|
|
990
|
+
|
|
991
|
+
INPUT:
|
|
992
|
+
|
|
993
|
+
- ``c`` -- (default: ``None``) if an element `c` in ``self``
|
|
994
|
+
is given, it is used as the maximal element in the interval
|
|
995
|
+
|
|
996
|
+
- ``positive`` -- boolean (default: ``False``); if ``True``,
|
|
997
|
+
only those generalized noncrossing partitions of full support
|
|
998
|
+
are returned
|
|
999
|
+
|
|
1000
|
+
EXAMPLES::
|
|
1001
|
+
|
|
1002
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
1003
|
+
|
|
1004
|
+
sage: chains = W.generalized_noncrossing_partitions(2) # optional - gap3
|
|
1005
|
+
sage: sorted([w.reduced_word() for w in chain] # optional - gap3
|
|
1006
|
+
....: for chain in chains)
|
|
1007
|
+
[[[], [], [1, 2]],
|
|
1008
|
+
[[], [1], [2]],
|
|
1009
|
+
[[], [1, 2], []],
|
|
1010
|
+
[[], [1, 2, 1], [1]],
|
|
1011
|
+
[[], [2], [1, 2, 1]],
|
|
1012
|
+
[[1], [], [2]],
|
|
1013
|
+
[[1], [2], []],
|
|
1014
|
+
[[1, 2], [], []],
|
|
1015
|
+
[[1, 2, 1], [], [1]],
|
|
1016
|
+
[[1, 2, 1], [1], []],
|
|
1017
|
+
[[2], [], [1, 2, 1]],
|
|
1018
|
+
[[2], [1, 2, 1], []]]
|
|
1019
|
+
|
|
1020
|
+
sage: chains = W.generalized_noncrossing_partitions(2, # optional - gap3
|
|
1021
|
+
....: positive=True)
|
|
1022
|
+
sage: sorted([w.reduced_word() for w in chain] # optional - gap3
|
|
1023
|
+
....: for chain in chains)
|
|
1024
|
+
[[[], [1, 2], []],
|
|
1025
|
+
[[], [1, 2, 1], [1]],
|
|
1026
|
+
[[1], [2], []],
|
|
1027
|
+
[[1, 2], [], []],
|
|
1028
|
+
[[1, 2, 1], [], [1]],
|
|
1029
|
+
[[1, 2, 1], [1], []],
|
|
1030
|
+
[[2], [1, 2, 1], []]]
|
|
1031
|
+
"""
|
|
1032
|
+
from sage.combinat.combination import Combinations
|
|
1033
|
+
NC = self.noncrossing_partition_lattice(c=c)
|
|
1034
|
+
one = self.one()
|
|
1035
|
+
if c is None:
|
|
1036
|
+
c = self.coxeter_element()
|
|
1037
|
+
chains = NC.chains()
|
|
1038
|
+
NCm = set()
|
|
1039
|
+
iter = chains.breadth_first_search_iterator()
|
|
1040
|
+
next(iter)
|
|
1041
|
+
chain = next(iter)
|
|
1042
|
+
while len(chain) <= m:
|
|
1043
|
+
chain.append(c)
|
|
1044
|
+
for i in range(len(chain) - 1, 0, -1):
|
|
1045
|
+
chain[i] = chain[i - 1]**-1 * chain[i]
|
|
1046
|
+
k = m + 1 - len(chain)
|
|
1047
|
+
for positions in Combinations(range(m + 1), k):
|
|
1048
|
+
ncm = []
|
|
1049
|
+
for l in range(m + 1):
|
|
1050
|
+
if l in positions:
|
|
1051
|
+
ncm.append(one)
|
|
1052
|
+
else:
|
|
1053
|
+
l_prime = l - len([i for i in positions if i <= l])
|
|
1054
|
+
ncm.append(chain[l_prime])
|
|
1055
|
+
if not positive or prod(ncm[:-1]).has_full_support():
|
|
1056
|
+
NCm.add(tuple(ncm))
|
|
1057
|
+
try:
|
|
1058
|
+
chain = next(iter)
|
|
1059
|
+
except StopIteration:
|
|
1060
|
+
chain = list(range(m + 1))
|
|
1061
|
+
return NCm
|
|
1062
|
+
|
|
1063
|
+
# TODO: have a cached and an uncached version
|
|
1064
|
+
def absolute_poset(self, in_unitary_group=False):
|
|
1065
|
+
r"""
|
|
1066
|
+
Return the poset induced by the absolute order of ``self``
|
|
1067
|
+
as a finite lattice.
|
|
1068
|
+
|
|
1069
|
+
INPUT:
|
|
1070
|
+
|
|
1071
|
+
- ``in_unitary_group`` -- boolean (default: ``False``); if
|
|
1072
|
+
``False``, the relation is given by ``\sigma \leq \tau`` if
|
|
1073
|
+
`l_R(\sigma) + l_R(\sigma^{-1}\tau) = l_R(\tau)`
|
|
1074
|
+
If ``True``, the relation is given by `\sigma \leq \tau` if
|
|
1075
|
+
`\dim(\mathrm{Fix}(\sigma)) + \dim(\mathrm{Fix}(\sigma^{-1}\tau))
|
|
1076
|
+
= \dim(\mathrm{Fix}(\tau))`
|
|
1077
|
+
|
|
1078
|
+
.. SEEALSO:: :meth:`noncrossing_partition_lattice`
|
|
1079
|
+
|
|
1080
|
+
EXAMPLES::
|
|
1081
|
+
|
|
1082
|
+
sage: P = ReflectionGroup((1,1,3)).absolute_poset(); P # optional - gap3
|
|
1083
|
+
Finite poset containing 6 elements
|
|
1084
|
+
|
|
1085
|
+
sage: sorted(w.reduced_word() for w in P) # optional - gap3
|
|
1086
|
+
[[], [1], [1, 2], [1, 2, 1], [2], [2, 1]]
|
|
1087
|
+
|
|
1088
|
+
sage: W = ReflectionGroup(4); W # optional - gap3
|
|
1089
|
+
Irreducible complex reflection group of rank 2 and type ST4
|
|
1090
|
+
sage: W.absolute_poset() # optional - gap3
|
|
1091
|
+
Finite poset containing 24 elements
|
|
1092
|
+
|
|
1093
|
+
TESTS::
|
|
1094
|
+
|
|
1095
|
+
sage: # needs sage.combinat sage.groups
|
|
1096
|
+
sage: W1 = CoxeterGroup(['A', 2])
|
|
1097
|
+
sage: W2 = WeylGroup(['A', 2])
|
|
1098
|
+
sage: W3 = SymmetricGroup(3)
|
|
1099
|
+
sage: W1.absolute_poset()
|
|
1100
|
+
Finite poset containing 6 elements
|
|
1101
|
+
sage: W2.absolute_poset()
|
|
1102
|
+
Finite poset containing 6 elements
|
|
1103
|
+
sage: W3.absolute_poset()
|
|
1104
|
+
Finite poset containing 6 elements
|
|
1105
|
+
"""
|
|
1106
|
+
return self.noncrossing_partition_lattice(L=tuple(self), in_unitary_group=in_unitary_group)
|
|
1107
|
+
|
|
1108
|
+
class WellGenerated(CategoryWithAxiom):
|
|
1109
|
+
|
|
1110
|
+
def example(self):
|
|
1111
|
+
r"""
|
|
1112
|
+
Return an example of a well-generated complex reflection group.
|
|
1113
|
+
|
|
1114
|
+
EXAMPLES::
|
|
1115
|
+
|
|
1116
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
1117
|
+
sage: C = ComplexReflectionGroups().Finite().WellGenerated()
|
|
1118
|
+
sage: C.example() # optional - gap3
|
|
1119
|
+
Reducible complex reflection group of rank 4 and type A2 x G(3,1,2)
|
|
1120
|
+
"""
|
|
1121
|
+
from sage.combinat.root_system.reflection_group_real import ReflectionGroup
|
|
1122
|
+
return ReflectionGroup((1, 1, 3), (3, 1, 2))
|
|
1123
|
+
|
|
1124
|
+
class ParentMethods:
|
|
1125
|
+
def _test_well_generated(self, **options):
|
|
1126
|
+
"""
|
|
1127
|
+
Check if ``self`` is well-generated.
|
|
1128
|
+
|
|
1129
|
+
EXAMPLES::
|
|
1130
|
+
|
|
1131
|
+
sage: W = ReflectionGroup((3,1,2)) # optional - gap3
|
|
1132
|
+
sage: W._test_well_generated() # optional - gap3
|
|
1133
|
+
"""
|
|
1134
|
+
tester = self._tester(**options)
|
|
1135
|
+
tester.assertEqual(self.number_of_simple_reflections(), self.rank())
|
|
1136
|
+
|
|
1137
|
+
def is_well_generated(self):
|
|
1138
|
+
r"""
|
|
1139
|
+
Return ``True`` as ``self`` is well-generated.
|
|
1140
|
+
|
|
1141
|
+
EXAMPLES::
|
|
1142
|
+
|
|
1143
|
+
sage: W = ReflectionGroup((3,1,2)) # optional - gap3
|
|
1144
|
+
sage: W.is_well_generated() # optional - gap3
|
|
1145
|
+
True
|
|
1146
|
+
"""
|
|
1147
|
+
return True
|
|
1148
|
+
|
|
1149
|
+
coxeter_element = CoxeterGroups.ParentMethods.coxeter_element
|
|
1150
|
+
standard_coxeter_elements = CoxeterGroups.ParentMethods.standard_coxeter_elements
|
|
1151
|
+
|
|
1152
|
+
@cached_method
|
|
1153
|
+
def coxeter_elements(self):
|
|
1154
|
+
r"""
|
|
1155
|
+
Return the (unique) conjugacy class in ``self`` containing all
|
|
1156
|
+
Coxeter elements.
|
|
1157
|
+
|
|
1158
|
+
A Coxeter element is an element that has an eigenvalue
|
|
1159
|
+
`e^{2\pi i/h}` where `h` is the Coxeter number.
|
|
1160
|
+
|
|
1161
|
+
In case of finite Coxeter groups, these are exactly the
|
|
1162
|
+
elements that are conjugate to one (or, equivalently,
|
|
1163
|
+
all) standard Coxeter element, this is, to an element
|
|
1164
|
+
that is the product of the simple generators in some
|
|
1165
|
+
order.
|
|
1166
|
+
|
|
1167
|
+
.. SEEALSO:: :meth:`~sage.categories.coxeter_groups.standard_coxeter_elements`
|
|
1168
|
+
|
|
1169
|
+
EXAMPLES::
|
|
1170
|
+
|
|
1171
|
+
sage: W = ReflectionGroup((1,1,3)) # optional - gap3
|
|
1172
|
+
sage: sorted(c.reduced_word() # optional - gap3
|
|
1173
|
+
....: for c in W.coxeter_elements())
|
|
1174
|
+
[[1, 2], [2, 1]]
|
|
1175
|
+
|
|
1176
|
+
sage: W = ReflectionGroup((1,1,4)) # optional - gap3
|
|
1177
|
+
sage: sorted(c.reduced_word() # optional - gap3
|
|
1178
|
+
....: for c in W.coxeter_elements())
|
|
1179
|
+
[[1, 2, 1, 3, 2], [1, 2, 3], [1, 3, 2],
|
|
1180
|
+
[2, 1, 3], [2, 1, 3, 2, 1], [3, 2, 1]]
|
|
1181
|
+
"""
|
|
1182
|
+
return self.coxeter_element().conjugacy_class()
|
|
1183
|
+
|
|
1184
|
+
def milnor_fiber_complex(self):
|
|
1185
|
+
r"""
|
|
1186
|
+
Return the Milnor fiber complex of ``self``.
|
|
1187
|
+
|
|
1188
|
+
The *Milnor fiber complex* of a finite well-generated
|
|
1189
|
+
complex reflection group `W` is the simplicial complex whose
|
|
1190
|
+
face poset is given by :meth:`milnor_fiber_poset`. When `W`
|
|
1191
|
+
is an irreducible Shephard group, it is also an equivariant
|
|
1192
|
+
strong deformation retract of the Milnor fiber `f_1^{-1}(1)`,
|
|
1193
|
+
where `f_1: V \to \CC` is the polynomial invariant of smallest
|
|
1194
|
+
degree acting on the reflection representation `V`.
|
|
1195
|
+
|
|
1196
|
+
When `W` is a Coxeter group, this is isomorphic to the
|
|
1197
|
+
:wikipedia:`Coxeter complex <Coxeter_complex>` of `W`.
|
|
1198
|
+
|
|
1199
|
+
EXAMPLES::
|
|
1200
|
+
|
|
1201
|
+
sage: W = ColoredPermutations(3, 2) # needs sage.combinat
|
|
1202
|
+
sage: C = W.milnor_fiber_complex() # needs sage.combinat sage.graphs
|
|
1203
|
+
sage: C.homology() # needs sage.combinat sage.graphs sage.modules
|
|
1204
|
+
{0: 0, 1: Z x Z x Z x Z}
|
|
1205
|
+
|
|
1206
|
+
sage: W = ReflectionGroup(5) # optional - gap3
|
|
1207
|
+
sage: C = W.milnor_fiber_complex() # optional - gap3
|
|
1208
|
+
sage: C.homology() # optional - gap3
|
|
1209
|
+
{0: 0, 1: Z^25}
|
|
1210
|
+
"""
|
|
1211
|
+
I = self.index_set()
|
|
1212
|
+
cosets = {}
|
|
1213
|
+
for i in I:
|
|
1214
|
+
Ip = tuple([j for j in I if j != i])
|
|
1215
|
+
cosets[Ip] = []
|
|
1216
|
+
for g in self:
|
|
1217
|
+
if any(g in C for C in cosets[Ip]):
|
|
1218
|
+
continue
|
|
1219
|
+
H = {g}
|
|
1220
|
+
to_test = [(g, j) for j in Ip]
|
|
1221
|
+
while to_test:
|
|
1222
|
+
h, j = to_test.pop()
|
|
1223
|
+
hp = h.apply_simple_reflection(j, side='right')
|
|
1224
|
+
if hp in H:
|
|
1225
|
+
continue
|
|
1226
|
+
H.add(hp)
|
|
1227
|
+
to_test.extend((hp, j) for j in Ip)
|
|
1228
|
+
cosets[Ip].append(frozenset(H))
|
|
1229
|
+
verts = {}
|
|
1230
|
+
for Ip, cosetsIp in cosets.items():
|
|
1231
|
+
for C in cosetsIp:
|
|
1232
|
+
verts[C, Ip] = len(verts)
|
|
1233
|
+
facets = [[verts[k] for k in verts if g in k[0]] for g in self]
|
|
1234
|
+
from sage.topology.simplicial_complex import SimplicialComplex
|
|
1235
|
+
return SimplicialComplex(facets)
|
|
1236
|
+
|
|
1237
|
+
class Irreducible(CategoryWithAxiom):
|
|
1238
|
+
r"""
|
|
1239
|
+
The category of finite irreducible well-generated
|
|
1240
|
+
finite complex reflection groups.
|
|
1241
|
+
"""
|
|
1242
|
+
def example(self):
|
|
1243
|
+
r"""
|
|
1244
|
+
Return an example of an irreducible well-generated
|
|
1245
|
+
complex reflection group.
|
|
1246
|
+
|
|
1247
|
+
EXAMPLES::
|
|
1248
|
+
|
|
1249
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
1250
|
+
sage: C = ComplexReflectionGroups().Finite().WellGenerated().Irreducible()
|
|
1251
|
+
sage: C.example() # needs sage.combinat
|
|
1252
|
+
4-colored permutations of size 3
|
|
1253
|
+
"""
|
|
1254
|
+
from sage.combinat.colored_permutations import ColoredPermutations
|
|
1255
|
+
return ColoredPermutations(4, 3)
|
|
1256
|
+
|
|
1257
|
+
class ParentMethods:
|
|
1258
|
+
def coxeter_number(self):
|
|
1259
|
+
r"""
|
|
1260
|
+
Return the Coxeter number of a well-generated,
|
|
1261
|
+
irreducible reflection group. This is defined to be
|
|
1262
|
+
the order of a regular element in ``self``, and is
|
|
1263
|
+
equal to the highest degree of ``self``.
|
|
1264
|
+
|
|
1265
|
+
.. SEEALSO:: :meth:`ComplexReflectionGroups.Finite.Irreducible`
|
|
1266
|
+
|
|
1267
|
+
.. NOTE::
|
|
1268
|
+
|
|
1269
|
+
This method overwrites the more general
|
|
1270
|
+
method for complex reflection groups since
|
|
1271
|
+
the expression given here is quicker to
|
|
1272
|
+
compute.
|
|
1273
|
+
|
|
1274
|
+
EXAMPLES::
|
|
1275
|
+
|
|
1276
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
1277
|
+
sage: W.coxeter_number() # needs sage.combinat
|
|
1278
|
+
3
|
|
1279
|
+
|
|
1280
|
+
sage: W = ColoredPermutations(4,3) # needs sage.combinat
|
|
1281
|
+
sage: W.coxeter_number() # needs sage.combinat
|
|
1282
|
+
12
|
|
1283
|
+
|
|
1284
|
+
sage: W = ReflectionGroup((4,4,3)) # optional - gap3
|
|
1285
|
+
sage: W.coxeter_number() # optional - gap3
|
|
1286
|
+
8
|
|
1287
|
+
"""
|
|
1288
|
+
return max(self.degrees())
|
|
1289
|
+
|
|
1290
|
+
def number_of_reflections_of_full_support(self):
|
|
1291
|
+
r"""
|
|
1292
|
+
Return the number of reflections with full
|
|
1293
|
+
support.
|
|
1294
|
+
|
|
1295
|
+
EXAMPLES::
|
|
1296
|
+
|
|
1297
|
+
sage: W = Permutations(4)
|
|
1298
|
+
sage: W.number_of_reflections_of_full_support()
|
|
1299
|
+
1
|
|
1300
|
+
|
|
1301
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
1302
|
+
sage: W.number_of_reflections_of_full_support()
|
|
1303
|
+
1
|
|
1304
|
+
|
|
1305
|
+
sage: W = CoxeterGroup("B3") # needs sage.combinat sage.groups
|
|
1306
|
+
sage: W.number_of_reflections_of_full_support() # needs sage.combinat sage.groups
|
|
1307
|
+
3
|
|
1308
|
+
|
|
1309
|
+
sage: W = ColoredPermutations(3,3) # needs sage.combinat
|
|
1310
|
+
sage: W.number_of_reflections_of_full_support() # needs sage.combinat
|
|
1311
|
+
3
|
|
1312
|
+
"""
|
|
1313
|
+
n = self.rank()
|
|
1314
|
+
h = self.coxeter_number()
|
|
1315
|
+
l = self.cardinality()
|
|
1316
|
+
return (n * h * prod(d for d in self.codegrees() if d != 0)) // l
|
|
1317
|
+
|
|
1318
|
+
@cached_method
|
|
1319
|
+
def rational_catalan_number(self, p, polynomial=False):
|
|
1320
|
+
r"""
|
|
1321
|
+
Return the ``p``-th rational Catalan number
|
|
1322
|
+
associated to ``self``.
|
|
1323
|
+
|
|
1324
|
+
It is defined by
|
|
1325
|
+
|
|
1326
|
+
.. MATH::
|
|
1327
|
+
|
|
1328
|
+
\prod_{i = 1}^n \frac{p + (p(d_i-1)) \mod h)}{d_i},
|
|
1329
|
+
|
|
1330
|
+
where `d_1, \ldots, d_n` are the degrees and
|
|
1331
|
+
`h` is the Coxeter number. See [STW2016]_
|
|
1332
|
+
for this formula.
|
|
1333
|
+
|
|
1334
|
+
INPUT:
|
|
1335
|
+
|
|
1336
|
+
- ``polynomial`` -- boolean (default: ``False``);
|
|
1337
|
+
if ``True``, return instead the `q`-analogue as a
|
|
1338
|
+
polynomial in `q`
|
|
1339
|
+
|
|
1340
|
+
EXAMPLES::
|
|
1341
|
+
|
|
1342
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
1343
|
+
sage: [W.rational_catalan_number(p) for p in [5,7,8]] # needs sage.combinat
|
|
1344
|
+
[7, 12, 15]
|
|
1345
|
+
|
|
1346
|
+
sage: W = ColoredPermutations(2,2) # needs sage.combinat
|
|
1347
|
+
sage: [W.rational_catalan_number(p) for p in [7,9,11]] # needs sage.combinat
|
|
1348
|
+
[10, 15, 21]
|
|
1349
|
+
|
|
1350
|
+
TESTS::
|
|
1351
|
+
|
|
1352
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
1353
|
+
sage: W.rational_catalan_number(3, polynomial=True) # needs sage.combinat
|
|
1354
|
+
q^6 + q^4 + q^3 + q^2 + 1
|
|
1355
|
+
"""
|
|
1356
|
+
from sage.arith.misc import GCD as gcd
|
|
1357
|
+
from sage.combinat.q_analogues import q_int
|
|
1358
|
+
|
|
1359
|
+
h = self.coxeter_number()
|
|
1360
|
+
if not gcd(h, p) == 1:
|
|
1361
|
+
raise ValueError("parameter p = %s is not coprime to the Coxeter number %s" % (p, h))
|
|
1362
|
+
|
|
1363
|
+
if polynomial:
|
|
1364
|
+
f = q_int
|
|
1365
|
+
else:
|
|
1366
|
+
|
|
1367
|
+
def f(n):
|
|
1368
|
+
return n
|
|
1369
|
+
|
|
1370
|
+
num = prod(f(p + (p * (deg - 1)) % h)
|
|
1371
|
+
for deg in self.degrees())
|
|
1372
|
+
den = prod(f(deg) for deg in self.degrees())
|
|
1373
|
+
return num // den
|
|
1374
|
+
|
|
1375
|
+
def fuss_catalan_number(self, m, positive=False,
|
|
1376
|
+
polynomial=False):
|
|
1377
|
+
r"""
|
|
1378
|
+
Return the ``m``-th Fuss-Catalan number
|
|
1379
|
+
associated to ``self``.
|
|
1380
|
+
|
|
1381
|
+
This is defined by
|
|
1382
|
+
|
|
1383
|
+
.. MATH::
|
|
1384
|
+
|
|
1385
|
+
\prod_{i = 1}^n \frac{d_i + mh}{d_i},
|
|
1386
|
+
|
|
1387
|
+
where `d_1, \ldots, d_n` are the degrees and
|
|
1388
|
+
`h` is the Coxeter number.
|
|
1389
|
+
|
|
1390
|
+
INPUT:
|
|
1391
|
+
|
|
1392
|
+
- ``positive`` -- boolean (default: ``False``); if
|
|
1393
|
+
``True``, return instead the positive Fuss-Catalan number
|
|
1394
|
+
- ``polynomial`` -- boolean (default: ``False``); if
|
|
1395
|
+
``True``, return instead the `q`-analogue as a polynomial
|
|
1396
|
+
in `q`
|
|
1397
|
+
|
|
1398
|
+
See [Ar2006]_ for further information.
|
|
1399
|
+
|
|
1400
|
+
.. NOTE::
|
|
1401
|
+
|
|
1402
|
+
- For the symmetric group `S_n`, it reduces to the
|
|
1403
|
+
Fuss-Catalan number `\frac{1}{mn+1}\binom{(m+1)n}{n}`.
|
|
1404
|
+
- The Fuss-Catalan numbers for `G(r, 1, n)` all
|
|
1405
|
+
coincide for `r > 1`.
|
|
1406
|
+
|
|
1407
|
+
EXAMPLES::
|
|
1408
|
+
|
|
1409
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
1410
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1411
|
+
[5, 12, 22]
|
|
1412
|
+
|
|
1413
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
1414
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1415
|
+
[14, 55, 140]
|
|
1416
|
+
|
|
1417
|
+
sage: W = ColoredPermutations(1,5) # needs sage.combinat
|
|
1418
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1419
|
+
[42, 273, 969]
|
|
1420
|
+
|
|
1421
|
+
sage: W = ColoredPermutations(2,2) # needs sage.combinat
|
|
1422
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1423
|
+
[6, 15, 28]
|
|
1424
|
+
|
|
1425
|
+
sage: W = ColoredPermutations(2,3) # needs sage.combinat
|
|
1426
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1427
|
+
[20, 84, 220]
|
|
1428
|
+
|
|
1429
|
+
sage: W = ColoredPermutations(2,4) # needs sage.combinat
|
|
1430
|
+
sage: [W.fuss_catalan_number(i) for i in [1,2,3]] # needs sage.combinat
|
|
1431
|
+
[70, 495, 1820]
|
|
1432
|
+
|
|
1433
|
+
TESTS::
|
|
1434
|
+
|
|
1435
|
+
sage: # needs sage.combinat sage.groups
|
|
1436
|
+
sage: W = ColoredPermutations(2,4)
|
|
1437
|
+
sage: W.fuss_catalan_number(2, positive=True)
|
|
1438
|
+
330
|
|
1439
|
+
sage: W = ColoredPermutations(2,2)
|
|
1440
|
+
sage: W.fuss_catalan_number(2, polynomial=True)
|
|
1441
|
+
q^16 + q^14 + 2*q^12 + 2*q^10 + 3*q^8 + 2*q^6 +
|
|
1442
|
+
2*q^4 + q^2 + 1
|
|
1443
|
+
"""
|
|
1444
|
+
h = self.coxeter_number()
|
|
1445
|
+
if positive:
|
|
1446
|
+
p = m * h - 1
|
|
1447
|
+
else:
|
|
1448
|
+
p = m * h + 1
|
|
1449
|
+
|
|
1450
|
+
return self.rational_catalan_number(p, polynomial=polynomial)
|
|
1451
|
+
|
|
1452
|
+
def catalan_number(self, positive=False, polynomial=False):
|
|
1453
|
+
r"""
|
|
1454
|
+
Return the Catalan number associated to ``self``.
|
|
1455
|
+
|
|
1456
|
+
It is defined by
|
|
1457
|
+
|
|
1458
|
+
.. MATH::
|
|
1459
|
+
|
|
1460
|
+
\prod_{i = 1}^n \frac{d_i + h}{d_i},
|
|
1461
|
+
|
|
1462
|
+
where `d_1, \ldots, d_n` are the degrees and where
|
|
1463
|
+
`h` is the Coxeter number.
|
|
1464
|
+
See [Ar2006]_ for further information.
|
|
1465
|
+
|
|
1466
|
+
INPUT:
|
|
1467
|
+
|
|
1468
|
+
- ``positive`` -- boolean (default: ``False``); if
|
|
1469
|
+
``True``, return instead the positive Catalan number
|
|
1470
|
+
- ``polynomial`` -- boolean (default: ``False``); if
|
|
1471
|
+
``True``, return instead the `q`-analogue as a polynomial
|
|
1472
|
+
in `q`
|
|
1473
|
+
|
|
1474
|
+
.. NOTE::
|
|
1475
|
+
|
|
1476
|
+
- For the symmetric group `S_n`, it reduces to the
|
|
1477
|
+
Catalan number `\frac{1}{n+1} \binom{2n}{n}`.
|
|
1478
|
+
- The Catalan numbers for `G(r,1,n)` all coincide
|
|
1479
|
+
for `r > 1`.
|
|
1480
|
+
|
|
1481
|
+
EXAMPLES::
|
|
1482
|
+
|
|
1483
|
+
sage: [ColoredPermutations(1,n).catalan_number() # needs sage.combinat
|
|
1484
|
+
....: for n in [3,4,5]]
|
|
1485
|
+
[5, 14, 42]
|
|
1486
|
+
|
|
1487
|
+
sage: [ColoredPermutations(2,n).catalan_number() # needs sage.combinat
|
|
1488
|
+
....: for n in [3,4,5]]
|
|
1489
|
+
[20, 70, 252]
|
|
1490
|
+
|
|
1491
|
+
sage: [ReflectionGroup((2,2,n)).catalan_number() # optional - gap3
|
|
1492
|
+
....: for n in [3,4,5]]
|
|
1493
|
+
[14, 50, 182]
|
|
1494
|
+
|
|
1495
|
+
TESTS::
|
|
1496
|
+
|
|
1497
|
+
sage: # needs sage.combinat sage.groups
|
|
1498
|
+
sage: W = ColoredPermutations(3,6)
|
|
1499
|
+
sage: W.catalan_number(positive=True)
|
|
1500
|
+
462
|
|
1501
|
+
sage: W = ColoredPermutations(2,2)
|
|
1502
|
+
sage: W.catalan_number(polynomial=True)
|
|
1503
|
+
q^8 + q^6 + 2*q^4 + q^2 + 1
|
|
1504
|
+
"""
|
|
1505
|
+
return self.fuss_catalan_number(1, positive=positive,
|
|
1506
|
+
polynomial=polynomial)
|