passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.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.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,927 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.graphs
|
|
3
|
+
"""
|
|
4
|
+
Coxeter Groups As Matrix Groups
|
|
5
|
+
|
|
6
|
+
This implements a general Coxeter group as a matrix group by using the
|
|
7
|
+
reflection representation.
|
|
8
|
+
|
|
9
|
+
AUTHORS:
|
|
10
|
+
|
|
11
|
+
- Travis Scrimshaw (2013-08-28): Initial version
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
##############################################################################
|
|
15
|
+
# Copyright (C) 2013 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
16
|
+
#
|
|
17
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
18
|
+
#
|
|
19
|
+
# The full text of the GPL is available at:
|
|
20
|
+
#
|
|
21
|
+
# http://www.gnu.org/licenses/
|
|
22
|
+
##############################################################################
|
|
23
|
+
|
|
24
|
+
import sage.rings.abc
|
|
25
|
+
|
|
26
|
+
from sage.categories.coxeter_groups import CoxeterGroups
|
|
27
|
+
from sage.combinat.root_system.coxeter_matrix import CoxeterMatrix
|
|
28
|
+
from sage.groups.matrix_gps.finitely_generated import FinitelyGeneratedMatrixGroup_generic
|
|
29
|
+
from sage.groups.matrix_gps.group_element import MatrixGroupElement_generic
|
|
30
|
+
from sage.matrix.args import SparseEntry
|
|
31
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
32
|
+
from sage.misc.cachefunc import cached_method
|
|
33
|
+
from sage.rings.integer_ring import ZZ
|
|
34
|
+
from sage.rings.infinity import infinity
|
|
35
|
+
from sage.sets.family import Family
|
|
36
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CoxeterMatrixGroup(UniqueRepresentation, FinitelyGeneratedMatrixGroup_generic):
|
|
40
|
+
r"""
|
|
41
|
+
A Coxeter group represented as a matrix group.
|
|
42
|
+
|
|
43
|
+
Let `(W, S)` be a Coxeter system. We construct a vector space `V`
|
|
44
|
+
over `\RR` with a basis of `\{ \alpha_s \}_{s \in S}` and inner product
|
|
45
|
+
|
|
46
|
+
.. MATH::
|
|
47
|
+
|
|
48
|
+
B(\alpha_s, \alpha_t) = -\cos\left( \frac{\pi}{m_{st}} \right)
|
|
49
|
+
|
|
50
|
+
where we have `B(\alpha_s, \alpha_t) = -1` if `m_{st} = \infty`. Next we
|
|
51
|
+
define a representation `\sigma_s : V \to V` by
|
|
52
|
+
|
|
53
|
+
.. MATH::
|
|
54
|
+
|
|
55
|
+
\sigma_s \lambda = \lambda - 2 B(\alpha_s, \lambda) \alpha_s.
|
|
56
|
+
|
|
57
|
+
This representation is faithful so we can represent the Coxeter group `W`
|
|
58
|
+
by the set of matrices `\sigma_s` acting on `V`.
|
|
59
|
+
|
|
60
|
+
INPUT:
|
|
61
|
+
|
|
62
|
+
- ``data`` -- a Coxeter matrix or graph or a Cartan type
|
|
63
|
+
- ``base_ring`` -- (default: the universal cyclotomic field or
|
|
64
|
+
a number field) the base ring which contains all values
|
|
65
|
+
`\cos(\pi/m_{ij})` where `(m_{ij})_{ij}` is the Coxeter matrix
|
|
66
|
+
- ``index_set`` -- (optional) an indexing set for the generators
|
|
67
|
+
|
|
68
|
+
For finite Coxeter groups, the default base ring is taken to be `\QQ` or
|
|
69
|
+
a quadratic number field when possible.
|
|
70
|
+
|
|
71
|
+
For more on creating Coxeter groups, see
|
|
72
|
+
:meth:`~sage.combinat.root_system.coxeter_group.CoxeterGroup`.
|
|
73
|
+
|
|
74
|
+
.. TODO::
|
|
75
|
+
|
|
76
|
+
Currently the label `\infty` is implemented as `-1` in the Coxeter
|
|
77
|
+
matrix.
|
|
78
|
+
|
|
79
|
+
EXAMPLES:
|
|
80
|
+
|
|
81
|
+
We can create Coxeter groups from Coxeter matrices::
|
|
82
|
+
|
|
83
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
84
|
+
sage: W = CoxeterGroup([[1, 6, 3], [6, 1, 10], [3, 10, 1]]); W
|
|
85
|
+
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
|
|
86
|
+
[ 1 6 3]
|
|
87
|
+
[ 6 1 10]
|
|
88
|
+
[ 3 10 1]
|
|
89
|
+
sage: W.gens()
|
|
90
|
+
(
|
|
91
|
+
[ -1 -E(12)^7 + E(12)^11 1]
|
|
92
|
+
[ 0 1 0]
|
|
93
|
+
[ 0 0 1],
|
|
94
|
+
<BLANKLINE>
|
|
95
|
+
[ 1 0 0]
|
|
96
|
+
[-E(12)^7 + E(12)^11 -1 E(20) - E(20)^9]
|
|
97
|
+
[ 0 0 1],
|
|
98
|
+
<BLANKLINE>
|
|
99
|
+
[ 1 0 0]
|
|
100
|
+
[ 0 1 0]
|
|
101
|
+
[ 1 E(20) - E(20)^9 -1]
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
sage: m = matrix([[1,3,3,3], [3,1,3,2], [3,3,1,2], [3,2,2,1]])
|
|
105
|
+
sage: W = CoxeterGroup(m)
|
|
106
|
+
sage: W.gens()
|
|
107
|
+
(
|
|
108
|
+
[-1 1 1 1] [ 1 0 0 0] [ 1 0 0 0] [ 1 0 0 0]
|
|
109
|
+
[ 0 1 0 0] [ 1 -1 1 0] [ 0 1 0 0] [ 0 1 0 0]
|
|
110
|
+
[ 0 0 1 0] [ 0 0 1 0] [ 1 1 -1 0] [ 0 0 1 0]
|
|
111
|
+
[ 0 0 0 1], [ 0 0 0 1], [ 0 0 0 1], [ 1 0 0 -1]
|
|
112
|
+
)
|
|
113
|
+
sage: a,b,c,d = W.gens()
|
|
114
|
+
sage: (a*b*c)^3
|
|
115
|
+
[ 5 1 -5 7]
|
|
116
|
+
[ 5 0 -4 5]
|
|
117
|
+
[ 4 1 -4 4]
|
|
118
|
+
[ 0 0 0 1]
|
|
119
|
+
sage: (a*b)^3
|
|
120
|
+
[1 0 0 0]
|
|
121
|
+
[0 1 0 0]
|
|
122
|
+
[0 0 1 0]
|
|
123
|
+
[0 0 0 1]
|
|
124
|
+
sage: b*d == d*b
|
|
125
|
+
True
|
|
126
|
+
sage: a*c*a == c*a*c
|
|
127
|
+
True
|
|
128
|
+
|
|
129
|
+
We can create the matrix representation over different base rings and with
|
|
130
|
+
different index sets. Note that the base ring must contain all
|
|
131
|
+
`2*\cos(\pi/m_{ij})` where `(m_{ij})_{ij}` is the Coxeter matrix::
|
|
132
|
+
|
|
133
|
+
sage: W = CoxeterGroup(m, base_ring=RR, index_set=['a','b','c','d'])
|
|
134
|
+
sage: W.base_ring()
|
|
135
|
+
Real Field with 53 bits of precision
|
|
136
|
+
sage: W.index_set()
|
|
137
|
+
('a', 'b', 'c', 'd')
|
|
138
|
+
|
|
139
|
+
sage: CoxeterGroup(m, base_ring=ZZ)
|
|
140
|
+
Coxeter group over Integer Ring with Coxeter matrix:
|
|
141
|
+
[1 3 3 3]
|
|
142
|
+
[3 1 3 2]
|
|
143
|
+
[3 3 1 2]
|
|
144
|
+
[3 2 2 1]
|
|
145
|
+
sage: CoxeterGroup([[1,4],[4,1]], base_ring=QQ) # needs sage.symbolic
|
|
146
|
+
Traceback (most recent call last):
|
|
147
|
+
...
|
|
148
|
+
TypeError: unable to convert sqrt(2) to a rational
|
|
149
|
+
|
|
150
|
+
Using the well-known conversion between Coxeter matrices and Coxeter
|
|
151
|
+
graphs, we can input a Coxeter graph. Following the standard convention,
|
|
152
|
+
edges with no label (i.e. labelled by ``None``) are treated as 3::
|
|
153
|
+
|
|
154
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
155
|
+
sage: G = Graph([(0,3,None), (1,3,15), (2,3,7), (0,1,3)])
|
|
156
|
+
sage: W = CoxeterGroup(G); W
|
|
157
|
+
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
|
|
158
|
+
[ 1 3 2 3]
|
|
159
|
+
[ 3 1 2 15]
|
|
160
|
+
[ 2 2 1 7]
|
|
161
|
+
[ 3 15 7 1]
|
|
162
|
+
sage: G2 = W.coxeter_diagram()
|
|
163
|
+
sage: CoxeterGroup(G2) is W
|
|
164
|
+
True
|
|
165
|
+
|
|
166
|
+
Because there currently is no class for `\ZZ \cup \{ \infty \}`, labels
|
|
167
|
+
of `\infty` are given by `-1` in the Coxeter matrix::
|
|
168
|
+
|
|
169
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
170
|
+
sage: G = Graph([(0,1,None), (1,2,4), (0,2,oo)])
|
|
171
|
+
sage: W = CoxeterGroup(G)
|
|
172
|
+
sage: W.coxeter_matrix()
|
|
173
|
+
[ 1 3 -1]
|
|
174
|
+
[ 3 1 4]
|
|
175
|
+
[-1 4 1]
|
|
176
|
+
|
|
177
|
+
We can also create Coxeter groups from Cartan types using the
|
|
178
|
+
``implementation`` keyword::
|
|
179
|
+
|
|
180
|
+
sage: W = CoxeterGroup(['D',5], implementation='reflection'); W
|
|
181
|
+
Finite Coxeter group over Integer Ring with Coxeter matrix:
|
|
182
|
+
[1 3 2 2 2]
|
|
183
|
+
[3 1 3 2 2]
|
|
184
|
+
[2 3 1 3 3]
|
|
185
|
+
[2 2 3 1 2]
|
|
186
|
+
[2 2 3 2 1]
|
|
187
|
+
sage: W = CoxeterGroup(['H',3], implementation='reflection'); W # needs sage.libs.gap sage.rings.number_field
|
|
188
|
+
Finite Coxeter group over
|
|
189
|
+
Number Field in a with defining polynomial x^2 - 5 with a = 2.236067977499790?
|
|
190
|
+
with Coxeter matrix:
|
|
191
|
+
[1 3 2]
|
|
192
|
+
[3 1 5]
|
|
193
|
+
[2 5 1]
|
|
194
|
+
"""
|
|
195
|
+
@staticmethod
|
|
196
|
+
def __classcall_private__(cls, data, base_ring=None, index_set=None):
|
|
197
|
+
"""
|
|
198
|
+
Normalize arguments to ensure a unique representation.
|
|
199
|
+
|
|
200
|
+
EXAMPLES::
|
|
201
|
+
|
|
202
|
+
sage: W1 = CoxeterGroup(['A',2], implementation='reflection', base_ring=ZZ)
|
|
203
|
+
sage: W2 = CoxeterGroup([[1,3],[3,1]], index_set=(1,2))
|
|
204
|
+
sage: W1 is W2
|
|
205
|
+
True
|
|
206
|
+
sage: G1 = Graph([(1,2)])
|
|
207
|
+
sage: W3 = CoxeterGroup(G1)
|
|
208
|
+
sage: W1 is W3
|
|
209
|
+
True
|
|
210
|
+
sage: G2 = Graph([(1,2,3)])
|
|
211
|
+
sage: W4 = CoxeterGroup(G2)
|
|
212
|
+
sage: W1 is W4
|
|
213
|
+
True
|
|
214
|
+
"""
|
|
215
|
+
data = CoxeterMatrix(data, index_set=index_set)
|
|
216
|
+
|
|
217
|
+
if base_ring is None:
|
|
218
|
+
if data.is_simply_laced():
|
|
219
|
+
base_ring = ZZ
|
|
220
|
+
elif data.is_finite():
|
|
221
|
+
from sage.rings.number_field.number_field import QuadraticField
|
|
222
|
+
letter = data.coxeter_type().cartan_type().type()
|
|
223
|
+
if letter in ['B', 'C', 'F']:
|
|
224
|
+
base_ring = QuadraticField(2)
|
|
225
|
+
elif letter == 'G':
|
|
226
|
+
base_ring = QuadraticField(3)
|
|
227
|
+
elif letter == 'H':
|
|
228
|
+
base_ring = QuadraticField(5)
|
|
229
|
+
else:
|
|
230
|
+
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
|
|
231
|
+
base_ring = UniversalCyclotomicField()
|
|
232
|
+
else:
|
|
233
|
+
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
|
|
234
|
+
base_ring = UniversalCyclotomicField()
|
|
235
|
+
return super().__classcall__(cls, data, base_ring, data.index_set())
|
|
236
|
+
|
|
237
|
+
def __init__(self, coxeter_matrix, base_ring, index_set):
|
|
238
|
+
"""
|
|
239
|
+
Initialize ``self``.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: W = CoxeterGroup([[1,3,2],[3,1,3],[2,3,1]])
|
|
244
|
+
sage: TestSuite(W).run() # long time
|
|
245
|
+
|
|
246
|
+
sage: # long time, needs sage.rings.number_field sage.symbolic
|
|
247
|
+
sage: W = CoxeterGroup([[1,3,2],[3,1,4],[2,4,1]], base_ring=QQbar)
|
|
248
|
+
sage: TestSuite(W).run()
|
|
249
|
+
sage: W = CoxeterGroup([[1,3,2],[3,1,6],[2,6,1]])
|
|
250
|
+
sage: TestSuite(W).run(max_runs=30)
|
|
251
|
+
sage: W = CoxeterGroup([[1,3,2],[3,1,-1],[2,-1,1]])
|
|
252
|
+
sage: TestSuite(W).run(max_runs=30)
|
|
253
|
+
|
|
254
|
+
We check that :issue:`16630` is fixed::
|
|
255
|
+
|
|
256
|
+
sage: CoxeterGroup(['D',4], base_ring=QQ).category()
|
|
257
|
+
Category of finite irreducible Coxeter groups
|
|
258
|
+
|
|
259
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
260
|
+
sage: CoxeterGroup(['H',4], base_ring=QQbar).category()
|
|
261
|
+
Category of finite irreducible Coxeter groups
|
|
262
|
+
sage: F = CoxeterGroups().Finite()
|
|
263
|
+
sage: all(CoxeterGroup([letter,i]) in F
|
|
264
|
+
....: for i in range(2,5) for letter in ['A','B','D'])
|
|
265
|
+
True
|
|
266
|
+
sage: all(CoxeterGroup(['E',i]) in F for i in range(6,9))
|
|
267
|
+
True
|
|
268
|
+
sage: CoxeterGroup(['F',4]).category()
|
|
269
|
+
Category of finite irreducible Coxeter groups
|
|
270
|
+
sage: CoxeterGroup(['G',2]).category()
|
|
271
|
+
Category of finite irreducible Coxeter groups
|
|
272
|
+
sage: all(CoxeterGroup(['H',i]) in F for i in range(3,5))
|
|
273
|
+
True
|
|
274
|
+
sage: all(CoxeterGroup(['I',i]) in F for i in range(2,5))
|
|
275
|
+
True
|
|
276
|
+
"""
|
|
277
|
+
self._matrix = coxeter_matrix
|
|
278
|
+
n = coxeter_matrix.rank()
|
|
279
|
+
# Compute the matrix with entries `2 \cos( \pi / m_{ij} )`.
|
|
280
|
+
MS = MatrixSpace(base_ring, n, sparse=True)
|
|
281
|
+
one = MS.one()
|
|
282
|
+
# FIXME: Hack because there is no ZZ \cup \{ \infty \}: -1 represents \infty
|
|
283
|
+
if isinstance(base_ring, sage.rings.abc.UniversalCyclotomicField):
|
|
284
|
+
E = base_ring.gen
|
|
285
|
+
|
|
286
|
+
def val(x):
|
|
287
|
+
if x == -1:
|
|
288
|
+
return 2
|
|
289
|
+
else:
|
|
290
|
+
return E(2 * x) + ~E(2 * x)
|
|
291
|
+
elif isinstance(base_ring, sage.rings.abc.NumberField_quadratic):
|
|
292
|
+
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
|
|
293
|
+
|
|
294
|
+
E = UniversalCyclotomicField().gen
|
|
295
|
+
|
|
296
|
+
def val(x):
|
|
297
|
+
if x == -1:
|
|
298
|
+
return 2
|
|
299
|
+
else:
|
|
300
|
+
return base_ring((E(2 * x) + ~E(2 * x)).to_cyclotomic_field())
|
|
301
|
+
else:
|
|
302
|
+
def val(x):
|
|
303
|
+
if x == -1:
|
|
304
|
+
return 2
|
|
305
|
+
elif x == 1:
|
|
306
|
+
return -2
|
|
307
|
+
elif x == 2:
|
|
308
|
+
return 0
|
|
309
|
+
elif x == 3:
|
|
310
|
+
return 1
|
|
311
|
+
else:
|
|
312
|
+
from sage.functions.trig import cos
|
|
313
|
+
from sage.symbolic.constants import pi
|
|
314
|
+
return base_ring(2 * cos(pi / x))
|
|
315
|
+
gens = [one + MS([SparseEntry(i, j, val(coxeter_matrix[index_set[i], index_set[j]]))
|
|
316
|
+
for j in range(n)])
|
|
317
|
+
for i in range(n)]
|
|
318
|
+
# Make the generators dense matrices for consistency and speed
|
|
319
|
+
gens = [g.dense_matrix() for g in gens]
|
|
320
|
+
category = CoxeterGroups()
|
|
321
|
+
# Now we shall see if the group is finite, and, if so, refine
|
|
322
|
+
# the category to ``category.Finite()``. Otherwise the group is
|
|
323
|
+
# infinite and we refine the category to ``category.Infinite()``.
|
|
324
|
+
if self._matrix.is_finite():
|
|
325
|
+
category = category.Finite()
|
|
326
|
+
else:
|
|
327
|
+
category = category.Infinite()
|
|
328
|
+
if all(self._matrix._matrix[i, j] == 2
|
|
329
|
+
for i in range(n) for j in range(i)):
|
|
330
|
+
category = category.Commutative()
|
|
331
|
+
if self._matrix.is_irreducible():
|
|
332
|
+
category = category.Irreducible()
|
|
333
|
+
self._index_set_inverse = {i: ii
|
|
334
|
+
for ii, i in enumerate(self._matrix.index_set())}
|
|
335
|
+
FinitelyGeneratedMatrixGroup_generic.__init__(self, ZZ(n), base_ring,
|
|
336
|
+
gens, category=category)
|
|
337
|
+
|
|
338
|
+
def _repr_(self):
|
|
339
|
+
"""
|
|
340
|
+
Return a string representation of ``self``.
|
|
341
|
+
|
|
342
|
+
EXAMPLES::
|
|
343
|
+
|
|
344
|
+
sage: CoxeterGroup([[1,3,2],[3,1,4],[2,4,1]]) # needs sage.libs.gap sage.rings.number_field
|
|
345
|
+
Finite Coxeter group over Number Field in a with defining polynomial x^2 - 2 with a = 1.414213562373095? with Coxeter matrix:
|
|
346
|
+
[1 3 2]
|
|
347
|
+
[3 1 4]
|
|
348
|
+
[2 4 1]
|
|
349
|
+
"""
|
|
350
|
+
rep = "Finite " if self.is_finite() else ""
|
|
351
|
+
rep += "Coxeter group over {} with Coxeter matrix:\n{}".format(self.base_ring(), self._matrix)
|
|
352
|
+
return rep
|
|
353
|
+
|
|
354
|
+
def _coerce_map_from_(self, P):
|
|
355
|
+
"""
|
|
356
|
+
Return ``True`` if ``P`` is a Coxeter group of the same
|
|
357
|
+
Coxeter type and ``False`` otherwise.
|
|
358
|
+
|
|
359
|
+
EXAMPLES::
|
|
360
|
+
|
|
361
|
+
sage: # needs sage.combinat
|
|
362
|
+
sage: W = CoxeterGroup(["A",4])
|
|
363
|
+
sage: W2 = WeylGroup(["A",4])
|
|
364
|
+
sage: W._coerce_map_from_(W2)
|
|
365
|
+
True
|
|
366
|
+
sage: W3 = WeylGroup(["A",4], implementation='permutation')
|
|
367
|
+
sage: W._coerce_map_from_(W3)
|
|
368
|
+
True
|
|
369
|
+
sage: W4 = WeylGroup(["A",3])
|
|
370
|
+
sage: W.has_coerce_map_from(W4)
|
|
371
|
+
False
|
|
372
|
+
"""
|
|
373
|
+
if P in CoxeterGroups() and P.coxeter_type() is self.coxeter_type():
|
|
374
|
+
return True
|
|
375
|
+
return super()._coerce_map_from_(P)
|
|
376
|
+
|
|
377
|
+
def coxeter_matrix(self):
|
|
378
|
+
"""
|
|
379
|
+
Return the Coxeter matrix of ``self``.
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: W = CoxeterGroup([[1,3],[3,1]])
|
|
384
|
+
sage: W.coxeter_matrix()
|
|
385
|
+
[1 3]
|
|
386
|
+
[3 1]
|
|
387
|
+
sage: W = CoxeterGroup(['H',3]) # needs sage.libs.gap sage.rings.number_field
|
|
388
|
+
sage: W.coxeter_matrix() # needs sage.libs.gap sage.rings.number_field
|
|
389
|
+
[1 3 2]
|
|
390
|
+
[3 1 5]
|
|
391
|
+
[2 5 1]
|
|
392
|
+
"""
|
|
393
|
+
return self._matrix
|
|
394
|
+
|
|
395
|
+
def bilinear_form(self):
|
|
396
|
+
r"""
|
|
397
|
+
Return the bilinear form associated to ``self``.
|
|
398
|
+
|
|
399
|
+
Given a Coxeter group `G` with Coxeter matrix `M = (m_{ij})_{ij}`,
|
|
400
|
+
the associated bilinear form `A = (a_{ij})_{ij}` is given by
|
|
401
|
+
|
|
402
|
+
.. MATH::
|
|
403
|
+
|
|
404
|
+
a_{ij} = -\cos\left( \frac{\pi}{m_{ij}} \right).
|
|
405
|
+
|
|
406
|
+
If `A` is positive definite, then `G` is of finite type (and so
|
|
407
|
+
the associated Coxeter group is a finite group). If `A` is
|
|
408
|
+
positive semidefinite, then `G` is affine type.
|
|
409
|
+
|
|
410
|
+
EXAMPLES::
|
|
411
|
+
|
|
412
|
+
sage: W = CoxeterGroup(['D',4])
|
|
413
|
+
sage: W.bilinear_form() # needs sage.symbolic
|
|
414
|
+
[ 1 -1/2 0 0]
|
|
415
|
+
[-1/2 1 -1/2 -1/2]
|
|
416
|
+
[ 0 -1/2 1 0]
|
|
417
|
+
[ 0 -1/2 0 1]
|
|
418
|
+
"""
|
|
419
|
+
return self._matrix.bilinear_form(self.base_ring().fraction_field())
|
|
420
|
+
|
|
421
|
+
def is_finite(self):
|
|
422
|
+
"""
|
|
423
|
+
Return ``True`` if this group is finite.
|
|
424
|
+
|
|
425
|
+
EXAMPLES::
|
|
426
|
+
|
|
427
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
428
|
+
sage: [l for l in range(2, 9) if
|
|
429
|
+
....: CoxeterGroup([[1,3,2],[3,1,l],[2,l,1]]).is_finite()]
|
|
430
|
+
[2, 3, 4, 5]
|
|
431
|
+
sage: [l for l in range(2, 9) if
|
|
432
|
+
....: CoxeterGroup([[1,3,2,2],[3,1,l,2],[2,l,1,3],[2,2,3,1]]).is_finite()]
|
|
433
|
+
[2, 3, 4]
|
|
434
|
+
sage: [l for l in range(2, 9) if
|
|
435
|
+
....: CoxeterGroup([[1,3,2,2,2], [3,1,3,3,2], [2,3,1,2,2],
|
|
436
|
+
....: [2,3,2,1,l], [2,2,2,l,1]]).is_finite()]
|
|
437
|
+
[2, 3]
|
|
438
|
+
sage: [l for l in range(2, 9) if
|
|
439
|
+
....: CoxeterGroup([[1,3,2,2,2], [3,1,2,3,3], [2,2,1,l,2],
|
|
440
|
+
....: [2,3,l,1,2], [2,3,2,2,1]]).is_finite()]
|
|
441
|
+
[2, 3]
|
|
442
|
+
sage: [l for l in range(2, 9) if
|
|
443
|
+
....: CoxeterGroup([[1,3,2,2,2,2], [3,1,l,2,2,2], [2,l,1,3,l,2],
|
|
444
|
+
....: [2,2,3,1,2,2], [2,2,l,2,1,3], [2,2,2,2,3,1]]).is_finite()]
|
|
445
|
+
[2, 3]
|
|
446
|
+
"""
|
|
447
|
+
# Finite Coxeter groups are marked as finite in
|
|
448
|
+
# their ``__init__`` method, so we can just check
|
|
449
|
+
# the category of ``self``.
|
|
450
|
+
return "Finite" in self.category().axioms()
|
|
451
|
+
|
|
452
|
+
def is_commutative(self):
|
|
453
|
+
"""
|
|
454
|
+
Return whether ``self`` is commutative.
|
|
455
|
+
|
|
456
|
+
EXAMPLES::
|
|
457
|
+
|
|
458
|
+
sage: CoxeterGroup(['A', 2]).is_commutative()
|
|
459
|
+
False
|
|
460
|
+
sage: W = CoxeterGroup(['I',2])
|
|
461
|
+
sage: W.is_commutative()
|
|
462
|
+
True
|
|
463
|
+
|
|
464
|
+
TESTS::
|
|
465
|
+
|
|
466
|
+
sage: CoxeterGroup([['A', 2], ['A', 1]]).is_commutative()
|
|
467
|
+
False
|
|
468
|
+
sage: CoxeterGroup([['A', 1]] * 3).is_commutative()
|
|
469
|
+
True
|
|
470
|
+
"""
|
|
471
|
+
return "Commutative" in self.category().axioms()
|
|
472
|
+
|
|
473
|
+
@cached_method
|
|
474
|
+
def order(self):
|
|
475
|
+
"""
|
|
476
|
+
Return the order of ``self``.
|
|
477
|
+
|
|
478
|
+
If the Coxeter group is finite, this uses an iterator.
|
|
479
|
+
|
|
480
|
+
EXAMPLES::
|
|
481
|
+
|
|
482
|
+
sage: # needs sage.rings.number_field
|
|
483
|
+
sage: W = CoxeterGroup([[1,3],[3,1]])
|
|
484
|
+
sage: W.order()
|
|
485
|
+
6
|
|
486
|
+
sage: W = CoxeterGroup([[1,-1],[-1,1]]) # needs sage.libs.gap
|
|
487
|
+
sage: W.order() # needs sage.libs.gap
|
|
488
|
+
+Infinity
|
|
489
|
+
"""
|
|
490
|
+
if self.is_finite():
|
|
491
|
+
return len(self)
|
|
492
|
+
return infinity
|
|
493
|
+
|
|
494
|
+
def canonical_representation(self):
|
|
495
|
+
r"""
|
|
496
|
+
Return the canonical faithful representation of ``self``, which
|
|
497
|
+
is ``self``.
|
|
498
|
+
|
|
499
|
+
EXAMPLES::
|
|
500
|
+
|
|
501
|
+
sage: W = CoxeterGroup([[1,3],[3,1]])
|
|
502
|
+
sage: W.canonical_representation() is W
|
|
503
|
+
True
|
|
504
|
+
"""
|
|
505
|
+
return self
|
|
506
|
+
|
|
507
|
+
def simple_reflection(self, i):
|
|
508
|
+
"""
|
|
509
|
+
Return the simple reflection `s_i`.
|
|
510
|
+
|
|
511
|
+
INPUT:
|
|
512
|
+
|
|
513
|
+
- ``i`` -- an element from the index set
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
518
|
+
sage: W.simple_reflection(1)
|
|
519
|
+
[-1 1 0]
|
|
520
|
+
[ 0 1 0]
|
|
521
|
+
[ 0 0 1]
|
|
522
|
+
sage: W.simple_reflection(2)
|
|
523
|
+
[ 1 0 0]
|
|
524
|
+
[ 1 -1 1]
|
|
525
|
+
[ 0 0 1]
|
|
526
|
+
sage: W.simple_reflection(3)
|
|
527
|
+
[ 1 0 0]
|
|
528
|
+
[ 0 1 0]
|
|
529
|
+
[ 0 1 -1]
|
|
530
|
+
"""
|
|
531
|
+
return self.gen(self._index_set_inverse[i])
|
|
532
|
+
|
|
533
|
+
@cached_method
|
|
534
|
+
def _positive_roots_reflections(self):
|
|
535
|
+
"""
|
|
536
|
+
Return a family whose keys are the positive roots
|
|
537
|
+
and values are the reflections.
|
|
538
|
+
|
|
539
|
+
EXAMPLES::
|
|
540
|
+
|
|
541
|
+
sage: W = CoxeterGroup(['A', 2])
|
|
542
|
+
sage: F = W._positive_roots_reflections()
|
|
543
|
+
sage: F.keys()
|
|
544
|
+
[(1, 0), (1, 1), (0, 1)]
|
|
545
|
+
sage: list(F)
|
|
546
|
+
[
|
|
547
|
+
[-1 1] [ 0 -1] [ 1 0]
|
|
548
|
+
[ 0 1], [-1 0], [ 1 -1]
|
|
549
|
+
]
|
|
550
|
+
|
|
551
|
+
TESTS::
|
|
552
|
+
|
|
553
|
+
sage: W = CoxeterGroup(CoxeterType(['A', 2]).relabel({1: 'r', 2: 's'}))
|
|
554
|
+
sage: F = W._positive_roots_reflections()
|
|
555
|
+
sage: F.keys()
|
|
556
|
+
[(1, 0), (1, 1), (0, 1)]
|
|
557
|
+
sage: list(F)
|
|
558
|
+
[
|
|
559
|
+
[-1 1] [ 0 -1] [ 1 0]
|
|
560
|
+
[ 0 1], [-1 0], [ 1 -1]
|
|
561
|
+
]
|
|
562
|
+
"""
|
|
563
|
+
if not self.is_finite():
|
|
564
|
+
raise NotImplementedError('not available for infinite groups')
|
|
565
|
+
|
|
566
|
+
word = self.long_element(as_word=True)
|
|
567
|
+
N = len(word)
|
|
568
|
+
|
|
569
|
+
from sage.modules.free_module import FreeModule
|
|
570
|
+
simple_roots = FreeModule(self.base_ring(), self.ngens()).gens()
|
|
571
|
+
|
|
572
|
+
refls = self.simple_reflections()
|
|
573
|
+
refls_index = {refl_i[1]: refl_i[0] for refl_i in enumerate(refls.keys())}
|
|
574
|
+
resu = []
|
|
575
|
+
d = {}
|
|
576
|
+
for i in range(1, N + 1):
|
|
577
|
+
segment = word[:i]
|
|
578
|
+
last = segment.pop()
|
|
579
|
+
ref = refls[last]
|
|
580
|
+
rt = simple_roots[refls_index[last]]
|
|
581
|
+
while segment:
|
|
582
|
+
last = segment.pop()
|
|
583
|
+
cr = refls[last]
|
|
584
|
+
ref = cr * ref * cr
|
|
585
|
+
rt = refls[last] * rt
|
|
586
|
+
rt.set_immutable()
|
|
587
|
+
resu += [rt]
|
|
588
|
+
d[rt] = ref
|
|
589
|
+
return Family(resu, lambda rt: d[rt])
|
|
590
|
+
|
|
591
|
+
def positive_roots(self):
|
|
592
|
+
"""
|
|
593
|
+
Return the positive roots.
|
|
594
|
+
|
|
595
|
+
These are roots in the Coxeter sense, that all have the
|
|
596
|
+
same norm. They are given by their coefficients in the
|
|
597
|
+
base of simple roots, also taken to have all the same
|
|
598
|
+
norm.
|
|
599
|
+
|
|
600
|
+
.. SEEALSO::
|
|
601
|
+
|
|
602
|
+
:meth:`reflections`
|
|
603
|
+
|
|
604
|
+
EXAMPLES::
|
|
605
|
+
|
|
606
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
607
|
+
sage: W.positive_roots()
|
|
608
|
+
((1, 0, 0), (1, 1, 0), (0, 1, 0), (1, 1, 1), (0, 1, 1), (0, 0, 1))
|
|
609
|
+
|
|
610
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
611
|
+
sage: W = CoxeterGroup(['I',5], implementation='reflection')
|
|
612
|
+
sage: W.positive_roots()
|
|
613
|
+
((1, 0),
|
|
614
|
+
(-E(5)^2 - E(5)^3, 1),
|
|
615
|
+
(-E(5)^2 - E(5)^3, -E(5)^2 - E(5)^3),
|
|
616
|
+
(1, -E(5)^2 - E(5)^3),
|
|
617
|
+
(0, 1))
|
|
618
|
+
"""
|
|
619
|
+
return tuple(self._positive_roots_reflections().keys())
|
|
620
|
+
|
|
621
|
+
def reflections(self):
|
|
622
|
+
"""
|
|
623
|
+
Return the set of reflections.
|
|
624
|
+
|
|
625
|
+
The order is the one given by :meth:`positive_roots`.
|
|
626
|
+
|
|
627
|
+
EXAMPLES::
|
|
628
|
+
|
|
629
|
+
sage: W = CoxeterGroup(['A',2], implementation='reflection')
|
|
630
|
+
sage: list(W.reflections())
|
|
631
|
+
[
|
|
632
|
+
[-1 1] [ 0 -1] [ 1 0]
|
|
633
|
+
[ 0 1], [-1 0], [ 1 -1]
|
|
634
|
+
]
|
|
635
|
+
"""
|
|
636
|
+
return self._positive_roots_reflections()
|
|
637
|
+
|
|
638
|
+
@cached_method
|
|
639
|
+
def roots(self):
|
|
640
|
+
"""
|
|
641
|
+
Return the roots.
|
|
642
|
+
|
|
643
|
+
These are roots in the Coxeter sense, that all have the
|
|
644
|
+
same norm. They are given by their coefficients in the
|
|
645
|
+
base of simple roots, also taken to have all the same
|
|
646
|
+
norm.
|
|
647
|
+
|
|
648
|
+
The positive roots are listed first, then the negative roots
|
|
649
|
+
in the same order. The order is the one given by :meth:`roots`.
|
|
650
|
+
|
|
651
|
+
EXAMPLES::
|
|
652
|
+
|
|
653
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
654
|
+
sage: W.roots()
|
|
655
|
+
((1, 0, 0),
|
|
656
|
+
(1, 1, 0),
|
|
657
|
+
(0, 1, 0),
|
|
658
|
+
(1, 1, 1),
|
|
659
|
+
(0, 1, 1),
|
|
660
|
+
(0, 0, 1),
|
|
661
|
+
(-1, 0, 0),
|
|
662
|
+
(-1, -1, 0),
|
|
663
|
+
(0, -1, 0),
|
|
664
|
+
(-1, -1, -1),
|
|
665
|
+
(0, -1, -1),
|
|
666
|
+
(0, 0, -1))
|
|
667
|
+
|
|
668
|
+
sage: # needs sage.libs.gap sage.rings.number_field
|
|
669
|
+
sage: W = CoxeterGroup(['I',5], implementation='reflection')
|
|
670
|
+
sage: len(W.roots())
|
|
671
|
+
10
|
|
672
|
+
"""
|
|
673
|
+
if not self.is_finite():
|
|
674
|
+
raise NotImplementedError('not available for infinite groups')
|
|
675
|
+
positive = self.positive_roots()
|
|
676
|
+
return positive + tuple([-v for v in positive])
|
|
677
|
+
|
|
678
|
+
def simple_root_index(self, i):
|
|
679
|
+
r"""
|
|
680
|
+
Return the index of the simple root `\alpha_i`.
|
|
681
|
+
|
|
682
|
+
This is the position of `\alpha_i` in the list of all roots
|
|
683
|
+
as given be :meth:`roots`.
|
|
684
|
+
|
|
685
|
+
EXAMPLES::
|
|
686
|
+
|
|
687
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
688
|
+
sage: [W.simple_root_index(i) for i in W.index_set()]
|
|
689
|
+
[0, 2, 5]
|
|
690
|
+
"""
|
|
691
|
+
roots = self.roots()
|
|
692
|
+
rt = roots[0].parent().gen(self._index_set_inverse[i])
|
|
693
|
+
return roots.index(rt)
|
|
694
|
+
|
|
695
|
+
@cached_method
|
|
696
|
+
def fundamental_weights(self):
|
|
697
|
+
"""
|
|
698
|
+
Return the fundamental weights for ``self``.
|
|
699
|
+
|
|
700
|
+
This is the dual basis to the basis of simple roots.
|
|
701
|
+
|
|
702
|
+
The base ring must be a field.
|
|
703
|
+
|
|
704
|
+
.. SEEALSO:: :meth:`fundamental_weight`
|
|
705
|
+
|
|
706
|
+
EXAMPLES::
|
|
707
|
+
|
|
708
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
709
|
+
sage: W.fundamental_weights() # needs sage.symbolic
|
|
710
|
+
Finite family {1: (3/2, 1, 1/2), 2: (1, 2, 1), 3: (1/2, 1, 3/2)}
|
|
711
|
+
"""
|
|
712
|
+
simple_weights = self.bilinear_form().inverse()
|
|
713
|
+
I = self.index_set()
|
|
714
|
+
D = {i: simple_weights[k] for k, i in enumerate(I)}
|
|
715
|
+
return Family(I, D.__getitem__)
|
|
716
|
+
|
|
717
|
+
def fundamental_weight(self, i):
|
|
718
|
+
r"""
|
|
719
|
+
Return the fundamental weight with index ``i``.
|
|
720
|
+
|
|
721
|
+
.. SEEALSO:: :meth:`fundamental_weights`
|
|
722
|
+
|
|
723
|
+
EXAMPLES::
|
|
724
|
+
|
|
725
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
726
|
+
sage: W.fundamental_weight(1) # needs sage.symbolic
|
|
727
|
+
(3/2, 1, 1/2)
|
|
728
|
+
"""
|
|
729
|
+
return self.fundamental_weights()[i]
|
|
730
|
+
|
|
731
|
+
class Element(MatrixGroupElement_generic):
|
|
732
|
+
"""
|
|
733
|
+
A Coxeter group element.
|
|
734
|
+
"""
|
|
735
|
+
def first_descent(self, side='right', index_set=None, positive=False):
|
|
736
|
+
"""
|
|
737
|
+
Return the first left (resp. right) descent of ``self``, as
|
|
738
|
+
an element of ``index_set``, or ``None`` if there is none.
|
|
739
|
+
|
|
740
|
+
See :meth:`descents` for a description of the options.
|
|
741
|
+
|
|
742
|
+
EXAMPLES::
|
|
743
|
+
|
|
744
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
745
|
+
sage: a,b,c = W.gens()
|
|
746
|
+
sage: elt = b*a*c
|
|
747
|
+
sage: elt.first_descent()
|
|
748
|
+
1
|
|
749
|
+
sage: elt.first_descent(side='left')
|
|
750
|
+
2
|
|
751
|
+
"""
|
|
752
|
+
M = self.matrix()
|
|
753
|
+
if side != 'right':
|
|
754
|
+
M = ~M
|
|
755
|
+
I = self.parent().index_set()
|
|
756
|
+
n = len(I)
|
|
757
|
+
zero = M.base_ring().zero()
|
|
758
|
+
if index_set is None:
|
|
759
|
+
index_set = range(n)
|
|
760
|
+
else:
|
|
761
|
+
I_inv = self.parent()._index_set_inverse
|
|
762
|
+
index_set = [I_inv[i] for i in index_set]
|
|
763
|
+
if positive:
|
|
764
|
+
for i in index_set:
|
|
765
|
+
if not _matrix_test_right_descent(M, i, n, zero):
|
|
766
|
+
return I[i]
|
|
767
|
+
else:
|
|
768
|
+
for i in index_set:
|
|
769
|
+
if _matrix_test_right_descent(M, i, n, zero):
|
|
770
|
+
return I[i]
|
|
771
|
+
return None
|
|
772
|
+
|
|
773
|
+
def descents(self, side='right', index_set=None, positive=False):
|
|
774
|
+
"""
|
|
775
|
+
Return the descents of ``self``, as a list of elements of the
|
|
776
|
+
``index_set``.
|
|
777
|
+
|
|
778
|
+
INPUT:
|
|
779
|
+
|
|
780
|
+
- ``index_set`` -- (default: all of them) a subset (as a list
|
|
781
|
+
or iterable) of the nodes of the Dynkin diagram
|
|
782
|
+
- ``side`` -- (default: ``'right'``) ``'left'`` or ``'right'``
|
|
783
|
+
- ``positive`` -- boolean (default: ``False``)
|
|
784
|
+
|
|
785
|
+
EXAMPLES::
|
|
786
|
+
|
|
787
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
788
|
+
sage: a,b,c = W.gens()
|
|
789
|
+
sage: elt = b*a*c
|
|
790
|
+
sage: elt.descents()
|
|
791
|
+
[1, 3]
|
|
792
|
+
sage: elt.descents(positive=True)
|
|
793
|
+
[2]
|
|
794
|
+
sage: elt.descents(index_set=[1,2])
|
|
795
|
+
[1]
|
|
796
|
+
sage: elt.descents(side='left')
|
|
797
|
+
[2]
|
|
798
|
+
"""
|
|
799
|
+
M = self.matrix()
|
|
800
|
+
if side != 'right':
|
|
801
|
+
M = ~M
|
|
802
|
+
I = self.parent().index_set()
|
|
803
|
+
n = len(I)
|
|
804
|
+
zero = M.base_ring().zero()
|
|
805
|
+
if index_set is None:
|
|
806
|
+
index_set = range(n)
|
|
807
|
+
else:
|
|
808
|
+
I_inv = self.parent()._index_set_inverse
|
|
809
|
+
index_set = [I_inv[i] for i in index_set]
|
|
810
|
+
if positive:
|
|
811
|
+
return [I[i] for i in index_set if not _matrix_test_right_descent(M, i, n, zero)]
|
|
812
|
+
return [I[i] for i in index_set if _matrix_test_right_descent(M, i, n, zero)]
|
|
813
|
+
|
|
814
|
+
def has_right_descent(self, i) -> bool:
|
|
815
|
+
r"""
|
|
816
|
+
Return whether ``i`` is a right descent of ``self``.
|
|
817
|
+
|
|
818
|
+
A Coxeter system `(W, S)` has a root system defined as
|
|
819
|
+
`\{ w(\alpha_s) \}_{w \in W}` and we define the positive
|
|
820
|
+
(resp. negative) roots `\alpha = \sum_{s \in S} c_s \alpha_s`
|
|
821
|
+
by all `c_s \geq 0` (resp. `c_s \leq 0`). In particular, we note
|
|
822
|
+
that if `\ell(w s) > \ell(w)` then `w(\alpha_s) > 0` and if
|
|
823
|
+
`\ell(ws) < \ell(w)` then `w(\alpha_s) < 0`.
|
|
824
|
+
Thus `i \in I` is a right descent if `w(\alpha_{s_i}) < 0`
|
|
825
|
+
or equivalently if the matrix representing `w` has all entries
|
|
826
|
+
of the `i`-th column being nonpositive.
|
|
827
|
+
|
|
828
|
+
INPUT:
|
|
829
|
+
|
|
830
|
+
- ``i`` -- an element in the index set
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
835
|
+
sage: a,b,c = W.gens()
|
|
836
|
+
sage: elt = b*a*c
|
|
837
|
+
sage: [elt.has_right_descent(i) for i in [1, 2, 3]]
|
|
838
|
+
[True, False, True]
|
|
839
|
+
"""
|
|
840
|
+
i = self.parent()._index_set_inverse[i]
|
|
841
|
+
n = len(self.parent().index_set())
|
|
842
|
+
M = self.matrix()
|
|
843
|
+
zero = M.base_ring().zero()
|
|
844
|
+
return _matrix_test_right_descent(M, i, n, zero)
|
|
845
|
+
|
|
846
|
+
def canonical_matrix(self):
|
|
847
|
+
r"""
|
|
848
|
+
Return the matrix of ``self`` in the canonical faithful
|
|
849
|
+
representation, which is ``self`` as a matrix.
|
|
850
|
+
|
|
851
|
+
EXAMPLES::
|
|
852
|
+
|
|
853
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
854
|
+
sage: a,b,c = W.gens()
|
|
855
|
+
sage: elt = a*b*c
|
|
856
|
+
sage: elt.canonical_matrix()
|
|
857
|
+
[ 0 0 -1]
|
|
858
|
+
[ 1 0 -1]
|
|
859
|
+
[ 0 1 -1]
|
|
860
|
+
"""
|
|
861
|
+
return self.matrix()
|
|
862
|
+
|
|
863
|
+
@cached_method
|
|
864
|
+
def action_on_root_indices(self, i, side='left'):
|
|
865
|
+
"""
|
|
866
|
+
Return the action on the set of roots.
|
|
867
|
+
|
|
868
|
+
The roots are ordered as in the output of the method :meth:`roots`.
|
|
869
|
+
|
|
870
|
+
EXAMPLES::
|
|
871
|
+
|
|
872
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
873
|
+
sage: w = W.w0
|
|
874
|
+
sage: w.action_on_root_indices(0)
|
|
875
|
+
11
|
|
876
|
+
"""
|
|
877
|
+
if side == "left":
|
|
878
|
+
w = self
|
|
879
|
+
elif side == "right":
|
|
880
|
+
w = ~self
|
|
881
|
+
else:
|
|
882
|
+
raise ValueError('side must be "left" or "right"')
|
|
883
|
+
roots = self.parent().roots()
|
|
884
|
+
rt = w * roots[i]
|
|
885
|
+
return roots.index(rt)
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def _matrix_test_right_descent(M, i, n, zero):
|
|
889
|
+
"""
|
|
890
|
+
Test if the matrix ``M`` has a right ``i``-descent.
|
|
891
|
+
|
|
892
|
+
INPUT:
|
|
893
|
+
|
|
894
|
+
- ``M`` -- the matrix
|
|
895
|
+
- ``i`` -- the index
|
|
896
|
+
- ``n`` -- the size of the matrix
|
|
897
|
+
- ``zero`` -- the zero element in the base ring of ``M``
|
|
898
|
+
|
|
899
|
+
.. NOTE::
|
|
900
|
+
|
|
901
|
+
This is a helper function for :class:`CoxeterMatrixGroup.Element`
|
|
902
|
+
and optimized for speed. Specifically, it is called often and
|
|
903
|
+
there is no need to recompute ``n`` (and ``zero``) each time this
|
|
904
|
+
function is called.
|
|
905
|
+
|
|
906
|
+
.. TODO::
|
|
907
|
+
|
|
908
|
+
Cythonize this function.
|
|
909
|
+
|
|
910
|
+
EXAMPLES::
|
|
911
|
+
|
|
912
|
+
sage: from sage.groups.matrix_gps.coxeter_group import _matrix_test_right_descent
|
|
913
|
+
sage: W = CoxeterGroup(['A',3], implementation='reflection')
|
|
914
|
+
sage: a,b,c = W.gens()
|
|
915
|
+
sage: elt = b*a*c
|
|
916
|
+
sage: zero = W.base_ring().zero()
|
|
917
|
+
sage: [_matrix_test_right_descent(elt.matrix(), i, 3, zero)
|
|
918
|
+
....: for i in range(3)]
|
|
919
|
+
[True, False, True]
|
|
920
|
+
"""
|
|
921
|
+
for j in range(n):
|
|
922
|
+
c = M[j, i]
|
|
923
|
+
if c < zero:
|
|
924
|
+
return True
|
|
925
|
+
elif c > zero:
|
|
926
|
+
return False
|
|
927
|
+
raise AssertionError('a zero column, so there must be a bug')
|