passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1207 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Free module automorphisms
|
|
4
|
+
|
|
5
|
+
Given a free module `M` of finite rank over a commutative ring `R`, an
|
|
6
|
+
*automorphism* of `M` is a map
|
|
7
|
+
|
|
8
|
+
.. MATH::
|
|
9
|
+
|
|
10
|
+
\phi:\ M \longrightarrow M
|
|
11
|
+
|
|
12
|
+
that is linear (i.e. is a module homomorphism) and bijective.
|
|
13
|
+
|
|
14
|
+
Automorphisms of a free module of finite rank are implemented via the class
|
|
15
|
+
:class:`FreeModuleAutomorphism`.
|
|
16
|
+
|
|
17
|
+
AUTHORS:
|
|
18
|
+
|
|
19
|
+
- Eric Gourgoulhon (2015): initial version
|
|
20
|
+
- Michael Jung (2019): improve treatment of the identity element
|
|
21
|
+
|
|
22
|
+
REFERENCES:
|
|
23
|
+
|
|
24
|
+
- Chaps. 15, 24 of R. Godement: *Algebra* [God1968]_
|
|
25
|
+
"""
|
|
26
|
+
# *****************************************************************************
|
|
27
|
+
# Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
|
|
28
|
+
#
|
|
29
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
30
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
31
|
+
# the License, or (at your option) any later version.
|
|
32
|
+
# https://www.gnu.org/licenses/
|
|
33
|
+
# *****************************************************************************
|
|
34
|
+
|
|
35
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
36
|
+
from sage.structure.element import MultiplicativeGroupElement
|
|
37
|
+
from sage.tensor.modules.free_module_tensor import FreeModuleTensor
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class FreeModuleAutomorphism(FreeModuleTensor, MultiplicativeGroupElement):
|
|
41
|
+
r"""
|
|
42
|
+
Automorphism of a free module of finite rank over a commutative ring.
|
|
43
|
+
|
|
44
|
+
This is a Sage *element* class, the corresponding *parent* class being
|
|
45
|
+
:class:`~sage.tensor.modules.free_module_linear_group.FreeModuleLinearGroup`.
|
|
46
|
+
|
|
47
|
+
This class inherits from the classes
|
|
48
|
+
:class:`~sage.tensor.modules.free_module_tensor.FreeModuleTensor`
|
|
49
|
+
and
|
|
50
|
+
:class:`~sage.structure.element.MultiplicativeGroupElement`.
|
|
51
|
+
|
|
52
|
+
INPUT:
|
|
53
|
+
|
|
54
|
+
- ``fmodule`` -- free module `M` of finite rank over a commutative ring
|
|
55
|
+
`R`, as an instance of
|
|
56
|
+
:class:`~sage.tensor.modules.finite_rank_free_module.FiniteRankFreeModule`
|
|
57
|
+
- ``name`` -- (default: ``None``) name given to the automorphism
|
|
58
|
+
- ``latex_name`` -- (default: ``None``) LaTeX symbol to denote the
|
|
59
|
+
automorphism; if none is provided, the LaTeX symbol is set to ``name``
|
|
60
|
+
- ``is_identity`` -- boolean (default: ``False``); determines whether the
|
|
61
|
+
constructed object is the identity automorphism, i.e. the identity map
|
|
62
|
+
of `M` considered as an automorphism (the identity element of the
|
|
63
|
+
general linear group)
|
|
64
|
+
|
|
65
|
+
EXAMPLES:
|
|
66
|
+
|
|
67
|
+
Automorphism of a rank-2 free module over `\ZZ`::
|
|
68
|
+
|
|
69
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M', start_index=1)
|
|
70
|
+
sage: a = M.automorphism(name='a', latex_name=r'\alpha') ; a
|
|
71
|
+
Automorphism a of the Rank-2 free module M over the Integer Ring
|
|
72
|
+
sage: a.parent()
|
|
73
|
+
General linear group of the Rank-2 free module M over the Integer Ring
|
|
74
|
+
sage: a.parent() is M.general_linear_group()
|
|
75
|
+
True
|
|
76
|
+
sage: latex(a)
|
|
77
|
+
\alpha
|
|
78
|
+
|
|
79
|
+
Setting the components of ``a`` w.r.t. a basis of module ``M``::
|
|
80
|
+
|
|
81
|
+
sage: e = M.basis('e') ; e
|
|
82
|
+
Basis (e_1,e_2) on the Rank-2 free module M over the Integer Ring
|
|
83
|
+
sage: a[:] = [[1,2],[1,3]]
|
|
84
|
+
sage: a.matrix(e)
|
|
85
|
+
[1 2]
|
|
86
|
+
[1 3]
|
|
87
|
+
sage: a(e[1]).display()
|
|
88
|
+
a(e_1) = e_1 + e_2
|
|
89
|
+
sage: a(e[2]).display()
|
|
90
|
+
a(e_2) = 2 e_1 + 3 e_2
|
|
91
|
+
|
|
92
|
+
Actually, the components w.r.t. a given basis can be specified at the
|
|
93
|
+
construction of the object::
|
|
94
|
+
|
|
95
|
+
sage: a = M.automorphism(matrix=[[1,2],[1,3]], basis=e, name='a',
|
|
96
|
+
....: latex_name=r'\alpha') ; a
|
|
97
|
+
Automorphism a of the Rank-2 free module M over the Integer Ring
|
|
98
|
+
sage: a.matrix(e)
|
|
99
|
+
[1 2]
|
|
100
|
+
[1 3]
|
|
101
|
+
|
|
102
|
+
Since e is the module's default basis, it can be omitted in the argument
|
|
103
|
+
list::
|
|
104
|
+
|
|
105
|
+
sage: a == M.automorphism(matrix=[[1,2],[1,3]], name='a',
|
|
106
|
+
....: latex_name=r'\alpha')
|
|
107
|
+
True
|
|
108
|
+
|
|
109
|
+
The matrix of the automorphism can be obtained in any basis::
|
|
110
|
+
|
|
111
|
+
sage: f = M.basis('f', from_family=(3*e[1]+4*e[2], 5*e[1]+7*e[2])) ; f
|
|
112
|
+
Basis (f_1,f_2) on the Rank-2 free module M over the Integer Ring
|
|
113
|
+
sage: a.matrix(f)
|
|
114
|
+
[2 3]
|
|
115
|
+
[1 2]
|
|
116
|
+
|
|
117
|
+
Automorphisms are tensors of type `(1,1)`::
|
|
118
|
+
|
|
119
|
+
sage: a.tensor_type()
|
|
120
|
+
(1, 1)
|
|
121
|
+
sage: a.tensor_rank()
|
|
122
|
+
2
|
|
123
|
+
|
|
124
|
+
In particular, they can be displayed as such::
|
|
125
|
+
|
|
126
|
+
sage: a.display(e)
|
|
127
|
+
a = e_1⊗e^1 + 2 e_1⊗e^2 + e_2⊗e^1 + 3 e_2⊗e^2
|
|
128
|
+
sage: a.display(f)
|
|
129
|
+
a = 2 f_1⊗f^1 + 3 f_1⊗f^2 + f_2⊗f^1 + 2 f_2⊗f^2
|
|
130
|
+
|
|
131
|
+
The automorphism acting on a module element::
|
|
132
|
+
|
|
133
|
+
sage: v = M([-2,3], name='v') ; v
|
|
134
|
+
Element v of the Rank-2 free module M over the Integer Ring
|
|
135
|
+
sage: a(v)
|
|
136
|
+
Element a(v) of the Rank-2 free module M over the Integer Ring
|
|
137
|
+
sage: a(v).display()
|
|
138
|
+
a(v) = 4 e_1 + 7 e_2
|
|
139
|
+
|
|
140
|
+
A second automorphism of the module ``M``::
|
|
141
|
+
|
|
142
|
+
sage: b = M.automorphism([[0,1],[-1,0]], name='b') ; b
|
|
143
|
+
Automorphism b of the Rank-2 free module M over the Integer Ring
|
|
144
|
+
sage: b.matrix(e)
|
|
145
|
+
[ 0 1]
|
|
146
|
+
[-1 0]
|
|
147
|
+
sage: b(e[1]).display()
|
|
148
|
+
b(e_1) = -e_2
|
|
149
|
+
sage: b(e[2]).display()
|
|
150
|
+
b(e_2) = e_1
|
|
151
|
+
|
|
152
|
+
The composition of automorphisms is performed via the multiplication
|
|
153
|
+
operator::
|
|
154
|
+
|
|
155
|
+
sage: s = a*b ; s
|
|
156
|
+
Automorphism of the Rank-2 free module M over the Integer Ring
|
|
157
|
+
sage: s(v) == a(b(v))
|
|
158
|
+
True
|
|
159
|
+
sage: s.matrix(f)
|
|
160
|
+
[ 11 19]
|
|
161
|
+
[ -7 -12]
|
|
162
|
+
sage: s.matrix(f) == a.matrix(f) * b.matrix(f)
|
|
163
|
+
True
|
|
164
|
+
|
|
165
|
+
It is not commutative::
|
|
166
|
+
|
|
167
|
+
sage: a*b != b*a
|
|
168
|
+
True
|
|
169
|
+
|
|
170
|
+
In other words, the parent of ``a`` and ``b``, i.e. the group
|
|
171
|
+
`\mathrm{GL}(M)`, is not abelian::
|
|
172
|
+
|
|
173
|
+
sage: M.general_linear_group() in CommutativeAdditiveGroups()
|
|
174
|
+
False
|
|
175
|
+
|
|
176
|
+
The neutral element for the composition law is the module identity map::
|
|
177
|
+
|
|
178
|
+
sage: id = M.identity_map() ; id
|
|
179
|
+
Identity map of the Rank-2 free module M over the Integer Ring
|
|
180
|
+
sage: id.parent()
|
|
181
|
+
General linear group of the Rank-2 free module M over the Integer Ring
|
|
182
|
+
sage: id(v) == v
|
|
183
|
+
True
|
|
184
|
+
sage: id.matrix(f)
|
|
185
|
+
[1 0]
|
|
186
|
+
[0 1]
|
|
187
|
+
sage: id*a == a
|
|
188
|
+
True
|
|
189
|
+
sage: a*id == a
|
|
190
|
+
True
|
|
191
|
+
|
|
192
|
+
The inverse of an automorphism is obtained via the method :meth:`inverse`,
|
|
193
|
+
or the operator ~, or the exponent -1::
|
|
194
|
+
|
|
195
|
+
sage: a.inverse()
|
|
196
|
+
Automorphism a^(-1) of the Rank-2 free module M over the Integer Ring
|
|
197
|
+
sage: a.inverse() is ~a
|
|
198
|
+
True
|
|
199
|
+
sage: a.inverse() is a^(-1)
|
|
200
|
+
True
|
|
201
|
+
sage: (a^(-1)).matrix(e)
|
|
202
|
+
[ 3 -2]
|
|
203
|
+
[-1 1]
|
|
204
|
+
sage: a*a^(-1) == id
|
|
205
|
+
True
|
|
206
|
+
sage: a^(-1)*a == id
|
|
207
|
+
True
|
|
208
|
+
sage: a^(-1)*s == b
|
|
209
|
+
True
|
|
210
|
+
sage: (a^(-1))(a(v)) == v
|
|
211
|
+
True
|
|
212
|
+
|
|
213
|
+
The module's changes of basis are stored as automorphisms::
|
|
214
|
+
|
|
215
|
+
sage: M.change_of_basis(e,f)
|
|
216
|
+
Automorphism of the Rank-2 free module M over the Integer Ring
|
|
217
|
+
sage: M.change_of_basis(e,f).parent()
|
|
218
|
+
General linear group of the Rank-2 free module M over the Integer Ring
|
|
219
|
+
sage: M.change_of_basis(e,f).matrix(e)
|
|
220
|
+
[3 5]
|
|
221
|
+
[4 7]
|
|
222
|
+
sage: M.change_of_basis(f,e) == M.change_of_basis(e,f).inverse()
|
|
223
|
+
True
|
|
224
|
+
|
|
225
|
+
The opposite of an automorphism is still an automorphism::
|
|
226
|
+
|
|
227
|
+
sage: -a
|
|
228
|
+
Automorphism -a of the Rank-2 free module M over the Integer Ring
|
|
229
|
+
sage: (-a).parent()
|
|
230
|
+
General linear group of the Rank-2 free module M over the Integer Ring
|
|
231
|
+
sage: (-a).matrix(e) == - (a.matrix(e))
|
|
232
|
+
True
|
|
233
|
+
|
|
234
|
+
Adding two automorphisms results in a generic type-`(1,1)` tensor::
|
|
235
|
+
|
|
236
|
+
sage: s = a + b ; s
|
|
237
|
+
Type-(1,1) tensor a+b on the Rank-2 free module M over the Integer Ring
|
|
238
|
+
sage: s.parent()
|
|
239
|
+
Free module of type-(1,1) tensors on the Rank-2 free module M over the
|
|
240
|
+
Integer Ring
|
|
241
|
+
sage: a[:], b[:], s[:]
|
|
242
|
+
(
|
|
243
|
+
[1 2] [ 0 1] [1 3]
|
|
244
|
+
[1 3], [-1 0], [0 3]
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
To get the result as an endomorphism, one has to explicitly convert it via
|
|
248
|
+
the parent of endomorphisms, `\mathrm{End}(M)`::
|
|
249
|
+
|
|
250
|
+
sage: s = End(M)(a+b) ; s
|
|
251
|
+
Generic endomorphism of Rank-2 free module M over the Integer Ring
|
|
252
|
+
sage: s(v) == a(v) + b(v)
|
|
253
|
+
True
|
|
254
|
+
sage: s.matrix(e) == a.matrix(e) + b.matrix(e)
|
|
255
|
+
True
|
|
256
|
+
sage: s.matrix(f) == a.matrix(f) + b.matrix(f)
|
|
257
|
+
True
|
|
258
|
+
"""
|
|
259
|
+
def __init__(self, fmodule, name=None, latex_name=None):
|
|
260
|
+
r"""
|
|
261
|
+
TESTS::
|
|
262
|
+
|
|
263
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
264
|
+
sage: e = M.basis('e')
|
|
265
|
+
sage: from sage.tensor.modules.free_module_automorphism import FreeModuleAutomorphism
|
|
266
|
+
sage: a = FreeModuleAutomorphism(M, name='a')
|
|
267
|
+
sage: a[e,:] = [[-1,0,0],[0,1,2],[0,1,3]]
|
|
268
|
+
sage: TestSuite(a).run(skip='_test_category') # see below
|
|
269
|
+
|
|
270
|
+
In the above test suite, _test_category fails because a is not an
|
|
271
|
+
instance of a.parent().category().element_class. Actually automorphism
|
|
272
|
+
must be constructed via FreeModuleLinearGroup.element_class and
|
|
273
|
+
not by a direct call to FreeModuleAutomorphism::
|
|
274
|
+
|
|
275
|
+
sage: a = M.general_linear_group().element_class(M, name='a')
|
|
276
|
+
sage: a[e,:] = [[-1,0,0],[0,1,2],[0,1,3]]
|
|
277
|
+
sage: TestSuite(a).run()
|
|
278
|
+
|
|
279
|
+
Test suite on the identity map::
|
|
280
|
+
|
|
281
|
+
sage: id = M.general_linear_group().one()
|
|
282
|
+
sage: TestSuite(id).run()
|
|
283
|
+
|
|
284
|
+
Test suite on the automorphism obtained as GL.an_element()::
|
|
285
|
+
|
|
286
|
+
sage: b = M.general_linear_group().an_element()
|
|
287
|
+
sage: TestSuite(b).run()
|
|
288
|
+
"""
|
|
289
|
+
FreeModuleTensor.__init__(self, fmodule, (1,1), name=name,
|
|
290
|
+
latex_name=latex_name,
|
|
291
|
+
parent=fmodule.general_linear_group())
|
|
292
|
+
# MultiplicativeGroupElement attributes:
|
|
293
|
+
# - none
|
|
294
|
+
# Local attributes:
|
|
295
|
+
self._is_identity = False # a priori
|
|
296
|
+
self._inverse = None # inverse automorphism not set yet
|
|
297
|
+
self._matrices = {}
|
|
298
|
+
|
|
299
|
+
#### SageObject methods ####
|
|
300
|
+
|
|
301
|
+
def _repr_(self):
|
|
302
|
+
r"""
|
|
303
|
+
Return a string representation of ``self``.
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
308
|
+
sage: M.automorphism()
|
|
309
|
+
Automorphism of the 3-dimensional vector space M over the Rational Field
|
|
310
|
+
sage: M.automorphism(name='a')
|
|
311
|
+
Automorphism a of the 3-dimensional vector space M over the Rational Field
|
|
312
|
+
sage: M.identity_map()
|
|
313
|
+
Identity map of the 3-dimensional vector space M over the Rational Field
|
|
314
|
+
"""
|
|
315
|
+
if self._is_identity:
|
|
316
|
+
description = "Identity map "
|
|
317
|
+
else:
|
|
318
|
+
description = "Automorphism "
|
|
319
|
+
if self._name is not None:
|
|
320
|
+
description += self._name + " "
|
|
321
|
+
description += "of the {}".format(self._fmodule)
|
|
322
|
+
return description
|
|
323
|
+
|
|
324
|
+
#### End of SageObject methods ####
|
|
325
|
+
|
|
326
|
+
#### FreeModuleTensor methods ####
|
|
327
|
+
|
|
328
|
+
def _new_instance(self):
|
|
329
|
+
r"""
|
|
330
|
+
Create an instance of the same class as ``self``.
|
|
331
|
+
|
|
332
|
+
EXAMPLES::
|
|
333
|
+
|
|
334
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
335
|
+
sage: a = M.automorphism(name='a')
|
|
336
|
+
sage: a._new_instance()
|
|
337
|
+
Automorphism of the Rank-3 free module M over the Integer Ring
|
|
338
|
+
sage: Id = M.identity_map()
|
|
339
|
+
sage: Id._new_instance()
|
|
340
|
+
Automorphism of the Rank-3 free module M over the Integer Ring
|
|
341
|
+
"""
|
|
342
|
+
return self.__class__(self._fmodule)
|
|
343
|
+
|
|
344
|
+
def _del_derived(self):
|
|
345
|
+
r"""
|
|
346
|
+
Delete the derived quantities.
|
|
347
|
+
|
|
348
|
+
EXAMPLES::
|
|
349
|
+
|
|
350
|
+
sage: M = FiniteRankFreeModule(QQ, 3, name='M')
|
|
351
|
+
sage: e = M.basis('e')
|
|
352
|
+
sage: a = M.automorphism(name='a')
|
|
353
|
+
sage: a[e,:] = [[1,0,-1], [0,3,0], [0,0,2]]
|
|
354
|
+
sage: b = a.inverse()
|
|
355
|
+
sage: a._inverse
|
|
356
|
+
Automorphism a^(-1) of the 3-dimensional vector space M over the
|
|
357
|
+
Rational Field
|
|
358
|
+
sage: a._del_derived()
|
|
359
|
+
sage: a._inverse # has been reset to None
|
|
360
|
+
"""
|
|
361
|
+
# First delete the derived quantities pertaining to FreeModuleTensor:
|
|
362
|
+
FreeModuleTensor._del_derived(self)
|
|
363
|
+
# Then reset the inverse automorphism to None:
|
|
364
|
+
if self._inverse is not None:
|
|
365
|
+
self._inverse._inverse = None # (it was set to self)
|
|
366
|
+
self._inverse = None
|
|
367
|
+
# and delete the matrices:
|
|
368
|
+
self._matrices.clear()
|
|
369
|
+
|
|
370
|
+
def set_comp(self, basis=None):
|
|
371
|
+
r"""
|
|
372
|
+
Return the components of ``self`` w.r.t. a given module basis for
|
|
373
|
+
assignment.
|
|
374
|
+
|
|
375
|
+
The components with respect to other bases are deleted, in order to
|
|
376
|
+
avoid any inconsistency. To keep them, use the method :meth:`add_comp`
|
|
377
|
+
instead.
|
|
378
|
+
|
|
379
|
+
INPUT:
|
|
380
|
+
|
|
381
|
+
- ``basis`` -- (default: ``None``) basis in which the components are
|
|
382
|
+
defined; if none is provided, the components are assumed to refer to
|
|
383
|
+
the module's default basis
|
|
384
|
+
|
|
385
|
+
OUTPUT:
|
|
386
|
+
|
|
387
|
+
- components in the given basis, as an instance of the
|
|
388
|
+
class :class:`~sage.tensor.modules.comp.Components`; if such
|
|
389
|
+
components did not exist previously, they are created.
|
|
390
|
+
|
|
391
|
+
EXAMPLES:
|
|
392
|
+
|
|
393
|
+
Setting the components of an automorphism of a rank-3 free
|
|
394
|
+
`\ZZ`-module::
|
|
395
|
+
|
|
396
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
397
|
+
sage: e = M.basis('e')
|
|
398
|
+
sage: a = M.automorphism(name='a')
|
|
399
|
+
sage: a.set_comp(e)
|
|
400
|
+
2-indices components w.r.t. Basis (e_0,e_1,e_2) on the Rank-3 free
|
|
401
|
+
module M over the Integer Ring
|
|
402
|
+
sage: a.set_comp(e)[:] = [[1,0,0],[0,1,2],[0,1,3]]
|
|
403
|
+
sage: a.matrix(e)
|
|
404
|
+
[1 0 0]
|
|
405
|
+
[0 1 2]
|
|
406
|
+
[0 1 3]
|
|
407
|
+
|
|
408
|
+
Since ``e`` is the module's default basis, one has::
|
|
409
|
+
|
|
410
|
+
sage: a.set_comp() is a.set_comp(e)
|
|
411
|
+
True
|
|
412
|
+
|
|
413
|
+
The method :meth:`set_comp` can be used to modify a single component::
|
|
414
|
+
|
|
415
|
+
sage: a.set_comp(e)[0,0] = -1
|
|
416
|
+
sage: a.matrix(e)
|
|
417
|
+
[-1 0 0]
|
|
418
|
+
[ 0 1 2]
|
|
419
|
+
[ 0 1 3]
|
|
420
|
+
|
|
421
|
+
A short cut to :meth:`set_comp` is the bracket operator, with the basis
|
|
422
|
+
as first argument::
|
|
423
|
+
|
|
424
|
+
sage: a[e,:] = [[1,0,0],[0,-1,2],[0,1,-3]]
|
|
425
|
+
sage: a.matrix(e)
|
|
426
|
+
[ 1 0 0]
|
|
427
|
+
[ 0 -1 2]
|
|
428
|
+
[ 0 1 -3]
|
|
429
|
+
sage: a[e,0,0] = -1
|
|
430
|
+
sage: a.matrix(e)
|
|
431
|
+
[-1 0 0]
|
|
432
|
+
[ 0 -1 2]
|
|
433
|
+
[ 0 1 -3]
|
|
434
|
+
|
|
435
|
+
The call to :meth:`set_comp` erases the components previously defined
|
|
436
|
+
in other bases; to keep them, use the method :meth:`add_comp` instead::
|
|
437
|
+
|
|
438
|
+
sage: f = M.basis('f', from_family=(-e[0], 3*e[1]+4*e[2],
|
|
439
|
+
....: 5*e[1]+7*e[2])) ; f
|
|
440
|
+
Basis (f_0,f_1,f_2) on the Rank-3 free module M over the Integer
|
|
441
|
+
Ring
|
|
442
|
+
sage: a._components
|
|
443
|
+
{Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer
|
|
444
|
+
Ring: 2-indices components w.r.t. Basis (e_0,e_1,e_2) on the
|
|
445
|
+
Rank-3 free module M over the Integer Ring}
|
|
446
|
+
sage: a.set_comp(f)[:] = [[-1,0,0], [0,1,0], [0,0,-1]]
|
|
447
|
+
|
|
448
|
+
The components w.r.t. basis ``e`` have been erased::
|
|
449
|
+
|
|
450
|
+
sage: a._components
|
|
451
|
+
{Basis (f_0,f_1,f_2) on the Rank-3 free module M over the Integer
|
|
452
|
+
Ring: 2-indices components w.r.t. Basis (f_0,f_1,f_2) on the
|
|
453
|
+
Rank-3 free module M over the Integer Ring}
|
|
454
|
+
|
|
455
|
+
Of course, they can be computed from those in basis ``f`` by means of
|
|
456
|
+
a change-of-basis formula, via the method :meth:`comp` or
|
|
457
|
+
:meth:`matrix`::
|
|
458
|
+
|
|
459
|
+
sage: a.matrix(e)
|
|
460
|
+
[ -1 0 0]
|
|
461
|
+
[ 0 41 -30]
|
|
462
|
+
[ 0 56 -41]
|
|
463
|
+
|
|
464
|
+
For the identity map, it is not permitted to set components::
|
|
465
|
+
|
|
466
|
+
sage: id = M.identity_map()
|
|
467
|
+
sage: id.set_comp(e)
|
|
468
|
+
Traceback (most recent call last):
|
|
469
|
+
...
|
|
470
|
+
ValueError: the components of the identity map cannot be changed
|
|
471
|
+
|
|
472
|
+
Indeed, the components are set automatically::
|
|
473
|
+
|
|
474
|
+
sage: id.comp(e)
|
|
475
|
+
Kronecker delta of size 3x3
|
|
476
|
+
sage: id.comp(f)
|
|
477
|
+
Kronecker delta of size 3x3
|
|
478
|
+
"""
|
|
479
|
+
if self._is_identity:
|
|
480
|
+
raise ValueError("the components of the identity map cannot be "
|
|
481
|
+
"changed")
|
|
482
|
+
return FreeModuleTensor._set_comp_unsafe(self, basis=basis)
|
|
483
|
+
|
|
484
|
+
def add_comp(self, basis=None):
|
|
485
|
+
r"""
|
|
486
|
+
Return the components of ``self`` w.r.t. a given module basis for
|
|
487
|
+
assignment, keeping the components w.r.t. other bases.
|
|
488
|
+
|
|
489
|
+
To delete the components w.r.t. other bases, use the method
|
|
490
|
+
:meth:`set_comp` instead.
|
|
491
|
+
|
|
492
|
+
INPUT:
|
|
493
|
+
|
|
494
|
+
- ``basis`` -- (default: ``None``) basis in which the components are
|
|
495
|
+
defined; if none is provided, the components are assumed to refer to
|
|
496
|
+
the module's default basis
|
|
497
|
+
|
|
498
|
+
.. WARNING::
|
|
499
|
+
|
|
500
|
+
If the automorphism has already components in other bases, it
|
|
501
|
+
is the user's responsibility to make sure that the components
|
|
502
|
+
to be added are consistent with them.
|
|
503
|
+
|
|
504
|
+
OUTPUT:
|
|
505
|
+
|
|
506
|
+
- components in the given basis, as an instance of the
|
|
507
|
+
class :class:`~sage.tensor.modules.comp.Components`;
|
|
508
|
+
if such components did not exist previously, they are created
|
|
509
|
+
|
|
510
|
+
EXAMPLES:
|
|
511
|
+
|
|
512
|
+
Adding components to an automorphism of a rank-3 free
|
|
513
|
+
`\ZZ`-module::
|
|
514
|
+
|
|
515
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
516
|
+
sage: e = M.basis('e')
|
|
517
|
+
sage: a = M.automorphism(name='a')
|
|
518
|
+
sage: a[e,:] = [[1,0,0],[0,-1,2],[0,1,-3]]
|
|
519
|
+
sage: f = M.basis('f', from_family=(-e[0], 3*e[1]+4*e[2],
|
|
520
|
+
....: 5*e[1]+7*e[2])) ; f
|
|
521
|
+
Basis (f_0,f_1,f_2) on the Rank-3 free module M over the Integer
|
|
522
|
+
Ring
|
|
523
|
+
sage: a.add_comp(f)[:] = [[1,0,0], [0, 80, 143], [0, -47, -84]]
|
|
524
|
+
|
|
525
|
+
The components in basis ``e`` have been kept::
|
|
526
|
+
|
|
527
|
+
sage: a._components # random (dictionary output)
|
|
528
|
+
{Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer
|
|
529
|
+
Ring: 2-indices components w.r.t. Basis (e_0,e_1,e_2) on the
|
|
530
|
+
Rank-3 free module M over the Integer Ring,
|
|
531
|
+
Basis (f_0,f_1,f_2) on the Rank-3 free module M over the Integer
|
|
532
|
+
Ring: 2-indices components w.r.t. Basis (f_0,f_1,f_2) on the
|
|
533
|
+
Rank-3 free module M over the Integer Ring}
|
|
534
|
+
|
|
535
|
+
For the identity map, it is not permitted to invoke :meth:`add_comp`::
|
|
536
|
+
|
|
537
|
+
sage: id = M.identity_map()
|
|
538
|
+
sage: id.add_comp(e)
|
|
539
|
+
Traceback (most recent call last):
|
|
540
|
+
...
|
|
541
|
+
ValueError: the components of the identity map cannot be changed
|
|
542
|
+
|
|
543
|
+
Indeed, the components are set automatically::
|
|
544
|
+
|
|
545
|
+
sage: id.comp(e)
|
|
546
|
+
Kronecker delta of size 3x3
|
|
547
|
+
sage: id.comp(f)
|
|
548
|
+
Kronecker delta of size 3x3
|
|
549
|
+
"""
|
|
550
|
+
if self._is_identity:
|
|
551
|
+
raise ValueError("the components of the identity map cannot be "
|
|
552
|
+
"changed")
|
|
553
|
+
return FreeModuleTensor._add_comp_unsafe(self, basis=basis)
|
|
554
|
+
|
|
555
|
+
def __call__(self, *arg):
|
|
556
|
+
r"""
|
|
557
|
+
Redefinition of :meth:`FreeModuleTensor.__call__` to allow for a single
|
|
558
|
+
argument (module element).
|
|
559
|
+
|
|
560
|
+
EXAMPLES:
|
|
561
|
+
|
|
562
|
+
Call with a single argument: return a module element::
|
|
563
|
+
|
|
564
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M', start_index=1)
|
|
565
|
+
sage: e = M.basis('e')
|
|
566
|
+
sage: a = M.automorphism([[-1,0,0],[0,1,2],[0,1,3]], name='a')
|
|
567
|
+
sage: v = M([2,1,4], name='v')
|
|
568
|
+
sage: s = a.__call__(v) ; s
|
|
569
|
+
Element a(v) of the Rank-3 free module M over the Integer Ring
|
|
570
|
+
sage: s.display()
|
|
571
|
+
a(v) = -2 e_1 + 9 e_2 + 13 e_3
|
|
572
|
+
sage: s == a(v)
|
|
573
|
+
True
|
|
574
|
+
sage: s == a.contract(v)
|
|
575
|
+
True
|
|
576
|
+
|
|
577
|
+
Call with two arguments (:class:`FreeModuleTensor` behaviour): return a
|
|
578
|
+
scalar::
|
|
579
|
+
|
|
580
|
+
sage: b = M.linear_form(name='b')
|
|
581
|
+
sage: b[:] = 7, 0, 2
|
|
582
|
+
sage: a.__call__(b,v)
|
|
583
|
+
12
|
|
584
|
+
sage: a(b,v) == a.__call__(b,v)
|
|
585
|
+
True
|
|
586
|
+
sage: a(b,v) == s(b)
|
|
587
|
+
True
|
|
588
|
+
|
|
589
|
+
Identity map with a single argument: return a module element::
|
|
590
|
+
|
|
591
|
+
sage: id = M.identity_map()
|
|
592
|
+
sage: s = id.__call__(v) ; s
|
|
593
|
+
Element v of the Rank-3 free module M over the Integer Ring
|
|
594
|
+
sage: s == v
|
|
595
|
+
True
|
|
596
|
+
sage: s == id(v)
|
|
597
|
+
True
|
|
598
|
+
sage: s == id.contract(v)
|
|
599
|
+
True
|
|
600
|
+
|
|
601
|
+
Identity map with two arguments (:class:`FreeModuleTensor` behaviour):
|
|
602
|
+
return a scalar::
|
|
603
|
+
|
|
604
|
+
sage: id.__call__(b,v)
|
|
605
|
+
22
|
|
606
|
+
sage: id(b,v) == id.__call__(b,v)
|
|
607
|
+
True
|
|
608
|
+
sage: id(b,v) == b(v)
|
|
609
|
+
True
|
|
610
|
+
"""
|
|
611
|
+
from .free_module_element import FiniteRankFreeModuleElement
|
|
612
|
+
if len(arg) > 1:
|
|
613
|
+
# The automorphism acting as a type-(1,1) tensor on a pair
|
|
614
|
+
# (linear form, module element), returning a scalar:
|
|
615
|
+
if self._is_identity:
|
|
616
|
+
if len(arg) != 2:
|
|
617
|
+
raise TypeError("wrong number of arguments")
|
|
618
|
+
linform = arg[0]
|
|
619
|
+
if linform._tensor_type != (0,1):
|
|
620
|
+
raise TypeError("the first argument must be a linear form")
|
|
621
|
+
vector = arg[1]
|
|
622
|
+
if not isinstance(vector, FiniteRankFreeModuleElement):
|
|
623
|
+
raise TypeError("the second argument must be a module" +
|
|
624
|
+
" element")
|
|
625
|
+
return linform(vector)
|
|
626
|
+
else: # self is not the identity automorphism:
|
|
627
|
+
return FreeModuleTensor.__call__(self, *arg)
|
|
628
|
+
# The automorphism acting as such, on a module element, returning a
|
|
629
|
+
# module element:
|
|
630
|
+
vector = arg[0]
|
|
631
|
+
if not isinstance(vector, FiniteRankFreeModuleElement):
|
|
632
|
+
raise TypeError("the argument must be an element of a free module")
|
|
633
|
+
if self._is_identity:
|
|
634
|
+
return vector
|
|
635
|
+
basis = self.common_basis(vector)
|
|
636
|
+
t = self._components[basis]
|
|
637
|
+
v = vector._components[basis]
|
|
638
|
+
fmodule = self._fmodule
|
|
639
|
+
result = vector._new_instance()
|
|
640
|
+
for i in fmodule.irange():
|
|
641
|
+
res = 0
|
|
642
|
+
for j in fmodule.irange():
|
|
643
|
+
res += t[[i,j]]*v[[j]]
|
|
644
|
+
result.set_comp(basis)[i] = res
|
|
645
|
+
# Name of the output:
|
|
646
|
+
result._name = None
|
|
647
|
+
if self._name is not None and vector._name is not None:
|
|
648
|
+
result._name = self._name + "(" + vector._name + ")"
|
|
649
|
+
# LaTeX symbol for the output:
|
|
650
|
+
result._latex_name = None
|
|
651
|
+
if self._latex_name is not None and vector._latex_name is not None:
|
|
652
|
+
result._latex_name = self._latex_name + r"\left(" + \
|
|
653
|
+
vector._latex_name + r"\right)"
|
|
654
|
+
return result
|
|
655
|
+
|
|
656
|
+
#### End of FreeModuleTensor methods ####
|
|
657
|
+
|
|
658
|
+
#### MultiplicativeGroupElement methods ####
|
|
659
|
+
|
|
660
|
+
def __invert__(self):
|
|
661
|
+
r"""
|
|
662
|
+
Return the inverse automorphism.
|
|
663
|
+
|
|
664
|
+
OUTPUT:
|
|
665
|
+
|
|
666
|
+
- instance of :class:`FreeModuleAutomorphism` representing the
|
|
667
|
+
automorphism that is the inverse of ``self``.
|
|
668
|
+
|
|
669
|
+
EXAMPLES:
|
|
670
|
+
|
|
671
|
+
Inverse of an automorphism of a rank-3 free module::
|
|
672
|
+
|
|
673
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
674
|
+
sage: e = M.basis('e')
|
|
675
|
+
sage: a = M.automorphism(name='a')
|
|
676
|
+
sage: a[e,:] = [[1,0,0],[0,-1,2],[0,1,-3]]
|
|
677
|
+
sage: a.inverse()
|
|
678
|
+
Automorphism a^(-1) of the Rank-3 free module M over the Integer
|
|
679
|
+
Ring
|
|
680
|
+
sage: a.inverse().parent()
|
|
681
|
+
General linear group of the Rank-3 free module M over the Integer
|
|
682
|
+
Ring
|
|
683
|
+
|
|
684
|
+
Check that ``a.inverse()`` is indeed the inverse automorphism::
|
|
685
|
+
|
|
686
|
+
sage: a.inverse() * a
|
|
687
|
+
Identity map of the Rank-3 free module M over the Integer Ring
|
|
688
|
+
sage: a * a.inverse()
|
|
689
|
+
Identity map of the Rank-3 free module M over the Integer Ring
|
|
690
|
+
sage: a.inverse().inverse() == a
|
|
691
|
+
True
|
|
692
|
+
|
|
693
|
+
Another check is::
|
|
694
|
+
|
|
695
|
+
sage: a.inverse().matrix(e)
|
|
696
|
+
[ 1 0 0]
|
|
697
|
+
[ 0 -3 -2]
|
|
698
|
+
[ 0 -1 -1]
|
|
699
|
+
sage: a.inverse().matrix(e) == (a.matrix(e))^(-1)
|
|
700
|
+
True
|
|
701
|
+
|
|
702
|
+
The inverse is cached (as long as ``a`` is not modified)::
|
|
703
|
+
|
|
704
|
+
sage: a.inverse() is a.inverse()
|
|
705
|
+
True
|
|
706
|
+
|
|
707
|
+
If ``a`` is modified, the inverse is automatically recomputed::
|
|
708
|
+
|
|
709
|
+
sage: a[0,0] = -1
|
|
710
|
+
sage: a.matrix(e)
|
|
711
|
+
[-1 0 0]
|
|
712
|
+
[ 0 -1 2]
|
|
713
|
+
[ 0 1 -3]
|
|
714
|
+
sage: a.inverse().matrix(e) # compare with above
|
|
715
|
+
[-1 0 0]
|
|
716
|
+
[ 0 -3 -2]
|
|
717
|
+
[ 0 -1 -1]
|
|
718
|
+
|
|
719
|
+
Shortcuts for :meth:`inverse` are the operator ``~`` and the exponent
|
|
720
|
+
``-1``::
|
|
721
|
+
|
|
722
|
+
sage: ~a is a.inverse()
|
|
723
|
+
True
|
|
724
|
+
sage: (a)^(-1) is a.inverse()
|
|
725
|
+
True
|
|
726
|
+
|
|
727
|
+
The inverse of the identity map is of course itself::
|
|
728
|
+
|
|
729
|
+
sage: id = M.identity_map()
|
|
730
|
+
sage: id.inverse() is id
|
|
731
|
+
True
|
|
732
|
+
|
|
733
|
+
and we have::
|
|
734
|
+
|
|
735
|
+
sage: a*(a)^(-1) == id
|
|
736
|
+
True
|
|
737
|
+
sage: (a)^(-1)*a == id
|
|
738
|
+
True
|
|
739
|
+
|
|
740
|
+
If the name could cause some confusion, a bracket is added around the
|
|
741
|
+
element before taking the inverse::
|
|
742
|
+
|
|
743
|
+
sage: c = M.automorphism(name='a^(-1)*b')
|
|
744
|
+
sage: c[e,:] = [[1,0,0],[0,-1,1],[0,2,-1]]
|
|
745
|
+
sage: c.inverse()
|
|
746
|
+
Automorphism (a^(-1)*b)^(-1) of the Rank-3 free module M over the
|
|
747
|
+
Integer Ring
|
|
748
|
+
"""
|
|
749
|
+
from .comp import Components
|
|
750
|
+
if self._is_identity:
|
|
751
|
+
return self
|
|
752
|
+
if self._inverse is None:
|
|
753
|
+
from sage.tensor.modules.format_utilities import is_atomic
|
|
754
|
+
if self._name is None:
|
|
755
|
+
inv_name = None
|
|
756
|
+
else:
|
|
757
|
+
if is_atomic(self._name, ['*']):
|
|
758
|
+
inv_name = self._name + '^(-1)'
|
|
759
|
+
else:
|
|
760
|
+
inv_name = '(' + self._name + ')^(-1)'
|
|
761
|
+
if self._latex_name is None:
|
|
762
|
+
inv_latex_name = None
|
|
763
|
+
else:
|
|
764
|
+
if is_atomic(self._latex_name, ['\\circ', '\\otimes']):
|
|
765
|
+
inv_latex_name = self._latex_name + r'^{-1}'
|
|
766
|
+
else:
|
|
767
|
+
inv_latex_name = r'\left(' + self._latex_name + \
|
|
768
|
+
r'\right)^{-1}'
|
|
769
|
+
fmodule = self._fmodule
|
|
770
|
+
si = fmodule._sindex
|
|
771
|
+
nsi = fmodule._rank + si
|
|
772
|
+
self._inverse = self.__class__(fmodule, inv_name, inv_latex_name)
|
|
773
|
+
for basis in self._components:
|
|
774
|
+
try:
|
|
775
|
+
mat = self.matrix(basis)
|
|
776
|
+
except (KeyError, ValueError):
|
|
777
|
+
continue
|
|
778
|
+
mat_inv = mat.inverse()
|
|
779
|
+
cinv = Components(fmodule._ring, basis, 2, start_index=si,
|
|
780
|
+
output_formatter=fmodule._output_formatter)
|
|
781
|
+
for i in range(si, nsi):
|
|
782
|
+
for j in range(si, nsi):
|
|
783
|
+
cinv[i, j] = mat_inv[i-si,j-si]
|
|
784
|
+
self._inverse._components[basis] = cinv
|
|
785
|
+
self._inverse._inverse = self
|
|
786
|
+
return self._inverse
|
|
787
|
+
|
|
788
|
+
inverse = __invert__
|
|
789
|
+
|
|
790
|
+
def _mul_(self, other):
|
|
791
|
+
r"""
|
|
792
|
+
Automorphism composition.
|
|
793
|
+
|
|
794
|
+
This implements the group law of GL(M), M being the module of ``self``.
|
|
795
|
+
|
|
796
|
+
INPUT:
|
|
797
|
+
|
|
798
|
+
- ``other`` -- an automorphism of the same module as ``self``
|
|
799
|
+
|
|
800
|
+
OUTPUT:
|
|
801
|
+
|
|
802
|
+
- the automorphism resulting from the composition of ``other`` and
|
|
803
|
+
``self``.
|
|
804
|
+
|
|
805
|
+
EXAMPLES::
|
|
806
|
+
|
|
807
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
|
|
808
|
+
sage: e = M.basis('e')
|
|
809
|
+
sage: a = M.automorphism([[1,2],[1,3]])
|
|
810
|
+
sage: b = M.automorphism([[3,4],[5,7]])
|
|
811
|
+
sage: c = a._mul_(b) ; c
|
|
812
|
+
Automorphism of the Rank-2 free module M over the Integer Ring
|
|
813
|
+
sage: c.matrix()
|
|
814
|
+
[13 18]
|
|
815
|
+
[18 25]
|
|
816
|
+
|
|
817
|
+
TESTS::
|
|
818
|
+
|
|
819
|
+
sage: c.parent() is a.parent()
|
|
820
|
+
True
|
|
821
|
+
sage: c.matrix() == a.matrix() * b.matrix()
|
|
822
|
+
True
|
|
823
|
+
sage: c(e[0]) == a(b(e[0]))
|
|
824
|
+
True
|
|
825
|
+
sage: c(e[1]) == a(b(e[1]))
|
|
826
|
+
True
|
|
827
|
+
sage: a.inverse()._mul_(c) == b
|
|
828
|
+
True
|
|
829
|
+
sage: c._mul_(b.inverse()) == a
|
|
830
|
+
True
|
|
831
|
+
sage: id = M.identity_map()
|
|
832
|
+
sage: id._mul_(a) == a
|
|
833
|
+
True
|
|
834
|
+
sage: a._mul_(id) == a
|
|
835
|
+
True
|
|
836
|
+
sage: a._mul_(a.inverse()) == id
|
|
837
|
+
True
|
|
838
|
+
sage: a.inverse()._mul_(a) == id
|
|
839
|
+
True
|
|
840
|
+
"""
|
|
841
|
+
# No need for consistency check since self and other are guaranteed
|
|
842
|
+
# to have the same parent. In particular, they are defined on the same
|
|
843
|
+
# free module.
|
|
844
|
+
#
|
|
845
|
+
# Special cases:
|
|
846
|
+
if self._is_identity:
|
|
847
|
+
return other
|
|
848
|
+
if other._is_identity:
|
|
849
|
+
return self
|
|
850
|
+
if other is self._inverse or self is other._inverse:
|
|
851
|
+
return self._fmodule.identity_map()
|
|
852
|
+
# General case:
|
|
853
|
+
fmodule = self._fmodule
|
|
854
|
+
resu = self.__class__(fmodule)
|
|
855
|
+
basis = self.common_basis(other)
|
|
856
|
+
if basis is None:
|
|
857
|
+
raise ValueError("no common basis for the composition")
|
|
858
|
+
# The composition is performed as a tensor contraction of the last
|
|
859
|
+
# index of self (position=1) and the first index of other (position=0):
|
|
860
|
+
resu._components[basis] = self._components[basis].contract(1,
|
|
861
|
+
other._components[basis],0)
|
|
862
|
+
return resu
|
|
863
|
+
|
|
864
|
+
#### End of MultiplicativeGroupElement methods ####
|
|
865
|
+
|
|
866
|
+
def __mul__(self, other):
|
|
867
|
+
r"""
|
|
868
|
+
Redefinition of
|
|
869
|
+
:meth:`~sage.tensor.modules.free_module_tensor.FreeModuleTensor.__mul__`
|
|
870
|
+
so that * dispatches either to automorphism composition or to the
|
|
871
|
+
tensor product.
|
|
872
|
+
|
|
873
|
+
EXAMPLES:
|
|
874
|
+
|
|
875
|
+
Automorphism composition::
|
|
876
|
+
|
|
877
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
|
|
878
|
+
sage: e = M.basis('e')
|
|
879
|
+
sage: a = M.automorphism([[1,2],[1,3]])
|
|
880
|
+
sage: b = M.automorphism([[3,4],[5,7]])
|
|
881
|
+
sage: s = a*b ; s
|
|
882
|
+
Automorphism of the Rank-2 free module M over the Integer Ring
|
|
883
|
+
sage: s.matrix()
|
|
884
|
+
[13 18]
|
|
885
|
+
[18 25]
|
|
886
|
+
sage: s.matrix() == a.matrix() * b.matrix()
|
|
887
|
+
True
|
|
888
|
+
sage: s(e[0]) == a(b(e[0]))
|
|
889
|
+
True
|
|
890
|
+
sage: s(e[1]) == a(b(e[1]))
|
|
891
|
+
True
|
|
892
|
+
sage: s.display()
|
|
893
|
+
13 e_0⊗e^0 + 18 e_0⊗e^1 + 18 e_1⊗e^0 + 25 e_1⊗e^1
|
|
894
|
+
|
|
895
|
+
Tensor product::
|
|
896
|
+
|
|
897
|
+
sage: c = M.tensor((1,1)) ; c
|
|
898
|
+
Type-(1,1) tensor on the Rank-2 free module M over the Integer Ring
|
|
899
|
+
sage: c[:] = [[3,4],[5,7]]
|
|
900
|
+
sage: c[:] == b[:] # c and b have the same components
|
|
901
|
+
True
|
|
902
|
+
sage: s = a*c ; s
|
|
903
|
+
Type-(2,2) tensor on the Rank-2 free module M over the Integer Ring
|
|
904
|
+
sage: s.display()
|
|
905
|
+
3 e_0⊗e_0⊗e^0⊗e^0 + 4 e_0⊗e_0⊗e^0⊗e^1 + 6 e_0⊗e_0⊗e^1⊗e^0
|
|
906
|
+
+ 8 e_0⊗e_0⊗e^1⊗e^1 + 5 e_0⊗e_1⊗e^0⊗e^0 + 7 e_0⊗e_1⊗e^0⊗e^1
|
|
907
|
+
+ 10 e_0⊗e_1⊗e^1⊗e^0 + 14 e_0⊗e_1⊗e^1⊗e^1 + 3 e_1⊗e_0⊗e^0⊗e^0
|
|
908
|
+
+ 4 e_1⊗e_0⊗e^0⊗e^1 + 9 e_1⊗e_0⊗e^1⊗e^0 + 12 e_1⊗e_0⊗e^1⊗e^1
|
|
909
|
+
+ 5 e_1⊗e_1⊗e^0⊗e^0 + 7 e_1⊗e_1⊗e^0⊗e^1 + 15 e_1⊗e_1⊗e^1⊗e^0
|
|
910
|
+
+ 21 e_1⊗e_1⊗e^1⊗e^1
|
|
911
|
+
|
|
912
|
+
TESTS::
|
|
913
|
+
|
|
914
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M', start_index=1)
|
|
915
|
+
sage: e = M.basis('e')
|
|
916
|
+
sage: a = M.automorphism([[1,2],[1,3]], name='a')
|
|
917
|
+
sage: b = M.automorphism([[0,1],[-1,0]], name='b')
|
|
918
|
+
sage: mat_a0 = a.matrix(e)
|
|
919
|
+
sage: a *= b
|
|
920
|
+
sage: a.matrix(e) == mat_a0 * b.matrix(e)
|
|
921
|
+
True
|
|
922
|
+
"""
|
|
923
|
+
if isinstance(other, FreeModuleAutomorphism):
|
|
924
|
+
return self._mul_(other) # general linear group law
|
|
925
|
+
else:
|
|
926
|
+
return FreeModuleTensor.__mul__(self, other) # tensor product
|
|
927
|
+
|
|
928
|
+
def matrix(self, basis1=None, basis2=None):
|
|
929
|
+
r"""
|
|
930
|
+
Return the matrix of ``self`` w.r.t to a pair of bases.
|
|
931
|
+
|
|
932
|
+
If the matrix is not known already, it is computed from the matrix in
|
|
933
|
+
another pair of bases by means of the change-of-basis formula.
|
|
934
|
+
|
|
935
|
+
INPUT:
|
|
936
|
+
|
|
937
|
+
- ``basis1`` -- (default: ``None``) basis of the free module on which
|
|
938
|
+
``self`` is defined; if none is provided, the module's default basis
|
|
939
|
+
is assumed
|
|
940
|
+
- ``basis2`` -- (default: ``None``) basis of the free module on which
|
|
941
|
+
``self`` is defined; if none is provided, ``basis2`` is set to
|
|
942
|
+
``basis1``
|
|
943
|
+
|
|
944
|
+
OUTPUT:
|
|
945
|
+
|
|
946
|
+
- the matrix representing the automorphism ``self`` w.r.t
|
|
947
|
+
to bases ``basis1`` and ``basis2``; more precisely, the columns of
|
|
948
|
+
this matrix are formed by the components w.r.t. ``basis2`` of
|
|
949
|
+
the images of the elements of ``basis1``.
|
|
950
|
+
|
|
951
|
+
EXAMPLES:
|
|
952
|
+
|
|
953
|
+
Matrices of an automorphism of a rank-3 free `\ZZ`-module::
|
|
954
|
+
|
|
955
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M', start_index=1)
|
|
956
|
+
sage: e = M.basis('e')
|
|
957
|
+
sage: a = M.automorphism([[-1,0,0],[0,1,2],[0,1,3]], name='a')
|
|
958
|
+
sage: a.matrix(e)
|
|
959
|
+
[-1 0 0]
|
|
960
|
+
[ 0 1 2]
|
|
961
|
+
[ 0 1 3]
|
|
962
|
+
sage: a.matrix()
|
|
963
|
+
[-1 0 0]
|
|
964
|
+
[ 0 1 2]
|
|
965
|
+
[ 0 1 3]
|
|
966
|
+
sage: f = M.basis('f', from_family=(-e[2], 4*e[1]+3*e[3], 7*e[1]+5*e[3])) ; f
|
|
967
|
+
Basis (f_1,f_2,f_3) on the Rank-3 free module M over the Integer Ring
|
|
968
|
+
sage: a.matrix(f)
|
|
969
|
+
[ 1 -6 -10]
|
|
970
|
+
[ -7 83 140]
|
|
971
|
+
[ 4 -48 -81]
|
|
972
|
+
|
|
973
|
+
Check of the above matrix::
|
|
974
|
+
|
|
975
|
+
sage: a(f[1]).display(f)
|
|
976
|
+
a(f_1) = f_1 - 7 f_2 + 4 f_3
|
|
977
|
+
sage: a(f[2]).display(f)
|
|
978
|
+
a(f_2) = -6 f_1 + 83 f_2 - 48 f_3
|
|
979
|
+
sage: a(f[3]).display(f)
|
|
980
|
+
a(f_3) = -10 f_1 + 140 f_2 - 81 f_3
|
|
981
|
+
|
|
982
|
+
Check of the change-of-basis formula::
|
|
983
|
+
|
|
984
|
+
sage: P = M.change_of_basis(e,f).matrix(e)
|
|
985
|
+
sage: a.matrix(f) == P^(-1) * a.matrix(e) * P
|
|
986
|
+
True
|
|
987
|
+
|
|
988
|
+
Check that the matrix of the product of two automorphisms is the
|
|
989
|
+
product of their matrices::
|
|
990
|
+
|
|
991
|
+
sage: b = M.change_of_basis(e,f) ; b
|
|
992
|
+
Automorphism of the Rank-3 free module M over the Integer Ring
|
|
993
|
+
sage: b.matrix(e)
|
|
994
|
+
[ 0 4 7]
|
|
995
|
+
[-1 0 0]
|
|
996
|
+
[ 0 3 5]
|
|
997
|
+
sage: (a*b).matrix(e) == a.matrix(e) * b.matrix(e)
|
|
998
|
+
True
|
|
999
|
+
|
|
1000
|
+
Check that the matrix of the inverse automorphism is the inverse of the
|
|
1001
|
+
automorphism's matrix::
|
|
1002
|
+
|
|
1003
|
+
sage: (~a).matrix(e)
|
|
1004
|
+
[-1 0 0]
|
|
1005
|
+
[ 0 3 -2]
|
|
1006
|
+
[ 0 -1 1]
|
|
1007
|
+
sage: (~a).matrix(e) == ~(a.matrix(e))
|
|
1008
|
+
True
|
|
1009
|
+
|
|
1010
|
+
Matrices of the identity map::
|
|
1011
|
+
|
|
1012
|
+
sage: id = M.identity_map()
|
|
1013
|
+
sage: id.matrix(e)
|
|
1014
|
+
[1 0 0]
|
|
1015
|
+
[0 1 0]
|
|
1016
|
+
[0 0 1]
|
|
1017
|
+
sage: id.matrix(f)
|
|
1018
|
+
[1 0 0]
|
|
1019
|
+
[0 1 0]
|
|
1020
|
+
[0 0 1]
|
|
1021
|
+
"""
|
|
1022
|
+
from sage.matrix.constructor import matrix
|
|
1023
|
+
fmodule = self._fmodule
|
|
1024
|
+
if basis1 is None:
|
|
1025
|
+
basis1 = fmodule.default_basis()
|
|
1026
|
+
elif basis1 not in fmodule.bases():
|
|
1027
|
+
raise TypeError("{} is not a basis on the {}".format(basis1,
|
|
1028
|
+
fmodule))
|
|
1029
|
+
if basis2 is None:
|
|
1030
|
+
basis2 = basis1
|
|
1031
|
+
elif basis2 not in fmodule.bases():
|
|
1032
|
+
raise TypeError("{} is not a basis on the {}".format(basis2,
|
|
1033
|
+
fmodule))
|
|
1034
|
+
if (basis1, basis2) not in self._matrices:
|
|
1035
|
+
if basis2 == basis1:
|
|
1036
|
+
comp = self.components(basis1)
|
|
1037
|
+
mat = [[comp[[i,j]] for j in fmodule.irange()]
|
|
1038
|
+
for i in fmodule.irange()]
|
|
1039
|
+
self._matrices[(basis1, basis1)] = matrix(mat)
|
|
1040
|
+
else:
|
|
1041
|
+
# 1/ determine the matrix w.r.t. basis1:
|
|
1042
|
+
self.matrix(basis1)
|
|
1043
|
+
# 2/ perform the change (basis1, basis1) --> (basis1, basis2):
|
|
1044
|
+
raise NotImplementedError("basis1 != basis2 not implemented yet")
|
|
1045
|
+
return self._matrices[(basis1, basis2)]
|
|
1046
|
+
|
|
1047
|
+
def _some_matrix(self):
|
|
1048
|
+
r"""
|
|
1049
|
+
Return the matrix of ``self`` w.r.t. some basis.
|
|
1050
|
+
|
|
1051
|
+
EXAMPLES::
|
|
1052
|
+
|
|
1053
|
+
sage: M = FiniteRankFreeModule(QQ, 2, name='M')
|
|
1054
|
+
sage: e = M.basis('e')
|
|
1055
|
+
sage: a = M.automorphism([[1,1],[0,2]], name='a')
|
|
1056
|
+
sage: a._some_matrix()
|
|
1057
|
+
[1 1]
|
|
1058
|
+
[0 2]
|
|
1059
|
+
"""
|
|
1060
|
+
self.matrix() # forces the update of the matrix in the module's default
|
|
1061
|
+
# basis, to make sure that the dictionary self._matrices
|
|
1062
|
+
# is not empty
|
|
1063
|
+
return next(iter(self._matrices.values()))
|
|
1064
|
+
|
|
1065
|
+
@lazy_attribute
|
|
1066
|
+
def characteristic_polynomial(self):
|
|
1067
|
+
r"""
|
|
1068
|
+
Return the characteristic polynomial of ``self``.
|
|
1069
|
+
|
|
1070
|
+
:meth:`characteristic_polynomial` and :meth:`charpoly` are the same method.
|
|
1071
|
+
|
|
1072
|
+
INPUT:
|
|
1073
|
+
|
|
1074
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1075
|
+
|
|
1076
|
+
EXAMPLES::
|
|
1077
|
+
|
|
1078
|
+
sage: # needs sage.libs.pari
|
|
1079
|
+
sage: M = FiniteRankFreeModule(QQ, 2, name='M')
|
|
1080
|
+
sage: e = M.basis('e')
|
|
1081
|
+
sage: a = M.automorphism([[1,1],[0,2]], name='a')
|
|
1082
|
+
sage: a.matrix(e)
|
|
1083
|
+
[1 1]
|
|
1084
|
+
[0 2]
|
|
1085
|
+
sage: a.characteristic_polynomial()
|
|
1086
|
+
x^2 - 3*x + 2
|
|
1087
|
+
sage: a.charpoly()
|
|
1088
|
+
x^2 - 3*x + 2
|
|
1089
|
+
sage: a.charpoly('T')
|
|
1090
|
+
T^2 - 3*T + 2
|
|
1091
|
+
"""
|
|
1092
|
+
return self._some_matrix().characteristic_polynomial
|
|
1093
|
+
|
|
1094
|
+
charpoly = characteristic_polynomial
|
|
1095
|
+
|
|
1096
|
+
@lazy_attribute
|
|
1097
|
+
def det(self):
|
|
1098
|
+
r"""
|
|
1099
|
+
Return the determinant of ``self``.
|
|
1100
|
+
|
|
1101
|
+
OUTPUT:
|
|
1102
|
+
|
|
1103
|
+
- element of the base ring of the module on which ``self`` is defined,
|
|
1104
|
+
equal to the determinant of ``self``.
|
|
1105
|
+
|
|
1106
|
+
EXAMPLES:
|
|
1107
|
+
|
|
1108
|
+
Determinant of an automorphism on a `\ZZ`-module of rank 2::
|
|
1109
|
+
|
|
1110
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
|
|
1111
|
+
sage: e = M.basis('e')
|
|
1112
|
+
sage: a = M.automorphism([[4,7],[3,5]], name='a')
|
|
1113
|
+
sage: a.matrix(e)
|
|
1114
|
+
[4 7]
|
|
1115
|
+
[3 5]
|
|
1116
|
+
sage: a.det()
|
|
1117
|
+
-1
|
|
1118
|
+
sage: det(a)
|
|
1119
|
+
-1
|
|
1120
|
+
sage: ~a.det() # determinant of the inverse automorphism
|
|
1121
|
+
-1
|
|
1122
|
+
sage: id = M.identity_map()
|
|
1123
|
+
sage: id.det()
|
|
1124
|
+
1
|
|
1125
|
+
"""
|
|
1126
|
+
return self._some_matrix().det
|
|
1127
|
+
|
|
1128
|
+
determinant = det
|
|
1129
|
+
|
|
1130
|
+
@lazy_attribute
|
|
1131
|
+
def fcp(self):
|
|
1132
|
+
r"""
|
|
1133
|
+
Return the factorization of the characteristic polynomial of ``self``.
|
|
1134
|
+
|
|
1135
|
+
INPUT:
|
|
1136
|
+
|
|
1137
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1138
|
+
|
|
1139
|
+
EXAMPLES::
|
|
1140
|
+
|
|
1141
|
+
sage: M = FiniteRankFreeModule(QQ, 2, name='M')
|
|
1142
|
+
sage: e = M.basis('e')
|
|
1143
|
+
sage: a = M.automorphism([[1,1],[0,2]], name='a')
|
|
1144
|
+
sage: a.matrix(e)
|
|
1145
|
+
[1 1]
|
|
1146
|
+
[0 2]
|
|
1147
|
+
sage: a.fcp() # needs sage.libs.pari
|
|
1148
|
+
(x - 2) * (x - 1)
|
|
1149
|
+
sage: a.fcp('T') # needs sage.libs.pari
|
|
1150
|
+
(T - 2) * (T - 1)
|
|
1151
|
+
"""
|
|
1152
|
+
return self._some_matrix().fcp
|
|
1153
|
+
|
|
1154
|
+
@lazy_attribute
|
|
1155
|
+
def minimal_polynomial(self):
|
|
1156
|
+
r"""
|
|
1157
|
+
Return the minimal polynomial of ``self``.
|
|
1158
|
+
|
|
1159
|
+
:meth:`minimal_polynomial` and :meth:`minpoly` are the same method.
|
|
1160
|
+
|
|
1161
|
+
INPUT:
|
|
1162
|
+
|
|
1163
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1164
|
+
|
|
1165
|
+
EXAMPLES::
|
|
1166
|
+
|
|
1167
|
+
sage: M = FiniteRankFreeModule(GF(7), 3, name='M')
|
|
1168
|
+
sage: e = M.basis('e')
|
|
1169
|
+
sage: a = M.automorphism([[0,1,2], [-1,0,3], [2,4,1]], name='a')
|
|
1170
|
+
sage: a.minpoly() # needs sage.libs.pari
|
|
1171
|
+
x^3 + 6*x^2 + 6*x + 1
|
|
1172
|
+
sage: a.minimal_polynomial() # needs sage.libs.pari
|
|
1173
|
+
x^3 + 6*x^2 + 6*x + 1
|
|
1174
|
+
sage: a.minimal_polynomial('T') # needs sage.libs.pari
|
|
1175
|
+
T^3 + 6*T^2 + 6*T + 1
|
|
1176
|
+
"""
|
|
1177
|
+
return self._some_matrix().minimal_polynomial
|
|
1178
|
+
|
|
1179
|
+
minpoly = minimal_polynomial
|
|
1180
|
+
|
|
1181
|
+
@lazy_attribute
|
|
1182
|
+
def trace(self):
|
|
1183
|
+
r"""
|
|
1184
|
+
Return the trace of ``self``.
|
|
1185
|
+
|
|
1186
|
+
OUTPUT:
|
|
1187
|
+
|
|
1188
|
+
- element of the base ring of the module on which ``self`` is defined,
|
|
1189
|
+
equal to the trace of ``self``.
|
|
1190
|
+
|
|
1191
|
+
EXAMPLES:
|
|
1192
|
+
|
|
1193
|
+
Trace of an automorphism on a `\ZZ`-module of rank 2::
|
|
1194
|
+
|
|
1195
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
|
|
1196
|
+
sage: e = M.basis('e')
|
|
1197
|
+
sage: a = M.automorphism([[4,7],[3,5]], name='a')
|
|
1198
|
+
sage: a.matrix(e)
|
|
1199
|
+
[4 7]
|
|
1200
|
+
[3 5]
|
|
1201
|
+
sage: a.trace()
|
|
1202
|
+
9
|
|
1203
|
+
sage: id = M.identity_map()
|
|
1204
|
+
sage: id.trace()
|
|
1205
|
+
2
|
|
1206
|
+
"""
|
|
1207
|
+
return self._some_matrix().trace
|