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,1245 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Cartan matrices
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Travis Scrimshaw (2012-04-22): Nicolas M. Thiery moved matrix creation to
|
|
8
|
+
:class:`CartanType` to prepare :func:`cartan_matrix()` for deprecation.
|
|
9
|
+
- Christian Stump, Travis Scrimshaw (2013-04-13): Created :class:`CartanMatrix`.
|
|
10
|
+
- Ben Salisbury (2018-08-07): Added Borcherds-Cartan matrices.
|
|
11
|
+
"""
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
14
|
+
# Copyright (C) 2012,2013 Travis Scrimshaw <tscrim at ucdavis.edu>,
|
|
15
|
+
# Copyright (C) 2013 Christian Stump,
|
|
16
|
+
# Copyright (C) 2018 Ben Salisbury <salis1bt at cmich.edu>,
|
|
17
|
+
#
|
|
18
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
19
|
+
#
|
|
20
|
+
# This code is distributed in the hope that it will be useful,
|
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
23
|
+
# General Public License for more details.
|
|
24
|
+
#
|
|
25
|
+
# The full text of the GPL is available at:
|
|
26
|
+
#
|
|
27
|
+
# https://www.gnu.org/licenses/
|
|
28
|
+
# ****************************************************************************
|
|
29
|
+
|
|
30
|
+
from sage.misc.cachefunc import cached_method
|
|
31
|
+
from sage.matrix.constructor import matrix
|
|
32
|
+
from sage.misc.lazy_import import lazy_import
|
|
33
|
+
from sage.structure.element import Matrix
|
|
34
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
35
|
+
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
|
|
36
|
+
from sage.misc.classcall_metaclass import typecall
|
|
37
|
+
from sage.combinat.subset import powerset
|
|
38
|
+
from sage.rings.integer_ring import ZZ
|
|
39
|
+
from sage.combinat.root_system.cartan_type import CartanType, CartanType_abstract
|
|
40
|
+
from sage.combinat.root_system.root_system import RootSystem
|
|
41
|
+
from sage.sets.family import Family
|
|
42
|
+
|
|
43
|
+
lazy_import('sage.graphs.digraph', 'DiGraph')
|
|
44
|
+
lazy_import('sage.combinat.root_system.dynkin_diagram', 'DynkinDiagram_class')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
from sage.matrix.matrix_integer_sparse import Matrix_integer_sparse as Base
|
|
49
|
+
except ImportError:
|
|
50
|
+
from sage.matrix.matrix_generic_sparse import Matrix_generic_sparse as Base
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class CartanMatrix(Base, CartanType_abstract,
|
|
54
|
+
metaclass=InheritComparisonClasscallMetaclass):
|
|
55
|
+
r"""
|
|
56
|
+
A (generalized) Cartan matrix.
|
|
57
|
+
|
|
58
|
+
A matrix `A = (a_{ij})_{i,j \in I}` for some index set `I` is a
|
|
59
|
+
generalized Cartan matrix if it satisfies the following properties:
|
|
60
|
+
|
|
61
|
+
- `a_{ii} = 2` for all `i`,
|
|
62
|
+
- `a_{ij} \leq 0` for all `i \neq j`,
|
|
63
|
+
- `a_{ij} = 0` if and only if `a_{ji} = 0` for all `i \neq j`.
|
|
64
|
+
|
|
65
|
+
Additionally some reference assume that a Cartan matrix is
|
|
66
|
+
*symmetrizable* (see :meth:`is_symmetrizable`). However following Kac, we
|
|
67
|
+
do not make that assumption here.
|
|
68
|
+
|
|
69
|
+
An even, integral Borcherds--Cartan matrix is an integral matrix
|
|
70
|
+
`A = (a_{ij})_{i,j \in I}` for some countable index set `I` which satisfies
|
|
71
|
+
the following properties:
|
|
72
|
+
|
|
73
|
+
- `a_{ii} \in \{2\} \cup 2\ZZ_{<0}` for all `i`,
|
|
74
|
+
- `a_{ij} \leq 0` for all `i \neq j`,
|
|
75
|
+
- `a_{ij} = 0` if and only if `a_{ji} = 0` for all `i \neq j`.
|
|
76
|
+
|
|
77
|
+
INPUT:
|
|
78
|
+
|
|
79
|
+
Can be anything which is accepted by ``CartanType`` or a matrix.
|
|
80
|
+
|
|
81
|
+
If given a matrix, one can also use the keyword ``cartan_type`` when giving
|
|
82
|
+
a matrix to explicitly state the type. Otherwise this will try to check the
|
|
83
|
+
input matrix against possible standard types of Cartan matrices. To disable
|
|
84
|
+
this check, use the keyword ``cartan_type_check = False``.
|
|
85
|
+
|
|
86
|
+
If one wants to initialize a Borcherds-Cartan matrix using matrix data,
|
|
87
|
+
use the keyword ``borcherds=True``. To specify the diagonal entries of
|
|
88
|
+
corresponding to a Cartan type (a Cartan matrix is treated as matrix data),
|
|
89
|
+
use ``borcherds`` with a list of the diagonal entries.
|
|
90
|
+
|
|
91
|
+
EXAMPLES::
|
|
92
|
+
|
|
93
|
+
sage: # needs sage.graphs
|
|
94
|
+
sage: CartanMatrix(['A', 4])
|
|
95
|
+
[ 2 -1 0 0]
|
|
96
|
+
[-1 2 -1 0]
|
|
97
|
+
[ 0 -1 2 -1]
|
|
98
|
+
[ 0 0 -1 2]
|
|
99
|
+
sage: CartanMatrix(['B', 6])
|
|
100
|
+
[ 2 -1 0 0 0 0]
|
|
101
|
+
[-1 2 -1 0 0 0]
|
|
102
|
+
[ 0 -1 2 -1 0 0]
|
|
103
|
+
[ 0 0 -1 2 -1 0]
|
|
104
|
+
[ 0 0 0 -1 2 -1]
|
|
105
|
+
[ 0 0 0 0 -2 2]
|
|
106
|
+
sage: CartanMatrix(['C', 4])
|
|
107
|
+
[ 2 -1 0 0]
|
|
108
|
+
[-1 2 -1 0]
|
|
109
|
+
[ 0 -1 2 -2]
|
|
110
|
+
[ 0 0 -1 2]
|
|
111
|
+
sage: CartanMatrix(['D', 6])
|
|
112
|
+
[ 2 -1 0 0 0 0]
|
|
113
|
+
[-1 2 -1 0 0 0]
|
|
114
|
+
[ 0 -1 2 -1 0 0]
|
|
115
|
+
[ 0 0 -1 2 -1 -1]
|
|
116
|
+
[ 0 0 0 -1 2 0]
|
|
117
|
+
[ 0 0 0 -1 0 2]
|
|
118
|
+
sage: CartanMatrix(['E',6])
|
|
119
|
+
[ 2 0 -1 0 0 0]
|
|
120
|
+
[ 0 2 0 -1 0 0]
|
|
121
|
+
[-1 0 2 -1 0 0]
|
|
122
|
+
[ 0 -1 -1 2 -1 0]
|
|
123
|
+
[ 0 0 0 -1 2 -1]
|
|
124
|
+
[ 0 0 0 0 -1 2]
|
|
125
|
+
sage: CartanMatrix(['E',7])
|
|
126
|
+
[ 2 0 -1 0 0 0 0]
|
|
127
|
+
[ 0 2 0 -1 0 0 0]
|
|
128
|
+
[-1 0 2 -1 0 0 0]
|
|
129
|
+
[ 0 -1 -1 2 -1 0 0]
|
|
130
|
+
[ 0 0 0 -1 2 -1 0]
|
|
131
|
+
[ 0 0 0 0 -1 2 -1]
|
|
132
|
+
[ 0 0 0 0 0 -1 2]
|
|
133
|
+
sage: CartanMatrix(['E', 8])
|
|
134
|
+
[ 2 0 -1 0 0 0 0 0]
|
|
135
|
+
[ 0 2 0 -1 0 0 0 0]
|
|
136
|
+
[-1 0 2 -1 0 0 0 0]
|
|
137
|
+
[ 0 -1 -1 2 -1 0 0 0]
|
|
138
|
+
[ 0 0 0 -1 2 -1 0 0]
|
|
139
|
+
[ 0 0 0 0 -1 2 -1 0]
|
|
140
|
+
[ 0 0 0 0 0 -1 2 -1]
|
|
141
|
+
[ 0 0 0 0 0 0 -1 2]
|
|
142
|
+
sage: CartanMatrix(['F', 4])
|
|
143
|
+
[ 2 -1 0 0]
|
|
144
|
+
[-1 2 -1 0]
|
|
145
|
+
[ 0 -2 2 -1]
|
|
146
|
+
[ 0 0 -1 2]
|
|
147
|
+
|
|
148
|
+
This is different from MuPAD-Combinat, due to different node
|
|
149
|
+
convention?
|
|
150
|
+
|
|
151
|
+
::
|
|
152
|
+
|
|
153
|
+
sage: # needs sage.graphs
|
|
154
|
+
sage: CartanMatrix(['G', 2])
|
|
155
|
+
[ 2 -3]
|
|
156
|
+
[-1 2]
|
|
157
|
+
sage: CartanMatrix(['A',1,1])
|
|
158
|
+
[ 2 -2]
|
|
159
|
+
[-2 2]
|
|
160
|
+
sage: CartanMatrix(['A', 3, 1])
|
|
161
|
+
[ 2 -1 0 -1]
|
|
162
|
+
[-1 2 -1 0]
|
|
163
|
+
[ 0 -1 2 -1]
|
|
164
|
+
[-1 0 -1 2]
|
|
165
|
+
sage: CartanMatrix(['B', 3, 1])
|
|
166
|
+
[ 2 0 -1 0]
|
|
167
|
+
[ 0 2 -1 0]
|
|
168
|
+
[-1 -1 2 -1]
|
|
169
|
+
[ 0 0 -2 2]
|
|
170
|
+
sage: CartanMatrix(['C', 3, 1])
|
|
171
|
+
[ 2 -1 0 0]
|
|
172
|
+
[-2 2 -1 0]
|
|
173
|
+
[ 0 -1 2 -2]
|
|
174
|
+
[ 0 0 -1 2]
|
|
175
|
+
sage: CartanMatrix(['D', 4, 1])
|
|
176
|
+
[ 2 0 -1 0 0]
|
|
177
|
+
[ 0 2 -1 0 0]
|
|
178
|
+
[-1 -1 2 -1 -1]
|
|
179
|
+
[ 0 0 -1 2 0]
|
|
180
|
+
[ 0 0 -1 0 2]
|
|
181
|
+
sage: CartanMatrix(['E', 6, 1])
|
|
182
|
+
[ 2 0 -1 0 0 0 0]
|
|
183
|
+
[ 0 2 0 -1 0 0 0]
|
|
184
|
+
[-1 0 2 0 -1 0 0]
|
|
185
|
+
[ 0 -1 0 2 -1 0 0]
|
|
186
|
+
[ 0 0 -1 -1 2 -1 0]
|
|
187
|
+
[ 0 0 0 0 -1 2 -1]
|
|
188
|
+
[ 0 0 0 0 0 -1 2]
|
|
189
|
+
sage: CartanMatrix(['E', 7, 1])
|
|
190
|
+
[ 2 -1 0 0 0 0 0 0]
|
|
191
|
+
[-1 2 0 -1 0 0 0 0]
|
|
192
|
+
[ 0 0 2 0 -1 0 0 0]
|
|
193
|
+
[ 0 -1 0 2 -1 0 0 0]
|
|
194
|
+
[ 0 0 -1 -1 2 -1 0 0]
|
|
195
|
+
[ 0 0 0 0 -1 2 -1 0]
|
|
196
|
+
[ 0 0 0 0 0 -1 2 -1]
|
|
197
|
+
[ 0 0 0 0 0 0 -1 2]
|
|
198
|
+
sage: CartanMatrix(['E', 8, 1])
|
|
199
|
+
[ 2 0 0 0 0 0 0 0 -1]
|
|
200
|
+
[ 0 2 0 -1 0 0 0 0 0]
|
|
201
|
+
[ 0 0 2 0 -1 0 0 0 0]
|
|
202
|
+
[ 0 -1 0 2 -1 0 0 0 0]
|
|
203
|
+
[ 0 0 -1 -1 2 -1 0 0 0]
|
|
204
|
+
[ 0 0 0 0 -1 2 -1 0 0]
|
|
205
|
+
[ 0 0 0 0 0 -1 2 -1 0]
|
|
206
|
+
[ 0 0 0 0 0 0 -1 2 -1]
|
|
207
|
+
[-1 0 0 0 0 0 0 -1 2]
|
|
208
|
+
sage: CartanMatrix(['F', 4, 1])
|
|
209
|
+
[ 2 -1 0 0 0]
|
|
210
|
+
[-1 2 -1 0 0]
|
|
211
|
+
[ 0 -1 2 -1 0]
|
|
212
|
+
[ 0 0 -2 2 -1]
|
|
213
|
+
[ 0 0 0 -1 2]
|
|
214
|
+
sage: CartanMatrix(['G', 2, 1])
|
|
215
|
+
[ 2 0 -1]
|
|
216
|
+
[ 0 2 -3]
|
|
217
|
+
[-1 -1 2]
|
|
218
|
+
|
|
219
|
+
Examples of Borcherds-Cartan matrices::
|
|
220
|
+
|
|
221
|
+
sage: CartanMatrix([[2,-1],[-1,-2]], borcherds=True) # needs sage.graphs
|
|
222
|
+
[ 2 -1]
|
|
223
|
+
[-1 -2]
|
|
224
|
+
sage: CartanMatrix('B3', borcherds=[-4,-6,2]) # needs sage.graphs
|
|
225
|
+
[-4 -1 0]
|
|
226
|
+
[-1 -6 -1]
|
|
227
|
+
[ 0 -2 2]
|
|
228
|
+
|
|
229
|
+
.. NOTE::
|
|
230
|
+
|
|
231
|
+
Since this is a matrix, :meth:`row()` and :meth:`column()` will return
|
|
232
|
+
the standard row and column respectively. To get the row with the
|
|
233
|
+
indices as in Dynkin diagrams/Cartan types, use
|
|
234
|
+
:meth:`row_with_indices()` and :meth:`column_with_indices()`
|
|
235
|
+
respectively.
|
|
236
|
+
"""
|
|
237
|
+
@staticmethod
|
|
238
|
+
def __classcall_private__(cls, data=None, index_set=None,
|
|
239
|
+
cartan_type=None, cartan_type_check=True,
|
|
240
|
+
borcherds=None):
|
|
241
|
+
"""
|
|
242
|
+
Normalize input so we can inherit from sparse integer matrix.
|
|
243
|
+
|
|
244
|
+
.. NOTE::
|
|
245
|
+
|
|
246
|
+
To disable the Cartan type check, use the optional argument
|
|
247
|
+
``cartan_type_check = False``.
|
|
248
|
+
|
|
249
|
+
EXAMPLES::
|
|
250
|
+
|
|
251
|
+
sage: # needs sage.graphs
|
|
252
|
+
sage: C = CartanMatrix(['A',1,1])
|
|
253
|
+
sage: C2 = CartanMatrix([[2, -2], [-2, 2]])
|
|
254
|
+
sage: C3 = CartanMatrix(matrix([[2, -2], [-2, 2]]), [0, 1])
|
|
255
|
+
sage: C == C2 and C == C3
|
|
256
|
+
True
|
|
257
|
+
|
|
258
|
+
TESTS:
|
|
259
|
+
|
|
260
|
+
Check that :issue:`15740` is fixed::
|
|
261
|
+
|
|
262
|
+
sage: # needs sage.graphs
|
|
263
|
+
sage: d = DynkinDiagram()
|
|
264
|
+
sage: d.add_edge('a', 'b', 2)
|
|
265
|
+
sage: d.index_set()
|
|
266
|
+
('a', 'b')
|
|
267
|
+
sage: cm = CartanMatrix(d)
|
|
268
|
+
sage: cm.index_set()
|
|
269
|
+
('a', 'b')
|
|
270
|
+
"""
|
|
271
|
+
# Special case with 0 args and kwds has Cartan type
|
|
272
|
+
if cartan_type is not None and data is None:
|
|
273
|
+
data = CartanType(cartan_type)
|
|
274
|
+
|
|
275
|
+
if data is None:
|
|
276
|
+
data = []
|
|
277
|
+
n = 0
|
|
278
|
+
index_set = tuple()
|
|
279
|
+
cartan_type = None
|
|
280
|
+
subdivisions = None
|
|
281
|
+
elif isinstance(data, CartanMatrix):
|
|
282
|
+
if index_set is not None:
|
|
283
|
+
d = {a: index_set[i] for i,a in enumerate(data.index_set())}
|
|
284
|
+
return data.relabel(d)
|
|
285
|
+
return data
|
|
286
|
+
else:
|
|
287
|
+
dynkin_diagram = None
|
|
288
|
+
subdivisions = None
|
|
289
|
+
|
|
290
|
+
if isinstance(data, DynkinDiagram_class):
|
|
291
|
+
dynkin_diagram = data
|
|
292
|
+
cartan_type = data._cartan_type
|
|
293
|
+
else:
|
|
294
|
+
try:
|
|
295
|
+
cartan_type = CartanType(data)
|
|
296
|
+
dynkin_diagram = cartan_type.dynkin_diagram()
|
|
297
|
+
except (TypeError, ValueError):
|
|
298
|
+
pass
|
|
299
|
+
|
|
300
|
+
if dynkin_diagram is not None:
|
|
301
|
+
n = dynkin_diagram.rank()
|
|
302
|
+
index_set = dynkin_diagram.index_set()
|
|
303
|
+
oir = dynkin_diagram.odd_isotropic_roots()
|
|
304
|
+
reverse = {a: i for i,a in enumerate(index_set)}
|
|
305
|
+
if isinstance(borcherds, (list, tuple)):
|
|
306
|
+
if (len(borcherds) != len(index_set)
|
|
307
|
+
and not all(val in ZZ
|
|
308
|
+
and (val == 2 or (val % 2 == 0 and val < 0))
|
|
309
|
+
for val in borcherds)):
|
|
310
|
+
raise ValueError("the input data is not a Borcherds-Cartan matrix")
|
|
311
|
+
data = {(i, i): val if index_set[i] not in oir else 0
|
|
312
|
+
for i,val in enumerate(borcherds)}
|
|
313
|
+
else:
|
|
314
|
+
data = {(i, i): 2 if index_set[i] not in oir else 0
|
|
315
|
+
for i in range(n)}
|
|
316
|
+
for (i,j,l) in dynkin_diagram.edge_iterator():
|
|
317
|
+
data[(reverse[j], reverse[i])] = -l
|
|
318
|
+
else:
|
|
319
|
+
M = matrix(data)
|
|
320
|
+
if borcherds:
|
|
321
|
+
if not is_borcherds_cartan_matrix(M):
|
|
322
|
+
raise ValueError("the input matrix is not a Borcherds-Cartan matrix")
|
|
323
|
+
else:
|
|
324
|
+
if not is_generalized_cartan_matrix(M):
|
|
325
|
+
raise ValueError("the input matrix is not a generalized Cartan matrix")
|
|
326
|
+
n = M.ncols()
|
|
327
|
+
data = M.dict()
|
|
328
|
+
subdivisions = M._subdivisions
|
|
329
|
+
|
|
330
|
+
if index_set is None:
|
|
331
|
+
index_set = tuple(range(n))
|
|
332
|
+
else:
|
|
333
|
+
index_set = tuple(index_set)
|
|
334
|
+
|
|
335
|
+
if len(index_set) != n and len(set(index_set)) != n:
|
|
336
|
+
raise ValueError("the given index set is not valid")
|
|
337
|
+
|
|
338
|
+
# We can do the Cartan type initialization later as this is not
|
|
339
|
+
# a unique representation
|
|
340
|
+
mat = typecall(cls, MatrixSpace(ZZ, n, sparse=True), data, False, True)
|
|
341
|
+
# FIXME: We have to initialize the CartanMatrix part separately because
|
|
342
|
+
# of the __cinit__ of the matrix. We should get rid of this workaround
|
|
343
|
+
mat._CM_init(cartan_type, index_set, cartan_type_check)
|
|
344
|
+
mat._subdivisions = subdivisions
|
|
345
|
+
return mat
|
|
346
|
+
|
|
347
|
+
def matrix_space(self, nrows=None, ncols=None, sparse=None):
|
|
348
|
+
r"""
|
|
349
|
+
Return a matrix space over the integers.
|
|
350
|
+
|
|
351
|
+
INPUT:
|
|
352
|
+
|
|
353
|
+
- ``nrows`` -- number of rows
|
|
354
|
+
|
|
355
|
+
- ``ncols`` -- number of columns
|
|
356
|
+
|
|
357
|
+
- ``sparse`` -- boolean
|
|
358
|
+
|
|
359
|
+
EXAMPLES::
|
|
360
|
+
|
|
361
|
+
sage: # needs sage.graphs
|
|
362
|
+
sage: cm = CartanMatrix(['A', 3])
|
|
363
|
+
sage: cm.matrix_space()
|
|
364
|
+
Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring
|
|
365
|
+
sage: cm.matrix_space(2, 2)
|
|
366
|
+
Full MatrixSpace of 2 by 2 sparse matrices over Integer Ring
|
|
367
|
+
sage: cm[:2,1:] # indirect doctest
|
|
368
|
+
[-1 0]
|
|
369
|
+
[ 2 -1]
|
|
370
|
+
"""
|
|
371
|
+
if nrows is None:
|
|
372
|
+
nrows = self.nrows()
|
|
373
|
+
if ncols is None:
|
|
374
|
+
ncols = self.ncols()
|
|
375
|
+
if sparse is None:
|
|
376
|
+
sparse = True
|
|
377
|
+
|
|
378
|
+
if nrows == self.nrows() and ncols == self.ncols() and sparse:
|
|
379
|
+
return self.parent()
|
|
380
|
+
else:
|
|
381
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
382
|
+
return MatrixSpace(ZZ, nrows, ncols, sparse is None or bool(sparse))
|
|
383
|
+
|
|
384
|
+
def _CM_init(self, cartan_type, index_set, cartan_type_check):
|
|
385
|
+
"""
|
|
386
|
+
Initialize ``self`` as a Cartan matrix.
|
|
387
|
+
|
|
388
|
+
TESTS::
|
|
389
|
+
|
|
390
|
+
sage: C = CartanMatrix(['A',1,1]) # indirect doctest # needs sage.graphs
|
|
391
|
+
sage: TestSuite(C).run(skip=["_test_category", "_test_change_ring"]) # needs sage.graphs sage.libs.pari
|
|
392
|
+
|
|
393
|
+
Check that :issue:`37979` is fixed::
|
|
394
|
+
|
|
395
|
+
sage: C = CartanMatrix([[2]], index_set=(4,))
|
|
396
|
+
sage: C.index_set()
|
|
397
|
+
(4,)
|
|
398
|
+
sage: CartanType("A3").subtype((2,)) is CartanType("A1").relabel({1:2}) # needs sage.graphs
|
|
399
|
+
True
|
|
400
|
+
"""
|
|
401
|
+
self._index_set = index_set
|
|
402
|
+
self.set_immutable()
|
|
403
|
+
|
|
404
|
+
if cartan_type is not None:
|
|
405
|
+
cartan_type = CartanType(cartan_type)
|
|
406
|
+
elif self.nrows() == 1:
|
|
407
|
+
cartan_type = CartanType(['A', 1])
|
|
408
|
+
if index_set != (1,):
|
|
409
|
+
cartan_type = cartan_type.relabel({1: index_set[0]})
|
|
410
|
+
elif cartan_type_check:
|
|
411
|
+
# Placeholder so we don't have to reimplement creating a
|
|
412
|
+
# Dynkin diagram from a Cartan matrix
|
|
413
|
+
self._cartan_type = None
|
|
414
|
+
cartan_type = find_cartan_type_from_matrix(self)
|
|
415
|
+
|
|
416
|
+
self._cartan_type = cartan_type
|
|
417
|
+
|
|
418
|
+
def __reduce__(self):
|
|
419
|
+
"""
|
|
420
|
+
Used for pickling.
|
|
421
|
+
|
|
422
|
+
TESTS::
|
|
423
|
+
|
|
424
|
+
sage: CM = CartanMatrix(['A',4]) # needs sage.graphs
|
|
425
|
+
sage: x = loads(dumps(CM)) # needs sage.graphs
|
|
426
|
+
sage: x._index_set # needs sage.graphs
|
|
427
|
+
(1, 2, 3, 4)
|
|
428
|
+
"""
|
|
429
|
+
if self._cartan_type:
|
|
430
|
+
return (CartanMatrix, (self._cartan_type,))
|
|
431
|
+
return (CartanMatrix, (self.dynkin_diagram(),))
|
|
432
|
+
|
|
433
|
+
def root_system(self):
|
|
434
|
+
"""
|
|
435
|
+
Return the root system corresponding to ``self``.
|
|
436
|
+
|
|
437
|
+
EXAMPLES::
|
|
438
|
+
|
|
439
|
+
sage: C = CartanMatrix(['A',3]) # needs sage.graphs
|
|
440
|
+
sage: C.root_system() # needs sage.graphs
|
|
441
|
+
Root system of type ['A', 3]
|
|
442
|
+
"""
|
|
443
|
+
if self._cartan_type is not None:
|
|
444
|
+
return RootSystem(self._cartan_type)
|
|
445
|
+
return self.dynkin_diagram().root_system()
|
|
446
|
+
|
|
447
|
+
def root_space(self):
|
|
448
|
+
"""
|
|
449
|
+
Return the root space corresponding to ``self``.
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: C = CartanMatrix(['A',3]) # needs sage.graphs
|
|
454
|
+
sage: C.root_space() # needs sage.graphs
|
|
455
|
+
Root space over the Rational Field of the Root system of type ['A', 3]
|
|
456
|
+
"""
|
|
457
|
+
return self.root_system().root_space()
|
|
458
|
+
|
|
459
|
+
def reflection_group(self, type='matrix'):
|
|
460
|
+
"""
|
|
461
|
+
Return the reflection group corresponding to ``self``.
|
|
462
|
+
|
|
463
|
+
EXAMPLES::
|
|
464
|
+
|
|
465
|
+
sage: C = CartanMatrix(['A',3]) # needs sage.graphs
|
|
466
|
+
sage: C.reflection_group() # needs sage.graphs sage.libs.gap
|
|
467
|
+
Weyl Group of type ['A', 3] (as a matrix group acting on the root space)
|
|
468
|
+
"""
|
|
469
|
+
RS = self.root_space()
|
|
470
|
+
|
|
471
|
+
if type == "matrix":
|
|
472
|
+
return RS.weyl_group()
|
|
473
|
+
|
|
474
|
+
if type == "permutation":
|
|
475
|
+
if not self.is_finite():
|
|
476
|
+
raise ValueError("only works for finite types")
|
|
477
|
+
Phi = RS.roots()
|
|
478
|
+
gens = {}
|
|
479
|
+
from sage.groups.perm_gps.permgroup_named import SymmetricGroup
|
|
480
|
+
S = SymmetricGroup(len(Phi))
|
|
481
|
+
for i in self.index_set():
|
|
482
|
+
pi = S([ Phi.index( beta.simple_reflection(i) ) + 1 for beta in Phi ])
|
|
483
|
+
gens[i] = pi
|
|
484
|
+
return S.subgroup( gens[i] for i in gens )
|
|
485
|
+
|
|
486
|
+
raise ValueError("the reflection group is only available as a matrix group or as a permutation group")
|
|
487
|
+
|
|
488
|
+
def symmetrizer(self):
|
|
489
|
+
"""
|
|
490
|
+
Return the symmetrizer of ``self``.
|
|
491
|
+
|
|
492
|
+
EXAMPLES::
|
|
493
|
+
|
|
494
|
+
sage: cm = CartanMatrix([[2,-5],[-2,2]]) # needs sage.graphs
|
|
495
|
+
sage: cm.symmetrizer() # needs sage.graphs
|
|
496
|
+
Finite family {0: 2, 1: 5}
|
|
497
|
+
|
|
498
|
+
TESTS:
|
|
499
|
+
|
|
500
|
+
Check that the symmetrizer computed from the Cartan matrix agrees
|
|
501
|
+
with the values given by the Cartan type::
|
|
502
|
+
|
|
503
|
+
sage: ct = CartanType(['B',4,1])
|
|
504
|
+
sage: ct.symmetrizer() # needs sage.graphs
|
|
505
|
+
Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
|
|
506
|
+
sage: ct.cartan_matrix().symmetrizer() # needs sage.graphs
|
|
507
|
+
Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
|
|
508
|
+
"""
|
|
509
|
+
sym = self.is_symmetrizable(True)
|
|
510
|
+
if not sym:
|
|
511
|
+
raise ValueError("the Cartan matrix is not symmetrizable")
|
|
512
|
+
iset = self.index_set()
|
|
513
|
+
# The result from is_symmetrizable needs to be scaled
|
|
514
|
+
# to integer coefficients
|
|
515
|
+
from sage.arith.functions import lcm as LCM
|
|
516
|
+
from sage.rings.rational_field import QQ
|
|
517
|
+
scalar = LCM([QQ(x).denominator() for x in sym])
|
|
518
|
+
return Family( {iset[i]: ZZ(val*scalar) for i, val in enumerate(sym)} )
|
|
519
|
+
|
|
520
|
+
@cached_method
|
|
521
|
+
def symmetrized_matrix(self):
|
|
522
|
+
"""
|
|
523
|
+
Return the symmetrized matrix of ``self`` if symmetrizable.
|
|
524
|
+
|
|
525
|
+
EXAMPLES::
|
|
526
|
+
|
|
527
|
+
sage: cm = CartanMatrix(['B',4,1]) # needs sage.graphs
|
|
528
|
+
sage: cm.symmetrized_matrix() # needs sage.graphs
|
|
529
|
+
[ 4 0 -2 0 0]
|
|
530
|
+
[ 0 4 -2 0 0]
|
|
531
|
+
[-2 -2 4 -2 0]
|
|
532
|
+
[ 0 0 -2 4 -2]
|
|
533
|
+
[ 0 0 0 -2 2]
|
|
534
|
+
"""
|
|
535
|
+
M = matrix.diagonal(list(self.symmetrizer())) * self
|
|
536
|
+
M.set_immutable()
|
|
537
|
+
return M
|
|
538
|
+
|
|
539
|
+
##########################################################################
|
|
540
|
+
# Cartan type methods
|
|
541
|
+
|
|
542
|
+
def index_set(self):
|
|
543
|
+
"""
|
|
544
|
+
Return the index set of ``self``.
|
|
545
|
+
|
|
546
|
+
EXAMPLES::
|
|
547
|
+
|
|
548
|
+
sage: # needs sage.graphs
|
|
549
|
+
sage: C = CartanMatrix(['A',1,1])
|
|
550
|
+
sage: C.index_set()
|
|
551
|
+
(0, 1)
|
|
552
|
+
sage: C = CartanMatrix(['E',6])
|
|
553
|
+
sage: C.index_set()
|
|
554
|
+
(1, 2, 3, 4, 5, 6)
|
|
555
|
+
"""
|
|
556
|
+
return self._index_set
|
|
557
|
+
|
|
558
|
+
def cartan_type(self):
|
|
559
|
+
"""
|
|
560
|
+
Return the Cartan type of ``self`` or ``self`` if unknown.
|
|
561
|
+
|
|
562
|
+
EXAMPLES::
|
|
563
|
+
|
|
564
|
+
sage: C = CartanMatrix(['A',4,1]) # needs sage.graphs
|
|
565
|
+
sage: C.cartan_type() # needs sage.graphs
|
|
566
|
+
['A', 4, 1]
|
|
567
|
+
|
|
568
|
+
If the Cartan type is unknown::
|
|
569
|
+
|
|
570
|
+
sage: C = CartanMatrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]]) # needs sage.graphs
|
|
571
|
+
sage: C.cartan_type() # needs sage.graphs
|
|
572
|
+
[ 2 -1 -2]
|
|
573
|
+
[-1 2 -1]
|
|
574
|
+
[-2 -1 2]
|
|
575
|
+
"""
|
|
576
|
+
if self._cartan_type is None:
|
|
577
|
+
return self
|
|
578
|
+
if is_borcherds_cartan_matrix(self) and not is_generalized_cartan_matrix(self):
|
|
579
|
+
return self
|
|
580
|
+
return self._cartan_type
|
|
581
|
+
|
|
582
|
+
def subtype(self, index_set):
|
|
583
|
+
"""
|
|
584
|
+
Return a subtype of ``self`` given by ``index_set``.
|
|
585
|
+
|
|
586
|
+
A subtype can be considered the Dynkin diagram induced from
|
|
587
|
+
the Dynkin diagram of ``self`` by ``index_set``.
|
|
588
|
+
|
|
589
|
+
EXAMPLES::
|
|
590
|
+
|
|
591
|
+
sage: # needs sage.graphs
|
|
592
|
+
sage: C = CartanMatrix(['F',4])
|
|
593
|
+
sage: S = C.subtype([1,2,3])
|
|
594
|
+
sage: S
|
|
595
|
+
[ 2 -1 0]
|
|
596
|
+
[-1 2 -1]
|
|
597
|
+
[ 0 -2 2]
|
|
598
|
+
sage: S.index_set()
|
|
599
|
+
(1, 2, 3)
|
|
600
|
+
"""
|
|
601
|
+
ind = self.index_set()
|
|
602
|
+
I = [ind.index(i) for i in index_set]
|
|
603
|
+
return CartanMatrix(self.matrix_from_rows_and_columns(I, I), index_set=index_set)
|
|
604
|
+
|
|
605
|
+
def rank(self):
|
|
606
|
+
r"""
|
|
607
|
+
Return the rank of ``self``.
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: CartanMatrix(['C',3]).rank() # needs sage.graphs
|
|
612
|
+
3
|
|
613
|
+
sage: CartanMatrix(["A2","B2","F4"]).rank() # needs sage.graphs
|
|
614
|
+
8
|
|
615
|
+
"""
|
|
616
|
+
return self.ncols()
|
|
617
|
+
|
|
618
|
+
def relabel(self, relabelling):
|
|
619
|
+
"""
|
|
620
|
+
Return the relabelled Cartan matrix.
|
|
621
|
+
|
|
622
|
+
EXAMPLES::
|
|
623
|
+
|
|
624
|
+
sage: # needs sage.graphs
|
|
625
|
+
sage: CM = CartanMatrix(['C',3])
|
|
626
|
+
sage: R = CM.relabel({1:0, 2:4, 3:1}); R
|
|
627
|
+
[ 2 0 -1]
|
|
628
|
+
[ 0 2 -1]
|
|
629
|
+
[-1 -2 2]
|
|
630
|
+
sage: R.index_set()
|
|
631
|
+
(0, 1, 4)
|
|
632
|
+
sage: CM
|
|
633
|
+
[ 2 -1 0]
|
|
634
|
+
[-1 2 -2]
|
|
635
|
+
[ 0 -1 2]
|
|
636
|
+
"""
|
|
637
|
+
return self.dynkin_diagram().relabel(relabelling, inplace=False).cartan_matrix()
|
|
638
|
+
|
|
639
|
+
@cached_method
|
|
640
|
+
def dynkin_diagram(self):
|
|
641
|
+
"""
|
|
642
|
+
Return the Dynkin diagram corresponding to ``self``.
|
|
643
|
+
|
|
644
|
+
EXAMPLES::
|
|
645
|
+
|
|
646
|
+
sage: # needs sage.graphs
|
|
647
|
+
sage: C = CartanMatrix(['A',2])
|
|
648
|
+
sage: C.dynkin_diagram()
|
|
649
|
+
O---O
|
|
650
|
+
1 2
|
|
651
|
+
A2
|
|
652
|
+
sage: C = CartanMatrix(['F',4,1])
|
|
653
|
+
sage: C.dynkin_diagram()
|
|
654
|
+
O---O---O=>=O---O
|
|
655
|
+
0 1 2 3 4
|
|
656
|
+
F4~
|
|
657
|
+
sage: C = CartanMatrix([[2,-4],[-4,2]])
|
|
658
|
+
sage: C.dynkin_diagram()
|
|
659
|
+
Dynkin diagram of rank 2
|
|
660
|
+
"""
|
|
661
|
+
from sage.combinat.root_system.dynkin_diagram import DynkinDiagram
|
|
662
|
+
if self._cartan_type is not None:
|
|
663
|
+
return DynkinDiagram(self._cartan_type)
|
|
664
|
+
return DynkinDiagram(self)
|
|
665
|
+
|
|
666
|
+
def cartan_matrix(self):
|
|
667
|
+
r"""
|
|
668
|
+
Return the Cartan matrix of ``self``.
|
|
669
|
+
|
|
670
|
+
EXAMPLES::
|
|
671
|
+
|
|
672
|
+
sage: CartanMatrix(['C',3]).cartan_matrix() # needs sage.graphs
|
|
673
|
+
[ 2 -1 0]
|
|
674
|
+
[-1 2 -2]
|
|
675
|
+
[ 0 -1 2]
|
|
676
|
+
"""
|
|
677
|
+
return self
|
|
678
|
+
|
|
679
|
+
def dual(self):
|
|
680
|
+
r"""
|
|
681
|
+
Return the dual Cartan matrix of ``self``, which is obtained by taking
|
|
682
|
+
the transpose.
|
|
683
|
+
|
|
684
|
+
EXAMPLES::
|
|
685
|
+
|
|
686
|
+
sage: # needs sage.graphs
|
|
687
|
+
sage: ct = CartanType(['C',3])
|
|
688
|
+
sage: M = CartanMatrix(ct); M
|
|
689
|
+
[ 2 -1 0]
|
|
690
|
+
[-1 2 -2]
|
|
691
|
+
[ 0 -1 2]
|
|
692
|
+
sage: M.dual()
|
|
693
|
+
[ 2 -1 0]
|
|
694
|
+
[-1 2 -1]
|
|
695
|
+
[ 0 -2 2]
|
|
696
|
+
sage: M.dual() == CartanMatrix(ct.dual())
|
|
697
|
+
True
|
|
698
|
+
sage: M.dual().cartan_type() == ct.dual()
|
|
699
|
+
True
|
|
700
|
+
|
|
701
|
+
An example with arbitrary Cartan matrices::
|
|
702
|
+
|
|
703
|
+
sage: # needs sage.graphs
|
|
704
|
+
sage: cm = CartanMatrix([[2,-5], [-2, 2]]); cm
|
|
705
|
+
[ 2 -5]
|
|
706
|
+
[-2 2]
|
|
707
|
+
sage: cm.dual()
|
|
708
|
+
[ 2 -2]
|
|
709
|
+
[-5 2]
|
|
710
|
+
sage: cm.dual() == CartanMatrix(cm.transpose())
|
|
711
|
+
True
|
|
712
|
+
sage: cm.dual().dual() == cm
|
|
713
|
+
True
|
|
714
|
+
"""
|
|
715
|
+
if self._cartan_type is not None:
|
|
716
|
+
return CartanMatrix(self._cartan_type.dual())
|
|
717
|
+
return CartanMatrix(self.transpose())
|
|
718
|
+
|
|
719
|
+
def is_simply_laced(self):
|
|
720
|
+
"""
|
|
721
|
+
Implement :meth:`CartanType_abstract.is_simply_laced()`.
|
|
722
|
+
|
|
723
|
+
A Cartan matrix is simply-laced if all non diagonal entries are `0`
|
|
724
|
+
or `-1`.
|
|
725
|
+
|
|
726
|
+
EXAMPLES::
|
|
727
|
+
|
|
728
|
+
sage: cm = CartanMatrix([[2, -1, -1, -1], [-1, 2, -1, -1], # needs sage.graphs
|
|
729
|
+
....: [-1, -1, 2, -1], [-1, -1, -1, 2]])
|
|
730
|
+
sage: cm.is_simply_laced() # needs sage.graphs
|
|
731
|
+
True
|
|
732
|
+
"""
|
|
733
|
+
for i in range(self.nrows()):
|
|
734
|
+
for j in range(i+1, self.ncols()):
|
|
735
|
+
if self[i, j] < -1 or self[j, i] < -1:
|
|
736
|
+
return False
|
|
737
|
+
return True
|
|
738
|
+
|
|
739
|
+
def is_crystallographic(self):
|
|
740
|
+
"""
|
|
741
|
+
Implement :meth:`CartanType_abstract.is_crystallographic`.
|
|
742
|
+
|
|
743
|
+
A Cartan matrix is crystallographic if it is symmetrizable.
|
|
744
|
+
|
|
745
|
+
EXAMPLES::
|
|
746
|
+
|
|
747
|
+
sage: CartanMatrix(['F',4]).is_crystallographic() # needs sage.graphs
|
|
748
|
+
True
|
|
749
|
+
"""
|
|
750
|
+
return self.is_symmetrizable()
|
|
751
|
+
|
|
752
|
+
def column_with_indices(self, j):
|
|
753
|
+
"""
|
|
754
|
+
Return the `j`-th column `(a_{i,j})_i` of ``self`` as a container
|
|
755
|
+
(or iterator) of tuples `(i, a_{i,j})`
|
|
756
|
+
|
|
757
|
+
EXAMPLES::
|
|
758
|
+
|
|
759
|
+
sage: M = CartanMatrix(['B',4]) # needs sage.graphs
|
|
760
|
+
sage: [ (i,a) for (i,a) in M.column_with_indices(3) ] # needs sage.graphs
|
|
761
|
+
[(3, 2), (2, -1), (4, -2)]
|
|
762
|
+
"""
|
|
763
|
+
return self.dynkin_diagram().column(j)
|
|
764
|
+
|
|
765
|
+
def row_with_indices(self, i):
|
|
766
|
+
"""
|
|
767
|
+
Return the `i`-th row `(a_{i,j})_j` of ``self`` as a container
|
|
768
|
+
(or iterator) of tuples `(j, a_{i,j})`
|
|
769
|
+
|
|
770
|
+
EXAMPLES::
|
|
771
|
+
|
|
772
|
+
sage: M = CartanMatrix(['C',4]) # needs sage.graphs
|
|
773
|
+
sage: [ (i,a) for (i,a) in M.row_with_indices(3) ] # needs sage.graphs
|
|
774
|
+
[(3, 2), (2, -1), (4, -2)]
|
|
775
|
+
"""
|
|
776
|
+
return self.dynkin_diagram().row(i)
|
|
777
|
+
|
|
778
|
+
@cached_method
|
|
779
|
+
def is_finite(self):
|
|
780
|
+
"""
|
|
781
|
+
Return ``True`` if ``self`` is a finite type or ``False`` otherwise.
|
|
782
|
+
|
|
783
|
+
A generalized Cartan matrix is finite if the determinant of all its
|
|
784
|
+
principal submatrices (see :meth:`principal_submatrices`) is positive.
|
|
785
|
+
Such matrices have a positive definite symmetrized matrix. Note that a
|
|
786
|
+
finite matrix may consist of multiple blocks of Cartan matrices each
|
|
787
|
+
having finite Cartan type.
|
|
788
|
+
|
|
789
|
+
EXAMPLES::
|
|
790
|
+
|
|
791
|
+
sage: # needs sage.graphs
|
|
792
|
+
sage: M = CartanMatrix(['C',4])
|
|
793
|
+
sage: M.is_finite()
|
|
794
|
+
True
|
|
795
|
+
sage: M = CartanMatrix(['D',4,1])
|
|
796
|
+
sage: M.is_finite()
|
|
797
|
+
False
|
|
798
|
+
sage: M = CartanMatrix([[2, -4], [-3, 2]])
|
|
799
|
+
sage: M.is_finite()
|
|
800
|
+
False
|
|
801
|
+
"""
|
|
802
|
+
if self._cartan_type is None:
|
|
803
|
+
if not self.is_symmetrizable():
|
|
804
|
+
return False
|
|
805
|
+
return self.symmetrized_matrix().is_positive_definite()
|
|
806
|
+
return self._cartan_type.is_finite()
|
|
807
|
+
|
|
808
|
+
@cached_method
|
|
809
|
+
def is_affine(self):
|
|
810
|
+
"""
|
|
811
|
+
Return ``True`` if ``self`` is an affine type or ``False`` otherwise.
|
|
812
|
+
|
|
813
|
+
A generalized Cartan matrix is affine if all of its indecomposable
|
|
814
|
+
blocks are either finite (see :meth:`is_finite`) or have zero
|
|
815
|
+
determinant with all proper principal minors positive.
|
|
816
|
+
|
|
817
|
+
EXAMPLES::
|
|
818
|
+
|
|
819
|
+
sage: # needs sage.graphs
|
|
820
|
+
sage: M = CartanMatrix(['C',4])
|
|
821
|
+
sage: M.is_affine()
|
|
822
|
+
False
|
|
823
|
+
sage: M = CartanMatrix(['D',4,1])
|
|
824
|
+
sage: M.is_affine()
|
|
825
|
+
True
|
|
826
|
+
sage: M = CartanMatrix([[2, -4], [-3, 2]])
|
|
827
|
+
sage: M.is_affine()
|
|
828
|
+
False
|
|
829
|
+
"""
|
|
830
|
+
if self._cartan_type is None:
|
|
831
|
+
if self.det() != 0:
|
|
832
|
+
return False
|
|
833
|
+
for b in self.indecomposable_blocks():
|
|
834
|
+
if b.det() < 0 or not all(
|
|
835
|
+
a.det() > 0 for a in b.principal_submatrices(proper=True)):
|
|
836
|
+
return False
|
|
837
|
+
return True
|
|
838
|
+
return self._cartan_type.is_affine()
|
|
839
|
+
|
|
840
|
+
@cached_method
|
|
841
|
+
def is_hyperbolic(self, compact=False):
|
|
842
|
+
"""
|
|
843
|
+
Return if ``True`` if ``self`` is a (compact) hyperbolic type
|
|
844
|
+
or ``False`` otherwise.
|
|
845
|
+
|
|
846
|
+
An indecomposable generalized Cartan matrix is hyperbolic if it has
|
|
847
|
+
negative determinant and if any proper connected subdiagram of its
|
|
848
|
+
Dynkin diagram is of finite or affine type. It is compact hyperbolic
|
|
849
|
+
if any proper connected subdiagram has finite type.
|
|
850
|
+
|
|
851
|
+
INPUT:
|
|
852
|
+
|
|
853
|
+
- ``compact`` -- if ``True``, check if matrix is compact hyperbolic
|
|
854
|
+
|
|
855
|
+
EXAMPLES::
|
|
856
|
+
|
|
857
|
+
sage: # needs sage.graphs
|
|
858
|
+
sage: M = CartanMatrix([[2,-2,0],[-2,2,-1],[0,-1,2]])
|
|
859
|
+
sage: M.is_hyperbolic()
|
|
860
|
+
True
|
|
861
|
+
sage: M.is_hyperbolic(compact=True)
|
|
862
|
+
False
|
|
863
|
+
sage: M = CartanMatrix([[2,-3],[-3,2]])
|
|
864
|
+
sage: M.is_hyperbolic()
|
|
865
|
+
True
|
|
866
|
+
sage: M = CartanMatrix(['C',4])
|
|
867
|
+
sage: M.is_hyperbolic()
|
|
868
|
+
False
|
|
869
|
+
"""
|
|
870
|
+
if not self.is_indefinite() or not self.is_indecomposable():
|
|
871
|
+
return False
|
|
872
|
+
|
|
873
|
+
D = self.dynkin_diagram()
|
|
874
|
+
verts = tuple(D.vertex_iterator())
|
|
875
|
+
for v in verts:
|
|
876
|
+
l = set(verts)-set((v,))
|
|
877
|
+
subg = D.subgraph(vertices=l)
|
|
878
|
+
if compact and not subg.is_finite():
|
|
879
|
+
return False
|
|
880
|
+
elif not subg.is_finite() and not subg.is_affine():
|
|
881
|
+
return False
|
|
882
|
+
return True
|
|
883
|
+
|
|
884
|
+
@cached_method
|
|
885
|
+
def is_lorentzian(self):
|
|
886
|
+
"""
|
|
887
|
+
Return ``True`` if ``self`` is a Lorentzian type or ``False`` otherwise.
|
|
888
|
+
|
|
889
|
+
A generalized Cartan matrix is Lorentzian if it has negative determinant
|
|
890
|
+
and exactly one negative eigenvalue.
|
|
891
|
+
|
|
892
|
+
EXAMPLES::
|
|
893
|
+
|
|
894
|
+
sage: # needs sage.graphs sage.rings.number_field
|
|
895
|
+
sage: M = CartanMatrix([[2,-3],[-3,2]])
|
|
896
|
+
sage: M.is_lorentzian()
|
|
897
|
+
True
|
|
898
|
+
sage: M = CartanMatrix([[2,-1],[-1,2]])
|
|
899
|
+
sage: M.is_lorentzian()
|
|
900
|
+
False
|
|
901
|
+
"""
|
|
902
|
+
if self.det() >= 0:
|
|
903
|
+
return False
|
|
904
|
+
return sum(1 for x in self.eigenvalues() if x < 0) == 1
|
|
905
|
+
|
|
906
|
+
@cached_method
|
|
907
|
+
def is_indefinite(self):
|
|
908
|
+
"""
|
|
909
|
+
Return if ``self`` is an indefinite type or ``False`` otherwise.
|
|
910
|
+
|
|
911
|
+
EXAMPLES::
|
|
912
|
+
|
|
913
|
+
sage: # needs sage.graphs
|
|
914
|
+
sage: M = CartanMatrix([[2,-3],[-3,2]])
|
|
915
|
+
sage: M.is_indefinite()
|
|
916
|
+
True
|
|
917
|
+
sage: M = CartanMatrix("A2")
|
|
918
|
+
sage: M.is_indefinite()
|
|
919
|
+
False
|
|
920
|
+
"""
|
|
921
|
+
return not self.is_finite() and not self.is_affine()
|
|
922
|
+
|
|
923
|
+
@cached_method
|
|
924
|
+
def is_indecomposable(self):
|
|
925
|
+
"""
|
|
926
|
+
Return if ``self`` is an indecomposable matrix or ``False`` otherwise.
|
|
927
|
+
|
|
928
|
+
EXAMPLES::
|
|
929
|
+
|
|
930
|
+
sage: # needs sage.graphs
|
|
931
|
+
sage: M = CartanMatrix(['A',5])
|
|
932
|
+
sage: M.is_indecomposable()
|
|
933
|
+
True
|
|
934
|
+
sage: M = CartanMatrix([[2,-1,0],[-1,2,0],[0,0,2]])
|
|
935
|
+
sage: M.is_indecomposable()
|
|
936
|
+
False
|
|
937
|
+
"""
|
|
938
|
+
comp_num = self.dynkin_diagram().connected_components_number()
|
|
939
|
+
# consider the empty matrix to be indecomposable
|
|
940
|
+
return comp_num <= 1
|
|
941
|
+
|
|
942
|
+
@cached_method
|
|
943
|
+
def coxeter_matrix(self):
|
|
944
|
+
r"""
|
|
945
|
+
Return the Coxeter matrix for ``self``.
|
|
946
|
+
|
|
947
|
+
.. SEEALSO:: :meth:`CartanType_abstract.coxeter_matrix`
|
|
948
|
+
|
|
949
|
+
EXAMPLES::
|
|
950
|
+
|
|
951
|
+
sage: # needs sage.graphs
|
|
952
|
+
sage: cm = CartanMatrix([[2,-5,0],[-2,2,-1],[0,-1,2]])
|
|
953
|
+
sage: cm.coxeter_matrix()
|
|
954
|
+
[ 1 -1 2]
|
|
955
|
+
[-1 1 3]
|
|
956
|
+
[ 2 3 1]
|
|
957
|
+
sage: ct = CartanType([['A',2,2], ['B',3]])
|
|
958
|
+
sage: ct.coxeter_matrix()
|
|
959
|
+
[ 1 -1 2 2 2]
|
|
960
|
+
[-1 1 2 2 2]
|
|
961
|
+
[ 2 2 1 3 2]
|
|
962
|
+
[ 2 2 3 1 4]
|
|
963
|
+
[ 2 2 2 4 1]
|
|
964
|
+
sage: ct.cartan_matrix().coxeter_matrix() == ct.coxeter_matrix()
|
|
965
|
+
True
|
|
966
|
+
"""
|
|
967
|
+
scalarproducts_to_order = {0: 2, 1: 3, 2: 4, 3: 6}
|
|
968
|
+
from sage.combinat.root_system.coxeter_matrix import CoxeterMatrix
|
|
969
|
+
I = self.index_set()
|
|
970
|
+
n = len(I)
|
|
971
|
+
M = matrix.identity(ZZ, n)
|
|
972
|
+
for i in range(n):
|
|
973
|
+
for j in range(i+1,n):
|
|
974
|
+
val = self[i,j] * self[j,i]
|
|
975
|
+
val = scalarproducts_to_order.get(val, -1)
|
|
976
|
+
M[i,j] = val
|
|
977
|
+
M[j,i] = val
|
|
978
|
+
return CoxeterMatrix(M, index_set=self.index_set(), cartan_type=self)
|
|
979
|
+
|
|
980
|
+
@cached_method
|
|
981
|
+
def coxeter_diagram(self):
|
|
982
|
+
r"""
|
|
983
|
+
Construct the Coxeter diagram of ``self``.
|
|
984
|
+
|
|
985
|
+
.. SEEALSO:: :meth:`CartanType_abstract.coxeter_diagram`
|
|
986
|
+
|
|
987
|
+
EXAMPLES::
|
|
988
|
+
|
|
989
|
+
sage: # needs sage.graphs
|
|
990
|
+
sage: cm = CartanMatrix([[2,-5,0],[-2,2,-1],[0,-1,2]])
|
|
991
|
+
sage: G = cm.coxeter_diagram(); G
|
|
992
|
+
Graph on 3 vertices
|
|
993
|
+
sage: G.edges(sort=True)
|
|
994
|
+
[(0, 1, +Infinity), (1, 2, 3)]
|
|
995
|
+
sage: ct = CartanType([['A',2,2], ['B',3]])
|
|
996
|
+
sage: ct.coxeter_diagram()
|
|
997
|
+
Graph on 5 vertices
|
|
998
|
+
sage: ct.cartan_matrix().coxeter_diagram() == ct.coxeter_diagram()
|
|
999
|
+
True
|
|
1000
|
+
"""
|
|
1001
|
+
return self.coxeter_matrix().coxeter_graph()
|
|
1002
|
+
|
|
1003
|
+
def principal_submatrices(self, proper=False):
|
|
1004
|
+
"""
|
|
1005
|
+
Return a list of all principal submatrices of ``self``.
|
|
1006
|
+
|
|
1007
|
+
INPUT:
|
|
1008
|
+
|
|
1009
|
+
- ``proper`` -- if ``True``, return only proper submatrices
|
|
1010
|
+
|
|
1011
|
+
EXAMPLES::
|
|
1012
|
+
|
|
1013
|
+
sage: M = CartanMatrix(['A',2]) # needs sage.graphs
|
|
1014
|
+
sage: M.principal_submatrices() # needs sage.graphs
|
|
1015
|
+
[
|
|
1016
|
+
[ 2 -1]
|
|
1017
|
+
[], [2], [2], [-1 2]
|
|
1018
|
+
]
|
|
1019
|
+
sage: M.principal_submatrices(proper=True) # needs sage.graphs
|
|
1020
|
+
[[], [2], [2]]
|
|
1021
|
+
"""
|
|
1022
|
+
iset = list(range(self.ncols()))
|
|
1023
|
+
ret = []
|
|
1024
|
+
for l in powerset(iset):
|
|
1025
|
+
if not proper or (proper and l != iset):
|
|
1026
|
+
ret.append(self.matrix_from_rows_and_columns(l,l))
|
|
1027
|
+
return ret
|
|
1028
|
+
|
|
1029
|
+
@cached_method
|
|
1030
|
+
def indecomposable_blocks(self):
|
|
1031
|
+
"""
|
|
1032
|
+
Return a tuple of all indecomposable blocks of ``self``.
|
|
1033
|
+
|
|
1034
|
+
EXAMPLES::
|
|
1035
|
+
|
|
1036
|
+
sage: # needs sage.graphs
|
|
1037
|
+
sage: M = CartanMatrix(['A',2])
|
|
1038
|
+
sage: M.indecomposable_blocks()
|
|
1039
|
+
(
|
|
1040
|
+
[ 2 -1]
|
|
1041
|
+
[-1 2]
|
|
1042
|
+
)
|
|
1043
|
+
sage: M = CartanMatrix([['A',2,1],['A',3,1]])
|
|
1044
|
+
sage: M.indecomposable_blocks()
|
|
1045
|
+
(
|
|
1046
|
+
[ 2 -1 0 -1]
|
|
1047
|
+
[-1 2 -1 0] [ 2 -1 -1]
|
|
1048
|
+
[ 0 -1 2 -1] [-1 2 -1]
|
|
1049
|
+
[-1 0 -1 2], [-1 -1 2]
|
|
1050
|
+
)
|
|
1051
|
+
"""
|
|
1052
|
+
subgraphs = self.dynkin_diagram().connected_components_subgraphs()
|
|
1053
|
+
return tuple(CartanMatrix(subg._matrix_().rows()) for subg in subgraphs)
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
def is_borcherds_cartan_matrix(M):
|
|
1057
|
+
"""
|
|
1058
|
+
Return ``True`` if ``M`` is an even, integral Borcherds-Cartan matrix.
|
|
1059
|
+
For a definition of such a matrix, see :class:`CartanMatrix`.
|
|
1060
|
+
|
|
1061
|
+
EXAMPLES::
|
|
1062
|
+
|
|
1063
|
+
sage: from sage.combinat.root_system.cartan_matrix import is_borcherds_cartan_matrix
|
|
1064
|
+
sage: M = Matrix([[2,-1],[-1,2]])
|
|
1065
|
+
sage: is_borcherds_cartan_matrix(M)
|
|
1066
|
+
True
|
|
1067
|
+
sage: N = Matrix([[2,-1],[-1,0]])
|
|
1068
|
+
sage: is_borcherds_cartan_matrix(N)
|
|
1069
|
+
False
|
|
1070
|
+
sage: O = Matrix([[2,-1],[-1,-2]])
|
|
1071
|
+
sage: is_borcherds_cartan_matrix(O)
|
|
1072
|
+
True
|
|
1073
|
+
sage: O = Matrix([[2,-1],[-1,-3]])
|
|
1074
|
+
sage: is_borcherds_cartan_matrix(O)
|
|
1075
|
+
False
|
|
1076
|
+
"""
|
|
1077
|
+
if not isinstance(M, Matrix):
|
|
1078
|
+
return False
|
|
1079
|
+
if not M.is_square():
|
|
1080
|
+
return False
|
|
1081
|
+
n = M.ncols()
|
|
1082
|
+
for i in range(n):
|
|
1083
|
+
if M[i,i] == 0:
|
|
1084
|
+
return False
|
|
1085
|
+
if M[i,i] % 2 == 1:
|
|
1086
|
+
return False
|
|
1087
|
+
for j in range(i+1, n):
|
|
1088
|
+
if M[i,j] > 0 or M[j,i] > 0:
|
|
1089
|
+
return False
|
|
1090
|
+
elif M[i,j] == 0 and M[j,i] != 0:
|
|
1091
|
+
return False
|
|
1092
|
+
elif M[j,i] == 0 and M[i,j] != 0:
|
|
1093
|
+
return False
|
|
1094
|
+
return True
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
def is_generalized_cartan_matrix(M):
|
|
1098
|
+
"""
|
|
1099
|
+
Return ``True`` if ``M`` is a generalized Cartan matrix. For a definition
|
|
1100
|
+
of a generalized Cartan matrix, see :class:`CartanMatrix`.
|
|
1101
|
+
|
|
1102
|
+
EXAMPLES::
|
|
1103
|
+
|
|
1104
|
+
sage: from sage.combinat.root_system.cartan_matrix import is_generalized_cartan_matrix
|
|
1105
|
+
sage: M = matrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]])
|
|
1106
|
+
sage: is_generalized_cartan_matrix(M)
|
|
1107
|
+
True
|
|
1108
|
+
sage: M = matrix([[2,-1,-2], [-1,2,-1], [0,-1,2]])
|
|
1109
|
+
sage: is_generalized_cartan_matrix(M)
|
|
1110
|
+
False
|
|
1111
|
+
sage: M = matrix([[1,-1,-2], [-1,2,-1], [-2,-1,2]])
|
|
1112
|
+
sage: is_generalized_cartan_matrix(M)
|
|
1113
|
+
False
|
|
1114
|
+
|
|
1115
|
+
A non-symmetrizable example::
|
|
1116
|
+
|
|
1117
|
+
sage: M = matrix([[2,-1,-2], [-1,2,-1], [-1,-1,2]])
|
|
1118
|
+
sage: is_generalized_cartan_matrix(M)
|
|
1119
|
+
True
|
|
1120
|
+
"""
|
|
1121
|
+
if not is_borcherds_cartan_matrix(M):
|
|
1122
|
+
return False
|
|
1123
|
+
n = M.ncols()
|
|
1124
|
+
return all(M[i,i] == 2 for i in range(n))
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
def find_cartan_type_from_matrix(CM):
|
|
1128
|
+
r"""
|
|
1129
|
+
Find a Cartan type by direct comparison of Dynkin diagrams given from
|
|
1130
|
+
the generalized Cartan matrix ``CM`` and return ``None`` if not found.
|
|
1131
|
+
|
|
1132
|
+
INPUT:
|
|
1133
|
+
|
|
1134
|
+
- ``CM`` -- a generalized Cartan matrix
|
|
1135
|
+
|
|
1136
|
+
EXAMPLES::
|
|
1137
|
+
|
|
1138
|
+
sage: # needs sage.graphs
|
|
1139
|
+
sage: from sage.combinat.root_system.cartan_matrix import find_cartan_type_from_matrix
|
|
1140
|
+
sage: CM = CartanMatrix([[2,-1,-1], [-1,2,-1], [-1,-1,2]])
|
|
1141
|
+
sage: find_cartan_type_from_matrix(CM)
|
|
1142
|
+
['A', 2, 1]
|
|
1143
|
+
sage: CM = CartanMatrix([[2,-1,0], [-1,2,-2], [0,-1,2]])
|
|
1144
|
+
sage: find_cartan_type_from_matrix(CM)
|
|
1145
|
+
['C', 3] relabelled by {1: 0, 2: 1, 3: 2}
|
|
1146
|
+
sage: CM = CartanMatrix([[2,-1,-2], [-1,2,-1], [-2,-1,2]])
|
|
1147
|
+
sage: find_cartan_type_from_matrix(CM)
|
|
1148
|
+
|
|
1149
|
+
TESTS:
|
|
1150
|
+
|
|
1151
|
+
Check that :issue:`35987` is fixed::
|
|
1152
|
+
|
|
1153
|
+
sage: from sage.combinat.root_system.cartan_matrix import find_cartan_type_from_matrix
|
|
1154
|
+
sage: cm = CartanMatrix(['A',7]).subtype([2,3,5]) # needs sage.graphs
|
|
1155
|
+
sage: find_cartan_type_from_matrix(cm) # needs sage.graphs
|
|
1156
|
+
A2xA1 relabelled by {1: 2, 2: 3, 3: 5}
|
|
1157
|
+
|
|
1158
|
+
sage: cm = CartanMatrix(['B',10,1]).subtype([0,1,2,3,5,6,8,9,10]) # needs sage.graphs
|
|
1159
|
+
sage: ct = find_cartan_type_from_matrix(cm); ct # needs sage.graphs
|
|
1160
|
+
D4xB3xA2 relabelled by {1: 0, 2: 2, 3: 1, 4: 3, 5: 8, 6: 9, 7: 10, 8: 5, 9: 6}
|
|
1161
|
+
sage: ct.dynkin_diagram() # needs sage.graphs
|
|
1162
|
+
O 3
|
|
1163
|
+
|
|
|
1164
|
+
|
|
|
1165
|
+
O---O---O
|
|
1166
|
+
0 2 1
|
|
1167
|
+
O---O=>=O
|
|
1168
|
+
8 9 10
|
|
1169
|
+
O---O
|
|
1170
|
+
5 6
|
|
1171
|
+
D4xB3xA2 relabelled by {1: 0, 2: 2, 3: 1, 4: 3, 5: 8, 6: 9, 7: 10, 8: 5, 9: 6}
|
|
1172
|
+
"""
|
|
1173
|
+
types = []
|
|
1174
|
+
relabel = []
|
|
1175
|
+
for S in CM.dynkin_diagram().connected_components_subgraphs():
|
|
1176
|
+
S = DiGraph(S) # We need a simple digraph here
|
|
1177
|
+
n = S.num_verts()
|
|
1178
|
+
# Build the list to test based upon rank
|
|
1179
|
+
if n == 1:
|
|
1180
|
+
relabel.append({1: S.vertices()[0]})
|
|
1181
|
+
types.append(CartanType(['A', 1]))
|
|
1182
|
+
continue
|
|
1183
|
+
|
|
1184
|
+
test = [['A', n]]
|
|
1185
|
+
if n >= 2:
|
|
1186
|
+
if n == 2:
|
|
1187
|
+
test += [['G',2], ['A',2,2]]
|
|
1188
|
+
test += [['B',n], ['A',n-1,1]]
|
|
1189
|
+
if n >= 3:
|
|
1190
|
+
if n == 3:
|
|
1191
|
+
test.append(['G',2,1])
|
|
1192
|
+
test += [['C',n], ['BC',n-1,2], ['C',n-1,1]]
|
|
1193
|
+
if n >= 4:
|
|
1194
|
+
if n == 4:
|
|
1195
|
+
test.append(['F',4])
|
|
1196
|
+
test += [['D',n], ['B',n-1,1]]
|
|
1197
|
+
if n >= 5:
|
|
1198
|
+
if n == 5:
|
|
1199
|
+
test.append(['F',4,1])
|
|
1200
|
+
test.append(['D',n-1,1])
|
|
1201
|
+
if n == 6:
|
|
1202
|
+
test.append(['E',6])
|
|
1203
|
+
elif n == 7:
|
|
1204
|
+
test += [['E',7], ['E',6,1]]
|
|
1205
|
+
elif n == 8:
|
|
1206
|
+
test += [['E',8], ['E',7,1]]
|
|
1207
|
+
elif n == 9:
|
|
1208
|
+
test.append(['E',8,1])
|
|
1209
|
+
|
|
1210
|
+
# Test every possible Cartan type and its dual
|
|
1211
|
+
found = False
|
|
1212
|
+
for x in test:
|
|
1213
|
+
ct = CartanType(x)
|
|
1214
|
+
T = DiGraph(ct.dynkin_diagram()) # We need a simple digraph here
|
|
1215
|
+
iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
|
|
1216
|
+
if iso:
|
|
1217
|
+
types.append(ct)
|
|
1218
|
+
relabel.append(match)
|
|
1219
|
+
found = True
|
|
1220
|
+
break
|
|
1221
|
+
|
|
1222
|
+
if ct == ct.dual():
|
|
1223
|
+
continue # self-dual, so nothing more to test
|
|
1224
|
+
|
|
1225
|
+
ct = ct.dual()
|
|
1226
|
+
T = DiGraph(ct.dynkin_diagram()) # We need a simple digraph here
|
|
1227
|
+
iso, match = T.is_isomorphic(S, certificate=True, edge_labels=True)
|
|
1228
|
+
if iso:
|
|
1229
|
+
types.append(ct)
|
|
1230
|
+
relabel.append(match)
|
|
1231
|
+
found = True
|
|
1232
|
+
break
|
|
1233
|
+
if not found:
|
|
1234
|
+
return None
|
|
1235
|
+
|
|
1236
|
+
if len(types) == 1:
|
|
1237
|
+
# Irreducible, so just relabel
|
|
1238
|
+
return CartanType(types[0]).relabel(relabel[0])
|
|
1239
|
+
ct = CartanType(types)
|
|
1240
|
+
# ct._index_relabelling is a dict ``(ind, j): i``, where i is an index of
|
|
1241
|
+
# ``ct``, ``ind`` is the position in the list of types, and j is the
|
|
1242
|
+
# corresponding index of the type number ``ind``.
|
|
1243
|
+
# In other words, the j-th node of ``types[ind]`` is the i-th node of ``ct``.
|
|
1244
|
+
mapping = {i: relabel[d[0]][d[1]] for d, i in ct._index_relabelling.items()}
|
|
1245
|
+
return ct.relabel(mapping)
|