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
sage/matrix/benchmark.py
ADDED
|
@@ -0,0 +1,1258 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.flint
|
|
3
|
+
"""
|
|
4
|
+
Benchmarks for matrices
|
|
5
|
+
|
|
6
|
+
This file has many functions for computing timing benchmarks
|
|
7
|
+
of various methods for random matrices with given bounds for
|
|
8
|
+
the entries. The systems supported are Sage and Magma.
|
|
9
|
+
|
|
10
|
+
The basic command syntax is as follows::
|
|
11
|
+
|
|
12
|
+
sage: import sage.matrix.benchmark as b
|
|
13
|
+
sage: print("starting"); import sys; sys.stdout.flush(); b.report([b.det_ZZ], 'Test', systems=['sage'])
|
|
14
|
+
starting...
|
|
15
|
+
======================================================================
|
|
16
|
+
Test
|
|
17
|
+
======================================================================
|
|
18
|
+
...
|
|
19
|
+
======================================================================
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import sys
|
|
23
|
+
|
|
24
|
+
from sage.matrix.constructor import Matrix, random_matrix
|
|
25
|
+
from sage.misc.lazy_import import lazy_import
|
|
26
|
+
from sage.misc.timing import cputime
|
|
27
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
28
|
+
from sage.rings.integer_ring import ZZ
|
|
29
|
+
from sage.rings.rational_field import QQ
|
|
30
|
+
|
|
31
|
+
if sys.platform != 'win32':
|
|
32
|
+
from cysignals.alarm import AlarmInterrupt, alarm, cancel_alarm
|
|
33
|
+
|
|
34
|
+
lazy_import('sage.interfaces.magma', 'magma')
|
|
35
|
+
|
|
36
|
+
verbose = False
|
|
37
|
+
|
|
38
|
+
timeout = 60
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def report(F, title, systems=['sage', 'magma'], **kwds):
|
|
42
|
+
"""
|
|
43
|
+
Run benchmarks with default arguments for each function in the list F.
|
|
44
|
+
|
|
45
|
+
INPUT:
|
|
46
|
+
|
|
47
|
+
- ``F`` -- list of callables used for benchmarking
|
|
48
|
+
- ``title`` -- string describing this report
|
|
49
|
+
- ``systems`` -- list of systems (supported entries are 'sage' and 'magma')
|
|
50
|
+
- ``**kwds`` -- keyword arguments passed to all functions in ``F``
|
|
51
|
+
|
|
52
|
+
EXAMPLES::
|
|
53
|
+
|
|
54
|
+
sage: import sage.matrix.benchmark as b
|
|
55
|
+
sage: print("starting"); import sys; sys.stdout.flush(); b.report([b.det_ZZ], 'Test', systems=['sage'])
|
|
56
|
+
starting...
|
|
57
|
+
======================================================================
|
|
58
|
+
Test
|
|
59
|
+
======================================================================
|
|
60
|
+
...
|
|
61
|
+
======================================================================
|
|
62
|
+
"""
|
|
63
|
+
import os
|
|
64
|
+
if len(systems) > 2:
|
|
65
|
+
raise NotImplementedError("at most two systems ('sage' or 'magma')")
|
|
66
|
+
print('=' * 70)
|
|
67
|
+
print(' ' * 10 + title)
|
|
68
|
+
print('=' * 70)
|
|
69
|
+
os.system('uname -a')
|
|
70
|
+
print('\n')
|
|
71
|
+
for f in F:
|
|
72
|
+
print("-"*70)
|
|
73
|
+
print(f.__doc__.strip())
|
|
74
|
+
print(('%15s' * len(systems)) % tuple(systems))
|
|
75
|
+
w = []
|
|
76
|
+
for s in systems:
|
|
77
|
+
alarm(timeout)
|
|
78
|
+
try:
|
|
79
|
+
t = f(system=s, **kwds)
|
|
80
|
+
except AlarmInterrupt:
|
|
81
|
+
t = -timeout
|
|
82
|
+
cancel_alarm()
|
|
83
|
+
w.append(float(t))
|
|
84
|
+
if len(w) > 1:
|
|
85
|
+
if w[1] == 0:
|
|
86
|
+
w.append(0.0)
|
|
87
|
+
else:
|
|
88
|
+
w.append(w[0]/w[1])
|
|
89
|
+
|
|
90
|
+
w = tuple(w)
|
|
91
|
+
print(('%15.3f'*len(w)) % w)
|
|
92
|
+
print('=' * 70)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
#######################################################################
|
|
96
|
+
# Dense Benchmarks over ZZ
|
|
97
|
+
#######################################################################
|
|
98
|
+
|
|
99
|
+
def report_ZZ(**kwds):
|
|
100
|
+
"""
|
|
101
|
+
Reports all the benchmarks for integer matrices and few
|
|
102
|
+
rational matrices.
|
|
103
|
+
|
|
104
|
+
INPUT:
|
|
105
|
+
|
|
106
|
+
- ``**kwds`` -- passed through to :func:`report`
|
|
107
|
+
|
|
108
|
+
EXAMPLES::
|
|
109
|
+
|
|
110
|
+
sage: import sage.matrix.benchmark as b
|
|
111
|
+
sage: print("starting"); import sys; sys.stdout.flush(); b.report_ZZ(systems=['sage']) # long time (15s on sage.math, 2012)
|
|
112
|
+
starting...
|
|
113
|
+
======================================================================
|
|
114
|
+
Dense benchmarks over ZZ
|
|
115
|
+
======================================================================
|
|
116
|
+
...
|
|
117
|
+
======================================================================
|
|
118
|
+
"""
|
|
119
|
+
F = [vecmat_ZZ, rank_ZZ, rank2_ZZ, charpoly_ZZ, smithform_ZZ,
|
|
120
|
+
det_ZZ, det_QQ, matrix_multiply_ZZ, matrix_add_ZZ,
|
|
121
|
+
matrix_add_ZZ_2,
|
|
122
|
+
nullspace_ZZ]
|
|
123
|
+
|
|
124
|
+
title = 'Dense benchmarks over ZZ'
|
|
125
|
+
report(F, title, **kwds)
|
|
126
|
+
|
|
127
|
+
# Integer Nullspace
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def nullspace_ZZ(n=200, min=0, max=2**32, system='sage'):
|
|
131
|
+
"""
|
|
132
|
+
Nullspace over ZZ:
|
|
133
|
+
Given a n+1 x n matrix over ZZ with random entries
|
|
134
|
+
between min and max, compute the nullspace.
|
|
135
|
+
|
|
136
|
+
INPUT:
|
|
137
|
+
|
|
138
|
+
- ``n`` -- matrix dimension (default: ``200``)
|
|
139
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
140
|
+
- ``max`` -- maximal value for entries of matrix (default: ``2**32``)
|
|
141
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
142
|
+
|
|
143
|
+
EXAMPLES::
|
|
144
|
+
|
|
145
|
+
sage: import sage.matrix.benchmark as b
|
|
146
|
+
sage: ts = b.nullspace_ZZ(200)
|
|
147
|
+
sage: tm = b.nullspace_ZZ(200, system='magma') # optional - magma
|
|
148
|
+
"""
|
|
149
|
+
if system == 'sage':
|
|
150
|
+
A = random_matrix(ZZ, n+1, n, x=min, y=max+1).change_ring(QQ)
|
|
151
|
+
t = cputime()
|
|
152
|
+
v = A.kernel()
|
|
153
|
+
return cputime(t)
|
|
154
|
+
elif system == 'magma':
|
|
155
|
+
code = """
|
|
156
|
+
n := %s;
|
|
157
|
+
A := RMatrixSpace(RationalField(), n+1,n)![Random(%s,%s) : i in [1..n*(n+1)]];
|
|
158
|
+
t := Cputime();
|
|
159
|
+
K := Kernel(A);
|
|
160
|
+
s := Cputime(t);
|
|
161
|
+
""" % (n,min,max)
|
|
162
|
+
if verbose:
|
|
163
|
+
print(code)
|
|
164
|
+
magma.eval(code)
|
|
165
|
+
return float(magma.eval('s'))
|
|
166
|
+
else:
|
|
167
|
+
raise ValueError('unknown system "%s"' % system)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def charpoly_ZZ(n=100, min=0, max=9, system='sage'):
|
|
171
|
+
"""
|
|
172
|
+
Characteristic polynomial over ZZ:
|
|
173
|
+
Given a n x n matrix over ZZ with random entries between min and
|
|
174
|
+
max, compute the charpoly.
|
|
175
|
+
|
|
176
|
+
INPUT:
|
|
177
|
+
|
|
178
|
+
- ``n`` -- matrix dimension (default: ``100``)
|
|
179
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
180
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
181
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
182
|
+
|
|
183
|
+
EXAMPLES::
|
|
184
|
+
|
|
185
|
+
sage: import sage.matrix.benchmark as b
|
|
186
|
+
sage: ts = b.charpoly_ZZ(100)
|
|
187
|
+
sage: tm = b.charpoly_ZZ(100, system='magma') # optional - magma
|
|
188
|
+
"""
|
|
189
|
+
if system == 'sage':
|
|
190
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
191
|
+
t = cputime()
|
|
192
|
+
v = A.charpoly()
|
|
193
|
+
return cputime(t)
|
|
194
|
+
elif system == 'magma':
|
|
195
|
+
code = """
|
|
196
|
+
n := %s;
|
|
197
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(%s,%s) : i in [1..n^2]];
|
|
198
|
+
t := Cputime();
|
|
199
|
+
K := CharacteristicPolynomial(A);
|
|
200
|
+
s := Cputime(t);
|
|
201
|
+
""" % (n,min,max)
|
|
202
|
+
if verbose:
|
|
203
|
+
print(code)
|
|
204
|
+
magma.eval(code)
|
|
205
|
+
return float(magma.eval('s'))
|
|
206
|
+
else:
|
|
207
|
+
raise ValueError('unknown system "%s"' % system)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def rank_ZZ(n=700, min=0, max=9, system='sage'):
|
|
211
|
+
"""
|
|
212
|
+
Rank over ZZ:
|
|
213
|
+
Given a n x (n+10) matrix over ZZ with random entries
|
|
214
|
+
between min and max, compute the rank.
|
|
215
|
+
|
|
216
|
+
INPUT:
|
|
217
|
+
|
|
218
|
+
- ``n`` -- matrix dimension (default: ``700``)
|
|
219
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
220
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
221
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
222
|
+
|
|
223
|
+
EXAMPLES::
|
|
224
|
+
|
|
225
|
+
sage: import sage.matrix.benchmark as b
|
|
226
|
+
sage: ts = b.rank_ZZ(300)
|
|
227
|
+
sage: tm = b.rank_ZZ(300, system='magma') # optional - magma
|
|
228
|
+
"""
|
|
229
|
+
if system == 'sage':
|
|
230
|
+
A = random_matrix(ZZ, n, n+10, x=min, y=max+1)
|
|
231
|
+
t = cputime()
|
|
232
|
+
v = A.rank()
|
|
233
|
+
return cputime(t)
|
|
234
|
+
elif system == 'magma':
|
|
235
|
+
code = """
|
|
236
|
+
n := %s;
|
|
237
|
+
A := RMatrixSpace(IntegerRing(), n, n+10)![Random(%s,%s) : i in [1..n*(n+10)]];
|
|
238
|
+
t := Cputime();
|
|
239
|
+
K := Rank(A);
|
|
240
|
+
s := Cputime(t);
|
|
241
|
+
""" % (n,min,max)
|
|
242
|
+
if verbose:
|
|
243
|
+
print(code)
|
|
244
|
+
magma.eval(code)
|
|
245
|
+
return float(magma.eval('s'))
|
|
246
|
+
else:
|
|
247
|
+
raise ValueError('unknown system "%s"' % system)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def rank2_ZZ(n=400, min=0, max=2**64, system='sage'):
|
|
251
|
+
"""
|
|
252
|
+
Rank 2 over ZZ:
|
|
253
|
+
Given a (n + 10) x n matrix over ZZ with random entries
|
|
254
|
+
between min and max, compute the rank.
|
|
255
|
+
|
|
256
|
+
INPUT:
|
|
257
|
+
|
|
258
|
+
- ``n`` -- matrix dimension (default: ``400``)
|
|
259
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
260
|
+
- ``max`` -- maximal value for entries of matrix (default: ``2**64``)
|
|
261
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: import sage.matrix.benchmark as b
|
|
266
|
+
sage: ts = b.rank2_ZZ(300)
|
|
267
|
+
sage: tm = b.rank2_ZZ(300, system='magma') # optional - magma
|
|
268
|
+
"""
|
|
269
|
+
if system == 'sage':
|
|
270
|
+
A = random_matrix(ZZ, n+10, n, x=min, y=max+1)
|
|
271
|
+
t = cputime()
|
|
272
|
+
v = A.rank()
|
|
273
|
+
return cputime(t)
|
|
274
|
+
elif system == 'magma':
|
|
275
|
+
code = """
|
|
276
|
+
n := %s;
|
|
277
|
+
A := RMatrixSpace(IntegerRing(), n+10, n)![Random(%s,%s) : i in [1..n*(n+10)]];
|
|
278
|
+
t := Cputime();
|
|
279
|
+
K := Rank(A);
|
|
280
|
+
s := Cputime(t);
|
|
281
|
+
""" % (n,min,max)
|
|
282
|
+
if verbose:
|
|
283
|
+
print(code)
|
|
284
|
+
magma.eval(code)
|
|
285
|
+
return float(magma.eval('s'))
|
|
286
|
+
else:
|
|
287
|
+
raise ValueError('unknown system "%s"' % system)
|
|
288
|
+
|
|
289
|
+
# Smith Form
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def smithform_ZZ(n=128, min=0, max=9, system='sage'):
|
|
293
|
+
"""
|
|
294
|
+
Smith Form over ZZ:
|
|
295
|
+
Given a n x n matrix over ZZ with random entries
|
|
296
|
+
between min and max, compute the Smith normal form.
|
|
297
|
+
|
|
298
|
+
INPUT:
|
|
299
|
+
|
|
300
|
+
- ``n`` -- matrix dimension (default: ``128``)
|
|
301
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
302
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
303
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: import sage.matrix.benchmark as b
|
|
308
|
+
sage: ts = b.smithform_ZZ(100)
|
|
309
|
+
sage: tm = b.smithform_ZZ(100, system='magma') # optional - magma
|
|
310
|
+
"""
|
|
311
|
+
if system == 'sage':
|
|
312
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
313
|
+
t = cputime()
|
|
314
|
+
v = A.elementary_divisors()
|
|
315
|
+
return cputime(t)
|
|
316
|
+
elif system == 'magma':
|
|
317
|
+
code = """
|
|
318
|
+
n := %s;
|
|
319
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(%s,%s) : i in [1..n^2]];
|
|
320
|
+
t := Cputime();
|
|
321
|
+
K := ElementaryDivisors(A);
|
|
322
|
+
s := Cputime(t);
|
|
323
|
+
""" % (n,min,max)
|
|
324
|
+
if verbose:
|
|
325
|
+
print(code)
|
|
326
|
+
magma.eval(code)
|
|
327
|
+
return float(magma.eval('s'))
|
|
328
|
+
else:
|
|
329
|
+
raise ValueError('unknown system "%s"' % system)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def matrix_multiply_ZZ(n=300, min=-9, max=9, system='sage', times=1):
|
|
333
|
+
"""
|
|
334
|
+
Matrix multiplication over ZZ
|
|
335
|
+
Given an n x n matrix A over ZZ with random entries
|
|
336
|
+
between min and max, inclusive, compute A * (A+1).
|
|
337
|
+
|
|
338
|
+
INPUT:
|
|
339
|
+
|
|
340
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
341
|
+
- ``min`` -- minimal value for entries of matrix (default: ``-9``)
|
|
342
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
343
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
344
|
+
- ``times`` -- number of experiments (default: ``1``)
|
|
345
|
+
|
|
346
|
+
EXAMPLES::
|
|
347
|
+
|
|
348
|
+
sage: import sage.matrix.benchmark as b
|
|
349
|
+
sage: ts = b.matrix_multiply_ZZ(200)
|
|
350
|
+
sage: tm = b.matrix_multiply_ZZ(200, system='magma') # optional - magma
|
|
351
|
+
"""
|
|
352
|
+
if system == 'sage':
|
|
353
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
354
|
+
B = A + 1
|
|
355
|
+
t = cputime()
|
|
356
|
+
for z in range(times):
|
|
357
|
+
v = A * B
|
|
358
|
+
return cputime(t)/times
|
|
359
|
+
elif system == 'magma':
|
|
360
|
+
code = """
|
|
361
|
+
n := %s;
|
|
362
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(%s,%s) : i in [1..n^2]];
|
|
363
|
+
B := A + 1;
|
|
364
|
+
t := Cputime();
|
|
365
|
+
for z in [1..%s] do
|
|
366
|
+
K := A * B;
|
|
367
|
+
end for;
|
|
368
|
+
s := Cputime(t);
|
|
369
|
+
""" % (n,min,max,times)
|
|
370
|
+
if verbose:
|
|
371
|
+
print(code)
|
|
372
|
+
magma.eval(code)
|
|
373
|
+
return float(magma.eval('s'))/times
|
|
374
|
+
else:
|
|
375
|
+
raise ValueError('unknown system "%s"' % system)
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def matrix_add_ZZ(n=200, min=-9, max=9, system='sage', times=50):
|
|
379
|
+
"""
|
|
380
|
+
Matrix addition over ZZ
|
|
381
|
+
Given an n x n matrix A and B over ZZ with random entries between
|
|
382
|
+
``min`` and ``max``, inclusive, compute A + B ``times`` times.
|
|
383
|
+
|
|
384
|
+
INPUT:
|
|
385
|
+
|
|
386
|
+
- ``n`` -- matrix dimension (default: ``200``)
|
|
387
|
+
- ``min`` -- minimal value for entries of matrix (default: ``-9``)
|
|
388
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
389
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
390
|
+
- ``times`` -- number of experiments (default: ``50``)
|
|
391
|
+
|
|
392
|
+
EXAMPLES::
|
|
393
|
+
|
|
394
|
+
sage: import sage.matrix.benchmark as b
|
|
395
|
+
sage: ts = b.matrix_add_ZZ(200)
|
|
396
|
+
sage: tm = b.matrix_add_ZZ(200, system='magma') # optional - magma
|
|
397
|
+
"""
|
|
398
|
+
if system == 'sage':
|
|
399
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
400
|
+
B = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
401
|
+
t = cputime()
|
|
402
|
+
for z in range(times):
|
|
403
|
+
v = A + B
|
|
404
|
+
return cputime(t)/times
|
|
405
|
+
elif system == 'magma':
|
|
406
|
+
code = """
|
|
407
|
+
n := %s;
|
|
408
|
+
min := %s;
|
|
409
|
+
max := %s;
|
|
410
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(min,max) : i in [1..n^2]];
|
|
411
|
+
B := MatrixAlgebra(IntegerRing(), n)![Random(min,max) : i in [1..n^2]];
|
|
412
|
+
t := Cputime();
|
|
413
|
+
for z in [1..%s] do
|
|
414
|
+
K := A + B;
|
|
415
|
+
end for;
|
|
416
|
+
s := Cputime(t);
|
|
417
|
+
""" % (n,min,max,times)
|
|
418
|
+
if verbose:
|
|
419
|
+
print(code)
|
|
420
|
+
magma.eval(code)
|
|
421
|
+
return float(magma.eval('s'))/times
|
|
422
|
+
else:
|
|
423
|
+
raise ValueError('unknown system "%s"' % system)
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def matrix_add_ZZ_2(n=200, bits=16, system='sage', times=50):
|
|
427
|
+
"""
|
|
428
|
+
Matrix addition over ZZ.
|
|
429
|
+
Given an n x n matrix A and B over ZZ with random ``bits``-bit
|
|
430
|
+
entries, compute A + B.
|
|
431
|
+
|
|
432
|
+
INPUT:
|
|
433
|
+
|
|
434
|
+
- ``n`` -- matrix dimension (default: ``200``)
|
|
435
|
+
- ``bits`` -- bitsize of entries
|
|
436
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
437
|
+
- ``times`` -- number of experiments (default: ``50``)
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: import sage.matrix.benchmark as b
|
|
442
|
+
sage: ts = b.matrix_add_ZZ_2(200)
|
|
443
|
+
sage: tm = b.matrix_add_ZZ_2(200, system='magma') # optional - magma
|
|
444
|
+
"""
|
|
445
|
+
b = 2**bits
|
|
446
|
+
return matrix_add_ZZ(n=n, min=-b, max=b,system=system, times=times)
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def det_ZZ(n=200, min=1, max=100, system='sage'):
|
|
450
|
+
"""
|
|
451
|
+
Dense integer determinant over ZZ.
|
|
452
|
+
Given an n x n matrix A over ZZ with random entries
|
|
453
|
+
between min and max, inclusive, compute det(A).
|
|
454
|
+
|
|
455
|
+
INPUT:
|
|
456
|
+
|
|
457
|
+
- ``n`` -- matrix dimension (default: ``200``)
|
|
458
|
+
- ``min`` -- minimal value for entries of matrix (default: ``1``)
|
|
459
|
+
- ``max`` -- maximal value for entries of matrix (default: ``100``)
|
|
460
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
461
|
+
|
|
462
|
+
EXAMPLES::
|
|
463
|
+
|
|
464
|
+
sage: import sage.matrix.benchmark as b
|
|
465
|
+
sage: ts = b.det_ZZ(200)
|
|
466
|
+
sage: tm = b.det_ZZ(200, system='magma') # optional - magma
|
|
467
|
+
"""
|
|
468
|
+
if system == 'sage':
|
|
469
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
470
|
+
t = cputime()
|
|
471
|
+
d = A.determinant()
|
|
472
|
+
return cputime(t)
|
|
473
|
+
elif system == 'magma':
|
|
474
|
+
code = """
|
|
475
|
+
n := %s;
|
|
476
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(%s,%s) : i in [1..n^2]];
|
|
477
|
+
t := Cputime();
|
|
478
|
+
d := Determinant(A);
|
|
479
|
+
s := Cputime(t);
|
|
480
|
+
""" % (n,min,max)
|
|
481
|
+
if verbose:
|
|
482
|
+
print(code)
|
|
483
|
+
magma.eval(code)
|
|
484
|
+
return float(magma.eval('s'))
|
|
485
|
+
else:
|
|
486
|
+
raise ValueError('unknown system "%s"' % system)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def det_QQ(n=300, num_bound=10, den_bound=10, system='sage'):
|
|
490
|
+
"""
|
|
491
|
+
Dense rational determinant over QQ.
|
|
492
|
+
Given an n x n matrix A over QQ with random entries
|
|
493
|
+
with numerator bound and denominator bound, compute det(A).
|
|
494
|
+
|
|
495
|
+
INPUT:
|
|
496
|
+
|
|
497
|
+
- ``n`` -- matrix dimension (default: ``200``)
|
|
498
|
+
- ``num_bound`` -- numerator bound, inclusive (default: ``10``)
|
|
499
|
+
- ``den_bound`` -- denominator bound, inclusive (default: ``10``)
|
|
500
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
501
|
+
|
|
502
|
+
EXAMPLES::
|
|
503
|
+
|
|
504
|
+
sage: import sage.matrix.benchmark as b
|
|
505
|
+
sage: ts = b.det_QQ(200)
|
|
506
|
+
sage: ts = b.det_QQ(10, num_bound=100000, den_bound=10000)
|
|
507
|
+
sage: tm = b.det_QQ(200, system='magma') # optional - magma
|
|
508
|
+
"""
|
|
509
|
+
if system == 'sage':
|
|
510
|
+
A = random_matrix(QQ, n, n, num_bound=num_bound, den_bound=den_bound)
|
|
511
|
+
t = cputime()
|
|
512
|
+
d = A.determinant()
|
|
513
|
+
return cputime(t)
|
|
514
|
+
elif system == 'magma':
|
|
515
|
+
code = """
|
|
516
|
+
n := %s;
|
|
517
|
+
A := MatrixAlgebra(RationalField(), n)![Random(%s,%s)/Random(1,%s) : i in [1..n^2]];
|
|
518
|
+
t := Cputime();
|
|
519
|
+
d := Determinant(A);
|
|
520
|
+
s := Cputime(t);
|
|
521
|
+
""" % (n,-num_bound, num_bound, den_bound)
|
|
522
|
+
if verbose:
|
|
523
|
+
print(code)
|
|
524
|
+
magma.eval(code)
|
|
525
|
+
return float(magma.eval('s'))
|
|
526
|
+
else:
|
|
527
|
+
raise ValueError('unknown system "%s"' % system)
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
def vecmat_ZZ(n=300, min=-9, max=9, system='sage', times=200):
|
|
531
|
+
"""
|
|
532
|
+
Vector matrix multiplication over ZZ.
|
|
533
|
+
|
|
534
|
+
Given an n x n matrix A over ZZ with random entries
|
|
535
|
+
between min and max, inclusive, and v the first row of A,
|
|
536
|
+
compute the product v * A.
|
|
537
|
+
|
|
538
|
+
INPUT:
|
|
539
|
+
|
|
540
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
541
|
+
- ``min`` -- minimal value for entries of matrix (default: ``-9``)
|
|
542
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
543
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
544
|
+
- ``times`` -- number of runs (default: ``200``)
|
|
545
|
+
|
|
546
|
+
EXAMPLES::
|
|
547
|
+
|
|
548
|
+
sage: import sage.matrix.benchmark as b
|
|
549
|
+
sage: ts = b.vecmat_ZZ(300) # long time
|
|
550
|
+
sage: tm = b.vecmat_ZZ(300, system='magma') # optional - magma
|
|
551
|
+
"""
|
|
552
|
+
if system == 'sage':
|
|
553
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1)
|
|
554
|
+
v = A.row(0)
|
|
555
|
+
t = cputime()
|
|
556
|
+
for z in range(times):
|
|
557
|
+
w = v * A
|
|
558
|
+
return cputime(t)/times
|
|
559
|
+
elif system == 'magma':
|
|
560
|
+
code = """
|
|
561
|
+
n := %s;
|
|
562
|
+
A := MatrixAlgebra(IntegerRing(), n)![Random(%s,%s) : i in [1..n^2]];
|
|
563
|
+
v := A[1];
|
|
564
|
+
t := Cputime();
|
|
565
|
+
for z in [1..%s] do
|
|
566
|
+
K := v * A;
|
|
567
|
+
end for;
|
|
568
|
+
s := Cputime(t);
|
|
569
|
+
""" % (n,min,max,times)
|
|
570
|
+
if verbose:
|
|
571
|
+
print(code)
|
|
572
|
+
magma.eval(code)
|
|
573
|
+
return float(magma.eval('s'))/times
|
|
574
|
+
else:
|
|
575
|
+
raise ValueError('unknown system "%s"' % system)
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
#######################################################################
|
|
579
|
+
# Dense Benchmarks over GF(p), for small p.
|
|
580
|
+
#######################################################################
|
|
581
|
+
|
|
582
|
+
def report_GF(p=16411, **kwds):
|
|
583
|
+
"""
|
|
584
|
+
Run all the reports for finite field matrix operations, for
|
|
585
|
+
prime p=16411.
|
|
586
|
+
|
|
587
|
+
INPUT:
|
|
588
|
+
|
|
589
|
+
- ``p`` -- ignored
|
|
590
|
+
- ``**kwds`` -- passed through to :func:`report`
|
|
591
|
+
|
|
592
|
+
.. NOTE::
|
|
593
|
+
|
|
594
|
+
right now, even though p is an input, it is being ignored! If
|
|
595
|
+
you need to check the performance for other primes, you can
|
|
596
|
+
call individual benchmark functions.
|
|
597
|
+
|
|
598
|
+
EXAMPLES::
|
|
599
|
+
|
|
600
|
+
sage: import sage.matrix.benchmark as b
|
|
601
|
+
sage: print("starting"); import sys; sys.stdout.flush(); b.report_GF(systems=['sage'])
|
|
602
|
+
starting...
|
|
603
|
+
======================================================================
|
|
604
|
+
Dense benchmarks over GF with prime 16411
|
|
605
|
+
======================================================================
|
|
606
|
+
...
|
|
607
|
+
======================================================================
|
|
608
|
+
"""
|
|
609
|
+
F = [rank_GF, rank2_GF, nullspace_GF, charpoly_GF,
|
|
610
|
+
matrix_multiply_GF, det_GF]
|
|
611
|
+
title = 'Dense benchmarks over GF with prime %i' % p
|
|
612
|
+
report(F, title, **kwds)
|
|
613
|
+
|
|
614
|
+
# Nullspace over GF
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
def nullspace_GF(n=300, p=16411, system='sage'):
|
|
618
|
+
"""
|
|
619
|
+
Given a n+1 x n matrix over GF(p) with random
|
|
620
|
+
entries, compute the nullspace.
|
|
621
|
+
|
|
622
|
+
INPUT:
|
|
623
|
+
|
|
624
|
+
- ``n`` -- matrix dimension (default: 300)
|
|
625
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
626
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
627
|
+
|
|
628
|
+
EXAMPLES::
|
|
629
|
+
|
|
630
|
+
sage: import sage.matrix.benchmark as b
|
|
631
|
+
sage: ts = b.nullspace_GF(300)
|
|
632
|
+
sage: tm = b.nullspace_GF(300, system='magma') # optional - magma
|
|
633
|
+
"""
|
|
634
|
+
if system == 'sage':
|
|
635
|
+
A = random_matrix(GF(p), n, n+1)
|
|
636
|
+
t = cputime()
|
|
637
|
+
v = A.kernel()
|
|
638
|
+
return cputime(t)
|
|
639
|
+
elif system == 'magma':
|
|
640
|
+
code = """
|
|
641
|
+
n := %s;
|
|
642
|
+
A := Random(RMatrixSpace(GF(%s), n, n+1));
|
|
643
|
+
t := Cputime();
|
|
644
|
+
K := Kernel(A);
|
|
645
|
+
s := Cputime(t);
|
|
646
|
+
""" % (n,p)
|
|
647
|
+
if verbose:
|
|
648
|
+
print(code)
|
|
649
|
+
magma.eval(code)
|
|
650
|
+
return magma.eval('s')
|
|
651
|
+
else:
|
|
652
|
+
raise ValueError('unknown system "%s"' % system)
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
# Characteristic Polynomial over GF
|
|
656
|
+
|
|
657
|
+
def charpoly_GF(n=100, p=16411, system='sage'):
|
|
658
|
+
"""
|
|
659
|
+
Given a n x n matrix over GF with random entries, compute the
|
|
660
|
+
charpoly.
|
|
661
|
+
|
|
662
|
+
INPUT:
|
|
663
|
+
|
|
664
|
+
- ``n`` -- matrix dimension (default: 100)
|
|
665
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
666
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
667
|
+
|
|
668
|
+
EXAMPLES::
|
|
669
|
+
|
|
670
|
+
sage: import sage.matrix.benchmark as b
|
|
671
|
+
sage: ts = b.charpoly_GF(100)
|
|
672
|
+
sage: tm = b.charpoly_GF(100, system='magma') # optional - magma
|
|
673
|
+
"""
|
|
674
|
+
if system == 'sage':
|
|
675
|
+
A = random_matrix(GF(p), n, n)
|
|
676
|
+
t = cputime()
|
|
677
|
+
v = A.charpoly()
|
|
678
|
+
return cputime(t)
|
|
679
|
+
elif system == 'magma':
|
|
680
|
+
code = """
|
|
681
|
+
n := %s;
|
|
682
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
683
|
+
t := Cputime();
|
|
684
|
+
K := CharacteristicPolynomial(A);
|
|
685
|
+
s := Cputime(t);
|
|
686
|
+
""" % (n,p)
|
|
687
|
+
if verbose:
|
|
688
|
+
print(code)
|
|
689
|
+
magma.eval(code)
|
|
690
|
+
return magma.eval('s')
|
|
691
|
+
else:
|
|
692
|
+
raise ValueError('unknown system "%s"' % system)
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def matrix_add_GF(n=1000, p=16411, system='sage', times=100):
|
|
696
|
+
"""
|
|
697
|
+
Given two n x n matrix over GF(p) with random entries, add them.
|
|
698
|
+
|
|
699
|
+
INPUT:
|
|
700
|
+
|
|
701
|
+
- ``n`` -- matrix dimension (default: 300)
|
|
702
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
703
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
704
|
+
- ``times`` -- number of experiments (default: ``100``)
|
|
705
|
+
|
|
706
|
+
EXAMPLES::
|
|
707
|
+
|
|
708
|
+
sage: import sage.matrix.benchmark as b
|
|
709
|
+
sage: ts = b.matrix_add_GF(500, p=19)
|
|
710
|
+
sage: tm = b.matrix_add_GF(500, p=19, system='magma') # optional - magma
|
|
711
|
+
"""
|
|
712
|
+
if system == 'sage':
|
|
713
|
+
A = random_matrix(GF(p), n, n)
|
|
714
|
+
B = random_matrix(GF(p), n, n)
|
|
715
|
+
t = cputime()
|
|
716
|
+
for n in range(times):
|
|
717
|
+
v = A + B
|
|
718
|
+
return cputime(t)
|
|
719
|
+
elif system == 'magma':
|
|
720
|
+
code = """
|
|
721
|
+
n := %s;
|
|
722
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
723
|
+
B := Random(MatrixAlgebra(GF(%s), n));
|
|
724
|
+
t := Cputime();
|
|
725
|
+
for z in [1..%s] do
|
|
726
|
+
K := A + B;
|
|
727
|
+
end for;
|
|
728
|
+
s := Cputime(t);
|
|
729
|
+
""" % (n,p,p,times)
|
|
730
|
+
if verbose:
|
|
731
|
+
print(code)
|
|
732
|
+
magma.eval(code)
|
|
733
|
+
return magma.eval('s')
|
|
734
|
+
else:
|
|
735
|
+
raise ValueError('unknown system "%s"' % system)
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
# Matrix multiplication over GF(p)
|
|
739
|
+
|
|
740
|
+
def matrix_multiply_GF(n=100, p=16411, system='sage', times=3):
|
|
741
|
+
"""
|
|
742
|
+
Given an n x n matrix A over GF(p) with random entries, compute
|
|
743
|
+
A * (A+1).
|
|
744
|
+
|
|
745
|
+
INPUT:
|
|
746
|
+
|
|
747
|
+
- ``n`` -- matrix dimension (default: 100)
|
|
748
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
749
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
750
|
+
- ``times`` -- number of experiments (default: ``3``)
|
|
751
|
+
|
|
752
|
+
EXAMPLES::
|
|
753
|
+
|
|
754
|
+
sage: import sage.matrix.benchmark as b
|
|
755
|
+
sage: ts = b.matrix_multiply_GF(100, p=19)
|
|
756
|
+
sage: tm = b.matrix_multiply_GF(100, p=19, system='magma') # optional - magma
|
|
757
|
+
"""
|
|
758
|
+
if system == 'sage':
|
|
759
|
+
A = random_matrix(GF(p), n)
|
|
760
|
+
B = A + 1
|
|
761
|
+
t = cputime()
|
|
762
|
+
for n in range(times):
|
|
763
|
+
v = A * B
|
|
764
|
+
return cputime(t) / times
|
|
765
|
+
elif system == 'magma':
|
|
766
|
+
code = """
|
|
767
|
+
n := %s;
|
|
768
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
769
|
+
B := A + 1;
|
|
770
|
+
t := Cputime();
|
|
771
|
+
for z in [1..%s] do
|
|
772
|
+
K := A * B;
|
|
773
|
+
end for;
|
|
774
|
+
s := Cputime(t);
|
|
775
|
+
""" % (n,p,times)
|
|
776
|
+
if verbose:
|
|
777
|
+
print(code)
|
|
778
|
+
magma.eval(code)
|
|
779
|
+
return float(magma.eval('s'))/times
|
|
780
|
+
else:
|
|
781
|
+
raise ValueError('unknown system "%s"' % system)
|
|
782
|
+
|
|
783
|
+
|
|
784
|
+
def rank_GF(n=500, p=16411, system='sage'):
|
|
785
|
+
"""
|
|
786
|
+
Rank over GF(p):
|
|
787
|
+
Given a n x (n+10) matrix over GF(p) with random entries, compute the rank.
|
|
788
|
+
|
|
789
|
+
INPUT:
|
|
790
|
+
|
|
791
|
+
- ``n`` -- matrix dimension (default: 300)
|
|
792
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
793
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
794
|
+
|
|
795
|
+
EXAMPLES::
|
|
796
|
+
|
|
797
|
+
sage: import sage.matrix.benchmark as b
|
|
798
|
+
sage: ts = b.rank_GF(1000)
|
|
799
|
+
sage: tm = b.rank_GF(1000, system='magma') # optional - magma
|
|
800
|
+
"""
|
|
801
|
+
if system == 'sage':
|
|
802
|
+
A = random_matrix(GF(p), n, n+10)
|
|
803
|
+
t = cputime()
|
|
804
|
+
v = A.rank()
|
|
805
|
+
return cputime(t)
|
|
806
|
+
elif system == 'magma':
|
|
807
|
+
code = """
|
|
808
|
+
n := %s;
|
|
809
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
810
|
+
t := Cputime();
|
|
811
|
+
K := Rank(A);
|
|
812
|
+
s := Cputime(t);
|
|
813
|
+
""" % (n,p)
|
|
814
|
+
if verbose:
|
|
815
|
+
print(code)
|
|
816
|
+
magma.eval(code)
|
|
817
|
+
return float(magma.eval('s'))
|
|
818
|
+
else:
|
|
819
|
+
raise ValueError('unknown system "%s"' % system)
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
def rank2_GF(n=500, p=16411, system='sage'):
|
|
823
|
+
"""
|
|
824
|
+
Rank over GF(p): Given a (n + 10) x n matrix over GF(p) with
|
|
825
|
+
random entries, compute the rank.
|
|
826
|
+
|
|
827
|
+
INPUT:
|
|
828
|
+
|
|
829
|
+
- ``n`` -- matrix dimension (default: 300)
|
|
830
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
831
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
832
|
+
|
|
833
|
+
EXAMPLES::
|
|
834
|
+
|
|
835
|
+
sage: import sage.matrix.benchmark as b
|
|
836
|
+
sage: ts = b.rank2_GF(500)
|
|
837
|
+
sage: tm = b.rank2_GF(500, system='magma') # optional - magma
|
|
838
|
+
"""
|
|
839
|
+
if system == 'sage':
|
|
840
|
+
A = random_matrix(GF(p), n+10, n)
|
|
841
|
+
t = cputime()
|
|
842
|
+
v = A.rank()
|
|
843
|
+
return cputime(t)
|
|
844
|
+
elif system == 'magma':
|
|
845
|
+
code = """
|
|
846
|
+
n := %s;
|
|
847
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
848
|
+
t := Cputime();
|
|
849
|
+
K := Rank(A);
|
|
850
|
+
s := Cputime(t);
|
|
851
|
+
""" % (n,p)
|
|
852
|
+
if verbose:
|
|
853
|
+
print(code)
|
|
854
|
+
magma.eval(code)
|
|
855
|
+
return float(magma.eval('s'))
|
|
856
|
+
else:
|
|
857
|
+
raise ValueError('unknown system "%s"' % system)
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
def det_GF(n=400, p=16411 , system='sage'):
|
|
861
|
+
"""
|
|
862
|
+
Dense determinant over GF(p).
|
|
863
|
+
Given an n x n matrix A over GF with random entries compute
|
|
864
|
+
det(A).
|
|
865
|
+
|
|
866
|
+
INPUT:
|
|
867
|
+
|
|
868
|
+
- ``n`` -- matrix dimension (default: 300)
|
|
869
|
+
- ``p`` -- prime number (default: ``16411``)
|
|
870
|
+
- ``system`` -- either 'magma' or 'sage' (default: ``'sage'``)
|
|
871
|
+
|
|
872
|
+
EXAMPLES::
|
|
873
|
+
|
|
874
|
+
sage: import sage.matrix.benchmark as b
|
|
875
|
+
sage: ts = b.det_GF(1000)
|
|
876
|
+
sage: tm = b.det_GF(1000, system='magma') # optional - magma
|
|
877
|
+
"""
|
|
878
|
+
if system == 'sage':
|
|
879
|
+
A = random_matrix(GF(p), n, n)
|
|
880
|
+
t = cputime()
|
|
881
|
+
d = A.determinant()
|
|
882
|
+
return cputime(t)
|
|
883
|
+
elif system == 'magma':
|
|
884
|
+
code = """
|
|
885
|
+
n := %s;
|
|
886
|
+
A := Random(MatrixAlgebra(GF(%s), n));
|
|
887
|
+
t := Cputime();
|
|
888
|
+
d := Determinant(A);
|
|
889
|
+
s := Cputime(t);
|
|
890
|
+
""" % (n,p)
|
|
891
|
+
if verbose:
|
|
892
|
+
print(code)
|
|
893
|
+
magma.eval(code)
|
|
894
|
+
return float(magma.eval('s'))
|
|
895
|
+
else:
|
|
896
|
+
raise ValueError('unknown system "%s"' % system)
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
#######################################################################
|
|
900
|
+
# Dense Benchmarks over QQ
|
|
901
|
+
#######################################################################
|
|
902
|
+
|
|
903
|
+
def hilbert_matrix(n):
|
|
904
|
+
"""
|
|
905
|
+
Return the Hilbert matrix of size n over rationals.
|
|
906
|
+
|
|
907
|
+
EXAMPLES::
|
|
908
|
+
|
|
909
|
+
sage: import sage.matrix.benchmark as b
|
|
910
|
+
sage: b.hilbert_matrix(3)
|
|
911
|
+
[ 1 1/2 1/3]
|
|
912
|
+
[1/2 1/3 1/4]
|
|
913
|
+
[1/3 1/4 1/5]
|
|
914
|
+
"""
|
|
915
|
+
A = Matrix(QQ,n,n)
|
|
916
|
+
for i in range(A.nrows()):
|
|
917
|
+
for j in range(A.ncols()):
|
|
918
|
+
A[i,j] = QQ(1)/((i+1)+(j+1)-1)
|
|
919
|
+
return A
|
|
920
|
+
|
|
921
|
+
# Reduced row echelon form over QQ
|
|
922
|
+
|
|
923
|
+
|
|
924
|
+
def echelon_QQ(n=100, min=0, max=9, system='sage'):
|
|
925
|
+
"""
|
|
926
|
+
Given a n x (2*n) matrix over QQ with random integer entries
|
|
927
|
+
between min and max, compute the reduced row echelon form.
|
|
928
|
+
|
|
929
|
+
INPUT:
|
|
930
|
+
|
|
931
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
932
|
+
- ``min`` -- minimal value for entries of matrix (default: ``-9``)
|
|
933
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
934
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
935
|
+
|
|
936
|
+
EXAMPLES::
|
|
937
|
+
|
|
938
|
+
sage: import sage.matrix.benchmark as b
|
|
939
|
+
sage: ts = b.echelon_QQ(100)
|
|
940
|
+
sage: tm = b.echelon_QQ(100, system='magma') # optional - magma
|
|
941
|
+
"""
|
|
942
|
+
if system == 'sage':
|
|
943
|
+
A = random_matrix(ZZ, n, 2*n, x=min, y=max+1).change_ring(QQ)
|
|
944
|
+
t = cputime()
|
|
945
|
+
v = A.echelon_form()
|
|
946
|
+
return cputime(t)
|
|
947
|
+
elif system == 'magma':
|
|
948
|
+
code = """
|
|
949
|
+
n := %s;
|
|
950
|
+
A := RMatrixSpace(RationalField(), n, 2*n)![Random(%s,%s) : i in [1..n*2*n]];
|
|
951
|
+
t := Cputime();
|
|
952
|
+
K := EchelonForm(A);
|
|
953
|
+
s := Cputime(t);
|
|
954
|
+
""" % (n,min,max)
|
|
955
|
+
if verbose:
|
|
956
|
+
print(code)
|
|
957
|
+
magma.eval(code)
|
|
958
|
+
return float(magma.eval('s'))
|
|
959
|
+
else:
|
|
960
|
+
raise ValueError('unknown system "%s"' % system)
|
|
961
|
+
|
|
962
|
+
# Invert a matrix over QQ.
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def inverse_QQ(n=100, min=0, max=9, system='sage'):
|
|
966
|
+
"""
|
|
967
|
+
Given a n x n matrix over QQ with random integer entries
|
|
968
|
+
between min and max, compute the reduced row echelon form.
|
|
969
|
+
|
|
970
|
+
INPUT:
|
|
971
|
+
|
|
972
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
973
|
+
- ``min`` -- minimal value for entries of matrix (default: ``-9``)
|
|
974
|
+
- ``max`` -- maximal value for entries of matrix (default: ``9``)
|
|
975
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
976
|
+
|
|
977
|
+
EXAMPLES::
|
|
978
|
+
|
|
979
|
+
sage: import sage.matrix.benchmark as b
|
|
980
|
+
sage: ts = b.inverse_QQ(100)
|
|
981
|
+
sage: tm = b.inverse_QQ(100, system='magma') # optional - magma
|
|
982
|
+
"""
|
|
983
|
+
if system == 'sage':
|
|
984
|
+
A = random_matrix(ZZ, n, n, x=min, y=max+1).change_ring(QQ)
|
|
985
|
+
t = cputime()
|
|
986
|
+
v = ~A
|
|
987
|
+
return cputime(t)
|
|
988
|
+
elif system == 'magma':
|
|
989
|
+
code = """
|
|
990
|
+
n := %s;
|
|
991
|
+
A := MatrixAlgebra(RationalField(), n)![Random(%s,%s) : i in [1..n*n]];
|
|
992
|
+
t := Cputime();
|
|
993
|
+
K := A^(-1);
|
|
994
|
+
s := Cputime(t);
|
|
995
|
+
""" % (n,min,max)
|
|
996
|
+
if verbose:
|
|
997
|
+
print(code)
|
|
998
|
+
magma.eval(code)
|
|
999
|
+
return float(magma.eval('s'))
|
|
1000
|
+
else:
|
|
1001
|
+
raise ValueError('unknown system "%s"' % system)
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
# Matrix multiplication over QQ
|
|
1005
|
+
def matrix_multiply_QQ(n=100, bnd=2, system='sage', times=1):
|
|
1006
|
+
"""
|
|
1007
|
+
Given an n x n matrix A over QQ with random entries
|
|
1008
|
+
whose numerators and denominators are bounded by bnd,
|
|
1009
|
+
compute A * (A+1).
|
|
1010
|
+
|
|
1011
|
+
INPUT:
|
|
1012
|
+
|
|
1013
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1014
|
+
- ``bnd`` -- numerator and denominator bound (default: ``bnd``)
|
|
1015
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1016
|
+
- ``times`` -- number of experiments (default: ``1``)
|
|
1017
|
+
|
|
1018
|
+
EXAMPLES::
|
|
1019
|
+
|
|
1020
|
+
sage: import sage.matrix.benchmark as b
|
|
1021
|
+
sage: ts = b.matrix_multiply_QQ(100)
|
|
1022
|
+
sage: tm = b.matrix_multiply_QQ(100, system='magma') # optional - magma
|
|
1023
|
+
"""
|
|
1024
|
+
if system == 'sage':
|
|
1025
|
+
A = random_matrix(QQ, n, n, num_bound=bnd, den_bound=bnd)
|
|
1026
|
+
B = A + 1
|
|
1027
|
+
t = cputime()
|
|
1028
|
+
for z in range(times):
|
|
1029
|
+
v = A * B
|
|
1030
|
+
return cputime(t)/times
|
|
1031
|
+
elif system == 'magma':
|
|
1032
|
+
A = magma(random_matrix(QQ, n, n, num_bound=bnd, den_bound=bnd))
|
|
1033
|
+
code = """
|
|
1034
|
+
n := %s;
|
|
1035
|
+
A := %s;
|
|
1036
|
+
B := A + 1;
|
|
1037
|
+
t := Cputime();
|
|
1038
|
+
for z in [1..%s] do
|
|
1039
|
+
K := A * B;
|
|
1040
|
+
end for;
|
|
1041
|
+
s := Cputime(t);
|
|
1042
|
+
""" % (n, A.name(), times)
|
|
1043
|
+
if verbose:
|
|
1044
|
+
print(code)
|
|
1045
|
+
magma.eval(code)
|
|
1046
|
+
return float(magma.eval('s'))/times
|
|
1047
|
+
else:
|
|
1048
|
+
raise ValueError('unknown system "%s"' % system)
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
# Determinant of Hilbert matrix
|
|
1052
|
+
def det_hilbert_QQ(n=80, system='sage'):
|
|
1053
|
+
"""
|
|
1054
|
+
Run the benchmark for calculating the determinant of the hilbert
|
|
1055
|
+
matrix over rationals of dimension n.
|
|
1056
|
+
|
|
1057
|
+
INPUT:
|
|
1058
|
+
|
|
1059
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1060
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1061
|
+
|
|
1062
|
+
EXAMPLES::
|
|
1063
|
+
|
|
1064
|
+
sage: import sage.matrix.benchmark as b
|
|
1065
|
+
sage: ts = b.det_hilbert_QQ(50)
|
|
1066
|
+
sage: tm = b.det_hilbert_QQ(50, system='magma') # optional - magma
|
|
1067
|
+
"""
|
|
1068
|
+
if system == 'sage':
|
|
1069
|
+
A = hilbert_matrix(n)
|
|
1070
|
+
t = cputime()
|
|
1071
|
+
d = A.determinant()
|
|
1072
|
+
return cputime(t)
|
|
1073
|
+
elif system == 'magma':
|
|
1074
|
+
code = """
|
|
1075
|
+
h := HilbertMatrix(%s);
|
|
1076
|
+
tinit := Cputime();
|
|
1077
|
+
d := Determinant(h);
|
|
1078
|
+
s := Cputime(tinit);
|
|
1079
|
+
delete h;
|
|
1080
|
+
""" % n
|
|
1081
|
+
if verbose:
|
|
1082
|
+
print(code)
|
|
1083
|
+
magma.eval(code)
|
|
1084
|
+
return float(magma.eval('s'))
|
|
1085
|
+
|
|
1086
|
+
# inverse of Hilbert matrix
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
def invert_hilbert_QQ(n=40, system='sage'):
|
|
1090
|
+
"""
|
|
1091
|
+
Run the benchmark for calculating the inverse of the hilbert
|
|
1092
|
+
matrix over rationals of dimension n.
|
|
1093
|
+
|
|
1094
|
+
INPUT:
|
|
1095
|
+
|
|
1096
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1097
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1098
|
+
|
|
1099
|
+
EXAMPLES::
|
|
1100
|
+
|
|
1101
|
+
sage: import sage.matrix.benchmark as b
|
|
1102
|
+
sage: ts = b.invert_hilbert_QQ(30)
|
|
1103
|
+
sage: tm = b.invert_hilbert_QQ(30, system='magma') # optional - magma
|
|
1104
|
+
"""
|
|
1105
|
+
if system == 'sage':
|
|
1106
|
+
A = hilbert_matrix(n)
|
|
1107
|
+
t = cputime()
|
|
1108
|
+
d = A**(-1)
|
|
1109
|
+
return cputime(t)
|
|
1110
|
+
elif system == 'magma':
|
|
1111
|
+
code = """
|
|
1112
|
+
h := HilbertMatrix(%s);
|
|
1113
|
+
tinit := Cputime();
|
|
1114
|
+
d := h^(-1);
|
|
1115
|
+
s := Cputime(tinit);
|
|
1116
|
+
delete h;
|
|
1117
|
+
""" % n
|
|
1118
|
+
if verbose:
|
|
1119
|
+
print(code)
|
|
1120
|
+
magma.eval(code)
|
|
1121
|
+
return float(magma.eval('s'))
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
def MatrixVector_QQ(n=1000, h=100, system='sage', times=1):
|
|
1125
|
+
"""
|
|
1126
|
+
Compute product of square ``n`` matrix by random vector with num and
|
|
1127
|
+
denom bounded by ``h`` the given number of ``times``.
|
|
1128
|
+
|
|
1129
|
+
INPUT:
|
|
1130
|
+
|
|
1131
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1132
|
+
- ``h`` -- numerator and denominator bound (default: ``bnd``)
|
|
1133
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1134
|
+
- ``times`` -- number of experiments (default: ``1``)
|
|
1135
|
+
|
|
1136
|
+
EXAMPLES::
|
|
1137
|
+
|
|
1138
|
+
sage: import sage.matrix.benchmark as b
|
|
1139
|
+
sage: ts = b.MatrixVector_QQ(500)
|
|
1140
|
+
sage: tm = b.MatrixVector_QQ(500, system='magma') # optional - magma
|
|
1141
|
+
"""
|
|
1142
|
+
if system == 'sage':
|
|
1143
|
+
V = QQ**n
|
|
1144
|
+
v = V.random_element(h)
|
|
1145
|
+
M = random_matrix(QQ,n)
|
|
1146
|
+
t = cputime()
|
|
1147
|
+
for i in range(times):
|
|
1148
|
+
w = M*v
|
|
1149
|
+
return cputime(t)
|
|
1150
|
+
elif system == 'magma':
|
|
1151
|
+
code = """
|
|
1152
|
+
n:=%s;
|
|
1153
|
+
h:=%s;
|
|
1154
|
+
times:=%s;
|
|
1155
|
+
v:=VectorSpace(RationalField(),n)![Random(h)/(Random(h)+1) : i in [1..n]];
|
|
1156
|
+
M:=MatrixAlgebra(RationalField(),n)![Random(h)/(Random(h)+1) : i in [1..n^2]];
|
|
1157
|
+
t := Cputime();
|
|
1158
|
+
for z in [1..times] do
|
|
1159
|
+
W:=v*M;
|
|
1160
|
+
end for;
|
|
1161
|
+
s := Cputime(t);
|
|
1162
|
+
""" % (n,h,times)
|
|
1163
|
+
if verbose:
|
|
1164
|
+
print(code)
|
|
1165
|
+
magma.eval(code)
|
|
1166
|
+
return float(magma.eval('s'))
|
|
1167
|
+
else:
|
|
1168
|
+
raise ValueError('unknown system "%s"' % system)
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
#######################################################################
|
|
1172
|
+
# Dense Benchmarks over machine reals
|
|
1173
|
+
# Note that the precision in reals for MAGMA is base 10, while in
|
|
1174
|
+
# sage it is in base 2
|
|
1175
|
+
#######################################################################
|
|
1176
|
+
|
|
1177
|
+
# Real Nullspace
|
|
1178
|
+
|
|
1179
|
+
def nullspace_RR(n=300, min=0, max=10, system='sage'):
|
|
1180
|
+
"""
|
|
1181
|
+
Nullspace over RR:
|
|
1182
|
+
Given a n+1 x n matrix over RR with random entries
|
|
1183
|
+
between min and max, compute the nullspace.
|
|
1184
|
+
|
|
1185
|
+
INPUT:
|
|
1186
|
+
|
|
1187
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1188
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
1189
|
+
- ``max`` -- maximal value for entries of matrix (default: ``10``)
|
|
1190
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1191
|
+
|
|
1192
|
+
EXAMPLES::
|
|
1193
|
+
|
|
1194
|
+
sage: import sage.matrix.benchmark as b
|
|
1195
|
+
sage: ts = b.nullspace_RR(100)
|
|
1196
|
+
sage: tm = b.nullspace_RR(100, system='magma') # optional - magma
|
|
1197
|
+
"""
|
|
1198
|
+
if system == 'sage':
|
|
1199
|
+
from sage.rings.real_mpfr import RR
|
|
1200
|
+
A = random_matrix(ZZ, n+1, n, x=min, y=max+1).change_ring(RR)
|
|
1201
|
+
t = cputime()
|
|
1202
|
+
v = A.kernel()
|
|
1203
|
+
return cputime(t)
|
|
1204
|
+
elif system == 'magma':
|
|
1205
|
+
code = """
|
|
1206
|
+
n := %s;
|
|
1207
|
+
A := RMatrixSpace(RealField(16), n+1,n)![Random(%s,%s) : i in [1..n*(n+1)]];
|
|
1208
|
+
t := Cputime();
|
|
1209
|
+
K := Kernel(A);
|
|
1210
|
+
s := Cputime(t);
|
|
1211
|
+
""" % (n,min,max)
|
|
1212
|
+
if verbose:
|
|
1213
|
+
print(code)
|
|
1214
|
+
magma.eval(code)
|
|
1215
|
+
return float(magma.eval('s'))
|
|
1216
|
+
else:
|
|
1217
|
+
raise ValueError('unknown system "%s"' % system)
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
def nullspace_RDF(n=300, min=0, max=10, system='sage'):
|
|
1221
|
+
"""
|
|
1222
|
+
Nullspace over RDF:
|
|
1223
|
+
Given a n+1 x n matrix over RDF with random entries
|
|
1224
|
+
between min and max, compute the nullspace.
|
|
1225
|
+
|
|
1226
|
+
INPUT:
|
|
1227
|
+
|
|
1228
|
+
- ``n`` -- matrix dimension (default: ``300``)
|
|
1229
|
+
- ``min`` -- minimal value for entries of matrix (default: ``0``)
|
|
1230
|
+
- ``max`` -- maximal value for entries of matrix (default: ``10``)
|
|
1231
|
+
- ``system`` -- either ``'sage'`` or ``'magma'`` (default: ``'sage'``)
|
|
1232
|
+
|
|
1233
|
+
EXAMPLES::
|
|
1234
|
+
|
|
1235
|
+
sage: import sage.matrix.benchmark as b
|
|
1236
|
+
sage: ts = b.nullspace_RDF(100) # long time
|
|
1237
|
+
sage: tm = b.nullspace_RDF(100, system='magma') # optional - magma
|
|
1238
|
+
"""
|
|
1239
|
+
if system == 'sage':
|
|
1240
|
+
from sage.rings.real_double import RDF
|
|
1241
|
+
A = random_matrix(ZZ, n+1, n, x=min, y=max+1).change_ring(RDF)
|
|
1242
|
+
t = cputime()
|
|
1243
|
+
v = A.kernel()
|
|
1244
|
+
return cputime(t)
|
|
1245
|
+
elif system == 'magma':
|
|
1246
|
+
code = """
|
|
1247
|
+
n := %s;
|
|
1248
|
+
A := RMatrixSpace(RealField(16), n+1,n)![Random(%s,%s) : i in [1..n*(n+1)]];
|
|
1249
|
+
t := Cputime();
|
|
1250
|
+
K := Kernel(A);
|
|
1251
|
+
s := Cputime(t);
|
|
1252
|
+
""" % (n, min, max)
|
|
1253
|
+
if verbose:
|
|
1254
|
+
print(code)
|
|
1255
|
+
magma.eval(code)
|
|
1256
|
+
return float(magma.eval('s'))
|
|
1257
|
+
else:
|
|
1258
|
+
raise ValueError('unknown system "%s"' % system)
|