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,1249 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.groups
|
|
3
|
+
r"""
|
|
4
|
+
Common category for Generalized Coxeter Groups or Complex Reflection Groups
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2016 Nicolas M. Thiéry <nthiery at users.sf.net>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
|
|
16
|
+
import itertools
|
|
17
|
+
from sage.misc.abstract_method import abstract_method
|
|
18
|
+
from sage.misc.cachefunc import cached_method
|
|
19
|
+
from sage.categories.category_singleton import Category_singleton
|
|
20
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
21
|
+
from sage.categories.groups import Groups
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ComplexReflectionOrGeneralizedCoxeterGroups(Category_singleton):
|
|
25
|
+
r"""
|
|
26
|
+
The category of complex reflection groups or generalized Coxeter groups.
|
|
27
|
+
|
|
28
|
+
Finite Coxeter groups can be defined equivalently as groups
|
|
29
|
+
generated by reflections, or by presentations. Over the last
|
|
30
|
+
decades, the theory has been generalized in both directions,
|
|
31
|
+
leading to the study of (finite) complex reflection groups on the
|
|
32
|
+
one hand, and (finite) generalized Coxeter groups on the other
|
|
33
|
+
hand. Many of the features remain similar, yet, in the current
|
|
34
|
+
state of the art, there is no general theory covering both
|
|
35
|
+
directions.
|
|
36
|
+
|
|
37
|
+
This is reflected by the name of this category which is about
|
|
38
|
+
factoring out the common code, tests, and declarations.
|
|
39
|
+
|
|
40
|
+
A group in this category has:
|
|
41
|
+
|
|
42
|
+
- A distinguished finite set of generators `(s_i)_I`, called
|
|
43
|
+
*simple reflections*. The set `I` is called the *index set*. The
|
|
44
|
+
name "reflection" is somewhat of an abuse as they can have
|
|
45
|
+
higher order; still, they are all of finite order: `s_i^k=1` for
|
|
46
|
+
some `k`.
|
|
47
|
+
|
|
48
|
+
- A collection of *distinguished reflections* which are the
|
|
49
|
+
conjugates of the simple reflections. For complex reflection
|
|
50
|
+
groups, they are in one-to-one correspondence with the
|
|
51
|
+
reflection hyperplanes and share the same index set.
|
|
52
|
+
|
|
53
|
+
- A collection of *reflections* which are the conjugates of all
|
|
54
|
+
the non trivial powers of the simple reflections.
|
|
55
|
+
|
|
56
|
+
The usual notions of reduced words, length, irreducibility, etc.,
|
|
57
|
+
can be canonically defined from the above.
|
|
58
|
+
|
|
59
|
+
The following methods must be implemented:
|
|
60
|
+
|
|
61
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ParentMethods.index_set`
|
|
62
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ParentMethods.simple_reflection`
|
|
63
|
+
|
|
64
|
+
Optionally one can define analog methods for distinguished
|
|
65
|
+
reflections and reflections (see below).
|
|
66
|
+
|
|
67
|
+
At least one of the following methods must be implemented:
|
|
68
|
+
|
|
69
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection`
|
|
70
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection_left`
|
|
71
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflection_right`
|
|
72
|
+
- :meth:`ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods._mul_`
|
|
73
|
+
|
|
74
|
+
It's recommended to implement either ``_mul_`` or both
|
|
75
|
+
``apply_simple_reflection_left`` and ``apply_simple_reflection_right``.
|
|
76
|
+
|
|
77
|
+
.. SEEALSO::
|
|
78
|
+
|
|
79
|
+
- :class:`complex_reflection_groups.ComplexReflectionGroups`
|
|
80
|
+
- :class:`generalized_coxeter_groups.GeneralizedCoxeterGroups`
|
|
81
|
+
|
|
82
|
+
EXAMPLES::
|
|
83
|
+
|
|
84
|
+
sage: from sage.categories.complex_reflection_or_generalized_coxeter_groups import ComplexReflectionOrGeneralizedCoxeterGroups
|
|
85
|
+
sage: C = ComplexReflectionOrGeneralizedCoxeterGroups(); C
|
|
86
|
+
Category of complex reflection or generalized Coxeter groups
|
|
87
|
+
sage: C.super_categories()
|
|
88
|
+
[Category of finitely generated enumerated groups]
|
|
89
|
+
|
|
90
|
+
sage: C.required_methods()
|
|
91
|
+
{'element': {'optional': ['reflection_length'],
|
|
92
|
+
'required': []},
|
|
93
|
+
'parent': {'optional': ['distinguished_reflection', 'hyperplane_index_set',
|
|
94
|
+
'irreducible_components',
|
|
95
|
+
'reflection', 'reflection_index_set'],
|
|
96
|
+
'required': ['__contains__', 'index_set']}}
|
|
97
|
+
|
|
98
|
+
TESTS::
|
|
99
|
+
|
|
100
|
+
sage: TestSuite(C).run()
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
@cached_method
|
|
104
|
+
def super_categories(self):
|
|
105
|
+
r"""
|
|
106
|
+
Return the super categories of ``self``.
|
|
107
|
+
|
|
108
|
+
EXAMPLES::
|
|
109
|
+
|
|
110
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
111
|
+
sage: ComplexReflectionGroups().super_categories()
|
|
112
|
+
[Category of complex reflection or generalized Coxeter groups]
|
|
113
|
+
"""
|
|
114
|
+
return [Groups().FinitelyGenerated()]
|
|
115
|
+
|
|
116
|
+
class SubcategoryMethods:
|
|
117
|
+
def Irreducible(self):
|
|
118
|
+
r"""
|
|
119
|
+
Return the full subcategory of irreducible objects of ``self``.
|
|
120
|
+
|
|
121
|
+
A complex reflection group, or generalized Coxeter group
|
|
122
|
+
is *reducible* if its simple reflections can be split in
|
|
123
|
+
two sets `X` and `Y` such that the elements of `X` commute
|
|
124
|
+
with that of `Y`. In particular, the group is then direct
|
|
125
|
+
product of `\langle X \rangle` and `\langle Y \rangle`.
|
|
126
|
+
It's *irreducible* otherwise.
|
|
127
|
+
|
|
128
|
+
EXAMPLES::
|
|
129
|
+
|
|
130
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
131
|
+
sage: ComplexReflectionGroups().Irreducible()
|
|
132
|
+
Category of irreducible complex reflection groups
|
|
133
|
+
sage: CoxeterGroups().Irreducible()
|
|
134
|
+
Category of irreducible Coxeter groups
|
|
135
|
+
|
|
136
|
+
TESTS::
|
|
137
|
+
|
|
138
|
+
sage: TestSuite(ComplexReflectionGroups().Irreducible()).run()
|
|
139
|
+
sage: CoxeterGroups().Irreducible.__module__
|
|
140
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
141
|
+
"""
|
|
142
|
+
return self._with_axiom('Irreducible')
|
|
143
|
+
|
|
144
|
+
class ParentMethods:
|
|
145
|
+
@abstract_method
|
|
146
|
+
def index_set(self):
|
|
147
|
+
r"""
|
|
148
|
+
Return the index set of (the simple reflections of)
|
|
149
|
+
``self``, as a list (or iterable).
|
|
150
|
+
|
|
151
|
+
.. SEEALSO::
|
|
152
|
+
|
|
153
|
+
- :meth:`simple_reflection`
|
|
154
|
+
- :meth:`simple_reflections`
|
|
155
|
+
|
|
156
|
+
EXAMPLES::
|
|
157
|
+
|
|
158
|
+
sage: W = CoxeterGroups().Finite().example(); W
|
|
159
|
+
The 5-th dihedral group of order 10
|
|
160
|
+
sage: W.index_set()
|
|
161
|
+
(1, 2)
|
|
162
|
+
|
|
163
|
+
sage: W = ColoredPermutations(1, 4) # needs sage.combinat
|
|
164
|
+
sage: W.index_set() # needs sage.combinat
|
|
165
|
+
(1, 2, 3)
|
|
166
|
+
|
|
167
|
+
sage: # optional - gap3
|
|
168
|
+
sage: W = ReflectionGroup((1,1,4), index_set=[1,3,'asdf'])
|
|
169
|
+
sage: W.index_set()
|
|
170
|
+
(1, 3, 'asdf')
|
|
171
|
+
sage: W = ReflectionGroup((1,1,4), index_set=('a','b','c'))
|
|
172
|
+
sage: W.index_set()
|
|
173
|
+
('a', 'b', 'c')
|
|
174
|
+
"""
|
|
175
|
+
# return self.simple_reflections().keys()
|
|
176
|
+
|
|
177
|
+
def simple_reflection(self, i):
|
|
178
|
+
"""
|
|
179
|
+
Return the `i`-th simple reflection `s_i` of ``self``.
|
|
180
|
+
|
|
181
|
+
INPUT:
|
|
182
|
+
|
|
183
|
+
- ``i`` -- an element from the index set
|
|
184
|
+
|
|
185
|
+
.. SEEALSO::
|
|
186
|
+
|
|
187
|
+
- :meth:`index_set`
|
|
188
|
+
- :meth:`simple_reflections`
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: W = CoxeterGroups().example(); W
|
|
193
|
+
The symmetric group on {0, ..., 3}
|
|
194
|
+
sage: W.simple_reflection(1)
|
|
195
|
+
(0, 2, 1, 3)
|
|
196
|
+
sage: s = W.simple_reflections()
|
|
197
|
+
sage: s[1]
|
|
198
|
+
(0, 2, 1, 3)
|
|
199
|
+
|
|
200
|
+
sage: W = ReflectionGroup((1,1,4), index_set=[1,3,'asdf']) # optional - gap3
|
|
201
|
+
sage: for i in W.index_set(): # optional - gap3
|
|
202
|
+
....: print('%s %s'%(i, W.simple_reflection(i)))
|
|
203
|
+
1 (1,7)(2,4)(5,6)(8,10)(11,12)
|
|
204
|
+
3 (1,4)(2,8)(3,5)(7,10)(9,11)
|
|
205
|
+
asdf (2,5)(3,9)(4,6)(8,11)(10,12)
|
|
206
|
+
"""
|
|
207
|
+
if i not in self.index_set():
|
|
208
|
+
raise ValueError("%s is not in the Dynkin node set %s" % (i, self.index_set()))
|
|
209
|
+
return self.one().apply_simple_reflection(i) # don't care about left/right
|
|
210
|
+
|
|
211
|
+
@cached_method
|
|
212
|
+
def simple_reflections(self):
|
|
213
|
+
r"""
|
|
214
|
+
Return the simple reflections `(s_i)_{i\in I}` of ``self`` as
|
|
215
|
+
a family indexed by :meth:`index_set`.
|
|
216
|
+
|
|
217
|
+
.. SEEALSO::
|
|
218
|
+
|
|
219
|
+
- :meth:`simple_reflection`
|
|
220
|
+
- :meth:`index_set`
|
|
221
|
+
|
|
222
|
+
EXAMPLES:
|
|
223
|
+
|
|
224
|
+
For the symmetric group, we recognize the simple transpositions::
|
|
225
|
+
|
|
226
|
+
sage: W = SymmetricGroup(4); W
|
|
227
|
+
Symmetric group of order 4! as a permutation group
|
|
228
|
+
sage: s = W.simple_reflections(); s
|
|
229
|
+
Finite family {1: (1,2), 2: (2,3), 3: (3,4)}
|
|
230
|
+
sage: s[1]
|
|
231
|
+
(1,2)
|
|
232
|
+
sage: s[2]
|
|
233
|
+
(2,3)
|
|
234
|
+
sage: s[3]
|
|
235
|
+
(3,4)
|
|
236
|
+
|
|
237
|
+
Here are the simple reflections for a colored symmetric
|
|
238
|
+
group and a reflection group::
|
|
239
|
+
|
|
240
|
+
sage: W = ColoredPermutations(1,3) # needs sage.combinat
|
|
241
|
+
sage: W.simple_reflections() # needs sage.combinat
|
|
242
|
+
Finite family {1: [[0, 0, 0], [2, 1, 3]], 2: [[0, 0, 0], [1, 3, 2]]}
|
|
243
|
+
|
|
244
|
+
sage: W = ReflectionGroup((1,1,3), index_set=['a','b']) # optional - gap3
|
|
245
|
+
sage: W.simple_reflections() # optional - gap3
|
|
246
|
+
Finite family {'a': (1,4)(2,3)(5,6), 'b': (1,3)(2,5)(4,6)}
|
|
247
|
+
|
|
248
|
+
This default implementation uses :meth:`.index_set` and
|
|
249
|
+
:meth:`.simple_reflection`.
|
|
250
|
+
"""
|
|
251
|
+
from sage.sets.family import Family
|
|
252
|
+
return Family(self.index_set(), self.simple_reflection)
|
|
253
|
+
|
|
254
|
+
def number_of_simple_reflections(self):
|
|
255
|
+
r"""
|
|
256
|
+
Return the number of simple reflections of ``self``.
|
|
257
|
+
|
|
258
|
+
EXAMPLES::
|
|
259
|
+
|
|
260
|
+
sage: # needs sage.combinat
|
|
261
|
+
sage: W = ColoredPermutations(1,3)
|
|
262
|
+
sage: W.number_of_simple_reflections()
|
|
263
|
+
2
|
|
264
|
+
sage: W = ColoredPermutations(2,3)
|
|
265
|
+
sage: W.number_of_simple_reflections()
|
|
266
|
+
3
|
|
267
|
+
sage: W = ColoredPermutations(4,3)
|
|
268
|
+
sage: W.number_of_simple_reflections()
|
|
269
|
+
3
|
|
270
|
+
|
|
271
|
+
sage: W = ReflectionGroup((4,2,3)) # optional - gap3
|
|
272
|
+
sage: W.number_of_simple_reflections() # optional - gap3
|
|
273
|
+
4
|
|
274
|
+
"""
|
|
275
|
+
return len(self.index_set())
|
|
276
|
+
|
|
277
|
+
##########################################################################
|
|
278
|
+
# Group generators, etc from simple reflections
|
|
279
|
+
##########################################################################
|
|
280
|
+
|
|
281
|
+
def group_generators(self):
|
|
282
|
+
r"""
|
|
283
|
+
Return the simple reflections of ``self``, as
|
|
284
|
+
distinguished group generators.
|
|
285
|
+
|
|
286
|
+
.. SEEALSO::
|
|
287
|
+
|
|
288
|
+
- :meth:`simple_reflections`
|
|
289
|
+
- :meth:`Groups.ParentMethods.group_generators`
|
|
290
|
+
- :meth:`Semigroups.ParentMethods.semigroup_generators`
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: D10 = FiniteCoxeterGroups().example(10)
|
|
295
|
+
sage: D10.group_generators()
|
|
296
|
+
Finite family {1: (1,), 2: (2,)}
|
|
297
|
+
sage: SymmetricGroup(5).group_generators()
|
|
298
|
+
Finite family {1: (1,2), 2: (2,3), 3: (3,4), 4: (4,5)}
|
|
299
|
+
|
|
300
|
+
sage: W = ColoredPermutations(3,2) # needs sage.combinat
|
|
301
|
+
sage: W.group_generators() # needs sage.combinat
|
|
302
|
+
Finite family {1: [[0, 0],
|
|
303
|
+
[2, 1]],
|
|
304
|
+
2: [[0, 1],
|
|
305
|
+
[1, 2]]}
|
|
306
|
+
|
|
307
|
+
The simple reflections are also semigroup generators, even
|
|
308
|
+
for an infinite group::
|
|
309
|
+
|
|
310
|
+
sage: W = WeylGroup(["A",2,1]) # needs sage.rings.number_field
|
|
311
|
+
sage: W.semigroup_generators() # needs sage.rings.number_field
|
|
312
|
+
Finite family {0: [-1 1 1]
|
|
313
|
+
[ 0 1 0]
|
|
314
|
+
[ 0 0 1],
|
|
315
|
+
1: [ 1 0 0]
|
|
316
|
+
[ 1 -1 1]
|
|
317
|
+
[ 0 0 1],
|
|
318
|
+
2: [ 1 0 0]
|
|
319
|
+
[ 0 1 0]
|
|
320
|
+
[ 1 1 -1]}
|
|
321
|
+
"""
|
|
322
|
+
return self.simple_reflections()
|
|
323
|
+
|
|
324
|
+
semigroup_generators = group_generators
|
|
325
|
+
|
|
326
|
+
def simple_reflection_orders(self):
|
|
327
|
+
"""
|
|
328
|
+
Return the orders of the simple reflections.
|
|
329
|
+
|
|
330
|
+
EXAMPLES::
|
|
331
|
+
|
|
332
|
+
sage: # needs sage.rings.number_field
|
|
333
|
+
sage: W = WeylGroup(['B',3])
|
|
334
|
+
sage: W.simple_reflection_orders()
|
|
335
|
+
[2, 2, 2]
|
|
336
|
+
sage: W = CoxeterGroup(['C',4])
|
|
337
|
+
sage: W.simple_reflection_orders()
|
|
338
|
+
[2, 2, 2, 2]
|
|
339
|
+
|
|
340
|
+
sage: SymmetricGroup(5).simple_reflection_orders()
|
|
341
|
+
[2, 2, 2, 2]
|
|
342
|
+
|
|
343
|
+
sage: C = ColoredPermutations(4, 3) # needs sage.combinat
|
|
344
|
+
sage: C.simple_reflection_orders() # needs sage.combinat
|
|
345
|
+
[2, 2, 4]
|
|
346
|
+
"""
|
|
347
|
+
one = self.one()
|
|
348
|
+
s = self.simple_reflections()
|
|
349
|
+
from sage.rings.integer_ring import ZZ
|
|
350
|
+
|
|
351
|
+
def mult_order(x):
|
|
352
|
+
ct = ZZ.one()
|
|
353
|
+
cur = x
|
|
354
|
+
while cur != one:
|
|
355
|
+
cur *= x
|
|
356
|
+
ct += ZZ.one()
|
|
357
|
+
return ZZ(ct)
|
|
358
|
+
return [mult_order(s[i]) for i in self.index_set()]
|
|
359
|
+
|
|
360
|
+
def _an_element_(self):
|
|
361
|
+
"""
|
|
362
|
+
Implement: :meth:`Sets.ParentMethods.an_element` by
|
|
363
|
+
returning the product of the simple reflections (a Coxeter
|
|
364
|
+
element).
|
|
365
|
+
|
|
366
|
+
EXAMPLES::
|
|
367
|
+
|
|
368
|
+
sage: W = SymmetricGroup(4); W
|
|
369
|
+
Symmetric group of order 4! as a permutation group
|
|
370
|
+
sage: W.an_element() # indirect doctest
|
|
371
|
+
(2,3,4)
|
|
372
|
+
|
|
373
|
+
For a complex reflection group::
|
|
374
|
+
|
|
375
|
+
sage: # needs sage.combinat
|
|
376
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
377
|
+
sage: W = ComplexReflectionGroups().example(); W
|
|
378
|
+
5-colored permutations of size 3
|
|
379
|
+
sage: W.an_element()
|
|
380
|
+
[[1, 0, 0], [3, 1, 2]]
|
|
381
|
+
"""
|
|
382
|
+
return self.prod(self.simple_reflections())
|
|
383
|
+
|
|
384
|
+
def some_elements(self):
|
|
385
|
+
r"""
|
|
386
|
+
Implement :meth:`Sets.ParentMethods.some_elements` by
|
|
387
|
+
returning some typical elements of ``self``.
|
|
388
|
+
|
|
389
|
+
The result is currently composed of the simple reflections
|
|
390
|
+
together with the unit and the result of :meth:`an_element`.
|
|
391
|
+
|
|
392
|
+
EXAMPLES::
|
|
393
|
+
|
|
394
|
+
sage: W = WeylGroup(['A',3]) # needs sage.rings.number_field
|
|
395
|
+
sage: W.some_elements() # needs sage.rings.number_field
|
|
396
|
+
[
|
|
397
|
+
[0 1 0 0] [1 0 0 0] [1 0 0 0] [1 0 0 0] [0 0 0 1]
|
|
398
|
+
[1 0 0 0] [0 0 1 0] [0 1 0 0] [0 1 0 0] [1 0 0 0]
|
|
399
|
+
[0 0 1 0] [0 1 0 0] [0 0 0 1] [0 0 1 0] [0 1 0 0]
|
|
400
|
+
[0 0 0 1], [0 0 0 1], [0 0 1 0], [0 0 0 1], [0 0 1 0]
|
|
401
|
+
]
|
|
402
|
+
|
|
403
|
+
sage: W = ColoredPermutations(1,4) # needs sage.combinat
|
|
404
|
+
sage: W.some_elements() # needs sage.combinat
|
|
405
|
+
[[[0, 0, 0, 0], [2, 1, 3, 4]],
|
|
406
|
+
[[0, 0, 0, 0], [1, 3, 2, 4]],
|
|
407
|
+
[[0, 0, 0, 0], [1, 2, 4, 3]],
|
|
408
|
+
[[0, 0, 0, 0], [1, 2, 3, 4]],
|
|
409
|
+
[[0, 0, 0, 0], [4, 1, 2, 3]]]
|
|
410
|
+
"""
|
|
411
|
+
return list(self.simple_reflections()) + [self.one(), self.an_element()]
|
|
412
|
+
|
|
413
|
+
######################################################################
|
|
414
|
+
# Reflections
|
|
415
|
+
######################################################################
|
|
416
|
+
|
|
417
|
+
@abstract_method(optional=True)
|
|
418
|
+
def reflection_index_set(self):
|
|
419
|
+
r"""
|
|
420
|
+
Return the index set of the reflections of ``self``.
|
|
421
|
+
|
|
422
|
+
.. SEEALSO::
|
|
423
|
+
|
|
424
|
+
- :meth:`reflection`
|
|
425
|
+
- :meth:`reflections`
|
|
426
|
+
|
|
427
|
+
EXAMPLES::
|
|
428
|
+
|
|
429
|
+
sage: # optional - gap3
|
|
430
|
+
sage: W = ReflectionGroup((1,1,4))
|
|
431
|
+
sage: W.reflection_index_set()
|
|
432
|
+
(1, 2, 3, 4, 5, 6)
|
|
433
|
+
sage: W = ReflectionGroup((1,1,4), reflection_index_set=[1,3,'asdf',7,9,11])
|
|
434
|
+
sage: W.reflection_index_set()
|
|
435
|
+
(1, 3, 'asdf', 7, 9, 11)
|
|
436
|
+
sage: W = ReflectionGroup((1,1,4), reflection_index_set=('a','b','c','d','e','f'))
|
|
437
|
+
sage: W.reflection_index_set()
|
|
438
|
+
('a', 'b', 'c', 'd', 'e', 'f')
|
|
439
|
+
"""
|
|
440
|
+
|
|
441
|
+
@abstract_method(optional=True)
|
|
442
|
+
def reflection(self, i):
|
|
443
|
+
r"""
|
|
444
|
+
Return the `i`-th reflection of ``self``.
|
|
445
|
+
|
|
446
|
+
For `i` in `1,\dots,N`, this gives the `i`-th reflection of
|
|
447
|
+
``self``.
|
|
448
|
+
|
|
449
|
+
.. SEEALSO::
|
|
450
|
+
|
|
451
|
+
- :meth:`reflections_index_set`
|
|
452
|
+
- :meth:`reflections`
|
|
453
|
+
|
|
454
|
+
EXAMPLES::
|
|
455
|
+
|
|
456
|
+
sage: W = ReflectionGroup((1,1,4)) # optional - gap3
|
|
457
|
+
sage: for i in W.reflection_index_set(): # optional - gap3
|
|
458
|
+
....: print('%s %s'%(i, W.reflection(i)))
|
|
459
|
+
1 (1,7)(2,4)(5,6)(8,10)(11,12)
|
|
460
|
+
2 (1,4)(2,8)(3,5)(7,10)(9,11)
|
|
461
|
+
3 (2,5)(3,9)(4,6)(8,11)(10,12)
|
|
462
|
+
4 (1,8)(2,7)(3,6)(4,10)(9,12)
|
|
463
|
+
5 (1,6)(2,9)(3,8)(5,11)(7,12)
|
|
464
|
+
6 (1,11)(3,10)(4,9)(5,7)(6,12)
|
|
465
|
+
"""
|
|
466
|
+
|
|
467
|
+
@cached_method
|
|
468
|
+
def reflections(self):
|
|
469
|
+
r"""
|
|
470
|
+
Return a finite family containing the reflections of
|
|
471
|
+
``self``, indexed by :meth:`reflection_index_set`.
|
|
472
|
+
|
|
473
|
+
.. SEEALSO::
|
|
474
|
+
|
|
475
|
+
- :meth:`reflection`
|
|
476
|
+
- :meth:`reflection_index_set`
|
|
477
|
+
|
|
478
|
+
EXAMPLES::
|
|
479
|
+
|
|
480
|
+
sage: # optional - gap3
|
|
481
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
482
|
+
sage: reflections = W.reflections()
|
|
483
|
+
sage: for index in sorted(reflections.keys()):
|
|
484
|
+
....: print('%s %s'%(index, reflections[index]))
|
|
485
|
+
1 (1,4)(2,3)(5,6)
|
|
486
|
+
2 (1,3)(2,5)(4,6)
|
|
487
|
+
3 (1,5)(2,4)(3,6)
|
|
488
|
+
sage: W = ReflectionGroup((1,1,3),
|
|
489
|
+
....: reflection_index_set=['a','b','c'])
|
|
490
|
+
sage: reflections = W.reflections()
|
|
491
|
+
sage: for index in sorted(reflections.keys()):
|
|
492
|
+
....: print('%s %s'%(index, reflections[index]))
|
|
493
|
+
a (1,4)(2,3)(5,6)
|
|
494
|
+
b (1,3)(2,5)(4,6)
|
|
495
|
+
c (1,5)(2,4)(3,6)
|
|
496
|
+
sage: W = ReflectionGroup((3,1,1))
|
|
497
|
+
sage: reflections = W.reflections()
|
|
498
|
+
sage: for index in sorted(reflections.keys()):
|
|
499
|
+
....: print('%s %s'%(index, reflections[index]))
|
|
500
|
+
1 (1,2,3)
|
|
501
|
+
2 (1,3,2)
|
|
502
|
+
sage: W = ReflectionGroup((1,1,3), (3,1,2))
|
|
503
|
+
sage: reflections = W.reflections()
|
|
504
|
+
sage: for index in sorted(reflections.keys()):
|
|
505
|
+
....: print('%s %s'%(index, reflections[index]))
|
|
506
|
+
1 (1,6)(2,5)(7,8)
|
|
507
|
+
2 (1,5)(2,7)(6,8)
|
|
508
|
+
3 (3,9,15)(4,10,16)(12,17,23)(14,18,24)(20,25,29)(21,22,26)(27,28,30)
|
|
509
|
+
4 (3,11)(4,12)(9,13)(10,14)(15,19)(16,20)(17,21)(18,22)(23,27)(24,28)(25,26)(29,30)
|
|
510
|
+
5 (1,7)(2,6)(5,8)
|
|
511
|
+
6 (3,19)(4,25)(9,11)(10,17)(12,28)(13,15)(14,30)(16,18)(20,27)(21,29)(22,23)(24,26)
|
|
512
|
+
7 (4,21,27)(10,22,28)(11,13,19)(12,14,20)(16,26,30)(17,18,25)(23,24,29)
|
|
513
|
+
8 (3,13)(4,24)(9,19)(10,29)(11,15)(12,26)(14,21)(16,23)(17,30)(18,27)(20,22)(25,28)
|
|
514
|
+
9 (3,15,9)(4,16,10)(12,23,17)(14,24,18)(20,29,25)(21,26,22)(27,30,28)
|
|
515
|
+
10 (4,27,21)(10,28,22)(11,19,13)(12,20,14)(16,30,26)(17,25,18)(23,29,24)
|
|
516
|
+
"""
|
|
517
|
+
from sage.sets.family import Family
|
|
518
|
+
return Family(self.reflection_index_set(), self.reflection)
|
|
519
|
+
|
|
520
|
+
##########################################################################
|
|
521
|
+
# distinguished reflections
|
|
522
|
+
##########################################################################
|
|
523
|
+
|
|
524
|
+
@abstract_method(optional=True)
|
|
525
|
+
def hyperplane_index_set(self):
|
|
526
|
+
r"""
|
|
527
|
+
Return the index set of the distinguished reflections of ``self``.
|
|
528
|
+
|
|
529
|
+
This is also the index set of the reflection hyperplanes
|
|
530
|
+
of ``self``, hence the name. This name is slightly abusive
|
|
531
|
+
since the concept of reflection hyperplanes is not defined
|
|
532
|
+
for all generalized Coxeter groups. However for all
|
|
533
|
+
practical purposes this is only used for complex
|
|
534
|
+
reflection groups, and there this is the desirable name.
|
|
535
|
+
|
|
536
|
+
.. SEEALSO::
|
|
537
|
+
|
|
538
|
+
- :meth:`distinguished_reflection`
|
|
539
|
+
- :meth:`distinguished_reflections`
|
|
540
|
+
|
|
541
|
+
EXAMPLES::
|
|
542
|
+
|
|
543
|
+
sage: # optional - gap3
|
|
544
|
+
sage: W = ReflectionGroup((1,1,4))
|
|
545
|
+
sage: W.hyperplane_index_set()
|
|
546
|
+
(1, 2, 3, 4, 5, 6)
|
|
547
|
+
sage: W = ReflectionGroup((1,1,4), hyperplane_index_set=[1,3,'asdf',7,9,11])
|
|
548
|
+
sage: W.hyperplane_index_set()
|
|
549
|
+
(1, 3, 'asdf', 7, 9, 11)
|
|
550
|
+
sage: W = ReflectionGroup((1,1,4),
|
|
551
|
+
....: hyperplane_index_set=('a','b','c','d','e','f'))
|
|
552
|
+
sage: W.hyperplane_index_set()
|
|
553
|
+
('a', 'b', 'c', 'd', 'e', 'f')
|
|
554
|
+
"""
|
|
555
|
+
|
|
556
|
+
@abstract_method(optional=True)
|
|
557
|
+
def distinguished_reflection(self, i):
|
|
558
|
+
r"""
|
|
559
|
+
Return the `i`-th distinguished reflection of ``self``.
|
|
560
|
+
|
|
561
|
+
INPUT:
|
|
562
|
+
|
|
563
|
+
- ``i`` -- an element of the index set of the distinguished reflections
|
|
564
|
+
|
|
565
|
+
.. SEEALSO::
|
|
566
|
+
|
|
567
|
+
- :meth:`distinguished_reflections`
|
|
568
|
+
- :meth:`hyperplane_index_set`
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: # optional - gap3
|
|
573
|
+
sage: W = ReflectionGroup((1,1,4),
|
|
574
|
+
....: hyperplane_index_set=('a','b','c','d','e','f'))
|
|
575
|
+
sage: for i in W.hyperplane_index_set():
|
|
576
|
+
....: print('%s %s'%(i, W.distinguished_reflection(i)))
|
|
577
|
+
a (1,7)(2,4)(5,6)(8,10)(11,12)
|
|
578
|
+
b (1,4)(2,8)(3,5)(7,10)(9,11)
|
|
579
|
+
c (2,5)(3,9)(4,6)(8,11)(10,12)
|
|
580
|
+
d (1,8)(2,7)(3,6)(4,10)(9,12)
|
|
581
|
+
e (1,6)(2,9)(3,8)(5,11)(7,12)
|
|
582
|
+
f (1,11)(3,10)(4,9)(5,7)(6,12)
|
|
583
|
+
"""
|
|
584
|
+
|
|
585
|
+
@cached_method
|
|
586
|
+
def distinguished_reflections(self):
|
|
587
|
+
r"""
|
|
588
|
+
Return a finite family containing the distinguished
|
|
589
|
+
reflections of ``self``, indexed by
|
|
590
|
+
:meth:`hyperplane_index_set`.
|
|
591
|
+
|
|
592
|
+
A *distinguished reflection* is a conjugate of a simple
|
|
593
|
+
reflection. For a Coxeter group, reflections and
|
|
594
|
+
distinguished reflections coincide. For a Complex
|
|
595
|
+
reflection groups this is a reflection acting on the
|
|
596
|
+
complement of the fixed hyperplane `H` as
|
|
597
|
+
`\operatorname{exp}(2 \pi i / n)`, where `n` is the order
|
|
598
|
+
of the reflection subgroup fixing `H`.
|
|
599
|
+
|
|
600
|
+
.. SEEALSO::
|
|
601
|
+
|
|
602
|
+
- :meth:`distinguished_reflection`
|
|
603
|
+
- :meth:`hyperplane_index_set`
|
|
604
|
+
|
|
605
|
+
EXAMPLES::
|
|
606
|
+
|
|
607
|
+
sage: # optional - gap3
|
|
608
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
609
|
+
sage: distinguished_reflections = W.distinguished_reflections()
|
|
610
|
+
sage: for index in sorted(distinguished_reflections.keys()):
|
|
611
|
+
....: print('%s %s'%(index, distinguished_reflections[index]))
|
|
612
|
+
1 (1,4)(2,3)(5,6)
|
|
613
|
+
2 (1,3)(2,5)(4,6)
|
|
614
|
+
3 (1,5)(2,4)(3,6)
|
|
615
|
+
sage: W = ReflectionGroup((1,1,3), hyperplane_index_set=['a','b','c'])
|
|
616
|
+
sage: distinguished_reflections = W.distinguished_reflections()
|
|
617
|
+
sage: for index in sorted(distinguished_reflections.keys()):
|
|
618
|
+
....: print('%s %s'%(index, distinguished_reflections[index]))
|
|
619
|
+
a (1,4)(2,3)(5,6)
|
|
620
|
+
b (1,3)(2,5)(4,6)
|
|
621
|
+
c (1,5)(2,4)(3,6)
|
|
622
|
+
sage: W = ReflectionGroup((3,1,1))
|
|
623
|
+
sage: distinguished_reflections = W.distinguished_reflections()
|
|
624
|
+
sage: for index in sorted(distinguished_reflections.keys()):
|
|
625
|
+
....: print('%s %s'%(index, distinguished_reflections[index]))
|
|
626
|
+
1 (1,2,3)
|
|
627
|
+
sage: W = ReflectionGroup((1,1,3), (3,1,2))
|
|
628
|
+
sage: distinguished_reflections = W.distinguished_reflections()
|
|
629
|
+
sage: for index in sorted(distinguished_reflections.keys()):
|
|
630
|
+
....: print('%s %s'%(index, distinguished_reflections[index]))
|
|
631
|
+
1 (1,6)(2,5)(7,8)
|
|
632
|
+
2 (1,5)(2,7)(6,8)
|
|
633
|
+
3 (3,9,15)(4,10,16)(12,17,23)(14,18,24)(20,25,29)(21,22,26)(27,28,30)
|
|
634
|
+
4 (3,11)(4,12)(9,13)(10,14)(15,19)(16,20)(17,21)(18,22)(23,27)(24,28)(25,26)(29,30)
|
|
635
|
+
5 (1,7)(2,6)(5,8)
|
|
636
|
+
6 (3,19)(4,25)(9,11)(10,17)(12,28)(13,15)(14,30)(16,18)(20,27)(21,29)(22,23)(24,26)
|
|
637
|
+
7 (4,21,27)(10,22,28)(11,13,19)(12,14,20)(16,26,30)(17,18,25)(23,24,29)
|
|
638
|
+
8 (3,13)(4,24)(9,19)(10,29)(11,15)(12,26)(14,21)(16,23)(17,30)(18,27)(20,22)(25,28)
|
|
639
|
+
"""
|
|
640
|
+
from sage.sets.family import Family
|
|
641
|
+
return Family(self.hyperplane_index_set(), self.distinguished_reflection)
|
|
642
|
+
|
|
643
|
+
##########################################################################
|
|
644
|
+
# from_reduced_word
|
|
645
|
+
##########################################################################
|
|
646
|
+
|
|
647
|
+
def from_reduced_word(self, word, word_type='simple'):
|
|
648
|
+
r"""
|
|
649
|
+
Return an element of ``self`` from its (reduced) word.
|
|
650
|
+
|
|
651
|
+
INPUT:
|
|
652
|
+
|
|
653
|
+
- ``word`` -- list (or iterable) of elements of the
|
|
654
|
+
index set of ``self`` (resp. of the distinguished
|
|
655
|
+
or of all reflections)
|
|
656
|
+
- ``word_type`` -- (default: ``'simple'``):
|
|
657
|
+
either ``'simple'``, ``'distinguished'``, or ``'all'``
|
|
658
|
+
|
|
659
|
+
If ``word`` is `[i_1,i_2,\ldots,i_k]`, then this returns
|
|
660
|
+
the corresponding product of simple reflections
|
|
661
|
+
`s_{i_1} s_{i_2} \cdots s_{i_k}`.
|
|
662
|
+
|
|
663
|
+
If ``word_type`` is ``'distinguished'`` (resp. ``'all'``),
|
|
664
|
+
then the product of the distinguished reflections (resp. all
|
|
665
|
+
reflections) is returned.
|
|
666
|
+
|
|
667
|
+
.. NOTE::
|
|
668
|
+
|
|
669
|
+
The main use case is for constructing elements from
|
|
670
|
+
reduced words, hence the name of this method.
|
|
671
|
+
However, the input word need *not* be reduced.
|
|
672
|
+
|
|
673
|
+
.. SEEALSO::
|
|
674
|
+
|
|
675
|
+
- :meth:`index_set`
|
|
676
|
+
- :meth:`reflection_index_set`
|
|
677
|
+
- :meth:`hyperplane_index_set`
|
|
678
|
+
- :meth:`~ComplexReflectionOrGeneralizedCoxeterGroups.ElementMethods.apply_simple_reflections`
|
|
679
|
+
- :meth:`~CoxeterGroup.ElementMethods.reduced_word`
|
|
680
|
+
- :meth:`~CoxeterGroup.ParentMethods._test_reduced_word`
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: W = CoxeterGroups().example(); W
|
|
685
|
+
The symmetric group on {0, ..., 3}
|
|
686
|
+
sage: s = W.simple_reflections()
|
|
687
|
+
sage: W.from_reduced_word([0,2,0,1])
|
|
688
|
+
(0, 3, 1, 2)
|
|
689
|
+
sage: W.from_reduced_word((0,2,0,1))
|
|
690
|
+
(0, 3, 1, 2)
|
|
691
|
+
sage: s[0]*s[2]*s[0]*s[1]
|
|
692
|
+
(0, 3, 1, 2)
|
|
693
|
+
|
|
694
|
+
We now experiment with the different values for
|
|
695
|
+
``word_type`` for the colored symmetric group::
|
|
696
|
+
|
|
697
|
+
sage: # needs sage.combinat
|
|
698
|
+
sage: W = ColoredPermutations(1,4)
|
|
699
|
+
sage: W.from_reduced_word([1,2,1,2,1,2])
|
|
700
|
+
[[0, 0, 0, 0], [1, 2, 3, 4]]
|
|
701
|
+
sage: W.from_reduced_word([1, 2, 3]).reduced_word()
|
|
702
|
+
[1, 2, 3]
|
|
703
|
+
|
|
704
|
+
sage: # needs sage.rings.number_field
|
|
705
|
+
sage: W = WeylGroup("A3", prefix='s')
|
|
706
|
+
sage: AS = W.domain()
|
|
707
|
+
sage: r1 = AS.roots()[4]; r1
|
|
708
|
+
(0, 1, 0, -1)
|
|
709
|
+
sage: r2 = AS.roots()[5]; r2
|
|
710
|
+
(0, 0, 1, -1)
|
|
711
|
+
sage: W.from_reduced_word([r1, r2], word_type='all')
|
|
712
|
+
s3*s2
|
|
713
|
+
|
|
714
|
+
sage: W = WeylGroup("G2", prefix='s') # needs sage.rings.number_field
|
|
715
|
+
sage: W.from_reduced_word(W.domain().positive_roots(), # needs sage.rings.number_field
|
|
716
|
+
....: word_type='all')
|
|
717
|
+
s1*s2
|
|
718
|
+
|
|
719
|
+
sage: # optional - gap3
|
|
720
|
+
sage: W = ReflectionGroup((1,1,4))
|
|
721
|
+
sage: W.from_reduced_word([1,2,3], word_type='all').reduced_word()
|
|
722
|
+
[1, 2, 3]
|
|
723
|
+
sage: W.from_reduced_word([1,2,3], word_type='all').reduced_word_in_reflections()
|
|
724
|
+
[1, 2, 3]
|
|
725
|
+
sage: W.from_reduced_word([1,2,3]).reduced_word_in_reflections()
|
|
726
|
+
[1, 2, 3]
|
|
727
|
+
|
|
728
|
+
TESTS::
|
|
729
|
+
|
|
730
|
+
sage: W = WeylGroup(['E',6]) # needs sage.rings.number_field
|
|
731
|
+
sage: W.from_reduced_word([2,3,4,2]) # needs sage.rings.number_field
|
|
732
|
+
[ 0 1 0 0 0 0 0 0]
|
|
733
|
+
[ 0 0 -1 0 0 0 0 0]
|
|
734
|
+
[-1 0 0 0 0 0 0 0]
|
|
735
|
+
[ 0 0 0 1 0 0 0 0]
|
|
736
|
+
[ 0 0 0 0 1 0 0 0]
|
|
737
|
+
[ 0 0 0 0 0 1 0 0]
|
|
738
|
+
[ 0 0 0 0 0 0 1 0]
|
|
739
|
+
[ 0 0 0 0 0 0 0 1]
|
|
740
|
+
"""
|
|
741
|
+
if word_type == 'simple':
|
|
742
|
+
return self.one().apply_simple_reflections(word)
|
|
743
|
+
else:
|
|
744
|
+
return self.one().apply_reflections(word, word_type=word_type)
|
|
745
|
+
|
|
746
|
+
##########################################################################
|
|
747
|
+
# Irreducible components
|
|
748
|
+
##########################################################################
|
|
749
|
+
|
|
750
|
+
def irreducible_component_index_sets(self):
|
|
751
|
+
r"""
|
|
752
|
+
Return a list containing the index sets of the irreducible components of
|
|
753
|
+
``self`` as finite reflection groups.
|
|
754
|
+
|
|
755
|
+
EXAMPLES::
|
|
756
|
+
|
|
757
|
+
sage: # needs sage.graphs
|
|
758
|
+
sage: W = ReflectionGroup([1,1,3], [3,1,3], 4); W # optional - gap3
|
|
759
|
+
Reducible complex reflection group of rank 7 and type A2 x G(3,1,3) x ST4
|
|
760
|
+
sage: sorted(W.irreducible_component_index_sets()) # optional - gap3
|
|
761
|
+
[[1, 2], [3, 4, 5], [6, 7]]
|
|
762
|
+
|
|
763
|
+
ALGORITHM:
|
|
764
|
+
|
|
765
|
+
Take the connected components of the graph on the
|
|
766
|
+
index set with edges ``(i,j)``, where ``s[i]`` and
|
|
767
|
+
``s[j]`` do not commute.
|
|
768
|
+
"""
|
|
769
|
+
I = self.index_set()
|
|
770
|
+
s = self.simple_reflections()
|
|
771
|
+
from sage.graphs.graph import Graph
|
|
772
|
+
G = Graph([I,
|
|
773
|
+
[[i,j]
|
|
774
|
+
for i,j in itertools.combinations(I,2)
|
|
775
|
+
if s[i]*s[j] != s[j]*s[i] ]],
|
|
776
|
+
format='vertices_and_edges')
|
|
777
|
+
return G.connected_components(sort=False)
|
|
778
|
+
|
|
779
|
+
@abstract_method(optional=True)
|
|
780
|
+
def irreducible_components(self):
|
|
781
|
+
r"""
|
|
782
|
+
Return the irreducible components of ``self`` as finite
|
|
783
|
+
reflection groups.
|
|
784
|
+
|
|
785
|
+
EXAMPLES::
|
|
786
|
+
|
|
787
|
+
sage: # needs sage.graphs
|
|
788
|
+
sage: W = ReflectionGroup([1,1,3], [3,1,3], 4) # optional - gap3
|
|
789
|
+
sage: W.irreducible_components() # optional - gap3
|
|
790
|
+
[Irreducible real reflection group of rank 2 and type A2,
|
|
791
|
+
Irreducible complex reflection group of rank 3 and type G(3,1,3),
|
|
792
|
+
Irreducible complex reflection group of rank 2 and type ST4]
|
|
793
|
+
"""
|
|
794
|
+
# TODO: provide a default implementation using the above and parabolic subgroups
|
|
795
|
+
|
|
796
|
+
def number_of_irreducible_components(self):
|
|
797
|
+
r"""
|
|
798
|
+
Return the number of irreducible components of ``self``.
|
|
799
|
+
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: # needs sage.graphs
|
|
803
|
+
sage: SymmetricGroup(3).number_of_irreducible_components()
|
|
804
|
+
1
|
|
805
|
+
sage: ColoredPermutations(1,3).number_of_irreducible_components() # needs sage.combinat
|
|
806
|
+
1
|
|
807
|
+
sage: ReflectionGroup((1,1,3),(2,1,3)).number_of_irreducible_components() # optional - gap3
|
|
808
|
+
2
|
|
809
|
+
|
|
810
|
+
TESTS::
|
|
811
|
+
|
|
812
|
+
sage: SymmetricGroup(3).number_of_irreducible_components.__module__
|
|
813
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
814
|
+
"""
|
|
815
|
+
return len(self.irreducible_component_index_sets())
|
|
816
|
+
|
|
817
|
+
def is_irreducible(self):
|
|
818
|
+
r"""
|
|
819
|
+
Return ``True`` if ``self`` is irreducible.
|
|
820
|
+
|
|
821
|
+
EXAMPLES::
|
|
822
|
+
|
|
823
|
+
sage: # needs sage.graphs
|
|
824
|
+
sage: W = ColoredPermutations(1,3); W # needs sage.combinat
|
|
825
|
+
1-colored permutations of size 3
|
|
826
|
+
sage: W.is_irreducible() # needs sage.combinat
|
|
827
|
+
True
|
|
828
|
+
sage: W = ReflectionGroup((1,1,3),(2,1,3)); W # optional - gap3
|
|
829
|
+
Reducible real reflection group of rank 5 and type A2 x B3
|
|
830
|
+
sage: W.is_irreducible() # optional - gap3
|
|
831
|
+
False
|
|
832
|
+
"""
|
|
833
|
+
return self.number_of_irreducible_components() == 1
|
|
834
|
+
|
|
835
|
+
def is_reducible(self):
|
|
836
|
+
r"""
|
|
837
|
+
Return ``True`` if ``self`` is not irreducible.
|
|
838
|
+
|
|
839
|
+
EXAMPLES::
|
|
840
|
+
|
|
841
|
+
sage: # needs sage.graphs
|
|
842
|
+
sage: W = ColoredPermutations(1,3); W # needs sage.combinat
|
|
843
|
+
1-colored permutations of size 3
|
|
844
|
+
sage: W.is_reducible() # needs sage.combinat
|
|
845
|
+
False
|
|
846
|
+
sage: W = ReflectionGroup((1,1,3), (2,1,3)); W # optional - gap3
|
|
847
|
+
Reducible real reflection group of rank 5 and type A2 x B3
|
|
848
|
+
sage: W.is_reducible() # optional - gap3
|
|
849
|
+
True
|
|
850
|
+
"""
|
|
851
|
+
return not self.is_irreducible()
|
|
852
|
+
|
|
853
|
+
class ElementMethods:
|
|
854
|
+
def apply_simple_reflection_left(self, i):
|
|
855
|
+
r"""
|
|
856
|
+
Return ``self`` multiplied by the simple reflection ``s[i]``
|
|
857
|
+
on the left.
|
|
858
|
+
|
|
859
|
+
This low level method is used intensively. Coxeter groups
|
|
860
|
+
are encouraged to override this straightforward
|
|
861
|
+
implementation whenever a faster approach exists.
|
|
862
|
+
|
|
863
|
+
EXAMPLES::
|
|
864
|
+
|
|
865
|
+
sage: W = CoxeterGroups().example()
|
|
866
|
+
sage: w = W.an_element(); w
|
|
867
|
+
(1, 2, 3, 0)
|
|
868
|
+
sage: w.apply_simple_reflection_left(0)
|
|
869
|
+
(0, 2, 3, 1)
|
|
870
|
+
sage: w.apply_simple_reflection_left(1)
|
|
871
|
+
(2, 1, 3, 0)
|
|
872
|
+
sage: w.apply_simple_reflection_left(2)
|
|
873
|
+
(1, 3, 2, 0)
|
|
874
|
+
|
|
875
|
+
EXAMPLES::
|
|
876
|
+
|
|
877
|
+
sage: # needs sage.combinat
|
|
878
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
879
|
+
sage: W = ComplexReflectionGroups().example()
|
|
880
|
+
sage: w = W.an_element(); w
|
|
881
|
+
[[1, 0, 0], [3, 1, 2]]
|
|
882
|
+
sage: w.apply_simple_reflection_left(1)
|
|
883
|
+
[[0, 1, 0], [1, 3, 2]]
|
|
884
|
+
sage: w.apply_simple_reflection_left(2)
|
|
885
|
+
[[1, 0, 0], [3, 2, 1]]
|
|
886
|
+
sage: w.apply_simple_reflection_left(3)
|
|
887
|
+
[[1, 0, 1], [3, 1, 2]]
|
|
888
|
+
|
|
889
|
+
TESTS::
|
|
890
|
+
|
|
891
|
+
sage: w.apply_simple_reflection_left.__module__ # needs sage.combinat
|
|
892
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
893
|
+
"""
|
|
894
|
+
s = self.parent().simple_reflections()
|
|
895
|
+
return s[i] * self
|
|
896
|
+
|
|
897
|
+
def apply_simple_reflection_right(self, i):
|
|
898
|
+
"""
|
|
899
|
+
Return ``self`` multiplied by the simple reflection ``s[i]``
|
|
900
|
+
on the right.
|
|
901
|
+
|
|
902
|
+
This low level method is used intensively. Coxeter groups
|
|
903
|
+
are encouraged to override this straightforward
|
|
904
|
+
implementation whenever a faster approach exists.
|
|
905
|
+
|
|
906
|
+
EXAMPLES::
|
|
907
|
+
|
|
908
|
+
sage: W = CoxeterGroups().example()
|
|
909
|
+
sage: w = W.an_element(); w
|
|
910
|
+
(1, 2, 3, 0)
|
|
911
|
+
sage: w.apply_simple_reflection_right(0)
|
|
912
|
+
(2, 1, 3, 0)
|
|
913
|
+
sage: w.apply_simple_reflection_right(1)
|
|
914
|
+
(1, 3, 2, 0)
|
|
915
|
+
sage: w.apply_simple_reflection_right(2)
|
|
916
|
+
(1, 2, 0, 3)
|
|
917
|
+
|
|
918
|
+
sage: # needs sage.combinat
|
|
919
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
920
|
+
sage: W = ComplexReflectionGroups().example()
|
|
921
|
+
sage: w = W.an_element(); w
|
|
922
|
+
[[1, 0, 0], [3, 1, 2]]
|
|
923
|
+
sage: w.apply_simple_reflection_right(1)
|
|
924
|
+
[[1, 0, 0], [3, 2, 1]]
|
|
925
|
+
sage: w.apply_simple_reflection_right(2)
|
|
926
|
+
[[1, 0, 0], [2, 1, 3]]
|
|
927
|
+
sage: w.apply_simple_reflection_right(3)
|
|
928
|
+
[[2, 0, 0], [3, 1, 2]]
|
|
929
|
+
|
|
930
|
+
TESTS::
|
|
931
|
+
|
|
932
|
+
sage: w.apply_simple_reflection_right.__module__
|
|
933
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
934
|
+
"""
|
|
935
|
+
s = self.parent().simple_reflections()
|
|
936
|
+
return self * s[i]
|
|
937
|
+
|
|
938
|
+
def apply_simple_reflection(self, i, side='right'):
|
|
939
|
+
"""
|
|
940
|
+
Return ``self`` multiplied by the simple reflection ``s[i]``.
|
|
941
|
+
|
|
942
|
+
INPUT:
|
|
943
|
+
|
|
944
|
+
- ``i`` -- an element of the index set
|
|
945
|
+
- ``side`` -- (default: ``'right'``) ``'left'`` or ``'right'``
|
|
946
|
+
|
|
947
|
+
This default implementation simply calls
|
|
948
|
+
:meth:`apply_simple_reflection_left` or
|
|
949
|
+
:meth:`apply_simple_reflection_right`.
|
|
950
|
+
|
|
951
|
+
EXAMPLES::
|
|
952
|
+
|
|
953
|
+
sage: W = CoxeterGroups().example()
|
|
954
|
+
sage: w = W.an_element(); w
|
|
955
|
+
(1, 2, 3, 0)
|
|
956
|
+
sage: w.apply_simple_reflection(0, side='left')
|
|
957
|
+
(0, 2, 3, 1)
|
|
958
|
+
sage: w.apply_simple_reflection(1, side='left')
|
|
959
|
+
(2, 1, 3, 0)
|
|
960
|
+
sage: w.apply_simple_reflection(2, side='left')
|
|
961
|
+
(1, 3, 2, 0)
|
|
962
|
+
sage: w.apply_simple_reflection(0, side='right')
|
|
963
|
+
(2, 1, 3, 0)
|
|
964
|
+
sage: w.apply_simple_reflection(1, side='right')
|
|
965
|
+
(1, 3, 2, 0)
|
|
966
|
+
sage: w.apply_simple_reflection(2, side='right')
|
|
967
|
+
(1, 2, 0, 3)
|
|
968
|
+
|
|
969
|
+
By default, ``side`` is ``'right'``::
|
|
970
|
+
|
|
971
|
+
sage: w.apply_simple_reflection(0)
|
|
972
|
+
(2, 1, 3, 0)
|
|
973
|
+
|
|
974
|
+
Some tests with a complex reflection group::
|
|
975
|
+
|
|
976
|
+
sage: # needs sage.combinat
|
|
977
|
+
sage: from sage.categories.complex_reflection_groups import ComplexReflectionGroups
|
|
978
|
+
sage: W = ComplexReflectionGroups().example(); W
|
|
979
|
+
5-colored permutations of size 3
|
|
980
|
+
sage: w = W.an_element(); w
|
|
981
|
+
[[1, 0, 0], [3, 1, 2]]
|
|
982
|
+
sage: w.apply_simple_reflection(1, side='left')
|
|
983
|
+
[[0, 1, 0], [1, 3, 2]]
|
|
984
|
+
sage: w.apply_simple_reflection(2, side='left')
|
|
985
|
+
[[1, 0, 0], [3, 2, 1]]
|
|
986
|
+
sage: w.apply_simple_reflection(3, side='left')
|
|
987
|
+
[[1, 0, 1], [3, 1, 2]]
|
|
988
|
+
sage: w.apply_simple_reflection(1, side='right')
|
|
989
|
+
[[1, 0, 0], [3, 2, 1]]
|
|
990
|
+
sage: w.apply_simple_reflection(2, side='right')
|
|
991
|
+
[[1, 0, 0], [2, 1, 3]]
|
|
992
|
+
sage: w.apply_simple_reflection(3, side='right')
|
|
993
|
+
[[2, 0, 0], [3, 1, 2]]
|
|
994
|
+
|
|
995
|
+
TESTS::
|
|
996
|
+
|
|
997
|
+
sage: w.apply_simple_reflection_right.__module__ # needs sage.combinat
|
|
998
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
999
|
+
"""
|
|
1000
|
+
if side == 'right':
|
|
1001
|
+
return self.apply_simple_reflection_right(i)
|
|
1002
|
+
else:
|
|
1003
|
+
return self.apply_simple_reflection_left(i)
|
|
1004
|
+
|
|
1005
|
+
def apply_simple_reflections(self, word, side='right', type='simple'):
|
|
1006
|
+
r"""
|
|
1007
|
+
Return the result of the (left/right) multiplication of
|
|
1008
|
+
``self`` by ``word``.
|
|
1009
|
+
|
|
1010
|
+
INPUT:
|
|
1011
|
+
|
|
1012
|
+
- ``word`` -- a sequence of indices of simple reflections
|
|
1013
|
+
- ``side`` -- (default: ``'right'``) indicates multiplying
|
|
1014
|
+
from left or right
|
|
1015
|
+
|
|
1016
|
+
This is a specialized implementation of
|
|
1017
|
+
:meth:`apply_reflections` for the simple reflections. The
|
|
1018
|
+
rationale for its existence are:
|
|
1019
|
+
|
|
1020
|
+
- It can take advantage of ``apply_simple_reflection``,
|
|
1021
|
+
which often is less expensive than computing a product.
|
|
1022
|
+
|
|
1023
|
+
- It reduced burden on implementations that would want to
|
|
1024
|
+
provide an optimized version of this method.
|
|
1025
|
+
|
|
1026
|
+
EXAMPLES::
|
|
1027
|
+
|
|
1028
|
+
sage: W = CoxeterGroups().example()
|
|
1029
|
+
sage: w = W.an_element(); w
|
|
1030
|
+
(1, 2, 3, 0)
|
|
1031
|
+
sage: w.apply_simple_reflections([0,1])
|
|
1032
|
+
(2, 3, 1, 0)
|
|
1033
|
+
sage: w
|
|
1034
|
+
(1, 2, 3, 0)
|
|
1035
|
+
sage: w.apply_simple_reflections([0,1],side='left')
|
|
1036
|
+
(0, 1, 3, 2)
|
|
1037
|
+
"""
|
|
1038
|
+
for i in word:
|
|
1039
|
+
self = self.apply_simple_reflection(i, side)
|
|
1040
|
+
return self
|
|
1041
|
+
|
|
1042
|
+
def apply_reflections(self, word, side='right', word_type='all'):
|
|
1043
|
+
r"""
|
|
1044
|
+
Return the result of the (left/right) multiplication of
|
|
1045
|
+
``self`` by ``word``.
|
|
1046
|
+
|
|
1047
|
+
INPUT:
|
|
1048
|
+
|
|
1049
|
+
- ``word`` -- a sequence of indices of reflections
|
|
1050
|
+
- ``side`` -- (default: ``'right'``) indicates multiplying
|
|
1051
|
+
from left or right
|
|
1052
|
+
- ``word_type`` -- (default: ``'all'``):
|
|
1053
|
+
either ``'simple'``, ``'distinguished'``, or ``'all'``
|
|
1054
|
+
|
|
1055
|
+
EXAMPLES::
|
|
1056
|
+
|
|
1057
|
+
sage: # optional - gap3
|
|
1058
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
1059
|
+
sage: W.one().apply_reflections([1])
|
|
1060
|
+
(1,4)(2,3)(5,6)
|
|
1061
|
+
sage: W.one().apply_reflections([2])
|
|
1062
|
+
(1,3)(2,5)(4,6)
|
|
1063
|
+
sage: W.one().apply_reflections([2,1])
|
|
1064
|
+
(1,2,6)(3,4,5)
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
sage: W = CoxeterGroups().example()
|
|
1068
|
+
sage: w = W.an_element(); w
|
|
1069
|
+
(1, 2, 3, 0)
|
|
1070
|
+
sage: w.apply_reflections([0,1], word_type='simple')
|
|
1071
|
+
(2, 3, 1, 0)
|
|
1072
|
+
sage: w
|
|
1073
|
+
(1, 2, 3, 0)
|
|
1074
|
+
sage: w.apply_reflections([0,1], side='left', word_type='simple')
|
|
1075
|
+
(0, 1, 3, 2)
|
|
1076
|
+
|
|
1077
|
+
sage: # needs sage.rings.number_field
|
|
1078
|
+
sage: W = WeylGroup("A3", prefix='s')
|
|
1079
|
+
sage: w = W.an_element(); w
|
|
1080
|
+
s1*s2*s3
|
|
1081
|
+
sage: AS = W.domain()
|
|
1082
|
+
sage: r1 = AS.roots()[4]; r1
|
|
1083
|
+
(0, 1, 0, -1)
|
|
1084
|
+
sage: r2 = AS.roots()[5]; r2
|
|
1085
|
+
(0, 0, 1, -1)
|
|
1086
|
+
sage: w.apply_reflections([r1, r2], word_type='all')
|
|
1087
|
+
s1
|
|
1088
|
+
|
|
1089
|
+
sage: # optional - gap3
|
|
1090
|
+
sage: W = ReflectionGroup((1,1,3))
|
|
1091
|
+
sage: W.one().apply_reflections([1], word_type='distinguished')
|
|
1092
|
+
(1,4)(2,3)(5,6)
|
|
1093
|
+
sage: W.one().apply_reflections([2], word_type='distinguished')
|
|
1094
|
+
(1,3)(2,5)(4,6)
|
|
1095
|
+
sage: W.one().apply_reflections([3], word_type='distinguished')
|
|
1096
|
+
(1,5)(2,4)(3,6)
|
|
1097
|
+
sage: W.one().apply_reflections([2,1], word_type='distinguished')
|
|
1098
|
+
(1,2,6)(3,4,5)
|
|
1099
|
+
|
|
1100
|
+
sage: # optional - gap3
|
|
1101
|
+
sage: W = ReflectionGroup((1,1,3), hyperplane_index_set=['A','B','C']); W
|
|
1102
|
+
Irreducible real reflection group of rank 2 and type A2
|
|
1103
|
+
sage: W.one().apply_reflections(['A'], word_type='distinguished')
|
|
1104
|
+
(1,4)(2,3)(5,6)
|
|
1105
|
+
"""
|
|
1106
|
+
if word_type == 'simple':
|
|
1107
|
+
reflections = self.parent().simple_reflections()
|
|
1108
|
+
elif word_type == 'distinguished':
|
|
1109
|
+
reflections = self.parent().distinguished_reflections()
|
|
1110
|
+
else:
|
|
1111
|
+
reflections = self.parent().reflections()
|
|
1112
|
+
if side == 'left':
|
|
1113
|
+
for i in word:
|
|
1114
|
+
self = reflections[i] * self
|
|
1115
|
+
else:
|
|
1116
|
+
for i in word:
|
|
1117
|
+
self = self * reflections[i]
|
|
1118
|
+
return self
|
|
1119
|
+
|
|
1120
|
+
def _mul_(self, other):
|
|
1121
|
+
r"""
|
|
1122
|
+
Return the product of ``self`` and ``other``.
|
|
1123
|
+
|
|
1124
|
+
This default implementation computes a reduced word of
|
|
1125
|
+
``other`` using :meth:`reduced_word`, and applies the
|
|
1126
|
+
corresponding simple reflections on ``self`` using
|
|
1127
|
+
:meth:`apply_simple_reflections`.
|
|
1128
|
+
|
|
1129
|
+
EXAMPLES::
|
|
1130
|
+
|
|
1131
|
+
sage: W = FiniteCoxeterGroups().example(); W
|
|
1132
|
+
The 5-th dihedral group of order 10
|
|
1133
|
+
sage: w = W.an_element()
|
|
1134
|
+
sage: w
|
|
1135
|
+
(1, 2)
|
|
1136
|
+
sage: w._mul_(w)
|
|
1137
|
+
(1, 2, 1, 2)
|
|
1138
|
+
sage: w._mul_(w)._mul_(w)
|
|
1139
|
+
(2, 1, 2, 1)
|
|
1140
|
+
|
|
1141
|
+
This method is called when computing ``self * other``::
|
|
1142
|
+
|
|
1143
|
+
sage: w * w
|
|
1144
|
+
(1, 2, 1, 2)
|
|
1145
|
+
|
|
1146
|
+
TESTS::
|
|
1147
|
+
|
|
1148
|
+
sage: w._mul_.__module__
|
|
1149
|
+
'sage.categories.complex_reflection_or_generalized_coxeter_groups'
|
|
1150
|
+
"""
|
|
1151
|
+
return self.apply_simple_reflections(other.reduced_word())
|
|
1152
|
+
|
|
1153
|
+
def __invert__(self):
|
|
1154
|
+
"""
|
|
1155
|
+
Return the inverse of ``self``.
|
|
1156
|
+
|
|
1157
|
+
EXAMPLES::
|
|
1158
|
+
|
|
1159
|
+
sage: # needs sage.rings.number_field
|
|
1160
|
+
sage: W = WeylGroup(['B',7])
|
|
1161
|
+
sage: w = W.an_element()
|
|
1162
|
+
sage: u = w.inverse() # indirect doctest
|
|
1163
|
+
sage: u == ~w
|
|
1164
|
+
True
|
|
1165
|
+
sage: u * w == w * u
|
|
1166
|
+
True
|
|
1167
|
+
sage: u * w
|
|
1168
|
+
[1 0 0 0 0 0 0]
|
|
1169
|
+
[0 1 0 0 0 0 0]
|
|
1170
|
+
[0 0 1 0 0 0 0]
|
|
1171
|
+
[0 0 0 1 0 0 0]
|
|
1172
|
+
[0 0 0 0 1 0 0]
|
|
1173
|
+
[0 0 0 0 0 1 0]
|
|
1174
|
+
[0 0 0 0 0 0 1]
|
|
1175
|
+
"""
|
|
1176
|
+
return self.parent().one().apply_simple_reflections(self.reduced_word_reverse_iterator())
|
|
1177
|
+
|
|
1178
|
+
def apply_conjugation_by_simple_reflection(self, i):
|
|
1179
|
+
r"""
|
|
1180
|
+
Conjugate ``self`` by the ``i``-th simple reflection.
|
|
1181
|
+
|
|
1182
|
+
EXAMPLES::
|
|
1183
|
+
|
|
1184
|
+
sage: W = WeylGroup(['A',3]) # needs sage.rings.number_field
|
|
1185
|
+
sage: w = W.from_reduced_word([3,1,2,1]) # needs sage.rings.number_field
|
|
1186
|
+
sage: w.apply_conjugation_by_simple_reflection(1).reduced_word() # needs sage.rings.number_field
|
|
1187
|
+
[3, 2]
|
|
1188
|
+
"""
|
|
1189
|
+
return self.apply_simple_reflection(i).apply_simple_reflection(i, side='left')
|
|
1190
|
+
|
|
1191
|
+
@abstract_method(optional=True)
|
|
1192
|
+
def reflection_length(self):
|
|
1193
|
+
r"""
|
|
1194
|
+
Return the reflection length of ``self``.
|
|
1195
|
+
|
|
1196
|
+
This is the minimal length of a factorization of ``self``
|
|
1197
|
+
into reflections.
|
|
1198
|
+
|
|
1199
|
+
EXAMPLES::
|
|
1200
|
+
|
|
1201
|
+
sage: # optional - gap3
|
|
1202
|
+
sage: W = ReflectionGroup((1,1,2))
|
|
1203
|
+
sage: sorted([t.reflection_length() for t in W])
|
|
1204
|
+
[0, 1]
|
|
1205
|
+
sage: W = ReflectionGroup((2,1,2))
|
|
1206
|
+
sage: sorted([t.reflection_length() for t in W])
|
|
1207
|
+
[0, 1, 1, 1, 1, 2, 2, 2]
|
|
1208
|
+
sage: W = ReflectionGroup((3,1,2))
|
|
1209
|
+
sage: sorted([t.reflection_length() for t in W])
|
|
1210
|
+
[0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
|
|
1211
|
+
sage: W = ReflectionGroup((2,2,2))
|
|
1212
|
+
sage: sorted([t.reflection_length() for t in W])
|
|
1213
|
+
[0, 1, 1, 2]
|
|
1214
|
+
"""
|
|
1215
|
+
|
|
1216
|
+
def is_reflection(self):
|
|
1217
|
+
r"""
|
|
1218
|
+
Return whether ``self`` is a reflection.
|
|
1219
|
+
|
|
1220
|
+
EXAMPLES::
|
|
1221
|
+
|
|
1222
|
+
sage: # optional - gap3
|
|
1223
|
+
sage: W = ReflectionGroup((1,1,4))
|
|
1224
|
+
sage: [t.is_reflection() for t in W.reflections()]
|
|
1225
|
+
[True, True, True, True, True, True]
|
|
1226
|
+
sage: len([t for t in W.reflections() if t.is_reflection()])
|
|
1227
|
+
6
|
|
1228
|
+
sage: W = ReflectionGroup((2,1,3))
|
|
1229
|
+
sage: [t.is_reflection() for t in W.reflections()]
|
|
1230
|
+
[True, True, True, True, True, True, True, True, True]
|
|
1231
|
+
sage: len([t for t in W.reflections() if t.is_reflection()])
|
|
1232
|
+
9
|
|
1233
|
+
"""
|
|
1234
|
+
return self.reflection_length() == 1
|
|
1235
|
+
|
|
1236
|
+
class Irreducible(CategoryWithAxiom):
|
|
1237
|
+
class ParentMethods:
|
|
1238
|
+
def irreducible_components(self):
|
|
1239
|
+
r"""
|
|
1240
|
+
Return a list containing all irreducible components of
|
|
1241
|
+
``self`` as finite reflection groups.
|
|
1242
|
+
|
|
1243
|
+
EXAMPLES::
|
|
1244
|
+
|
|
1245
|
+
sage: W = ColoredPermutations(4, 3) # needs sage.combinat
|
|
1246
|
+
sage: W.irreducible_components() # needs sage.combinat
|
|
1247
|
+
[4-colored permutations of size 3]
|
|
1248
|
+
"""
|
|
1249
|
+
return [self]
|