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,1222 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Base class for sparse matrices
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# This program is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
# https://www.gnu.org/licenses/
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
|
|
13
|
+
cimport cython
|
|
14
|
+
from cysignals.memory cimport check_allocarray, sig_free
|
|
15
|
+
from cysignals.signals cimport sig_check
|
|
16
|
+
|
|
17
|
+
cimport sage.matrix.matrix as matrix
|
|
18
|
+
cimport sage.matrix.matrix0 as matrix0
|
|
19
|
+
from sage.categories.rings import Rings
|
|
20
|
+
from sage.structure.element cimport Element, Vector
|
|
21
|
+
from sage.structure.richcmp cimport richcmp_item, rich_to_bool
|
|
22
|
+
|
|
23
|
+
from cpython cimport *
|
|
24
|
+
from cpython.object cimport Py_EQ, Py_NE
|
|
25
|
+
|
|
26
|
+
import sage.matrix.matrix_space
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
cdef class Matrix_sparse(matrix.Matrix):
|
|
30
|
+
|
|
31
|
+
cdef bint is_sparse_c(self) noexcept:
|
|
32
|
+
return 1
|
|
33
|
+
|
|
34
|
+
cdef bint is_dense_c(self) noexcept:
|
|
35
|
+
return 0
|
|
36
|
+
|
|
37
|
+
def change_ring(self, ring):
|
|
38
|
+
"""
|
|
39
|
+
Return the matrix obtained by coercing the entries of this matrix
|
|
40
|
+
into the given ring.
|
|
41
|
+
|
|
42
|
+
Always returns a copy (unless ``self`` is immutable, in which case
|
|
43
|
+
returns ``self``).
|
|
44
|
+
|
|
45
|
+
EXAMPLES::
|
|
46
|
+
|
|
47
|
+
sage: x = polygen(ZZ, 'x')
|
|
48
|
+
sage: A = matrix(QQ['x,y'], 2, [0,-1,2*x,-2], sparse=True); A
|
|
49
|
+
[ 0 -1]
|
|
50
|
+
[2*x -2]
|
|
51
|
+
sage: A.change_ring(QQ['x,y,z'])
|
|
52
|
+
[ 0 -1]
|
|
53
|
+
[2*x -2]
|
|
54
|
+
|
|
55
|
+
Subdivisions are preserved when changing rings::
|
|
56
|
+
|
|
57
|
+
sage: A.subdivide([2],[]); A
|
|
58
|
+
[ 0 -1]
|
|
59
|
+
[2*x -2]
|
|
60
|
+
[-------]
|
|
61
|
+
sage: A.change_ring(RR['x,y'])
|
|
62
|
+
[ 0 -1.00000000000000]
|
|
63
|
+
[2.00000000000000*x -2.00000000000000]
|
|
64
|
+
[-------------------------------------]
|
|
65
|
+
"""
|
|
66
|
+
if ring not in Rings():
|
|
67
|
+
raise TypeError("input must be a ring")
|
|
68
|
+
if ring is self._base_ring:
|
|
69
|
+
if self._is_immutable:
|
|
70
|
+
return self
|
|
71
|
+
return self.__copy__()
|
|
72
|
+
|
|
73
|
+
M = sage.matrix.matrix_space.MatrixSpace(ring, self._nrows, self._ncols, sparse=self.is_sparse_c())
|
|
74
|
+
mat = M(self.dict(), coerce=True, copy=False)
|
|
75
|
+
if self._subdivisions is not None:
|
|
76
|
+
mat.subdivide(self.subdivisions())
|
|
77
|
+
return mat
|
|
78
|
+
|
|
79
|
+
def __copy__(self):
|
|
80
|
+
"""
|
|
81
|
+
Return a copy of this matrix. Changing the entries of the copy will
|
|
82
|
+
not change the entries of this matrix.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True); A
|
|
87
|
+
[ 0 -1]
|
|
88
|
+
[ 2 -2]
|
|
89
|
+
sage: B = copy(A); B
|
|
90
|
+
[ 0 -1]
|
|
91
|
+
[ 2 -2]
|
|
92
|
+
sage: B is A
|
|
93
|
+
False
|
|
94
|
+
sage: B[0,0]=10; B
|
|
95
|
+
[10 -1]
|
|
96
|
+
[ 2 -2]
|
|
97
|
+
sage: A
|
|
98
|
+
[ 0 -1]
|
|
99
|
+
[ 2 -2]
|
|
100
|
+
"""
|
|
101
|
+
A = self.new_matrix(entries=self.dict(), coerce=False, copy=False)
|
|
102
|
+
if self._subdivisions is not None:
|
|
103
|
+
A.subdivide(*self.subdivisions())
|
|
104
|
+
return A
|
|
105
|
+
|
|
106
|
+
@cython.boundscheck(False)
|
|
107
|
+
@cython.wraparound(False)
|
|
108
|
+
cdef long _hash_(self) except -1:
|
|
109
|
+
"""
|
|
110
|
+
Return the hash of this matrix.
|
|
111
|
+
|
|
112
|
+
Equal matrices should have equal hashes, even if one is sparse
|
|
113
|
+
and the other is dense. We also ensure that zero matrices hash
|
|
114
|
+
to zero and that scalar matrices have the same hash as the
|
|
115
|
+
scalar.
|
|
116
|
+
|
|
117
|
+
EXAMPLES::
|
|
118
|
+
|
|
119
|
+
sage: m = matrix(2, range(6), sparse=True)
|
|
120
|
+
sage: m.set_immutable()
|
|
121
|
+
sage: hash(m)
|
|
122
|
+
-154991009345361003 # 64-bit
|
|
123
|
+
-2003358827 # 32-bit
|
|
124
|
+
|
|
125
|
+
The sparse and dense hashes should agree::
|
|
126
|
+
|
|
127
|
+
sage: d = m.dense_matrix()
|
|
128
|
+
sage: d.set_immutable()
|
|
129
|
+
sage: hash(d) == hash(m)
|
|
130
|
+
True
|
|
131
|
+
|
|
132
|
+
::
|
|
133
|
+
|
|
134
|
+
sage: A = Matrix(ZZ[['t']], 2, 2, range(4), sparse=True)
|
|
135
|
+
sage: hash(A)
|
|
136
|
+
Traceback (most recent call last):
|
|
137
|
+
...
|
|
138
|
+
TypeError: mutable matrices are unhashable
|
|
139
|
+
sage: A.set_immutable()
|
|
140
|
+
sage: B = A.__copy__(); B.set_immutable()
|
|
141
|
+
sage: hash(A) == hash(B)
|
|
142
|
+
True
|
|
143
|
+
|
|
144
|
+
TESTS::
|
|
145
|
+
|
|
146
|
+
sage: R.<x> = ZZ[]
|
|
147
|
+
sage: M = matrix(R, 10, 20, sparse=True); M.set_immutable()
|
|
148
|
+
sage: hash(M)
|
|
149
|
+
0
|
|
150
|
+
sage: M = matrix(R, 10, 10, x, sparse=True); M.set_immutable()
|
|
151
|
+
sage: hash(M) == hash(x)
|
|
152
|
+
True
|
|
153
|
+
"""
|
|
154
|
+
cdef dict D = self._dict()
|
|
155
|
+
cdef long C[5]
|
|
156
|
+
self.get_hash_constants(C)
|
|
157
|
+
|
|
158
|
+
cdef long h = 0, k, l
|
|
159
|
+
cdef Py_ssize_t i, j
|
|
160
|
+
for ij, x in D.iteritems():
|
|
161
|
+
sig_check()
|
|
162
|
+
i = (<tuple>ij)[0]
|
|
163
|
+
j = (<tuple>ij)[1]
|
|
164
|
+
k = C[0] if i == 0 else C[1] + C[2] * i
|
|
165
|
+
l = C[3] * (i - j) * (i ^ j)
|
|
166
|
+
h += (k ^ l) * hash(x)
|
|
167
|
+
h *= C[4]
|
|
168
|
+
|
|
169
|
+
if h == -1:
|
|
170
|
+
return -2
|
|
171
|
+
return h
|
|
172
|
+
|
|
173
|
+
def _multiply_classical(Matrix_sparse left, Matrix_sparse right):
|
|
174
|
+
"""
|
|
175
|
+
EXAMPLES::
|
|
176
|
+
|
|
177
|
+
sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True)
|
|
178
|
+
sage: type(A)
|
|
179
|
+
<class 'sage.matrix.matrix_generic_sparse.Matrix_generic_sparse'>
|
|
180
|
+
sage: B = matrix(QQ['x,y'], 2, [-1,-1,-2,-2], sparse=True)
|
|
181
|
+
sage: A * B
|
|
182
|
+
[2 2]
|
|
183
|
+
[2 2]
|
|
184
|
+
sage: B * A
|
|
185
|
+
[-2 3]
|
|
186
|
+
[-4 6]
|
|
187
|
+
"""
|
|
188
|
+
cdef Py_ssize_t row, col, row_start, k1, k2, len_left, len_right, a, b
|
|
189
|
+
cdef list left_nonzero = <list> left.nonzero_positions(copy=False, column_order=False)
|
|
190
|
+
cdef list right_nonzero = <list> right.nonzero_positions(copy=False, column_order=True)
|
|
191
|
+
len_left = len(left_nonzero)
|
|
192
|
+
len_right = len(right_nonzero)
|
|
193
|
+
|
|
194
|
+
cdef dict e = {}
|
|
195
|
+
k1 = 0
|
|
196
|
+
while k1 < len_left:
|
|
197
|
+
row_start = k1
|
|
198
|
+
row = get_ij(left_nonzero, row_start, 0)
|
|
199
|
+
k2 = 0
|
|
200
|
+
while k2 < len_right:
|
|
201
|
+
sig_check()
|
|
202
|
+
col = get_ij(right_nonzero, k2, 1)
|
|
203
|
+
s = None
|
|
204
|
+
k1 = row_start
|
|
205
|
+
while (k1 < len_left and get_ij(left_nonzero,k1,0) == row
|
|
206
|
+
and k2 < len_right and get_ij(right_nonzero,k2,1) == col):
|
|
207
|
+
sig_check()
|
|
208
|
+
a = get_ij(left_nonzero, k1, 1)
|
|
209
|
+
b = get_ij(right_nonzero, k2, 0)
|
|
210
|
+
if a == b:
|
|
211
|
+
if s is None:
|
|
212
|
+
s = left.get_unsafe(row,a) * right.get_unsafe(a,col)
|
|
213
|
+
else:
|
|
214
|
+
s += left.get_unsafe(row,a) * right.get_unsafe(a,col)
|
|
215
|
+
k1 += 1
|
|
216
|
+
k2 += 1
|
|
217
|
+
elif a < b:
|
|
218
|
+
k1 += 1
|
|
219
|
+
else:
|
|
220
|
+
k2 += 1
|
|
221
|
+
if s is not None:
|
|
222
|
+
e[row, col] = s
|
|
223
|
+
while k2 < len_right and get_ij(right_nonzero, k2, 1) == col:
|
|
224
|
+
k2 += 1
|
|
225
|
+
while k1 < len_left and get_ij(left_nonzero, k1, 0) == row:
|
|
226
|
+
k1 += 1
|
|
227
|
+
return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
|
|
228
|
+
|
|
229
|
+
def _multiply_classical_with_cache(Matrix_sparse left, Matrix_sparse right):
|
|
230
|
+
"""
|
|
231
|
+
This function computes the locations of the end of the rows/columns
|
|
232
|
+
in the nonzero entries list once O(rows+cols) time and space, then
|
|
233
|
+
uses these values in the inner loops. For large matrices this can
|
|
234
|
+
be a 2x or more speedup, but the matrices can no longer be
|
|
235
|
+
arbitrarily large as the runtime and space requirements are no
|
|
236
|
+
longer functions of the total number of entries only.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: A = matrix(QQ['x,y'], 2, [0,-1,2,-2], sparse=True)
|
|
241
|
+
sage: type(A)
|
|
242
|
+
<class 'sage.matrix.matrix_generic_sparse.Matrix_generic_sparse'>
|
|
243
|
+
sage: B = matrix(QQ['x,y'], 2, [-1,-1,-2,-2], sparse=True)
|
|
244
|
+
sage: A._multiply_classical_with_cache(B)
|
|
245
|
+
[2 2]
|
|
246
|
+
[2 2]
|
|
247
|
+
"""
|
|
248
|
+
cdef Py_ssize_t row, col, row_start, k1, k2, len_left, len_right, a, b, i
|
|
249
|
+
cdef Py_ssize_t* next_row
|
|
250
|
+
cdef Py_ssize_t* next_col
|
|
251
|
+
left_nonzero = left.nonzero_positions(copy=False, column_order=False)
|
|
252
|
+
right_nonzero = right.nonzero_positions(copy=False, column_order=True)
|
|
253
|
+
len_left = len(left_nonzero)
|
|
254
|
+
len_right = len(right_nonzero)
|
|
255
|
+
next_row = <Py_ssize_t *>check_allocarray(left._nrows, sizeof(Py_ssize_t))
|
|
256
|
+
next_col = <Py_ssize_t *>check_allocarray(right._ncols, sizeof(Py_ssize_t))
|
|
257
|
+
|
|
258
|
+
i = len_left - 1
|
|
259
|
+
for row from left._nrows > row >= 0:
|
|
260
|
+
next_row[row] = i + 1
|
|
261
|
+
while i >= 0 and get_ij(left_nonzero,i,0) == row:
|
|
262
|
+
i = i - 1
|
|
263
|
+
i = len_right - 1
|
|
264
|
+
for col from right._ncols > col >= 0:
|
|
265
|
+
next_col[col] = i + 1
|
|
266
|
+
while i >= 0 and get_ij(right_nonzero,i,1) == col:
|
|
267
|
+
i = i - 1
|
|
268
|
+
|
|
269
|
+
e = {}
|
|
270
|
+
k1 = 0
|
|
271
|
+
while k1 < len_left:
|
|
272
|
+
row_start = k1
|
|
273
|
+
row = get_ij(left_nonzero, row_start, 0)
|
|
274
|
+
k2 = 0
|
|
275
|
+
while k2 < len_right:
|
|
276
|
+
sig_check()
|
|
277
|
+
col = get_ij(right_nonzero, k2, 1)
|
|
278
|
+
sum = None
|
|
279
|
+
k1 = row_start
|
|
280
|
+
while k1 < next_row[row] and k2 < next_col[col]:
|
|
281
|
+
sig_check()
|
|
282
|
+
a = get_ij(left_nonzero, k1,1)
|
|
283
|
+
b = get_ij(right_nonzero,k2,0)
|
|
284
|
+
if a == b:
|
|
285
|
+
if sum is None:
|
|
286
|
+
sum = left.get_unsafe(row,a)*right.get_unsafe(a,col)
|
|
287
|
+
else:
|
|
288
|
+
sum = sum + left.get_unsafe(row,a)*right.get_unsafe(a,col)
|
|
289
|
+
k1 = k1 + 1
|
|
290
|
+
k2 = k2 + 1
|
|
291
|
+
elif a < b:
|
|
292
|
+
k1 = k1 + 1
|
|
293
|
+
else:
|
|
294
|
+
k2 = k2 + 1
|
|
295
|
+
if sum is not None:
|
|
296
|
+
e[row, col] = sum
|
|
297
|
+
k2 = next_col[col]
|
|
298
|
+
k1 = next_row[row]
|
|
299
|
+
|
|
300
|
+
sig_free(next_row)
|
|
301
|
+
sig_free(next_col)
|
|
302
|
+
|
|
303
|
+
return left.new_matrix(left._nrows, right._ncols, entries=e, coerce=False, copy=False)
|
|
304
|
+
|
|
305
|
+
cpdef _lmul_(self, Element right):
|
|
306
|
+
"""
|
|
307
|
+
Left scalar multiplication. Internal usage only.
|
|
308
|
+
|
|
309
|
+
INPUT:
|
|
310
|
+
|
|
311
|
+
- ``right`` -- a ring element which must already be in the base ring
|
|
312
|
+
of ``self`` (no coercion done here)
|
|
313
|
+
|
|
314
|
+
OUTPUT: the matrix ``self * right``
|
|
315
|
+
|
|
316
|
+
EXAMPLES::
|
|
317
|
+
|
|
318
|
+
sage: M = Matrix(QQ, 3, 6, range(18), sparse=true); M
|
|
319
|
+
[ 0 1 2 3 4 5]
|
|
320
|
+
[ 6 7 8 9 10 11]
|
|
321
|
+
[12 13 14 15 16 17]
|
|
322
|
+
sage: (2/3)*M
|
|
323
|
+
[ 0 2/3 4/3 2 8/3 10/3]
|
|
324
|
+
[ 4 14/3 16/3 6 20/3 22/3]
|
|
325
|
+
[ 8 26/3 28/3 10 32/3 34/3]
|
|
326
|
+
sage: 7*M
|
|
327
|
+
[ 0 7 14 21 28 35]
|
|
328
|
+
[ 42 49 56 63 70 77]
|
|
329
|
+
[ 84 91 98 105 112 119]
|
|
330
|
+
sage: (1/4)*M
|
|
331
|
+
[ 0 1/4 1/2 3/4 1 5/4]
|
|
332
|
+
[ 3/2 7/4 2 9/4 5/2 11/4]
|
|
333
|
+
[ 3 13/4 7/2 15/4 4 17/4]
|
|
334
|
+
|
|
335
|
+
Really Large Example you would not want to do with normal matrices::
|
|
336
|
+
|
|
337
|
+
sage: M = MatrixSpace(QQ, 100000, 1000000, sparse=True)
|
|
338
|
+
sage: m = M.random_element(density=1/100000000)
|
|
339
|
+
sage: m == (97/42)*(42/97*m)
|
|
340
|
+
True
|
|
341
|
+
"""
|
|
342
|
+
cdef Py_ssize_t k, r, c
|
|
343
|
+
cdef Matrix_sparse M
|
|
344
|
+
nc, nr = self.ncols(), self.nrows()
|
|
345
|
+
M = self.new_matrix(nr, nc, copy=False, coerce=False)
|
|
346
|
+
nz = self.nonzero_positions(copy=False)
|
|
347
|
+
for k from 0 <= k < len(nz):
|
|
348
|
+
r = get_ij(nz, k, 0)
|
|
349
|
+
c = get_ij(nz, k, 1)
|
|
350
|
+
entry = self.get_unsafe(r,c)*right
|
|
351
|
+
M.set_unsafe(r, c, entry)
|
|
352
|
+
return M
|
|
353
|
+
|
|
354
|
+
cdef bint _will_use_strassen(self, matrix0.Matrix right) except -2:
|
|
355
|
+
# never use Strassen for sparse matrix multiply
|
|
356
|
+
return 0
|
|
357
|
+
|
|
358
|
+
def _pickle(self):
|
|
359
|
+
version = -1
|
|
360
|
+
data = self._dict() # dict of all elements
|
|
361
|
+
return data, version
|
|
362
|
+
|
|
363
|
+
def _unpickle_generic(self, data, int version):
|
|
364
|
+
cdef Py_ssize_t i, j
|
|
365
|
+
if version == -1:
|
|
366
|
+
for (i, j), x in data.iteritems():
|
|
367
|
+
self.set_unsafe(i, j, x)
|
|
368
|
+
else:
|
|
369
|
+
raise RuntimeError("unknown matrix version (=%s)" % version)
|
|
370
|
+
|
|
371
|
+
cpdef _richcmp_(self, right, int op):
|
|
372
|
+
"""
|
|
373
|
+
Rich comparison.
|
|
374
|
+
|
|
375
|
+
EXAMPLES::
|
|
376
|
+
|
|
377
|
+
sage: M = matrix({(5,5): 2})
|
|
378
|
+
sage: Mp = matrix({(5,5): 7, (3,1):-2})
|
|
379
|
+
sage: M > Mp
|
|
380
|
+
True
|
|
381
|
+
sage: M == M.transpose()
|
|
382
|
+
True
|
|
383
|
+
sage: M != Mp
|
|
384
|
+
True
|
|
385
|
+
"""
|
|
386
|
+
other = <Matrix_sparse>right
|
|
387
|
+
if op == Py_EQ:
|
|
388
|
+
return self._dict() == other._dict()
|
|
389
|
+
if op == Py_NE:
|
|
390
|
+
return self._dict() != other._dict()
|
|
391
|
+
cdef Py_ssize_t i, j
|
|
392
|
+
# Parents are equal, so dimensions of self and other are equal
|
|
393
|
+
for i in range(self._nrows):
|
|
394
|
+
for j in range(self._ncols):
|
|
395
|
+
lij = self.get_unsafe(i, j)
|
|
396
|
+
rij = other.get_unsafe(i, j)
|
|
397
|
+
r = richcmp_item(lij, rij, op)
|
|
398
|
+
if r is not NotImplemented:
|
|
399
|
+
return bool(r)
|
|
400
|
+
# Matrices are equal
|
|
401
|
+
return rich_to_bool(op, 0)
|
|
402
|
+
|
|
403
|
+
def transpose(self):
|
|
404
|
+
"""
|
|
405
|
+
Return the transpose of ``self``, without changing ``self``.
|
|
406
|
+
|
|
407
|
+
EXAMPLES: We create a matrix, compute its transpose, and note that
|
|
408
|
+
the original matrix is not changed.
|
|
409
|
+
|
|
410
|
+
::
|
|
411
|
+
|
|
412
|
+
sage: M = MatrixSpace(QQ, 2, sparse=True)
|
|
413
|
+
sage: A = M([1,2,3,4]); A
|
|
414
|
+
[1 2]
|
|
415
|
+
[3 4]
|
|
416
|
+
sage: B = A.transpose(); B
|
|
417
|
+
[1 3]
|
|
418
|
+
[2 4]
|
|
419
|
+
|
|
420
|
+
``.T`` is a convenient shortcut for the transpose::
|
|
421
|
+
|
|
422
|
+
sage: A.T
|
|
423
|
+
[1 3]
|
|
424
|
+
[2 4]
|
|
425
|
+
|
|
426
|
+
.. SEEALSO:: :meth:`antitranspose`
|
|
427
|
+
"""
|
|
428
|
+
cdef Matrix_sparse A
|
|
429
|
+
A = self.new_matrix(self._ncols, self._nrows)
|
|
430
|
+
|
|
431
|
+
nz = self.nonzero_positions(copy=False)
|
|
432
|
+
cdef Py_ssize_t i, j, k
|
|
433
|
+
for k from 0 <= k < len(nz):
|
|
434
|
+
i = get_ij(nz, k, 0)
|
|
435
|
+
j = get_ij(nz, k, 1)
|
|
436
|
+
A.set_unsafe(j,i,self.get_unsafe(i,j))
|
|
437
|
+
if self._subdivisions is not None:
|
|
438
|
+
row_divs, col_divs = self.subdivisions()
|
|
439
|
+
A.subdivide(col_divs, row_divs)
|
|
440
|
+
return A
|
|
441
|
+
|
|
442
|
+
def antitranspose(self):
|
|
443
|
+
"""
|
|
444
|
+
Return the antitranspose of ``self``, without changing ``self``.
|
|
445
|
+
|
|
446
|
+
This is the mirror image along the other diagonal.
|
|
447
|
+
|
|
448
|
+
EXAMPLES::
|
|
449
|
+
|
|
450
|
+
sage: M = MatrixSpace(QQ, 2, sparse=True)
|
|
451
|
+
sage: A = M([1,2,3,4]); A
|
|
452
|
+
[1 2]
|
|
453
|
+
[3 4]
|
|
454
|
+
sage: A.antitranspose()
|
|
455
|
+
[4 2]
|
|
456
|
+
[3 1]
|
|
457
|
+
|
|
458
|
+
.. SEEALSO:: :meth:`transpose`
|
|
459
|
+
"""
|
|
460
|
+
cdef Matrix_sparse A
|
|
461
|
+
A = self.new_matrix(self._ncols, self._nrows)
|
|
462
|
+
|
|
463
|
+
nz = self.nonzero_positions(copy=False)
|
|
464
|
+
cdef Py_ssize_t i, j, k
|
|
465
|
+
for k from 0 <= k < len(nz):
|
|
466
|
+
i = get_ij(nz, k, 0)
|
|
467
|
+
j = get_ij(nz, k, 1)
|
|
468
|
+
A.set_unsafe(self._ncols-j-1, self._nrows-i-1,self.get_unsafe(i,j))
|
|
469
|
+
if self._subdivisions is not None:
|
|
470
|
+
row_divs, col_divs = self.subdivisions()
|
|
471
|
+
A.subdivide(list(reversed([self._ncols - t for t in col_divs])),
|
|
472
|
+
list(reversed([self._nrows - t for t in row_divs])))
|
|
473
|
+
return A
|
|
474
|
+
|
|
475
|
+
def _reverse_unsafe(self):
|
|
476
|
+
r"""
|
|
477
|
+
TESTS::
|
|
478
|
+
|
|
479
|
+
sage: m = matrix(QQ, 3, 3, {(2,2): 1}, sparse=True)
|
|
480
|
+
sage: m._reverse_unsafe()
|
|
481
|
+
sage: m
|
|
482
|
+
[1 0 0]
|
|
483
|
+
[0 0 0]
|
|
484
|
+
[0 0 0]
|
|
485
|
+
sage: m = matrix(QQ, 3, 3, {(2,2): 1, (0,0):2}, sparse=True)
|
|
486
|
+
sage: m._reverse_unsafe()
|
|
487
|
+
sage: m
|
|
488
|
+
[1 0 0]
|
|
489
|
+
[0 0 0]
|
|
490
|
+
[0 0 2]
|
|
491
|
+
sage: m = matrix(QQ, 3, 3, {(1,2): 1}, sparse=True)
|
|
492
|
+
sage: m._reverse_unsafe()
|
|
493
|
+
sage: m
|
|
494
|
+
[0 0 0]
|
|
495
|
+
[1 0 0]
|
|
496
|
+
[0 0 0]
|
|
497
|
+
sage: m = matrix(QQ, 3, 3, {(1,1): 1}, sparse=True)
|
|
498
|
+
sage: m._reverse_unsafe()
|
|
499
|
+
sage: m
|
|
500
|
+
[0 0 0]
|
|
501
|
+
[0 1 0]
|
|
502
|
+
[0 0 0]
|
|
503
|
+
"""
|
|
504
|
+
cdef Py_ssize_t i, j, ii, jj
|
|
505
|
+
for i,j in self.nonzero_positions(copy=False):
|
|
506
|
+
ii = self._nrows - i - 1
|
|
507
|
+
jj = self._ncols - j - 1
|
|
508
|
+
if (i > ii or (i == ii and j >= jj)) and self.get_unsafe(ii, jj):
|
|
509
|
+
# already swapped
|
|
510
|
+
continue
|
|
511
|
+
|
|
512
|
+
e1 = self.get_unsafe(i, j)
|
|
513
|
+
e2 = self.get_unsafe(ii, jj)
|
|
514
|
+
self.set_unsafe(i, j, e2)
|
|
515
|
+
self.set_unsafe(ii, jj, e1)
|
|
516
|
+
|
|
517
|
+
def charpoly(self, var='x', **kwds):
|
|
518
|
+
"""
|
|
519
|
+
Return the characteristic polynomial of this matrix.
|
|
520
|
+
|
|
521
|
+
.. NOTE::
|
|
522
|
+
|
|
523
|
+
the generic sparse charpoly implementation in Sage is to
|
|
524
|
+
just compute the charpoly of the corresponding dense
|
|
525
|
+
matrix, so this could use a lot of memory. In particular,
|
|
526
|
+
for this matrix, the charpoly will be computed using a
|
|
527
|
+
dense algorithm.
|
|
528
|
+
|
|
529
|
+
EXAMPLES::
|
|
530
|
+
|
|
531
|
+
sage: A = matrix(ZZ, 4, range(16), sparse=True)
|
|
532
|
+
sage: A.charpoly()
|
|
533
|
+
x^4 - 30*x^3 - 80*x^2
|
|
534
|
+
sage: A.charpoly('y')
|
|
535
|
+
y^4 - 30*y^3 - 80*y^2
|
|
536
|
+
sage: A.charpoly()
|
|
537
|
+
x^4 - 30*x^3 - 80*x^2
|
|
538
|
+
"""
|
|
539
|
+
f = self.fetch('charpoly')
|
|
540
|
+
if f is not None:
|
|
541
|
+
return f.change_variable_name(var)
|
|
542
|
+
f = self.dense_matrix().charpoly(var=var, **kwds)
|
|
543
|
+
self.cache('charpoly', f)
|
|
544
|
+
return f
|
|
545
|
+
|
|
546
|
+
def determinant(self, **kwds):
|
|
547
|
+
"""
|
|
548
|
+
Return the determinant of this matrix.
|
|
549
|
+
|
|
550
|
+
.. NOTE::
|
|
551
|
+
|
|
552
|
+
the generic sparse determinant implementation in Sage is
|
|
553
|
+
to just compute the determinant of the corresponding dense
|
|
554
|
+
matrix, so this could use a lot of memory. In particular,
|
|
555
|
+
for this matrix, the determinant will be computed using a
|
|
556
|
+
dense algorithm.
|
|
557
|
+
|
|
558
|
+
EXAMPLES::
|
|
559
|
+
|
|
560
|
+
sage: A = matrix(ZZ, 4, range(16), sparse=True)
|
|
561
|
+
sage: B = A + identity_matrix(ZZ, 4, sparse=True)
|
|
562
|
+
sage: B.det()
|
|
563
|
+
-49
|
|
564
|
+
"""
|
|
565
|
+
d = self.fetch('det')
|
|
566
|
+
if d is not None:
|
|
567
|
+
return d
|
|
568
|
+
d = self.dense_matrix().determinant(**kwds)
|
|
569
|
+
self.cache('det', d)
|
|
570
|
+
return d
|
|
571
|
+
|
|
572
|
+
def _elementwise_product(self, right):
|
|
573
|
+
r"""
|
|
574
|
+
Return the elementwise product of two sparse
|
|
575
|
+
matrices with identical base rings.
|
|
576
|
+
|
|
577
|
+
This routine assumes that ``self`` and ``right``
|
|
578
|
+
are both matrices, both sparse, with identical
|
|
579
|
+
sizes and with identical base rings. It is
|
|
580
|
+
"unsafe" in the sense that these conditions
|
|
581
|
+
are not checked and no sensible errors are
|
|
582
|
+
raised.
|
|
583
|
+
|
|
584
|
+
This routine is meant to be called from the
|
|
585
|
+
:meth:`~sage.matrix.matrix2.Matrix.elementwise_product`
|
|
586
|
+
method, which will ensure that this routine receives
|
|
587
|
+
proper input. More thorough documentation is provided
|
|
588
|
+
there.
|
|
589
|
+
|
|
590
|
+
EXAMPLES::
|
|
591
|
+
|
|
592
|
+
sage: A = matrix(ZZ, 2, range(6), sparse=True)
|
|
593
|
+
sage: B = matrix(ZZ, 2, [1,0,2,0,3,0], sparse=True)
|
|
594
|
+
sage: A._elementwise_product(B)
|
|
595
|
+
[ 0 0 4]
|
|
596
|
+
[ 0 12 0]
|
|
597
|
+
|
|
598
|
+
AUTHOR:
|
|
599
|
+
|
|
600
|
+
- Rob Beezer (2009-07-14)
|
|
601
|
+
"""
|
|
602
|
+
cdef Py_ssize_t k, r, c
|
|
603
|
+
cdef Matrix_sparse other, prod
|
|
604
|
+
|
|
605
|
+
nc, nr = self.ncols(), self.nrows()
|
|
606
|
+
other = right
|
|
607
|
+
prod = self.new_matrix(nr, nc, copy=False, coerce=False)
|
|
608
|
+
nzleft = self.nonzero_positions(copy=False)
|
|
609
|
+
nzright = other.nonzero_positions(copy=False)
|
|
610
|
+
for k from 0 <= k < len(nzleft):
|
|
611
|
+
r = get_ij(nzleft, k, 0)
|
|
612
|
+
c = get_ij(nzleft, k, 1)
|
|
613
|
+
if (r,c) in nzright:
|
|
614
|
+
entry = self.get_unsafe(r,c)*other.get_unsafe(r,c)
|
|
615
|
+
prod.set_unsafe(r,c,entry)
|
|
616
|
+
return prod
|
|
617
|
+
|
|
618
|
+
def apply_morphism(self, phi):
|
|
619
|
+
"""
|
|
620
|
+
Apply the morphism ``phi`` to the coefficients of this sparse matrix.
|
|
621
|
+
|
|
622
|
+
The resulting matrix is over the codomain of ``phi``.
|
|
623
|
+
|
|
624
|
+
INPUT:
|
|
625
|
+
|
|
626
|
+
- ``phi`` -- a morphism, so ``phi`` is callable and
|
|
627
|
+
``phi.domain()`` and ``phi.codomain()`` are defined. The
|
|
628
|
+
codomain must be a ring.
|
|
629
|
+
|
|
630
|
+
OUTPUT: a matrix over the codomain of ``phi``
|
|
631
|
+
|
|
632
|
+
EXAMPLES::
|
|
633
|
+
|
|
634
|
+
sage: m = matrix(ZZ, 3, range(9), sparse=True)
|
|
635
|
+
sage: phi = ZZ.hom(GF(5))
|
|
636
|
+
sage: m.apply_morphism(phi)
|
|
637
|
+
[0 1 2]
|
|
638
|
+
[3 4 0]
|
|
639
|
+
[1 2 3]
|
|
640
|
+
sage: m.apply_morphism(phi).parent()
|
|
641
|
+
Full MatrixSpace of 3 by 3 sparse matrices
|
|
642
|
+
over Finite Field of size 5
|
|
643
|
+
"""
|
|
644
|
+
R = phi.codomain()
|
|
645
|
+
M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
|
|
646
|
+
self._ncols, sparse=True)
|
|
647
|
+
return M({ij: phi(z) for ij, z in self.dict().iteritems()})
|
|
648
|
+
|
|
649
|
+
def apply_map(self, phi, R=None, sparse=True):
|
|
650
|
+
r"""
|
|
651
|
+
Apply the given map ``phi`` (an arbitrary Python function or callable
|
|
652
|
+
object) to this matrix.
|
|
653
|
+
|
|
654
|
+
If ``R`` is not given, automatically determine the base ring
|
|
655
|
+
of the resulting matrix.
|
|
656
|
+
|
|
657
|
+
INPUT:
|
|
658
|
+
|
|
659
|
+
- ``phi`` -- arbitrary Python function or callable object
|
|
660
|
+
|
|
661
|
+
- ``R`` -- (optional) ring
|
|
662
|
+
|
|
663
|
+
- ``sparse`` -- boolean (default: ``True``); whether to return
|
|
664
|
+
a sparse or a dense matrix
|
|
665
|
+
|
|
666
|
+
OUTPUT: a matrix over ``R``
|
|
667
|
+
|
|
668
|
+
EXAMPLES::
|
|
669
|
+
|
|
670
|
+
sage: m = matrix(ZZ, 10000, {(1,2): 17}, sparse=True)
|
|
671
|
+
|
|
672
|
+
sage: # needs sage.rings.finite_rings
|
|
673
|
+
sage: k.<a> = GF(9)
|
|
674
|
+
sage: f = lambda x: k(x)
|
|
675
|
+
sage: n = m.apply_map(f)
|
|
676
|
+
sage: n.parent()
|
|
677
|
+
Full MatrixSpace of 10000 by 10000 sparse matrices
|
|
678
|
+
over Finite Field in a of size 3^2
|
|
679
|
+
sage: n[1, 2]
|
|
680
|
+
2
|
|
681
|
+
|
|
682
|
+
An example where the codomain is explicitly specified.
|
|
683
|
+
|
|
684
|
+
::
|
|
685
|
+
|
|
686
|
+
sage: n = m.apply_map(lambda x: x%3, GF(3))
|
|
687
|
+
sage: n.parent()
|
|
688
|
+
Full MatrixSpace of 10000 by 10000 sparse matrices
|
|
689
|
+
over Finite Field of size 3
|
|
690
|
+
sage: n[1, 2]
|
|
691
|
+
2
|
|
692
|
+
|
|
693
|
+
If we did not specify the codomain, the resulting matrix in the
|
|
694
|
+
above case ends up over `\ZZ` again::
|
|
695
|
+
|
|
696
|
+
sage: n = m.apply_map(lambda x: x%3)
|
|
697
|
+
sage: n.parent()
|
|
698
|
+
Full MatrixSpace of 10000 by 10000 sparse matrices over Integer Ring
|
|
699
|
+
sage: n[1, 2]
|
|
700
|
+
2
|
|
701
|
+
|
|
702
|
+
If ``self`` is subdivided, the result will be as well::
|
|
703
|
+
|
|
704
|
+
sage: m = matrix(2, 2, [0, 0, 3, 0])
|
|
705
|
+
sage: m.subdivide(None, 1); m
|
|
706
|
+
[0|0]
|
|
707
|
+
[3|0]
|
|
708
|
+
sage: m.apply_map(lambda x: x*x)
|
|
709
|
+
[0|0]
|
|
710
|
+
[9|0]
|
|
711
|
+
|
|
712
|
+
If the map sends zero to a nonzero value, then it may be useful to
|
|
713
|
+
get the result as a dense matrix.
|
|
714
|
+
|
|
715
|
+
::
|
|
716
|
+
|
|
717
|
+
sage: m = matrix(ZZ, 3, 3, [0] * 7 + [1,2], sparse=True); m
|
|
718
|
+
[0 0 0]
|
|
719
|
+
[0 0 0]
|
|
720
|
+
[0 1 2]
|
|
721
|
+
sage: parent(m)
|
|
722
|
+
Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring
|
|
723
|
+
sage: n = m.apply_map(lambda x: x+polygen(QQ), sparse=False); n
|
|
724
|
+
[ x x x]
|
|
725
|
+
[ x x x]
|
|
726
|
+
[ x x + 1 x + 2]
|
|
727
|
+
sage: parent(n)
|
|
728
|
+
Full MatrixSpace of 3 by 3 dense matrices over Univariate Polynomial Ring in x over Rational Field
|
|
729
|
+
|
|
730
|
+
TESTS::
|
|
731
|
+
|
|
732
|
+
sage: m = matrix([], sparse=True)
|
|
733
|
+
sage: m.apply_map(lambda x: x*x) == m
|
|
734
|
+
True
|
|
735
|
+
|
|
736
|
+
sage: m.apply_map(lambda x: x*x, sparse=False).parent()
|
|
737
|
+
Full MatrixSpace of 0 by 0 dense matrices over Integer Ring
|
|
738
|
+
|
|
739
|
+
Check that we do not unnecessarily apply phi to 0 in the sparse case::
|
|
740
|
+
|
|
741
|
+
sage: m = matrix(QQ, 2, 2, range(1, 5), sparse=True)
|
|
742
|
+
sage: m.apply_map(lambda x: 1/x)
|
|
743
|
+
[ 1 1/2]
|
|
744
|
+
[1/3 1/4]
|
|
745
|
+
|
|
746
|
+
Test subdivisions when phi maps 0 to nonzero::
|
|
747
|
+
|
|
748
|
+
sage: m = matrix(2, 2, [0, 0, 3, 0])
|
|
749
|
+
sage: m.subdivide(None, 1); m
|
|
750
|
+
[0|0]
|
|
751
|
+
[3|0]
|
|
752
|
+
sage: m.apply_map(lambda x: x+1)
|
|
753
|
+
[1|1]
|
|
754
|
+
[4|1]
|
|
755
|
+
|
|
756
|
+
When applying a map to a sparse zero matrix, the codomain is determined
|
|
757
|
+
from the image of zero (:issue:`29214`)::
|
|
758
|
+
|
|
759
|
+
sage: matrix(RR, 2, 2, sparse=True).apply_map(floor).base_ring() is ZZ
|
|
760
|
+
True
|
|
761
|
+
"""
|
|
762
|
+
if self._nrows==0 or self._ncols==0:
|
|
763
|
+
if not sparse:
|
|
764
|
+
return self.dense_matrix()
|
|
765
|
+
else:
|
|
766
|
+
return self.__copy__()
|
|
767
|
+
self_dict = self._dict()
|
|
768
|
+
if len(self_dict) < self._nrows * self._ncols:
|
|
769
|
+
zero_res = phi(self.base_ring()(0))
|
|
770
|
+
else:
|
|
771
|
+
zero_res = None
|
|
772
|
+
v = [(ij, phi(z)) for ij,z in self_dict.iteritems()]
|
|
773
|
+
if R is None:
|
|
774
|
+
w = [x for _, x in v]
|
|
775
|
+
if zero_res is not None:
|
|
776
|
+
w.append(zero_res)
|
|
777
|
+
w = sage.structure.sequence.Sequence(w)
|
|
778
|
+
R = w.universe()
|
|
779
|
+
v = {v[i][0]: w[i] for i in range(len(v))}
|
|
780
|
+
else:
|
|
781
|
+
v = dict(v)
|
|
782
|
+
if zero_res is not None and not zero_res.is_zero():
|
|
783
|
+
M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
|
|
784
|
+
self._ncols, sparse=sparse)
|
|
785
|
+
m = M([zero_res] * (self._nrows * self._ncols))
|
|
786
|
+
for i,n in v.items():
|
|
787
|
+
m[i] = n
|
|
788
|
+
if self._subdivisions is not None:
|
|
789
|
+
m.subdivide(*self.subdivisions())
|
|
790
|
+
return m
|
|
791
|
+
|
|
792
|
+
M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
|
|
793
|
+
self._ncols, sparse=sparse)
|
|
794
|
+
m = M(v)
|
|
795
|
+
if self._subdivisions is not None:
|
|
796
|
+
m.subdivide(*self.subdivisions())
|
|
797
|
+
return m
|
|
798
|
+
|
|
799
|
+
def _derivative(self, var=None, R=None):
|
|
800
|
+
"""
|
|
801
|
+
Differentiate with respect to ``var`` by differentiating each element
|
|
802
|
+
with respect to ``var``.
|
|
803
|
+
|
|
804
|
+
.. SEEALSO::
|
|
805
|
+
|
|
806
|
+
:meth:`derivative`
|
|
807
|
+
|
|
808
|
+
EXAMPLES::
|
|
809
|
+
|
|
810
|
+
sage: m = matrix(2, [x^i for i in range(4)], sparse=True) # needs sage.symbolic
|
|
811
|
+
sage: m._derivative(x) # needs sage.symbolic
|
|
812
|
+
[ 0 1]
|
|
813
|
+
[ 2*x 3*x^2]
|
|
814
|
+
|
|
815
|
+
TESTS:
|
|
816
|
+
|
|
817
|
+
Verify that :issue:`15067` is fixed::
|
|
818
|
+
|
|
819
|
+
sage: m = matrix(3, 3, {(1, 1): 2, (0,2): 5})
|
|
820
|
+
sage: derivative(m, x) # needs sage.symbolic
|
|
821
|
+
[0 0 0]
|
|
822
|
+
[0 0 0]
|
|
823
|
+
[0 0 0]
|
|
824
|
+
"""
|
|
825
|
+
# We would just use apply_map, except that Cython does not
|
|
826
|
+
# allow lambda functions
|
|
827
|
+
|
|
828
|
+
if self._nrows==0 or self._ncols==0:
|
|
829
|
+
return self.__copy__()
|
|
830
|
+
v = [(ij, sage.calculus.functional.derivative(z, var)) for ij, z in self.dict().iteritems()]
|
|
831
|
+
if R is None:
|
|
832
|
+
w = [x for _, x in v]
|
|
833
|
+
w = sage.structure.sequence.Sequence(w)
|
|
834
|
+
R = w.universe()
|
|
835
|
+
v = {v[i][0]: w[i] for i in range(len(v))}
|
|
836
|
+
else:
|
|
837
|
+
v = dict(v)
|
|
838
|
+
M = sage.matrix.matrix_space.MatrixSpace(R, self._nrows,
|
|
839
|
+
self._ncols, sparse=True)
|
|
840
|
+
return M(v)
|
|
841
|
+
|
|
842
|
+
def density(self):
|
|
843
|
+
"""
|
|
844
|
+
Return the density of the matrix.
|
|
845
|
+
|
|
846
|
+
By density we understand the ratio of the number of nonzero
|
|
847
|
+
positions and the number ``self.nrows() * self.ncols()``,
|
|
848
|
+
i.e. the number of possible nonzero positions.
|
|
849
|
+
|
|
850
|
+
EXAMPLES::
|
|
851
|
+
|
|
852
|
+
sage: a = matrix([[],[],[],[]], sparse=True); a.density()
|
|
853
|
+
0
|
|
854
|
+
sage: a = matrix(5000,5000,{(1,2): 1}); a.density()
|
|
855
|
+
1/25000000
|
|
856
|
+
"""
|
|
857
|
+
nr = self.nrows()
|
|
858
|
+
nc = self.ncols()
|
|
859
|
+
if nc == 0 or nr == 0:
|
|
860
|
+
return 0
|
|
861
|
+
from sage.rings.rational_field import QQ
|
|
862
|
+
return QQ(len(self.nonzero_positions(copy=False))) / (nr * nc)
|
|
863
|
+
|
|
864
|
+
def matrix_from_rows_and_columns(self, rows, columns):
|
|
865
|
+
"""
|
|
866
|
+
Return the matrix constructed from ``self`` from the given rows and
|
|
867
|
+
columns.
|
|
868
|
+
|
|
869
|
+
EXAMPLES::
|
|
870
|
+
|
|
871
|
+
sage: M = MatrixSpace(Integers(8),3,3, sparse=True)
|
|
872
|
+
sage: A = M(range(9)); A
|
|
873
|
+
[0 1 2]
|
|
874
|
+
[3 4 5]
|
|
875
|
+
[6 7 0]
|
|
876
|
+
sage: A.matrix_from_rows_and_columns([1], [0,2])
|
|
877
|
+
[3 5]
|
|
878
|
+
sage: A.matrix_from_rows_and_columns([1,2], [1,2])
|
|
879
|
+
[4 5]
|
|
880
|
+
[7 0]
|
|
881
|
+
|
|
882
|
+
Note that row and column indices can be reordered or repeated::
|
|
883
|
+
|
|
884
|
+
sage: A.matrix_from_rows_and_columns([2,1], [2,1])
|
|
885
|
+
[0 7]
|
|
886
|
+
[5 4]
|
|
887
|
+
|
|
888
|
+
For example here we take from row 1 columns 2 then 0 twice, and do
|
|
889
|
+
this 3 times.
|
|
890
|
+
|
|
891
|
+
::
|
|
892
|
+
|
|
893
|
+
sage: A.matrix_from_rows_and_columns([1,1,1],[2,0,0])
|
|
894
|
+
[5 3 3]
|
|
895
|
+
[5 3 3]
|
|
896
|
+
[5 3 3]
|
|
897
|
+
|
|
898
|
+
We can efficiently extract large submatrices::
|
|
899
|
+
|
|
900
|
+
sage: A = random_matrix(ZZ, 100000, density=.00005, sparse=True) # long time (4s on sage.math, 2012)
|
|
901
|
+
sage: B = A[50000:,:50000] # long time
|
|
902
|
+
sage: count = 0
|
|
903
|
+
sage: for i, j in A.nonzero_positions(): # long time
|
|
904
|
+
....: if i >= 50000 and j < 50000:
|
|
905
|
+
....: assert B[i-50000, j] == A[i, j]
|
|
906
|
+
....: count += 1
|
|
907
|
+
sage: count == sum(1 for _ in B.nonzero_positions()) # long time
|
|
908
|
+
True
|
|
909
|
+
|
|
910
|
+
We must pass in a list of indices::
|
|
911
|
+
|
|
912
|
+
sage: A = random_matrix(ZZ,100,density=.02,sparse=True)
|
|
913
|
+
sage: A.matrix_from_rows_and_columns(1,[2,3])
|
|
914
|
+
Traceback (most recent call last):
|
|
915
|
+
...
|
|
916
|
+
TypeError: 'sage.rings.integer.Integer' object is not iterable
|
|
917
|
+
|
|
918
|
+
sage: A.matrix_from_rows_and_columns([1,2],3)
|
|
919
|
+
Traceback (most recent call last):
|
|
920
|
+
...
|
|
921
|
+
TypeError: 'sage.rings.integer.Integer' object is not iterable
|
|
922
|
+
|
|
923
|
+
AUTHORS:
|
|
924
|
+
|
|
925
|
+
- Jaap Spies (2006-02-18)
|
|
926
|
+
|
|
927
|
+
- Didier Deshommes: some Pyrex speedups implemented
|
|
928
|
+
|
|
929
|
+
- Jason Grout: sparse matrix optimizations
|
|
930
|
+
"""
|
|
931
|
+
if not isinstance(rows, (list, tuple)):
|
|
932
|
+
rows = list(rows)
|
|
933
|
+
|
|
934
|
+
if not isinstance(columns, (list, tuple)):
|
|
935
|
+
columns = list(columns)
|
|
936
|
+
|
|
937
|
+
cdef Py_ssize_t nrows, ncols, k, i, j
|
|
938
|
+
|
|
939
|
+
ncols = len(columns)
|
|
940
|
+
nrows = len(rows)
|
|
941
|
+
cdef Matrix_sparse A = self.new_matrix(nrows=nrows, ncols=ncols)
|
|
942
|
+
|
|
943
|
+
tmp = [el for el in columns if 0 <= el < self._ncols]
|
|
944
|
+
columns = tmp
|
|
945
|
+
if ncols != len(columns):
|
|
946
|
+
raise IndexError("column index out of range")
|
|
947
|
+
|
|
948
|
+
tmp = [el for el in rows if 0 <= el < self._nrows]
|
|
949
|
+
rows = tmp
|
|
950
|
+
if nrows != len(rows):
|
|
951
|
+
raise IndexError("row index out of range")
|
|
952
|
+
|
|
953
|
+
row_map = {}
|
|
954
|
+
for new_row, old_row in enumerate(rows):
|
|
955
|
+
if old_row in row_map:
|
|
956
|
+
row_map[old_row].append(new_row)
|
|
957
|
+
else:
|
|
958
|
+
row_map[old_row] = [new_row]
|
|
959
|
+
|
|
960
|
+
col_map = {}
|
|
961
|
+
for new_col, old_col in enumerate(columns):
|
|
962
|
+
if old_col in col_map:
|
|
963
|
+
col_map[old_col].append(new_col)
|
|
964
|
+
else:
|
|
965
|
+
col_map[old_col] = [new_col]
|
|
966
|
+
|
|
967
|
+
nz = self.nonzero_positions(copy=False)
|
|
968
|
+
for k in range(len(nz)):
|
|
969
|
+
i = get_ij(nz, k, 0)
|
|
970
|
+
j = get_ij(nz, k, 1)
|
|
971
|
+
if i in row_map and j in col_map:
|
|
972
|
+
entry = self.get_unsafe(i, j)
|
|
973
|
+
for new_row in row_map[i]:
|
|
974
|
+
for new_col in col_map[j]:
|
|
975
|
+
A.set_unsafe(new_row, new_col, entry)
|
|
976
|
+
return A
|
|
977
|
+
|
|
978
|
+
cdef _stack_impl(self, bottom):
|
|
979
|
+
r"""
|
|
980
|
+
Stack ``self`` on top of ``bottom``::
|
|
981
|
+
|
|
982
|
+
[ self ]
|
|
983
|
+
[ bottom ]
|
|
984
|
+
|
|
985
|
+
EXAMPLES::
|
|
986
|
+
|
|
987
|
+
sage: M = Matrix(QQ, 2, 3, range(6), sparse=True)
|
|
988
|
+
sage: N = Matrix(QQ, 1, 3, [10,11,12], sparse=True)
|
|
989
|
+
sage: M.stack(N)
|
|
990
|
+
[ 0 1 2]
|
|
991
|
+
[ 3 4 5]
|
|
992
|
+
[10 11 12]
|
|
993
|
+
|
|
994
|
+
A vector may be stacked below a matrix. ::
|
|
995
|
+
|
|
996
|
+
sage: A = matrix(QQ, 2, 5, range(10), sparse=True)
|
|
997
|
+
sage: v = vector(QQ, 5, range(5), sparse=True)
|
|
998
|
+
sage: A.stack(v)
|
|
999
|
+
[0 1 2 3 4]
|
|
1000
|
+
[5 6 7 8 9]
|
|
1001
|
+
[0 1 2 3 4]
|
|
1002
|
+
|
|
1003
|
+
The ``subdivide`` option will add a natural subdivision between
|
|
1004
|
+
``self`` and ``other``. For more details about how subdivisions
|
|
1005
|
+
are managed when stacking, see
|
|
1006
|
+
:meth:`sage.matrix.matrix1.Matrix.stack`. ::
|
|
1007
|
+
|
|
1008
|
+
sage: A = matrix(ZZ, 3, 4, range(12), sparse=True)
|
|
1009
|
+
sage: B = matrix(ZZ, 2, 4, range(8), sparse=True)
|
|
1010
|
+
sage: A.stack(B, subdivide=True)
|
|
1011
|
+
[ 0 1 2 3]
|
|
1012
|
+
[ 4 5 6 7]
|
|
1013
|
+
[ 8 9 10 11]
|
|
1014
|
+
[-----------]
|
|
1015
|
+
[ 0 1 2 3]
|
|
1016
|
+
[ 4 5 6 7]
|
|
1017
|
+
|
|
1018
|
+
TESTS:
|
|
1019
|
+
|
|
1020
|
+
One can stack matrices over different rings (:issue:`16399`). ::
|
|
1021
|
+
|
|
1022
|
+
sage: M = Matrix(ZZ, 2, 3, range(6), sparse=True)
|
|
1023
|
+
sage: N = Matrix(QQ, 1, 3, [10,11,12], sparse=True)
|
|
1024
|
+
sage: M.stack(N)
|
|
1025
|
+
[ 0 1 2]
|
|
1026
|
+
[ 3 4 5]
|
|
1027
|
+
[10 11 12]
|
|
1028
|
+
sage: N.stack(M)
|
|
1029
|
+
[10 11 12]
|
|
1030
|
+
[ 0 1 2]
|
|
1031
|
+
[ 3 4 5]
|
|
1032
|
+
sage: M2 = Matrix(ZZ['x'], 2, 3, range(6), sparse=True)
|
|
1033
|
+
sage: N.stack(M2)
|
|
1034
|
+
[10 11 12]
|
|
1035
|
+
[ 0 1 2]
|
|
1036
|
+
[ 3 4 5]
|
|
1037
|
+
"""
|
|
1038
|
+
cdef Matrix_sparse other = <Matrix_sparse>bottom
|
|
1039
|
+
cdef Matrix_sparse Z
|
|
1040
|
+
Z = self.new_matrix(nrows=self._nrows + other._nrows, ncols=self._ncols)
|
|
1041
|
+
|
|
1042
|
+
for i, j in self.nonzero_positions(copy=False):
|
|
1043
|
+
Z.set_unsafe(i, j, self.get_unsafe(i,j))
|
|
1044
|
+
for i, j in other.nonzero_positions(copy=False):
|
|
1045
|
+
Z.set_unsafe(i + self._nrows, j, other.get_unsafe(i,j))
|
|
1046
|
+
|
|
1047
|
+
return Z
|
|
1048
|
+
|
|
1049
|
+
def augment(self, right, subdivide=False):
|
|
1050
|
+
r"""
|
|
1051
|
+
Return the augmented matrix of the form::
|
|
1052
|
+
|
|
1053
|
+
[self | right].
|
|
1054
|
+
|
|
1055
|
+
EXAMPLES::
|
|
1056
|
+
|
|
1057
|
+
sage: M = MatrixSpace(QQ, 2, 2, sparse=True)
|
|
1058
|
+
sage: A = M([1,2, 3,4])
|
|
1059
|
+
sage: A
|
|
1060
|
+
[1 2]
|
|
1061
|
+
[3 4]
|
|
1062
|
+
sage: N = MatrixSpace(QQ, 2, 1, sparse=True)
|
|
1063
|
+
sage: B = N([9,8])
|
|
1064
|
+
sage: B
|
|
1065
|
+
[9]
|
|
1066
|
+
[8]
|
|
1067
|
+
sage: A.augment(B)
|
|
1068
|
+
[1 2 9]
|
|
1069
|
+
[3 4 8]
|
|
1070
|
+
sage: B.augment(A)
|
|
1071
|
+
[9 1 2]
|
|
1072
|
+
[8 3 4]
|
|
1073
|
+
|
|
1074
|
+
A vector may be augmented to a matrix. ::
|
|
1075
|
+
|
|
1076
|
+
sage: A = matrix(QQ, 3, 4, range(12), sparse=True)
|
|
1077
|
+
sage: v = vector(QQ, 3, range(3), sparse=True)
|
|
1078
|
+
sage: A.augment(v)
|
|
1079
|
+
[ 0 1 2 3 0]
|
|
1080
|
+
[ 4 5 6 7 1]
|
|
1081
|
+
[ 8 9 10 11 2]
|
|
1082
|
+
|
|
1083
|
+
The ``subdivide`` option will add a natural subdivision between
|
|
1084
|
+
``self`` and ``right``. For more details about how subdivisions
|
|
1085
|
+
are managed when augmenting, see
|
|
1086
|
+
:meth:`sage.matrix.matrix1.Matrix.augment`. ::
|
|
1087
|
+
|
|
1088
|
+
sage: A = matrix(QQ, 3, 5, range(15), sparse=True)
|
|
1089
|
+
sage: B = matrix(QQ, 3, 3, range(9), sparse=True)
|
|
1090
|
+
sage: A.augment(B, subdivide=True)
|
|
1091
|
+
[ 0 1 2 3 4| 0 1 2]
|
|
1092
|
+
[ 5 6 7 8 9| 3 4 5]
|
|
1093
|
+
[10 11 12 13 14| 6 7 8]
|
|
1094
|
+
|
|
1095
|
+
TESTS:
|
|
1096
|
+
|
|
1097
|
+
Verify that :issue:`12689` is fixed::
|
|
1098
|
+
|
|
1099
|
+
sage: A = identity_matrix(QQ, 2, sparse=True)
|
|
1100
|
+
sage: B = identity_matrix(ZZ, 2, sparse=True)
|
|
1101
|
+
sage: A.augment(B)
|
|
1102
|
+
[1 0 1 0]
|
|
1103
|
+
[0 1 0 1]
|
|
1104
|
+
"""
|
|
1105
|
+
if not isinstance(right, matrix.Matrix):
|
|
1106
|
+
if hasattr(right, '_vector_'):
|
|
1107
|
+
right = right.column()
|
|
1108
|
+
else:
|
|
1109
|
+
raise TypeError("right must be a matrix")
|
|
1110
|
+
|
|
1111
|
+
if not (self._base_ring is right.base_ring()):
|
|
1112
|
+
right = right.change_ring(self._base_ring)
|
|
1113
|
+
|
|
1114
|
+
cdef Matrix_sparse other = right.sparse_matrix()
|
|
1115
|
+
|
|
1116
|
+
if self._nrows != other._nrows:
|
|
1117
|
+
raise TypeError("number of rows must be the same")
|
|
1118
|
+
|
|
1119
|
+
cdef Matrix_sparse Z
|
|
1120
|
+
Z = self.new_matrix(ncols = self._ncols + other._ncols)
|
|
1121
|
+
for i, j in self.nonzero_positions(copy=False):
|
|
1122
|
+
Z.set_unsafe(i, j, self.get_unsafe(i,j))
|
|
1123
|
+
for i, j in other.nonzero_positions(copy=False):
|
|
1124
|
+
Z.set_unsafe(i, j + self._ncols, other.get_unsafe(i,j))
|
|
1125
|
+
if subdivide:
|
|
1126
|
+
Z._subdivide_on_augment(self, other)
|
|
1127
|
+
return Z
|
|
1128
|
+
|
|
1129
|
+
cdef _vector_times_matrix_(self, Vector v):
|
|
1130
|
+
"""
|
|
1131
|
+
Return the vector times matrix product.
|
|
1132
|
+
|
|
1133
|
+
INPUT:
|
|
1134
|
+
|
|
1135
|
+
- ``v`` -- a free module element
|
|
1136
|
+
|
|
1137
|
+
OUTPUT: the vector times matrix product ``v*A``
|
|
1138
|
+
|
|
1139
|
+
EXAMPLES::
|
|
1140
|
+
|
|
1141
|
+
sage: v = FreeModule(ZZ, 3)([1, 2, 3])
|
|
1142
|
+
sage: m = matrix(QQ, 3, 4, range(12), sparse=True)
|
|
1143
|
+
sage: v * m
|
|
1144
|
+
(32, 38, 44, 50)
|
|
1145
|
+
|
|
1146
|
+
TESTS::
|
|
1147
|
+
|
|
1148
|
+
sage: (v * m).is_sparse()
|
|
1149
|
+
True
|
|
1150
|
+
sage: (v * m).parent() is m.row(0).parent()
|
|
1151
|
+
True
|
|
1152
|
+
"""
|
|
1153
|
+
cdef Py_ssize_t i, j
|
|
1154
|
+
if self._nrows != v._degree:
|
|
1155
|
+
raise ArithmeticError("number of rows of matrix must equal degree of vector")
|
|
1156
|
+
parent = self.row_ambient_module(base_ring=None, sparse=v.is_sparse_c())
|
|
1157
|
+
s = parent.zero_vector()
|
|
1158
|
+
for (i, j), a in self._dict().iteritems():
|
|
1159
|
+
s[j] += v[i] * a
|
|
1160
|
+
return s
|
|
1161
|
+
|
|
1162
|
+
cdef _matrix_times_vector_(self, Vector v):
|
|
1163
|
+
"""
|
|
1164
|
+
Return the matrix times vector product.
|
|
1165
|
+
|
|
1166
|
+
INPUT:
|
|
1167
|
+
|
|
1168
|
+
- ``v`` -- a free module element
|
|
1169
|
+
|
|
1170
|
+
OUTPUT: the matrix times vector product ``A*v``
|
|
1171
|
+
|
|
1172
|
+
EXAMPLES::
|
|
1173
|
+
|
|
1174
|
+
sage: v = FreeModule(ZZ, 3)([1, 2, 3])
|
|
1175
|
+
sage: m = matrix(QQ, 4, 3, range(12), sparse=True)
|
|
1176
|
+
sage: m * v
|
|
1177
|
+
(8, 26, 44, 62)
|
|
1178
|
+
|
|
1179
|
+
TESTS::
|
|
1180
|
+
|
|
1181
|
+
sage: (m * v).is_sparse()
|
|
1182
|
+
True
|
|
1183
|
+
sage: (m * v).parent() is m.column(0).parent()
|
|
1184
|
+
True
|
|
1185
|
+
|
|
1186
|
+
Check that the bug in :issue:`13854` has been fixed::
|
|
1187
|
+
|
|
1188
|
+
sage: # needs sage.combinat sage.libs.singular
|
|
1189
|
+
sage: A.<x,y> = FreeAlgebra(QQ, 2)
|
|
1190
|
+
sage: P.<x,y> = A.g_algebra(relations={y*x: -x*y}, order='lex')
|
|
1191
|
+
sage: M = Matrix([[x]], sparse=True)
|
|
1192
|
+
sage: w = vector([y])
|
|
1193
|
+
doctest:...: UserWarning: You are constructing a free module
|
|
1194
|
+
over a noncommutative ring. Sage does not have a concept
|
|
1195
|
+
of left/right and both sided modules, so be careful.
|
|
1196
|
+
It's also not guaranteed that all multiplications are
|
|
1197
|
+
done from the right side.
|
|
1198
|
+
doctest:...: UserWarning: You are constructing a free module
|
|
1199
|
+
over a noncommutative ring. Sage does not have a concept
|
|
1200
|
+
of left/right and both sided modules, so be careful.
|
|
1201
|
+
It's also not guaranteed that all multiplications are
|
|
1202
|
+
done from the right side.
|
|
1203
|
+
sage: M*w
|
|
1204
|
+
(x*y)
|
|
1205
|
+
"""
|
|
1206
|
+
cdef Py_ssize_t i, j
|
|
1207
|
+
if self._ncols != v._degree:
|
|
1208
|
+
raise ArithmeticError("number of columns of matrix must equal degree of vector")
|
|
1209
|
+
parent = self.column_ambient_module(base_ring=None, sparse=v.is_sparse_c())
|
|
1210
|
+
s = parent.zero_vector()
|
|
1211
|
+
for (i, j), a in self._dict().iteritems():
|
|
1212
|
+
s[i] += a * v[j]
|
|
1213
|
+
return s
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
@cython.boundscheck(False)
|
|
1217
|
+
@cython.wraparound(False)
|
|
1218
|
+
# Return v[i][j] where v is a list of tuples.
|
|
1219
|
+
# No checking is done, make sure you feed it valid input!
|
|
1220
|
+
cdef inline Py_ssize_t get_ij(v, Py_ssize_t i, Py_ssize_t j) noexcept:
|
|
1221
|
+
t = (<list>v)[i]
|
|
1222
|
+
return (<tuple>t)[j]
|