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,1261 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.graphs
|
|
3
|
+
"""
|
|
4
|
+
Coxeter matrices
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
8
|
+
# 2015 Travis Scrimshaw <tscrim at ucdavis.edu>
|
|
9
|
+
# 2015 Jean-Philippe Labbe <labbe at math.huji.ac.il>
|
|
10
|
+
#
|
|
11
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
12
|
+
#
|
|
13
|
+
# This code is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
16
|
+
# General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# The full text of the GPL is available at:
|
|
19
|
+
#
|
|
20
|
+
# https://www.gnu.org/licenses/
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
|
|
23
|
+
from sage.misc.cachefunc import cached_method
|
|
24
|
+
from sage.matrix.constructor import matrix
|
|
25
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
26
|
+
from sage.misc.classcall_metaclass import ClasscallMetaclass, typecall
|
|
27
|
+
from sage.misc.lazy_import import lazy_import
|
|
28
|
+
from sage.matrix.matrix_generic_dense import Matrix_generic_dense
|
|
29
|
+
from sage.rings.integer_ring import ZZ
|
|
30
|
+
from sage.rings.rational_field import QQ
|
|
31
|
+
from sage.rings.real_mpfr import RR
|
|
32
|
+
from sage.rings.infinity import infinity
|
|
33
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
|
34
|
+
from sage.combinat.root_system.coxeter_type import CoxeterType
|
|
35
|
+
|
|
36
|
+
lazy_import('sage.graphs.graph', 'Graph')
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CoxeterMatrix(CoxeterType, metaclass=ClasscallMetaclass):
|
|
40
|
+
r"""
|
|
41
|
+
A Coxeter matrix.
|
|
42
|
+
|
|
43
|
+
A Coxeter matrix `M = (m_{ij})_{i,j \in I}` is a matrix encoding
|
|
44
|
+
a Coxeter system `(W, S)`, where the relations are given by
|
|
45
|
+
`(s_i s_j)^{m_{ij}}`. Thus `M` is symmetric and has entries
|
|
46
|
+
in `\{1, 2, 3, \ldots, \infty\}` with `m_{ij} = 1` if and only
|
|
47
|
+
if `i = j`.
|
|
48
|
+
|
|
49
|
+
We represent `m_{ij} = \infty` by any number `m_{ij} \leq -1`. In
|
|
50
|
+
particular, we can construct a bilinear form `B = (b_{ij})_{i,j \in I}`
|
|
51
|
+
from `M` by
|
|
52
|
+
|
|
53
|
+
.. MATH::
|
|
54
|
+
|
|
55
|
+
b_{ij} = \begin{cases}
|
|
56
|
+
m_{ij} & m_{ij} < 0\ (\text{i.e., } m_{ij} = \infty), \\
|
|
57
|
+
-\cos\left( \frac{\pi}{m_{ij}} \right) & \text{otherwise}.
|
|
58
|
+
\end{cases}
|
|
59
|
+
|
|
60
|
+
EXAMPLES::
|
|
61
|
+
|
|
62
|
+
sage: CoxeterMatrix(['A', 4])
|
|
63
|
+
[1 3 2 2]
|
|
64
|
+
[3 1 3 2]
|
|
65
|
+
[2 3 1 3]
|
|
66
|
+
[2 2 3 1]
|
|
67
|
+
sage: CoxeterMatrix(['B', 4])
|
|
68
|
+
[1 3 2 2]
|
|
69
|
+
[3 1 3 2]
|
|
70
|
+
[2 3 1 4]
|
|
71
|
+
[2 2 4 1]
|
|
72
|
+
sage: CoxeterMatrix(['C', 4])
|
|
73
|
+
[1 3 2 2]
|
|
74
|
+
[3 1 3 2]
|
|
75
|
+
[2 3 1 4]
|
|
76
|
+
[2 2 4 1]
|
|
77
|
+
sage: CoxeterMatrix(['D', 4])
|
|
78
|
+
[1 3 2 2]
|
|
79
|
+
[3 1 3 3]
|
|
80
|
+
[2 3 1 2]
|
|
81
|
+
[2 3 2 1]
|
|
82
|
+
|
|
83
|
+
sage: CoxeterMatrix(['E', 6])
|
|
84
|
+
[1 2 3 2 2 2]
|
|
85
|
+
[2 1 2 3 2 2]
|
|
86
|
+
[3 2 1 3 2 2]
|
|
87
|
+
[2 3 3 1 3 2]
|
|
88
|
+
[2 2 2 3 1 3]
|
|
89
|
+
[2 2 2 2 3 1]
|
|
90
|
+
|
|
91
|
+
sage: CoxeterMatrix(['F', 4])
|
|
92
|
+
[1 3 2 2]
|
|
93
|
+
[3 1 4 2]
|
|
94
|
+
[2 4 1 3]
|
|
95
|
+
[2 2 3 1]
|
|
96
|
+
|
|
97
|
+
sage: CoxeterMatrix(['G', 2])
|
|
98
|
+
[1 6]
|
|
99
|
+
[6 1]
|
|
100
|
+
|
|
101
|
+
By default, entries representing `\infty` are given by `-1`
|
|
102
|
+
in the Coxeter matrix::
|
|
103
|
+
|
|
104
|
+
sage: G = Graph([(0,1,None), (1,2,4), (0,2,oo)])
|
|
105
|
+
sage: CoxeterMatrix(G)
|
|
106
|
+
[ 1 3 -1]
|
|
107
|
+
[ 3 1 4]
|
|
108
|
+
[-1 4 1]
|
|
109
|
+
|
|
110
|
+
It is possible to give a number `\leq -1` to represent an infinite label::
|
|
111
|
+
|
|
112
|
+
sage: CoxeterMatrix([[1,-1],[-1,1]])
|
|
113
|
+
[ 1 -1]
|
|
114
|
+
[-1 1]
|
|
115
|
+
sage: CoxeterMatrix([[1,-3/2],[-3/2,1]])
|
|
116
|
+
[ 1 -3/2]
|
|
117
|
+
[-3/2 1]
|
|
118
|
+
"""
|
|
119
|
+
@staticmethod
|
|
120
|
+
def __classcall_private__(cls, data=None, index_set=None, coxeter_type=None,
|
|
121
|
+
cartan_type=None, coxeter_type_check=True):
|
|
122
|
+
r"""
|
|
123
|
+
A Coxeter matrix can we created via a graph, a Coxeter type, or
|
|
124
|
+
a matrix.
|
|
125
|
+
|
|
126
|
+
.. NOTE::
|
|
127
|
+
|
|
128
|
+
To disable the Coxeter type check, use the optional argument
|
|
129
|
+
``coxeter_type_check = False``.
|
|
130
|
+
|
|
131
|
+
EXAMPLES::
|
|
132
|
+
|
|
133
|
+
sage: C = CoxeterMatrix(['A',1,1],['a','b'])
|
|
134
|
+
sage: C2 = CoxeterMatrix([[1, -1], [-1, 1]])
|
|
135
|
+
sage: C3 = CoxeterMatrix(matrix([[1, -1], [-1, 1]]), [0, 1])
|
|
136
|
+
sage: C == C2 and C == C3
|
|
137
|
+
True
|
|
138
|
+
|
|
139
|
+
Check with `\infty` because of the hack of using `-1` to represent
|
|
140
|
+
`\infty` in the Coxeter matrix::
|
|
141
|
+
|
|
142
|
+
sage: G = Graph([(0, 1, 3), (1, 2, oo)])
|
|
143
|
+
sage: W1 = CoxeterMatrix([[1, 3, 2], [3, 1, -1], [2, -1, 1]])
|
|
144
|
+
sage: W2 = CoxeterMatrix(G)
|
|
145
|
+
sage: W1 == W2
|
|
146
|
+
True
|
|
147
|
+
sage: CoxeterMatrix(W1.coxeter_graph()) == W1
|
|
148
|
+
True
|
|
149
|
+
|
|
150
|
+
The base ring of the matrix depends on the entries given::
|
|
151
|
+
|
|
152
|
+
sage: CoxeterMatrix([[1,-1],[-1,1]])._matrix.base_ring()
|
|
153
|
+
Integer Ring
|
|
154
|
+
sage: CoxeterMatrix([[1,-3/2],[-3/2,1]])._matrix.base_ring()
|
|
155
|
+
Rational Field
|
|
156
|
+
sage: CoxeterMatrix([[1,-1.5],[-1.5,1]])._matrix.base_ring()
|
|
157
|
+
Real Field with 53 bits of precision
|
|
158
|
+
"""
|
|
159
|
+
if not data:
|
|
160
|
+
if coxeter_type:
|
|
161
|
+
data = CoxeterType(coxeter_type)
|
|
162
|
+
elif cartan_type:
|
|
163
|
+
data = CoxeterType(CartanType(cartan_type))
|
|
164
|
+
|
|
165
|
+
# Special cases with no arguments passed
|
|
166
|
+
if not data:
|
|
167
|
+
data = []
|
|
168
|
+
n = 0
|
|
169
|
+
index_set = tuple()
|
|
170
|
+
coxeter_type = None
|
|
171
|
+
base_ring = ZZ
|
|
172
|
+
mat = typecall(cls, MatrixSpace(base_ring, n, sparse=False), data, coxeter_type, index_set)
|
|
173
|
+
mat._subdivisions = None
|
|
174
|
+
|
|
175
|
+
return mat
|
|
176
|
+
|
|
177
|
+
if isinstance(data, CoxeterMatrix): # Initiate from itself
|
|
178
|
+
return data
|
|
179
|
+
|
|
180
|
+
# Initiate from a graph:
|
|
181
|
+
# TODO: Check if a CoxeterDiagram once implemented
|
|
182
|
+
if isinstance(data, Graph):
|
|
183
|
+
return cls._from_graph(data, coxeter_type_check)
|
|
184
|
+
|
|
185
|
+
# Get the Coxeter type
|
|
186
|
+
coxeter_type = None
|
|
187
|
+
from sage.combinat.root_system.cartan_type import CartanType_abstract
|
|
188
|
+
if isinstance(data, CartanType_abstract):
|
|
189
|
+
coxeter_type = data.coxeter_type()
|
|
190
|
+
else:
|
|
191
|
+
try:
|
|
192
|
+
coxeter_type = CoxeterType(data)
|
|
193
|
+
except (TypeError, ValueError, NotImplementedError):
|
|
194
|
+
pass
|
|
195
|
+
|
|
196
|
+
# Initiate from a Coxeter type
|
|
197
|
+
if coxeter_type:
|
|
198
|
+
return cls._from_coxetertype(coxeter_type)
|
|
199
|
+
|
|
200
|
+
# TODO:: remove when oo is possible in matrices.
|
|
201
|
+
n = len(data[0])
|
|
202
|
+
data = [x if x != infinity else -1 for r in data for x in r]
|
|
203
|
+
data = matrix(n, n, data)
|
|
204
|
+
# until here
|
|
205
|
+
|
|
206
|
+
# Get the index set
|
|
207
|
+
if index_set:
|
|
208
|
+
index_set = tuple(index_set)
|
|
209
|
+
else:
|
|
210
|
+
index_set = tuple(range(1, n + 1))
|
|
211
|
+
if len(set(index_set)) != n:
|
|
212
|
+
raise ValueError("the given index set is not valid")
|
|
213
|
+
|
|
214
|
+
return cls._from_matrix(data, coxeter_type, index_set, coxeter_type_check)
|
|
215
|
+
|
|
216
|
+
def __init__(self, parent, data, coxeter_type, index_set):
|
|
217
|
+
"""
|
|
218
|
+
Initialize ``self``.
|
|
219
|
+
|
|
220
|
+
TESTS::
|
|
221
|
+
|
|
222
|
+
sage: C = CoxeterMatrix(['A', 2, 1])
|
|
223
|
+
sage: TestSuite(C).run(skip=["_test_category", "_test_change_ring"])
|
|
224
|
+
"""
|
|
225
|
+
self._matrix = Matrix_generic_dense(parent, data, False, True)
|
|
226
|
+
self._matrix.set_immutable()
|
|
227
|
+
|
|
228
|
+
if self._matrix.base_ring() not in [ZZ, QQ]:
|
|
229
|
+
self._is_cyclotomic = False
|
|
230
|
+
else:
|
|
231
|
+
self._is_cyclotomic = True
|
|
232
|
+
self._coxeter_type = coxeter_type
|
|
233
|
+
|
|
234
|
+
if self._coxeter_type is not None:
|
|
235
|
+
if self._coxeter_type.is_finite():
|
|
236
|
+
self._is_finite = True
|
|
237
|
+
self._is_affine = False
|
|
238
|
+
elif self._coxeter_type.is_affine():
|
|
239
|
+
self._is_finite = False
|
|
240
|
+
self._is_affine = True
|
|
241
|
+
else:
|
|
242
|
+
self._is_finite = False
|
|
243
|
+
self._is_affine = False
|
|
244
|
+
else:
|
|
245
|
+
self._is_finite = False
|
|
246
|
+
self._is_affine = False
|
|
247
|
+
|
|
248
|
+
self._index_set = index_set
|
|
249
|
+
self._rank = self._matrix.nrows()
|
|
250
|
+
|
|
251
|
+
self._dict = {(self._index_set[i], self._index_set[j]): self._matrix[i, j]
|
|
252
|
+
for i in range(self._rank) for j in range(self._rank)}
|
|
253
|
+
|
|
254
|
+
for i, key in enumerate(self._index_set):
|
|
255
|
+
self._dict[key] = {key2: self._matrix[i, j]
|
|
256
|
+
for j, key2 in enumerate(self._index_set)}
|
|
257
|
+
|
|
258
|
+
@classmethod
|
|
259
|
+
def _from_matrix(cls, data, coxeter_type, index_set, coxeter_type_check):
|
|
260
|
+
"""
|
|
261
|
+
Initiate the Coxeter matrix from a matrix.
|
|
262
|
+
|
|
263
|
+
TESTS::
|
|
264
|
+
|
|
265
|
+
sage: CM = CoxeterMatrix([[1,2],[2,1]]); CM
|
|
266
|
+
[1 2]
|
|
267
|
+
[2 1]
|
|
268
|
+
sage: CM = CoxeterMatrix([[1,-1],[-1,1]]); CM
|
|
269
|
+
[ 1 -1]
|
|
270
|
+
[-1 1]
|
|
271
|
+
sage: CM = CoxeterMatrix([[1,-1.5],[-1.5,1]]); CM
|
|
272
|
+
[ 1.00000000000000 -1.50000000000000]
|
|
273
|
+
[-1.50000000000000 1.00000000000000]
|
|
274
|
+
sage: CM = CoxeterMatrix([[1,-3/2],[-3/2,1]]); CM
|
|
275
|
+
[ 1 -3/2]
|
|
276
|
+
[-3/2 1]
|
|
277
|
+
sage: CM = CoxeterMatrix([[1,-3/2,5],[-3/2,1,-1],[5,-1,1]]); CM
|
|
278
|
+
[ 1 -3/2 5]
|
|
279
|
+
[-3/2 1 -1]
|
|
280
|
+
[ 5 -1 1]
|
|
281
|
+
sage: CM = CoxeterMatrix([[1,-3/2,5],[-3/2,1,oo],[5,oo,1]]); CM
|
|
282
|
+
[ 1 -3/2 5]
|
|
283
|
+
[-3/2 1 -1]
|
|
284
|
+
[ 5 -1 1]
|
|
285
|
+
"""
|
|
286
|
+
# Check that the data is valid
|
|
287
|
+
check_coxeter_matrix(data)
|
|
288
|
+
|
|
289
|
+
M = matrix(data)
|
|
290
|
+
n = M.ncols()
|
|
291
|
+
|
|
292
|
+
base_ring = M.base_ring()
|
|
293
|
+
|
|
294
|
+
if not coxeter_type:
|
|
295
|
+
if n == 1:
|
|
296
|
+
coxeter_type = CoxeterType(['A', 1])
|
|
297
|
+
elif coxeter_type_check:
|
|
298
|
+
coxeter_type = recognize_coxeter_type_from_matrix(M, index_set)
|
|
299
|
+
else:
|
|
300
|
+
coxeter_type = None
|
|
301
|
+
|
|
302
|
+
raw_data = M.list()
|
|
303
|
+
|
|
304
|
+
mat = typecall(cls, MatrixSpace(base_ring, n, sparse=False), raw_data,
|
|
305
|
+
coxeter_type, index_set)
|
|
306
|
+
mat._subdivisions = M._subdivisions
|
|
307
|
+
|
|
308
|
+
return mat
|
|
309
|
+
|
|
310
|
+
@classmethod
|
|
311
|
+
def _from_graph(cls, graph, coxeter_type_check):
|
|
312
|
+
"""
|
|
313
|
+
Initiate the Coxeter matrix from a graph.
|
|
314
|
+
|
|
315
|
+
TESTS::
|
|
316
|
+
|
|
317
|
+
sage: CoxeterMatrix(CoxeterMatrix(['A',4,1]).coxeter_graph())
|
|
318
|
+
[1 3 2 2 3]
|
|
319
|
+
[3 1 3 2 2]
|
|
320
|
+
[2 3 1 3 2]
|
|
321
|
+
[2 2 3 1 3]
|
|
322
|
+
[3 2 2 3 1]
|
|
323
|
+
sage: CoxeterMatrix(CoxeterMatrix(['B',4,1]).coxeter_graph())
|
|
324
|
+
[1 2 3 2 2]
|
|
325
|
+
[2 1 3 2 2]
|
|
326
|
+
[3 3 1 3 2]
|
|
327
|
+
[2 2 3 1 4]
|
|
328
|
+
[2 2 2 4 1]
|
|
329
|
+
sage: CoxeterMatrix(CoxeterMatrix(['F',4]).coxeter_graph())
|
|
330
|
+
[1 3 2 2]
|
|
331
|
+
[3 1 4 2]
|
|
332
|
+
[2 4 1 3]
|
|
333
|
+
[2 2 3 1]
|
|
334
|
+
|
|
335
|
+
sage: G = Graph()
|
|
336
|
+
sage: G.add_edge([0,1,oo])
|
|
337
|
+
sage: CoxeterMatrix(G)
|
|
338
|
+
[ 1 -1]
|
|
339
|
+
[-1 1]
|
|
340
|
+
sage: H = Graph()
|
|
341
|
+
sage: H.add_edge([0,1,-1.5])
|
|
342
|
+
sage: CoxeterMatrix(H)
|
|
343
|
+
[ 1.00000000000000 -1.50000000000000]
|
|
344
|
+
[-1.50000000000000 1.00000000000000]
|
|
345
|
+
"""
|
|
346
|
+
verts = graph.vertices(sort=True)
|
|
347
|
+
index_set = tuple(verts)
|
|
348
|
+
n = len(index_set)
|
|
349
|
+
|
|
350
|
+
# Setup the basis matrix as all 2 except 1 on the diagonal
|
|
351
|
+
data = []
|
|
352
|
+
for i in range(n):
|
|
353
|
+
data += [[]]
|
|
354
|
+
for j in range(n):
|
|
355
|
+
if i == j:
|
|
356
|
+
data[-1] += [ZZ.one()]
|
|
357
|
+
else:
|
|
358
|
+
data[-1] += [2]
|
|
359
|
+
|
|
360
|
+
for e in graph.edges(sort=True):
|
|
361
|
+
label = e[2]
|
|
362
|
+
if label is None:
|
|
363
|
+
label = 3
|
|
364
|
+
elif label == infinity:
|
|
365
|
+
label = -1
|
|
366
|
+
elif label not in ZZ and label > -1:
|
|
367
|
+
raise ValueError("invalid Coxeter graph label")
|
|
368
|
+
elif label == 0 or label == 1:
|
|
369
|
+
raise ValueError("invalid Coxeter graph label")
|
|
370
|
+
i = verts.index(e[0])
|
|
371
|
+
j = verts.index(e[1])
|
|
372
|
+
data[j][i] = data[i][j] = label
|
|
373
|
+
|
|
374
|
+
return cls._from_matrix(data, None, index_set, coxeter_type_check)
|
|
375
|
+
|
|
376
|
+
@classmethod
|
|
377
|
+
def _from_coxetertype(cls, coxeter_type):
|
|
378
|
+
"""
|
|
379
|
+
Initiate the Coxeter matrix from a Coxeter type.
|
|
380
|
+
|
|
381
|
+
TESTS::
|
|
382
|
+
|
|
383
|
+
sage: CoxeterMatrix(['A',4]).coxeter_type()
|
|
384
|
+
Coxeter type of ['A', 4]
|
|
385
|
+
sage: CoxeterMatrix(['A',4,1]).coxeter_type()
|
|
386
|
+
Coxeter type of ['A', 4, 1]
|
|
387
|
+
sage: CoxeterMatrix(['D',4,1]).coxeter_type()
|
|
388
|
+
Coxeter type of ['D', 4, 1]
|
|
389
|
+
"""
|
|
390
|
+
index_set = coxeter_type.index_set()
|
|
391
|
+
n = len(index_set)
|
|
392
|
+
reverse = {index_set[i]: i for i in range(n)}
|
|
393
|
+
data = [[1 if i == j else 2 for j in range(n)] for i in range(n)]
|
|
394
|
+
for (i, j, l) in coxeter_type.coxeter_graph().edge_iterator():
|
|
395
|
+
if l == infinity:
|
|
396
|
+
l = -1
|
|
397
|
+
data[reverse[i]][reverse[j]] = l
|
|
398
|
+
data[reverse[j]][reverse[i]] = l
|
|
399
|
+
|
|
400
|
+
return cls._from_matrix(data, coxeter_type, index_set, False)
|
|
401
|
+
|
|
402
|
+
@classmethod
|
|
403
|
+
def samples(self, finite=None, affine=None, crystallographic=None, higher_rank=None):
|
|
404
|
+
"""
|
|
405
|
+
Return a sample of the available Coxeter types.
|
|
406
|
+
|
|
407
|
+
INPUT:
|
|
408
|
+
|
|
409
|
+
- ``finite`` -- (default: ``None``) a boolean or ``None``
|
|
410
|
+
|
|
411
|
+
- ``affine`` -- (default: ``None``) a boolean or ``None``
|
|
412
|
+
|
|
413
|
+
- ``crystallographic`` -- (default: ``None``) a boolean or ``None``
|
|
414
|
+
|
|
415
|
+
- ``higher_rank`` -- (default: ``None``) a boolean or ``None``
|
|
416
|
+
|
|
417
|
+
The sample contains all the exceptional finite and affine
|
|
418
|
+
Coxeter types, as well as typical representatives of the
|
|
419
|
+
infinite families.
|
|
420
|
+
|
|
421
|
+
Here the ``higher_rank`` term denotes non-finite, non-affine,
|
|
422
|
+
Coxeter groups (including hyperbolic types).
|
|
423
|
+
|
|
424
|
+
.. TODO:: Implement the hyperbolic and compact hyperbolic in the samples.
|
|
425
|
+
|
|
426
|
+
EXAMPLES::
|
|
427
|
+
|
|
428
|
+
sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples()]
|
|
429
|
+
[
|
|
430
|
+
Coxeter type of ['A', 1], Coxeter type of ['A', 5],
|
|
431
|
+
<BLANKLINE>
|
|
432
|
+
Coxeter type of ['B', 5], Coxeter type of ['D', 4],
|
|
433
|
+
<BLANKLINE>
|
|
434
|
+
Coxeter type of ['D', 5], Coxeter type of ['E', 6],
|
|
435
|
+
<BLANKLINE>
|
|
436
|
+
Coxeter type of ['E', 7], Coxeter type of ['E', 8],
|
|
437
|
+
<BLANKLINE>
|
|
438
|
+
Coxeter type of ['F', 4], Coxeter type of ['H', 3],
|
|
439
|
+
<BLANKLINE>
|
|
440
|
+
Coxeter type of ['H', 4], Coxeter type of ['I', 10],
|
|
441
|
+
<BLANKLINE>
|
|
442
|
+
Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
|
|
443
|
+
<BLANKLINE>
|
|
444
|
+
Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
|
|
445
|
+
<BLANKLINE>
|
|
446
|
+
Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
|
|
447
|
+
<BLANKLINE>
|
|
448
|
+
Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
|
|
449
|
+
<BLANKLINE>
|
|
450
|
+
[ 1 -1 -1]
|
|
451
|
+
[-1 1 -1]
|
|
452
|
+
Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1], [-1 -1 1],
|
|
453
|
+
<BLANKLINE>
|
|
454
|
+
[ 1 -2 3 2]
|
|
455
|
+
[1 2 3] [-2 1 2 3]
|
|
456
|
+
[2 1 7] [ 3 2 1 -8]
|
|
457
|
+
[3 7 1], [ 2 3 -8 1]
|
|
458
|
+
]
|
|
459
|
+
|
|
460
|
+
The finite, affine and crystallographic options allow
|
|
461
|
+
respectively for restricting to (non) finite, (non) affine,
|
|
462
|
+
and (non) crystallographic Cartan types::
|
|
463
|
+
|
|
464
|
+
sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(finite=True)]
|
|
465
|
+
[Coxeter type of ['A', 1], Coxeter type of ['A', 5],
|
|
466
|
+
Coxeter type of ['B', 5], Coxeter type of ['D', 4],
|
|
467
|
+
Coxeter type of ['D', 5], Coxeter type of ['E', 6],
|
|
468
|
+
Coxeter type of ['E', 7], Coxeter type of ['E', 8],
|
|
469
|
+
Coxeter type of ['F', 4], Coxeter type of ['H', 3],
|
|
470
|
+
Coxeter type of ['H', 4], Coxeter type of ['I', 10]]
|
|
471
|
+
|
|
472
|
+
sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(affine=True)]
|
|
473
|
+
[Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
|
|
474
|
+
Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
|
|
475
|
+
Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
|
|
476
|
+
Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
|
|
477
|
+
Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1]]
|
|
478
|
+
|
|
479
|
+
sage: [CM.coxeter_type() for CM in CoxeterMatrix.samples(crystallographic=True)]
|
|
480
|
+
[Coxeter type of ['A', 1], Coxeter type of ['A', 5],
|
|
481
|
+
Coxeter type of ['B', 5], Coxeter type of ['D', 4],
|
|
482
|
+
Coxeter type of ['D', 5], Coxeter type of ['E', 6],
|
|
483
|
+
Coxeter type of ['E', 7], Coxeter type of ['E', 8],
|
|
484
|
+
Coxeter type of ['F', 4], Coxeter type of ['A', 2, 1],
|
|
485
|
+
Coxeter type of ['B', 5, 1], Coxeter type of ['C', 5, 1],
|
|
486
|
+
Coxeter type of ['D', 5, 1], Coxeter type of ['E', 6, 1],
|
|
487
|
+
Coxeter type of ['E', 7, 1], Coxeter type of ['E', 8, 1],
|
|
488
|
+
Coxeter type of ['F', 4, 1], Coxeter type of ['G', 2, 1]]
|
|
489
|
+
|
|
490
|
+
sage: CoxeterMatrix.samples(crystallographic=False)
|
|
491
|
+
[
|
|
492
|
+
[1 3 2 2]
|
|
493
|
+
[1 3 2] [3 1 3 2] [ 1 -1 -1] [1 2 3]
|
|
494
|
+
[3 1 5] [2 3 1 5] [ 1 10] [ 1 -1] [-1 1 -1] [2 1 7]
|
|
495
|
+
[2 5 1], [2 2 5 1], [10 1], [-1 1], [-1 -1 1], [3 7 1],
|
|
496
|
+
<BLANKLINE>
|
|
497
|
+
[ 1 -2 3 2]
|
|
498
|
+
[-2 1 2 3]
|
|
499
|
+
[ 3 2 1 -8]
|
|
500
|
+
[ 2 3 -8 1]
|
|
501
|
+
]
|
|
502
|
+
|
|
503
|
+
.. TODO:: add some reducible Coxeter types (suggestions?)
|
|
504
|
+
|
|
505
|
+
TESTS::
|
|
506
|
+
|
|
507
|
+
sage: for ct in CoxeterMatrix.samples(): TestSuite(ct).run()
|
|
508
|
+
"""
|
|
509
|
+
result = self._samples()
|
|
510
|
+
if crystallographic is not None:
|
|
511
|
+
result = [t for t in result if t.is_crystallographic() == crystallographic]
|
|
512
|
+
if finite is not None:
|
|
513
|
+
result = [t for t in result if t.is_finite() == finite]
|
|
514
|
+
if affine is not None:
|
|
515
|
+
result = [t for t in result if t.is_affine() == affine]
|
|
516
|
+
if higher_rank is not None:
|
|
517
|
+
result = [t for t in result if not t.is_affine() and not t.is_finite()]
|
|
518
|
+
return result
|
|
519
|
+
|
|
520
|
+
@cached_method
|
|
521
|
+
def _samples(self):
|
|
522
|
+
"""
|
|
523
|
+
Return a sample of all implemented Coxeter types.
|
|
524
|
+
|
|
525
|
+
.. NOTE:: This is intended to be used through :meth:`samples`.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: [CM.coxeter_type() for CM in CoxeterMatrix._samples()]
|
|
530
|
+
[
|
|
531
|
+
Coxeter type of ['A', 1], Coxeter type of ['A', 5],
|
|
532
|
+
<BLANKLINE>
|
|
533
|
+
Coxeter type of ['B', 5], Coxeter type of ['D', 4],
|
|
534
|
+
<BLANKLINE>
|
|
535
|
+
Coxeter type of ['D', 5], Coxeter type of ['E', 6],
|
|
536
|
+
<BLANKLINE>
|
|
537
|
+
Coxeter type of ['E', 7], Coxeter type of ['E', 8],
|
|
538
|
+
<BLANKLINE>
|
|
539
|
+
Coxeter type of ['F', 4], Coxeter type of ['H', 3],
|
|
540
|
+
<BLANKLINE>
|
|
541
|
+
Coxeter type of ['H', 4], Coxeter type of ['I', 10],
|
|
542
|
+
<BLANKLINE>
|
|
543
|
+
Coxeter type of ['A', 2, 1], Coxeter type of ['B', 5, 1],
|
|
544
|
+
<BLANKLINE>
|
|
545
|
+
Coxeter type of ['C', 5, 1], Coxeter type of ['D', 5, 1],
|
|
546
|
+
<BLANKLINE>
|
|
547
|
+
Coxeter type of ['E', 6, 1], Coxeter type of ['E', 7, 1],
|
|
548
|
+
<BLANKLINE>
|
|
549
|
+
Coxeter type of ['E', 8, 1], Coxeter type of ['F', 4, 1],
|
|
550
|
+
<BLANKLINE>
|
|
551
|
+
[ 1 -1 -1]
|
|
552
|
+
[-1 1 -1]
|
|
553
|
+
Coxeter type of ['G', 2, 1], Coxeter type of ['A', 1, 1], [-1 -1 1],
|
|
554
|
+
<BLANKLINE>
|
|
555
|
+
[ 1 -2 3 2]
|
|
556
|
+
[1 2 3] [-2 1 2 3]
|
|
557
|
+
[2 1 7] [ 3 2 1 -8]
|
|
558
|
+
[3 7 1], [ 2 3 -8 1]
|
|
559
|
+
]
|
|
560
|
+
"""
|
|
561
|
+
finite = [CoxeterMatrix(t) for t in [['A', 1], ['A', 5], ['B', 5],
|
|
562
|
+
['D', 4], ['D', 5], ['E', 6], ['E', 7],
|
|
563
|
+
['E', 8], ['F', 4], ['H', 3], ['H', 4],
|
|
564
|
+
['I', 10]]]
|
|
565
|
+
|
|
566
|
+
affine = [CoxeterMatrix(t) for t in [['A', 2, 1], ['B', 5, 1],
|
|
567
|
+
['C', 5, 1], ['D', 5, 1], ['E', 6, 1],
|
|
568
|
+
['E', 7, 1], ['E', 8, 1], ['F', 4, 1],
|
|
569
|
+
['G', 2, 1], ['A', 1, 1]]]
|
|
570
|
+
|
|
571
|
+
higher_matrices = [[[1, -1, -1], [-1, 1, -1], [-1, -1, 1]],
|
|
572
|
+
[[1, 2, 3], [2, 1, 7], [3, 7, 1]],
|
|
573
|
+
[[1, -2, 3, 2], [-2, 1, 2, 3], [3, 2, 1, -8], [2, 3, -8, 1]]]
|
|
574
|
+
|
|
575
|
+
higher = [CoxeterMatrix(m) for m in higher_matrices]
|
|
576
|
+
|
|
577
|
+
return finite + affine + higher
|
|
578
|
+
|
|
579
|
+
def relabel(self, relabelling):
|
|
580
|
+
"""
|
|
581
|
+
Return a relabelled copy of this Coxeter matrix.
|
|
582
|
+
|
|
583
|
+
INPUT:
|
|
584
|
+
|
|
585
|
+
- ``relabelling`` -- a function (or dictionary)
|
|
586
|
+
|
|
587
|
+
OUTPUT:
|
|
588
|
+
|
|
589
|
+
an isomorphic Coxeter type obtained by relabelling the nodes of
|
|
590
|
+
the Coxeter graph. Namely, the node with label ``i`` is
|
|
591
|
+
relabelled ``f(i)`` (or, by ``f[i]`` if ``f`` is a dictionary).
|
|
592
|
+
|
|
593
|
+
EXAMPLES::
|
|
594
|
+
|
|
595
|
+
sage: CoxeterMatrix(['F',4]).relabel({ 1:2, 2:3, 3:4, 4:1})
|
|
596
|
+
[1 4 2 3]
|
|
597
|
+
[4 1 3 2]
|
|
598
|
+
[2 3 1 2]
|
|
599
|
+
[3 2 2 1]
|
|
600
|
+
sage: CoxeterMatrix(['F',4]).relabel(lambda x: x+1 if x<4 else 1)
|
|
601
|
+
[1 4 2 3]
|
|
602
|
+
[4 1 3 2]
|
|
603
|
+
[2 3 1 2]
|
|
604
|
+
[3 2 2 1]
|
|
605
|
+
"""
|
|
606
|
+
if isinstance(relabelling, dict):
|
|
607
|
+
data = [[self[relabelling[i]][relabelling[j]]
|
|
608
|
+
for j in self.index_set()] for i in self.index_set()]
|
|
609
|
+
else:
|
|
610
|
+
data = [[self[relabelling(i)][relabelling(j)]
|
|
611
|
+
for j in self.index_set()] for i in self.index_set()]
|
|
612
|
+
|
|
613
|
+
return CoxeterMatrix(data)
|
|
614
|
+
|
|
615
|
+
def __reduce__(self):
|
|
616
|
+
"""
|
|
617
|
+
Used for pickling.
|
|
618
|
+
|
|
619
|
+
TESTS::
|
|
620
|
+
|
|
621
|
+
sage: C = CoxeterMatrix(['A',4])
|
|
622
|
+
sage: M = loads(dumps(C))
|
|
623
|
+
sage: M._index_set
|
|
624
|
+
(1, 2, 3, 4)
|
|
625
|
+
"""
|
|
626
|
+
if self._coxeter_type:
|
|
627
|
+
return (CoxeterMatrix, (self._coxeter_type,))
|
|
628
|
+
return (CoxeterMatrix, (self._matrix, self._index_set))
|
|
629
|
+
|
|
630
|
+
def _repr_(self):
|
|
631
|
+
"""
|
|
632
|
+
String representation of the Coxeter matrix.
|
|
633
|
+
|
|
634
|
+
EXAMPLES::
|
|
635
|
+
|
|
636
|
+
sage: CM = CoxeterMatrix(['A',3]); CM
|
|
637
|
+
[1 3 2]
|
|
638
|
+
[3 1 3]
|
|
639
|
+
[2 3 1]
|
|
640
|
+
sage: CM = CoxeterMatrix([[1,-3/2],[-3/2,1]]); CM
|
|
641
|
+
[ 1 -3/2]
|
|
642
|
+
[-3/2 1]
|
|
643
|
+
"""
|
|
644
|
+
return repr(self._matrix)
|
|
645
|
+
|
|
646
|
+
def _repr_option(self, key):
|
|
647
|
+
"""
|
|
648
|
+
Metadata about the :meth:`_repr_` output.
|
|
649
|
+
|
|
650
|
+
See :meth:`sage.structure.parent._repr_option` for details.
|
|
651
|
+
|
|
652
|
+
EXAMPLES::
|
|
653
|
+
|
|
654
|
+
sage: CM = CoxeterMatrix(['A',3])
|
|
655
|
+
sage: CM._repr_option('ascii_art')
|
|
656
|
+
True
|
|
657
|
+
"""
|
|
658
|
+
if key == 'ascii_art' or key == 'element_ascii_art':
|
|
659
|
+
return self._matrix.nrows() > 1
|
|
660
|
+
return super()._repr_option(key)
|
|
661
|
+
|
|
662
|
+
def _latex_(self):
|
|
663
|
+
r"""
|
|
664
|
+
Latex representation of the Coxeter matrix.
|
|
665
|
+
|
|
666
|
+
EXAMPLES::
|
|
667
|
+
|
|
668
|
+
sage: CM = CoxeterMatrix(['A',3])
|
|
669
|
+
sage: latex(CM)
|
|
670
|
+
\left(\begin{array}{rrr}
|
|
671
|
+
1 & 3 & 2 \\
|
|
672
|
+
3 & 1 & 3 \\
|
|
673
|
+
2 & 3 & 1
|
|
674
|
+
\end{array}\right)
|
|
675
|
+
"""
|
|
676
|
+
return self._matrix._latex_()
|
|
677
|
+
|
|
678
|
+
def __iter__(self):
|
|
679
|
+
"""
|
|
680
|
+
Return an iterator for the rows of the Coxeter matrix.
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: CM = CoxeterMatrix([[1,8],[8,1]])
|
|
685
|
+
sage: next(CM.__iter__())
|
|
686
|
+
(1, 8)
|
|
687
|
+
"""
|
|
688
|
+
return iter(self._matrix)
|
|
689
|
+
|
|
690
|
+
def __getitem__(self, key):
|
|
691
|
+
"""
|
|
692
|
+
Return a dictionary of labels adjacent to a node or
|
|
693
|
+
the label of an edge in the Coxeter graph.
|
|
694
|
+
|
|
695
|
+
EXAMPLES::
|
|
696
|
+
|
|
697
|
+
sage: CM = CoxeterMatrix([[1,-2],[-2,1]])
|
|
698
|
+
sage: CM = CoxeterMatrix([[1,-2],[-2,1]], ['a','b'])
|
|
699
|
+
sage: CM['a']
|
|
700
|
+
{'a': 1, 'b': -2}
|
|
701
|
+
sage: CM['b']
|
|
702
|
+
{'a': -2, 'b': 1}
|
|
703
|
+
sage: CM['a','b']
|
|
704
|
+
-2
|
|
705
|
+
sage: CM['a','a']
|
|
706
|
+
1
|
|
707
|
+
"""
|
|
708
|
+
return self._dict[key]
|
|
709
|
+
|
|
710
|
+
def __hash__(self):
|
|
711
|
+
r"""
|
|
712
|
+
Return hash of the Coxeter matrix.
|
|
713
|
+
|
|
714
|
+
EXAMPLES::
|
|
715
|
+
|
|
716
|
+
sage: CM = CoxeterMatrix([[1, -2], [-2, 1]], ['a', 'b'])
|
|
717
|
+
sage: CM.__hash__()
|
|
718
|
+
-337812865737895661 # 64-bit
|
|
719
|
+
153276691 # 32-bit
|
|
720
|
+
sage: CM = CoxeterMatrix([[1, -3], [-3, 1]], ['1', '2'])
|
|
721
|
+
sage: CM.__hash__()
|
|
722
|
+
-506719298606843492 # 64-bit
|
|
723
|
+
-1917568612 # 32-bit
|
|
724
|
+
"""
|
|
725
|
+
return hash(self._matrix)
|
|
726
|
+
|
|
727
|
+
def __eq__(self, other):
|
|
728
|
+
r"""
|
|
729
|
+
Return if ``self`` and ``other`` are equal.
|
|
730
|
+
|
|
731
|
+
EXAMPLES::
|
|
732
|
+
|
|
733
|
+
sage: CM = CoxeterMatrix([[1,-2],[-2,1]],['a','b'])
|
|
734
|
+
sage: CM2 = CoxeterMatrix([[1,-2],[-2,1]],['1','2'])
|
|
735
|
+
sage: CM == CM2
|
|
736
|
+
True
|
|
737
|
+
sage: CM == matrix(CM)
|
|
738
|
+
False
|
|
739
|
+
sage: CM3 = CoxeterMatrix([[1,-3],[-3,1]],['1','2'])
|
|
740
|
+
sage: CM == CM3
|
|
741
|
+
False
|
|
742
|
+
"""
|
|
743
|
+
return isinstance(other, CoxeterMatrix) and self._matrix == other._matrix
|
|
744
|
+
|
|
745
|
+
def __ne__(self, other):
|
|
746
|
+
"""
|
|
747
|
+
Return if ``self`` and ``other`` are not equal.
|
|
748
|
+
|
|
749
|
+
EXAMPLES::
|
|
750
|
+
|
|
751
|
+
sage: CM = CoxeterMatrix([[1,-2],[-2,1]],['a','b'])
|
|
752
|
+
sage: CM2 = CoxeterMatrix([[1,-2],[-2,1]],['1','2'])
|
|
753
|
+
sage: CM != CM2
|
|
754
|
+
False
|
|
755
|
+
sage: matrix(CM) != CM
|
|
756
|
+
True
|
|
757
|
+
sage: CM3 = CoxeterMatrix([[1,-3],[-3,1]],['1','2'])
|
|
758
|
+
sage: CM != CM3
|
|
759
|
+
True
|
|
760
|
+
"""
|
|
761
|
+
return not (self == other)
|
|
762
|
+
|
|
763
|
+
def _matrix_(self, R=None):
|
|
764
|
+
"""
|
|
765
|
+
Return ``self`` as a matrix over the ring ``R``.
|
|
766
|
+
|
|
767
|
+
EXAMPLES::
|
|
768
|
+
|
|
769
|
+
sage: CM = CoxeterMatrix([[1,-3],[-3,1]])
|
|
770
|
+
sage: matrix(CM)
|
|
771
|
+
[ 1 -3]
|
|
772
|
+
[-3 1]
|
|
773
|
+
sage: matrix(RR, CM)
|
|
774
|
+
[ 1.00000000000000 -3.00000000000000]
|
|
775
|
+
[-3.00000000000000 1.00000000000000]
|
|
776
|
+
"""
|
|
777
|
+
if R is not None:
|
|
778
|
+
return self._matrix.change_ring(R)
|
|
779
|
+
else:
|
|
780
|
+
return self._matrix
|
|
781
|
+
|
|
782
|
+
##########################################################################
|
|
783
|
+
# Coxeter type methods
|
|
784
|
+
|
|
785
|
+
def index_set(self):
|
|
786
|
+
"""
|
|
787
|
+
Return the index set of ``self``.
|
|
788
|
+
|
|
789
|
+
EXAMPLES::
|
|
790
|
+
|
|
791
|
+
sage: C = CoxeterMatrix(['A',1,1])
|
|
792
|
+
sage: C.index_set()
|
|
793
|
+
(0, 1)
|
|
794
|
+
sage: C = CoxeterMatrix(['E',6])
|
|
795
|
+
sage: C.index_set()
|
|
796
|
+
(1, 2, 3, 4, 5, 6)
|
|
797
|
+
"""
|
|
798
|
+
return self._index_set
|
|
799
|
+
|
|
800
|
+
def coxeter_type(self):
|
|
801
|
+
"""
|
|
802
|
+
Return the Coxeter type of ``self`` or ``self`` if unknown.
|
|
803
|
+
|
|
804
|
+
EXAMPLES::
|
|
805
|
+
|
|
806
|
+
sage: C = CoxeterMatrix(['A',4,1])
|
|
807
|
+
sage: C.coxeter_type()
|
|
808
|
+
Coxeter type of ['A', 4, 1]
|
|
809
|
+
|
|
810
|
+
If the Coxeter type is unknown::
|
|
811
|
+
|
|
812
|
+
sage: C = CoxeterMatrix([[1,3,4], [3,1,-1], [4,-1,1]])
|
|
813
|
+
sage: C.coxeter_type()
|
|
814
|
+
[ 1 3 4]
|
|
815
|
+
[ 3 1 -1]
|
|
816
|
+
[ 4 -1 1]
|
|
817
|
+
"""
|
|
818
|
+
if self._coxeter_type is None:
|
|
819
|
+
return self
|
|
820
|
+
return self._coxeter_type
|
|
821
|
+
|
|
822
|
+
def rank(self):
|
|
823
|
+
r"""
|
|
824
|
+
Return the rank of ``self``.
|
|
825
|
+
|
|
826
|
+
EXAMPLES::
|
|
827
|
+
|
|
828
|
+
sage: CoxeterMatrix(['C',3]).rank()
|
|
829
|
+
3
|
|
830
|
+
sage: CoxeterMatrix(["A2","B2","F4"]).rank()
|
|
831
|
+
8
|
|
832
|
+
"""
|
|
833
|
+
return self._rank
|
|
834
|
+
|
|
835
|
+
def coxeter_matrix(self):
|
|
836
|
+
r"""
|
|
837
|
+
Return the Coxeter matrix of ``self``.
|
|
838
|
+
|
|
839
|
+
EXAMPLES::
|
|
840
|
+
|
|
841
|
+
sage: CoxeterMatrix(['C',3]).coxeter_matrix()
|
|
842
|
+
[1 3 2]
|
|
843
|
+
[3 1 4]
|
|
844
|
+
[2 4 1]
|
|
845
|
+
"""
|
|
846
|
+
return self
|
|
847
|
+
|
|
848
|
+
def bilinear_form(self, R=None):
|
|
849
|
+
r"""
|
|
850
|
+
Return the bilinear form of ``self``.
|
|
851
|
+
|
|
852
|
+
EXAMPLES::
|
|
853
|
+
|
|
854
|
+
sage: # needs sage.libs.gap
|
|
855
|
+
sage: CoxeterType(['A', 2, 1]).bilinear_form()
|
|
856
|
+
[ 1 -1/2 -1/2]
|
|
857
|
+
[-1/2 1 -1/2]
|
|
858
|
+
[-1/2 -1/2 1]
|
|
859
|
+
sage: CoxeterType(['H', 3]).bilinear_form()
|
|
860
|
+
[ 1 -1/2 0]
|
|
861
|
+
[ -1/2 1 1/2*E(5)^2 + 1/2*E(5)^3]
|
|
862
|
+
[ 0 1/2*E(5)^2 + 1/2*E(5)^3 1]
|
|
863
|
+
sage: C = CoxeterMatrix([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
|
|
864
|
+
sage: C.bilinear_form()
|
|
865
|
+
[ 1 -1 -1]
|
|
866
|
+
[-1 1 -1]
|
|
867
|
+
[-1 -1 1]
|
|
868
|
+
"""
|
|
869
|
+
return CoxeterType.bilinear_form(self, R=R)
|
|
870
|
+
|
|
871
|
+
@cached_method
|
|
872
|
+
def coxeter_graph(self):
|
|
873
|
+
"""
|
|
874
|
+
Return the Coxeter graph of ``self``.
|
|
875
|
+
|
|
876
|
+
EXAMPLES::
|
|
877
|
+
|
|
878
|
+
sage: C = CoxeterMatrix(['A',3])
|
|
879
|
+
sage: C.coxeter_graph()
|
|
880
|
+
Graph on 3 vertices
|
|
881
|
+
|
|
882
|
+
sage: C = CoxeterMatrix([['A',3],['A',1]])
|
|
883
|
+
sage: C.coxeter_graph()
|
|
884
|
+
Graph on 4 vertices
|
|
885
|
+
"""
|
|
886
|
+
n = self.rank()
|
|
887
|
+
I = self.index_set()
|
|
888
|
+
|
|
889
|
+
def val(x):
|
|
890
|
+
return infinity if x == -1 else x
|
|
891
|
+
G = Graph([(I[i], I[j], val((self._matrix)[i, j]))
|
|
892
|
+
for i in range(n) for j in range(i)
|
|
893
|
+
if self._matrix[i, j] not in [1, 2]],
|
|
894
|
+
format='list_of_edges')
|
|
895
|
+
G.add_vertices(I)
|
|
896
|
+
return G.copy(immutable=True)
|
|
897
|
+
|
|
898
|
+
def is_simply_laced(self):
|
|
899
|
+
"""
|
|
900
|
+
Return if ``self`` is simply-laced.
|
|
901
|
+
|
|
902
|
+
A Coxeter matrix is simply-laced if all non-diagonal entries are
|
|
903
|
+
either 2 or 3.
|
|
904
|
+
|
|
905
|
+
EXAMPLES::
|
|
906
|
+
|
|
907
|
+
sage: cm = CoxeterMatrix([[1,3,3,3], [3,1,3,3], [3,3,1,3], [3,3,3,1]])
|
|
908
|
+
sage: cm.is_simply_laced()
|
|
909
|
+
True
|
|
910
|
+
"""
|
|
911
|
+
# We include 1 in this list to account for the diagonal
|
|
912
|
+
L = [1, 2, 3]
|
|
913
|
+
return all(x in L for row in self for x in row)
|
|
914
|
+
|
|
915
|
+
def is_crystallographic(self):
|
|
916
|
+
"""
|
|
917
|
+
Return whether ``self`` is crystallographic.
|
|
918
|
+
|
|
919
|
+
A Coxeter matrix is crystallographic if all non-diagonal entries
|
|
920
|
+
are either 2, 3, 4, or 6.
|
|
921
|
+
|
|
922
|
+
EXAMPLES::
|
|
923
|
+
|
|
924
|
+
sage: CoxeterMatrix(['F',4]).is_crystallographic()
|
|
925
|
+
True
|
|
926
|
+
sage: CoxeterMatrix(['H',3]).is_crystallographic()
|
|
927
|
+
False
|
|
928
|
+
"""
|
|
929
|
+
# We include 1 in this list to account for the diagonal
|
|
930
|
+
L = [1, 2, 3, 4, 6]
|
|
931
|
+
return all(x in L for row in self for x in row)
|
|
932
|
+
|
|
933
|
+
def is_irreducible(self):
|
|
934
|
+
"""
|
|
935
|
+
Return whether ``self`` is irreducible.
|
|
936
|
+
|
|
937
|
+
A Coxeter matrix is irreducible if the Coxeter graph is connected.
|
|
938
|
+
|
|
939
|
+
EXAMPLES::
|
|
940
|
+
|
|
941
|
+
sage: CoxeterMatrix([['F',4],['A',1]]).is_irreducible()
|
|
942
|
+
False
|
|
943
|
+
sage: CoxeterMatrix(['H',3]).is_irreducible()
|
|
944
|
+
True
|
|
945
|
+
"""
|
|
946
|
+
return self.coxeter_graph().is_connected()
|
|
947
|
+
|
|
948
|
+
def is_finite(self):
|
|
949
|
+
"""
|
|
950
|
+
Return if ``self`` is a finite type or ``False`` if unknown.
|
|
951
|
+
|
|
952
|
+
EXAMPLES::
|
|
953
|
+
|
|
954
|
+
sage: M = CoxeterMatrix(['C',4])
|
|
955
|
+
sage: M.is_finite()
|
|
956
|
+
True
|
|
957
|
+
sage: M = CoxeterMatrix(['D',4,1])
|
|
958
|
+
sage: M.is_finite()
|
|
959
|
+
False
|
|
960
|
+
sage: M = CoxeterMatrix([[1, -1], [-1, 1]])
|
|
961
|
+
sage: M.is_finite()
|
|
962
|
+
False
|
|
963
|
+
"""
|
|
964
|
+
return self._is_finite
|
|
965
|
+
|
|
966
|
+
def is_affine(self):
|
|
967
|
+
"""
|
|
968
|
+
Return if ``self`` is an affine type or ``False`` if unknown.
|
|
969
|
+
|
|
970
|
+
EXAMPLES::
|
|
971
|
+
|
|
972
|
+
sage: M = CoxeterMatrix(['C',4])
|
|
973
|
+
sage: M.is_affine()
|
|
974
|
+
False
|
|
975
|
+
sage: M = CoxeterMatrix(['D',4,1])
|
|
976
|
+
sage: M.is_affine()
|
|
977
|
+
True
|
|
978
|
+
sage: M = CoxeterMatrix([[1, 3],[3,1]])
|
|
979
|
+
sage: M.is_affine()
|
|
980
|
+
False
|
|
981
|
+
sage: M = CoxeterMatrix([[1, -1, 7], [-1, 1, 3], [7, 3, 1]])
|
|
982
|
+
sage: M.is_affine()
|
|
983
|
+
False
|
|
984
|
+
"""
|
|
985
|
+
return self._is_affine
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
#####################################################################
|
|
989
|
+
# Type check functions
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
def recognize_coxeter_type_from_matrix(coxeter_matrix, index_set):
|
|
993
|
+
"""
|
|
994
|
+
Return the Coxeter type of ``coxeter_matrix`` if known,
|
|
995
|
+
otherwise return ``None``.
|
|
996
|
+
|
|
997
|
+
EXAMPLES:
|
|
998
|
+
|
|
999
|
+
Some infinite ones::
|
|
1000
|
+
|
|
1001
|
+
sage: C = CoxeterMatrix([[1,3,2],[3,1,-1],[2,-1,1]])
|
|
1002
|
+
sage: C.is_finite() # indirect doctest
|
|
1003
|
+
False
|
|
1004
|
+
sage: C = CoxeterMatrix([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
|
|
1005
|
+
sage: C.is_finite() # indirect doctest
|
|
1006
|
+
False
|
|
1007
|
+
|
|
1008
|
+
Some finite ones::
|
|
1009
|
+
|
|
1010
|
+
sage: m = matrix(CoxeterMatrix(['D', 4]))
|
|
1011
|
+
sage: CoxeterMatrix(m).is_finite() # indirect doctest
|
|
1012
|
+
True
|
|
1013
|
+
sage: m = matrix(CoxeterMatrix(['H', 4]))
|
|
1014
|
+
sage: CoxeterMatrix(m).is_finite() # indirect doctest
|
|
1015
|
+
True
|
|
1016
|
+
|
|
1017
|
+
sage: CoxeterMatrix(CoxeterType(['A',10]).coxeter_graph()).coxeter_type()
|
|
1018
|
+
Coxeter type of ['A', 10]
|
|
1019
|
+
sage: CoxeterMatrix(CoxeterType(['B',10]).coxeter_graph()).coxeter_type()
|
|
1020
|
+
Coxeter type of ['B', 10]
|
|
1021
|
+
sage: CoxeterMatrix(CoxeterType(['C',10]).coxeter_graph()).coxeter_type()
|
|
1022
|
+
Coxeter type of ['B', 10]
|
|
1023
|
+
sage: CoxeterMatrix(CoxeterType(['D',10]).coxeter_graph()).coxeter_type()
|
|
1024
|
+
Coxeter type of ['D', 10]
|
|
1025
|
+
sage: CoxeterMatrix(CoxeterType(['E',6]).coxeter_graph()).coxeter_type()
|
|
1026
|
+
Coxeter type of ['E', 6]
|
|
1027
|
+
sage: CoxeterMatrix(CoxeterType(['E',7]).coxeter_graph()).coxeter_type()
|
|
1028
|
+
Coxeter type of ['E', 7]
|
|
1029
|
+
sage: CoxeterMatrix(CoxeterType(['E',8]).coxeter_graph()).coxeter_type()
|
|
1030
|
+
Coxeter type of ['E', 8]
|
|
1031
|
+
sage: CoxeterMatrix(CoxeterType(['F',4]).coxeter_graph()).coxeter_type()
|
|
1032
|
+
Coxeter type of ['F', 4]
|
|
1033
|
+
sage: CoxeterMatrix(CoxeterType(['G',2]).coxeter_graph()).coxeter_type()
|
|
1034
|
+
Coxeter type of ['G', 2]
|
|
1035
|
+
sage: CoxeterMatrix(CoxeterType(['H',3]).coxeter_graph()).coxeter_type()
|
|
1036
|
+
Coxeter type of ['H', 3]
|
|
1037
|
+
sage: CoxeterMatrix(CoxeterType(['H',4]).coxeter_graph()).coxeter_type()
|
|
1038
|
+
Coxeter type of ['H', 4]
|
|
1039
|
+
sage: CoxeterMatrix(CoxeterType(['I',100]).coxeter_graph()).coxeter_type()
|
|
1040
|
+
Coxeter type of ['I', 100]
|
|
1041
|
+
|
|
1042
|
+
Some affine graphs::
|
|
1043
|
+
|
|
1044
|
+
sage: CoxeterMatrix(CoxeterType(['A',1,1]).coxeter_graph()).coxeter_type()
|
|
1045
|
+
Coxeter type of ['A', 1, 1]
|
|
1046
|
+
sage: CoxeterMatrix(CoxeterType(['A',10,1]).coxeter_graph()).coxeter_type()
|
|
1047
|
+
Coxeter type of ['A', 10, 1]
|
|
1048
|
+
sage: CoxeterMatrix(CoxeterType(['B',10,1]).coxeter_graph()).coxeter_type()
|
|
1049
|
+
Coxeter type of ['B', 10, 1]
|
|
1050
|
+
sage: CoxeterMatrix(CoxeterType(['C',10,1]).coxeter_graph()).coxeter_type()
|
|
1051
|
+
Coxeter type of ['C', 10, 1]
|
|
1052
|
+
sage: CoxeterMatrix(CoxeterType(['D',10,1]).coxeter_graph()).coxeter_type()
|
|
1053
|
+
Coxeter type of ['D', 10, 1]
|
|
1054
|
+
sage: CoxeterMatrix(CoxeterType(['E',6,1]).coxeter_graph()).coxeter_type()
|
|
1055
|
+
Coxeter type of ['E', 6, 1]
|
|
1056
|
+
sage: CoxeterMatrix(CoxeterType(['E',7,1]).coxeter_graph()).coxeter_type()
|
|
1057
|
+
Coxeter type of ['E', 7, 1]
|
|
1058
|
+
sage: CoxeterMatrix(CoxeterType(['E',8,1]).coxeter_graph()).coxeter_type()
|
|
1059
|
+
Coxeter type of ['E', 8, 1]
|
|
1060
|
+
sage: CoxeterMatrix(CoxeterType(['F',4,1]).coxeter_graph()).coxeter_type()
|
|
1061
|
+
Coxeter type of ['F', 4, 1]
|
|
1062
|
+
sage: CoxeterMatrix(CoxeterType(['G',2,1]).coxeter_graph()).coxeter_type()
|
|
1063
|
+
Coxeter type of ['G', 2, 1]
|
|
1064
|
+
|
|
1065
|
+
TESTS:
|
|
1066
|
+
|
|
1067
|
+
Check that we detect relabellings::
|
|
1068
|
+
|
|
1069
|
+
sage: M = CoxeterMatrix([[1,2,3],[2,1,6],[3,6,1]], index_set=['a', 'b', 'c'])
|
|
1070
|
+
sage: M.coxeter_type()
|
|
1071
|
+
Coxeter type of ['G', 2, 1] relabelled by {0: 'a', 1: 'b', 2: 'c'}
|
|
1072
|
+
|
|
1073
|
+
sage: from sage.combinat.root_system.coxeter_matrix import recognize_coxeter_type_from_matrix
|
|
1074
|
+
sage: for C in CoxeterMatrix.samples():
|
|
1075
|
+
....: relabelling_perm = Permutations(C.index_set()).random_element()
|
|
1076
|
+
....: relabelling_dict = {C.index_set()[i]: relabelling_perm[i] for i in range(C.rank())}
|
|
1077
|
+
....: relabeled_matrix = C.relabel(relabelling_dict)._matrix
|
|
1078
|
+
....: recognized_type = recognize_coxeter_type_from_matrix(relabeled_matrix, relabelling_perm)
|
|
1079
|
+
....: if C.is_finite() or C.is_affine():
|
|
1080
|
+
....: assert recognized_type == C.coxeter_type()
|
|
1081
|
+
|
|
1082
|
+
We check the rank 2 cases (:issue:`20419`)::
|
|
1083
|
+
|
|
1084
|
+
sage: for i in range(2, 10):
|
|
1085
|
+
....: M = matrix([[1,i],[i,1]])
|
|
1086
|
+
....: CoxeterMatrix(M).coxeter_type()
|
|
1087
|
+
Coxeter type of A1xA1 relabelled by {1: 2}
|
|
1088
|
+
Coxeter type of ['A', 2]
|
|
1089
|
+
Coxeter type of ['B', 2]
|
|
1090
|
+
Coxeter type of ['I', 5]
|
|
1091
|
+
Coxeter type of ['G', 2]
|
|
1092
|
+
Coxeter type of ['I', 7]
|
|
1093
|
+
Coxeter type of ['I', 8]
|
|
1094
|
+
Coxeter type of ['I', 9]
|
|
1095
|
+
sage: CoxeterMatrix(matrix([[1,-1],[-1,1]]), index_set=[0,1]).coxeter_type()
|
|
1096
|
+
Coxeter type of ['A', 1, 1]
|
|
1097
|
+
|
|
1098
|
+
Check that this works for reducible types with relabellings
|
|
1099
|
+
(:issue:`24892`)::
|
|
1100
|
+
|
|
1101
|
+
sage: CM = CoxeterMatrix([[1,2,5],[2,1,2],[5,2,1]]); CM
|
|
1102
|
+
[1 2 5]
|
|
1103
|
+
[2 1 2]
|
|
1104
|
+
[5 2 1]
|
|
1105
|
+
sage: CM.coxeter_type()
|
|
1106
|
+
Coxeter type of I5 relabelled by {1: 1, 2: 3}xA1 relabelled by {1: 2}
|
|
1107
|
+
"""
|
|
1108
|
+
# First, we build the Coxeter graph of the group without the edge labels
|
|
1109
|
+
n = ZZ(coxeter_matrix.nrows())
|
|
1110
|
+
G = Graph([index_set,
|
|
1111
|
+
[(index_set[i], index_set[j], coxeter_matrix[i, j])
|
|
1112
|
+
for i in range(n) for j in range(i, n)
|
|
1113
|
+
if coxeter_matrix[i, j] not in [1, 2]]],
|
|
1114
|
+
format='vertices_and_edges')
|
|
1115
|
+
|
|
1116
|
+
types = []
|
|
1117
|
+
for S in G.connected_components_subgraphs():
|
|
1118
|
+
r = S.num_verts()
|
|
1119
|
+
# Handle the special cases first
|
|
1120
|
+
if r == 1:
|
|
1121
|
+
types.append(CoxeterType(['A', 1]).relabel({1: S.vertices(sort=True)[0]}))
|
|
1122
|
+
continue
|
|
1123
|
+
if r == 2: # Type B2, G2, or I_2(p)
|
|
1124
|
+
e = S.edge_labels()[0]
|
|
1125
|
+
if e == 3: # Can't be 2 because it is connected
|
|
1126
|
+
ct = CoxeterType(['A', 2])
|
|
1127
|
+
elif e == 4:
|
|
1128
|
+
ct = CoxeterType(['B', 2])
|
|
1129
|
+
elif e == 6:
|
|
1130
|
+
ct = CoxeterType(['G', 2])
|
|
1131
|
+
elif e > 0 and e < float('inf'): # Remaining non-affine types
|
|
1132
|
+
ct = CoxeterType(['I', e])
|
|
1133
|
+
else: # Otherwise it is infinite dihedral group Z_2 \ast Z_2
|
|
1134
|
+
ct = CoxeterType(['A', 1, 1])
|
|
1135
|
+
SV = S.vertices(sort=True)
|
|
1136
|
+
if not ct.is_affine():
|
|
1137
|
+
types.append(ct.relabel({1: SV[0],
|
|
1138
|
+
2: SV[1]}))
|
|
1139
|
+
else:
|
|
1140
|
+
types.append(ct.relabel({0: SV[0],
|
|
1141
|
+
1: SV[1]}))
|
|
1142
|
+
continue
|
|
1143
|
+
|
|
1144
|
+
test = [['A', r], ['B', r], ['A', r - 1, 1]]
|
|
1145
|
+
if r >= 3:
|
|
1146
|
+
if r == 3:
|
|
1147
|
+
test += [['G', 2, 1], ['H', 3]]
|
|
1148
|
+
test.append(['C', r - 1, 1])
|
|
1149
|
+
if r >= 4:
|
|
1150
|
+
if r == 4:
|
|
1151
|
+
test += [['F', 4], ['H', 4]]
|
|
1152
|
+
test += [['D', r], ['B', r - 1, 1]]
|
|
1153
|
+
if r >= 5:
|
|
1154
|
+
if r == 5:
|
|
1155
|
+
test.append(['F', 4, 1])
|
|
1156
|
+
test.append(['D', r - 1, 1])
|
|
1157
|
+
if r == 6:
|
|
1158
|
+
test.append(['E', 6])
|
|
1159
|
+
elif r == 7:
|
|
1160
|
+
test += [['E', 7], ['E', 6, 1]]
|
|
1161
|
+
elif r == 8:
|
|
1162
|
+
test += [['E', 8], ['E', 7, 1]]
|
|
1163
|
+
elif r == 9:
|
|
1164
|
+
test.append(['E', 8, 1])
|
|
1165
|
+
|
|
1166
|
+
found = False
|
|
1167
|
+
for ct in test:
|
|
1168
|
+
ct = CoxeterType(ct)
|
|
1169
|
+
T = ct.coxeter_graph()
|
|
1170
|
+
iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
|
|
1171
|
+
if iso:
|
|
1172
|
+
types.append(ct.relabel(match))
|
|
1173
|
+
found = True
|
|
1174
|
+
break
|
|
1175
|
+
if not found:
|
|
1176
|
+
return None
|
|
1177
|
+
|
|
1178
|
+
return CoxeterType(types)
|
|
1179
|
+
|
|
1180
|
+
#####################################################################
|
|
1181
|
+
# Other functions
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
def check_coxeter_matrix(m):
|
|
1185
|
+
"""
|
|
1186
|
+
Check if ``m`` represents a generalized Coxeter matrix and raise
|
|
1187
|
+
and error if not.
|
|
1188
|
+
|
|
1189
|
+
EXAMPLES::
|
|
1190
|
+
|
|
1191
|
+
sage: from sage.combinat.root_system.coxeter_matrix import check_coxeter_matrix
|
|
1192
|
+
sage: m = matrix([[1,3,2],[3,1,-1],[2,-1,1]])
|
|
1193
|
+
sage: check_coxeter_matrix(m)
|
|
1194
|
+
|
|
1195
|
+
sage: m = matrix([[1,3],[3,1],[2,-1]])
|
|
1196
|
+
sage: check_coxeter_matrix(m)
|
|
1197
|
+
Traceback (most recent call last):
|
|
1198
|
+
...
|
|
1199
|
+
ValueError: not a square matrix
|
|
1200
|
+
|
|
1201
|
+
sage: m = matrix([[1,3,2],[3,1,-1],[2,-1,2]])
|
|
1202
|
+
sage: check_coxeter_matrix(m)
|
|
1203
|
+
Traceback (most recent call last):
|
|
1204
|
+
...
|
|
1205
|
+
ValueError: the matrix diagonal is not all 1
|
|
1206
|
+
|
|
1207
|
+
sage: m = matrix([[1,3,3],[3,1,-1],[2,-1,1]])
|
|
1208
|
+
sage: check_coxeter_matrix(m)
|
|
1209
|
+
Traceback (most recent call last):
|
|
1210
|
+
...
|
|
1211
|
+
ValueError: the matrix is not symmetric
|
|
1212
|
+
|
|
1213
|
+
sage: m = matrix([[1,3,1/2],[3,1,-1],[1/2,-1,1]])
|
|
1214
|
+
sage: check_coxeter_matrix(m)
|
|
1215
|
+
Traceback (most recent call last):
|
|
1216
|
+
...
|
|
1217
|
+
ValueError: invalid Coxeter label 1/2
|
|
1218
|
+
|
|
1219
|
+
sage: m = matrix([[1,3,1],[3,1,-1],[1,-1,1]])
|
|
1220
|
+
sage: check_coxeter_matrix(m)
|
|
1221
|
+
Traceback (most recent call last):
|
|
1222
|
+
...
|
|
1223
|
+
ValueError: invalid Coxeter label 1
|
|
1224
|
+
"""
|
|
1225
|
+
mat = matrix(m)
|
|
1226
|
+
if not mat.is_square():
|
|
1227
|
+
raise ValueError("not a square matrix")
|
|
1228
|
+
for i, row in enumerate(m):
|
|
1229
|
+
if mat[i, i] != 1:
|
|
1230
|
+
raise ValueError("the matrix diagonal is not all 1")
|
|
1231
|
+
for j, val in enumerate(row[i + 1:]):
|
|
1232
|
+
if val != m[j + i + 1][i]:
|
|
1233
|
+
raise ValueError("the matrix is not symmetric")
|
|
1234
|
+
if val not in ZZ:
|
|
1235
|
+
if val > -1 and val in RR and val != infinity:
|
|
1236
|
+
raise ValueError("invalid Coxeter label {}".format(val))
|
|
1237
|
+
else:
|
|
1238
|
+
if val == 1 or val == 0:
|
|
1239
|
+
raise ValueError("invalid Coxeter label {}".format(val))
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
def coxeter_matrix_as_function(t):
|
|
1243
|
+
"""
|
|
1244
|
+
Return the Coxeter matrix, as a function.
|
|
1245
|
+
|
|
1246
|
+
INPUT:
|
|
1247
|
+
|
|
1248
|
+
- ``t`` -- a Cartan type
|
|
1249
|
+
|
|
1250
|
+
EXAMPLES::
|
|
1251
|
+
|
|
1252
|
+
sage: from sage.combinat.root_system.coxeter_matrix import coxeter_matrix_as_function
|
|
1253
|
+
sage: f = coxeter_matrix_as_function(['A',4])
|
|
1254
|
+
sage: matrix([[f(i,j) for j in range(1,5)] for i in range(1,5)])
|
|
1255
|
+
[1 3 2 2]
|
|
1256
|
+
[3 1 3 2]
|
|
1257
|
+
[2 3 1 3]
|
|
1258
|
+
[2 2 3 1]
|
|
1259
|
+
"""
|
|
1260
|
+
m = CartanType(t).coxeter_matrix()
|
|
1261
|
+
return lambda i, j: m[i, j]
|