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,3069 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Cartan types
|
|
4
|
+
|
|
5
|
+
.. TODO::
|
|
6
|
+
|
|
7
|
+
Why does sphinx complain if I use sections here?
|
|
8
|
+
|
|
9
|
+
Introduction
|
|
10
|
+
|
|
11
|
+
Loosely speaking, Dynkin diagrams (or equivalently Cartan matrices)
|
|
12
|
+
are graphs which are used to classify root systems, Coxeter and Weyl
|
|
13
|
+
groups, Lie algebras, Lie groups, crystals, etc. up to an
|
|
14
|
+
isomorphism. *Cartan types* are a standard set of names for those
|
|
15
|
+
Dynkin diagrams (see :wikipedia:`Dynkin_diagram`).
|
|
16
|
+
|
|
17
|
+
Let us consider, for example, the Cartan type `A_4`::
|
|
18
|
+
|
|
19
|
+
sage: T = CartanType(['A', 4]); T
|
|
20
|
+
['A', 4]
|
|
21
|
+
|
|
22
|
+
It is the name of the following Dynkin diagram::
|
|
23
|
+
|
|
24
|
+
sage: DynkinDiagram(T) # needs sage.graphs
|
|
25
|
+
O---O---O---O
|
|
26
|
+
1 2 3 4
|
|
27
|
+
A4
|
|
28
|
+
|
|
29
|
+
.. NOTE::
|
|
30
|
+
|
|
31
|
+
For convenience, the following shortcuts are available::
|
|
32
|
+
|
|
33
|
+
sage: DynkinDiagram(['A',4]) # needs sage.graphs
|
|
34
|
+
O---O---O---O
|
|
35
|
+
1 2 3 4
|
|
36
|
+
A4
|
|
37
|
+
sage: DynkinDiagram('A4') # needs sage.graphs
|
|
38
|
+
O---O---O---O
|
|
39
|
+
1 2 3 4
|
|
40
|
+
A4
|
|
41
|
+
sage: T.dynkin_diagram() # needs sage.graphs
|
|
42
|
+
O---O---O---O
|
|
43
|
+
1 2 3 4
|
|
44
|
+
A4
|
|
45
|
+
|
|
46
|
+
See :class:`~sage.combinat.root_system.dynkin_diagram.DynkinDiagram`
|
|
47
|
+
for how to further manipulate Dynkin diagrams.
|
|
48
|
+
|
|
49
|
+
From this data (the *Cartan datum*), one can construct the associated
|
|
50
|
+
root system::
|
|
51
|
+
|
|
52
|
+
sage: RootSystem(T)
|
|
53
|
+
Root system of type ['A', 4]
|
|
54
|
+
|
|
55
|
+
The associated Weyl group of `A_n` is the symmetric group `S_{n+1}`::
|
|
56
|
+
|
|
57
|
+
sage: W = WeylGroup(T); W # needs sage.libs.gap
|
|
58
|
+
Weyl Group of type ['A', 4] (as a matrix group acting on the ambient space)
|
|
59
|
+
sage: W.cardinality() # needs sage.libs.gap
|
|
60
|
+
120
|
|
61
|
+
|
|
62
|
+
while the Lie algebra is `sl_{n+1}`, and the Lie group `SL_{n+1}`
|
|
63
|
+
(TODO: illustrate this once this is implemented).
|
|
64
|
+
|
|
65
|
+
One may also construct crystals associated to various Dynkin diagrams.
|
|
66
|
+
For example::
|
|
67
|
+
|
|
68
|
+
sage: C = crystals.Letters(T); C # needs sage.combinat
|
|
69
|
+
The crystal of letters for type ['A', 4]
|
|
70
|
+
sage: C.list() # needs sage.combinat
|
|
71
|
+
[1, 2, 3, 4, 5]
|
|
72
|
+
|
|
73
|
+
sage: C = crystals.Tableaux(T, shape=[2]); C # needs sage.combinat
|
|
74
|
+
The crystal of tableaux of type ['A', 4] and shape(s) [[2]]
|
|
75
|
+
sage: C.cardinality() # needs sage.combinat
|
|
76
|
+
15
|
|
77
|
+
|
|
78
|
+
Here is a sample of all the finite irreducible crystallographic Cartan
|
|
79
|
+
types::
|
|
80
|
+
|
|
81
|
+
sage: CartanType.samples(finite=True, crystallographic=True)
|
|
82
|
+
[['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
83
|
+
['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2]]
|
|
84
|
+
|
|
85
|
+
One can also get latex representations of the crystallographic Cartan
|
|
86
|
+
types and their corresponding Dynkin diagrams::
|
|
87
|
+
|
|
88
|
+
sage: [latex(ct) for ct in CartanType.samples(crystallographic=True)]
|
|
89
|
+
[A_{1}, A_{5}, B_{1}, B_{5}, C_{1}, C_{5}, D_{2}, D_{3}, D_{5},
|
|
90
|
+
E_6, E_7, E_8, F_4, G_2,
|
|
91
|
+
A_{1}^{(1)}, A_{5}^{(1)}, B_{1}^{(1)}, B_{5}^{(1)},
|
|
92
|
+
C_{1}^{(1)}, C_{5}^{(1)}, D_{3}^{(1)}, D_{5}^{(1)},
|
|
93
|
+
E_6^{(1)}, E_7^{(1)}, E_8^{(1)}, F_4^{(1)}, G_2^{(1)},
|
|
94
|
+
BC_{1}^{(2)}, BC_{5}^{(2)},
|
|
95
|
+
B_{5}^{(1)\vee}, C_{4}^{(1)\vee}, F_4^{(1)\vee},
|
|
96
|
+
G_2^{(1)\vee}, BC_{1}^{(2)\vee}, BC_{5}^{(2)\vee}]
|
|
97
|
+
sage: view([DynkinDiagram(ct) for ct in CartanType.samples(crystallographic=True)]) # not tested
|
|
98
|
+
|
|
99
|
+
Non-crystallographic Cartan types are also partially supported::
|
|
100
|
+
|
|
101
|
+
sage: CartanType.samples(finite=True, crystallographic=False)
|
|
102
|
+
[['I', 5], ['H', 3], ['H', 4]]
|
|
103
|
+
|
|
104
|
+
In Sage, a Cartan type is used as a database of type-specific
|
|
105
|
+
information and algorithms (see e.g. :mod:`sage.combinat.root_system.type_A`).
|
|
106
|
+
This database includes how to construct the Dynkin diagram, the ambient space
|
|
107
|
+
for the root system (see :wikipedia:`Root_system`), and further
|
|
108
|
+
mathematical properties::
|
|
109
|
+
|
|
110
|
+
sage: T.is_finite(), T.is_simply_laced(), T.is_affine(), T.is_crystallographic()
|
|
111
|
+
(True, True, False, True)
|
|
112
|
+
|
|
113
|
+
In particular, a Sage Cartan type is endowed with a fixed choice of
|
|
114
|
+
labels for the nodes of the Dynkin diagram. This choice follows the
|
|
115
|
+
conventions of Nicolas Bourbaki, Lie Groups and Lie Algebras: Chapter 4-6,
|
|
116
|
+
Elements of Mathematics, Springer (2002). ISBN 978-3540426509. For example::
|
|
117
|
+
|
|
118
|
+
sage: T = CartanType(['D', 4])
|
|
119
|
+
sage: DynkinDiagram(T) # needs sage.graphs
|
|
120
|
+
O 4
|
|
121
|
+
|
|
|
122
|
+
|
|
|
123
|
+
O---O---O
|
|
124
|
+
1 2 3
|
|
125
|
+
D4
|
|
126
|
+
|
|
127
|
+
sage: E6 = CartanType(['E',6])
|
|
128
|
+
sage: DynkinDiagram(E6) # needs sage.graphs
|
|
129
|
+
O 2
|
|
130
|
+
|
|
|
131
|
+
|
|
|
132
|
+
O---O---O---O---O
|
|
133
|
+
1 3 4 5 6
|
|
134
|
+
E6
|
|
135
|
+
|
|
136
|
+
.. NOTE::
|
|
137
|
+
|
|
138
|
+
The direction of the arrows is the **opposite** (i.e. the transpose)
|
|
139
|
+
of Bourbaki's convention, but agrees with Kac's.
|
|
140
|
+
|
|
141
|
+
For example, in type `C_2`, we have::
|
|
142
|
+
|
|
143
|
+
sage: C2 = DynkinDiagram(['C',2]); C2 # needs sage.graphs
|
|
144
|
+
O=<=O
|
|
145
|
+
1 2
|
|
146
|
+
C2
|
|
147
|
+
sage: C2.cartan_matrix() # needs sage.graphs
|
|
148
|
+
[ 2 -2]
|
|
149
|
+
[-1 2]
|
|
150
|
+
|
|
151
|
+
However Bourbaki would have the Cartan matrix as:
|
|
152
|
+
|
|
153
|
+
.. MATH::
|
|
154
|
+
|
|
155
|
+
\begin{bmatrix}
|
|
156
|
+
2 & -1 \\
|
|
157
|
+
-2 & 2
|
|
158
|
+
\end{bmatrix}.
|
|
159
|
+
|
|
160
|
+
If desired, other node labelling conventions can be achieved. For
|
|
161
|
+
example the Kac labelling for type `E_6` can be obtained via::
|
|
162
|
+
|
|
163
|
+
sage: E6.relabel({1:1,2:6,3:2,4:3,5:4,6:5}).dynkin_diagram() # needs sage.graphs
|
|
164
|
+
O 6
|
|
165
|
+
|
|
|
166
|
+
|
|
|
167
|
+
O---O---O---O---O
|
|
168
|
+
1 2 3 4 5
|
|
169
|
+
E6 relabelled by {1: 1, 2: 6, 3: 2, 4: 3, 5: 4, 6: 5}
|
|
170
|
+
|
|
171
|
+
Contributions implementing other conventions are very welcome.
|
|
172
|
+
|
|
173
|
+
Another option is to build from scratch a new Dynkin diagram. The
|
|
174
|
+
architecture has been designed to make it fairly easy to add other
|
|
175
|
+
labelling conventions. In particular, we strived at choosing type free
|
|
176
|
+
algorithms whenever possible, so in principle most features should
|
|
177
|
+
remain available even with custom Cartan types. This has not been used
|
|
178
|
+
much yet, so some rough corners certainly remain.
|
|
179
|
+
|
|
180
|
+
Here, we construct the hyperbolic example of Exercise 4.9 p. 57 of
|
|
181
|
+
Kac, Infinite Dimensional Lie Algebras. We start with an empty Dynkin
|
|
182
|
+
diagram, and add a couple nodes::
|
|
183
|
+
|
|
184
|
+
sage: g = DynkinDiagram() # needs sage.graphs
|
|
185
|
+
sage: g.add_vertices([1,2,3]) # needs sage.graphs
|
|
186
|
+
|
|
187
|
+
Note that the diagonal of the Cartan matrix is already initialized::
|
|
188
|
+
|
|
189
|
+
sage: g.cartan_matrix() # needs sage.graphs
|
|
190
|
+
[2 0 0]
|
|
191
|
+
[0 2 0]
|
|
192
|
+
[0 0 2]
|
|
193
|
+
|
|
194
|
+
Then we add a couple edges::
|
|
195
|
+
|
|
196
|
+
sage: g.add_edge(1,2,2) # needs sage.graphs
|
|
197
|
+
sage: g.add_edge(1,3) # needs sage.graphs
|
|
198
|
+
sage: g.add_edge(2,3) # needs sage.graphs
|
|
199
|
+
|
|
200
|
+
and we get the desired Cartan matrix::
|
|
201
|
+
|
|
202
|
+
sage: g.cartan_matrix() # needs sage.graphs
|
|
203
|
+
[2 0 0]
|
|
204
|
+
[0 2 0]
|
|
205
|
+
[0 0 2]
|
|
206
|
+
|
|
207
|
+
Oops, the Cartan matrix did not change! This is because it is cached
|
|
208
|
+
for efficiency (see :class:`cached_method`). In general, a Dynkin
|
|
209
|
+
diagram should not be modified after having been used.
|
|
210
|
+
|
|
211
|
+
.. WARNING:: this is not checked currently
|
|
212
|
+
|
|
213
|
+
.. TODO:: add a method :meth:`set_mutable` as, say, for matrices
|
|
214
|
+
|
|
215
|
+
Here, we can work around this by clearing the cache::
|
|
216
|
+
|
|
217
|
+
sage: delattr(g, 'cartan_matrix') # needs sage.graphs
|
|
218
|
+
|
|
219
|
+
Now we get the desired Cartan matrix::
|
|
220
|
+
|
|
221
|
+
sage: g.cartan_matrix() # needs sage.graphs
|
|
222
|
+
[ 2 -1 -1]
|
|
223
|
+
[-2 2 -1]
|
|
224
|
+
[-1 -1 2]
|
|
225
|
+
|
|
226
|
+
Note that backward edges have been automatically added::
|
|
227
|
+
|
|
228
|
+
sage: g.edges(sort=True) # needs sage.graphs
|
|
229
|
+
[(1, 2, 2), (1, 3, 1), (2, 1, 1), (2, 3, 1), (3, 1, 1), (3, 2, 1)]
|
|
230
|
+
|
|
231
|
+
.. rubric:: Reducible Cartan types
|
|
232
|
+
|
|
233
|
+
Reducible Cartan types can be specified by passing a sequence
|
|
234
|
+
or list of irreducible Cartan types::
|
|
235
|
+
|
|
236
|
+
sage: CartanType(['A',2],['B',2])
|
|
237
|
+
A2xB2
|
|
238
|
+
sage: CartanType([['A',2],['B',2]])
|
|
239
|
+
A2xB2
|
|
240
|
+
sage: CartanType(['A',2],['B',2]).is_reducible()
|
|
241
|
+
True
|
|
242
|
+
|
|
243
|
+
or using the following short hand notation::
|
|
244
|
+
|
|
245
|
+
sage: CartanType("A2xB2")
|
|
246
|
+
A2xB2
|
|
247
|
+
sage: CartanType("A2","B2") == CartanType("A2xB2")
|
|
248
|
+
True
|
|
249
|
+
|
|
250
|
+
.. rubric:: Degenerate cases
|
|
251
|
+
|
|
252
|
+
When possible, type `I_n` is automatically converted to the isomorphic
|
|
253
|
+
crystallographic Cartan types (any reason not to do so?)::
|
|
254
|
+
|
|
255
|
+
sage: CartanType(["I",1])
|
|
256
|
+
A1xA1
|
|
257
|
+
sage: CartanType(["I",3])
|
|
258
|
+
['A', 2]
|
|
259
|
+
sage: CartanType(["I",4])
|
|
260
|
+
['C', 2]
|
|
261
|
+
sage: CartanType(["I",6])
|
|
262
|
+
['G', 2]
|
|
263
|
+
|
|
264
|
+
The Dynkin diagrams for types `B_1`, `C_1`, `D_2`, and `D_3` are
|
|
265
|
+
isomorphic to that for `A_1`, `A_1`, `A_1 \times A_1`, and `A_3`,
|
|
266
|
+
respectively. However their natural ambient space realizations (stemming
|
|
267
|
+
from the corresponding infinite families of Lie groups) are different.
|
|
268
|
+
Therefore, the Cartan types are considered as distinct::
|
|
269
|
+
|
|
270
|
+
sage: CartanType(['B',1])
|
|
271
|
+
['B', 1]
|
|
272
|
+
sage: CartanType(['C',1])
|
|
273
|
+
['C', 1]
|
|
274
|
+
sage: CartanType(['D',2])
|
|
275
|
+
['D', 2]
|
|
276
|
+
sage: CartanType(['D',3])
|
|
277
|
+
['D', 3]
|
|
278
|
+
|
|
279
|
+
.. rubric:: Affine Cartan types
|
|
280
|
+
|
|
281
|
+
For affine types, we use the usual conventions for affine Coxeter
|
|
282
|
+
groups: each affine type is either untwisted (that is arise from the
|
|
283
|
+
natural affinisation of a finite Cartan type)::
|
|
284
|
+
|
|
285
|
+
sage: CartanType(["A", 4, 1]).dynkin_diagram() # needs sage.graphs
|
|
286
|
+
0
|
|
287
|
+
O-----------+
|
|
288
|
+
| |
|
|
289
|
+
| |
|
|
290
|
+
O---O---O---O
|
|
291
|
+
1 2 3 4
|
|
292
|
+
A4~
|
|
293
|
+
sage: CartanType(["B", 4, 1]).dynkin_diagram() # needs sage.graphs
|
|
294
|
+
O 0
|
|
295
|
+
|
|
|
296
|
+
|
|
|
297
|
+
O---O---O=>=O
|
|
298
|
+
1 2 3 4
|
|
299
|
+
B4~
|
|
300
|
+
|
|
301
|
+
or dual thereof::
|
|
302
|
+
|
|
303
|
+
sage: CartanType(["B", 4, 1]).dual().dynkin_diagram() # needs sage.graphs
|
|
304
|
+
O 0
|
|
305
|
+
|
|
|
306
|
+
|
|
|
307
|
+
O---O---O=<=O
|
|
308
|
+
1 2 3 4
|
|
309
|
+
B4~*
|
|
310
|
+
|
|
311
|
+
or is of type `\widetilde{BC}_n` (which yields an irreducible, but
|
|
312
|
+
nonreduced root system)::
|
|
313
|
+
|
|
314
|
+
sage: CartanType(["BC", 4, 2]).dynkin_diagram() # needs sage.graphs
|
|
315
|
+
O=<=O---O---O=<=O
|
|
316
|
+
0 1 2 3 4
|
|
317
|
+
BC4~
|
|
318
|
+
|
|
319
|
+
This includes the two degenerate cases::
|
|
320
|
+
|
|
321
|
+
sage: CartanType(["A", 1, 1]).dynkin_diagram() # needs sage.graphs
|
|
322
|
+
O<=>O
|
|
323
|
+
0 1
|
|
324
|
+
A1~
|
|
325
|
+
sage: CartanType(["BC", 1, 2]).dynkin_diagram() # needs sage.graphs
|
|
326
|
+
4
|
|
327
|
+
O=<=O
|
|
328
|
+
0 1
|
|
329
|
+
BC1~
|
|
330
|
+
|
|
331
|
+
For the user convenience, Kac's notations for twisted affine types are
|
|
332
|
+
automatically translated into the previous ones::
|
|
333
|
+
|
|
334
|
+
sage: # needs sage.graphs
|
|
335
|
+
sage: CartanType(["A", 9, 2])
|
|
336
|
+
['B', 5, 1]^*
|
|
337
|
+
sage: CartanType(["A", 9, 2]).dynkin_diagram()
|
|
338
|
+
O 0
|
|
339
|
+
|
|
|
340
|
+
|
|
|
341
|
+
O---O---O---O=<=O
|
|
342
|
+
1 2 3 4 5
|
|
343
|
+
B5~*
|
|
344
|
+
sage: CartanType(["A", 10, 2]).dynkin_diagram()
|
|
345
|
+
O=<=O---O---O---O=<=O
|
|
346
|
+
0 1 2 3 4 5
|
|
347
|
+
BC5~
|
|
348
|
+
sage: CartanType(["D", 5, 2]).dynkin_diagram()
|
|
349
|
+
O=<=O---O---O=>=O
|
|
350
|
+
0 1 2 3 4
|
|
351
|
+
C4~*
|
|
352
|
+
sage: CartanType(["D", 4, 3]).dynkin_diagram()
|
|
353
|
+
3
|
|
354
|
+
O=>=O---O
|
|
355
|
+
2 1 0
|
|
356
|
+
G2~* relabelled by {0: 0, 1: 2, 2: 1}
|
|
357
|
+
sage: CartanType(["E", 6, 2]).dynkin_diagram()
|
|
358
|
+
O---O---O=<=O---O
|
|
359
|
+
0 1 2 3 4
|
|
360
|
+
F4~*
|
|
361
|
+
|
|
362
|
+
Additionally one can set the notation option to use Kac's notation::
|
|
363
|
+
|
|
364
|
+
sage: # needs sage.graphs
|
|
365
|
+
sage: CartanType.options['notation'] = 'Kac'
|
|
366
|
+
sage: CartanType(["A", 9, 2])
|
|
367
|
+
['A', 9, 2]
|
|
368
|
+
sage: CartanType(["A", 9, 2]).dynkin_diagram()
|
|
369
|
+
O 0
|
|
370
|
+
|
|
|
371
|
+
|
|
|
372
|
+
O---O---O---O=<=O
|
|
373
|
+
1 2 3 4 5
|
|
374
|
+
A9^2
|
|
375
|
+
sage: CartanType(["A", 10, 2]).dynkin_diagram()
|
|
376
|
+
O=<=O---O---O---O=<=O
|
|
377
|
+
0 1 2 3 4 5
|
|
378
|
+
A10^2
|
|
379
|
+
sage: CartanType(["D", 5, 2]).dynkin_diagram()
|
|
380
|
+
O=<=O---O---O=>=O
|
|
381
|
+
0 1 2 3 4
|
|
382
|
+
D5^2
|
|
383
|
+
sage: CartanType(["D", 4, 3]).dynkin_diagram()
|
|
384
|
+
3
|
|
385
|
+
O=>=O---O
|
|
386
|
+
2 1 0
|
|
387
|
+
D4^3
|
|
388
|
+
sage: CartanType(["E", 6, 2]).dynkin_diagram()
|
|
389
|
+
O---O---O=<=O---O
|
|
390
|
+
0 1 2 3 4
|
|
391
|
+
E6^2
|
|
392
|
+
sage: CartanType.options['notation'] = 'BC'
|
|
393
|
+
|
|
394
|
+
.. rubric:: Infinite Cartan types
|
|
395
|
+
|
|
396
|
+
There are minimal implementations of the Cartan types `A_{\infty}` and
|
|
397
|
+
`A_{+\infty}`. In sage `oo` is the same as `+Infinity`, so `NN` and `ZZ` are
|
|
398
|
+
used to differentiate between the `A_{+\infty}` and `A_{\infty}` root systems::
|
|
399
|
+
|
|
400
|
+
sage: CartanType(['A', NN])
|
|
401
|
+
['A', NN]
|
|
402
|
+
sage: print(CartanType(['A', NN]).ascii_art())
|
|
403
|
+
O---O---O---O---O---O---O---..
|
|
404
|
+
0 1 2 3 4 5 6
|
|
405
|
+
sage: CartanType(['A', ZZ])
|
|
406
|
+
['A', ZZ]
|
|
407
|
+
sage: print(CartanType(['A', ZZ]).ascii_art())
|
|
408
|
+
..---O---O---O---O---O---O---O---..
|
|
409
|
+
-3 -2 -1 0 1 2 3
|
|
410
|
+
|
|
411
|
+
There are also the following shorthands::
|
|
412
|
+
|
|
413
|
+
sage: CartanType("Aoo")
|
|
414
|
+
['A', ZZ]
|
|
415
|
+
sage: CartanType("A+oo")
|
|
416
|
+
['A', NN]
|
|
417
|
+
|
|
418
|
+
.. rubric:: Abstract classes for Cartan types
|
|
419
|
+
|
|
420
|
+
- :class:`CartanType_abstract`
|
|
421
|
+
- :class:`CartanType_crystallographic`
|
|
422
|
+
- :class:`CartanType_simply_laced`
|
|
423
|
+
- :class:`CartanType_simple`
|
|
424
|
+
- :class:`CartanType_finite`
|
|
425
|
+
- :class:`CartanType_affine` (see also :ref:`sage.combinat.root_system.type_affine`)
|
|
426
|
+
- :obj:`sage.combinat.root_system.cartan_type.CartanType`
|
|
427
|
+
- :ref:`sage.combinat.root_system.type_dual`
|
|
428
|
+
- :ref:`sage.combinat.root_system.type_reducible`
|
|
429
|
+
- :ref:`sage.combinat.root_system.type_relabel`
|
|
430
|
+
|
|
431
|
+
Concrete classes for Cartan types
|
|
432
|
+
|
|
433
|
+
- :class:`CartanType_standard`
|
|
434
|
+
- :class:`CartanType_standard_finite`
|
|
435
|
+
- :class:`CartanType_standard_affine`
|
|
436
|
+
- :class:`CartanType_standard_untwisted_affine`
|
|
437
|
+
|
|
438
|
+
Type specific data
|
|
439
|
+
|
|
440
|
+
The data essentially consists of a description of the Dynkin/Coxeter
|
|
441
|
+
diagram and, when relevant, of the natural embedding of the root
|
|
442
|
+
system in a Euclidean space. Everything else is reconstructed from
|
|
443
|
+
this data.
|
|
444
|
+
|
|
445
|
+
- :ref:`sage.combinat.root_system.type_A`
|
|
446
|
+
- :ref:`sage.combinat.root_system.type_B`
|
|
447
|
+
- :ref:`sage.combinat.root_system.type_C`
|
|
448
|
+
- :ref:`sage.combinat.root_system.type_D`
|
|
449
|
+
- :ref:`sage.combinat.root_system.type_E`
|
|
450
|
+
- :ref:`sage.combinat.root_system.type_F`
|
|
451
|
+
- :ref:`sage.combinat.root_system.type_G`
|
|
452
|
+
- :ref:`sage.combinat.root_system.type_H`
|
|
453
|
+
- :ref:`sage.combinat.root_system.type_I`
|
|
454
|
+
- :ref:`sage.combinat.root_system.type_super_A`
|
|
455
|
+
- :ref:`sage.combinat.root_system.type_Q`
|
|
456
|
+
- :ref:`sage.combinat.root_system.type_A_affine`
|
|
457
|
+
- :ref:`sage.combinat.root_system.type_B_affine`
|
|
458
|
+
- :ref:`sage.combinat.root_system.type_C_affine`
|
|
459
|
+
- :ref:`sage.combinat.root_system.type_D_affine`
|
|
460
|
+
- :ref:`sage.combinat.root_system.type_E_affine`
|
|
461
|
+
- :ref:`sage.combinat.root_system.type_F_affine`
|
|
462
|
+
- :ref:`sage.combinat.root_system.type_G_affine`
|
|
463
|
+
- :ref:`sage.combinat.root_system.type_BC_affine`
|
|
464
|
+
- :ref:`sage.combinat.root_system.type_A_infinity`
|
|
465
|
+
|
|
466
|
+
.. TODO:: Should those indexes come before the introduction?
|
|
467
|
+
"""
|
|
468
|
+
# ****************************************************************************
|
|
469
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
470
|
+
# Copyright (C) 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>,
|
|
471
|
+
#
|
|
472
|
+
# This program is free software: you can redistribute it and/or modify
|
|
473
|
+
# it under the terms of the GNU General Public License as published by
|
|
474
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
475
|
+
# (at your option) any later version.
|
|
476
|
+
# https://www.gnu.org/licenses/
|
|
477
|
+
# ****************************************************************************
|
|
478
|
+
|
|
479
|
+
from sage.misc.cachefunc import cached_method
|
|
480
|
+
from sage.misc.abstract_method import abstract_method
|
|
481
|
+
from sage.misc.lazy_import import LazyImport
|
|
482
|
+
from sage.rings.integer_ring import ZZ
|
|
483
|
+
from sage.rings.infinity import Infinity
|
|
484
|
+
from sage.structure.sage_object import SageObject
|
|
485
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
486
|
+
from sage.structure.global_options import GlobalOptions
|
|
487
|
+
from sage.sets.family import Family
|
|
488
|
+
|
|
489
|
+
# TODO:
|
|
490
|
+
# Implement the Kac conventions by relabeling/dual/... of the above
|
|
491
|
+
# Implement Coxeter diagrams for non crystallographic
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
# Intention: we want simultaneously CartanType to be a factory for
|
|
495
|
+
# the various subtypes of CartanType_abstract, as in:
|
|
496
|
+
# CartanType(["A",4,1])
|
|
497
|
+
# and to behaves as a "module" for some extra utilities:
|
|
498
|
+
# CartanType.samples()
|
|
499
|
+
#
|
|
500
|
+
# Implementation: CartanType is the unique instance of this class
|
|
501
|
+
# CartanTypeFactory. Is there a better/more standard way to do it?
|
|
502
|
+
|
|
503
|
+
class CartanTypeFactory(SageObject):
|
|
504
|
+
|
|
505
|
+
def __call__(self, *args):
|
|
506
|
+
"""
|
|
507
|
+
Construct a Cartan type object.
|
|
508
|
+
|
|
509
|
+
INPUT:
|
|
510
|
+
|
|
511
|
+
- ``[letter, rank]`` -- letter is one of 'A', 'B', 'C', 'D', 'E', 'F', 'G'
|
|
512
|
+
and rank is an integer or a pair of integers
|
|
513
|
+
|
|
514
|
+
- ``[letter, rank, twist]`` -- letter is one of 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'BC'
|
|
515
|
+
and rank and twist are integers
|
|
516
|
+
|
|
517
|
+
- ``str`` -- string
|
|
518
|
+
|
|
519
|
+
- ``object`` -- a Cartan type, or an object with a Cartan type method
|
|
520
|
+
|
|
521
|
+
EXAMPLES:
|
|
522
|
+
|
|
523
|
+
We construct the Cartan type `D_4`::
|
|
524
|
+
|
|
525
|
+
sage: d4 = CartanType(['D',4])
|
|
526
|
+
sage: d4
|
|
527
|
+
['D', 4]
|
|
528
|
+
|
|
529
|
+
or, for short::
|
|
530
|
+
|
|
531
|
+
sage: CartanType("D4")
|
|
532
|
+
['D', 4]
|
|
533
|
+
|
|
534
|
+
.. SEEALSO:: :func:`~sage.combinat.root_system.cartan_type.CartanType`
|
|
535
|
+
|
|
536
|
+
TESTS:
|
|
537
|
+
|
|
538
|
+
Check that this is compatible with :class:`CartanTypeFolded`::
|
|
539
|
+
|
|
540
|
+
sage: fct = CartanType(['C', 4, 1]).as_folding()
|
|
541
|
+
sage: CartanType(fct)
|
|
542
|
+
['C', 4, 1]
|
|
543
|
+
|
|
544
|
+
Check that :issue:`13774` is fixed::
|
|
545
|
+
|
|
546
|
+
sage: CT = CartanType([['A',2]])
|
|
547
|
+
sage: CT.is_irreducible()
|
|
548
|
+
True
|
|
549
|
+
sage: CT.cartan_matrix() # needs sage.graphs
|
|
550
|
+
[ 2 -1]
|
|
551
|
+
[-1 2]
|
|
552
|
+
sage: CT = CartanType(['A2'])
|
|
553
|
+
sage: CT.is_irreducible()
|
|
554
|
+
True
|
|
555
|
+
sage: CartanType('A2')
|
|
556
|
+
['A', 2]
|
|
557
|
+
|
|
558
|
+
Check that we can pass any Cartan type as a single element list::
|
|
559
|
+
|
|
560
|
+
sage: CT = CartanType(['A2', 'A2', 'A2'])
|
|
561
|
+
sage: CartanType([CT])
|
|
562
|
+
A2xA2xA2
|
|
563
|
+
|
|
564
|
+
sage: CT = CartanType('A2').relabel({1:-1, 2:-2})
|
|
565
|
+
sage: CartanType([CT])
|
|
566
|
+
['A', 2] relabelled by {1: -1, 2: -2}
|
|
567
|
+
|
|
568
|
+
Check the errors from :issue:`20973`::
|
|
569
|
+
|
|
570
|
+
sage: CartanType(['A',-1])
|
|
571
|
+
Traceback (most recent call last):
|
|
572
|
+
...
|
|
573
|
+
ValueError: ['A', -1] is not a valid Cartan type
|
|
574
|
+
|
|
575
|
+
Check that unicode is handled properly (:issue:`23323`)::
|
|
576
|
+
|
|
577
|
+
sage: CartanType(u"A3")
|
|
578
|
+
['A', 3]
|
|
579
|
+
"""
|
|
580
|
+
if len(args) == 1:
|
|
581
|
+
t = args[0]
|
|
582
|
+
else:
|
|
583
|
+
t = args
|
|
584
|
+
|
|
585
|
+
if isinstance(t, (CartanType_abstract, SuperCartanType_standard)):
|
|
586
|
+
return t
|
|
587
|
+
if hasattr(t, "cartan_type"):
|
|
588
|
+
return t.cartan_type()
|
|
589
|
+
|
|
590
|
+
if len(t) == 1: # Fix for trac #13774
|
|
591
|
+
t = t[0]
|
|
592
|
+
|
|
593
|
+
# We need to make another check
|
|
594
|
+
if isinstance(t, (CartanType_abstract, SuperCartanType_standard)):
|
|
595
|
+
return t
|
|
596
|
+
|
|
597
|
+
from sage.rings.semirings.non_negative_integer_semiring import NN
|
|
598
|
+
if isinstance(t, str):
|
|
599
|
+
if "x" in t:
|
|
600
|
+
from . import type_reducible
|
|
601
|
+
return type_reducible.CartanType([CartanType(u) for u in t.split("x")])
|
|
602
|
+
elif t[-1] == "*":
|
|
603
|
+
return CartanType(t[:-1]).dual()
|
|
604
|
+
elif t[-1] == "~":
|
|
605
|
+
return CartanType(t[:-1]).affine()
|
|
606
|
+
elif t in ["Aoo", "A∞"]:
|
|
607
|
+
return CartanType(['A', Infinity])
|
|
608
|
+
elif t == "A+oo":
|
|
609
|
+
from . import type_A_infinity
|
|
610
|
+
return type_A_infinity.CartanType(NN)
|
|
611
|
+
else:
|
|
612
|
+
return CartanType([t[0], eval(t[1:])])
|
|
613
|
+
|
|
614
|
+
t = list(t)
|
|
615
|
+
if isinstance(t[0], str) and t[1] in [Infinity, ZZ, NN]:
|
|
616
|
+
letter, n = t[0], t[1]
|
|
617
|
+
if letter == 'A':
|
|
618
|
+
from . import type_A_infinity
|
|
619
|
+
if t[1] == NN:
|
|
620
|
+
return type_A_infinity.CartanType(NN)
|
|
621
|
+
else:
|
|
622
|
+
return type_A_infinity.CartanType(ZZ)
|
|
623
|
+
|
|
624
|
+
if isinstance(t[0], str) and t[1] in ZZ and t[1] >= 0:
|
|
625
|
+
letter, n = t[0], t[1]
|
|
626
|
+
if len(t) == 2:
|
|
627
|
+
if letter == "A":
|
|
628
|
+
if n >= 0:
|
|
629
|
+
from . import type_A
|
|
630
|
+
return type_A.CartanType(n)
|
|
631
|
+
if letter == "B":
|
|
632
|
+
if n >= 1:
|
|
633
|
+
from . import type_B
|
|
634
|
+
return type_B.CartanType(n)
|
|
635
|
+
if letter == "C":
|
|
636
|
+
if n >= 1:
|
|
637
|
+
from . import type_C
|
|
638
|
+
return type_C.CartanType(n)
|
|
639
|
+
if letter == "D":
|
|
640
|
+
from . import type_D
|
|
641
|
+
if n >= 2:
|
|
642
|
+
return type_D.CartanType(n)
|
|
643
|
+
if letter == "E":
|
|
644
|
+
if n >= 6 and n <= 8:
|
|
645
|
+
from . import type_E
|
|
646
|
+
return type_E.CartanType(n)
|
|
647
|
+
if letter == "F":
|
|
648
|
+
if n == 4:
|
|
649
|
+
from . import type_F
|
|
650
|
+
return type_F.CartanType()
|
|
651
|
+
if letter == "G":
|
|
652
|
+
if n == 2:
|
|
653
|
+
from . import type_G
|
|
654
|
+
return type_G.CartanType()
|
|
655
|
+
if letter == "H":
|
|
656
|
+
if n in [3, 4]:
|
|
657
|
+
from . import type_H
|
|
658
|
+
return type_H.CartanType(n)
|
|
659
|
+
if letter == "I":
|
|
660
|
+
if n == 1:
|
|
661
|
+
return CartanType([["A", 1], ["A", 1]])
|
|
662
|
+
if n == 3:
|
|
663
|
+
return CartanType(["A", 2])
|
|
664
|
+
if n == 4:
|
|
665
|
+
return CartanType(["C", 2])
|
|
666
|
+
if n == 6:
|
|
667
|
+
return CartanType(["G", 2])
|
|
668
|
+
if n >= 1:
|
|
669
|
+
from . import type_I
|
|
670
|
+
return type_I.CartanType(n)
|
|
671
|
+
if letter == "Q":
|
|
672
|
+
if n >= 1:
|
|
673
|
+
from . import type_Q
|
|
674
|
+
return type_Q.CartanType(n)
|
|
675
|
+
|
|
676
|
+
if len(t) == 3:
|
|
677
|
+
if t[2] == 1: # Untwisted affine
|
|
678
|
+
if letter == "A":
|
|
679
|
+
if n >= 1:
|
|
680
|
+
from . import type_A_affine
|
|
681
|
+
return type_A_affine.CartanType(n)
|
|
682
|
+
if letter == "B":
|
|
683
|
+
if n >= 1:
|
|
684
|
+
from . import type_B_affine
|
|
685
|
+
return type_B_affine.CartanType(n)
|
|
686
|
+
if letter == "C":
|
|
687
|
+
if n >= 1:
|
|
688
|
+
from . import type_C_affine
|
|
689
|
+
return type_C_affine.CartanType(n)
|
|
690
|
+
if letter == "D":
|
|
691
|
+
from . import type_D_affine
|
|
692
|
+
if n >= 3:
|
|
693
|
+
return type_D_affine.CartanType(n)
|
|
694
|
+
if letter == "E":
|
|
695
|
+
if n >= 6 and n <= 8:
|
|
696
|
+
from . import type_E_affine
|
|
697
|
+
return type_E_affine.CartanType(n)
|
|
698
|
+
if letter == "F":
|
|
699
|
+
if n == 4:
|
|
700
|
+
from . import type_F_affine
|
|
701
|
+
return type_F_affine.CartanType()
|
|
702
|
+
if letter == "G":
|
|
703
|
+
if n == 2:
|
|
704
|
+
from . import type_G_affine
|
|
705
|
+
return type_G_affine.CartanType()
|
|
706
|
+
if t[2] in [2,3]:
|
|
707
|
+
if letter == "BC" and t[2] == 2:
|
|
708
|
+
if n >= 1:
|
|
709
|
+
from . import type_BC_affine
|
|
710
|
+
return type_BC_affine.CartanType(n)
|
|
711
|
+
if letter == "A" and t[2] == 2:
|
|
712
|
+
if n % 2 == 0: # Kac' A_2n^(2)
|
|
713
|
+
return CartanType(["BC", ZZ(n//2), 2])
|
|
714
|
+
else: # Kac' A_2n-1^(2)
|
|
715
|
+
return CartanType(["B", ZZ((n+1)//2), 1]).dual()
|
|
716
|
+
if letter == "D" and t[2] == 2:
|
|
717
|
+
return CartanType(["C", n-1, 1]).dual()
|
|
718
|
+
if letter == "D" and t[2] == 3 and n == 4:
|
|
719
|
+
return CartanType(["G", 2, 1]).dual().relabel([0,2,1])
|
|
720
|
+
if letter == "E" and t[2] == 2 and n == 6:
|
|
721
|
+
return CartanType(["F", 4, 1]).dual()
|
|
722
|
+
raise ValueError("%s is not a valid Cartan type" % t)
|
|
723
|
+
|
|
724
|
+
if isinstance(t[0], str) and isinstance(t[1], (list, tuple)):
|
|
725
|
+
letter, n = t[0], t[1]
|
|
726
|
+
if len(t) == 2 and len(n) == 2:
|
|
727
|
+
from . import type_super_A
|
|
728
|
+
return type_super_A.CartanType(n[0], n[1])
|
|
729
|
+
raise ValueError("%s is not a valid super Cartan type" % t)
|
|
730
|
+
|
|
731
|
+
# As the Cartan type has not been recognised try subtypes - but check
|
|
732
|
+
# for the error noted in trac:???
|
|
733
|
+
from . import type_reducible
|
|
734
|
+
try:
|
|
735
|
+
return type_reducible.CartanType([ CartanType(subtype) for subtype in t ])
|
|
736
|
+
except (SyntaxError, ValueError):
|
|
737
|
+
raise ValueError("%s is not a valid Cartan type" % t)
|
|
738
|
+
|
|
739
|
+
def _repr_(self):
|
|
740
|
+
"""
|
|
741
|
+
EXAMPLES::
|
|
742
|
+
|
|
743
|
+
sage: CartanType # indirect doctest
|
|
744
|
+
CartanType
|
|
745
|
+
"""
|
|
746
|
+
return "CartanType"
|
|
747
|
+
|
|
748
|
+
def samples(self, finite=None, affine=None, crystallographic=None):
|
|
749
|
+
"""
|
|
750
|
+
Return a sample of the available Cartan types.
|
|
751
|
+
|
|
752
|
+
INPUT:
|
|
753
|
+
|
|
754
|
+
- ``finite`` -- boolean or ``None`` (default: ``None``)
|
|
755
|
+
|
|
756
|
+
- ``affine`` -- boolean or ``None`` (default: ``None``)
|
|
757
|
+
|
|
758
|
+
- ``crystallographic`` -- boolean or ``None`` (default: ``None``)
|
|
759
|
+
|
|
760
|
+
The sample contains all the exceptional finite and affine
|
|
761
|
+
Cartan types, as well as typical representatives of the
|
|
762
|
+
infinite families.
|
|
763
|
+
|
|
764
|
+
EXAMPLES::
|
|
765
|
+
|
|
766
|
+
sage: CartanType.samples()
|
|
767
|
+
[['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
768
|
+
['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4],
|
|
769
|
+
['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
|
|
770
|
+
['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
|
|
771
|
+
['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
|
|
772
|
+
['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
|
|
773
|
+
|
|
774
|
+
The finite, affine and crystallographic options allow
|
|
775
|
+
respectively for restricting to (non) finite, (non) affine,
|
|
776
|
+
and (non) crystallographic Cartan types::
|
|
777
|
+
|
|
778
|
+
sage: CartanType.samples(finite=True)
|
|
779
|
+
[['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
780
|
+
['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4]]
|
|
781
|
+
|
|
782
|
+
sage: CartanType.samples(affine=True)
|
|
783
|
+
[['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
|
|
784
|
+
['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
|
|
785
|
+
['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
|
|
786
|
+
['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
|
|
787
|
+
|
|
788
|
+
sage: CartanType.samples(crystallographic=True)
|
|
789
|
+
[['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
790
|
+
['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2],
|
|
791
|
+
['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
|
|
792
|
+
['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
|
|
793
|
+
['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
|
|
794
|
+
['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
|
|
795
|
+
|
|
796
|
+
sage: CartanType.samples(crystallographic=False)
|
|
797
|
+
[['I', 5], ['H', 3], ['H', 4]]
|
|
798
|
+
|
|
799
|
+
.. TODO:: add some reducible Cartan types (suggestions?)
|
|
800
|
+
|
|
801
|
+
TESTS::
|
|
802
|
+
|
|
803
|
+
sage: for ct in CartanType.samples(): TestSuite(ct).run()
|
|
804
|
+
"""
|
|
805
|
+
result = self._samples()
|
|
806
|
+
if crystallographic is not None:
|
|
807
|
+
result = [t for t in result if t.is_crystallographic() == crystallographic ]
|
|
808
|
+
if finite is not None:
|
|
809
|
+
result = [t for t in result if t.is_finite() == finite]
|
|
810
|
+
if affine is not None:
|
|
811
|
+
result = [t for t in result if t.is_affine() == affine]
|
|
812
|
+
return result
|
|
813
|
+
|
|
814
|
+
@cached_method
|
|
815
|
+
def _samples(self):
|
|
816
|
+
"""
|
|
817
|
+
Return a sample of all implemented Cartan types.
|
|
818
|
+
|
|
819
|
+
.. NOTE:: This is intended to be used through :meth:`samples`.
|
|
820
|
+
|
|
821
|
+
EXAMPLES::
|
|
822
|
+
|
|
823
|
+
sage: CartanType._samples()
|
|
824
|
+
[['A', 1], ['A', 5], ['B', 1], ['B', 5], ['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
825
|
+
['E', 6], ['E', 7], ['E', 8], ['F', 4], ['G', 2], ['I', 5], ['H', 3], ['H', 4],
|
|
826
|
+
['A', 1, 1], ['A', 5, 1], ['B', 1, 1], ['B', 5, 1],
|
|
827
|
+
['C', 1, 1], ['C', 5, 1], ['D', 3, 1], ['D', 5, 1],
|
|
828
|
+
['E', 6, 1], ['E', 7, 1], ['E', 8, 1], ['F', 4, 1], ['G', 2, 1], ['BC', 1, 2], ['BC', 5, 2],
|
|
829
|
+
['B', 5, 1]^*, ['C', 4, 1]^*, ['F', 4, 1]^*, ['G', 2, 1]^*, ['BC', 1, 2]^*, ['BC', 5, 2]^*]
|
|
830
|
+
"""
|
|
831
|
+
finite_crystallographic = [CartanType(t)
|
|
832
|
+
for t in [['A', 1], ['A', 5], ['B', 1], ['B', 5],
|
|
833
|
+
['C', 1], ['C', 5], ['D', 2], ['D', 3], ['D', 5],
|
|
834
|
+
["E", 6], ["E", 7], ["E", 8],
|
|
835
|
+
["F", 4],
|
|
836
|
+
["G", 2]]]
|
|
837
|
+
|
|
838
|
+
# Support for hand constructed Dynkin diagrams as Cartan types is not yet ready enough for including an example here.
|
|
839
|
+
# from sage.combinat.root_system.dynkin_diagram import DynkinDiagram_class
|
|
840
|
+
# g = DynkinDiagram_class.an_instance()
|
|
841
|
+
return finite_crystallographic + \
|
|
842
|
+
[CartanType(t) for t in [["I", 5], ["H", 3], ["H", 4]]] + \
|
|
843
|
+
[t.affine() for t in finite_crystallographic if t.is_irreducible()] + \
|
|
844
|
+
[CartanType(t) for t in [["BC", 1, 2], ["BC", 5, 2]]] + \
|
|
845
|
+
[CartanType(t).dual() for t in [["B", 5, 1], ["C", 4, 1],
|
|
846
|
+
["F", 4, 1], ["G", 2, 1],
|
|
847
|
+
["BC", 1, 2], ["BC", 5, 2]]] # + \
|
|
848
|
+
# [ g ]
|
|
849
|
+
|
|
850
|
+
_colors = {1: 'blue', -1: 'blue',
|
|
851
|
+
2: 'red', -2: 'red',
|
|
852
|
+
3: 'green', -3: 'green',
|
|
853
|
+
4: 'cyan', -4: 'cyan',
|
|
854
|
+
5: 'magenta', -5: 'magenta',
|
|
855
|
+
6: 'yellow', -6: 'yellow'}
|
|
856
|
+
|
|
857
|
+
@classmethod
|
|
858
|
+
def color(cls, i):
|
|
859
|
+
"""
|
|
860
|
+
Default color scheme for the vertices of a Dynkin diagram (and associated objects).
|
|
861
|
+
|
|
862
|
+
EXAMPLES::
|
|
863
|
+
|
|
864
|
+
sage: CartanType.color(1)
|
|
865
|
+
'blue'
|
|
866
|
+
sage: CartanType.color(2)
|
|
867
|
+
'red'
|
|
868
|
+
sage: CartanType.color(3)
|
|
869
|
+
'green'
|
|
870
|
+
|
|
871
|
+
The default color is black::
|
|
872
|
+
|
|
873
|
+
sage: CartanType.color(0)
|
|
874
|
+
'black'
|
|
875
|
+
|
|
876
|
+
Negative indices get the same color as their positive counterparts::
|
|
877
|
+
|
|
878
|
+
sage: CartanType.color(-1)
|
|
879
|
+
'blue'
|
|
880
|
+
sage: CartanType.color(-2)
|
|
881
|
+
'red'
|
|
882
|
+
sage: CartanType.color(-3)
|
|
883
|
+
'green'
|
|
884
|
+
"""
|
|
885
|
+
return cls._colors.get(i, 'black')
|
|
886
|
+
|
|
887
|
+
# add options to class
|
|
888
|
+
class options(GlobalOptions):
|
|
889
|
+
r"""
|
|
890
|
+
Set and display the options for Cartan types. If no parameters
|
|
891
|
+
are set, then the function returns a copy of the options dictionary.
|
|
892
|
+
|
|
893
|
+
The ``options`` to partitions can be accessed as the method
|
|
894
|
+
:obj:`CartanType.options` of
|
|
895
|
+
:class:`CartanType <CartanTypeFactory>`.
|
|
896
|
+
|
|
897
|
+
@OPTIONS@
|
|
898
|
+
|
|
899
|
+
EXAMPLES::
|
|
900
|
+
|
|
901
|
+
sage: ct = CartanType(['D',5,2]); ct
|
|
902
|
+
['C', 4, 1]^*
|
|
903
|
+
sage: ct.dynkin_diagram() # needs sage.graphs
|
|
904
|
+
O=<=O---O---O=>=O
|
|
905
|
+
0 1 2 3 4
|
|
906
|
+
C4~*
|
|
907
|
+
sage: latex(ct)
|
|
908
|
+
C_{4}^{(1)\vee}
|
|
909
|
+
sage: CartanType.options(dual_str='#', dual_latex='\\ast',)
|
|
910
|
+
sage: ct
|
|
911
|
+
['C', 4, 1]^#
|
|
912
|
+
sage: ct.dynkin_diagram() # needs sage.graphs
|
|
913
|
+
O=<=O---O---O=>=O
|
|
914
|
+
0 1 2 3 4
|
|
915
|
+
C4~#
|
|
916
|
+
sage: latex(ct)
|
|
917
|
+
C_{4}^{(1)\ast}
|
|
918
|
+
sage: CartanType.options(notation='kac', mark_special_node='both')
|
|
919
|
+
sage: ct
|
|
920
|
+
['D', 5, 2]
|
|
921
|
+
sage: ct.dynkin_diagram() # needs sage.graphs
|
|
922
|
+
@=<=O---O---O=>=O
|
|
923
|
+
0 1 2 3 4
|
|
924
|
+
D5^2
|
|
925
|
+
sage: latex(ct)
|
|
926
|
+
D_{5}^{(2)}
|
|
927
|
+
|
|
928
|
+
For type `A_{2n}^{(2)\dagger}`, the dual string/latex options are
|
|
929
|
+
automatically overridden::
|
|
930
|
+
|
|
931
|
+
sage: dct = CartanType(['A',8,2]).dual(); dct
|
|
932
|
+
['A', 8, 2]^+
|
|
933
|
+
sage: latex(dct)
|
|
934
|
+
A_{8}^{(2)\dagger}
|
|
935
|
+
sage: dct.dynkin_diagram() # needs sage.graphs
|
|
936
|
+
@=>=O---O---O=>=O
|
|
937
|
+
0 1 2 3 4
|
|
938
|
+
A8^2+
|
|
939
|
+
sage: CartanType.options._reset()
|
|
940
|
+
"""
|
|
941
|
+
NAME = 'CartanType'
|
|
942
|
+
module = 'sage.combinat.root_system.cartan_type'
|
|
943
|
+
option_class = 'CartanTypeFactory'
|
|
944
|
+
notation = dict(default='Stembridge',
|
|
945
|
+
description='Specifies which notation Cartan types should use when printed',
|
|
946
|
+
values=dict(Stembridge="use Stembridge's notation",
|
|
947
|
+
Kac="use Kac's notation"),
|
|
948
|
+
case_sensitive=False,
|
|
949
|
+
alias=dict(BC='Stembridge', tilde='Stembridge', twisted='Kac'))
|
|
950
|
+
dual_str = dict(default='*',
|
|
951
|
+
description='The string used for dual Cartan types when printing',
|
|
952
|
+
checker=lambda char: isinstance(char, str))
|
|
953
|
+
dual_latex = dict(default='\\vee',
|
|
954
|
+
description='The latex used for dual CartanTypes when latexing',
|
|
955
|
+
checker=lambda char: isinstance(char, str))
|
|
956
|
+
mark_special_node = dict(default='none',
|
|
957
|
+
description="Make the special nodes",
|
|
958
|
+
values=dict(none="no markup", latex="only in latex",
|
|
959
|
+
printing="only in printing", both="both in latex and printing"),
|
|
960
|
+
case_sensitive=False)
|
|
961
|
+
special_node_str = dict(default='@',
|
|
962
|
+
description="The string used to indicate which node is special when printing",
|
|
963
|
+
checker=lambda char: isinstance(char, str))
|
|
964
|
+
marked_node_str = dict(default='X',
|
|
965
|
+
description="The string used to indicate a marked node when printing",
|
|
966
|
+
checker=lambda char: isinstance(char, str))
|
|
967
|
+
latex_relabel = dict(default=True,
|
|
968
|
+
description="Indicate in the latex output if a Cartan type has been relabelled",
|
|
969
|
+
checker=lambda x: isinstance(x, bool))
|
|
970
|
+
latex_marked = dict(default=True,
|
|
971
|
+
description="Indicate in the latex output if a Cartan type has been marked",
|
|
972
|
+
checker=lambda x: isinstance(x, bool))
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
CartanType = CartanTypeFactory()
|
|
976
|
+
CartanType.__doc__ = __doc__
|
|
977
|
+
|
|
978
|
+
|
|
979
|
+
class CartanType_abstract:
|
|
980
|
+
r"""
|
|
981
|
+
Abstract class for Cartan types
|
|
982
|
+
|
|
983
|
+
Subclasses should implement:
|
|
984
|
+
|
|
985
|
+
- :meth:`dynkin_diagram()`
|
|
986
|
+
|
|
987
|
+
- :meth:`cartan_matrix()`
|
|
988
|
+
|
|
989
|
+
- :meth:`is_finite()`
|
|
990
|
+
|
|
991
|
+
- :meth:`is_affine()`
|
|
992
|
+
|
|
993
|
+
- :meth:`is_irreducible()`
|
|
994
|
+
"""
|
|
995
|
+
|
|
996
|
+
def type(self):
|
|
997
|
+
r"""
|
|
998
|
+
Return the type of ``self``, or ``None`` if unknown.
|
|
999
|
+
|
|
1000
|
+
This method should be overridden in any subclass.
|
|
1001
|
+
|
|
1002
|
+
EXAMPLES::
|
|
1003
|
+
|
|
1004
|
+
sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
|
|
1005
|
+
sage: C = CartanType_abstract()
|
|
1006
|
+
sage: C.type() is None
|
|
1007
|
+
True
|
|
1008
|
+
"""
|
|
1009
|
+
return None
|
|
1010
|
+
|
|
1011
|
+
def _add_abstract_superclass(self, classes):
|
|
1012
|
+
"""
|
|
1013
|
+
Add abstract super-classes to the class of ``self``.
|
|
1014
|
+
|
|
1015
|
+
INPUT:
|
|
1016
|
+
|
|
1017
|
+
- ``classes`` -- an abstract class or tuple thereof
|
|
1018
|
+
|
|
1019
|
+
EXAMPLES::
|
|
1020
|
+
|
|
1021
|
+
sage: C = CartanType(["A",3,1])
|
|
1022
|
+
sage: class MyCartanType:
|
|
1023
|
+
....: def my_method(self):
|
|
1024
|
+
....: return 'I am here!'
|
|
1025
|
+
sage: C._add_abstract_superclass(MyCartanType)
|
|
1026
|
+
sage: C.__class__
|
|
1027
|
+
<class 'sage.combinat.root_system.type_A_affine.CartanType_with_superclass_with_superclass'>
|
|
1028
|
+
sage: C.__class__.__bases__
|
|
1029
|
+
(<class 'sage.combinat.root_system.type_A_affine.CartanType_with_superclass'>,
|
|
1030
|
+
<class ...__main__.MyCartanType...>)
|
|
1031
|
+
sage: C.my_method()
|
|
1032
|
+
'I am here!'
|
|
1033
|
+
|
|
1034
|
+
.. TODO:: Generalize to :class:`SageObject`?
|
|
1035
|
+
"""
|
|
1036
|
+
from sage.structure.dynamic_class import dynamic_class
|
|
1037
|
+
assert isinstance(classes, (tuple, type))
|
|
1038
|
+
if not isinstance(classes, tuple):
|
|
1039
|
+
classes = (classes,)
|
|
1040
|
+
bases = (self.__class__,) + classes
|
|
1041
|
+
self.__class__ = dynamic_class(self.__class__.__name__+"_with_superclass", bases)
|
|
1042
|
+
|
|
1043
|
+
def _ascii_art_node(self, label):
|
|
1044
|
+
"""
|
|
1045
|
+
Return the ascii art for the node labelled by ``label``.
|
|
1046
|
+
|
|
1047
|
+
EXAMPLES::
|
|
1048
|
+
|
|
1049
|
+
sage: CartanType(['A',3])._ascii_art_node(2)
|
|
1050
|
+
'O'
|
|
1051
|
+
"""
|
|
1052
|
+
return "O"
|
|
1053
|
+
|
|
1054
|
+
def _latex_draw_node(self, x, y, label, position='below=4pt', fill='white'):
|
|
1055
|
+
r"""
|
|
1056
|
+
Draw (possibly marked [crossed out]) circular node ``i`` at the
|
|
1057
|
+
position ``(x,y)`` with node label ``label`` .
|
|
1058
|
+
|
|
1059
|
+
- ``position`` -- position of the label relative to the node
|
|
1060
|
+
- ``anchor`` -- (optional) the anchor point for the label
|
|
1061
|
+
|
|
1062
|
+
EXAMPLES::
|
|
1063
|
+
|
|
1064
|
+
sage: CartanType(['A',3])._latex_draw_node(0, 0, 1)
|
|
1065
|
+
'\\draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$};\n'
|
|
1066
|
+
"""
|
|
1067
|
+
return "\\draw[fill={}] ({} cm, {} cm) circle (.25cm) node[{}]{{${}$}};\n".format(
|
|
1068
|
+
fill, x, y, position, label)
|
|
1069
|
+
|
|
1070
|
+
def _latex_draw_arrow_tip(self, x, y, rot=0):
|
|
1071
|
+
r"""
|
|
1072
|
+
Draw an arrow tip at the point ``(x, y)`` rotated by ``rot``.
|
|
1073
|
+
|
|
1074
|
+
INPUT:
|
|
1075
|
+
|
|
1076
|
+
- ``(x, y)`` -- the coordinates of a point, in cm
|
|
1077
|
+
|
|
1078
|
+
- ``rot`` -- an angle, in degrees
|
|
1079
|
+
|
|
1080
|
+
This is an internal function used to assist drawing the Dynkin
|
|
1081
|
+
diagrams. See e.g. :meth:`~sage.combinat.root_system.type_B.CartanType._latex_dynkin_diagram`.
|
|
1082
|
+
|
|
1083
|
+
EXAMPLES::
|
|
1084
|
+
|
|
1085
|
+
sage: CartanType(['B',2])._latex_draw_arrow_tip(1, 0, 180)
|
|
1086
|
+
'\\draw[shift={(1, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm);\n'
|
|
1087
|
+
"""
|
|
1088
|
+
return "\\draw[shift={(%s, %s)}, rotate=%s] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm);\n" % (x, y, rot)
|
|
1089
|
+
|
|
1090
|
+
@abstract_method
|
|
1091
|
+
def rank(self):
|
|
1092
|
+
"""
|
|
1093
|
+
Return the rank of ``self``.
|
|
1094
|
+
|
|
1095
|
+
This is the number of nodes of the associated Coxeter or
|
|
1096
|
+
Dynkin diagram.
|
|
1097
|
+
|
|
1098
|
+
EXAMPLES::
|
|
1099
|
+
|
|
1100
|
+
sage: CartanType(['A', 4]).rank()
|
|
1101
|
+
4
|
|
1102
|
+
sage: CartanType(['A', 7, 2]).rank()
|
|
1103
|
+
5
|
|
1104
|
+
sage: CartanType(['I', 8]).rank()
|
|
1105
|
+
2
|
|
1106
|
+
"""
|
|
1107
|
+
#return len(self.index_set())
|
|
1108
|
+
|
|
1109
|
+
@abstract_method
|
|
1110
|
+
def index_set(self):
|
|
1111
|
+
"""
|
|
1112
|
+
Return the index set for ``self``.
|
|
1113
|
+
|
|
1114
|
+
This is the list of the nodes of the associated Coxeter or
|
|
1115
|
+
Dynkin diagram.
|
|
1116
|
+
|
|
1117
|
+
EXAMPLES::
|
|
1118
|
+
|
|
1119
|
+
sage: CartanType(['A', 3, 1]).index_set()
|
|
1120
|
+
(0, 1, 2, 3)
|
|
1121
|
+
sage: CartanType(['D', 4]).index_set()
|
|
1122
|
+
(1, 2, 3, 4)
|
|
1123
|
+
sage: CartanType(['A', 7, 2]).index_set()
|
|
1124
|
+
(0, 1, 2, 3, 4)
|
|
1125
|
+
sage: CartanType(['A', 7, 2]).index_set()
|
|
1126
|
+
(0, 1, 2, 3, 4)
|
|
1127
|
+
sage: CartanType(['A', 6, 2]).index_set()
|
|
1128
|
+
(0, 1, 2, 3)
|
|
1129
|
+
sage: CartanType(['D', 6, 2]).index_set()
|
|
1130
|
+
(0, 1, 2, 3, 4, 5)
|
|
1131
|
+
sage: CartanType(['E', 6, 1]).index_set()
|
|
1132
|
+
(0, 1, 2, 3, 4, 5, 6)
|
|
1133
|
+
sage: CartanType(['E', 6, 2]).index_set()
|
|
1134
|
+
(0, 1, 2, 3, 4)
|
|
1135
|
+
sage: CartanType(['A', 2, 2]).index_set()
|
|
1136
|
+
(0, 1)
|
|
1137
|
+
sage: CartanType(['G', 2, 1]).index_set()
|
|
1138
|
+
(0, 1, 2)
|
|
1139
|
+
sage: CartanType(['F', 4, 1]).index_set()
|
|
1140
|
+
(0, 1, 2, 3, 4)
|
|
1141
|
+
"""
|
|
1142
|
+
|
|
1143
|
+
# This coloring scheme is used for crystal graphs and will eventually
|
|
1144
|
+
# be used for Coxeter groups etc. (experimental feature)
|
|
1145
|
+
_index_set_coloring = {1:"blue", 2:"red", 3:"green"}
|
|
1146
|
+
|
|
1147
|
+
@abstract_method(optional=True)
|
|
1148
|
+
def coxeter_diagram(self):
|
|
1149
|
+
"""
|
|
1150
|
+
Return the Coxeter diagram for ``self``.
|
|
1151
|
+
|
|
1152
|
+
EXAMPLES::
|
|
1153
|
+
|
|
1154
|
+
sage: # needs sage.graphs
|
|
1155
|
+
sage: CartanType(['B',3]).coxeter_diagram()
|
|
1156
|
+
Graph on 3 vertices
|
|
1157
|
+
sage: CartanType(['A',3]).coxeter_diagram().edges(sort=True)
|
|
1158
|
+
[(1, 2, 3), (2, 3, 3)]
|
|
1159
|
+
sage: CartanType(['B',3]).coxeter_diagram().edges(sort=True)
|
|
1160
|
+
[(1, 2, 3), (2, 3, 4)]
|
|
1161
|
+
sage: CartanType(['G',2]).coxeter_diagram().edges(sort=True)
|
|
1162
|
+
[(1, 2, 6)]
|
|
1163
|
+
sage: CartanType(['F',4]).coxeter_diagram().edges(sort=True)
|
|
1164
|
+
[(1, 2, 3), (2, 3, 4), (3, 4, 3)]
|
|
1165
|
+
"""
|
|
1166
|
+
|
|
1167
|
+
@cached_method
|
|
1168
|
+
def coxeter_matrix(self):
|
|
1169
|
+
"""
|
|
1170
|
+
Return the Coxeter matrix for ``self``.
|
|
1171
|
+
|
|
1172
|
+
EXAMPLES::
|
|
1173
|
+
|
|
1174
|
+
sage: CartanType(['A', 4]).coxeter_matrix() # needs sage.graphs
|
|
1175
|
+
[1 3 2 2]
|
|
1176
|
+
[3 1 3 2]
|
|
1177
|
+
[2 3 1 3]
|
|
1178
|
+
[2 2 3 1]
|
|
1179
|
+
"""
|
|
1180
|
+
from sage.combinat.root_system.coxeter_matrix import CoxeterMatrix
|
|
1181
|
+
return CoxeterMatrix(self)
|
|
1182
|
+
|
|
1183
|
+
def coxeter_type(self):
|
|
1184
|
+
"""
|
|
1185
|
+
Return the Coxeter type for ``self``.
|
|
1186
|
+
|
|
1187
|
+
EXAMPLES::
|
|
1188
|
+
|
|
1189
|
+
sage: CartanType(['A', 4]).coxeter_type()
|
|
1190
|
+
Coxeter type of ['A', 4]
|
|
1191
|
+
"""
|
|
1192
|
+
from sage.combinat.root_system.coxeter_type import CoxeterType
|
|
1193
|
+
return CoxeterType(self)
|
|
1194
|
+
|
|
1195
|
+
def dual(self):
|
|
1196
|
+
"""
|
|
1197
|
+
Return the dual Cartan type, possibly just as a formal dual.
|
|
1198
|
+
|
|
1199
|
+
EXAMPLES::
|
|
1200
|
+
|
|
1201
|
+
sage: CartanType(['A',3]).dual()
|
|
1202
|
+
['A', 3]
|
|
1203
|
+
sage: CartanType(["B", 3]).dual()
|
|
1204
|
+
['C', 3]
|
|
1205
|
+
sage: CartanType(['C',2]).dual()
|
|
1206
|
+
['B', 2]
|
|
1207
|
+
sage: CartanType(['D',4]).dual()
|
|
1208
|
+
['D', 4]
|
|
1209
|
+
sage: CartanType(['E',8]).dual()
|
|
1210
|
+
['E', 8]
|
|
1211
|
+
sage: CartanType(['F',4]).dual()
|
|
1212
|
+
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
|
|
1213
|
+
"""
|
|
1214
|
+
from . import type_dual
|
|
1215
|
+
return type_dual.CartanType(self)
|
|
1216
|
+
|
|
1217
|
+
def relabel(self, relabelling):
|
|
1218
|
+
"""
|
|
1219
|
+
Return a relabelled copy of this Cartan type.
|
|
1220
|
+
|
|
1221
|
+
INPUT:
|
|
1222
|
+
|
|
1223
|
+
- ``relabelling`` -- a function (or a list or dictionary)
|
|
1224
|
+
|
|
1225
|
+
OUTPUT:
|
|
1226
|
+
|
|
1227
|
+
an isomorphic Cartan type obtained by relabelling the nodes of
|
|
1228
|
+
the Dynkin diagram. Namely, the node with label ``i`` is
|
|
1229
|
+
relabelled ``f(i)`` (or, by ``f[i]`` if ``f`` is a list or
|
|
1230
|
+
dictionary).
|
|
1231
|
+
|
|
1232
|
+
EXAMPLES::
|
|
1233
|
+
|
|
1234
|
+
sage: CartanType(['F',4]).relabel({ 1:4, 2:3, 3:2, 4:1 }).dynkin_diagram() # needs sage.graphs
|
|
1235
|
+
O---O=>=O---O
|
|
1236
|
+
4 3 2 1
|
|
1237
|
+
F4 relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
|
|
1238
|
+
"""
|
|
1239
|
+
from . import type_relabel
|
|
1240
|
+
return type_relabel.CartanType(self, relabelling)
|
|
1241
|
+
|
|
1242
|
+
def subtype(self, index_set):
|
|
1243
|
+
"""
|
|
1244
|
+
Return a subtype of ``self`` given by ``index_set``.
|
|
1245
|
+
|
|
1246
|
+
A subtype can be considered the Dynkin diagram induced from
|
|
1247
|
+
the Dynkin diagram of ``self`` by ``index_set``.
|
|
1248
|
+
|
|
1249
|
+
EXAMPLES::
|
|
1250
|
+
|
|
1251
|
+
sage: ct = CartanType(['A',6,2])
|
|
1252
|
+
sage: ct.dynkin_diagram() # needs sage.graphs
|
|
1253
|
+
O=<=O---O=<=O
|
|
1254
|
+
0 1 2 3
|
|
1255
|
+
BC3~
|
|
1256
|
+
sage: ct.subtype([1,2,3]) # needs sage.graphs
|
|
1257
|
+
['C', 3]
|
|
1258
|
+
"""
|
|
1259
|
+
return self.cartan_matrix().subtype(index_set).cartan_type()
|
|
1260
|
+
|
|
1261
|
+
def marked_nodes(self, marked_nodes):
|
|
1262
|
+
"""
|
|
1263
|
+
Return a Cartan type with the nodes ``marked_nodes`` marked.
|
|
1264
|
+
|
|
1265
|
+
INPUT:
|
|
1266
|
+
|
|
1267
|
+
- ``marked_nodes`` -- list of nodes to mark
|
|
1268
|
+
|
|
1269
|
+
EXAMPLES::
|
|
1270
|
+
|
|
1271
|
+
sage: CartanType(['F',4]).marked_nodes([1, 3]).dynkin_diagram() # needs sage.graphs
|
|
1272
|
+
X---O=>=X---O
|
|
1273
|
+
1 2 3 4
|
|
1274
|
+
F4 with nodes (1, 3) marked
|
|
1275
|
+
"""
|
|
1276
|
+
if not marked_nodes:
|
|
1277
|
+
return self
|
|
1278
|
+
from . import type_marked
|
|
1279
|
+
return type_marked.CartanType(self, marked_nodes)
|
|
1280
|
+
|
|
1281
|
+
def is_reducible(self):
|
|
1282
|
+
"""
|
|
1283
|
+
Report whether the root system is reducible (i.e. not simple), that
|
|
1284
|
+
is whether it can be factored as a product of root systems.
|
|
1285
|
+
|
|
1286
|
+
EXAMPLES::
|
|
1287
|
+
|
|
1288
|
+
sage: CartanType("A2xB3").is_reducible()
|
|
1289
|
+
True
|
|
1290
|
+
sage: CartanType(['A',2]).is_reducible()
|
|
1291
|
+
False
|
|
1292
|
+
"""
|
|
1293
|
+
return not self.is_irreducible()
|
|
1294
|
+
|
|
1295
|
+
def is_irreducible(self):
|
|
1296
|
+
"""
|
|
1297
|
+
Report whether this Cartan type is irreducible (i.e. simple). This
|
|
1298
|
+
should be overridden in any subclass.
|
|
1299
|
+
|
|
1300
|
+
This returns ``False`` by default. Derived class should override this
|
|
1301
|
+
appropriately.
|
|
1302
|
+
|
|
1303
|
+
EXAMPLES::
|
|
1304
|
+
|
|
1305
|
+
sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
|
|
1306
|
+
sage: C = CartanType_abstract()
|
|
1307
|
+
sage: C.is_irreducible()
|
|
1308
|
+
False
|
|
1309
|
+
"""
|
|
1310
|
+
return False
|
|
1311
|
+
|
|
1312
|
+
def is_atomic(self):
|
|
1313
|
+
r"""
|
|
1314
|
+
This method is usually equivalent to :meth:`is_reducible`,
|
|
1315
|
+
except for the Cartan type `D_2`.
|
|
1316
|
+
|
|
1317
|
+
`D_2` is not a standard Cartan type. It is equivalent to type
|
|
1318
|
+
`A_1 \times A_1` which is reducible; however the isomorphism
|
|
1319
|
+
from its ambient space (for the orthogonal group of degree 4)
|
|
1320
|
+
to that of `A_1 \times A_1` is non trivial, and it is useful to
|
|
1321
|
+
have it.
|
|
1322
|
+
|
|
1323
|
+
From a programming point of view its implementation is more
|
|
1324
|
+
similar to the irreducible types, and so the method
|
|
1325
|
+
:meth:`is_atomic()` is supplied.
|
|
1326
|
+
|
|
1327
|
+
EXAMPLES::
|
|
1328
|
+
|
|
1329
|
+
sage: CartanType("D2").is_atomic()
|
|
1330
|
+
True
|
|
1331
|
+
sage: CartanType("D2").is_irreducible()
|
|
1332
|
+
False
|
|
1333
|
+
|
|
1334
|
+
TESTS::
|
|
1335
|
+
|
|
1336
|
+
sage: all( T.is_irreducible() == T.is_atomic() for T in CartanType.samples() if T != CartanType("D2"))
|
|
1337
|
+
True
|
|
1338
|
+
"""
|
|
1339
|
+
return self.is_irreducible()
|
|
1340
|
+
|
|
1341
|
+
def is_compound(self):
|
|
1342
|
+
"""
|
|
1343
|
+
A short hand for not :meth:`is_atomic`.
|
|
1344
|
+
|
|
1345
|
+
TESTS::
|
|
1346
|
+
|
|
1347
|
+
sage: all( T.is_compound() == (not T.is_atomic()) for T in CartanType.samples())
|
|
1348
|
+
True
|
|
1349
|
+
"""
|
|
1350
|
+
return not self.is_atomic()
|
|
1351
|
+
|
|
1352
|
+
@abstract_method
|
|
1353
|
+
def is_finite(self):
|
|
1354
|
+
"""
|
|
1355
|
+
Return whether this Cartan type is finite.
|
|
1356
|
+
|
|
1357
|
+
EXAMPLES::
|
|
1358
|
+
|
|
1359
|
+
sage: from sage.combinat.root_system.cartan_type import CartanType_abstract
|
|
1360
|
+
sage: C = CartanType_abstract()
|
|
1361
|
+
sage: C.is_finite()
|
|
1362
|
+
Traceback (most recent call last):
|
|
1363
|
+
...
|
|
1364
|
+
NotImplementedError: <abstract method is_finite at ...>
|
|
1365
|
+
|
|
1366
|
+
::
|
|
1367
|
+
|
|
1368
|
+
sage: CartanType(['A',4]).is_finite()
|
|
1369
|
+
True
|
|
1370
|
+
sage: CartanType(['A',4, 1]).is_finite()
|
|
1371
|
+
False
|
|
1372
|
+
"""
|
|
1373
|
+
|
|
1374
|
+
@abstract_method
|
|
1375
|
+
def is_affine(self):
|
|
1376
|
+
"""
|
|
1377
|
+
Return whether ``self`` is affine.
|
|
1378
|
+
|
|
1379
|
+
EXAMPLES::
|
|
1380
|
+
|
|
1381
|
+
sage: CartanType(['A', 3]).is_affine()
|
|
1382
|
+
False
|
|
1383
|
+
sage: CartanType(['A', 3, 1]).is_affine()
|
|
1384
|
+
True
|
|
1385
|
+
"""
|
|
1386
|
+
|
|
1387
|
+
def is_crystallographic(self):
|
|
1388
|
+
"""
|
|
1389
|
+
Return whether this Cartan type is crystallographic.
|
|
1390
|
+
|
|
1391
|
+
This returns ``False`` by default. Derived class should override this
|
|
1392
|
+
appropriately.
|
|
1393
|
+
|
|
1394
|
+
EXAMPLES::
|
|
1395
|
+
|
|
1396
|
+
sage: [ [t, t.is_crystallographic() ] for t in CartanType.samples(finite=True) ]
|
|
1397
|
+
[[['A', 1], True], [['A', 5], True],
|
|
1398
|
+
[['B', 1], True], [['B', 5], True],
|
|
1399
|
+
[['C', 1], True], [['C', 5], True],
|
|
1400
|
+
[['D', 2], True], [['D', 3], True], [['D', 5], True],
|
|
1401
|
+
[['E', 6], True], [['E', 7], True], [['E', 8], True],
|
|
1402
|
+
[['F', 4], True], [['G', 2], True],
|
|
1403
|
+
[['I', 5], False], [['H', 3], False], [['H', 4], False]]
|
|
1404
|
+
"""
|
|
1405
|
+
return False
|
|
1406
|
+
|
|
1407
|
+
def is_simply_laced(self):
|
|
1408
|
+
"""
|
|
1409
|
+
Return whether this Cartan type is simply laced.
|
|
1410
|
+
|
|
1411
|
+
This returns ``False`` by default. Derived class should override this
|
|
1412
|
+
appropriately.
|
|
1413
|
+
|
|
1414
|
+
EXAMPLES::
|
|
1415
|
+
|
|
1416
|
+
sage: [ [t, t.is_simply_laced() ] for t in CartanType.samples() ]
|
|
1417
|
+
[[['A', 1], True], [['A', 5], True],
|
|
1418
|
+
[['B', 1], True], [['B', 5], False],
|
|
1419
|
+
[['C', 1], True], [['C', 5], False],
|
|
1420
|
+
[['D', 2], True], [['D', 3], True], [['D', 5], True],
|
|
1421
|
+
[['E', 6], True], [['E', 7], True], [['E', 8], True],
|
|
1422
|
+
[['F', 4], False], [['G', 2], False], [['I', 5], False],
|
|
1423
|
+
[['H', 3], False], [['H', 4], False],
|
|
1424
|
+
[['A', 1, 1], False], [['A', 5, 1], True],
|
|
1425
|
+
[['B', 1, 1], False], [['B', 5, 1], False],
|
|
1426
|
+
[['C', 1, 1], False], [['C', 5, 1], False],
|
|
1427
|
+
[['D', 3, 1], True], [['D', 5, 1], True],
|
|
1428
|
+
[['E', 6, 1], True], [['E', 7, 1], True], [['E', 8, 1], True],
|
|
1429
|
+
[['F', 4, 1], False], [['G', 2, 1], False],
|
|
1430
|
+
[['BC', 1, 2], False], [['BC', 5, 2], False],
|
|
1431
|
+
[['B', 5, 1]^*, False], [['C', 4, 1]^*, False],
|
|
1432
|
+
[['F', 4, 1]^*, False], [['G', 2, 1]^*, False],
|
|
1433
|
+
[['BC', 1, 2]^*, False], [['BC', 5, 2]^*, False]]
|
|
1434
|
+
"""
|
|
1435
|
+
return False
|
|
1436
|
+
|
|
1437
|
+
def is_implemented(self):
|
|
1438
|
+
"""
|
|
1439
|
+
Check whether the Cartan datum for ``self`` is actually implemented.
|
|
1440
|
+
|
|
1441
|
+
EXAMPLES::
|
|
1442
|
+
|
|
1443
|
+
sage: CartanType(["A",4,1]).is_implemented() # needs sage.graphs
|
|
1444
|
+
True
|
|
1445
|
+
sage: CartanType(['H',3]).is_implemented()
|
|
1446
|
+
True
|
|
1447
|
+
"""
|
|
1448
|
+
try:
|
|
1449
|
+
self.coxeter_diagram()
|
|
1450
|
+
return True
|
|
1451
|
+
except Exception:
|
|
1452
|
+
return False
|
|
1453
|
+
|
|
1454
|
+
def root_system(self):
|
|
1455
|
+
"""
|
|
1456
|
+
Return the root system associated to ``self``.
|
|
1457
|
+
|
|
1458
|
+
EXAMPLES::
|
|
1459
|
+
|
|
1460
|
+
sage: CartanType(['A',4]).root_system()
|
|
1461
|
+
Root system of type ['A', 4]
|
|
1462
|
+
"""
|
|
1463
|
+
from sage.combinat.root_system.root_system import RootSystem
|
|
1464
|
+
return RootSystem(self)
|
|
1465
|
+
|
|
1466
|
+
def as_folding(self, folding_of=None, sigma=None):
|
|
1467
|
+
r"""
|
|
1468
|
+
Return ``self`` realized as a folded Cartan type.
|
|
1469
|
+
|
|
1470
|
+
For finite and affine types, this is realized by the Dynkin
|
|
1471
|
+
diagram foldings:
|
|
1472
|
+
|
|
1473
|
+
.. MATH::
|
|
1474
|
+
|
|
1475
|
+
\begin{array}{ccl}
|
|
1476
|
+
C_n^{(1)}, A_{2n}^{(2)}, A_{2n}^{(2)\dagger}, D_{n+1}^{(2)}
|
|
1477
|
+
& \hookrightarrow & A_{2n-1}^{(1)}, \\
|
|
1478
|
+
A_{2n-1}^{(2)}, B_n^{(1)} & \hookrightarrow & D_{n+1}^{(1)}, \\
|
|
1479
|
+
E_6^{(2)}, F_4^{(1)} & \hookrightarrow & E_6^{(1)}, \\
|
|
1480
|
+
D_4^{(3)}, G_2^{(1)} & \hookrightarrow & D_4^{(1)}, \\
|
|
1481
|
+
C_n & \hookrightarrow & A_{2n-1}, \\
|
|
1482
|
+
B_n & \hookrightarrow & D_{n+1}, \\
|
|
1483
|
+
F_4 & \hookrightarrow & E_6, \\
|
|
1484
|
+
G_2 & \hookrightarrow & D_4.
|
|
1485
|
+
\end{array}
|
|
1486
|
+
|
|
1487
|
+
For general types, this returns ``self`` as a folded type of ``self``
|
|
1488
|
+
with `\sigma` as the identity map.
|
|
1489
|
+
|
|
1490
|
+
For more information on these foldings and folded Cartan types, see
|
|
1491
|
+
:class:`sage.combinat.root_system.type_folded.CartanTypeFolded`.
|
|
1492
|
+
|
|
1493
|
+
If the optional inputs ``folding_of`` and ``sigma`` are specified, then
|
|
1494
|
+
this returns the folded Cartan type of ``self`` in ``folding_of`` given
|
|
1495
|
+
by the automorphism ``sigma``.
|
|
1496
|
+
|
|
1497
|
+
EXAMPLES::
|
|
1498
|
+
|
|
1499
|
+
sage: CartanType(['B', 3, 1]).as_folding()
|
|
1500
|
+
['B', 3, 1] as a folding of ['D', 4, 1]
|
|
1501
|
+
sage: CartanType(['F', 4]).as_folding()
|
|
1502
|
+
['F', 4] as a folding of ['E', 6]
|
|
1503
|
+
sage: CartanType(['BC', 3, 2]).as_folding()
|
|
1504
|
+
['BC', 3, 2] as a folding of ['A', 5, 1]
|
|
1505
|
+
sage: CartanType(['D', 4, 3]).as_folding()
|
|
1506
|
+
['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1} as a folding of ['D', 4, 1]
|
|
1507
|
+
"""
|
|
1508
|
+
from sage.combinat.root_system.type_folded import CartanTypeFolded
|
|
1509
|
+
if folding_of is None and sigma is None:
|
|
1510
|
+
return self._default_folded_cartan_type()
|
|
1511
|
+
if folding_of is None or sigma is None:
|
|
1512
|
+
raise ValueError("Both folding_of and sigma must be given")
|
|
1513
|
+
return CartanTypeFolded(self, folding_of, sigma)
|
|
1514
|
+
|
|
1515
|
+
def _default_folded_cartan_type(self):
|
|
1516
|
+
r"""
|
|
1517
|
+
Return the default folded Cartan type.
|
|
1518
|
+
|
|
1519
|
+
In general, this just returns ``self`` in ``self`` with `\sigma` as
|
|
1520
|
+
the identity map.
|
|
1521
|
+
|
|
1522
|
+
EXAMPLES::
|
|
1523
|
+
|
|
1524
|
+
sage: D = CartanMatrix([[2, -3], [-2, 2]]).dynkin_diagram() # needs sage.graphs
|
|
1525
|
+
sage: D._default_folded_cartan_type() # needs sage.graphs
|
|
1526
|
+
Dynkin diagram of rank 2 as a folding of Dynkin diagram of rank 2
|
|
1527
|
+
"""
|
|
1528
|
+
from sage.combinat.root_system.type_folded import CartanTypeFolded
|
|
1529
|
+
return CartanTypeFolded(self, self, [[i] for i in self.index_set()])
|
|
1530
|
+
|
|
1531
|
+
options = CartanType.options
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
class CartanType_crystallographic(CartanType_abstract):
|
|
1535
|
+
"""
|
|
1536
|
+
An abstract class for crystallographic Cartan types.
|
|
1537
|
+
"""
|
|
1538
|
+
# The default value should really be lambda x:x, but sphinx does
|
|
1539
|
+
# not like it currently (see #14553); since this is an abstract method
|
|
1540
|
+
# the value won't actually be used, so we put a fake instead.
|
|
1541
|
+
@abstract_method(optional=True)
|
|
1542
|
+
def ascii_art(self, label='lambda x: x', node=None):
|
|
1543
|
+
r"""
|
|
1544
|
+
Return an ascii art representation of the Dynkin diagram.
|
|
1545
|
+
|
|
1546
|
+
INPUT:
|
|
1547
|
+
|
|
1548
|
+
- ``label`` -- (default: the identity) a relabeling function
|
|
1549
|
+
for the nodes
|
|
1550
|
+
- ``node`` -- (optional) a function which returns
|
|
1551
|
+
the character for a node
|
|
1552
|
+
|
|
1553
|
+
EXAMPLES::
|
|
1554
|
+
|
|
1555
|
+
sage: cartan_type = CartanType(['B',5,1])
|
|
1556
|
+
sage: print(cartan_type.ascii_art())
|
|
1557
|
+
O 0
|
|
1558
|
+
|
|
|
1559
|
+
|
|
|
1560
|
+
O---O---O---O=>=O
|
|
1561
|
+
1 2 3 4 5
|
|
1562
|
+
|
|
1563
|
+
The label option is useful to visualize various statistics on
|
|
1564
|
+
the nodes of the Dynkin diagram::
|
|
1565
|
+
|
|
1566
|
+
sage: a = cartan_type.col_annihilator(); a # needs sage.graphs
|
|
1567
|
+
Finite family {0: 1, 1: 1, 2: 2, 3: 2, 4: 2, 5: 2}
|
|
1568
|
+
sage: print(CartanType(['B',5,1]).ascii_art(label=a.__getitem__)) # needs sage.graphs
|
|
1569
|
+
O 1
|
|
1570
|
+
|
|
|
1571
|
+
|
|
|
1572
|
+
O---O---O---O=>=O
|
|
1573
|
+
1 2 2 2 2
|
|
1574
|
+
"""
|
|
1575
|
+
|
|
1576
|
+
# The default value of label should really be lambda i:i, but sphinx does
|
|
1577
|
+
# not like it currently (see #14553); since this is an abstract method
|
|
1578
|
+
# the value won't actually be used, so we put a fake instead.
|
|
1579
|
+
@abstract_method(optional=True)
|
|
1580
|
+
def _latex_dynkin_diagram(self, label='lambda i: i',
|
|
1581
|
+
node=None, node_dist=2):
|
|
1582
|
+
r"""
|
|
1583
|
+
Return a latex representation of the Dynkin diagram.
|
|
1584
|
+
|
|
1585
|
+
INPUT:
|
|
1586
|
+
|
|
1587
|
+
- ``label`` -- (default: the identity) a relabeling function
|
|
1588
|
+
for the nodes
|
|
1589
|
+
|
|
1590
|
+
- ``node`` -- (optional) a function which returns the latex for a node
|
|
1591
|
+
|
|
1592
|
+
- ``node_dist`` -- (default: 2) the distance between nodes in cm
|
|
1593
|
+
|
|
1594
|
+
EXAMPLES::
|
|
1595
|
+
|
|
1596
|
+
sage: latex(CartanType(['A',4]).dynkin_diagram()) # indirect doctest # needs sage.graphs
|
|
1597
|
+
\begin{tikzpicture}[scale=0.5]
|
|
1598
|
+
\draw (-1,0) node[anchor=east] {$A_{4}$};
|
|
1599
|
+
\draw (0 cm,0) -- (6 cm,0);
|
|
1600
|
+
\draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$};
|
|
1601
|
+
\draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$};
|
|
1602
|
+
\draw[fill=white] (4 cm, 0 cm) circle (.25cm) node[below=4pt]{$3$};
|
|
1603
|
+
\draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$};
|
|
1604
|
+
\end{tikzpicture}
|
|
1605
|
+
"""
|
|
1606
|
+
|
|
1607
|
+
@abstract_method
|
|
1608
|
+
def dynkin_diagram(self):
|
|
1609
|
+
"""
|
|
1610
|
+
Return the Dynkin diagram associated with ``self``.
|
|
1611
|
+
|
|
1612
|
+
EXAMPLES::
|
|
1613
|
+
|
|
1614
|
+
sage: CartanType(['A',4]).dynkin_diagram() # needs sage.graphs
|
|
1615
|
+
O---O---O---O
|
|
1616
|
+
1 2 3 4
|
|
1617
|
+
A4
|
|
1618
|
+
|
|
1619
|
+
.. NOTE::
|
|
1620
|
+
|
|
1621
|
+
Derived subclasses should typically implement this as a cached
|
|
1622
|
+
method.
|
|
1623
|
+
"""
|
|
1624
|
+
|
|
1625
|
+
@cached_method
|
|
1626
|
+
def cartan_matrix(self):
|
|
1627
|
+
"""
|
|
1628
|
+
Return the Cartan matrix associated with ``self``.
|
|
1629
|
+
|
|
1630
|
+
EXAMPLES::
|
|
1631
|
+
|
|
1632
|
+
sage: CartanType(['A',4]).cartan_matrix() # needs sage.graphs
|
|
1633
|
+
[ 2 -1 0 0]
|
|
1634
|
+
[-1 2 -1 0]
|
|
1635
|
+
[ 0 -1 2 -1]
|
|
1636
|
+
[ 0 0 -1 2]
|
|
1637
|
+
"""
|
|
1638
|
+
from sage.combinat.root_system.cartan_matrix import CartanMatrix
|
|
1639
|
+
return CartanMatrix(self.dynkin_diagram())
|
|
1640
|
+
|
|
1641
|
+
def coxeter_diagram(self):
|
|
1642
|
+
"""
|
|
1643
|
+
Return the Coxeter diagram for ``self``.
|
|
1644
|
+
|
|
1645
|
+
This implementation constructs it from the Dynkin diagram.
|
|
1646
|
+
|
|
1647
|
+
.. SEEALSO:: :meth:`CartanType_abstract.coxeter_diagram`
|
|
1648
|
+
|
|
1649
|
+
EXAMPLES::
|
|
1650
|
+
|
|
1651
|
+
sage: # needs sage.graphs
|
|
1652
|
+
sage: CartanType(['A',3]).coxeter_diagram()
|
|
1653
|
+
Graph on 3 vertices
|
|
1654
|
+
sage: CartanType(['A',3]).coxeter_diagram().edges(sort=True)
|
|
1655
|
+
[(1, 2, 3), (2, 3, 3)]
|
|
1656
|
+
sage: CartanType(['B',3]).coxeter_diagram().edges(sort=True)
|
|
1657
|
+
[(1, 2, 3), (2, 3, 4)]
|
|
1658
|
+
sage: CartanType(['G',2]).coxeter_diagram().edges(sort=True)
|
|
1659
|
+
[(1, 2, 6)]
|
|
1660
|
+
sage: CartanType(['F',4]).coxeter_diagram().edges(sort=True)
|
|
1661
|
+
[(1, 2, 3), (2, 3, 4), (3, 4, 3)]
|
|
1662
|
+
sage: CartanType(['A',2,2]).coxeter_diagram().edges(sort=True)
|
|
1663
|
+
[(0, 1, +Infinity)]
|
|
1664
|
+
"""
|
|
1665
|
+
return self.dynkin_diagram().coxeter_diagram()
|
|
1666
|
+
|
|
1667
|
+
def is_crystallographic(self):
|
|
1668
|
+
"""
|
|
1669
|
+
Implement :meth:`CartanType_abstract.is_crystallographic`
|
|
1670
|
+
by returning ``True``.
|
|
1671
|
+
|
|
1672
|
+
EXAMPLES::
|
|
1673
|
+
|
|
1674
|
+
sage: CartanType(['A', 3, 1]).is_crystallographic()
|
|
1675
|
+
True
|
|
1676
|
+
"""
|
|
1677
|
+
return True
|
|
1678
|
+
|
|
1679
|
+
@cached_method
|
|
1680
|
+
def symmetrizer(self):
|
|
1681
|
+
"""
|
|
1682
|
+
Return the symmetrizer of the Cartan matrix of ``self``.
|
|
1683
|
+
|
|
1684
|
+
A Cartan matrix `M` is symmetrizable if there exists a non
|
|
1685
|
+
trivial diagonal matrix `D` such that `DM` is a symmetric
|
|
1686
|
+
matrix, that is `DM = M^tD`. In that case, `D` is unique, up
|
|
1687
|
+
to a scalar factor for each connected component of the Dynkin
|
|
1688
|
+
diagram.
|
|
1689
|
+
|
|
1690
|
+
This method computes the unique minimal such `D` with positive
|
|
1691
|
+
integral coefficients. If `D` exists, it is returned as a
|
|
1692
|
+
family. Otherwise ``None`` is returned.
|
|
1693
|
+
|
|
1694
|
+
The coefficients are coerced to ``base_ring``.
|
|
1695
|
+
|
|
1696
|
+
EXAMPLES::
|
|
1697
|
+
|
|
1698
|
+
sage: CartanType(["B",5]).symmetrizer() # needs sage.graphs
|
|
1699
|
+
Finite family {1: 2, 2: 2, 3: 2, 4: 2, 5: 1}
|
|
1700
|
+
|
|
1701
|
+
Here is a neat trick to visualize it better::
|
|
1702
|
+
|
|
1703
|
+
sage: T = CartanType(["B",5])
|
|
1704
|
+
sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
|
|
1705
|
+
O---O---O---O=>=O
|
|
1706
|
+
2 2 2 2 1
|
|
1707
|
+
|
|
1708
|
+
sage: T = CartanType(["BC",5, 2])
|
|
1709
|
+
sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
|
|
1710
|
+
O=<=O---O---O---O=<=O
|
|
1711
|
+
1 2 2 2 2 4
|
|
1712
|
+
|
|
1713
|
+
Here is the symmetrizer of some reducible Cartan types::
|
|
1714
|
+
|
|
1715
|
+
sage: T = CartanType(["D", 2])
|
|
1716
|
+
sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
|
|
1717
|
+
O O
|
|
1718
|
+
1 1
|
|
1719
|
+
|
|
1720
|
+
sage: T = CartanType(["B",5],["BC",5, 2])
|
|
1721
|
+
sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
|
|
1722
|
+
O---O---O---O=>=O
|
|
1723
|
+
2 2 2 2 1
|
|
1724
|
+
O=<=O---O---O---O=<=O
|
|
1725
|
+
1 2 2 2 2 4
|
|
1726
|
+
|
|
1727
|
+
Property: up to an overall scalar factor, this gives the norm
|
|
1728
|
+
of the simple roots in the ambient space::
|
|
1729
|
+
|
|
1730
|
+
sage: T = CartanType(["C",5])
|
|
1731
|
+
sage: print(T.ascii_art(T.symmetrizer().__getitem__)) # needs sage.graphs
|
|
1732
|
+
O---O---O---O=<=O
|
|
1733
|
+
1 1 1 1 2
|
|
1734
|
+
|
|
1735
|
+
sage: alpha = RootSystem(T).ambient_space().simple_roots()
|
|
1736
|
+
sage: print(T.ascii_art(lambda i: alpha[i].scalar(alpha[i])))
|
|
1737
|
+
O---O---O---O=<=O
|
|
1738
|
+
2 2 2 2 4
|
|
1739
|
+
"""
|
|
1740
|
+
from sage.matrix.constructor import matrix, diagonal_matrix
|
|
1741
|
+
m = self.cartan_matrix()
|
|
1742
|
+
n = m.nrows()
|
|
1743
|
+
M = matrix(ZZ, n, n * n, sparse=True)
|
|
1744
|
+
for i, j in m.nonzero_positions():
|
|
1745
|
+
M[i, n * i + j] = m[i, j]
|
|
1746
|
+
M[j, n * i + j] -= m[j, i]
|
|
1747
|
+
kern = M.integer_kernel()
|
|
1748
|
+
c = len(self.dynkin_diagram().connected_components(sort=False))
|
|
1749
|
+
if kern.dimension() < c:
|
|
1750
|
+
# the Cartan matrix is not symmetrizable
|
|
1751
|
+
return None
|
|
1752
|
+
assert kern.dimension() == c
|
|
1753
|
+
# Now the basis contains one vector v per connected component
|
|
1754
|
+
# C of the Dynkin diagram, or equivalently diagonal block of
|
|
1755
|
+
# the Cartan matrix. The support of v is exactly that
|
|
1756
|
+
# connected component, and it symmetrizes the corresponding
|
|
1757
|
+
# diagonal block of the Cartan matrix. We sum all those vectors.
|
|
1758
|
+
D = sum(kern.basis())
|
|
1759
|
+
assert diagonal_matrix(D) * m == m.transpose() * diagonal_matrix(D)
|
|
1760
|
+
I = self.index_set()
|
|
1761
|
+
return Family({I[i]: D[i] for i in range(n)})
|
|
1762
|
+
|
|
1763
|
+
def index_set_bipartition(self):
|
|
1764
|
+
r"""
|
|
1765
|
+
Return a bipartition `\{L,R\}` of the vertices of the Dynkin diagram.
|
|
1766
|
+
|
|
1767
|
+
For `i` and `j` both in `L` (or both in `R`), the simple
|
|
1768
|
+
reflections `s_i` and `s_j` commute.
|
|
1769
|
+
|
|
1770
|
+
Of course, the Dynkin diagram should be bipartite. This is
|
|
1771
|
+
always the case for all finite types.
|
|
1772
|
+
|
|
1773
|
+
EXAMPLES::
|
|
1774
|
+
|
|
1775
|
+
sage: CartanType(['A',5]).index_set_bipartition() # needs sage.graphs
|
|
1776
|
+
({1, 3, 5}, {2, 4})
|
|
1777
|
+
|
|
1778
|
+
sage: CartanType(['A',2,1]).index_set_bipartition() # needs sage.graphs
|
|
1779
|
+
Traceback (most recent call last):
|
|
1780
|
+
...
|
|
1781
|
+
ValueError: the Dynkin diagram must be bipartite
|
|
1782
|
+
"""
|
|
1783
|
+
from sage.graphs.graph import Graph
|
|
1784
|
+
G = Graph(self.dynkin_diagram())
|
|
1785
|
+
if not G.is_bipartite():
|
|
1786
|
+
raise ValueError("the Dynkin diagram must be bipartite")
|
|
1787
|
+
return G.bipartite_sets()
|
|
1788
|
+
|
|
1789
|
+
|
|
1790
|
+
class CartanType_simply_laced(CartanType_crystallographic):
|
|
1791
|
+
"""
|
|
1792
|
+
An abstract class for simply laced Cartan types.
|
|
1793
|
+
"""
|
|
1794
|
+
|
|
1795
|
+
def is_simply_laced(self):
|
|
1796
|
+
"""
|
|
1797
|
+
Return whether ``self`` is simply laced, which is ``True``.
|
|
1798
|
+
|
|
1799
|
+
EXAMPLES::
|
|
1800
|
+
|
|
1801
|
+
sage: CartanType(['A',3,1]).is_simply_laced()
|
|
1802
|
+
True
|
|
1803
|
+
sage: CartanType(['A',2]).is_simply_laced()
|
|
1804
|
+
True
|
|
1805
|
+
"""
|
|
1806
|
+
return True
|
|
1807
|
+
|
|
1808
|
+
def dual(self):
|
|
1809
|
+
"""
|
|
1810
|
+
Simply laced Cartan types are self-dual, so return ``self``.
|
|
1811
|
+
|
|
1812
|
+
EXAMPLES::
|
|
1813
|
+
|
|
1814
|
+
sage: CartanType(["A", 3]).dual()
|
|
1815
|
+
['A', 3]
|
|
1816
|
+
sage: CartanType(["A", 3, 1]).dual()
|
|
1817
|
+
['A', 3, 1]
|
|
1818
|
+
sage: CartanType(["D", 3]).dual()
|
|
1819
|
+
['D', 3]
|
|
1820
|
+
sage: CartanType(["D", 4, 1]).dual()
|
|
1821
|
+
['D', 4, 1]
|
|
1822
|
+
sage: CartanType(["E", 6]).dual()
|
|
1823
|
+
['E', 6]
|
|
1824
|
+
sage: CartanType(["E", 6, 1]).dual()
|
|
1825
|
+
['E', 6, 1]
|
|
1826
|
+
"""
|
|
1827
|
+
return self
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
class CartanType_simple(CartanType_abstract):
|
|
1831
|
+
"""
|
|
1832
|
+
An abstract class for simple Cartan types.
|
|
1833
|
+
"""
|
|
1834
|
+
|
|
1835
|
+
def is_irreducible(self):
|
|
1836
|
+
"""
|
|
1837
|
+
Return whether ``self`` is irreducible, which is ``True``.
|
|
1838
|
+
|
|
1839
|
+
EXAMPLES::
|
|
1840
|
+
|
|
1841
|
+
sage: CartanType(['A', 3]).is_irreducible()
|
|
1842
|
+
True
|
|
1843
|
+
"""
|
|
1844
|
+
return True
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
class CartanType_finite(CartanType_abstract):
|
|
1848
|
+
"""
|
|
1849
|
+
An abstract class for simple affine Cartan types.
|
|
1850
|
+
"""
|
|
1851
|
+
|
|
1852
|
+
def is_finite(self):
|
|
1853
|
+
"""
|
|
1854
|
+
EXAMPLES::
|
|
1855
|
+
|
|
1856
|
+
sage: CartanType(["A", 3]).is_finite()
|
|
1857
|
+
True
|
|
1858
|
+
"""
|
|
1859
|
+
return True
|
|
1860
|
+
|
|
1861
|
+
def is_affine(self):
|
|
1862
|
+
"""
|
|
1863
|
+
EXAMPLES::
|
|
1864
|
+
|
|
1865
|
+
sage: CartanType(["A", 3]).is_affine()
|
|
1866
|
+
False
|
|
1867
|
+
"""
|
|
1868
|
+
return False
|
|
1869
|
+
|
|
1870
|
+
|
|
1871
|
+
class CartanType_affine(CartanType_simple, CartanType_crystallographic):
|
|
1872
|
+
"""
|
|
1873
|
+
An abstract class for simple affine Cartan types
|
|
1874
|
+
"""
|
|
1875
|
+
|
|
1876
|
+
AmbientSpace = LazyImport('sage.combinat.root_system.type_affine', 'AmbientSpace')
|
|
1877
|
+
|
|
1878
|
+
def _ascii_art_node(self, label):
|
|
1879
|
+
"""
|
|
1880
|
+
Return the ascii art for the node labeled by ``label``.
|
|
1881
|
+
|
|
1882
|
+
EXAMPLES::
|
|
1883
|
+
|
|
1884
|
+
sage: ct = CartanType(['A',4,1])
|
|
1885
|
+
sage: CartanType.options(mark_special_node='both')
|
|
1886
|
+
sage: ct._ascii_art_node(0)
|
|
1887
|
+
'@'
|
|
1888
|
+
sage: CartanType.options._reset()
|
|
1889
|
+
"""
|
|
1890
|
+
if (label == self.special_node()
|
|
1891
|
+
and self.options('mark_special_node') in ['printing', 'both']):
|
|
1892
|
+
return self.options('special_node_str')
|
|
1893
|
+
return super()._ascii_art_node(label)
|
|
1894
|
+
|
|
1895
|
+
def _latex_draw_node(self, x, y, label, position='below=4pt'):
|
|
1896
|
+
r"""
|
|
1897
|
+
Draw (possibly marked [crossed out]) circular node ``i`` at the
|
|
1898
|
+
position ``(x,y)`` with node label ``label`` .
|
|
1899
|
+
|
|
1900
|
+
- ``position`` -- position of the label relative to the node
|
|
1901
|
+
- ``anchor`` -- (optional) the anchor point for the label
|
|
1902
|
+
|
|
1903
|
+
EXAMPLES::
|
|
1904
|
+
|
|
1905
|
+
sage: CartanType.options(mark_special_node='both')
|
|
1906
|
+
sage: CartanType(['A',3,1])._latex_draw_node(0, 0, 0)
|
|
1907
|
+
'\\draw[fill=black] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$};\n'
|
|
1908
|
+
sage: CartanType.options._reset()
|
|
1909
|
+
"""
|
|
1910
|
+
if label == self.special_node() and self.options('mark_special_node') in ['latex', 'both']:
|
|
1911
|
+
fill = 'black'
|
|
1912
|
+
else:
|
|
1913
|
+
fill = 'white'
|
|
1914
|
+
return super()._latex_draw_node(x, y, label, position, fill)
|
|
1915
|
+
|
|
1916
|
+
def is_finite(self):
|
|
1917
|
+
"""
|
|
1918
|
+
EXAMPLES::
|
|
1919
|
+
|
|
1920
|
+
sage: CartanType(['A', 3, 1]).is_finite()
|
|
1921
|
+
False
|
|
1922
|
+
"""
|
|
1923
|
+
return False
|
|
1924
|
+
|
|
1925
|
+
def is_affine(self):
|
|
1926
|
+
"""
|
|
1927
|
+
EXAMPLES::
|
|
1928
|
+
|
|
1929
|
+
sage: CartanType(['A', 3, 1]).is_affine()
|
|
1930
|
+
True
|
|
1931
|
+
"""
|
|
1932
|
+
return True
|
|
1933
|
+
|
|
1934
|
+
def is_untwisted_affine(self):
|
|
1935
|
+
"""
|
|
1936
|
+
Return whether ``self`` is untwisted affine.
|
|
1937
|
+
|
|
1938
|
+
A Cartan type is untwisted affine if it is the canonical
|
|
1939
|
+
affine extension of some finite type. Every affine type is
|
|
1940
|
+
either untwisted affine, dual thereof, or of type ``BC``.
|
|
1941
|
+
|
|
1942
|
+
EXAMPLES::
|
|
1943
|
+
|
|
1944
|
+
sage: CartanType(['A', 3, 1]).is_untwisted_affine()
|
|
1945
|
+
True
|
|
1946
|
+
sage: CartanType(['A', 3, 1]).dual().is_untwisted_affine() # this one is self dual!
|
|
1947
|
+
True
|
|
1948
|
+
sage: CartanType(['B', 3, 1]).dual().is_untwisted_affine()
|
|
1949
|
+
False
|
|
1950
|
+
sage: CartanType(['BC', 3, 2]).is_untwisted_affine()
|
|
1951
|
+
False
|
|
1952
|
+
"""
|
|
1953
|
+
return False
|
|
1954
|
+
|
|
1955
|
+
@abstract_method
|
|
1956
|
+
def special_node(self):
|
|
1957
|
+
r"""
|
|
1958
|
+
Return a special node of the Dynkin diagram.
|
|
1959
|
+
|
|
1960
|
+
A *special* node is a node of the Dynkin diagram such that
|
|
1961
|
+
pruning it yields a Dynkin diagram for the associated
|
|
1962
|
+
classical type (see :meth:`classical`).
|
|
1963
|
+
|
|
1964
|
+
This method returns the label of some special node. This is
|
|
1965
|
+
usually `0` in the standard conventions.
|
|
1966
|
+
|
|
1967
|
+
EXAMPLES::
|
|
1968
|
+
|
|
1969
|
+
sage: CartanType(['A', 3, 1]).special_node()
|
|
1970
|
+
0
|
|
1971
|
+
|
|
1972
|
+
The choice is guaranteed to be consistent with the indexing of
|
|
1973
|
+
the nodes of the classical Dynkin diagram::
|
|
1974
|
+
|
|
1975
|
+
sage: CartanType(['A', 3, 1]).index_set()
|
|
1976
|
+
(0, 1, 2, 3)
|
|
1977
|
+
sage: CartanType(['A', 3, 1]).classical().index_set()
|
|
1978
|
+
(1, 2, 3)
|
|
1979
|
+
"""
|
|
1980
|
+
|
|
1981
|
+
@cached_method
|
|
1982
|
+
def special_nodes(self):
|
|
1983
|
+
r"""
|
|
1984
|
+
Return the set of special nodes of the affine Dynkin diagram.
|
|
1985
|
+
|
|
1986
|
+
EXAMPLES::
|
|
1987
|
+
|
|
1988
|
+
sage: # needs sage.graphs sage.groups
|
|
1989
|
+
sage: CartanType(['A',3,1]).special_nodes()
|
|
1990
|
+
(0, 1, 2, 3)
|
|
1991
|
+
sage: CartanType(['C',2,1]).special_nodes()
|
|
1992
|
+
(0, 2)
|
|
1993
|
+
sage: CartanType(['D',4,1]).special_nodes()
|
|
1994
|
+
(0, 1, 3, 4)
|
|
1995
|
+
sage: CartanType(['E',6,1]).special_nodes()
|
|
1996
|
+
(0, 1, 6)
|
|
1997
|
+
sage: CartanType(['D',3,2]).special_nodes()
|
|
1998
|
+
(0, 2)
|
|
1999
|
+
sage: CartanType(['A',4,2]).special_nodes()
|
|
2000
|
+
(0,)
|
|
2001
|
+
"""
|
|
2002
|
+
return tuple(sorted(self.dynkin_diagram().automorphism_group(edge_labels=True).orbit(self.special_node())))
|
|
2003
|
+
|
|
2004
|
+
@abstract_method
|
|
2005
|
+
def classical(self):
|
|
2006
|
+
r"""
|
|
2007
|
+
Return the classical Cartan type associated with this affine Cartan type.
|
|
2008
|
+
|
|
2009
|
+
EXAMPLES::
|
|
2010
|
+
|
|
2011
|
+
sage: CartanType(['A', 1, 1]).classical()
|
|
2012
|
+
['A', 1]
|
|
2013
|
+
sage: CartanType(['A', 3, 1]).classical()
|
|
2014
|
+
['A', 3]
|
|
2015
|
+
sage: CartanType(['B', 3, 1]).classical()
|
|
2016
|
+
['B', 3]
|
|
2017
|
+
|
|
2018
|
+
sage: CartanType(['A', 2, 2]).classical()
|
|
2019
|
+
['C', 1]
|
|
2020
|
+
sage: CartanType(['BC', 1, 2]).classical()
|
|
2021
|
+
['C', 1]
|
|
2022
|
+
sage: CartanType(['A', 4, 2]).classical()
|
|
2023
|
+
['C', 2]
|
|
2024
|
+
sage: CartanType(['BC', 2, 2]).classical()
|
|
2025
|
+
['C', 2]
|
|
2026
|
+
sage: CartanType(['A', 10, 2]).classical()
|
|
2027
|
+
['C', 5]
|
|
2028
|
+
sage: CartanType(['BC', 5, 2]).classical()
|
|
2029
|
+
['C', 5]
|
|
2030
|
+
|
|
2031
|
+
sage: CartanType(['D', 5, 2]).classical()
|
|
2032
|
+
['B', 4]
|
|
2033
|
+
sage: CartanType(['E', 6, 1]).classical()
|
|
2034
|
+
['E', 6]
|
|
2035
|
+
sage: CartanType(['G', 2, 1]).classical()
|
|
2036
|
+
['G', 2]
|
|
2037
|
+
sage: CartanType(['E', 6, 2]).classical()
|
|
2038
|
+
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
|
|
2039
|
+
sage: CartanType(['D', 4, 3]).classical()
|
|
2040
|
+
['G', 2]
|
|
2041
|
+
|
|
2042
|
+
We check that :meth:`classical`,
|
|
2043
|
+
:meth:`sage.combinat.root_system.cartan_type.CartanType_crystallographic.dynkin_diagram`,
|
|
2044
|
+
and :meth:`special_node` are consistent::
|
|
2045
|
+
|
|
2046
|
+
sage: for ct in CartanType.samples(affine=True): # needs sage.graphs
|
|
2047
|
+
....: g1 = ct.classical().dynkin_diagram()
|
|
2048
|
+
....: g2 = ct.dynkin_diagram()
|
|
2049
|
+
....: g2.delete_vertex(ct.special_node())
|
|
2050
|
+
....: assert g1.vertices(sort=True) == g2.vertices(sort=True)
|
|
2051
|
+
....: assert g1.edges(sort=True) == g2.edges(sort=True)
|
|
2052
|
+
"""
|
|
2053
|
+
|
|
2054
|
+
@abstract_method
|
|
2055
|
+
def basic_untwisted(self):
|
|
2056
|
+
r"""
|
|
2057
|
+
Return the basic untwisted Cartan type associated with this affine
|
|
2058
|
+
Cartan type.
|
|
2059
|
+
|
|
2060
|
+
Given an affine type `X_n^{(r)}`, the basic untwisted type is `X_n`.
|
|
2061
|
+
In other words, it is the classical Cartan type that is twisted to
|
|
2062
|
+
obtain ``self``.
|
|
2063
|
+
|
|
2064
|
+
EXAMPLES::
|
|
2065
|
+
|
|
2066
|
+
sage: CartanType(['A', 1, 1]).basic_untwisted()
|
|
2067
|
+
['A', 1]
|
|
2068
|
+
sage: CartanType(['A', 3, 1]).basic_untwisted()
|
|
2069
|
+
['A', 3]
|
|
2070
|
+
sage: CartanType(['B', 3, 1]).basic_untwisted()
|
|
2071
|
+
['B', 3]
|
|
2072
|
+
sage: CartanType(['E', 6, 1]).basic_untwisted()
|
|
2073
|
+
['E', 6]
|
|
2074
|
+
sage: CartanType(['G', 2, 1]).basic_untwisted()
|
|
2075
|
+
['G', 2]
|
|
2076
|
+
|
|
2077
|
+
sage: CartanType(['A', 2, 2]).basic_untwisted()
|
|
2078
|
+
['A', 2]
|
|
2079
|
+
sage: CartanType(['A', 4, 2]).basic_untwisted()
|
|
2080
|
+
['A', 4]
|
|
2081
|
+
sage: CartanType(['A', 11, 2]).basic_untwisted()
|
|
2082
|
+
['A', 11]
|
|
2083
|
+
sage: CartanType(['D', 5, 2]).basic_untwisted()
|
|
2084
|
+
['D', 5]
|
|
2085
|
+
sage: CartanType(['E', 6, 2]).basic_untwisted()
|
|
2086
|
+
['E', 6]
|
|
2087
|
+
sage: CartanType(['D', 4, 3]).basic_untwisted()
|
|
2088
|
+
['D', 4]
|
|
2089
|
+
"""
|
|
2090
|
+
|
|
2091
|
+
def row_annihilator(self, m=None):
|
|
2092
|
+
r"""
|
|
2093
|
+
Return the unique minimal non trivial annihilating linear
|
|
2094
|
+
combination of `\alpha_0, \alpha_1, \ldots, \alpha_n` with
|
|
2095
|
+
nonnegative coefficients (or alternatively, the unique minimal
|
|
2096
|
+
non trivial annihilating linear combination of the rows of the
|
|
2097
|
+
Cartan matrix with nonnegative coefficients).
|
|
2098
|
+
|
|
2099
|
+
Throw an error if the existence of uniqueness does not hold
|
|
2100
|
+
|
|
2101
|
+
The optional argument ``m`` is for internal use only.
|
|
2102
|
+
|
|
2103
|
+
EXAMPLES::
|
|
2104
|
+
|
|
2105
|
+
sage: # needs sage.graphs
|
|
2106
|
+
sage: RootSystem(['C',2,1]).cartan_type().acheck()
|
|
2107
|
+
Finite family {0: 1, 1: 1, 2: 1}
|
|
2108
|
+
sage: RootSystem(['D',4,1]).cartan_type().acheck()
|
|
2109
|
+
Finite family {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}
|
|
2110
|
+
sage: RootSystem(['F',4,1]).cartan_type().acheck()
|
|
2111
|
+
Finite family {0: 1, 1: 2, 2: 3, 3: 2, 4: 1}
|
|
2112
|
+
sage: RootSystem(['BC',4,2]).cartan_type().acheck()
|
|
2113
|
+
Finite family {0: 1, 1: 2, 2: 2, 3: 2, 4: 2}
|
|
2114
|
+
|
|
2115
|
+
``acheck`` is a shortcut for row_annihilator::
|
|
2116
|
+
|
|
2117
|
+
sage: RootSystem(['BC',4,2]).cartan_type().row_annihilator() # needs sage.graphs
|
|
2118
|
+
Finite family {0: 1, 1: 2, 2: 2, 3: 2, 4: 2}
|
|
2119
|
+
|
|
2120
|
+
FIXME:
|
|
2121
|
+
|
|
2122
|
+
- The current implementation assumes that the Cartan matrix
|
|
2123
|
+
is indexed by `[0,1,...]`, in the same order as the index set.
|
|
2124
|
+
- This really should be a method of :class:`CartanMatrix`.
|
|
2125
|
+
"""
|
|
2126
|
+
if m is None:
|
|
2127
|
+
m = self.cartan_matrix()
|
|
2128
|
+
if self.index_set() != tuple(range(m.ncols())):
|
|
2129
|
+
raise NotImplementedError("the Cartan matrix currently must be indexed by [0,1,...,{}]".format(m.ncols()))
|
|
2130
|
+
annihilator_basis = m.integer_kernel().gens()
|
|
2131
|
+
if len(annihilator_basis) != 1:
|
|
2132
|
+
raise ValueError("the kernel is not 1 dimensional")
|
|
2133
|
+
assert (all(coef > 0 for coef in annihilator_basis[0]))
|
|
2134
|
+
|
|
2135
|
+
return Family({i: annihilator_basis[0][i] for i in self.index_set()})
|
|
2136
|
+
|
|
2137
|
+
acheck = row_annihilator
|
|
2138
|
+
|
|
2139
|
+
def col_annihilator(self):
|
|
2140
|
+
r"""
|
|
2141
|
+
Return the unique minimal non trivial annihilating linear
|
|
2142
|
+
combination of `\alpha^\vee_0, \alpha^\vee, \ldots, \alpha^\vee` with
|
|
2143
|
+
nonnegative coefficients (or alternatively, the unique minimal
|
|
2144
|
+
non trivial annihilating linear combination of the columns of the
|
|
2145
|
+
Cartan matrix with nonnegative coefficients).
|
|
2146
|
+
|
|
2147
|
+
Throw an error if the existence or uniqueness does not hold
|
|
2148
|
+
|
|
2149
|
+
FIXME: the current implementation assumes that the Cartan
|
|
2150
|
+
matrix is indexed by `[0,1,...]`, in the same order as the
|
|
2151
|
+
index set.
|
|
2152
|
+
|
|
2153
|
+
EXAMPLES::
|
|
2154
|
+
|
|
2155
|
+
sage: # needs sage.graphs
|
|
2156
|
+
sage: RootSystem(['C',2,1]).cartan_type().a()
|
|
2157
|
+
Finite family {0: 1, 1: 2, 2: 1}
|
|
2158
|
+
sage: RootSystem(['D',4,1]).cartan_type().a()
|
|
2159
|
+
Finite family {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}
|
|
2160
|
+
sage: RootSystem(['F',4,1]).cartan_type().a()
|
|
2161
|
+
Finite family {0: 1, 1: 2, 2: 3, 3: 4, 4: 2}
|
|
2162
|
+
sage: RootSystem(['BC',4,2]).cartan_type().a()
|
|
2163
|
+
Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
|
|
2164
|
+
|
|
2165
|
+
``a`` is a shortcut for col_annihilator::
|
|
2166
|
+
|
|
2167
|
+
sage: RootSystem(['BC',4,2]).cartan_type().col_annihilator() # needs sage.graphs
|
|
2168
|
+
Finite family {0: 2, 1: 2, 2: 2, 3: 2, 4: 1}
|
|
2169
|
+
"""
|
|
2170
|
+
return self.row_annihilator(self.cartan_matrix().transpose())
|
|
2171
|
+
|
|
2172
|
+
a = col_annihilator
|
|
2173
|
+
|
|
2174
|
+
def c(self):
|
|
2175
|
+
r"""
|
|
2176
|
+
Return the family (c_i)_i of integer coefficients defined by
|
|
2177
|
+
`c_i=max(1, a_i/a^vee_i)` (see e.g. [FSS07]_ p. 3)
|
|
2178
|
+
|
|
2179
|
+
FIXME: the current implementation assumes that the Cartan
|
|
2180
|
+
matrix is indexed by `[0,1,...]`, in the same order as the
|
|
2181
|
+
index set.
|
|
2182
|
+
|
|
2183
|
+
EXAMPLES::
|
|
2184
|
+
|
|
2185
|
+
sage: # needs sage.graphs
|
|
2186
|
+
sage: RootSystem(['C',2,1]).cartan_type().c()
|
|
2187
|
+
Finite family {0: 1, 1: 2, 2: 1}
|
|
2188
|
+
sage: RootSystem(['D',4,1]).cartan_type().c()
|
|
2189
|
+
Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
|
|
2190
|
+
sage: RootSystem(['F',4,1]).cartan_type().c()
|
|
2191
|
+
Finite family {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}
|
|
2192
|
+
sage: RootSystem(['BC',4,2]).cartan_type().c()
|
|
2193
|
+
Finite family {0: 2, 1: 1, 2: 1, 3: 1, 4: 1}
|
|
2194
|
+
|
|
2195
|
+
TESTS::
|
|
2196
|
+
|
|
2197
|
+
sage: CartanType(["B", 3, 1]).c().map(parent) # needs sage.graphs
|
|
2198
|
+
Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Integer Ring}
|
|
2199
|
+
|
|
2200
|
+
REFERENCES:
|
|
2201
|
+
|
|
2202
|
+
.. [FSS07] \G. Fourier, A. Schilling, and M. Shimozono,
|
|
2203
|
+
*Demazure structure inside Kirillov-Reshetikhin crystals*,
|
|
2204
|
+
J. Algebra, Vol. 309, (2007), p. 386-404
|
|
2205
|
+
:arxiv:`math/0605451`
|
|
2206
|
+
"""
|
|
2207
|
+
a = self.a()
|
|
2208
|
+
acheck = self.acheck()
|
|
2209
|
+
return Family({i: max(ZZ.one(), a[i] // acheck[i])
|
|
2210
|
+
for i in self.index_set()})
|
|
2211
|
+
|
|
2212
|
+
def translation_factors(self):
|
|
2213
|
+
r"""
|
|
2214
|
+
Return the translation factors for ``self``.
|
|
2215
|
+
|
|
2216
|
+
Those are the smallest factors `t_i` such that the translation
|
|
2217
|
+
by `t_i \alpha_i` maps the fundamental polygon to another
|
|
2218
|
+
polygon in the alcove picture.
|
|
2219
|
+
|
|
2220
|
+
OUTPUT:
|
|
2221
|
+
|
|
2222
|
+
a dictionary from ``self.index_set()`` to `\ZZ`
|
|
2223
|
+
(or `\QQ` for affine type `BC`)
|
|
2224
|
+
|
|
2225
|
+
Those coefficients are all `1` for dual untwisted, and in
|
|
2226
|
+
particular for simply laced. They coincide with the usual
|
|
2227
|
+
`c_i` coefficients (see :meth:`c`) for untwisted and dual
|
|
2228
|
+
thereof. See the discussion below for affine type `BC`.
|
|
2229
|
+
|
|
2230
|
+
.. NOTE::
|
|
2231
|
+
|
|
2232
|
+
One usually realizes the alcove picture in the coweight
|
|
2233
|
+
lattice, with translations by coroots; in that case, one will
|
|
2234
|
+
use the translation factors for the dual Cartan type.
|
|
2235
|
+
|
|
2236
|
+
FIXME: the current implementation assumes that the Cartan
|
|
2237
|
+
matrix is indexed by `[0,1,...]`, in the same order as the
|
|
2238
|
+
index set.
|
|
2239
|
+
|
|
2240
|
+
EXAMPLES::
|
|
2241
|
+
|
|
2242
|
+
sage: # needs sage.graphs
|
|
2243
|
+
sage: CartanType(['C',2,1]).translation_factors()
|
|
2244
|
+
Finite family {0: 1, 1: 2, 2: 1}
|
|
2245
|
+
sage: CartanType(['C',2,1]).dual().translation_factors()
|
|
2246
|
+
Finite family {0: 1, 1: 1, 2: 1}
|
|
2247
|
+
sage: CartanType(['D',4,1]).translation_factors()
|
|
2248
|
+
Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
|
|
2249
|
+
sage: CartanType(['F',4,1]).translation_factors()
|
|
2250
|
+
Finite family {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}
|
|
2251
|
+
sage: CartanType(['BC',4,2]).translation_factors()
|
|
2252
|
+
Finite family {0: 1, 1: 1, 2: 1, 3: 1, 4: 1/2}
|
|
2253
|
+
|
|
2254
|
+
We proceed with systematic tests taken from MuPAD-Combinat's
|
|
2255
|
+
testsuite::
|
|
2256
|
+
|
|
2257
|
+
sage: # needs sage.graphs
|
|
2258
|
+
sage: list(CartanType(["A", 1, 1]).translation_factors())
|
|
2259
|
+
[1, 1]
|
|
2260
|
+
sage: list(CartanType(["A", 5, 1]).translation_factors())
|
|
2261
|
+
[1, 1, 1, 1, 1, 1]
|
|
2262
|
+
sage: list(CartanType(["B", 5, 1]).translation_factors())
|
|
2263
|
+
[1, 1, 1, 1, 1, 2]
|
|
2264
|
+
sage: list(CartanType(["C", 5, 1]).translation_factors())
|
|
2265
|
+
[1, 2, 2, 2, 2, 1]
|
|
2266
|
+
sage: list(CartanType(["D", 5, 1]).translation_factors())
|
|
2267
|
+
[1, 1, 1, 1, 1, 1]
|
|
2268
|
+
sage: list(CartanType(["E", 6, 1]).translation_factors())
|
|
2269
|
+
[1, 1, 1, 1, 1, 1, 1]
|
|
2270
|
+
sage: list(CartanType(["E", 7, 1]).translation_factors())
|
|
2271
|
+
[1, 1, 1, 1, 1, 1, 1, 1]
|
|
2272
|
+
sage: list(CartanType(["E", 8, 1]).translation_factors())
|
|
2273
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1]
|
|
2274
|
+
sage: list(CartanType(["F", 4, 1]).translation_factors())
|
|
2275
|
+
[1, 1, 1, 2, 2]
|
|
2276
|
+
sage: list(CartanType(["G", 2, 1]).translation_factors())
|
|
2277
|
+
[1, 3, 1]
|
|
2278
|
+
sage: list(CartanType(["A", 2, 2]).translation_factors())
|
|
2279
|
+
[1, 1/2]
|
|
2280
|
+
sage: list(CartanType(["A", 2, 2]).dual().translation_factors())
|
|
2281
|
+
[1/2, 1]
|
|
2282
|
+
sage: list(CartanType(["A", 10, 2]).translation_factors())
|
|
2283
|
+
[1, 1, 1, 1, 1, 1/2]
|
|
2284
|
+
sage: list(CartanType(["A", 10, 2]).dual().translation_factors())
|
|
2285
|
+
[1/2, 1, 1, 1, 1, 1]
|
|
2286
|
+
sage: list(CartanType(["A", 9, 2]).translation_factors())
|
|
2287
|
+
[1, 1, 1, 1, 1, 1]
|
|
2288
|
+
sage: list(CartanType(["D", 5, 2]).translation_factors())
|
|
2289
|
+
[1, 1, 1, 1, 1]
|
|
2290
|
+
sage: list(CartanType(["D", 4, 3]).translation_factors())
|
|
2291
|
+
[1, 1, 1]
|
|
2292
|
+
sage: list(CartanType(["E", 6, 2]).translation_factors())
|
|
2293
|
+
[1, 1, 1, 1, 1]
|
|
2294
|
+
|
|
2295
|
+
We conclude with a discussion of the appropriate value for
|
|
2296
|
+
affine type `BC`. Let us consider the alcove picture realized
|
|
2297
|
+
in the weight lattice. It is obtained by taking the level-`1`
|
|
2298
|
+
affine hyperplane in the weight lattice, and projecting it
|
|
2299
|
+
along `\Lambda_0`::
|
|
2300
|
+
|
|
2301
|
+
sage: R = RootSystem(["BC",2,2])
|
|
2302
|
+
sage: alpha = R.weight_space().simple_roots() # needs sage.graphs
|
|
2303
|
+
sage: alphacheck = R.coroot_space().simple_roots()
|
|
2304
|
+
sage: Lambda = R.weight_space().fundamental_weights()
|
|
2305
|
+
|
|
2306
|
+
Here are the levels of the fundamental weights::
|
|
2307
|
+
|
|
2308
|
+
sage: Lambda[0].level(), Lambda[1].level(), Lambda[2].level() # needs sage.graphs
|
|
2309
|
+
(1, 2, 2)
|
|
2310
|
+
|
|
2311
|
+
So the "center" of the fundamental polygon at level `1` is::
|
|
2312
|
+
|
|
2313
|
+
sage: O = Lambda[0]
|
|
2314
|
+
sage: O.level() # needs sage.graphs
|
|
2315
|
+
1
|
|
2316
|
+
|
|
2317
|
+
We take the projection `\omega_1` at level `0` of `\Lambda_1`
|
|
2318
|
+
as unit vector on the `x`-axis, and the projection `\omega_2`
|
|
2319
|
+
at level 0 of `\Lambda_2` as unit vector of the `y`-axis::
|
|
2320
|
+
|
|
2321
|
+
sage: omega1 = Lambda[1] - 2*Lambda[0]
|
|
2322
|
+
sage: omega2 = Lambda[2] - 2*Lambda[0]
|
|
2323
|
+
sage: omega1.level(), omega2.level() # needs sage.graphs
|
|
2324
|
+
(0, 0)
|
|
2325
|
+
|
|
2326
|
+
The projections of the simple roots can be read off::
|
|
2327
|
+
|
|
2328
|
+
sage: alpha[0] # needs sage.graphs
|
|
2329
|
+
2*Lambda[0] - Lambda[1]
|
|
2330
|
+
sage: alpha[1] # needs sage.graphs
|
|
2331
|
+
-2*Lambda[0] + 2*Lambda[1] - Lambda[2]
|
|
2332
|
+
sage: alpha[2] # needs sage.graphs
|
|
2333
|
+
-2*Lambda[1] + 2*Lambda[2]
|
|
2334
|
+
|
|
2335
|
+
Namely `\alpha_0 = -\omega_1`, `\alpha_1 = 2\omega_1 -
|
|
2336
|
+
\omega_2` and `\alpha_2 = -2 \omega_1 + 2 \omega_2`.
|
|
2337
|
+
|
|
2338
|
+
The reflection hyperplane defined by `\alpha_0^\vee` goes
|
|
2339
|
+
through the points `O+1/2 \omega_1` and `O+1/2 \omega_2`::
|
|
2340
|
+
|
|
2341
|
+
sage: (O+(1/2)*omega1).scalar(alphacheck[0])
|
|
2342
|
+
0
|
|
2343
|
+
sage: (O+(1/2)*omega2).scalar(alphacheck[0])
|
|
2344
|
+
0
|
|
2345
|
+
|
|
2346
|
+
Hence, the fundamental alcove is the triangle `(O, O+1/2
|
|
2347
|
+
\omega_1, O+1/2 \omega_2)`. By successive reflections, one can
|
|
2348
|
+
tile the full plane. This induces a tiling of the full plane
|
|
2349
|
+
by translates of the fundamental polygon.
|
|
2350
|
+
|
|
2351
|
+
.. TODO::
|
|
2352
|
+
|
|
2353
|
+
Add the picture here, once root system plots in the
|
|
2354
|
+
weight lattice will be implemented. In the mean time, the
|
|
2355
|
+
reader may look up the dual picture on Figure 2 of [HST09]_
|
|
2356
|
+
which was produced by MuPAD-Combinat.
|
|
2357
|
+
|
|
2358
|
+
From this picture, one can read that translations by
|
|
2359
|
+
`\alpha_0`, `\alpha_1`, and `1/2\alpha_2` map the fundamental
|
|
2360
|
+
polygon to translates of it in the alcove picture, and are
|
|
2361
|
+
smallest with this property. Hence, the translation factors
|
|
2362
|
+
for affine type `BC` are `t_0=1, t_1=1, t_2=1/2`::
|
|
2363
|
+
|
|
2364
|
+
sage: CartanType(['BC',2,2]).translation_factors() # needs sage.graphs
|
|
2365
|
+
Finite family {0: 1, 1: 1, 2: 1/2}
|
|
2366
|
+
|
|
2367
|
+
TESTS::
|
|
2368
|
+
|
|
2369
|
+
sage: CartanType(["B", 3, 1]).translation_factors().map(parent) # needs sage.graphs
|
|
2370
|
+
Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Integer Ring}
|
|
2371
|
+
sage: CartanType(["BC", 3, 2]).translation_factors().map(parent) # needs sage.graphs
|
|
2372
|
+
Finite family {0: Integer Ring, 1: Integer Ring, 2: Integer Ring, 3: Rational Field}
|
|
2373
|
+
|
|
2374
|
+
REFERENCES:
|
|
2375
|
+
|
|
2376
|
+
.. [HST09] \F. Hivert, A. Schilling, and N. M. Thiéry,
|
|
2377
|
+
*Hecke group algebras as quotients of affine Hecke
|
|
2378
|
+
algebras at level 0*, JCT A, Vol. 116, (2009) p. 844-863
|
|
2379
|
+
:arxiv:`0804.3781`
|
|
2380
|
+
"""
|
|
2381
|
+
a = self.a()
|
|
2382
|
+
acheck = self.acheck()
|
|
2383
|
+
s = set(a[i] / acheck[i] for i in self.index_set())
|
|
2384
|
+
if ~ZZ(2) in s and 2 in s:
|
|
2385
|
+
# The test above and the formula below are rather meaningless
|
|
2386
|
+
# But they detect properly type BC or dual and return the correct value
|
|
2387
|
+
return Family({i: min(ZZ.one(), a[i] / acheck[i])
|
|
2388
|
+
for i in self.index_set()})
|
|
2389
|
+
|
|
2390
|
+
return self.c()
|
|
2391
|
+
|
|
2392
|
+
def _test_dual_classical(self, **options):
|
|
2393
|
+
r"""
|
|
2394
|
+
Test whether the special node of the dual is still the same and whether
|
|
2395
|
+
the methods dual and classical commute.
|
|
2396
|
+
|
|
2397
|
+
TESTS::
|
|
2398
|
+
|
|
2399
|
+
sage: C = CartanType(['A',2,2])
|
|
2400
|
+
sage: C._test_dual_classical()
|
|
2401
|
+
"""
|
|
2402
|
+
tester = self._tester(**options)
|
|
2403
|
+
tester.assertEqual(self.classical().dual(), self.dual().classical())
|
|
2404
|
+
tester.assertEqual(self.special_node(), self.dual().special_node())
|
|
2405
|
+
|
|
2406
|
+
def other_affinization(self):
|
|
2407
|
+
"""
|
|
2408
|
+
Return the other affinization of the same classical type.
|
|
2409
|
+
|
|
2410
|
+
EXAMPLES::
|
|
2411
|
+
|
|
2412
|
+
sage: CartanType(["A", 3, 1]).other_affinization()
|
|
2413
|
+
['A', 3, 1]
|
|
2414
|
+
sage: CartanType(["B", 3, 1]).other_affinization()
|
|
2415
|
+
['C', 3, 1]^*
|
|
2416
|
+
sage: CartanType(["C", 3, 1]).dual().other_affinization()
|
|
2417
|
+
['B', 3, 1]
|
|
2418
|
+
|
|
2419
|
+
Is this what we want?::
|
|
2420
|
+
|
|
2421
|
+
sage: CartanType(["BC", 3, 2]).dual().other_affinization()
|
|
2422
|
+
['B', 3, 1]
|
|
2423
|
+
"""
|
|
2424
|
+
if self.is_untwisted_affine():
|
|
2425
|
+
result = self.classical().dual().affine().dual()
|
|
2426
|
+
else:
|
|
2427
|
+
result = self.dual().classical().dual().affine()
|
|
2428
|
+
assert result.classical() is self.classical()
|
|
2429
|
+
return result
|
|
2430
|
+
|
|
2431
|
+
##############################################################################
|
|
2432
|
+
# Concrete base classes
|
|
2433
|
+
|
|
2434
|
+
|
|
2435
|
+
class CartanType_standard(UniqueRepresentation, SageObject):
|
|
2436
|
+
# Technical methods
|
|
2437
|
+
def _repr_(self, compact=False):
|
|
2438
|
+
"""
|
|
2439
|
+
TESTS::
|
|
2440
|
+
|
|
2441
|
+
sage: ct = CartanType(['A',3])
|
|
2442
|
+
sage: repr(ct)
|
|
2443
|
+
"['A', 3]"
|
|
2444
|
+
sage: ct._repr_(compact=True)
|
|
2445
|
+
'A3'
|
|
2446
|
+
"""
|
|
2447
|
+
format = '%s%s' if compact else "['%s', %s]"
|
|
2448
|
+
return format % (self.letter, self.n)
|
|
2449
|
+
|
|
2450
|
+
def __len__(self):
|
|
2451
|
+
"""
|
|
2452
|
+
EXAMPLES::
|
|
2453
|
+
|
|
2454
|
+
sage: len(CartanType(['A',4]))
|
|
2455
|
+
2
|
|
2456
|
+
sage: len(CartanType(['A',4,1]))
|
|
2457
|
+
3
|
|
2458
|
+
"""
|
|
2459
|
+
return 3 if self.is_affine() else 2
|
|
2460
|
+
|
|
2461
|
+
def __getitem__(self, i):
|
|
2462
|
+
"""
|
|
2463
|
+
EXAMPLES::
|
|
2464
|
+
|
|
2465
|
+
sage: t = CartanType(['B', 3])
|
|
2466
|
+
sage: t[0]
|
|
2467
|
+
'B'
|
|
2468
|
+
sage: t[1]
|
|
2469
|
+
3
|
|
2470
|
+
sage: t[2]
|
|
2471
|
+
Traceback (most recent call last):
|
|
2472
|
+
...
|
|
2473
|
+
IndexError: index out of range
|
|
2474
|
+
"""
|
|
2475
|
+
if i == 0:
|
|
2476
|
+
return self.letter
|
|
2477
|
+
elif i == 1:
|
|
2478
|
+
return self.n
|
|
2479
|
+
else:
|
|
2480
|
+
raise IndexError("index out of range")
|
|
2481
|
+
|
|
2482
|
+
|
|
2483
|
+
class CartanType_standard_finite(CartanType_standard, CartanType_finite):
|
|
2484
|
+
"""
|
|
2485
|
+
A concrete base class for the finite standard Cartan types.
|
|
2486
|
+
|
|
2487
|
+
This includes for example `A_3`, `D_4`, or `E_8`.
|
|
2488
|
+
|
|
2489
|
+
TESTS::
|
|
2490
|
+
|
|
2491
|
+
sage: ct1 = CartanType(['A',4])
|
|
2492
|
+
sage: ct2 = CartanType(['A',4])
|
|
2493
|
+
sage: ct3 = CartanType(['A',5])
|
|
2494
|
+
sage: ct1 == ct2
|
|
2495
|
+
True
|
|
2496
|
+
sage: ct1 != ct3
|
|
2497
|
+
True
|
|
2498
|
+
"""
|
|
2499
|
+
|
|
2500
|
+
def __init__(self, letter, n):
|
|
2501
|
+
"""
|
|
2502
|
+
EXAMPLES::
|
|
2503
|
+
|
|
2504
|
+
sage: ct = CartanType(['A',4])
|
|
2505
|
+
|
|
2506
|
+
TESTS::
|
|
2507
|
+
|
|
2508
|
+
sage: TestSuite(ct).run(verbose = True)
|
|
2509
|
+
running ._test_category() . . . pass
|
|
2510
|
+
running ._test_new() . . . pass
|
|
2511
|
+
running ._test_not_implemented_methods() . . . pass
|
|
2512
|
+
running ._test_pickling() . . . pass
|
|
2513
|
+
"""
|
|
2514
|
+
# assert(t[0] in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'])
|
|
2515
|
+
# assert(t[1] in ZZ and t[1] >= 0)
|
|
2516
|
+
# if t[0] in ['B', 'C']:
|
|
2517
|
+
# assert(t[1] >= 2)
|
|
2518
|
+
# if t[0] == 'D':
|
|
2519
|
+
# assert(t[1] >= 3)
|
|
2520
|
+
# if t[0] == 'E':
|
|
2521
|
+
# assert(t[1] <= 8)
|
|
2522
|
+
# if t[0] == 'F':
|
|
2523
|
+
# assert(t[1] <= 4)
|
|
2524
|
+
# if t[0] == 'G':
|
|
2525
|
+
# assert(t[1] <= 2)
|
|
2526
|
+
# if t[0] == 'H':
|
|
2527
|
+
# assert(t[1] <= 4)
|
|
2528
|
+
self.letter = letter
|
|
2529
|
+
self.n = n
|
|
2530
|
+
|
|
2531
|
+
def __reduce__(self):
|
|
2532
|
+
"""
|
|
2533
|
+
TESTS::
|
|
2534
|
+
|
|
2535
|
+
sage: T = CartanType(['D', 4])
|
|
2536
|
+
sage: T.__reduce__()
|
|
2537
|
+
(CartanType, ('D', 4))
|
|
2538
|
+
sage: T == loads(dumps(T))
|
|
2539
|
+
True
|
|
2540
|
+
"""
|
|
2541
|
+
return (CartanType, (self.letter, self.n))
|
|
2542
|
+
|
|
2543
|
+
def __hash__(self):
|
|
2544
|
+
"""
|
|
2545
|
+
EXAMPLES::
|
|
2546
|
+
|
|
2547
|
+
sage: ct = CartanType(['A',2])
|
|
2548
|
+
sage: hash(ct) #random
|
|
2549
|
+
-5684143898951441983
|
|
2550
|
+
"""
|
|
2551
|
+
return hash((self.n, self.letter))
|
|
2552
|
+
|
|
2553
|
+
# mathematical methods
|
|
2554
|
+
|
|
2555
|
+
def index_set(self):
|
|
2556
|
+
r"""
|
|
2557
|
+
Implement :meth:`CartanType_abstract.index_set`.
|
|
2558
|
+
|
|
2559
|
+
The index set for all standard finite Cartan types is of the form
|
|
2560
|
+
`\{1, \ldots, n\}`. (See :mod:`~sage.combinat.root_system.type_I`
|
|
2561
|
+
for a slight abuse of this).
|
|
2562
|
+
|
|
2563
|
+
EXAMPLES::
|
|
2564
|
+
|
|
2565
|
+
sage: CartanType(['A', 5]).index_set()
|
|
2566
|
+
(1, 2, 3, 4, 5)
|
|
2567
|
+
"""
|
|
2568
|
+
return tuple(range(1,self.n+1))
|
|
2569
|
+
|
|
2570
|
+
def rank(self):
|
|
2571
|
+
"""
|
|
2572
|
+
Return the rank of ``self`` which for type `X_n` is `n`.
|
|
2573
|
+
|
|
2574
|
+
EXAMPLES::
|
|
2575
|
+
|
|
2576
|
+
sage: CartanType(['A', 3]).rank()
|
|
2577
|
+
3
|
|
2578
|
+
sage: CartanType(['B', 3]).rank()
|
|
2579
|
+
3
|
|
2580
|
+
sage: CartanType(['C', 3]).rank()
|
|
2581
|
+
3
|
|
2582
|
+
sage: CartanType(['D', 4]).rank()
|
|
2583
|
+
4
|
|
2584
|
+
sage: CartanType(['E', 6]).rank()
|
|
2585
|
+
6
|
|
2586
|
+
"""
|
|
2587
|
+
return self.n
|
|
2588
|
+
|
|
2589
|
+
def affine(self):
|
|
2590
|
+
"""
|
|
2591
|
+
Return the corresponding untwisted affine Cartan type.
|
|
2592
|
+
|
|
2593
|
+
EXAMPLES::
|
|
2594
|
+
|
|
2595
|
+
sage: CartanType(['A',3]).affine()
|
|
2596
|
+
['A', 3, 1]
|
|
2597
|
+
"""
|
|
2598
|
+
return CartanType([self.letter, self.n, 1])
|
|
2599
|
+
|
|
2600
|
+
def coxeter_number(self):
|
|
2601
|
+
"""
|
|
2602
|
+
Return the Coxeter number associated with ``self``.
|
|
2603
|
+
|
|
2604
|
+
The Coxeter number is the order of a Coxeter element of the
|
|
2605
|
+
corresponding Weyl group.
|
|
2606
|
+
|
|
2607
|
+
See Bourbaki, Lie Groups and Lie Algebras V.6.1 or
|
|
2608
|
+
:wikipedia:`Coxeter_element` for more information.
|
|
2609
|
+
|
|
2610
|
+
EXAMPLES::
|
|
2611
|
+
|
|
2612
|
+
sage: CartanType(['A',4]).coxeter_number()
|
|
2613
|
+
5
|
|
2614
|
+
sage: CartanType(['B',4]).coxeter_number()
|
|
2615
|
+
8
|
|
2616
|
+
sage: CartanType(['C',4]).coxeter_number()
|
|
2617
|
+
8
|
|
2618
|
+
"""
|
|
2619
|
+
return sum(self.affine().a())
|
|
2620
|
+
|
|
2621
|
+
def dual_coxeter_number(self):
|
|
2622
|
+
"""
|
|
2623
|
+
Return the Coxeter number associated with ``self``.
|
|
2624
|
+
|
|
2625
|
+
EXAMPLES::
|
|
2626
|
+
|
|
2627
|
+
sage: CartanType(['A',4]).dual_coxeter_number()
|
|
2628
|
+
5
|
|
2629
|
+
sage: CartanType(['B',4]).dual_coxeter_number()
|
|
2630
|
+
7
|
|
2631
|
+
sage: CartanType(['C',4]).dual_coxeter_number()
|
|
2632
|
+
5
|
|
2633
|
+
"""
|
|
2634
|
+
return sum(self.affine().acheck())
|
|
2635
|
+
|
|
2636
|
+
def type(self):
|
|
2637
|
+
"""
|
|
2638
|
+
Return the type of ``self``.
|
|
2639
|
+
|
|
2640
|
+
EXAMPLES::
|
|
2641
|
+
|
|
2642
|
+
sage: CartanType(['A', 4]).type()
|
|
2643
|
+
'A'
|
|
2644
|
+
sage: CartanType(['A', 4, 1]).type()
|
|
2645
|
+
'A'
|
|
2646
|
+
"""
|
|
2647
|
+
return self.letter
|
|
2648
|
+
|
|
2649
|
+
@cached_method
|
|
2650
|
+
def opposition_automorphism(self):
|
|
2651
|
+
r"""
|
|
2652
|
+
Return the opposition automorphism.
|
|
2653
|
+
|
|
2654
|
+
The *opposition automorphism* is the automorphism
|
|
2655
|
+
`i \mapsto i^*` of the vertices Dynkin diagram such that,
|
|
2656
|
+
for `w_0` the longest element of the Weyl group, and any
|
|
2657
|
+
simple root `\alpha_i`, one has `\alpha_{i^*} = -w_0(\alpha_i)`.
|
|
2658
|
+
|
|
2659
|
+
The automorphism is returned as a :class:`Family`.
|
|
2660
|
+
|
|
2661
|
+
EXAMPLES::
|
|
2662
|
+
|
|
2663
|
+
sage: ct = CartanType(['A', 5])
|
|
2664
|
+
sage: ct.opposition_automorphism() # needs sage.graphs sage.libs.gap
|
|
2665
|
+
Finite family {1: 5, 2: 4, 3: 3, 4: 2, 5: 1}
|
|
2666
|
+
|
|
2667
|
+
sage: ct = CartanType(['D', 4])
|
|
2668
|
+
sage: ct.opposition_automorphism() # needs sage.libs.gap
|
|
2669
|
+
Finite family {1: 1, 2: 2, 3: 3, 4: 4}
|
|
2670
|
+
|
|
2671
|
+
sage: ct = CartanType(['D', 5])
|
|
2672
|
+
sage: ct.opposition_automorphism() # needs sage.libs.gap
|
|
2673
|
+
Finite family {1: 1, 2: 2, 3: 3, 4: 5, 5: 4}
|
|
2674
|
+
|
|
2675
|
+
sage: ct = CartanType(['C', 4])
|
|
2676
|
+
sage: ct.opposition_automorphism() # needs sage.libs.gap
|
|
2677
|
+
Finite family {1: 1, 2: 2, 3: 3, 4: 4}
|
|
2678
|
+
"""
|
|
2679
|
+
Q = self.root_system().root_lattice()
|
|
2680
|
+
W = Q.weyl_group()
|
|
2681
|
+
w0 = W.long_element()
|
|
2682
|
+
alpha = Q.simple_roots()
|
|
2683
|
+
d = {i: (w0.action(alpha[i])).leading_support() for i in self.index_set()}
|
|
2684
|
+
return Family(d)
|
|
2685
|
+
|
|
2686
|
+
##########################################################################
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
class CartanType_standard_affine(CartanType_standard, CartanType_affine):
|
|
2690
|
+
r"""
|
|
2691
|
+
A concrete class for affine simple Cartan types.
|
|
2692
|
+
"""
|
|
2693
|
+
|
|
2694
|
+
def __init__(self, letter, n, affine=1):
|
|
2695
|
+
"""
|
|
2696
|
+
EXAMPLES::
|
|
2697
|
+
|
|
2698
|
+
sage: ct = CartanType(['A',4,1])
|
|
2699
|
+
sage: TestSuite(ct).run()
|
|
2700
|
+
|
|
2701
|
+
TESTS::
|
|
2702
|
+
|
|
2703
|
+
sage: ct1 = CartanType(['A',3, 1])
|
|
2704
|
+
sage: ct2 = CartanType(['B',3, 1])
|
|
2705
|
+
sage: ct3 = CartanType(['A',3])
|
|
2706
|
+
sage: ct1 == ct1
|
|
2707
|
+
True
|
|
2708
|
+
sage: ct1 == ct2
|
|
2709
|
+
False
|
|
2710
|
+
sage: ct1 == ct3
|
|
2711
|
+
False
|
|
2712
|
+
"""
|
|
2713
|
+
assert (letter in ['A', 'B', 'C', 'BC', 'D', 'E', 'F', 'G'])
|
|
2714
|
+
self.letter = letter
|
|
2715
|
+
self.n = n
|
|
2716
|
+
self.affine = affine
|
|
2717
|
+
|
|
2718
|
+
def _repr_(self, compact=False):
|
|
2719
|
+
"""
|
|
2720
|
+
TESTS::
|
|
2721
|
+
|
|
2722
|
+
sage: ct = CartanType(['A',3, 1])
|
|
2723
|
+
sage: repr(ct)
|
|
2724
|
+
"['A', 3, 1]"
|
|
2725
|
+
sage: ct._repr_(compact=True)
|
|
2726
|
+
'A3~'
|
|
2727
|
+
"""
|
|
2728
|
+
letter = self.letter
|
|
2729
|
+
n = self.n
|
|
2730
|
+
aff = self.affine
|
|
2731
|
+
if self.options('notation') == "Kac":
|
|
2732
|
+
if letter == 'BC':
|
|
2733
|
+
letter = 'A'
|
|
2734
|
+
n *= 2
|
|
2735
|
+
if compact:
|
|
2736
|
+
return '%s%s^%s' % (letter, n, aff)
|
|
2737
|
+
if compact:
|
|
2738
|
+
return '%s%s~' % (letter, n)
|
|
2739
|
+
else:
|
|
2740
|
+
return "['%s', %s, %s]" % (letter, n, aff)
|
|
2741
|
+
|
|
2742
|
+
def __reduce__(self):
|
|
2743
|
+
"""
|
|
2744
|
+
TESTS::
|
|
2745
|
+
|
|
2746
|
+
sage: T = CartanType(['D', 4, 1])
|
|
2747
|
+
sage: T.__reduce__()
|
|
2748
|
+
(CartanType, ('D', 4, 1))
|
|
2749
|
+
sage: T == loads(dumps(T))
|
|
2750
|
+
True
|
|
2751
|
+
"""
|
|
2752
|
+
return (CartanType, (self.letter, self.n, self.affine))
|
|
2753
|
+
|
|
2754
|
+
def __getitem__(self, i):
|
|
2755
|
+
"""
|
|
2756
|
+
EXAMPLES::
|
|
2757
|
+
|
|
2758
|
+
sage: t = CartanType(['A', 3, 1])
|
|
2759
|
+
sage: t[0]
|
|
2760
|
+
'A'
|
|
2761
|
+
sage: t[1]
|
|
2762
|
+
3
|
|
2763
|
+
sage: t[2]
|
|
2764
|
+
1
|
|
2765
|
+
sage: t[3]
|
|
2766
|
+
Traceback (most recent call last):
|
|
2767
|
+
...
|
|
2768
|
+
IndexError: index out of range
|
|
2769
|
+
"""
|
|
2770
|
+
if i == 0:
|
|
2771
|
+
return self.letter
|
|
2772
|
+
elif i == 1:
|
|
2773
|
+
return self.n
|
|
2774
|
+
elif i == 2:
|
|
2775
|
+
return self.affine
|
|
2776
|
+
else:
|
|
2777
|
+
raise IndexError("index out of range")
|
|
2778
|
+
|
|
2779
|
+
def rank(self):
|
|
2780
|
+
"""
|
|
2781
|
+
Return the rank of ``self`` which for type `X_n^{(1)}` is `n + 1`.
|
|
2782
|
+
|
|
2783
|
+
EXAMPLES::
|
|
2784
|
+
|
|
2785
|
+
sage: CartanType(['A', 4, 1]).rank()
|
|
2786
|
+
5
|
|
2787
|
+
sage: CartanType(['B', 4, 1]).rank()
|
|
2788
|
+
5
|
|
2789
|
+
sage: CartanType(['C', 3, 1]).rank()
|
|
2790
|
+
4
|
|
2791
|
+
sage: CartanType(['D', 4, 1]).rank()
|
|
2792
|
+
5
|
|
2793
|
+
sage: CartanType(['E', 6, 1]).rank()
|
|
2794
|
+
7
|
|
2795
|
+
sage: CartanType(['E', 7, 1]).rank()
|
|
2796
|
+
8
|
|
2797
|
+
sage: CartanType(['F', 4, 1]).rank()
|
|
2798
|
+
5
|
|
2799
|
+
sage: CartanType(['G', 2, 1]).rank()
|
|
2800
|
+
3
|
|
2801
|
+
sage: CartanType(['A', 2, 2]).rank()
|
|
2802
|
+
2
|
|
2803
|
+
sage: CartanType(['A', 6, 2]).rank()
|
|
2804
|
+
4
|
|
2805
|
+
sage: CartanType(['A', 7, 2]).rank()
|
|
2806
|
+
5
|
|
2807
|
+
sage: CartanType(['D', 5, 2]).rank()
|
|
2808
|
+
5
|
|
2809
|
+
sage: CartanType(['E', 6, 2]).rank()
|
|
2810
|
+
5
|
|
2811
|
+
sage: CartanType(['D', 4, 3]).rank()
|
|
2812
|
+
3
|
|
2813
|
+
"""
|
|
2814
|
+
return self.n+1
|
|
2815
|
+
|
|
2816
|
+
def index_set(self):
|
|
2817
|
+
r"""
|
|
2818
|
+
Implement :meth:`CartanType_abstract.index_set`.
|
|
2819
|
+
|
|
2820
|
+
The index set for all standard affine Cartan types is of the form
|
|
2821
|
+
`\{0, \ldots, n\}`.
|
|
2822
|
+
|
|
2823
|
+
EXAMPLES::
|
|
2824
|
+
|
|
2825
|
+
sage: CartanType(['A', 5, 1]).index_set()
|
|
2826
|
+
(0, 1, 2, 3, 4, 5)
|
|
2827
|
+
"""
|
|
2828
|
+
return tuple(range(self.n+1))
|
|
2829
|
+
|
|
2830
|
+
def special_node(self):
|
|
2831
|
+
r"""
|
|
2832
|
+
Implement :meth:`CartanType_abstract.special_node`.
|
|
2833
|
+
|
|
2834
|
+
With the standard labelling conventions, `0` is always a
|
|
2835
|
+
special node.
|
|
2836
|
+
|
|
2837
|
+
EXAMPLES::
|
|
2838
|
+
|
|
2839
|
+
sage: CartanType(['A', 3, 1]).special_node()
|
|
2840
|
+
0
|
|
2841
|
+
"""
|
|
2842
|
+
return 0
|
|
2843
|
+
|
|
2844
|
+
def type(self):
|
|
2845
|
+
"""
|
|
2846
|
+
Return the type of ``self``.
|
|
2847
|
+
|
|
2848
|
+
EXAMPLES::
|
|
2849
|
+
|
|
2850
|
+
sage: CartanType(['A', 4, 1]).type()
|
|
2851
|
+
'A'
|
|
2852
|
+
"""
|
|
2853
|
+
return self.letter
|
|
2854
|
+
|
|
2855
|
+
##########################################################################
|
|
2856
|
+
|
|
2857
|
+
|
|
2858
|
+
class CartanType_standard_untwisted_affine(CartanType_standard_affine):
|
|
2859
|
+
r"""
|
|
2860
|
+
A concrete class for the standard untwisted affine Cartan types.
|
|
2861
|
+
"""
|
|
2862
|
+
|
|
2863
|
+
def classical(self):
|
|
2864
|
+
r"""
|
|
2865
|
+
Return the classical Cartan type associated with ``self``.
|
|
2866
|
+
|
|
2867
|
+
EXAMPLES::
|
|
2868
|
+
|
|
2869
|
+
sage: CartanType(['A', 3, 1]).classical()
|
|
2870
|
+
['A', 3]
|
|
2871
|
+
sage: CartanType(['B', 3, 1]).classical()
|
|
2872
|
+
['B', 3]
|
|
2873
|
+
sage: CartanType(['C', 3, 1]).classical()
|
|
2874
|
+
['C', 3]
|
|
2875
|
+
sage: CartanType(['D', 4, 1]).classical()
|
|
2876
|
+
['D', 4]
|
|
2877
|
+
sage: CartanType(['E', 6, 1]).classical()
|
|
2878
|
+
['E', 6]
|
|
2879
|
+
sage: CartanType(['F', 4, 1]).classical()
|
|
2880
|
+
['F', 4]
|
|
2881
|
+
sage: CartanType(['G', 2, 1]).classical()
|
|
2882
|
+
['G', 2]
|
|
2883
|
+
"""
|
|
2884
|
+
return CartanType([self.letter,self.n])
|
|
2885
|
+
|
|
2886
|
+
def basic_untwisted(self):
|
|
2887
|
+
r"""
|
|
2888
|
+
Return the basic_untwisted Cartan type associated with this affine
|
|
2889
|
+
Cartan type.
|
|
2890
|
+
|
|
2891
|
+
Given an affine type `X_n^{(r)}`, the basic_untwisted type is `X_n`. In
|
|
2892
|
+
other words, it is the classical Cartan type that is twisted to
|
|
2893
|
+
obtain ``self``.
|
|
2894
|
+
|
|
2895
|
+
EXAMPLES::
|
|
2896
|
+
|
|
2897
|
+
sage: CartanType(['A', 1, 1]).basic_untwisted()
|
|
2898
|
+
['A', 1]
|
|
2899
|
+
sage: CartanType(['A', 3, 1]).basic_untwisted()
|
|
2900
|
+
['A', 3]
|
|
2901
|
+
sage: CartanType(['B', 3, 1]).basic_untwisted()
|
|
2902
|
+
['B', 3]
|
|
2903
|
+
sage: CartanType(['E', 6, 1]).basic_untwisted()
|
|
2904
|
+
['E', 6]
|
|
2905
|
+
sage: CartanType(['G', 2, 1]).basic_untwisted()
|
|
2906
|
+
['G', 2]
|
|
2907
|
+
"""
|
|
2908
|
+
return self.classical()
|
|
2909
|
+
|
|
2910
|
+
def is_untwisted_affine(self):
|
|
2911
|
+
"""
|
|
2912
|
+
Implement :meth:`CartanType_affine.is_untwisted_affine` by
|
|
2913
|
+
returning ``True``.
|
|
2914
|
+
|
|
2915
|
+
EXAMPLES::
|
|
2916
|
+
|
|
2917
|
+
sage: CartanType(['B', 3, 1]).is_untwisted_affine()
|
|
2918
|
+
True
|
|
2919
|
+
"""
|
|
2920
|
+
return True
|
|
2921
|
+
|
|
2922
|
+
def _latex_(self):
|
|
2923
|
+
r"""
|
|
2924
|
+
Return a latex representation of ``self``.
|
|
2925
|
+
|
|
2926
|
+
EXAMPLES::
|
|
2927
|
+
|
|
2928
|
+
sage: latex(CartanType(['B',4,1]))
|
|
2929
|
+
B_{4}^{(1)}
|
|
2930
|
+
sage: latex(CartanType(['C',4,1]))
|
|
2931
|
+
C_{4}^{(1)}
|
|
2932
|
+
sage: latex(CartanType(['D',4,1]))
|
|
2933
|
+
D_{4}^{(1)}
|
|
2934
|
+
sage: latex(CartanType(['F',4,1]))
|
|
2935
|
+
F_4^{(1)}
|
|
2936
|
+
sage: latex(CartanType(['G',2,1]))
|
|
2937
|
+
G_2^{(1)}
|
|
2938
|
+
"""
|
|
2939
|
+
return self.classical()._latex_()+"^{(1)}"
|
|
2940
|
+
|
|
2941
|
+
##########################################################################
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
class CartanType_decorator(UniqueRepresentation, SageObject, CartanType_abstract):
|
|
2945
|
+
"""
|
|
2946
|
+
Concrete base class for Cartan types that decorate another Cartan type.
|
|
2947
|
+
"""
|
|
2948
|
+
|
|
2949
|
+
def __init__(self, ct):
|
|
2950
|
+
"""
|
|
2951
|
+
Initialize ``self``.
|
|
2952
|
+
|
|
2953
|
+
EXAMPLES::
|
|
2954
|
+
|
|
2955
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
2956
|
+
sage: TestSuite(ct).run()
|
|
2957
|
+
"""
|
|
2958
|
+
self._type = ct
|
|
2959
|
+
|
|
2960
|
+
def is_irreducible(self):
|
|
2961
|
+
"""
|
|
2962
|
+
EXAMPLES::
|
|
2963
|
+
|
|
2964
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
2965
|
+
sage: ct.is_irreducible()
|
|
2966
|
+
True
|
|
2967
|
+
"""
|
|
2968
|
+
return self._type.is_irreducible()
|
|
2969
|
+
|
|
2970
|
+
def is_finite(self):
|
|
2971
|
+
"""
|
|
2972
|
+
EXAMPLES::
|
|
2973
|
+
|
|
2974
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
2975
|
+
sage: ct.is_finite()
|
|
2976
|
+
True
|
|
2977
|
+
"""
|
|
2978
|
+
return self._type.is_finite()
|
|
2979
|
+
|
|
2980
|
+
def is_crystallographic(self):
|
|
2981
|
+
"""
|
|
2982
|
+
EXAMPLES::
|
|
2983
|
+
|
|
2984
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
2985
|
+
sage: ct.is_crystallographic()
|
|
2986
|
+
True
|
|
2987
|
+
"""
|
|
2988
|
+
return self._type.is_crystallographic()
|
|
2989
|
+
|
|
2990
|
+
def is_affine(self):
|
|
2991
|
+
"""
|
|
2992
|
+
EXAMPLES::
|
|
2993
|
+
|
|
2994
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
2995
|
+
sage: ct.is_affine()
|
|
2996
|
+
False
|
|
2997
|
+
"""
|
|
2998
|
+
return self._type.is_affine()
|
|
2999
|
+
|
|
3000
|
+
def rank(self):
|
|
3001
|
+
"""
|
|
3002
|
+
EXAMPLES::
|
|
3003
|
+
|
|
3004
|
+
sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
|
|
3005
|
+
sage: ct.rank()
|
|
3006
|
+
2
|
|
3007
|
+
"""
|
|
3008
|
+
return self._type.rank()
|
|
3009
|
+
|
|
3010
|
+
def index_set(self):
|
|
3011
|
+
"""
|
|
3012
|
+
EXAMPLES::
|
|
3013
|
+
|
|
3014
|
+
sage: ct = CartanType(['F', 4, 1]).dual()
|
|
3015
|
+
sage: ct.index_set()
|
|
3016
|
+
(0, 1, 2, 3, 4)
|
|
3017
|
+
"""
|
|
3018
|
+
return self._type.index_set()
|
|
3019
|
+
|
|
3020
|
+
##############################################################################
|
|
3021
|
+
# Base concrete class for superalgebras
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
class SuperCartanType_standard(UniqueRepresentation, SageObject):
|
|
3025
|
+
# Technical methods
|
|
3026
|
+
def _repr_(self, compact=False):
|
|
3027
|
+
"""
|
|
3028
|
+
TESTS::
|
|
3029
|
+
|
|
3030
|
+
sage: ct = CartanType(['A', [3,2]])
|
|
3031
|
+
sage: repr(ct)
|
|
3032
|
+
"['A', [3, 2]]"
|
|
3033
|
+
sage: ct._repr_(compact=True)
|
|
3034
|
+
'A3|2'
|
|
3035
|
+
"""
|
|
3036
|
+
formatstr = '%s%s|%s' if compact else "['%s', [%s, %s]]"
|
|
3037
|
+
return formatstr % (self.letter, self.m, self.n)
|
|
3038
|
+
|
|
3039
|
+
def __len__(self):
|
|
3040
|
+
"""
|
|
3041
|
+
EXAMPLES::
|
|
3042
|
+
|
|
3043
|
+
sage: len(CartanType(['A',[4,3]]))
|
|
3044
|
+
2
|
|
3045
|
+
"""
|
|
3046
|
+
return 2
|
|
3047
|
+
|
|
3048
|
+
def __getitem__(self, i):
|
|
3049
|
+
"""
|
|
3050
|
+
EXAMPLES::
|
|
3051
|
+
|
|
3052
|
+
sage: t = CartanType(['A', [3,6]])
|
|
3053
|
+
sage: t[0]
|
|
3054
|
+
'A'
|
|
3055
|
+
sage: t[1]
|
|
3056
|
+
[3, 6]
|
|
3057
|
+
sage: t[2]
|
|
3058
|
+
Traceback (most recent call last):
|
|
3059
|
+
...
|
|
3060
|
+
IndexError: index out of range
|
|
3061
|
+
"""
|
|
3062
|
+
if i == 0:
|
|
3063
|
+
return self.letter
|
|
3064
|
+
elif i == 1:
|
|
3065
|
+
return [self.m, self.n]
|
|
3066
|
+
else:
|
|
3067
|
+
raise IndexError("index out of range")
|
|
3068
|
+
|
|
3069
|
+
options = CartanType.options
|