passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_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 +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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,1188 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Weight lattice realizations
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2007-2012 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
7
|
+
#
|
|
8
|
+
# (with contributions of many others)
|
|
9
|
+
#
|
|
10
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
11
|
+
#
|
|
12
|
+
# This code is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15
|
+
# General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# The full text of the GPL is available at:
|
|
18
|
+
#
|
|
19
|
+
# https://www.gnu.org/licenses/
|
|
20
|
+
# ****************************************************************************
|
|
21
|
+
|
|
22
|
+
from sage.misc.abstract_method import abstract_method
|
|
23
|
+
from sage.misc.cachefunc import cached_method
|
|
24
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
25
|
+
from sage.misc.misc_c import prod
|
|
26
|
+
from sage.categories.category_types import Category_over_base_ring
|
|
27
|
+
from sage.sets.family import Family
|
|
28
|
+
from .root_lattice_realizations import RootLatticeRealizations
|
|
29
|
+
from sage.rings.rational_field import QQ
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class WeightLatticeRealizations(Category_over_base_ring):
|
|
33
|
+
r"""
|
|
34
|
+
The category of weight lattice realizations over a given base ring.
|
|
35
|
+
|
|
36
|
+
A *weight lattice realization* `L` over a base ring `R` is a free
|
|
37
|
+
module (or vector space if `R` is a field) endowed with an embedding
|
|
38
|
+
of the root lattice of some root system. By restriction, this
|
|
39
|
+
embedding defines an embedding of the root lattice of this root
|
|
40
|
+
system, which makes `L` a root lattice realization.
|
|
41
|
+
|
|
42
|
+
Typical weight lattice realizations over `\ZZ` include the weight
|
|
43
|
+
lattice, and ambient lattice. Typical weight lattice realizations
|
|
44
|
+
over `\QQ` include the weight space, and ambient space.
|
|
45
|
+
|
|
46
|
+
To describe the embedding, a weight lattice realization must
|
|
47
|
+
implement a method
|
|
48
|
+
:meth:`~RootLatticeRealizations.ParentMethods.fundamental_weight`(i)
|
|
49
|
+
returning for each `i` in the index set the image of the fundamental
|
|
50
|
+
weight `\Lambda_i` under the embedding.
|
|
51
|
+
|
|
52
|
+
In order to be a proper root lattice realization, a weight lattice
|
|
53
|
+
realization should also implement the scalar product with the coroot
|
|
54
|
+
lattice; on the other hand, the embedding of the simple roots is
|
|
55
|
+
given for free.
|
|
56
|
+
|
|
57
|
+
.. SEEALSO::
|
|
58
|
+
|
|
59
|
+
- :class:`~sage.combinat.root_system.root_system.RootSystem`
|
|
60
|
+
- :class:`~sage.combinat.root_system.root_lattice_realizations.RootLatticeRealizations`
|
|
61
|
+
- :class:`~sage.combinat.root_system.weight_space.WeightSpace`
|
|
62
|
+
- :class:`~sage.combinat.root_system.ambient_space.AmbientSpace`
|
|
63
|
+
|
|
64
|
+
EXAMPLES:
|
|
65
|
+
|
|
66
|
+
Here, we consider the root system of type `A_7`, and embed the weight
|
|
67
|
+
lattice element `x = \Lambda_1 + 2 \Lambda_3` in several root lattice
|
|
68
|
+
realizations::
|
|
69
|
+
|
|
70
|
+
sage: R = RootSystem(["A",7])
|
|
71
|
+
sage: Lambda = R.weight_lattice().fundamental_weights()
|
|
72
|
+
sage: x = Lambda[2] + 2 * Lambda[5]
|
|
73
|
+
|
|
74
|
+
sage: L = R.weight_space()
|
|
75
|
+
sage: L(x)
|
|
76
|
+
Lambda[2] + 2*Lambda[5]
|
|
77
|
+
|
|
78
|
+
sage: L = R.ambient_lattice()
|
|
79
|
+
sage: L(x)
|
|
80
|
+
(3, 3, 2, 2, 2, 0, 0, 0)
|
|
81
|
+
|
|
82
|
+
We embed the weight space element `x = \Lambda_1 + 1/2 \Lambda_3` in
|
|
83
|
+
the ambient space::
|
|
84
|
+
|
|
85
|
+
sage: Lambda = R.weight_space().fundamental_weights()
|
|
86
|
+
sage: x = Lambda[2] + 1/2 * Lambda[5]
|
|
87
|
+
|
|
88
|
+
sage: L = R.ambient_space()
|
|
89
|
+
sage: L(x)
|
|
90
|
+
(3/2, 3/2, 1/2, 1/2, 1/2, 0, 0, 0)
|
|
91
|
+
|
|
92
|
+
Of course, one can't embed the weight space in the ambient lattice::
|
|
93
|
+
|
|
94
|
+
sage: L = R.ambient_lattice()
|
|
95
|
+
sage: L(x)
|
|
96
|
+
Traceback (most recent call last):
|
|
97
|
+
...
|
|
98
|
+
TypeError: do not know how to make x (= Lambda[2] + 1/2*Lambda[5])
|
|
99
|
+
an element of self (=Ambient lattice of the Root system of type ['A', 7])
|
|
100
|
+
|
|
101
|
+
If `K_1` is a subring of `K_2`, then one could in theory have an
|
|
102
|
+
embedding from the weight space over `K_1` to any weight lattice
|
|
103
|
+
realization over `K_2`; this is not implemented::
|
|
104
|
+
|
|
105
|
+
sage: K1 = QQ
|
|
106
|
+
sage: K2 = QQ['q']
|
|
107
|
+
sage: L = R.ambient_space(K2)
|
|
108
|
+
|
|
109
|
+
sage: Lambda = R.weight_space(K2).fundamental_weights()
|
|
110
|
+
sage: L(Lambda[1])
|
|
111
|
+
(1, 0, 0, 0, 0, 0, 0, 0)
|
|
112
|
+
|
|
113
|
+
sage: Lambda = R.weight_space(K1).fundamental_weights()
|
|
114
|
+
sage: L(Lambda[1])
|
|
115
|
+
Traceback (most recent call last):
|
|
116
|
+
...
|
|
117
|
+
TypeError: do not know how to make x (= Lambda[1]) an element
|
|
118
|
+
of self (=Ambient space of the Root system of type ['A', 7])
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
@cached_method
|
|
122
|
+
def super_categories(self):
|
|
123
|
+
"""
|
|
124
|
+
EXAMPLES::
|
|
125
|
+
|
|
126
|
+
sage: from sage.combinat.root_system.weight_lattice_realizations import WeightLatticeRealizations
|
|
127
|
+
sage: WeightLatticeRealizations(QQ).super_categories()
|
|
128
|
+
[Category of root lattice realizations over Rational Field]
|
|
129
|
+
"""
|
|
130
|
+
return [RootLatticeRealizations(self.base_ring())]
|
|
131
|
+
|
|
132
|
+
class ParentMethods:
|
|
133
|
+
|
|
134
|
+
@abstract_method
|
|
135
|
+
def fundamental_weight(self, i):
|
|
136
|
+
r"""
|
|
137
|
+
Return the `i`-th fundamental weight.
|
|
138
|
+
|
|
139
|
+
INPUT:
|
|
140
|
+
|
|
141
|
+
- ``i`` -- an element of the index set
|
|
142
|
+
|
|
143
|
+
By a slight notational abuse, for an affine type this method
|
|
144
|
+
should also accept ``'delta'`` as input, and return the image
|
|
145
|
+
of `\delta` of the extended weight lattice in this
|
|
146
|
+
realization.
|
|
147
|
+
|
|
148
|
+
This should be overridden by any subclass, and typically
|
|
149
|
+
be implemented as a cached method for efficiency.
|
|
150
|
+
|
|
151
|
+
EXAMPLES::
|
|
152
|
+
|
|
153
|
+
sage: L = RootSystem(["A",3]).ambient_lattice()
|
|
154
|
+
sage: L.fundamental_weight(1)
|
|
155
|
+
(1, 0, 0, 0)
|
|
156
|
+
|
|
157
|
+
sage: L = RootSystem(["A",3,1]).weight_lattice(extended=True)
|
|
158
|
+
sage: L.fundamental_weight(1)
|
|
159
|
+
Lambda[1]
|
|
160
|
+
sage: L.fundamental_weight("delta")
|
|
161
|
+
delta
|
|
162
|
+
|
|
163
|
+
TESTS::
|
|
164
|
+
|
|
165
|
+
sage: super(sage.combinat.root_system.weight_space.WeightSpace, L).fundamental_weight(1)
|
|
166
|
+
Traceback (most recent call last):
|
|
167
|
+
...
|
|
168
|
+
NotImplementedError: <abstract method fundamental_weight at ...>
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
def is_extended(self):
|
|
172
|
+
"""
|
|
173
|
+
Return whether this is a realization of the extended weight lattice.
|
|
174
|
+
|
|
175
|
+
.. SEEALSO:: :class:`sage.combinat.root_system.weight_space.WeightSpace`
|
|
176
|
+
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: RootSystem(["A",3,1]).weight_lattice().is_extended()
|
|
180
|
+
False
|
|
181
|
+
sage: RootSystem(["A",3,1]).weight_lattice(extended=True).is_extended()
|
|
182
|
+
True
|
|
183
|
+
|
|
184
|
+
This method is irrelevant for finite root systems, since the
|
|
185
|
+
weight lattice need not be extended to ensure that the root
|
|
186
|
+
lattice embeds faithfully::
|
|
187
|
+
|
|
188
|
+
sage: RootSystem(["A",3]).weight_lattice().is_extended()
|
|
189
|
+
False
|
|
190
|
+
"""
|
|
191
|
+
return False
|
|
192
|
+
|
|
193
|
+
def __init_extra__(self):
|
|
194
|
+
r"""
|
|
195
|
+
Registers the embedding of the weight lattice into ``self``.
|
|
196
|
+
|
|
197
|
+
Also registers the embedding of the weight space over the same
|
|
198
|
+
base field `K` into ``self`` if `K` is not `\ZZ`.
|
|
199
|
+
|
|
200
|
+
If ``self`` is a realization of the extended weight lattice,
|
|
201
|
+
then the embeddings from the extended weight space/lattices
|
|
202
|
+
are registered instead.
|
|
203
|
+
|
|
204
|
+
EXAMPLES:
|
|
205
|
+
|
|
206
|
+
We embed the fundamental weight `\Lambda_1` of the weight
|
|
207
|
+
lattice in the ambient lattice::
|
|
208
|
+
|
|
209
|
+
sage: R = RootSystem(["A",3])
|
|
210
|
+
sage: Lambda = R.root_lattice().simple_roots()
|
|
211
|
+
sage: L = R.ambient_space()
|
|
212
|
+
sage: L(Lambda[2])
|
|
213
|
+
(0, 1, -1, 0)
|
|
214
|
+
|
|
215
|
+
.. NOTE::
|
|
216
|
+
|
|
217
|
+
More examples are given in :class:`WeightLatticeRealizations`;
|
|
218
|
+
The embeddings are systematically tested in
|
|
219
|
+
:meth:`_test_weight_lattice_realization`.
|
|
220
|
+
"""
|
|
221
|
+
from sage.rings.integer_ring import ZZ
|
|
222
|
+
from .weight_space import WeightSpace
|
|
223
|
+
K = self.base_ring()
|
|
224
|
+
# If self is the root lattice or the root space, we don't want
|
|
225
|
+
# to register its trivial embedding into itself. This builds
|
|
226
|
+
# the domains from which we want to register an embedding.
|
|
227
|
+
domains = []
|
|
228
|
+
if not isinstance(self, WeightSpace) or K is not ZZ:
|
|
229
|
+
domains.append(self.root_system.weight_lattice(extended=self.is_extended()))
|
|
230
|
+
if not isinstance(self, WeightSpace):
|
|
231
|
+
domains.append(self.root_system.weight_space(K,extended=self.is_extended()))
|
|
232
|
+
# Build and register the embeddings
|
|
233
|
+
for domain in domains:
|
|
234
|
+
domain.module_morphism(self.fundamental_weight,
|
|
235
|
+
codomain=self
|
|
236
|
+
).register_as_coercion()
|
|
237
|
+
|
|
238
|
+
def _test_weight_lattice_realization(self, **options):
|
|
239
|
+
"""
|
|
240
|
+
Run sanity checks on this weight lattice realization.
|
|
241
|
+
|
|
242
|
+
- scalar products between the fundamental weights and simple coroots
|
|
243
|
+
- embeddings from the weight lattice and weight space
|
|
244
|
+
- rho, highest_root, ...
|
|
245
|
+
|
|
246
|
+
.. SEEALSO:: :class:`TestSuite`
|
|
247
|
+
|
|
248
|
+
EXAMPLES::
|
|
249
|
+
|
|
250
|
+
sage: RootSystem(['A',3]).weight_lattice()._test_weight_lattice_realization() # needs sage.graphs
|
|
251
|
+
"""
|
|
252
|
+
from sage.rings.integer_ring import ZZ
|
|
253
|
+
tester = self._tester(**options)
|
|
254
|
+
|
|
255
|
+
try:
|
|
256
|
+
Lambda = self.fundamental_weights()
|
|
257
|
+
alphacheck = self.simple_coroots()
|
|
258
|
+
except ImportError:
|
|
259
|
+
return
|
|
260
|
+
|
|
261
|
+
tester.assertEqual(tuple(Lambda.keys()), self.index_set())
|
|
262
|
+
|
|
263
|
+
# Check the consistency between simple_root and simple_roots
|
|
264
|
+
for i in self.index_set():
|
|
265
|
+
tester.assertEqual(self.fundamental_weight(i), Lambda[i])
|
|
266
|
+
|
|
267
|
+
# Check the embeddings from:
|
|
268
|
+
# - the weight lattice
|
|
269
|
+
# - the weight space over the same base ring
|
|
270
|
+
#
|
|
271
|
+
# For an affine root system, this will check the embedding of
|
|
272
|
+
# the extended ones, and also of the non extended ones if this
|
|
273
|
+
# realization is not extended
|
|
274
|
+
domains = [self.root_system.weight_space(base_ring, extended=extended)
|
|
275
|
+
for base_ring in set([ZZ, self.base_ring()])
|
|
276
|
+
for extended in set([self.cartan_type().is_affine(), self.is_extended()])]
|
|
277
|
+
for domain in domains:
|
|
278
|
+
tester.assertIsNot(self._internal_coerce_map_from(domain), None)
|
|
279
|
+
for i in self.index_set():
|
|
280
|
+
# This embedding maps fundamental weights to fundamental weights
|
|
281
|
+
tester.assertEqual(self(domain.fundamental_weight(i)), Lambda[i])
|
|
282
|
+
if self.cartan_type().is_affine():
|
|
283
|
+
tester.assertEqual(self(domain.null_root()), self.null_root())
|
|
284
|
+
if self.is_extended():
|
|
285
|
+
a = self.cartan_type().col_annihilator()
|
|
286
|
+
# This could be an over specification; we
|
|
287
|
+
# could imagine realizations of the extended
|
|
288
|
+
# weight lattice where the null root would not
|
|
289
|
+
# be a (multiple of) basis element.
|
|
290
|
+
tester.assertEqual(self.null_root(), self.term("delta", a[0]))
|
|
291
|
+
for i in self.index_set():
|
|
292
|
+
# The level of the fundamental weights is consistent
|
|
293
|
+
tester.assertEqual(domain.fundamental_weight(i).level(), Lambda[i].level())
|
|
294
|
+
|
|
295
|
+
# Check that the fundamental weights form the dual basis of the simple coroots
|
|
296
|
+
for i in self.index_set():
|
|
297
|
+
assert (Lambda[i].is_dominant())
|
|
298
|
+
for j in self.index_set():
|
|
299
|
+
tester.assertEqual(Lambda[j].scalar(alphacheck[i]), (1 if i == j else 0))
|
|
300
|
+
|
|
301
|
+
tester.assertTrue(self.rho().is_dominant())
|
|
302
|
+
if self.root_system.is_finite() and self.root_system.is_irreducible():
|
|
303
|
+
try:
|
|
304
|
+
tester.assertTrue(self.highest_root().is_dominant())
|
|
305
|
+
except ImportError: # when sage.graphs is missing (Dynkin diagram)
|
|
306
|
+
pass
|
|
307
|
+
|
|
308
|
+
@cached_method
|
|
309
|
+
def fundamental_weights(self):
|
|
310
|
+
r"""
|
|
311
|
+
Return the family `(\Lambda_i)_{i\in I}` of the fundamental weights.
|
|
312
|
+
|
|
313
|
+
EXAMPLES::
|
|
314
|
+
|
|
315
|
+
sage: e = RootSystem(['A',3]).ambient_lattice()
|
|
316
|
+
sage: f = e.fundamental_weights()
|
|
317
|
+
sage: [f[i] for i in [1,2,3]]
|
|
318
|
+
[(1, 0, 0, 0), (1, 1, 0, 0), (1, 1, 1, 0)]
|
|
319
|
+
"""
|
|
320
|
+
return Family(self.index_set(), self.fundamental_weight)
|
|
321
|
+
# It would be nice to give this family a nice name with
|
|
322
|
+
# ``rename``, but this currently break some doctests.
|
|
323
|
+
|
|
324
|
+
@cached_method
|
|
325
|
+
def simple_root(self, i):
|
|
326
|
+
r"""
|
|
327
|
+
Return the `i`-th simple root.
|
|
328
|
+
|
|
329
|
+
This default implementation takes the `i`-th simple root in
|
|
330
|
+
the weight lattice and embeds it in ``self``.
|
|
331
|
+
|
|
332
|
+
EXAMPLES:
|
|
333
|
+
|
|
334
|
+
Since all the weight lattice realizations in Sage currently
|
|
335
|
+
implement a ``simple_root`` method, we have to call this one by
|
|
336
|
+
hand::
|
|
337
|
+
|
|
338
|
+
sage: from sage.combinat.root_system.weight_lattice_realizations import WeightLatticeRealizations
|
|
339
|
+
sage: simple_root = WeightLatticeRealizations(QQ).parent_class.simple_root.f
|
|
340
|
+
sage: L = RootSystem("A3").ambient_space()
|
|
341
|
+
sage: simple_root(L, 1) # needs sage.graphs
|
|
342
|
+
(1, -1, 0, 0)
|
|
343
|
+
sage: simple_root(L, 2) # needs sage.graphs
|
|
344
|
+
(0, 1, -1, 0)
|
|
345
|
+
sage: simple_root(L, 3) # needs sage.graphs
|
|
346
|
+
(1, 1, 2, 0)
|
|
347
|
+
|
|
348
|
+
Note that this last root differs from the one implemented in
|
|
349
|
+
``L`` by a multiple of the vector ``(1,1,1,1)``::
|
|
350
|
+
|
|
351
|
+
sage: L.simple_roots() # needs sage.graphs
|
|
352
|
+
Finite family {1: (1, -1, 0, 0), 2: (0, 1, -1, 0), 3: (0, 0, 1, -1)}
|
|
353
|
+
|
|
354
|
+
This is a harmless artefact of the `SL` versus `GL`
|
|
355
|
+
interpretation of type `A`; see the thematic tutorial on Lie
|
|
356
|
+
Methods and Related Combinatorics in Sage for details.
|
|
357
|
+
"""
|
|
358
|
+
if i not in self.index_set():
|
|
359
|
+
raise ValueError("{} is not in the index set".format(i))
|
|
360
|
+
alphai = self.root_system.weight_lattice().simple_root(i)
|
|
361
|
+
# Note: it would be nicer to just return ``self(alpha[i])``,
|
|
362
|
+
# However the embedding from the weight lattice is defined
|
|
363
|
+
# after the embedding from the root lattice, and the later
|
|
364
|
+
# uses the simple roots. So we compute that embedding by hand.
|
|
365
|
+
Lambda = self.fundamental_weights()
|
|
366
|
+
return self.linear_combination( (Lambda[j], c) for j,c in alphai )
|
|
367
|
+
|
|
368
|
+
@cached_method
|
|
369
|
+
def rho(self):
|
|
370
|
+
"""
|
|
371
|
+
EXAMPLES::
|
|
372
|
+
|
|
373
|
+
sage: RootSystem(['A',3]).ambient_lattice().rho()
|
|
374
|
+
(3, 2, 1, 0)
|
|
375
|
+
"""
|
|
376
|
+
return sum(self.fundamental_weights())
|
|
377
|
+
|
|
378
|
+
def reduced_word_of_alcove_morphism(self, f):
|
|
379
|
+
r"""
|
|
380
|
+
Return the reduced word of an alcove morphism.
|
|
381
|
+
|
|
382
|
+
INPUT:
|
|
383
|
+
|
|
384
|
+
- ``f`` -- a linear map from ``self`` to ``self`` which
|
|
385
|
+
preserves alcoves
|
|
386
|
+
|
|
387
|
+
Let `A` be the fundamental alcove. This returns a reduced word
|
|
388
|
+
`i_1, \ldots, i_k` such that the affine Weyl group element `w =
|
|
389
|
+
s_{i_1} \circ \cdots \circ s_{i_k}` maps the alcove `f(A)` back
|
|
390
|
+
to `A`. In other words, the alcove walk `i_1, \ldots, i_k` brings
|
|
391
|
+
the fundamental alcove to the corresponding translated alcove.
|
|
392
|
+
|
|
393
|
+
Let us throw in a bit of context to explain the main use
|
|
394
|
+
case. It is customary to realize the alcove picture in
|
|
395
|
+
the coroot or coweight lattice `R^\vee`. The extended
|
|
396
|
+
affine Weyl group is then the group of linear maps on
|
|
397
|
+
`R^\vee` which preserve the alcoves. By
|
|
398
|
+
[Kac "Infinite-dimensional Lie algebra", Proposition 6.5]
|
|
399
|
+
the affine Weyl group is the semidirect product of the
|
|
400
|
+
associated finite Weyl group and the group of translations
|
|
401
|
+
in the coroot lattice (the extended affine Weyl group uses
|
|
402
|
+
the coweight lattice instead). In other words, an element
|
|
403
|
+
of the extended affine Weyl group admits a unique
|
|
404
|
+
decomposition of the form:
|
|
405
|
+
|
|
406
|
+
.. MATH:: f = d w ,
|
|
407
|
+
|
|
408
|
+
where `w` is in the Weyl group, and `d` is a function which
|
|
409
|
+
maps the fundamental alcove to itself. As `d` permutes the
|
|
410
|
+
walls of the fundamental alcove, it permutes accordingly the
|
|
411
|
+
corresponding simple roots, which induces an automorphism of
|
|
412
|
+
the Dynkin diagram.
|
|
413
|
+
|
|
414
|
+
This method returns a reduced word for `w`, whereas the method
|
|
415
|
+
:meth:`dynkin_diagram_automorphism_of_alcove_morphism` returns
|
|
416
|
+
`d` as a permutation of the nodes of the Dynkin diagram.
|
|
417
|
+
|
|
418
|
+
Nota bene: recall that the coroot (resp. coweight) lattice is
|
|
419
|
+
implemented as the root (resp weight) lattice of the dual root
|
|
420
|
+
system. Hence, this method is implemented for weight lattice
|
|
421
|
+
realizations, but in practice is most of the time used on the
|
|
422
|
+
dual side.
|
|
423
|
+
|
|
424
|
+
EXAMPLES:
|
|
425
|
+
|
|
426
|
+
We start with type `A` which is simply laced; hence we do not
|
|
427
|
+
have to worry about the distinction between the weight and
|
|
428
|
+
coweight lattice::
|
|
429
|
+
|
|
430
|
+
sage: R = RootSystem(["A",2,1]).weight_lattice()
|
|
431
|
+
sage: alpha = R.simple_roots() # needs sage.graphs
|
|
432
|
+
sage: Lambda = R.fundamental_weights()
|
|
433
|
+
|
|
434
|
+
We consider first translations by elements of the root lattice::
|
|
435
|
+
|
|
436
|
+
sage: R.reduced_word_of_alcove_morphism(alpha[0].translation) # needs sage.graphs
|
|
437
|
+
[1, 2, 1, 0]
|
|
438
|
+
sage: R.reduced_word_of_alcove_morphism(alpha[1].translation) # needs sage.graphs
|
|
439
|
+
[0, 2, 0, 1]
|
|
440
|
+
sage: R.reduced_word_of_alcove_morphism(alpha[2].translation) # needs sage.graphs
|
|
441
|
+
[0, 1, 0, 2]
|
|
442
|
+
|
|
443
|
+
We continue with translations by elements of the classical
|
|
444
|
+
weight lattice, embedded at level `0`:
|
|
445
|
+
|
|
446
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
447
|
+
sage: omega2 = Lambda[2] - Lambda[0]
|
|
448
|
+
|
|
449
|
+
sage: R.reduced_word_of_alcove_morphism(omega1.translation) # needs sage.graphs
|
|
450
|
+
[0, 2]
|
|
451
|
+
sage: R.reduced_word_of_alcove_morphism(omega2.translation) # needs sage.graphs
|
|
452
|
+
[0, 1]
|
|
453
|
+
|
|
454
|
+
The following tests ensure that the code agrees with the tables
|
|
455
|
+
in Kashiwara's private notes on affine quantum algebras (2008).
|
|
456
|
+
|
|
457
|
+
TESTS::
|
|
458
|
+
|
|
459
|
+
sage: # needs sage.graphs
|
|
460
|
+
sage: R = RootSystem(['A',5,1]).weight_lattice()
|
|
461
|
+
sage: alpha = R.simple_roots()
|
|
462
|
+
sage: Lambda = R.fundamental_weights()
|
|
463
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
464
|
+
sage: R.reduced_word_of_alcove_morphism(omega1.translation)
|
|
465
|
+
[0, 5, 4, 3, 2]
|
|
466
|
+
sage: R.reduced_word_of_alcove_morphism(alpha[0].translation)
|
|
467
|
+
[1, 2, 3, 4, 5, 4, 3, 2, 1, 0]
|
|
468
|
+
|
|
469
|
+
sage: # needs sage.graphs
|
|
470
|
+
sage: R = RootSystem(['C',3,1]).weight_lattice()
|
|
471
|
+
sage: alpha = R.simple_roots()
|
|
472
|
+
sage: Lambda = R.fundamental_weights()
|
|
473
|
+
sage: omega1 = 2*(Lambda[1] - Lambda[0])
|
|
474
|
+
sage: omega2 = 2*(Lambda[2] - Lambda[0])
|
|
475
|
+
sage: omega3 = Lambda[3] - Lambda[0]
|
|
476
|
+
sage: R.reduced_word_of_alcove_morphism(omega1.translation)
|
|
477
|
+
[0, 1, 2, 3, 2, 1]
|
|
478
|
+
sage: R.reduced_word_of_alcove_morphism(omega2.translation)
|
|
479
|
+
[0, 1, 0, 2, 1, 3, 2, 1, 3, 2]
|
|
480
|
+
sage: R.reduced_word_of_alcove_morphism(omega3.translation)
|
|
481
|
+
[0, 1, 0, 2, 1, 0]
|
|
482
|
+
|
|
483
|
+
sage: # needs sage.graphs sage.libs.gap
|
|
484
|
+
sage: W = WeylGroup(['C',3,1])
|
|
485
|
+
sage: s = W.simple_reflections()
|
|
486
|
+
sage: w = s[0]*s[1]*s[2]*s[3]*s[2]
|
|
487
|
+
sage: W.from_reduced_word(R.reduced_word_of_alcove_morphism(omega2.translation)) == w*w # needs sage.graphs
|
|
488
|
+
True
|
|
489
|
+
sage: w = s[0]*s[1]*s[2]*s[0]*s[1]*s[0]
|
|
490
|
+
sage: W.from_reduced_word(R.reduced_word_of_alcove_morphism(omega3.translation)) == w # needs sage.graphs
|
|
491
|
+
True
|
|
492
|
+
|
|
493
|
+
sage: # needs sage.graphs
|
|
494
|
+
sage: R = RootSystem(['D',4,1]).weight_lattice()
|
|
495
|
+
sage: Lambda = R.fundamental_weights()
|
|
496
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
497
|
+
sage: omega2 = Lambda[2] - 2*Lambda[0]
|
|
498
|
+
sage: omega3 = Lambda[3] - Lambda[0]
|
|
499
|
+
sage: omega4 = Lambda[4] - Lambda[0]
|
|
500
|
+
sage: R.reduced_word_of_alcove_morphism(omega1.translation)
|
|
501
|
+
[0, 2, 3, 4, 2, 0]
|
|
502
|
+
sage: R.reduced_word_of_alcove_morphism(omega2.translation)
|
|
503
|
+
[0, 2, 1, 3, 2, 4, 2, 1, 3, 2]
|
|
504
|
+
sage: R.reduced_word_of_alcove_morphism(omega3.translation)
|
|
505
|
+
[0, 2, 1, 4, 2, 0]
|
|
506
|
+
sage: R.reduced_word_of_alcove_morphism(omega4.translation)
|
|
507
|
+
[0, 2, 1, 3, 2, 0]
|
|
508
|
+
|
|
509
|
+
sage: # needs sage.libs.gap
|
|
510
|
+
sage: W = WeylGroup(['D',4,1])
|
|
511
|
+
sage: s = W.simple_reflections()
|
|
512
|
+
sage: w = s[0]*s[2]*s[3]*s[4]*s[2]
|
|
513
|
+
sage: w1= s[1]*s[2]*s[3]*s[4]*s[2]
|
|
514
|
+
sage: W.from_reduced_word(R.reduced_word_of_alcove_morphism(omega2.translation)) == w*w1 # needs sage.graphs
|
|
515
|
+
True
|
|
516
|
+
|
|
517
|
+
sage: R = RootSystem(['D',5,1]).weight_lattice()
|
|
518
|
+
sage: Lambda = R.fundamental_weights()
|
|
519
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
520
|
+
sage: omega2 = Lambda[2] - 2*Lambda[0]
|
|
521
|
+
sage: R.reduced_word_of_alcove_morphism(omega1.translation) # needs sage.graphs
|
|
522
|
+
[0, 2, 3, 4, 5, 3, 2, 0]
|
|
523
|
+
|
|
524
|
+
sage: # needs sage.libs.gap
|
|
525
|
+
sage: W = WeylGroup(['D',5,1])
|
|
526
|
+
sage: s = W.simple_reflections()
|
|
527
|
+
sage: w = s[0]*s[2]*s[3]*s[4]*s[5]*s[3]*s[2]
|
|
528
|
+
sage: w1= s[1]*s[2]*s[3]*s[4]*s[5]*s[3]*s[2]
|
|
529
|
+
sage: W.from_reduced_word(R.reduced_word_of_alcove_morphism(omega2.translation)) == w*w1 # needs sage.graphs
|
|
530
|
+
True
|
|
531
|
+
"""
|
|
532
|
+
return f(self.rho()).reduced_word()
|
|
533
|
+
|
|
534
|
+
def dynkin_diagram_automorphism_of_alcove_morphism(self, f):
|
|
535
|
+
r"""
|
|
536
|
+
Return the Dynkin diagram automorphism induced by an alcove morphism.
|
|
537
|
+
|
|
538
|
+
INPUT:
|
|
539
|
+
|
|
540
|
+
- ``f`` -- a linear map from ``self`` to ``self`` which preserves alcoves
|
|
541
|
+
|
|
542
|
+
This method returns the Dynkin diagram automorphism for
|
|
543
|
+
the decomposition `f = d w` (see
|
|
544
|
+
:meth:`reduced_word_of_alcove_morphism`), as a dictionary
|
|
545
|
+
mapping elements of the index set to itself.
|
|
546
|
+
|
|
547
|
+
EXAMPLES::
|
|
548
|
+
|
|
549
|
+
sage: R = RootSystem(["A",2,1]).weight_lattice()
|
|
550
|
+
sage: alpha = R.simple_roots() # needs sage.graphs
|
|
551
|
+
sage: Lambda = R.fundamental_weights()
|
|
552
|
+
|
|
553
|
+
Translations by elements of the root lattice induce a
|
|
554
|
+
trivial Dynkin diagram automorphism::
|
|
555
|
+
|
|
556
|
+
sage: # needs sage.graphs sage.libs.gap
|
|
557
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(alpha[0].translation)
|
|
558
|
+
{0: 0, 1: 1, 2: 2}
|
|
559
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(alpha[1].translation)
|
|
560
|
+
{0: 0, 1: 1, 2: 2}
|
|
561
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(alpha[2].translation)
|
|
562
|
+
{0: 0, 1: 1, 2: 2}
|
|
563
|
+
|
|
564
|
+
This is no more the case for translations by general
|
|
565
|
+
elements of the (classical) weight lattice at level 0::
|
|
566
|
+
|
|
567
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
568
|
+
sage: omega2 = Lambda[2] - Lambda[0]
|
|
569
|
+
|
|
570
|
+
sage: # needs sage.graphs sage.libs.gap
|
|
571
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(omega1.translation)
|
|
572
|
+
{0: 1, 1: 2, 2: 0}
|
|
573
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(omega2.translation)
|
|
574
|
+
{0: 2, 1: 0, 2: 1}
|
|
575
|
+
|
|
576
|
+
sage: # needs sage.graphs sage.libs.gap
|
|
577
|
+
sage: R = RootSystem(['C',2,1]).weight_lattice()
|
|
578
|
+
sage: alpha = R.simple_roots()
|
|
579
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(alpha[1].translation)
|
|
580
|
+
{0: 2, 1: 1, 2: 0}
|
|
581
|
+
|
|
582
|
+
sage: # needs sage.graphs sage.libs.gap
|
|
583
|
+
sage: R = RootSystem(['D',5,1]).weight_lattice()
|
|
584
|
+
sage: Lambda = R.fundamental_weights()
|
|
585
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
586
|
+
sage: omega2 = Lambda[2] - 2*Lambda[0]
|
|
587
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(omega1.translation)
|
|
588
|
+
{0: 1, 1: 0, 2: 2, 3: 3, 4: 5, 5: 4}
|
|
589
|
+
sage: R.dynkin_diagram_automorphism_of_alcove_morphism(omega2.translation)
|
|
590
|
+
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
|
|
591
|
+
|
|
592
|
+
Algorithm: computes `w` of the decomposition, and see how
|
|
593
|
+
`f\circ w^{-1}` permutes the simple roots.
|
|
594
|
+
"""
|
|
595
|
+
alpha = self.simple_roots()
|
|
596
|
+
w = self.weyl_group().from_reduced_word(self.reduced_word_of_alcove_morphism(f))
|
|
597
|
+
# Now, we have d = f w^-1
|
|
598
|
+
winv = ~w
|
|
599
|
+
assert all(alpha[i].level().is_zero() for i in self.index_set())
|
|
600
|
+
rank_simple_roots = {alpha[i]: i for i in self.index_set()}
|
|
601
|
+
permutation = dict()
|
|
602
|
+
for i in self.index_set():
|
|
603
|
+
root = f(winv.action(alpha[i])) # This is d(alpha_i)
|
|
604
|
+
assert root in rank_simple_roots
|
|
605
|
+
permutation[i] = rank_simple_roots[root]
|
|
606
|
+
assert set(permutation.values()), set(self.index_set())
|
|
607
|
+
return permutation
|
|
608
|
+
|
|
609
|
+
def reduced_word_of_translation(self, t):
|
|
610
|
+
r"""
|
|
611
|
+
Given an element of the root lattice, this returns a reduced
|
|
612
|
+
word `i_1, \ldots, i_k` such that the Weyl group element `s_{i_1}
|
|
613
|
+
\circ \cdots \circ s_{i_k}` implements the "translation"
|
|
614
|
+
where `x` maps to `x + level(x)*t`. In other words, the alcove walk
|
|
615
|
+
`i_1, \ldots, i_k` brings the fundamental alcove to the
|
|
616
|
+
corresponding translated alcove.
|
|
617
|
+
|
|
618
|
+
.. NOTE::
|
|
619
|
+
|
|
620
|
+
There are some technical conditions for `t` to actually
|
|
621
|
+
be a translation; those are not tested (TODO: detail).
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: # needs sage.graphs
|
|
626
|
+
sage: R = RootSystem(["A",2,1]).weight_lattice()
|
|
627
|
+
sage: alpha = R.simple_roots()
|
|
628
|
+
sage: R.reduced_word_of_translation(alpha[1])
|
|
629
|
+
[0, 2, 0, 1]
|
|
630
|
+
sage: R.reduced_word_of_translation(alpha[2])
|
|
631
|
+
[0, 1, 0, 2]
|
|
632
|
+
sage: R.reduced_word_of_translation(alpha[0])
|
|
633
|
+
[1, 2, 1, 0]
|
|
634
|
+
|
|
635
|
+
sage: R = RootSystem(['D',5,1]).weight_lattice()
|
|
636
|
+
sage: Lambda = R.fundamental_weights()
|
|
637
|
+
sage: omega1 = Lambda[1] - Lambda[0]
|
|
638
|
+
sage: omega2 = Lambda[2] - 2*Lambda[0]
|
|
639
|
+
sage: R.reduced_word_of_translation(omega1) # needs sage.graphs
|
|
640
|
+
[0, 2, 3, 4, 5, 3, 2, 0]
|
|
641
|
+
sage: R.reduced_word_of_translation(omega2) # needs sage.graphs
|
|
642
|
+
[0, 2, 1, 3, 2, 4, 3, 5, 3, 2, 1, 4, 3, 2]
|
|
643
|
+
|
|
644
|
+
A non simply laced case::
|
|
645
|
+
|
|
646
|
+
sage: R = RootSystem(["C",2,1]).weight_lattice()
|
|
647
|
+
sage: Lambda = R.fundamental_weights()
|
|
648
|
+
sage: c = R.cartan_type().translation_factors(); c # needs sage.graphs
|
|
649
|
+
Finite family {0: 1, 1: 2, 2: 1}
|
|
650
|
+
sage: R.reduced_word_of_translation((Lambda[1]-Lambda[0]) * c[1]) # needs sage.graphs
|
|
651
|
+
[0, 1, 2, 1]
|
|
652
|
+
sage: R.reduced_word_of_translation((Lambda[2]-Lambda[0]) * c[2]) # needs sage.graphs
|
|
653
|
+
[0, 1, 0]
|
|
654
|
+
|
|
655
|
+
See also :meth:`_test_reduced_word_of_translation`.
|
|
656
|
+
|
|
657
|
+
.. TODO::
|
|
658
|
+
|
|
659
|
+
- Add a picture in the doc
|
|
660
|
+
- Add a method which, given an element of the classical
|
|
661
|
+
weight lattice, constructs the appropriate value for t
|
|
662
|
+
"""
|
|
663
|
+
return self.reduced_word_of_alcove_morphism(t.translation)
|
|
664
|
+
|
|
665
|
+
def _test_reduced_word_of_translation(self, elements=None, **options):
|
|
666
|
+
r"""
|
|
667
|
+
Test the method :meth:`reduced_word_of_translation`.
|
|
668
|
+
|
|
669
|
+
INPUT:
|
|
670
|
+
|
|
671
|
+
- ``options`` -- any keyword arguments accepted by :meth:`_tester`
|
|
672
|
+
|
|
673
|
+
EXAMPLES::
|
|
674
|
+
|
|
675
|
+
sage: R = RootSystem(['D',4,1]).weight_lattice()
|
|
676
|
+
sage: R._test_reduced_word_of_translation() # needs sage.graphs
|
|
677
|
+
|
|
678
|
+
See the documentation for :class:`TestSuite` for more information.
|
|
679
|
+
"""
|
|
680
|
+
tester = self._tester(**options)
|
|
681
|
+
if not self.cartan_type().is_affine(): # won't be necessary anymore once root systems are categorified
|
|
682
|
+
return
|
|
683
|
+
try:
|
|
684
|
+
alpha = self.simple_roots()
|
|
685
|
+
except ImportError: # when sage.graphs is not available
|
|
686
|
+
return
|
|
687
|
+
Lambda = self.fundamental_weights()
|
|
688
|
+
rho = self.rho()
|
|
689
|
+
G = self.dynkin_diagram()
|
|
690
|
+
permutations = []
|
|
691
|
+
|
|
692
|
+
# Note: this uses a special set of default elements instead of
|
|
693
|
+
# the usual tester.some_elements(), namely the smallest
|
|
694
|
+
# elements in the weight lattice giving rise to translations
|
|
695
|
+
# preserving the alcoves.
|
|
696
|
+
if elements is None:
|
|
697
|
+
c = self.cartan_type().c()
|
|
698
|
+
elements = [c[i] * Lambda[i]
|
|
699
|
+
for i in self.cartan_type().classical().index_set()]
|
|
700
|
+
|
|
701
|
+
# When the null root is zero in this root lattice realization,
|
|
702
|
+
# the roots correspond to the classical roots. We use that to
|
|
703
|
+
# check that w permute the simple roots according to a Dynkin
|
|
704
|
+
# diagram automorphism. This test currently requires the index
|
|
705
|
+
# set to be of the form 0..n
|
|
706
|
+
test_automorphism = self.null_root().is_zero() and set(self.index_set()) == set(i for i in range(len(self.index_set())))
|
|
707
|
+
# dictionary assigning a simple root to its index
|
|
708
|
+
rank_simple_roots = {alpha[i]: i for i in self.index_set()}
|
|
709
|
+
|
|
710
|
+
try:
|
|
711
|
+
W = self.weyl_group()
|
|
712
|
+
except ImportError:
|
|
713
|
+
return
|
|
714
|
+
|
|
715
|
+
for t in elements:
|
|
716
|
+
t = t - self.base_ring()(t.level()/Lambda[0].level()) * Lambda[0]
|
|
717
|
+
w = W.from_reduced_word(self.reduced_word_of_translation(t))
|
|
718
|
+
if self.null_root().is_zero():
|
|
719
|
+
# The following formula is only valid when the null root is zero
|
|
720
|
+
tester.assertEqual(w.action(rho), rho + rho.level()*t)
|
|
721
|
+
# TODO: fix this formula to take delta into account,
|
|
722
|
+
# and remove the above condition
|
|
723
|
+
if test_automorphism:
|
|
724
|
+
permutation = [None for i in self.index_set()]
|
|
725
|
+
for i in self.index_set():
|
|
726
|
+
root = w.action(alpha[i])
|
|
727
|
+
tester.assertIn(root, rank_simple_roots)
|
|
728
|
+
permutation[i] = rank_simple_roots[root]
|
|
729
|
+
tester.assertEqual(set(permutation), set(self.index_set()))
|
|
730
|
+
# It could be nicer to test equality of G and its relabelling
|
|
731
|
+
for i in self.index_set():
|
|
732
|
+
for j in self.index_set():
|
|
733
|
+
tester.assertEqual(G[permutation[i],permutation[j]], G[i,j])
|
|
734
|
+
permutations.append(permutation)
|
|
735
|
+
|
|
736
|
+
if test_automorphism and elements is None: # note: the test on elements is broken
|
|
737
|
+
# Check that, if we start from all fundamental weights, we
|
|
738
|
+
# get the full automorphism group
|
|
739
|
+
# Disabled: this should actually check that one gets all special
|
|
740
|
+
# automorphisms, which are in bijection with the special nodes
|
|
741
|
+
#from sage.groups.perm_gps.permgroup import PermutationGroup
|
|
742
|
+
#P = PermutationGroup([[i+1 for i in permutation] for permutation in permutations])
|
|
743
|
+
#tester.assertEqual(P, G.automorphism_group())
|
|
744
|
+
pass
|
|
745
|
+
|
|
746
|
+
def signs_of_alcovewalk(self, walk):
|
|
747
|
+
r"""
|
|
748
|
+
Let walk = `[i_1,\ldots,i_n]` denote an alcove walk starting
|
|
749
|
+
from the fundamental alcove `y_0`, crossing at step 1 the
|
|
750
|
+
wall `i_1`, and so on.
|
|
751
|
+
|
|
752
|
+
For each `k`, set `w_k = s_{i_1} \circ s_{i_k}`, and denote
|
|
753
|
+
by `y_k = w_k(y_0)` the alcove reached after `k` steps. Then,
|
|
754
|
+
`y_k` is obtained recursively from `y_{k-1}` by applying the
|
|
755
|
+
following reflection:
|
|
756
|
+
|
|
757
|
+
.. MATH::
|
|
758
|
+
|
|
759
|
+
y_k = s_{w_{k-1} \alpha_{i_k}} y_{k-1}.
|
|
760
|
+
|
|
761
|
+
The step is said positive if `w_{k-1} \alpha_{i_k}` is a
|
|
762
|
+
negative root (considering `w_{k-1}` as element of the
|
|
763
|
+
classical Weyl group and `\alpha_{i_k}` as a classical
|
|
764
|
+
root) and negative otherwise. The algorithm implemented
|
|
765
|
+
here use the equivalent property::
|
|
766
|
+
|
|
767
|
+
.. MATH:: \langle w_{k-1}^{-1} \rho_0, \alpha^\vee_{i_k}\rangle > 0
|
|
768
|
+
|
|
769
|
+
Where `\rho_0` is the sum of the classical fundamental
|
|
770
|
+
weights embedded at level 0 in this space (see
|
|
771
|
+
:meth:`rho_classical`), and `\alpha^\vee_{i_k}` is the
|
|
772
|
+
simple coroot associated to `\alpha_{i_k}`.
|
|
773
|
+
|
|
774
|
+
This function returns a list of the form `[+1,+1,-1,...]`,
|
|
775
|
+
where the `k`-th entry denotes whether the `k`-th step was
|
|
776
|
+
positive or negative.
|
|
777
|
+
|
|
778
|
+
See equation 3.4, of Ram: Alcove walks ..., :arxiv:`math/0601343v1`
|
|
779
|
+
|
|
780
|
+
EXAMPLES::
|
|
781
|
+
|
|
782
|
+
sage: L = RootSystem(['C',2,1]).weight_lattice()
|
|
783
|
+
sage: L.signs_of_alcovewalk([1,2,0,1,2,1,2,0,1,2]) # needs sage.graphs sage.libs.gap
|
|
784
|
+
[-1, -1, 1, -1, 1, 1, 1, 1, 1, 1]
|
|
785
|
+
|
|
786
|
+
sage: L = RootSystem(['A',2,1]).weight_lattice()
|
|
787
|
+
sage: L.signs_of_alcovewalk([0,1,2,1,2,0,1,2,0,1,2,0]) # needs sage.graphs sage.libs.gap
|
|
788
|
+
[1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1]
|
|
789
|
+
|
|
790
|
+
sage: L = RootSystem(['B',2,1]).coweight_lattice()
|
|
791
|
+
sage: L.signs_of_alcovewalk([0,1,2,0,1,2]) # needs sage.graphs sage.libs.gap
|
|
792
|
+
[1, -1, 1, -1, 1, 1]
|
|
793
|
+
|
|
794
|
+
.. WARNING::
|
|
795
|
+
|
|
796
|
+
This method currently does not work in the weight
|
|
797
|
+
lattice for type BC dual because `\rho_0` does not
|
|
798
|
+
live in this lattice (but an integral multiple of it
|
|
799
|
+
would do the job as well).
|
|
800
|
+
"""
|
|
801
|
+
# Below, w is w_{k-1} and we use the fact that, for a root
|
|
802
|
+
# `a` the following are equivalent:
|
|
803
|
+
# - w a is a negative root
|
|
804
|
+
# - <w a, rho^\vee> < 0
|
|
805
|
+
# - <w a^\vee, rho> < 0
|
|
806
|
+
# - <a^\vee, w^-1 rho> < 0
|
|
807
|
+
W = self.weyl_group()
|
|
808
|
+
s = W.simple_reflections()
|
|
809
|
+
alphacheck = self.alphacheck()
|
|
810
|
+
rho0 = self.rho_classical()
|
|
811
|
+
w = W.one()
|
|
812
|
+
signs = []
|
|
813
|
+
for i in walk:
|
|
814
|
+
if (w.action(rho0).scalar(alphacheck[i]) > 0):
|
|
815
|
+
signs.append(-1)
|
|
816
|
+
else:
|
|
817
|
+
signs.append(1)
|
|
818
|
+
w = s[i]*w
|
|
819
|
+
return signs
|
|
820
|
+
|
|
821
|
+
def rho_classical(self):
|
|
822
|
+
r"""
|
|
823
|
+
Return the embedding at level 0 of `\rho` of the classical lattice.
|
|
824
|
+
|
|
825
|
+
EXAMPLES::
|
|
826
|
+
|
|
827
|
+
sage: RootSystem(['C',4,1]).weight_lattice().rho_classical() # needs sage.graphs
|
|
828
|
+
-4*Lambda[0] + Lambda[1] + Lambda[2] + Lambda[3] + Lambda[4]
|
|
829
|
+
sage: L = RootSystem(['D',4,1]).weight_lattice()
|
|
830
|
+
sage: L.rho_classical().scalar(L.null_coroot()) # needs sage.graphs
|
|
831
|
+
0
|
|
832
|
+
|
|
833
|
+
.. WARNING::
|
|
834
|
+
|
|
835
|
+
In affine type BC dual, this does not live in the weight lattice::
|
|
836
|
+
|
|
837
|
+
sage: L = CartanType(["BC",2,2]).dual().root_system().weight_space()
|
|
838
|
+
sage: L.rho_classical() # needs sage.graphs
|
|
839
|
+
-3/2*Lambda[0] + Lambda[1] + Lambda[2]
|
|
840
|
+
sage: L = CartanType(["BC",2,2]).dual().root_system().weight_lattice()
|
|
841
|
+
sage: L.rho_classical() # needs sage.graphs
|
|
842
|
+
Traceback (most recent call last):
|
|
843
|
+
...
|
|
844
|
+
ValueError: 5 is not divisible by 2
|
|
845
|
+
"""
|
|
846
|
+
rho = self.rho()
|
|
847
|
+
Lambda = self.fundamental_weights()
|
|
848
|
+
return rho - Lambda[0] * rho.level() / Lambda[0].level()
|
|
849
|
+
|
|
850
|
+
def embed_at_level(self, x, level=1):
|
|
851
|
+
r"""
|
|
852
|
+
Embed the classical weight `x` in the level ``level`` hyperplane.
|
|
853
|
+
|
|
854
|
+
This is achieved by translating the straightforward
|
|
855
|
+
embedding of `x` by `c\Lambda_0` for `c` some appropriate
|
|
856
|
+
scalar.
|
|
857
|
+
|
|
858
|
+
INPUT:
|
|
859
|
+
|
|
860
|
+
- ``x`` -- an element of the corresponding classical weight/ambient lattice
|
|
861
|
+
- ``level`` -- integer or element of the base ring (default: 1)
|
|
862
|
+
|
|
863
|
+
EXAMPLES::
|
|
864
|
+
|
|
865
|
+
sage: # needs sage.graphs
|
|
866
|
+
sage: L = RootSystem(["B",3,1]).weight_space()
|
|
867
|
+
sage: L0 = L.classical()
|
|
868
|
+
sage: alpha = L0.simple_roots()
|
|
869
|
+
sage: omega = L0.fundamental_weights()
|
|
870
|
+
sage: L.embed_at_level(omega[1], 1)
|
|
871
|
+
Lambda[1]
|
|
872
|
+
sage: L.embed_at_level(omega[2], 1)
|
|
873
|
+
-Lambda[0] + Lambda[2]
|
|
874
|
+
sage: L.embed_at_level(omega[3], 1)
|
|
875
|
+
Lambda[3]
|
|
876
|
+
sage: L.embed_at_level(alpha[1], 1)
|
|
877
|
+
Lambda[0] + 2*Lambda[1] - Lambda[2]
|
|
878
|
+
"""
|
|
879
|
+
if not self.classical().is_parent_of(x):
|
|
880
|
+
raise ValueError("x must be an element of the classical type")
|
|
881
|
+
Lambda = self.fundamental_weights()
|
|
882
|
+
result = self.sum_of_terms(x)
|
|
883
|
+
result += Lambda[0] * (level-result.level()) / (Lambda[0].level())
|
|
884
|
+
assert result.level() == level
|
|
885
|
+
return result
|
|
886
|
+
|
|
887
|
+
# Should it be a method of highest_weight?
|
|
888
|
+
def weyl_dimension(self, highest_weight):
|
|
889
|
+
r"""
|
|
890
|
+
Return the dimension of the highest weight representation of highest weight ``highest_weight``.
|
|
891
|
+
|
|
892
|
+
EXAMPLES::
|
|
893
|
+
|
|
894
|
+
sage: RootSystem(['A',3]).ambient_lattice().weyl_dimension([2,1,0,0])
|
|
895
|
+
20
|
|
896
|
+
sage: P = RootSystem(['C',2]).weight_lattice()
|
|
897
|
+
sage: La = P.basis()
|
|
898
|
+
sage: P.weyl_dimension(La[1]+La[2]) # needs sage.graphs
|
|
899
|
+
16
|
|
900
|
+
|
|
901
|
+
sage: type(RootSystem(['A',3]).ambient_lattice().weyl_dimension([2,1,0,0]))
|
|
902
|
+
<class 'sage.rings.integer.Integer'>
|
|
903
|
+
"""
|
|
904
|
+
highest_weight = self(highest_weight)
|
|
905
|
+
if not highest_weight.is_dominant():
|
|
906
|
+
raise ValueError("the highest weight must be dominant")
|
|
907
|
+
rho = self.rho()
|
|
908
|
+
pr = self.coroot_lattice().positive_roots()
|
|
909
|
+
from sage.rings.integer import Integer
|
|
910
|
+
n = prod(((rho+highest_weight).scalar(x) for x in pr), Integer(1))
|
|
911
|
+
d = prod((rho.scalar(x) for x in pr), Integer(1))
|
|
912
|
+
return Integer(n/d)
|
|
913
|
+
|
|
914
|
+
@lazy_attribute
|
|
915
|
+
def _inverse_cartan_matrix(self):
|
|
916
|
+
r"""
|
|
917
|
+
Return the inverse Cartan matrix defining ``self``.
|
|
918
|
+
|
|
919
|
+
EXAMPLES::
|
|
920
|
+
|
|
921
|
+
sage: # needs sage.graphs
|
|
922
|
+
sage: RootSystem(['A', 3]).ambient_lattice()._inverse_cartan_matrix
|
|
923
|
+
[3/4 1/2 1/4]
|
|
924
|
+
[1/2 1 1/2]
|
|
925
|
+
[1/4 1/2 3/4]
|
|
926
|
+
sage: RootSystem(['G', 2]).weight_lattice()._inverse_cartan_matrix
|
|
927
|
+
[2 3]
|
|
928
|
+
[1 2]
|
|
929
|
+
"""
|
|
930
|
+
ret = self.cartan_type().cartan_matrix().inverse()
|
|
931
|
+
ret.set_immutable()
|
|
932
|
+
return ret
|
|
933
|
+
|
|
934
|
+
@lazy_attribute
|
|
935
|
+
def _symmetric_form_matrix(self):
|
|
936
|
+
r"""
|
|
937
|
+
Return the matrix for the symmetric form `( | )` in
|
|
938
|
+
the weight lattice basis.
|
|
939
|
+
|
|
940
|
+
Let `A` be a symmetrizable Cartan matrix with symmetrizer `D`,.
|
|
941
|
+
This returns the matrix `M^t DA M`, where `M` is dependent upon
|
|
942
|
+
the type given below.
|
|
943
|
+
|
|
944
|
+
In finite types, `M` is the inverse of the Cartan matrix.
|
|
945
|
+
|
|
946
|
+
In affine types, `M` takes the basis
|
|
947
|
+
`(\Lambda_0, \Lambda_1, \ldots, \Lambda_r, \delta)` to
|
|
948
|
+
`(\alpha_0, \ldots, \alpha_r, \Lambda_0)` where `r` is the
|
|
949
|
+
rank of ``self``.
|
|
950
|
+
|
|
951
|
+
This is used in computing the symmetric form for affine
|
|
952
|
+
root systems.
|
|
953
|
+
|
|
954
|
+
EXAMPLES::
|
|
955
|
+
|
|
956
|
+
sage: P = RootSystem(['B',2]).weight_lattice()
|
|
957
|
+
sage: P._symmetric_form_matrix # needs sage.graphs
|
|
958
|
+
[2 1]
|
|
959
|
+
[1 1]
|
|
960
|
+
|
|
961
|
+
sage: P = RootSystem(['C',2]).weight_lattice()
|
|
962
|
+
sage: P._symmetric_form_matrix # needs sage.graphs
|
|
963
|
+
[1 1]
|
|
964
|
+
[1 2]
|
|
965
|
+
|
|
966
|
+
sage: P = RootSystem(['C',2,1]).weight_lattice()
|
|
967
|
+
sage: P._symmetric_form_matrix # needs sage.graphs
|
|
968
|
+
[0 0 0 1]
|
|
969
|
+
[0 1 1 1]
|
|
970
|
+
[0 1 2 1]
|
|
971
|
+
[1 1 1 0]
|
|
972
|
+
|
|
973
|
+
sage: P = RootSystem(['A',4,2]).weight_lattice()
|
|
974
|
+
sage: P._symmetric_form_matrix # needs sage.graphs
|
|
975
|
+
[ 0 0 0 1/2]
|
|
976
|
+
[ 0 2 2 1]
|
|
977
|
+
[ 0 2 4 1]
|
|
978
|
+
[1/2 1 1 0]
|
|
979
|
+
"""
|
|
980
|
+
from sage.matrix.constructor import matrix
|
|
981
|
+
ct = self.cartan_type()
|
|
982
|
+
cm = ct.cartan_matrix()
|
|
983
|
+
if cm.det() != 0:
|
|
984
|
+
diag = matrix.diagonal(cm.symmetrizer())
|
|
985
|
+
return self._inverse_cartan_matrix.transpose() * diag
|
|
986
|
+
|
|
987
|
+
if not ct.is_affine():
|
|
988
|
+
raise ValueError("only implemented for affine types when the"
|
|
989
|
+
" Cartan matrix is singular")
|
|
990
|
+
|
|
991
|
+
r = ct.rank()
|
|
992
|
+
a = ct.a()
|
|
993
|
+
# Determine the change of basis matrix
|
|
994
|
+
# La[0], ..., La[r], delta -> al[0], ..., al[r], La[0]
|
|
995
|
+
M = cm.stack( matrix([1] + [0]*(r-1)) )
|
|
996
|
+
M = matrix.block([[ M, matrix([[1]] + [[0]]*r) ]])
|
|
997
|
+
M = M.inverse()
|
|
998
|
+
|
|
999
|
+
if a[0] != 1:
|
|
1000
|
+
from sage.rings.rational_field import QQ
|
|
1001
|
+
S = matrix([~a[0]]+[0]*(r-1))
|
|
1002
|
+
A = cm.symmetrized_matrix().change_ring(QQ).stack(S)
|
|
1003
|
+
else:
|
|
1004
|
+
A = cm.symmetrized_matrix().stack(matrix([1]+[0]*(r-1)))
|
|
1005
|
+
A = matrix.block([[A, matrix([[~a[0]]] + [[0]]*r)]])
|
|
1006
|
+
return M.transpose() * A * M
|
|
1007
|
+
|
|
1008
|
+
class ElementMethods:
|
|
1009
|
+
def symmetric_form(self, la):
|
|
1010
|
+
r"""
|
|
1011
|
+
Return the symmetric form of ``self`` with ``la``.
|
|
1012
|
+
|
|
1013
|
+
Return the pairing `( | )` on the weight lattice. See Chapter 6
|
|
1014
|
+
in Kac, Infinite Dimensional Lie Algebras for more details.
|
|
1015
|
+
|
|
1016
|
+
.. WARNING::
|
|
1017
|
+
|
|
1018
|
+
For affine root systems, if you are not working in the
|
|
1019
|
+
extended weight lattice/space, this may return incorrect
|
|
1020
|
+
results.
|
|
1021
|
+
|
|
1022
|
+
EXAMPLES::
|
|
1023
|
+
|
|
1024
|
+
sage: # needs sage.graphs
|
|
1025
|
+
sage: P = RootSystem(['C',2]).weight_lattice()
|
|
1026
|
+
sage: al = P.simple_roots()
|
|
1027
|
+
sage: al[1].symmetric_form(al[1])
|
|
1028
|
+
2
|
|
1029
|
+
sage: al[1].symmetric_form(al[2])
|
|
1030
|
+
-2
|
|
1031
|
+
sage: al[2].symmetric_form(al[1])
|
|
1032
|
+
-2
|
|
1033
|
+
sage: Q = RootSystem(['C',2]).root_lattice()
|
|
1034
|
+
sage: alQ = Q.simple_roots()
|
|
1035
|
+
sage: all(al[i].symmetric_form(al[j]) == alQ[i].symmetric_form(alQ[j])
|
|
1036
|
+
....: for i in P.index_set() for j in P.index_set())
|
|
1037
|
+
True
|
|
1038
|
+
|
|
1039
|
+
sage: # needs sage.graphs
|
|
1040
|
+
sage: P = RootSystem(['C',2,1]).weight_lattice(extended=True)
|
|
1041
|
+
sage: al = P.simple_roots()
|
|
1042
|
+
sage: al[1].symmetric_form(al[1])
|
|
1043
|
+
2
|
|
1044
|
+
sage: al[1].symmetric_form(al[2])
|
|
1045
|
+
-2
|
|
1046
|
+
sage: al[1].symmetric_form(al[0])
|
|
1047
|
+
-2
|
|
1048
|
+
sage: al[0].symmetric_form(al[1])
|
|
1049
|
+
-2
|
|
1050
|
+
sage: Q = RootSystem(['C',2,1]).root_lattice()
|
|
1051
|
+
sage: alQ = Q.simple_roots()
|
|
1052
|
+
sage: all(al[i].symmetric_form(al[j]) == alQ[i].symmetric_form(alQ[j])
|
|
1053
|
+
....: for i in P.index_set() for j in P.index_set())
|
|
1054
|
+
True
|
|
1055
|
+
sage: La = P.basis()
|
|
1056
|
+
sage: [La['delta'].symmetric_form(al) for al in P.simple_roots()]
|
|
1057
|
+
[0, 0, 0]
|
|
1058
|
+
sage: [La[0].symmetric_form(al) for al in P.simple_roots()]
|
|
1059
|
+
[1, 0, 0]
|
|
1060
|
+
|
|
1061
|
+
sage: P = RootSystem(['C',2,1]).weight_lattice()
|
|
1062
|
+
sage: Q = RootSystem(['C',2,1]).root_lattice()
|
|
1063
|
+
sage: al = P.simple_roots() # needs sage.graphs
|
|
1064
|
+
sage: alQ = Q.simple_roots() # needs sage.graphs
|
|
1065
|
+
sage: all(al[i].symmetric_form(al[j]) == alQ[i].symmetric_form(alQ[j]) # needs sage.graphs
|
|
1066
|
+
....: for i in P.index_set() for j in P.index_set())
|
|
1067
|
+
True
|
|
1068
|
+
|
|
1069
|
+
The result of `(\Lambda_0 | \alpha_0)` should be `1`, however we
|
|
1070
|
+
get `0` because we are not working in the extended weight
|
|
1071
|
+
lattice::
|
|
1072
|
+
|
|
1073
|
+
sage: La = P.basis()
|
|
1074
|
+
sage: [La[0].symmetric_form(al) for al in P.simple_roots()] # needs sage.graphs
|
|
1075
|
+
[0, 0, 0]
|
|
1076
|
+
|
|
1077
|
+
TESTS:
|
|
1078
|
+
|
|
1079
|
+
We check that `A_{2n}^{(2)}` has 3 different root lengths::
|
|
1080
|
+
|
|
1081
|
+
sage: P = RootSystem(['A',4,2]).weight_lattice()
|
|
1082
|
+
sage: al = P.simple_roots() # needs sage.graphs
|
|
1083
|
+
sage: [al[i].symmetric_form(al[i]) for i in P.index_set()] # needs sage.graphs
|
|
1084
|
+
[2, 4, 8]
|
|
1085
|
+
|
|
1086
|
+
Check that :issue:`31410` is fixed, and the symmetric form
|
|
1087
|
+
computed on the weight space is the same as the symmetric
|
|
1088
|
+
form computed on the root space::
|
|
1089
|
+
|
|
1090
|
+
sage: def s1(ct):
|
|
1091
|
+
....: L = RootSystem(ct).weight_space()
|
|
1092
|
+
....: P = L.positive_roots()
|
|
1093
|
+
....: rho = L.rho()
|
|
1094
|
+
....: return [beta.symmetric_form(rho) for beta in P]
|
|
1095
|
+
|
|
1096
|
+
sage: def s2(ct):
|
|
1097
|
+
....: R = RootSystem(ct).root_space()
|
|
1098
|
+
....: P = R.positive_roots()
|
|
1099
|
+
....: rho = 1/2*sum(P)
|
|
1100
|
+
....: return [beta.symmetric_form(rho) for beta in P]
|
|
1101
|
+
|
|
1102
|
+
sage: all(s1(ct) == s2(ct) # needs sage.graphs
|
|
1103
|
+
....: for ct in CartanType.samples(finite=True, crystallographic=True))
|
|
1104
|
+
True
|
|
1105
|
+
"""
|
|
1106
|
+
P = self.parent()
|
|
1107
|
+
ct = P.cartan_type()
|
|
1108
|
+
sym = P._symmetric_form_matrix
|
|
1109
|
+
|
|
1110
|
+
if ct.is_finite():
|
|
1111
|
+
iset = P.index_set()
|
|
1112
|
+
else:
|
|
1113
|
+
iset = P.index_set() + ('delta',)
|
|
1114
|
+
|
|
1115
|
+
return sum(cl*sym[iset.index(ml),iset.index(mr)]*cr
|
|
1116
|
+
for ml, cl in self for mr, cr in la)
|
|
1117
|
+
|
|
1118
|
+
# # This should be in a method to_weight_lattice()
|
|
1119
|
+
# alphac = self.simple_coroots()
|
|
1120
|
+
# Lambda = self.fundamental_weights()
|
|
1121
|
+
# assert t == self.plus(t.scalar(alphac[i]) * Lambda[i] for i in self.index_set())
|
|
1122
|
+
# t = self.plus( t.scalar(alphac[i]) * c[i] * Lambda[i] for i in self.index_set())
|
|
1123
|
+
|
|
1124
|
+
def to_weight_space(self, base_ring=None):
|
|
1125
|
+
r"""
|
|
1126
|
+
Map ``self`` to the weight space.
|
|
1127
|
+
|
|
1128
|
+
.. WARNING::
|
|
1129
|
+
|
|
1130
|
+
Implemented for finite Cartan type.
|
|
1131
|
+
|
|
1132
|
+
EXAMPLES::
|
|
1133
|
+
|
|
1134
|
+
sage: b = CartanType(['B',2]).root_system().ambient_space().from_vector(vector([1,-2])); b
|
|
1135
|
+
(1, -2)
|
|
1136
|
+
sage: b.to_weight_space()
|
|
1137
|
+
3*Lambda[1] - 4*Lambda[2]
|
|
1138
|
+
sage: b = CartanType(['B',2]).root_system().ambient_space().from_vector(vector([1/2,0])); b
|
|
1139
|
+
(1/2, 0)
|
|
1140
|
+
sage: b.to_weight_space()
|
|
1141
|
+
1/2*Lambda[1]
|
|
1142
|
+
sage: b.to_weight_space(ZZ)
|
|
1143
|
+
Traceback (most recent call last):
|
|
1144
|
+
...
|
|
1145
|
+
TypeError: no conversion of this rational to integer
|
|
1146
|
+
sage: b = CartanType(['G',2]).root_system().ambient_space().from_vector(vector([4,-5,1])); b
|
|
1147
|
+
(4, -5, 1)
|
|
1148
|
+
sage: b.to_weight_space()
|
|
1149
|
+
-6*Lambda[1] + 5*Lambda[2]
|
|
1150
|
+
"""
|
|
1151
|
+
L = self.parent()
|
|
1152
|
+
if base_ring is None:
|
|
1153
|
+
base_ring = L.base_ring()
|
|
1154
|
+
|
|
1155
|
+
wt_space = L.root_system.weight_space(base_ring)
|
|
1156
|
+
simple_coroots = L.simple_coroots()
|
|
1157
|
+
return wt_space.sum_of_terms(((i, base_ring(self.scalar(ac)))
|
|
1158
|
+
for i, ac in simple_coroots.items()),
|
|
1159
|
+
distinct=True)
|
|
1160
|
+
|
|
1161
|
+
@cached_method
|
|
1162
|
+
def _to_root_vector(self):
|
|
1163
|
+
r"""
|
|
1164
|
+
Helper method to express ``self`` as a linear combination
|
|
1165
|
+
of simple roots.
|
|
1166
|
+
|
|
1167
|
+
OUTPUT:
|
|
1168
|
+
|
|
1169
|
+
A list with entries in `\QQ` representing ``self`` as a linear
|
|
1170
|
+
combination of simple roots.
|
|
1171
|
+
|
|
1172
|
+
EXAMPLES::
|
|
1173
|
+
|
|
1174
|
+
sage: L = RootSystem(['A', 3]).ambient_space()
|
|
1175
|
+
sage: e = L.basis()
|
|
1176
|
+
sage: (e[0] + 3*e[3])._to_root_vector() # not in the root space
|
|
1177
|
+
sage: (e[0] - e[1])._to_root_vector()
|
|
1178
|
+
(1, 0, 0)
|
|
1179
|
+
sage: (e[0] + 2*e[1] - 3*e[2])._to_root_vector()
|
|
1180
|
+
(1, 3, 0)
|
|
1181
|
+
"""
|
|
1182
|
+
v = self.to_vector().change_ring(QQ)
|
|
1183
|
+
al = [a.to_vector() for a in self.parent().simple_roots()]
|
|
1184
|
+
b = v.parent().linear_dependence([v] + al)
|
|
1185
|
+
if len(b) != 1 or b[0] == 0:
|
|
1186
|
+
return None
|
|
1187
|
+
b = b[0] # Get the actual vector that gives the linear dependency
|
|
1188
|
+
return b[1:].change_ring(QQ) / -b[0]
|