passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.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 +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-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-aarch64-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,1581 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Free module morphisms
|
|
4
|
+
|
|
5
|
+
The class :class:`FiniteRankFreeModuleMorphism` implements homomorphisms
|
|
6
|
+
between two free modules of finite rank over the same commutative ring.
|
|
7
|
+
|
|
8
|
+
The subclass :class:`FiniteRankFreeModuleEndomorphism` implements the
|
|
9
|
+
special case of endomorphisms.
|
|
10
|
+
|
|
11
|
+
AUTHORS:
|
|
12
|
+
|
|
13
|
+
- Eric Gourgoulhon, Michal Bejger (2014-2015): initial version
|
|
14
|
+
- Matthias Koeppe (2024): add subclass :class:`FiniteRankFreeModuleEndomorphism`
|
|
15
|
+
|
|
16
|
+
REFERENCES:
|
|
17
|
+
|
|
18
|
+
- Chap. 13, 14 of R. Godement : *Algebra* [God1968]_
|
|
19
|
+
- Chap. 3 of S. Lang : *Algebra* [Lan2002]_
|
|
20
|
+
"""
|
|
21
|
+
# *****************************************************************************
|
|
22
|
+
# Copyright (C) 2015 Eric Gourgoulhon <eric.gourgoulhon@obspm.fr>
|
|
23
|
+
# Copyright (C) 2015 Michal Bejger <bejger@camk.edu.pl>
|
|
24
|
+
#
|
|
25
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
26
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
27
|
+
# the License, or (at your option) any later version.
|
|
28
|
+
# https://www.gnu.org/licenses/
|
|
29
|
+
# *****************************************************************************
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from typing import TYPE_CHECKING
|
|
33
|
+
|
|
34
|
+
from sage.categories.morphism import Morphism
|
|
35
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
36
|
+
from sage.rings.integer import Integer
|
|
37
|
+
|
|
38
|
+
if TYPE_CHECKING:
|
|
39
|
+
from sage.tensor.modules.free_module_element import FiniteRankFreeModuleElement
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class FiniteRankFreeModuleMorphism(Morphism):
|
|
43
|
+
r"""
|
|
44
|
+
Homomorphism between free modules of finite rank over a commutative ring.
|
|
45
|
+
|
|
46
|
+
An instance of this class is a homomorphism
|
|
47
|
+
|
|
48
|
+
.. MATH::
|
|
49
|
+
|
|
50
|
+
\phi:\ M \longrightarrow N,
|
|
51
|
+
|
|
52
|
+
where `M` and `N` are two free modules of finite rank over the same
|
|
53
|
+
commutative ring `R`.
|
|
54
|
+
|
|
55
|
+
This is a Sage *element* class, the corresponding *parent* class being
|
|
56
|
+
:class:`~sage.tensor.modules.free_module_homset.FreeModuleHomset`.
|
|
57
|
+
|
|
58
|
+
For the special case of endomorphisms (`M=N`), use the subclass
|
|
59
|
+
:class:`FiniteRankFreeModuleEndomorphism`.
|
|
60
|
+
|
|
61
|
+
INPUT:
|
|
62
|
+
|
|
63
|
+
- ``parent`` -- Hom-set Hom(M,N) to which the homomorphism belongs
|
|
64
|
+
- ``matrix_rep`` -- matrix representation of the homomorphism with
|
|
65
|
+
respect to the bases ``bases``; this entry can actually
|
|
66
|
+
be any material from which a matrix of size rank(N)*rank(M) of
|
|
67
|
+
elements of `R` can be constructed; the *columns* of the matrix give
|
|
68
|
+
the images of the basis of `M` (see the convention in the example below)
|
|
69
|
+
- ``bases`` -- (default: ``None``) pair (basis_M, basis_N) defining the
|
|
70
|
+
matrix representation, basis_M being a basis of module `M` and
|
|
71
|
+
basis_N a basis of module `N` ; if None the pair formed by the
|
|
72
|
+
default bases of each module is assumed.
|
|
73
|
+
- ``name`` -- (default: ``None``) string; name given to the homomorphism
|
|
74
|
+
- ``latex_name`` -- (default: ``None``) string; LaTeX symbol to denote the
|
|
75
|
+
homomorphism. If ``None``, ``name`` will be used.
|
|
76
|
+
|
|
77
|
+
EXAMPLES:
|
|
78
|
+
|
|
79
|
+
A homomorphism between two free modules over `\ZZ` is constructed
|
|
80
|
+
as an element of the corresponding hom-set, by means of the function
|
|
81
|
+
``__call__``::
|
|
82
|
+
|
|
83
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
84
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
85
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
86
|
+
sage: H = Hom(M,N) ; H
|
|
87
|
+
Set of Morphisms from Rank-3 free module M over the Integer Ring
|
|
88
|
+
to Rank-2 free module N over the Integer Ring
|
|
89
|
+
in Category of finite dimensional modules over Integer Ring
|
|
90
|
+
sage: phi = H([[2,-1,3], [1,0,-4]], name='phi', latex_name=r'\phi') ; phi
|
|
91
|
+
Generic morphism:
|
|
92
|
+
From: Rank-3 free module M over the Integer Ring
|
|
93
|
+
To: Rank-2 free module N over the Integer Ring
|
|
94
|
+
|
|
95
|
+
Since no bases have been specified in the argument list, the provided
|
|
96
|
+
matrix is relative to the default bases of modules M and N, so that
|
|
97
|
+
the above is equivalent to::
|
|
98
|
+
|
|
99
|
+
sage: phi = H([[2,-1,3], [1,0,-4]], bases=(e,f), name='phi',
|
|
100
|
+
....: latex_name=r'\phi') ; phi
|
|
101
|
+
Generic morphism:
|
|
102
|
+
From: Rank-3 free module M over the Integer Ring
|
|
103
|
+
To: Rank-2 free module N over the Integer Ring
|
|
104
|
+
|
|
105
|
+
An alternative way to construct a homomorphism is to call the method
|
|
106
|
+
:meth:`~sage.tensor.modules.finite_rank_free_module.FiniteRankFreeModule.hom`
|
|
107
|
+
on the domain::
|
|
108
|
+
|
|
109
|
+
sage: phi = M.hom(N, [[2,-1,3], [1,0,-4]], bases=(e,f), name='phi',
|
|
110
|
+
....: latex_name=r'\phi') ; phi
|
|
111
|
+
Generic morphism:
|
|
112
|
+
From: Rank-3 free module M over the Integer Ring
|
|
113
|
+
To: Rank-2 free module N over the Integer Ring
|
|
114
|
+
|
|
115
|
+
The parent of a homomorphism is of course the corresponding hom-set::
|
|
116
|
+
|
|
117
|
+
sage: phi.parent() is H
|
|
118
|
+
True
|
|
119
|
+
sage: phi.parent() is Hom(M,N)
|
|
120
|
+
True
|
|
121
|
+
|
|
122
|
+
Due to Sage's category scheme, the actual class of the homomorphism ``phi``
|
|
123
|
+
is a derived class of :class:`FiniteRankFreeModuleMorphism`::
|
|
124
|
+
|
|
125
|
+
sage: type(phi)
|
|
126
|
+
<class 'sage.tensor.modules.free_module_homset.FreeModuleHomset_with_category_with_equality_by_id.element_class'>
|
|
127
|
+
sage: isinstance(phi, sage.tensor.modules.free_module_morphism.FiniteRankFreeModuleMorphism)
|
|
128
|
+
True
|
|
129
|
+
|
|
130
|
+
The domain and codomain of the homomorphism are returned respectively by
|
|
131
|
+
the methods ``domain()`` and ``codomain()``, which are implemented as
|
|
132
|
+
Sage's constant functions::
|
|
133
|
+
|
|
134
|
+
sage: phi.domain()
|
|
135
|
+
Rank-3 free module M over the Integer Ring
|
|
136
|
+
sage: phi.codomain()
|
|
137
|
+
Rank-2 free module N over the Integer Ring
|
|
138
|
+
sage: type(phi.domain)
|
|
139
|
+
<... 'sage.misc.constant_function.ConstantFunction'>
|
|
140
|
+
|
|
141
|
+
The matrix of the homomorphism with respect to a pair of bases is
|
|
142
|
+
returned by the method :meth:`matrix`::
|
|
143
|
+
|
|
144
|
+
sage: phi.matrix(e,f)
|
|
145
|
+
[ 2 -1 3]
|
|
146
|
+
[ 1 0 -4]
|
|
147
|
+
|
|
148
|
+
The convention is that the columns of this matrix give the components of
|
|
149
|
+
the images of the elements of basis ``e`` w.r.t basis ``f``::
|
|
150
|
+
|
|
151
|
+
sage: phi(e[0]).display()
|
|
152
|
+
phi(e_0) = 2 f_0 + f_1
|
|
153
|
+
sage: phi(e[1]).display()
|
|
154
|
+
phi(e_1) = -f_0
|
|
155
|
+
sage: phi(e[2]).display()
|
|
156
|
+
phi(e_2) = 3 f_0 - 4 f_1
|
|
157
|
+
|
|
158
|
+
Test of the module homomorphism laws::
|
|
159
|
+
|
|
160
|
+
sage: phi(M.zero()) == N.zero()
|
|
161
|
+
True
|
|
162
|
+
sage: u = M([1,2,3], basis=e, name='u') ; u.display()
|
|
163
|
+
u = e_0 + 2 e_1 + 3 e_2
|
|
164
|
+
sage: v = M([-2,1,4], basis=e, name='v') ; v.display()
|
|
165
|
+
v = -2 e_0 + e_1 + 4 e_2
|
|
166
|
+
sage: phi(u).display()
|
|
167
|
+
phi(u) = 9 f_0 - 11 f_1
|
|
168
|
+
sage: phi(v).display()
|
|
169
|
+
phi(v) = 7 f_0 - 18 f_1
|
|
170
|
+
sage: phi(3*u + v).display()
|
|
171
|
+
34 f_0 - 51 f_1
|
|
172
|
+
sage: phi(3*u + v) == 3*phi(u) + phi(v)
|
|
173
|
+
True
|
|
174
|
+
"""
|
|
175
|
+
def __init__(self, parent, matrix_rep, bases=None, name=None,
|
|
176
|
+
latex_name=None, is_identity=False):
|
|
177
|
+
r"""
|
|
178
|
+
TESTS:
|
|
179
|
+
|
|
180
|
+
Generic homomorphism::
|
|
181
|
+
|
|
182
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
183
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
184
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
185
|
+
sage: from sage.tensor.modules.free_module_morphism import FiniteRankFreeModuleMorphism
|
|
186
|
+
sage: phi = FiniteRankFreeModuleMorphism(Hom(M,N), [[1,0,-3], [2,1,4]],
|
|
187
|
+
....: name='phi', latex_name=r'\phi')
|
|
188
|
+
sage: phi
|
|
189
|
+
Generic morphism:
|
|
190
|
+
From: Rank-3 free module M over the Integer Ring
|
|
191
|
+
To: Rank-2 free module N over the Integer Ring
|
|
192
|
+
sage: phi.matrix(e,f)
|
|
193
|
+
[ 1 0 -3]
|
|
194
|
+
[ 2 1 4]
|
|
195
|
+
sage: latex(phi)
|
|
196
|
+
\phi
|
|
197
|
+
"""
|
|
198
|
+
if is_identity:
|
|
199
|
+
raise TypeError('use the subclass FiniteRankFreeModuleEndomorphism for the identity morphis')
|
|
200
|
+
from sage.matrix.constructor import matrix
|
|
201
|
+
from sage.misc.constant_function import ConstantFunction
|
|
202
|
+
Morphism.__init__(self, parent)
|
|
203
|
+
fmodule1 = parent.domain()
|
|
204
|
+
fmodule2 = parent.codomain()
|
|
205
|
+
if bases is None:
|
|
206
|
+
def_basis1 = fmodule1.default_basis()
|
|
207
|
+
if def_basis1 is None:
|
|
208
|
+
raise ValueError("the {} has no default ".format(fmodule1) +
|
|
209
|
+
"basis")
|
|
210
|
+
def_basis2 = fmodule2.default_basis()
|
|
211
|
+
if def_basis2 is None:
|
|
212
|
+
raise ValueError("the {} has no default ".format(fmodule2) +
|
|
213
|
+
"basis")
|
|
214
|
+
bases = (def_basis1, def_basis2)
|
|
215
|
+
else:
|
|
216
|
+
bases = tuple(bases) # insures bases is a tuple
|
|
217
|
+
if len(bases) != 2:
|
|
218
|
+
raise TypeError("the argument bases must contain 2 bases")
|
|
219
|
+
if bases[0] not in fmodule1.bases():
|
|
220
|
+
raise TypeError("{} is not a basis on the {}".format(bases[0],
|
|
221
|
+
fmodule1))
|
|
222
|
+
if bases[1] not in fmodule2.bases():
|
|
223
|
+
raise TypeError("{} is not a basis on the {}".format(bases[1],
|
|
224
|
+
fmodule2))
|
|
225
|
+
ring = parent.base_ring()
|
|
226
|
+
n1 = fmodule1.rank()
|
|
227
|
+
n2 = fmodule2.rank()
|
|
228
|
+
# Construction of a generic morphism
|
|
229
|
+
self._is_identity = False
|
|
230
|
+
if isinstance(matrix_rep, ConstantFunction):
|
|
231
|
+
# the zero morphism
|
|
232
|
+
if matrix_rep().is_zero():
|
|
233
|
+
matrix_rep = 0
|
|
234
|
+
self._matrices = {bases: matrix(ring, n2, n1, matrix_rep)}
|
|
235
|
+
self._name = name
|
|
236
|
+
if latex_name is None:
|
|
237
|
+
self._latex_name = self._name
|
|
238
|
+
else:
|
|
239
|
+
self._latex_name = latex_name
|
|
240
|
+
|
|
241
|
+
#
|
|
242
|
+
# SageObject methods
|
|
243
|
+
#
|
|
244
|
+
|
|
245
|
+
def _latex_(self):
|
|
246
|
+
r"""
|
|
247
|
+
LaTeX representation of the object.
|
|
248
|
+
|
|
249
|
+
EXAMPLES::
|
|
250
|
+
|
|
251
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
252
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
253
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
254
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
255
|
+
....: latex_name=r'\Phi')
|
|
256
|
+
sage: phi._latex_()
|
|
257
|
+
'\\Phi'
|
|
258
|
+
sage: latex(phi) # indirect doctest
|
|
259
|
+
\Phi
|
|
260
|
+
|
|
261
|
+
::
|
|
262
|
+
|
|
263
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='F')
|
|
264
|
+
sage: phi._latex_()
|
|
265
|
+
'F'
|
|
266
|
+
|
|
267
|
+
::
|
|
268
|
+
|
|
269
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
270
|
+
sage: phi._latex_()
|
|
271
|
+
'\\mbox{Generic morphism:\n From: Rank-3 free module M over the Integer Ring\n To: Rank-2 free module N over the Integer Ring}'
|
|
272
|
+
"""
|
|
273
|
+
if self._latex_name is None:
|
|
274
|
+
return r'\mbox{' + str(self) + r'}'
|
|
275
|
+
else:
|
|
276
|
+
return self._latex_name
|
|
277
|
+
|
|
278
|
+
def __eq__(self, other):
|
|
279
|
+
r"""
|
|
280
|
+
Comparison (equality) operator.
|
|
281
|
+
|
|
282
|
+
INPUT:
|
|
283
|
+
|
|
284
|
+
- ``other`` -- a free module morphism (or 0)
|
|
285
|
+
|
|
286
|
+
OUTPUT: ``True`` if ``self`` is equal to ``other`` and ``False`` otherwise
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
291
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
292
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
293
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
294
|
+
....: latex_name=r'\phi')
|
|
295
|
+
sage: psi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
296
|
+
sage: phi.__eq__(psi)
|
|
297
|
+
True
|
|
298
|
+
sage: phi == psi
|
|
299
|
+
True
|
|
300
|
+
sage: phi.__eq__(phi)
|
|
301
|
+
True
|
|
302
|
+
sage: phi.__eq__(+phi)
|
|
303
|
+
True
|
|
304
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
|
|
305
|
+
sage: phi.__eq__(psi)
|
|
306
|
+
False
|
|
307
|
+
sage: phi.__eq__(-phi)
|
|
308
|
+
False
|
|
309
|
+
|
|
310
|
+
Comparison of homomorphisms defined on different bases::
|
|
311
|
+
|
|
312
|
+
sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
|
|
313
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
314
|
+
sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,f))
|
|
315
|
+
sage: phi.__eq__(psi)
|
|
316
|
+
True
|
|
317
|
+
sage: phi.matrix(e,f) == psi.matrix(e,f) # check
|
|
318
|
+
True
|
|
319
|
+
|
|
320
|
+
Comparison of homomorphisms having the same matrix but defined on
|
|
321
|
+
different modules::
|
|
322
|
+
|
|
323
|
+
sage: N1 = FiniteRankFreeModule(ZZ, 2, name='N1')
|
|
324
|
+
sage: f1 = N1.basis('f')
|
|
325
|
+
sage: phi1 = M.hom(N1, [[-1,2,0], [5,1,2]])
|
|
326
|
+
sage: phi.matrix() == phi1.matrix() # same matrix in the default bases
|
|
327
|
+
True
|
|
328
|
+
sage: phi.__eq__(phi1)
|
|
329
|
+
False
|
|
330
|
+
|
|
331
|
+
Comparison to zero::
|
|
332
|
+
|
|
333
|
+
sage: phi.__eq__(0)
|
|
334
|
+
False
|
|
335
|
+
sage: phi = M.hom(N, 0)
|
|
336
|
+
sage: phi.__eq__(0)
|
|
337
|
+
True
|
|
338
|
+
sage: phi == 0
|
|
339
|
+
True
|
|
340
|
+
sage: phi.__eq__(Hom(M,N).zero())
|
|
341
|
+
True
|
|
342
|
+
"""
|
|
343
|
+
if isinstance(other, (int, Integer)): # other should be 0
|
|
344
|
+
if other == 0:
|
|
345
|
+
return self.is_zero()
|
|
346
|
+
else:
|
|
347
|
+
return False
|
|
348
|
+
elif not isinstance(other, FiniteRankFreeModuleMorphism):
|
|
349
|
+
return False
|
|
350
|
+
elif self.parent() != other.parent():
|
|
351
|
+
return False
|
|
352
|
+
else:
|
|
353
|
+
bases = self._common_bases(other)
|
|
354
|
+
if bases is None:
|
|
355
|
+
raise ValueError("no common pair of bases has been found to " +
|
|
356
|
+
"compare {} and {}".format(self, other))
|
|
357
|
+
return bool( self.matrix(*bases) == other.matrix(*bases) )
|
|
358
|
+
|
|
359
|
+
def __ne__(self, other):
|
|
360
|
+
r"""
|
|
361
|
+
Inequality operator.
|
|
362
|
+
|
|
363
|
+
INPUT:
|
|
364
|
+
|
|
365
|
+
- ``other`` -- a free module morphism (or 0)
|
|
366
|
+
|
|
367
|
+
OUTPUT:
|
|
368
|
+
|
|
369
|
+
- ``True`` if ``self`` is different from ``other`` and ``False``
|
|
370
|
+
otherwise
|
|
371
|
+
|
|
372
|
+
EXAMPLES::
|
|
373
|
+
|
|
374
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
375
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
376
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
377
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
378
|
+
....: latex_name=r'\phi')
|
|
379
|
+
sage: psi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
380
|
+
sage: phi.__ne__(psi)
|
|
381
|
+
False
|
|
382
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
|
|
383
|
+
sage: phi.__ne__(psi)
|
|
384
|
+
True
|
|
385
|
+
sage: phi != psi
|
|
386
|
+
True
|
|
387
|
+
sage: phi.__ne__('junk')
|
|
388
|
+
True
|
|
389
|
+
sage: Hom(M,N).zero().__ne__(0)
|
|
390
|
+
False
|
|
391
|
+
"""
|
|
392
|
+
return not self == other
|
|
393
|
+
|
|
394
|
+
#
|
|
395
|
+
# Required module methods
|
|
396
|
+
#
|
|
397
|
+
|
|
398
|
+
def __bool__(self):
|
|
399
|
+
r"""
|
|
400
|
+
Return ``True`` if ``self`` is nonzero and ``False`` otherwise.
|
|
401
|
+
|
|
402
|
+
This method is called by self.is_zero().
|
|
403
|
+
|
|
404
|
+
EXAMPLES::
|
|
405
|
+
|
|
406
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
407
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
408
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
409
|
+
sage: phi = M.hom(N, [[2,-1,3], [1,0,-4]])
|
|
410
|
+
sage: bool(phi)
|
|
411
|
+
True
|
|
412
|
+
sage: phi.is_zero() # indirect doctest
|
|
413
|
+
False
|
|
414
|
+
sage: phi = M.hom(N, 0)
|
|
415
|
+
sage: bool(phi)
|
|
416
|
+
False
|
|
417
|
+
sage: phi.is_zero() # indirect doctest
|
|
418
|
+
True
|
|
419
|
+
sage: bool(Hom(M,N).zero())
|
|
420
|
+
False
|
|
421
|
+
"""
|
|
422
|
+
# Some matrix representation is picked at random:
|
|
423
|
+
matrix_rep = next(iter(self._matrices.values()))
|
|
424
|
+
return not matrix_rep.is_zero()
|
|
425
|
+
|
|
426
|
+
def _add_(self, other):
|
|
427
|
+
r"""
|
|
428
|
+
Homomorphism addition.
|
|
429
|
+
|
|
430
|
+
INPUT:
|
|
431
|
+
|
|
432
|
+
- ``other`` -- a free module morphism (same parent as ``self``)
|
|
433
|
+
|
|
434
|
+
OUTPUT: the homomorphism resulting from the addition of ``self`` and ``other``
|
|
435
|
+
|
|
436
|
+
EXAMPLES::
|
|
437
|
+
|
|
438
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
439
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
440
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
441
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
442
|
+
....: latex_name=r'\phi')
|
|
443
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
|
|
444
|
+
sage: s = phi._add_(psi) ; s
|
|
445
|
+
Generic morphism:
|
|
446
|
+
From: Rank-3 free module M over the Integer Ring
|
|
447
|
+
To: Rank-2 free module N over the Integer Ring
|
|
448
|
+
sage: s.matrix(e,f)
|
|
449
|
+
[0 3 0]
|
|
450
|
+
[9 2 5]
|
|
451
|
+
sage: s.matrix(e,f) == phi.matrix(e,f) + psi.matrix(e,f) # check
|
|
452
|
+
True
|
|
453
|
+
sage: s == phi + psi # indirect doctest
|
|
454
|
+
True
|
|
455
|
+
|
|
456
|
+
Addition of homomorphisms defined on different bases::
|
|
457
|
+
|
|
458
|
+
sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
|
|
459
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
460
|
+
sage: b = N.automorphism() ; b[0,1], b[1,0] = -1, 1
|
|
461
|
+
sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
|
|
462
|
+
sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,fp))
|
|
463
|
+
sage: s = phi._add_(psi) ; s
|
|
464
|
+
Generic morphism:
|
|
465
|
+
From: Rank-3 free module M over the Integer Ring
|
|
466
|
+
To: Rank-2 free module N over the Integer Ring
|
|
467
|
+
sage: s.matrix(e,f)
|
|
468
|
+
[-6 1 -2]
|
|
469
|
+
[ 4 3 2]
|
|
470
|
+
sage: s.matrix(e,f) == phi.matrix(e,f) + psi.matrix(e,f) # check
|
|
471
|
+
True
|
|
472
|
+
sage: s == phi + psi # indirect doctest
|
|
473
|
+
True
|
|
474
|
+
|
|
475
|
+
Other tests::
|
|
476
|
+
|
|
477
|
+
sage: phi._add_(Hom(M,N).zero()) == phi
|
|
478
|
+
True
|
|
479
|
+
"""
|
|
480
|
+
# No need for consistency checks since self and other are guaranteed
|
|
481
|
+
# to have the same parents
|
|
482
|
+
bases = self._common_bases(other)
|
|
483
|
+
if bases is None:
|
|
484
|
+
raise ValueError("no common pair of bases has been found to " +
|
|
485
|
+
"add {} and {}".format(self, other))
|
|
486
|
+
# Addition at the matrix level:
|
|
487
|
+
resu_mat = self._matrices[bases] + other._matrices[bases]
|
|
488
|
+
if self._name is not None and other._name is not None:
|
|
489
|
+
resu_name = self._name + '+' + other._name
|
|
490
|
+
else:
|
|
491
|
+
resu_name = None
|
|
492
|
+
if self._latex_name is not None and other._latex_name is not None:
|
|
493
|
+
resu_latex_name = self._latex_name + '+' + other._latex_name
|
|
494
|
+
else:
|
|
495
|
+
resu_latex_name = None
|
|
496
|
+
return self.__class__(self.parent(), resu_mat, bases=bases,
|
|
497
|
+
name=resu_name, latex_name=resu_latex_name)
|
|
498
|
+
|
|
499
|
+
def _sub_(self, other):
|
|
500
|
+
r"""
|
|
501
|
+
Homomorphism subtraction.
|
|
502
|
+
|
|
503
|
+
INPUT:
|
|
504
|
+
|
|
505
|
+
- ``other`` -- a free module morphism (same parent as ``self``)
|
|
506
|
+
|
|
507
|
+
OUTPUT:
|
|
508
|
+
|
|
509
|
+
- the homomorphism resulting from the subtraction of ``other`` from
|
|
510
|
+
``self``
|
|
511
|
+
|
|
512
|
+
EXAMPLES::
|
|
513
|
+
|
|
514
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
515
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
516
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
517
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
518
|
+
....: latex_name=r'\phi')
|
|
519
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
|
|
520
|
+
sage: s = phi._sub_(psi) ; s
|
|
521
|
+
Generic morphism:
|
|
522
|
+
From: Rank-3 free module M over the Integer Ring
|
|
523
|
+
To: Rank-2 free module N over the Integer Ring
|
|
524
|
+
sage: s.matrix(e,f)
|
|
525
|
+
[-2 1 0]
|
|
526
|
+
[ 1 0 -1]
|
|
527
|
+
sage: s.matrix(e,f) == phi.matrix(e,f) - psi.matrix(e,f) # check
|
|
528
|
+
True
|
|
529
|
+
sage: s == phi - psi # indirect doctest
|
|
530
|
+
True
|
|
531
|
+
|
|
532
|
+
Subtraction of homomorphisms defined on different bases::
|
|
533
|
+
|
|
534
|
+
sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
|
|
535
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
536
|
+
sage: b = N.automorphism() ; b[0,1], b[1,0] = -1, 1
|
|
537
|
+
sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
|
|
538
|
+
sage: psi = M.hom(N, [[-2,0,-1], [-1,-2, 5]], bases=(ep,fp))
|
|
539
|
+
sage: s = phi._sub_(psi) ; s
|
|
540
|
+
Generic morphism:
|
|
541
|
+
From: Rank-3 free module M over the Integer Ring
|
|
542
|
+
To: Rank-2 free module N over the Integer Ring
|
|
543
|
+
sage: s.matrix(e,f)
|
|
544
|
+
[ 4 3 2]
|
|
545
|
+
[ 6 -1 2]
|
|
546
|
+
sage: s.matrix(e,f) == phi.matrix(e,f) - psi.matrix(e,f) # check
|
|
547
|
+
True
|
|
548
|
+
sage: s == phi - psi # indirect doctest
|
|
549
|
+
True
|
|
550
|
+
|
|
551
|
+
Other tests::
|
|
552
|
+
|
|
553
|
+
sage: phi._sub_(Hom(M,N).zero()) == phi
|
|
554
|
+
True
|
|
555
|
+
sage: Hom(M,N).zero()._sub_(phi) == -phi
|
|
556
|
+
True
|
|
557
|
+
sage: phi._sub_(phi).is_zero()
|
|
558
|
+
True
|
|
559
|
+
"""
|
|
560
|
+
# No need for consistency checks since self and other are guaranteed
|
|
561
|
+
# to have the same parents
|
|
562
|
+
bases = self._common_bases(other)
|
|
563
|
+
if bases is None:
|
|
564
|
+
raise ValueError("no common pair of bases has been found to " +
|
|
565
|
+
"subtract {} from {}".format(other, self))
|
|
566
|
+
# Subtraction at the matrix level:
|
|
567
|
+
resu_mat = self._matrices[bases] - other._matrices[bases]
|
|
568
|
+
if self._name is not None and other._name is not None:
|
|
569
|
+
resu_name = self._name + '-' + other._name
|
|
570
|
+
else:
|
|
571
|
+
resu_name = None
|
|
572
|
+
if self._latex_name is not None and other._latex_name is not None:
|
|
573
|
+
resu_latex_name = self._latex_name + '-' + other._latex_name
|
|
574
|
+
else:
|
|
575
|
+
resu_latex_name = None
|
|
576
|
+
return self.__class__(self.parent(), resu_mat, bases=bases,
|
|
577
|
+
name=resu_name, latex_name=resu_latex_name)
|
|
578
|
+
|
|
579
|
+
def _lmul_(self, scalar):
|
|
580
|
+
r"""
|
|
581
|
+
Multiplication by ``scalar``.
|
|
582
|
+
|
|
583
|
+
INPUT:
|
|
584
|
+
|
|
585
|
+
- ``scalar`` -- element of the ring over which the parent of ``self``
|
|
586
|
+
is a module
|
|
587
|
+
|
|
588
|
+
OUTPUT: the homomorphism resulting from the multiplication of ``self``
|
|
589
|
+
by ``scalar``
|
|
590
|
+
|
|
591
|
+
EXAMPLES::
|
|
592
|
+
|
|
593
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
594
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
595
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
596
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
597
|
+
....: latex_name=r'\phi')
|
|
598
|
+
sage: s = phi._lmul_(7) ; s
|
|
599
|
+
Generic morphism:
|
|
600
|
+
From: Rank-3 free module M over the Integer Ring
|
|
601
|
+
To: Rank-2 free module N over the Integer Ring
|
|
602
|
+
sage: s.matrix(e,f)
|
|
603
|
+
[-7 14 0]
|
|
604
|
+
[35 7 14]
|
|
605
|
+
sage: s == 7 * phi
|
|
606
|
+
True
|
|
607
|
+
"""
|
|
608
|
+
resu = self.__class__(self.parent(), 0) # 0 = provisory value
|
|
609
|
+
for bases, mat in self._matrices.items():
|
|
610
|
+
resu._matrices[bases] = scalar * mat
|
|
611
|
+
return resu
|
|
612
|
+
|
|
613
|
+
#
|
|
614
|
+
# Other module methods
|
|
615
|
+
#
|
|
616
|
+
|
|
617
|
+
def __pos__(self):
|
|
618
|
+
r"""
|
|
619
|
+
Unary plus operator.
|
|
620
|
+
|
|
621
|
+
OUTPUT: an exact copy of ``self``
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
626
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
627
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
628
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
629
|
+
....: latex_name=r'\phi')
|
|
630
|
+
sage: s = phi.__pos__() ; s
|
|
631
|
+
Generic morphism:
|
|
632
|
+
From: Rank-3 free module M over the Integer Ring
|
|
633
|
+
To: Rank-2 free module N over the Integer Ring
|
|
634
|
+
sage: s == +phi
|
|
635
|
+
True
|
|
636
|
+
sage: s == phi
|
|
637
|
+
True
|
|
638
|
+
sage: s is phi
|
|
639
|
+
False
|
|
640
|
+
"""
|
|
641
|
+
resu = self.__class__(self.parent(), 0, is_identity=self._is_identity)
|
|
642
|
+
# 0 = provisory value
|
|
643
|
+
for bases, mat in self._matrices.items():
|
|
644
|
+
resu._matrices[bases] = +mat
|
|
645
|
+
if self._name is not None:
|
|
646
|
+
resu._name = '+' + self._name
|
|
647
|
+
if self._latex_name is not None:
|
|
648
|
+
resu._latex_name = '+' + self._latex_name
|
|
649
|
+
return resu
|
|
650
|
+
|
|
651
|
+
def __neg__(self):
|
|
652
|
+
r"""
|
|
653
|
+
Unary minus operator.
|
|
654
|
+
|
|
655
|
+
OUTPUT: the homomorphism `-f`, where `f` is ``self``
|
|
656
|
+
|
|
657
|
+
EXAMPLES::
|
|
658
|
+
|
|
659
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
660
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
661
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
662
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi',
|
|
663
|
+
....: latex_name=r'\phi')
|
|
664
|
+
sage: s = phi.__neg__() ; s
|
|
665
|
+
Generic morphism:
|
|
666
|
+
From: Rank-3 free module M over the Integer Ring
|
|
667
|
+
To: Rank-2 free module N over the Integer Ring
|
|
668
|
+
sage: s == -phi
|
|
669
|
+
True
|
|
670
|
+
sage: s.matrix()
|
|
671
|
+
[ 1 -2 0]
|
|
672
|
+
[-5 -1 -2]
|
|
673
|
+
sage: s.matrix() == -phi.matrix()
|
|
674
|
+
True
|
|
675
|
+
"""
|
|
676
|
+
resu = self.__class__(self.parent(), 0) # 0 = provisory value
|
|
677
|
+
for bases, mat in self._matrices.items():
|
|
678
|
+
resu._matrices[bases] = -mat
|
|
679
|
+
if self._name is not None:
|
|
680
|
+
resu._name = '-' + self._name
|
|
681
|
+
if self._latex_name is not None:
|
|
682
|
+
resu._latex_name = '-' + self._latex_name
|
|
683
|
+
return resu
|
|
684
|
+
|
|
685
|
+
#
|
|
686
|
+
# Map methods
|
|
687
|
+
#
|
|
688
|
+
|
|
689
|
+
def _call_(
|
|
690
|
+
self, element: FiniteRankFreeModuleElement
|
|
691
|
+
) -> FiniteRankFreeModuleElement:
|
|
692
|
+
r"""
|
|
693
|
+
Action of the homomorphism ``self`` on some free module element
|
|
694
|
+
|
|
695
|
+
INPUT:
|
|
696
|
+
|
|
697
|
+
- ``element`` -- element of the domain of ``self``
|
|
698
|
+
|
|
699
|
+
OUTPUT: the image of ``element`` by ``self``
|
|
700
|
+
|
|
701
|
+
EXAMPLES:
|
|
702
|
+
|
|
703
|
+
Images of a homomorphism between two `\ZZ`-modules::
|
|
704
|
+
|
|
705
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
706
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
707
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
708
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]], name='phi', latex_name=r'\phi')
|
|
709
|
+
sage: v = M([1,2,3], basis=e, name='v')
|
|
710
|
+
sage: w = phi(v) ; w
|
|
711
|
+
Element phi(v) of the Rank-2 free module N over the Integer Ring
|
|
712
|
+
sage: w.display()
|
|
713
|
+
phi(v) = 3 f_0 + 13 f_1
|
|
714
|
+
|
|
715
|
+
TESTS::
|
|
716
|
+
|
|
717
|
+
sage: all(w[i] == sum(phi.matrix()[i,j]*v[j] for j in range(3)) for i in range(2))
|
|
718
|
+
True
|
|
719
|
+
sage: phi.matrix(e,f)
|
|
720
|
+
[-1 2 0]
|
|
721
|
+
[ 5 1 2]
|
|
722
|
+
sage: phi(e[0]).display()
|
|
723
|
+
phi(e_0) = -f_0 + 5 f_1
|
|
724
|
+
sage: phi(e[1]).display()
|
|
725
|
+
phi(e_1) = 2 f_0 + f_1
|
|
726
|
+
sage: phi(e[2]).display()
|
|
727
|
+
phi(e_2) = 2 f_1
|
|
728
|
+
|
|
729
|
+
Image of an element that is not defined on the default basis::
|
|
730
|
+
|
|
731
|
+
sage: a = M.automorphism()
|
|
732
|
+
sage: a[0,2], a[1,0], a[2,1] = 1, -1, -1
|
|
733
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
734
|
+
sage: v = M([1,2,3], basis=ep, name='v')
|
|
735
|
+
sage: w = phi(v) ; w
|
|
736
|
+
Element phi(v) of the Rank-2 free module N over the Integer Ring
|
|
737
|
+
sage: w.display()
|
|
738
|
+
phi(v) = -5 f_0 + 10 f_1
|
|
739
|
+
sage: all(w[i] == sum(phi.matrix(ep,f)[i,j]*v[ep,j] for j in range(3)) for i in range(2))
|
|
740
|
+
True
|
|
741
|
+
|
|
742
|
+
Check of homomorphism properties::
|
|
743
|
+
|
|
744
|
+
sage: phi(M.zero()) == N.zero()
|
|
745
|
+
True
|
|
746
|
+
"""
|
|
747
|
+
if self._is_identity:
|
|
748
|
+
return element
|
|
749
|
+
dom = self.parent().domain()
|
|
750
|
+
sindex = dom._sindex
|
|
751
|
+
codom = self.parent().codomain()
|
|
752
|
+
basis_codom = codom.default_basis()
|
|
753
|
+
# Search for a common basis to compute the result
|
|
754
|
+
for basis in element._components:
|
|
755
|
+
try:
|
|
756
|
+
self.matrix(basis, basis_codom)
|
|
757
|
+
basis_dom = basis
|
|
758
|
+
break
|
|
759
|
+
except ValueError:
|
|
760
|
+
continue
|
|
761
|
+
else:
|
|
762
|
+
raise ValueError("no common basis found to evaluate the image " +
|
|
763
|
+
"of {} by {}".format(element,self))
|
|
764
|
+
# Components of the result obtained by matrix multiplication
|
|
765
|
+
mat = self.matrix(basis_dom, basis_codom)
|
|
766
|
+
vcomp = element._components[basis_dom]
|
|
767
|
+
tresu = []
|
|
768
|
+
for i in range(codom.rank()):
|
|
769
|
+
s = 0
|
|
770
|
+
for j in range(dom.rank()):
|
|
771
|
+
s += mat[i,j] * vcomp[[j+sindex]]
|
|
772
|
+
tresu.append(s)
|
|
773
|
+
# Name of the result
|
|
774
|
+
if self._name is not None and element._name is not None:
|
|
775
|
+
resu_name = self._name + '(' + element._name + ')'
|
|
776
|
+
else:
|
|
777
|
+
resu_name = None
|
|
778
|
+
if self._latex_name is not None and element._latex_name is not None:
|
|
779
|
+
resu_latex_name = self._latex_name + r'\left(' + \
|
|
780
|
+
element._latex_name + r'\right)'
|
|
781
|
+
else:
|
|
782
|
+
resu_latex_name = None
|
|
783
|
+
# Creation of the result
|
|
784
|
+
return codom(tresu, basis=basis_codom, name=resu_name,
|
|
785
|
+
latex_name=resu_latex_name)
|
|
786
|
+
|
|
787
|
+
def is_injective(self):
|
|
788
|
+
r"""
|
|
789
|
+
Determine whether ``self`` is injective.
|
|
790
|
+
|
|
791
|
+
OUTPUT:
|
|
792
|
+
|
|
793
|
+
- ``True`` if ``self`` is an injective homomorphism and ``False``
|
|
794
|
+
otherwise
|
|
795
|
+
|
|
796
|
+
EXAMPLES:
|
|
797
|
+
|
|
798
|
+
Homomorphisms between two `\ZZ`-modules::
|
|
799
|
+
|
|
800
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
801
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
802
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
803
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
804
|
+
sage: phi.matrix(e,f)
|
|
805
|
+
[-1 2 0]
|
|
806
|
+
[ 5 1 2]
|
|
807
|
+
sage: phi.is_injective()
|
|
808
|
+
False
|
|
809
|
+
|
|
810
|
+
Indeed, phi has a non trivial kernel::
|
|
811
|
+
|
|
812
|
+
sage: phi(4*e[0] + 2*e[1] - 11*e[2]).display()
|
|
813
|
+
0
|
|
814
|
+
|
|
815
|
+
An injective homomorphism::
|
|
816
|
+
|
|
817
|
+
sage: psi = N.hom(M, [[1,-1], [0,3], [4,-5]])
|
|
818
|
+
sage: psi.matrix(f,e)
|
|
819
|
+
[ 1 -1]
|
|
820
|
+
[ 0 3]
|
|
821
|
+
[ 4 -5]
|
|
822
|
+
sage: psi.is_injective()
|
|
823
|
+
True
|
|
824
|
+
|
|
825
|
+
Of course, the identity endomorphism is injective::
|
|
826
|
+
|
|
827
|
+
sage: End(M).one().is_injective()
|
|
828
|
+
True
|
|
829
|
+
sage: End(N).one().is_injective()
|
|
830
|
+
True
|
|
831
|
+
"""
|
|
832
|
+
# Some matrix representation is picked at random:
|
|
833
|
+
matrix_rep = next(iter(self._matrices.values()))
|
|
834
|
+
return not matrix_rep.right_kernel().rank()
|
|
835
|
+
|
|
836
|
+
def is_surjective(self):
|
|
837
|
+
r"""
|
|
838
|
+
Determine whether ``self`` is surjective.
|
|
839
|
+
|
|
840
|
+
OUTPUT:
|
|
841
|
+
|
|
842
|
+
- ``True`` if ``self`` is a surjective homomorphism and ``False``
|
|
843
|
+
otherwise
|
|
844
|
+
|
|
845
|
+
EXAMPLES:
|
|
846
|
+
|
|
847
|
+
This method has not been implemented yet::
|
|
848
|
+
|
|
849
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
850
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
851
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
852
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
853
|
+
sage: phi.is_surjective()
|
|
854
|
+
Traceback (most recent call last):
|
|
855
|
+
...
|
|
856
|
+
NotImplementedError: FiniteRankFreeModuleMorphism.is_surjective()
|
|
857
|
+
has not been implemented yet
|
|
858
|
+
|
|
859
|
+
except for the identity endomorphism (!)::
|
|
860
|
+
|
|
861
|
+
sage: End(M).one().is_surjective()
|
|
862
|
+
True
|
|
863
|
+
sage: End(N).one().is_surjective()
|
|
864
|
+
True
|
|
865
|
+
"""
|
|
866
|
+
if self._is_identity:
|
|
867
|
+
return True
|
|
868
|
+
raise NotImplementedError(
|
|
869
|
+
"FiniteRankFreeModuleMorphism.is_surjective() " +
|
|
870
|
+
"has not been implemented yet")
|
|
871
|
+
#
|
|
872
|
+
# Morphism methods
|
|
873
|
+
#
|
|
874
|
+
|
|
875
|
+
def is_identity(self):
|
|
876
|
+
r"""
|
|
877
|
+
Check whether ``self`` is the identity morphism.
|
|
878
|
+
|
|
879
|
+
EXAMPLES::
|
|
880
|
+
|
|
881
|
+
sage: M = FiniteRankFreeModule(ZZ, 2, name='M')
|
|
882
|
+
sage: e = M.basis('e')
|
|
883
|
+
sage: phi = M.endomorphism([[1,0], [0,1]])
|
|
884
|
+
sage: phi.is_identity()
|
|
885
|
+
True
|
|
886
|
+
sage: (phi+phi).is_identity()
|
|
887
|
+
False
|
|
888
|
+
sage: End(M).zero().is_identity()
|
|
889
|
+
False
|
|
890
|
+
sage: a = M.automorphism() ; a[0,1], a[1,0] = 1, -1
|
|
891
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
892
|
+
sage: phi = M.endomorphism([[1,0], [0,1]], basis=ep)
|
|
893
|
+
sage: phi.is_identity()
|
|
894
|
+
True
|
|
895
|
+
|
|
896
|
+
Example illustrating that the identity can be constructed from a
|
|
897
|
+
matrix that is not the identity one, provided that it is relative to
|
|
898
|
+
different bases::
|
|
899
|
+
|
|
900
|
+
sage: phi = M.hom(M, [[0,1], [-1,0]], bases=(ep,e))
|
|
901
|
+
sage: phi.is_identity()
|
|
902
|
+
True
|
|
903
|
+
|
|
904
|
+
Of course, if we ask for the matrix in a single basis, it is the
|
|
905
|
+
identity matrix::
|
|
906
|
+
|
|
907
|
+
sage: phi.matrix(e)
|
|
908
|
+
[1 0]
|
|
909
|
+
[0 1]
|
|
910
|
+
sage: phi.matrix(ep)
|
|
911
|
+
[1 0]
|
|
912
|
+
[0 1]
|
|
913
|
+
"""
|
|
914
|
+
if self._is_identity:
|
|
915
|
+
return True
|
|
916
|
+
# The identity must be an endomorphism:
|
|
917
|
+
fmodule = self.domain()
|
|
918
|
+
if fmodule != self.codomain():
|
|
919
|
+
return False
|
|
920
|
+
# Some basis in which ``self`` has a representation is picked at
|
|
921
|
+
# random and the test is performed on the images of the basis
|
|
922
|
+
# elements:
|
|
923
|
+
basis = list(self._matrices)[0][0]
|
|
924
|
+
for i in fmodule.irange():
|
|
925
|
+
if self(basis[i]) != basis[i]:
|
|
926
|
+
return False
|
|
927
|
+
self._is_identity = True
|
|
928
|
+
return True
|
|
929
|
+
|
|
930
|
+
#
|
|
931
|
+
# End of Morphism methods
|
|
932
|
+
#
|
|
933
|
+
|
|
934
|
+
def _modules_and_bases(self, basis1=None, basis2=None):
|
|
935
|
+
r"""
|
|
936
|
+
Return domain, codomain, domain basis, and codomain basis.
|
|
937
|
+
|
|
938
|
+
This method implements default argument handling for methods
|
|
939
|
+
:meth:`matrix` and :meth:`display`.
|
|
940
|
+
|
|
941
|
+
INPUT:
|
|
942
|
+
|
|
943
|
+
- ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
|
|
944
|
+
none is provided, the domain's default basis is assumed
|
|
945
|
+
- ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
|
|
946
|
+
if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
|
|
947
|
+
an endomorphism, otherwise, ``basis2`` is set to the codomain's
|
|
948
|
+
default basis.
|
|
949
|
+
|
|
950
|
+
EXAMPLES::
|
|
951
|
+
|
|
952
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
953
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
954
|
+
sage: e = M.basis('e'); f = N.basis('f')
|
|
955
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
956
|
+
sage: phi._modules_and_bases()
|
|
957
|
+
(Rank-3 free module M over the Integer Ring,
|
|
958
|
+
Rank-2 free module N over the Integer Ring,
|
|
959
|
+
Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
|
|
960
|
+
Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
|
|
961
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
962
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
963
|
+
sage: phi._modules_and_bases(ep)
|
|
964
|
+
(Rank-3 free module M over the Integer Ring,
|
|
965
|
+
Rank-2 free module N over the Integer Ring,
|
|
966
|
+
Basis (ep_0,ep_1,ep_2) on the Rank-3 free module M over the Integer Ring,
|
|
967
|
+
Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
|
|
968
|
+
"""
|
|
969
|
+
fmodule1 = self.domain()
|
|
970
|
+
fmodule2 = self.codomain()
|
|
971
|
+
if basis1 is None:
|
|
972
|
+
basis1 = fmodule1.default_basis()
|
|
973
|
+
elif basis1 not in fmodule1.bases():
|
|
974
|
+
raise TypeError(str(basis1) + " is not a basis on the " +
|
|
975
|
+
str(fmodule1) + ".")
|
|
976
|
+
if basis2 is None:
|
|
977
|
+
if self.is_endomorphism():
|
|
978
|
+
basis2 = basis1
|
|
979
|
+
else:
|
|
980
|
+
basis2 = fmodule2.default_basis()
|
|
981
|
+
elif basis2 not in fmodule2.bases():
|
|
982
|
+
raise TypeError(str(basis2) + " is not a basis on the " +
|
|
983
|
+
str(fmodule2) + ".")
|
|
984
|
+
return fmodule1, fmodule2, basis1, basis2
|
|
985
|
+
|
|
986
|
+
def matrix(self, basis1=None, basis2=None):
|
|
987
|
+
r"""
|
|
988
|
+
Return the matrix of ``self`` w.r.t to a pair of bases.
|
|
989
|
+
|
|
990
|
+
If the matrix is not known already, it is computed from the matrix in
|
|
991
|
+
another pair of bases by means of the change-of-basis formula.
|
|
992
|
+
|
|
993
|
+
INPUT:
|
|
994
|
+
|
|
995
|
+
- ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
|
|
996
|
+
none is provided, the domain's default basis is assumed
|
|
997
|
+
- ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
|
|
998
|
+
if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
|
|
999
|
+
an endomorphism, otherwise, ``basis2`` is set to the codomain's
|
|
1000
|
+
default basis.
|
|
1001
|
+
|
|
1002
|
+
OUTPUT:
|
|
1003
|
+
|
|
1004
|
+
- the matrix representing the homomorphism ``self`` w.r.t
|
|
1005
|
+
to bases ``basis1`` and ``basis2``; more precisely, the columns of
|
|
1006
|
+
this matrix are formed by the components w.r.t. ``basis2`` of
|
|
1007
|
+
the images of the elements of ``basis1``.
|
|
1008
|
+
|
|
1009
|
+
EXAMPLES:
|
|
1010
|
+
|
|
1011
|
+
Matrix of a homomorphism between two `\ZZ`-modules::
|
|
1012
|
+
|
|
1013
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1014
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
1015
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
1016
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
1017
|
+
sage: phi.matrix() # default bases
|
|
1018
|
+
[-1 2 0]
|
|
1019
|
+
[ 5 1 2]
|
|
1020
|
+
sage: phi.matrix(e, f) # given bases
|
|
1021
|
+
[-1 2 0]
|
|
1022
|
+
[ 5 1 2]
|
|
1023
|
+
sage: type(phi.matrix()) # needs sage.libs.flint
|
|
1024
|
+
<class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'>
|
|
1025
|
+
|
|
1026
|
+
Matrix in bases different from those in which the homomorphism has
|
|
1027
|
+
been defined::
|
|
1028
|
+
|
|
1029
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1030
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1031
|
+
sage: b = N.automorphism(matrix=[[3,5],[4,7]], basis=f)
|
|
1032
|
+
sage: fp = f.new_basis(b, 'fp', latex_symbol="f'")
|
|
1033
|
+
sage: phi.matrix(ep, fp)
|
|
1034
|
+
[ 32 -1 -12]
|
|
1035
|
+
[-19 1 8]
|
|
1036
|
+
|
|
1037
|
+
Check of the change-of-basis formula::
|
|
1038
|
+
|
|
1039
|
+
sage: phi.matrix(ep, fp) == (b^(-1)).matrix(f) * phi.matrix(e,f) * a.matrix(e)
|
|
1040
|
+
True
|
|
1041
|
+
|
|
1042
|
+
Single change of basis::
|
|
1043
|
+
|
|
1044
|
+
sage: phi.matrix(ep, f)
|
|
1045
|
+
[ 1 2 4]
|
|
1046
|
+
[-5 3 8]
|
|
1047
|
+
sage: phi.matrix(ep,f) == phi.matrix(e,f) * a.matrix(e)
|
|
1048
|
+
True
|
|
1049
|
+
sage: phi.matrix(e, fp)
|
|
1050
|
+
[-32 9 -10]
|
|
1051
|
+
[ 19 -5 6]
|
|
1052
|
+
sage: phi.matrix(e, fp) == (b^(-1)).matrix(f) * phi.matrix(e,f)
|
|
1053
|
+
True
|
|
1054
|
+
|
|
1055
|
+
Matrix of an endomorphism::
|
|
1056
|
+
|
|
1057
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1058
|
+
sage: phi.matrix(ep)
|
|
1059
|
+
[1 2 3]
|
|
1060
|
+
[4 5 6]
|
|
1061
|
+
[7 8 9]
|
|
1062
|
+
sage: phi.matrix(ep,ep) # same as above
|
|
1063
|
+
[1 2 3]
|
|
1064
|
+
[4 5 6]
|
|
1065
|
+
[7 8 9]
|
|
1066
|
+
sage: phi.matrix() # matrix w.r.t to the module's default basis
|
|
1067
|
+
[ 1 -3 1]
|
|
1068
|
+
[-18 39 -18]
|
|
1069
|
+
[-25 54 -25]
|
|
1070
|
+
"""
|
|
1071
|
+
from sage.matrix.constructor import matrix
|
|
1072
|
+
fmodule1, fmodule2, basis1, basis2 = self._modules_and_bases(basis1, basis2)
|
|
1073
|
+
if (basis1, basis2) not in self._matrices:
|
|
1074
|
+
if self._is_identity:
|
|
1075
|
+
# The identity endomorphism
|
|
1076
|
+
# -------------------------
|
|
1077
|
+
if basis1 == basis2:
|
|
1078
|
+
# the matrix is the identity matrix:
|
|
1079
|
+
ring = fmodule1.base_ring()
|
|
1080
|
+
zero = ring.zero()
|
|
1081
|
+
one = ring.one()
|
|
1082
|
+
size = fmodule1.rank()
|
|
1083
|
+
mat = []
|
|
1084
|
+
for i in range(size):
|
|
1085
|
+
row = [zero]*size
|
|
1086
|
+
row[i] = one
|
|
1087
|
+
mat.append(row)
|
|
1088
|
+
else:
|
|
1089
|
+
# the matrix is the change-of-basis matrix:
|
|
1090
|
+
change = fmodule1.change_of_basis(basis1, basis2)
|
|
1091
|
+
mat = [[change[[i,j]] for j in fmodule1.irange()]
|
|
1092
|
+
for i in fmodule1.irange()]
|
|
1093
|
+
self._matrices[(basis1, basis2)] = matrix(mat)
|
|
1094
|
+
else:
|
|
1095
|
+
# Generic homomorphism
|
|
1096
|
+
# --------------------
|
|
1097
|
+
b1_list = [bases[0] for bases in self._matrices]
|
|
1098
|
+
b2_list = [bases[1] for bases in self._matrices]
|
|
1099
|
+
if basis1 in b1_list:
|
|
1100
|
+
for b2 in b2_list:
|
|
1101
|
+
if (basis2, b2) in fmodule2._basis_changes:
|
|
1102
|
+
nb2 = b2
|
|
1103
|
+
break
|
|
1104
|
+
else:
|
|
1105
|
+
raise ValueError("no start basis could be found for " +
|
|
1106
|
+
"applying the change-of-basis formula")
|
|
1107
|
+
change2 = fmodule2._basis_changes[(basis2, nb2)]
|
|
1108
|
+
mat2 = matrix( [[change2[[i,j]] for j in fmodule2.irange()]
|
|
1109
|
+
for i in fmodule2.irange()] )
|
|
1110
|
+
self._matrices[(basis1, basis2)] = \
|
|
1111
|
+
mat2 * self._matrices[(basis1,nb2)]
|
|
1112
|
+
elif basis2 in b2_list:
|
|
1113
|
+
for b1 in b1_list:
|
|
1114
|
+
if (b1, basis1) in fmodule1._basis_changes:
|
|
1115
|
+
nb1 = b1
|
|
1116
|
+
break
|
|
1117
|
+
else:
|
|
1118
|
+
raise ValueError("no start basis could be found for " +
|
|
1119
|
+
"applying the change-of-basis formula")
|
|
1120
|
+
change1 = fmodule1._basis_changes[(nb1, basis1)]
|
|
1121
|
+
mat1 = matrix( [[change1[[i,j]] for j in fmodule1.irange()]
|
|
1122
|
+
for i in fmodule1.irange()] )
|
|
1123
|
+
self._matrices[(basis1, basis2)] = \
|
|
1124
|
+
self._matrices[(nb1,basis2)] * mat1
|
|
1125
|
+
else: # most general change-of-basis formula
|
|
1126
|
+
for (b1, b2) in self._matrices:
|
|
1127
|
+
if (b1, basis1) in fmodule1._basis_changes and \
|
|
1128
|
+
(basis2, b2) in fmodule2._basis_changes:
|
|
1129
|
+
nb1, nb2 = b1, b2
|
|
1130
|
+
break
|
|
1131
|
+
else:
|
|
1132
|
+
raise ValueError("no start basis could be found for " +
|
|
1133
|
+
"applying the change-of-basis formula")
|
|
1134
|
+
change1 = fmodule1._basis_changes[(nb1, basis1)]
|
|
1135
|
+
change2 = fmodule2._basis_changes[(basis2, nb2)]
|
|
1136
|
+
mat1 = matrix( [[change1[[i,j]] for j in fmodule1.irange()]
|
|
1137
|
+
for i in fmodule1.irange()] )
|
|
1138
|
+
mat2 = matrix( [[change2[[i,j]] for j in fmodule2.irange()]
|
|
1139
|
+
for i in fmodule2.irange()] )
|
|
1140
|
+
self._matrices[(basis1, basis2)] = \
|
|
1141
|
+
mat2 * self._matrices[(nb1,nb2)] * mat1
|
|
1142
|
+
return self._matrices[(basis1, basis2)]
|
|
1143
|
+
|
|
1144
|
+
def _common_bases(self, other):
|
|
1145
|
+
r"""
|
|
1146
|
+
Return a pair of bases in which ``self`` and ``other`` have a known
|
|
1147
|
+
matrix representation.
|
|
1148
|
+
|
|
1149
|
+
INPUT:
|
|
1150
|
+
|
|
1151
|
+
- ``other`` -- another homomorphism in the same hom-set
|
|
1152
|
+
|
|
1153
|
+
OUTPUT:
|
|
1154
|
+
|
|
1155
|
+
- a pair of bases in which ``self`` and ``other`` have a known
|
|
1156
|
+
matrix representation.
|
|
1157
|
+
|
|
1158
|
+
EXAMPLES::
|
|
1159
|
+
|
|
1160
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1161
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
1162
|
+
sage: e = M.basis('e') ; f = N.basis('f')
|
|
1163
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
1164
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]])
|
|
1165
|
+
sage: phi._common_bases(psi) # matrices of phi and psi both defined on (e,f)
|
|
1166
|
+
(Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
|
|
1167
|
+
Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
|
|
1168
|
+
sage: a = M.automorphism() ; a[0,2], a[1,0], a[2,1] = 1, -1, -1
|
|
1169
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1170
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]], bases=(ep,f))
|
|
1171
|
+
sage: phi._common_bases(psi) # matrix of psi w.r.t. (e,f) computed
|
|
1172
|
+
(Basis (e_0,e_1,e_2) on the Rank-3 free module M over the Integer Ring,
|
|
1173
|
+
Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
|
|
1174
|
+
sage: psi = M.hom(N, [[1,1,0], [4,1,3]], bases=(ep,f))
|
|
1175
|
+
sage: psi._common_bases(phi) # matrix of phi w.r.t. (ep,f) computed
|
|
1176
|
+
(Basis (ep_0,ep_1,ep_2) on the Rank-3 free module M over the Integer Ring,
|
|
1177
|
+
Basis (f_0,f_1) on the Rank-2 free module N over the Integer Ring)
|
|
1178
|
+
"""
|
|
1179
|
+
resu = None
|
|
1180
|
+
for bases in self._matrices:
|
|
1181
|
+
try:
|
|
1182
|
+
other.matrix(*bases)
|
|
1183
|
+
resu = bases
|
|
1184
|
+
break
|
|
1185
|
+
except ValueError:
|
|
1186
|
+
continue
|
|
1187
|
+
if resu is None:
|
|
1188
|
+
for bases in other._matrices:
|
|
1189
|
+
try:
|
|
1190
|
+
self.matrix(*bases)
|
|
1191
|
+
resu = bases
|
|
1192
|
+
break
|
|
1193
|
+
except ValueError:
|
|
1194
|
+
continue
|
|
1195
|
+
return resu
|
|
1196
|
+
|
|
1197
|
+
def display(self, basis1=None, basis2=None):
|
|
1198
|
+
r"""
|
|
1199
|
+
Display ``self`` as a matrix w.r.t to a pair of bases.
|
|
1200
|
+
|
|
1201
|
+
If the matrix is not known already, it is computed from the matrix in
|
|
1202
|
+
another pair of bases by means of the change-of-basis formula.
|
|
1203
|
+
|
|
1204
|
+
INPUT:
|
|
1205
|
+
|
|
1206
|
+
- ``basis1`` -- (default: ``None``) basis of the domain of ``self``; if
|
|
1207
|
+
none is provided, the domain's default basis is assumed
|
|
1208
|
+
- ``basis2`` -- (default: ``None``) basis of the codomain of ``self``;
|
|
1209
|
+
if none is provided, ``basis2`` is set to ``basis1`` if ``self`` is
|
|
1210
|
+
an endomorphism, otherwise, ``basis2`` is set to the codomain's
|
|
1211
|
+
default basis.
|
|
1212
|
+
|
|
1213
|
+
EXAMPLES::
|
|
1214
|
+
|
|
1215
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1216
|
+
sage: N = FiniteRankFreeModule(ZZ, 2, name='N')
|
|
1217
|
+
sage: e = M.basis('e'); f = N.basis('f')
|
|
1218
|
+
sage: phi = M.hom(N, [[-1,2,0], [5,1,2]])
|
|
1219
|
+
sage: phi.display() # default bases
|
|
1220
|
+
e_0 e_1 e_2
|
|
1221
|
+
f_0⎛ -1 2 0⎞
|
|
1222
|
+
f_1⎝ 5 1 2⎠
|
|
1223
|
+
sage: phi.display(e, f) # given bases
|
|
1224
|
+
e_0 e_1 e_2
|
|
1225
|
+
f_0⎛ -1 2 0⎞
|
|
1226
|
+
f_1⎝ 5 1 2⎠
|
|
1227
|
+
|
|
1228
|
+
Matrix of an endomorphism::
|
|
1229
|
+
|
|
1230
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1231
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1232
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1233
|
+
sage: phi.display(ep)
|
|
1234
|
+
ep_0 ep_1 ep_2
|
|
1235
|
+
ep_0⎛ 1 2 3⎞
|
|
1236
|
+
ep_1⎜ 4 5 6⎟
|
|
1237
|
+
ep_2⎝ 7 8 9⎠
|
|
1238
|
+
sage: phi.display(ep, ep) # same as above
|
|
1239
|
+
ep_0 ep_1 ep_2
|
|
1240
|
+
ep_0⎛ 1 2 3⎞
|
|
1241
|
+
ep_1⎜ 4 5 6⎟
|
|
1242
|
+
ep_2⎝ 7 8 9⎠
|
|
1243
|
+
sage: phi.display() # matrix w.r.t to the module's default basis
|
|
1244
|
+
e_0 e_1 e_2
|
|
1245
|
+
e_0⎛ 1 -3 1⎞
|
|
1246
|
+
e_1⎜-18 39 -18⎟
|
|
1247
|
+
e_2⎝-25 54 -25⎠
|
|
1248
|
+
"""
|
|
1249
|
+
from sage.misc.latex import latex
|
|
1250
|
+
from .format_utilities import is_atomic, FormattedExpansion
|
|
1251
|
+
fmodule1, fmodule2, basis1, basis2 = self._modules_and_bases(basis1, basis2)
|
|
1252
|
+
matrix = self.matrix(basis1, basis2)
|
|
1253
|
+
if all(element._name for element in basis1):
|
|
1254
|
+
basis1_names = [element._name for element in basis1]
|
|
1255
|
+
else:
|
|
1256
|
+
basis1_names = None
|
|
1257
|
+
if all(element._name for element in basis2):
|
|
1258
|
+
basis2_names = [element._name for element in basis2]
|
|
1259
|
+
else:
|
|
1260
|
+
basis2_names = None
|
|
1261
|
+
resu_txt = matrix.str(unicode=True,
|
|
1262
|
+
top_border=basis1_names,
|
|
1263
|
+
left_border=basis2_names)
|
|
1264
|
+
resu_latex = latex(matrix)
|
|
1265
|
+
return FormattedExpansion(resu_txt, resu_latex)
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
class FiniteRankFreeModuleEndomorphism(FiniteRankFreeModuleMorphism):
|
|
1269
|
+
r"""
|
|
1270
|
+
Endomorphism of a free module of finite rank over a commutative ring.
|
|
1271
|
+
|
|
1272
|
+
An instance of this class is an endomorphism
|
|
1273
|
+
|
|
1274
|
+
.. MATH::
|
|
1275
|
+
|
|
1276
|
+
\phi:\ M \longrightarrow M,
|
|
1277
|
+
|
|
1278
|
+
where `M` is a free module of finite rank over a commutative ring `R`.
|
|
1279
|
+
|
|
1280
|
+
This is a Sage *element* class, the corresponding *parent* class being
|
|
1281
|
+
:class:`~sage.tensor.modules.free_module_homset.FreeModuleEndset`.
|
|
1282
|
+
|
|
1283
|
+
INPUT:
|
|
1284
|
+
|
|
1285
|
+
- ``parent`` -- Hom-set Hom(M,M) to which the endomorphism belongs
|
|
1286
|
+
- ``matrix_rep`` -- matrix representation of the endomorphism with
|
|
1287
|
+
respect to the basis ``bases``; this entry can actually
|
|
1288
|
+
be any material from which a matrix of size rank(N)*rank(M) of
|
|
1289
|
+
elements of `R` can be constructed; the *columns* of the matrix give
|
|
1290
|
+
the images of the basis of `M` (see the convention in the example below)
|
|
1291
|
+
- ``bases`` -- (default: ``None``) pair ``(basis_domain, basis_codomain)``
|
|
1292
|
+
defining the matrix representation, ``basis_domain`` and ``basis_codomain``
|
|
1293
|
+
being two bases (typically the same) of the same module `M`; if ``None``,
|
|
1294
|
+
the default basis of `M` is used for both.
|
|
1295
|
+
- ``name`` -- (default: ``None``) string; name given to the endomorphism
|
|
1296
|
+
- ``latex_name`` -- (default: ``None``) string; LaTeX symbol to denote the
|
|
1297
|
+
endomorphism. If ``None``, ``name`` will be used.
|
|
1298
|
+
- ``is_identity`` -- boolean (default: ``False``); determines whether the
|
|
1299
|
+
constructed object is the identity endomorphism. If set to ``True``,
|
|
1300
|
+
then the entry ``matrix_rep`` is not used.
|
|
1301
|
+
|
|
1302
|
+
EXAMPLES:
|
|
1303
|
+
|
|
1304
|
+
The identity endomorphism::
|
|
1305
|
+
|
|
1306
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1307
|
+
sage: e = M.basis('e')
|
|
1308
|
+
sage: Id = End(M).one(); Id
|
|
1309
|
+
Identity endomorphism of Rank-3 free module M over the Integer Ring
|
|
1310
|
+
sage: Id.parent()
|
|
1311
|
+
Set of Morphisms from Rank-3 free module M over the Integer Ring
|
|
1312
|
+
to Rank-3 free module M over the Integer Ring
|
|
1313
|
+
in Category of finite dimensional modules over Integer Ring
|
|
1314
|
+
sage: Id.parent() is End(M)
|
|
1315
|
+
True
|
|
1316
|
+
|
|
1317
|
+
The matrix of ``Id`` with respect to the basis ``e`` is of course the identity
|
|
1318
|
+
matrix::
|
|
1319
|
+
|
|
1320
|
+
sage: Id.matrix(e)
|
|
1321
|
+
[1 0 0]
|
|
1322
|
+
[0 1 0]
|
|
1323
|
+
[0 0 1]
|
|
1324
|
+
|
|
1325
|
+
The identity acting on a module element::
|
|
1326
|
+
|
|
1327
|
+
sage: v = M([-2,1,4], basis=e, name='v'); v.display()
|
|
1328
|
+
v = -2 e_0 + e_1 + 4 e_2
|
|
1329
|
+
sage: Id(v) is v
|
|
1330
|
+
True
|
|
1331
|
+
"""
|
|
1332
|
+
def __init__(self, parent, matrix_rep, bases=None, name=None,
|
|
1333
|
+
latex_name=None, is_identity=False):
|
|
1334
|
+
r"""
|
|
1335
|
+
TESTS::
|
|
1336
|
+
|
|
1337
|
+
sage: from sage.tensor.modules.free_module_morphism import FiniteRankFreeModuleEndomorphism
|
|
1338
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1339
|
+
sage: e = M.basis('e')
|
|
1340
|
+
|
|
1341
|
+
Generic endomorphism::
|
|
1342
|
+
|
|
1343
|
+
sage: phi = FiniteRankFreeModuleEndomorphism(End(M),
|
|
1344
|
+
....: [[1,0,-3], [2,1,4], [7,8,9]],
|
|
1345
|
+
....: name='phi', latex_name=r'\phi')
|
|
1346
|
+
sage: phi
|
|
1347
|
+
Generic endomorphism of Rank-3 free module M over the Integer Ring
|
|
1348
|
+
|
|
1349
|
+
Identity endomorphism::
|
|
1350
|
+
|
|
1351
|
+
sage: phi = FiniteRankFreeModuleEndomorphism(End(M), 'whatever',
|
|
1352
|
+
....: is_identity=True)
|
|
1353
|
+
sage: phi
|
|
1354
|
+
Identity endomorphism of Rank-3 free module M over the Integer Ring
|
|
1355
|
+
sage: phi.matrix(e)
|
|
1356
|
+
[1 0 0]
|
|
1357
|
+
[0 1 0]
|
|
1358
|
+
[0 0 1]
|
|
1359
|
+
sage: latex(phi)
|
|
1360
|
+
\mathrm{Id}
|
|
1361
|
+
"""
|
|
1362
|
+
from sage.misc.constant_function import ConstantFunction
|
|
1363
|
+
|
|
1364
|
+
fmodule = parent.domain()
|
|
1365
|
+
if bases is None:
|
|
1366
|
+
def_basis = fmodule.default_basis()
|
|
1367
|
+
if def_basis is None:
|
|
1368
|
+
raise ValueError("the {} has no default ".format(fmodule) +
|
|
1369
|
+
"basis")
|
|
1370
|
+
bases = (def_basis, def_basis)
|
|
1371
|
+
else:
|
|
1372
|
+
bases = tuple(bases) # insures bases is a tuple
|
|
1373
|
+
if len(bases) != 2:
|
|
1374
|
+
raise TypeError("the argument bases must contain 2 bases")
|
|
1375
|
+
if bases[0] not in fmodule.bases():
|
|
1376
|
+
raise TypeError("{} is not a basis on the {}".format(bases[0],
|
|
1377
|
+
fmodule))
|
|
1378
|
+
if bases[1] not in fmodule.bases():
|
|
1379
|
+
raise TypeError("{} is not a basis on the {}".format(bases[1],
|
|
1380
|
+
fmodule))
|
|
1381
|
+
if not is_identity:
|
|
1382
|
+
# Construction of a generic endomorphism
|
|
1383
|
+
if isinstance(matrix_rep, ConstantFunction):
|
|
1384
|
+
# the zero morphism
|
|
1385
|
+
if matrix_rep().is_zero():
|
|
1386
|
+
matrix_rep = 0
|
|
1387
|
+
if bases[0] == bases[1] and matrix_rep == 1:
|
|
1388
|
+
is_identity = True
|
|
1389
|
+
if is_identity:
|
|
1390
|
+
# Construction of the identity endomorphism
|
|
1391
|
+
if bases[0] != bases[1]:
|
|
1392
|
+
raise TypeError("the two bases must coincide for " +
|
|
1393
|
+
"constructing the identity endomorphism.")
|
|
1394
|
+
matrix_rep = 1
|
|
1395
|
+
if name is None:
|
|
1396
|
+
name = 'Id'
|
|
1397
|
+
if latex_name is None and name == 'Id':
|
|
1398
|
+
latex_name = r'\mathrm{Id}'
|
|
1399
|
+
FiniteRankFreeModuleMorphism.__init__(self, parent, matrix_rep, bases,
|
|
1400
|
+
name, latex_name)
|
|
1401
|
+
if is_identity:
|
|
1402
|
+
self._is_identity = True
|
|
1403
|
+
self._repr_type_str = 'Identity'
|
|
1404
|
+
|
|
1405
|
+
def _some_matrix(self):
|
|
1406
|
+
r"""
|
|
1407
|
+
Return the matrix of the endomorphism ``self`` w.r.t. some basis.
|
|
1408
|
+
|
|
1409
|
+
EXAMPLES::
|
|
1410
|
+
|
|
1411
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1412
|
+
sage: e = M.basis('e')
|
|
1413
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1414
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1415
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1416
|
+
sage: phi._some_matrix()
|
|
1417
|
+
[1 2 3]
|
|
1418
|
+
[4 5 6]
|
|
1419
|
+
[7 8 9]
|
|
1420
|
+
"""
|
|
1421
|
+
for (basis1, basis2), matrix in self._matrices.items():
|
|
1422
|
+
if basis1 == basis2:
|
|
1423
|
+
return matrix
|
|
1424
|
+
for basis in self.domain().bases():
|
|
1425
|
+
try:
|
|
1426
|
+
return self.matrix(basis)
|
|
1427
|
+
except ValueError:
|
|
1428
|
+
pass
|
|
1429
|
+
return self.matrix()
|
|
1430
|
+
|
|
1431
|
+
@lazy_attribute
|
|
1432
|
+
def characteristic_polynomial(self):
|
|
1433
|
+
r"""
|
|
1434
|
+
Return the characteristic polynomial of ``self``.
|
|
1435
|
+
|
|
1436
|
+
:meth:`characteristic_polynomial` and :meth:`charpoly` are the same method.
|
|
1437
|
+
|
|
1438
|
+
INPUT:
|
|
1439
|
+
|
|
1440
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1441
|
+
|
|
1442
|
+
EXAMPLES::
|
|
1443
|
+
|
|
1444
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1445
|
+
sage: e = M.basis('e')
|
|
1446
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1447
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1448
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1449
|
+
sage: phi.matrix(e)
|
|
1450
|
+
[ 1 -3 1]
|
|
1451
|
+
[-18 39 -18]
|
|
1452
|
+
[-25 54 -25]
|
|
1453
|
+
sage: phi.characteristic_polynomial()
|
|
1454
|
+
x^3 - 15*x^2 - 18*x
|
|
1455
|
+
sage: phi.charpoly()
|
|
1456
|
+
x^3 - 15*x^2 - 18*x
|
|
1457
|
+
sage: phi.charpoly('T')
|
|
1458
|
+
T^3 - 15*T^2 - 18*T
|
|
1459
|
+
"""
|
|
1460
|
+
return self._some_matrix().characteristic_polynomial
|
|
1461
|
+
|
|
1462
|
+
charpoly = characteristic_polynomial
|
|
1463
|
+
|
|
1464
|
+
@lazy_attribute
|
|
1465
|
+
def det(self):
|
|
1466
|
+
r"""
|
|
1467
|
+
Return the determinant of ``self``.
|
|
1468
|
+
|
|
1469
|
+
OUTPUT:
|
|
1470
|
+
|
|
1471
|
+
- element of the base ring of the modules on which ``self`` is defined,
|
|
1472
|
+
equal to the determinant of ``self``.
|
|
1473
|
+
|
|
1474
|
+
EXAMPLES::
|
|
1475
|
+
|
|
1476
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1477
|
+
sage: e = M.basis('e')
|
|
1478
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1479
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1480
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1481
|
+
sage: phi.matrix(e)
|
|
1482
|
+
[ 1 -3 1]
|
|
1483
|
+
[-18 39 -18]
|
|
1484
|
+
[-25 54 -25]
|
|
1485
|
+
sage: phi.det()
|
|
1486
|
+
0
|
|
1487
|
+
sage: det(phi)
|
|
1488
|
+
0
|
|
1489
|
+
"""
|
|
1490
|
+
return self._some_matrix().det
|
|
1491
|
+
|
|
1492
|
+
determinant = det
|
|
1493
|
+
|
|
1494
|
+
@lazy_attribute
|
|
1495
|
+
def fcp(self):
|
|
1496
|
+
r"""
|
|
1497
|
+
Return the factorization of the characteristic polynomial of ``self``.
|
|
1498
|
+
|
|
1499
|
+
INPUT:
|
|
1500
|
+
|
|
1501
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1502
|
+
|
|
1503
|
+
EXAMPLES::
|
|
1504
|
+
|
|
1505
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1506
|
+
sage: e = M.basis('e')
|
|
1507
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1508
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1509
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1510
|
+
sage: phi.matrix(e)
|
|
1511
|
+
[ 1 -3 1]
|
|
1512
|
+
[-18 39 -18]
|
|
1513
|
+
[-25 54 -25]
|
|
1514
|
+
sage: phi.fcp() # needs sage.libs.pari
|
|
1515
|
+
x * (x^2 - 15*x - 18)
|
|
1516
|
+
sage: phi.fcp('T') # needs sage.libs.pari
|
|
1517
|
+
T * (T^2 - 15*T - 18)
|
|
1518
|
+
"""
|
|
1519
|
+
return self._some_matrix().fcp
|
|
1520
|
+
|
|
1521
|
+
@lazy_attribute
|
|
1522
|
+
def minimal_polynomial(self):
|
|
1523
|
+
r"""
|
|
1524
|
+
Return the minimal polynomial of ``self``.
|
|
1525
|
+
|
|
1526
|
+
:meth:`minimal_polynomial` and :meth:`minpoly` are the same method.
|
|
1527
|
+
|
|
1528
|
+
INPUT:
|
|
1529
|
+
|
|
1530
|
+
- ``var`` -- string (default: ``'x'``); a variable name
|
|
1531
|
+
|
|
1532
|
+
EXAMPLES::
|
|
1533
|
+
|
|
1534
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1535
|
+
sage: e = M.basis('e')
|
|
1536
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1537
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1538
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1539
|
+
sage: phi.matrix(e)
|
|
1540
|
+
[ 1 -3 1]
|
|
1541
|
+
[-18 39 -18]
|
|
1542
|
+
[-25 54 -25]
|
|
1543
|
+
sage: phi.minpoly() # needs sage.libs.pari
|
|
1544
|
+
x^3 - 15*x^2 - 18*x
|
|
1545
|
+
sage: phi.minimal_polynomial() # needs sage.libs.pari
|
|
1546
|
+
x^3 - 15*x^2 - 18*x
|
|
1547
|
+
sage: phi.minimal_polynomial('T') # needs sage.libs.pari
|
|
1548
|
+
T^3 - 15*T^2 - 18*T
|
|
1549
|
+
"""
|
|
1550
|
+
return self._some_matrix().minimal_polynomial
|
|
1551
|
+
|
|
1552
|
+
minpoly = minimal_polynomial
|
|
1553
|
+
|
|
1554
|
+
@lazy_attribute
|
|
1555
|
+
def trace(self):
|
|
1556
|
+
r"""
|
|
1557
|
+
Return the trace of ``self``.
|
|
1558
|
+
|
|
1559
|
+
OUTPUT:
|
|
1560
|
+
|
|
1561
|
+
- element of the base ring of the modules on which ``self`` is defined,
|
|
1562
|
+
equal to the trace of ``self``.
|
|
1563
|
+
|
|
1564
|
+
EXAMPLES::
|
|
1565
|
+
|
|
1566
|
+
sage: M = FiniteRankFreeModule(ZZ, 3, name='M')
|
|
1567
|
+
sage: e = M.basis('e')
|
|
1568
|
+
sage: a = M.automorphism(matrix=[[-1,0,0],[0,1,2],[0,1,3]], basis=e)
|
|
1569
|
+
sage: ep = e.new_basis(a, 'ep', latex_symbol="e'")
|
|
1570
|
+
sage: phi = M.endomorphism([[1,2,3], [4,5,6], [7,8,9]], basis=ep)
|
|
1571
|
+
sage: phi.matrix(e)
|
|
1572
|
+
[ 1 -3 1]
|
|
1573
|
+
[-18 39 -18]
|
|
1574
|
+
[-25 54 -25]
|
|
1575
|
+
sage: phi.trace()
|
|
1576
|
+
15
|
|
1577
|
+
sage: id = M.identity_map()
|
|
1578
|
+
sage: id.trace()
|
|
1579
|
+
3
|
|
1580
|
+
"""
|
|
1581
|
+
return self._some_matrix().trace
|