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,1252 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Asymptotic Expansions --- Miscellaneous
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Daniel Krenn (2015)
|
|
8
|
+
|
|
9
|
+
ACKNOWLEDGEMENT:
|
|
10
|
+
|
|
11
|
+
- Benjamin Hackl, Clemens Heuberger and Daniel Krenn are supported by the
|
|
12
|
+
Austrian Science Fund (FWF): P 24644-N26.
|
|
13
|
+
|
|
14
|
+
- Benjamin Hackl is supported by the Google Summer of Code 2015.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Functions, Classes and Methods
|
|
18
|
+
==============================
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
# Copyright (C) 2015 Daniel Krenn <dev@danielkrenn.at>
|
|
23
|
+
#
|
|
24
|
+
# This program is free software: you can redistribute it and/or modify
|
|
25
|
+
# it under the terms of the GNU General Public License as published by
|
|
26
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
27
|
+
# (at your option) any later version.
|
|
28
|
+
# https://www.gnu.org/licenses/
|
|
29
|
+
# ****************************************************************************
|
|
30
|
+
|
|
31
|
+
from sage.misc.cachefunc import cached_method
|
|
32
|
+
from sage.misc.lazy_import import lazy_import
|
|
33
|
+
from sage.structure.sage_object import SageObject
|
|
34
|
+
|
|
35
|
+
lazy_import('sage.rings.lazy_series_ring', 'LazyPowerSeriesRing')
|
|
36
|
+
lazy_import('sage.rings.multi_power_series_ring', 'MPowerSeriesRing_generic')
|
|
37
|
+
lazy_import('sage.rings.polynomial.multi_polynomial_ring_base', 'MPolynomialRing_base')
|
|
38
|
+
lazy_import('sage.rings.polynomial.polynomial_ring', 'PolynomialRing_generic')
|
|
39
|
+
lazy_import('sage.rings.power_series_ring', 'PowerSeriesRing_generic')
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def repr_short_to_parent(s):
|
|
43
|
+
r"""
|
|
44
|
+
Helper method for the growth group factory, which converts a short
|
|
45
|
+
representation string to a parent.
|
|
46
|
+
|
|
47
|
+
INPUT:
|
|
48
|
+
|
|
49
|
+
- ``s`` -- string; short representation of a parent
|
|
50
|
+
|
|
51
|
+
OUTPUT: a parent
|
|
52
|
+
|
|
53
|
+
The possible short representations are shown in the examples below.
|
|
54
|
+
|
|
55
|
+
EXAMPLES::
|
|
56
|
+
|
|
57
|
+
sage: from sage.rings.asymptotic.misc import repr_short_to_parent
|
|
58
|
+
sage: repr_short_to_parent('ZZ')
|
|
59
|
+
Integer Ring
|
|
60
|
+
sage: repr_short_to_parent('QQ')
|
|
61
|
+
Rational Field
|
|
62
|
+
sage: repr_short_to_parent('SR') # needs sage.symbolic
|
|
63
|
+
Symbolic Ring
|
|
64
|
+
sage: repr_short_to_parent('NN')
|
|
65
|
+
Non negative integer semiring
|
|
66
|
+
sage: repr_short_to_parent('UU')
|
|
67
|
+
Group of Roots of Unity
|
|
68
|
+
|
|
69
|
+
TESTS::
|
|
70
|
+
|
|
71
|
+
sage: repr_short_to_parent('abcdef')
|
|
72
|
+
Traceback (most recent call last):
|
|
73
|
+
...
|
|
74
|
+
ValueError: Cannot create a parent out of 'abcdef'.
|
|
75
|
+
> *previous* ValueError: unknown specification abcdef
|
|
76
|
+
> *and* NameError: name 'abcdef' is not defined
|
|
77
|
+
"""
|
|
78
|
+
from sage.groups.misc_gps.argument_groups import ArgumentGroup
|
|
79
|
+
from sage.misc.sage_eval import sage_eval
|
|
80
|
+
|
|
81
|
+
def extract(s):
|
|
82
|
+
try:
|
|
83
|
+
return ArgumentGroup(specification=s)
|
|
84
|
+
except Exception as e:
|
|
85
|
+
e_ag = e
|
|
86
|
+
e_ag.__traceback__ = None
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
return sage_eval(s)
|
|
90
|
+
except Exception as e:
|
|
91
|
+
e_se = e
|
|
92
|
+
e_se.__traceback__ = None
|
|
93
|
+
|
|
94
|
+
raise combine_exceptions(
|
|
95
|
+
ValueError("Cannot create a parent out of '%s'." % (s,)),
|
|
96
|
+
e_ag, e_se)
|
|
97
|
+
|
|
98
|
+
P = extract(s)
|
|
99
|
+
|
|
100
|
+
from sage.misc.lazy_import import LazyImport
|
|
101
|
+
if type(P) is LazyImport:
|
|
102
|
+
P = P._get_object()
|
|
103
|
+
|
|
104
|
+
from sage.structure.parent import Parent
|
|
105
|
+
if not isinstance(P, Parent):
|
|
106
|
+
raise ValueError("'%s' does not describe a parent." % (s,))
|
|
107
|
+
return P
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def parent_to_repr_short(P):
|
|
111
|
+
r"""
|
|
112
|
+
Helper method which generates a short(er) representation string
|
|
113
|
+
out of a parent.
|
|
114
|
+
|
|
115
|
+
INPUT:
|
|
116
|
+
|
|
117
|
+
- ``P`` -- a parent
|
|
118
|
+
|
|
119
|
+
OUTPUT: string
|
|
120
|
+
|
|
121
|
+
EXAMPLES::
|
|
122
|
+
|
|
123
|
+
sage: from sage.rings.asymptotic.misc import parent_to_repr_short
|
|
124
|
+
sage: parent_to_repr_short(ZZ)
|
|
125
|
+
'ZZ'
|
|
126
|
+
sage: parent_to_repr_short(QQ)
|
|
127
|
+
'QQ'
|
|
128
|
+
sage: parent_to_repr_short(SR) # needs sage.symbolic
|
|
129
|
+
'SR'
|
|
130
|
+
sage: parent_to_repr_short(RR)
|
|
131
|
+
'RR'
|
|
132
|
+
sage: parent_to_repr_short(CC)
|
|
133
|
+
'CC'
|
|
134
|
+
sage: parent_to_repr_short(ZZ['x'])
|
|
135
|
+
'ZZ[x]'
|
|
136
|
+
sage: parent_to_repr_short(QQ['d, k'])
|
|
137
|
+
'QQ[d, k]'
|
|
138
|
+
sage: parent_to_repr_short(QQ['e'])
|
|
139
|
+
'QQ[e]'
|
|
140
|
+
sage: parent_to_repr_short(SR[['a, r']]) # needs sage.symbolic
|
|
141
|
+
'SR[[a, r]]'
|
|
142
|
+
sage: parent_to_repr_short(Zmod(3))
|
|
143
|
+
'Ring of integers modulo 3'
|
|
144
|
+
sage: parent_to_repr_short(Zmod(3)['g'])
|
|
145
|
+
'Univariate Polynomial Ring in g over Ring of integers modulo 3'
|
|
146
|
+
"""
|
|
147
|
+
def abbreviate(P):
|
|
148
|
+
try:
|
|
149
|
+
return P._repr_short_()
|
|
150
|
+
except AttributeError:
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
from sage.rings.integer_ring import ZZ
|
|
154
|
+
if P == ZZ:
|
|
155
|
+
return 'ZZ'
|
|
156
|
+
|
|
157
|
+
from sage.rings.rational_field import QQ
|
|
158
|
+
if P == QQ:
|
|
159
|
+
return 'QQ'
|
|
160
|
+
|
|
161
|
+
from sage.rings.real_mpfr import RR
|
|
162
|
+
if P == RR:
|
|
163
|
+
return 'RR'
|
|
164
|
+
|
|
165
|
+
try:
|
|
166
|
+
from sage.rings.cc import CC
|
|
167
|
+
except ImportError:
|
|
168
|
+
pass
|
|
169
|
+
else:
|
|
170
|
+
if P == CC:
|
|
171
|
+
return 'CC'
|
|
172
|
+
|
|
173
|
+
try:
|
|
174
|
+
from sage.rings.cif import CIF
|
|
175
|
+
except ImportError:
|
|
176
|
+
pass
|
|
177
|
+
else:
|
|
178
|
+
if P == CIF:
|
|
179
|
+
return 'CIF'
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
from sage.rings.complex_arb import CBF
|
|
183
|
+
except ImportError:
|
|
184
|
+
pass
|
|
185
|
+
else:
|
|
186
|
+
if P == CBF:
|
|
187
|
+
return 'CBF'
|
|
188
|
+
|
|
189
|
+
try:
|
|
190
|
+
from sage.rings.real_arb import RBF
|
|
191
|
+
except ImportError:
|
|
192
|
+
pass
|
|
193
|
+
else:
|
|
194
|
+
if P == RBF:
|
|
195
|
+
return 'RBF'
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
from sage.rings.real_mpfi import RIF
|
|
199
|
+
except ImportError:
|
|
200
|
+
pass
|
|
201
|
+
else:
|
|
202
|
+
if P == RIF:
|
|
203
|
+
return 'RIF'
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
from sage.symbolic.ring import SR
|
|
207
|
+
except ImportError:
|
|
208
|
+
pass
|
|
209
|
+
else:
|
|
210
|
+
if P == SR:
|
|
211
|
+
return 'SR'
|
|
212
|
+
|
|
213
|
+
raise ValueError('Cannot abbreviate %s.' % (P,))
|
|
214
|
+
|
|
215
|
+
poly = isinstance(P, (PolynomialRing_generic, MPolynomialRing_base))
|
|
216
|
+
power = isinstance(P, (PowerSeriesRing_generic, MPowerSeriesRing_generic, LazyPowerSeriesRing))
|
|
217
|
+
|
|
218
|
+
if poly or power:
|
|
219
|
+
if poly:
|
|
220
|
+
op, cl = ('[', ']')
|
|
221
|
+
else:
|
|
222
|
+
op, cl = ('[[', ']]')
|
|
223
|
+
try:
|
|
224
|
+
s = abbreviate(P.base_ring()) + op + ', '.join(P.variable_names()) + cl
|
|
225
|
+
except ValueError:
|
|
226
|
+
s = str(P)
|
|
227
|
+
else:
|
|
228
|
+
try:
|
|
229
|
+
s = abbreviate(P)
|
|
230
|
+
except ValueError:
|
|
231
|
+
s = str(P)
|
|
232
|
+
|
|
233
|
+
return s
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def split_str_by_op(string, op, strip_parentheses=True):
|
|
237
|
+
r"""
|
|
238
|
+
Split the given string into a tuple of substrings arising by
|
|
239
|
+
splitting by ``op`` and taking care of parentheses.
|
|
240
|
+
|
|
241
|
+
INPUT:
|
|
242
|
+
|
|
243
|
+
- ``string`` -- string
|
|
244
|
+
|
|
245
|
+
- ``op`` -- string; this is used by
|
|
246
|
+
:python:`str.split <library/stdtypes.html#str.split>`.
|
|
247
|
+
Thus, if this is ``None``, then any whitespace string is a
|
|
248
|
+
separator and empty strings are removed from the result.
|
|
249
|
+
|
|
250
|
+
- ``strip_parentheses`` -- boolean (default: ``True``)
|
|
251
|
+
|
|
252
|
+
OUTPUT: a tuple of strings
|
|
253
|
+
|
|
254
|
+
TESTS::
|
|
255
|
+
|
|
256
|
+
sage: from sage.rings.asymptotic.misc import split_str_by_op
|
|
257
|
+
sage: split_str_by_op('x^ZZ', '*')
|
|
258
|
+
('x^ZZ',)
|
|
259
|
+
sage: split_str_by_op('log(x)^ZZ * y^QQ', '*')
|
|
260
|
+
('log(x)^ZZ', 'y^QQ')
|
|
261
|
+
sage: split_str_by_op('log(x)**ZZ * y**QQ', '*')
|
|
262
|
+
('log(x)**ZZ', 'y**QQ')
|
|
263
|
+
sage: split_str_by_op('a^b * * c^d', '*')
|
|
264
|
+
Traceback (most recent call last):
|
|
265
|
+
...
|
|
266
|
+
ValueError: 'a^b * * c^d' is invalid since a '*' follows a '*'.
|
|
267
|
+
sage: split_str_by_op('a^b * (c*d^e)', '*')
|
|
268
|
+
('a^b', 'c*d^e')
|
|
269
|
+
|
|
270
|
+
::
|
|
271
|
+
|
|
272
|
+
sage: split_str_by_op('(a^b)^c', '^')
|
|
273
|
+
('a^b', 'c')
|
|
274
|
+
sage: split_str_by_op('a^(b^c)', '^')
|
|
275
|
+
('a', 'b^c')
|
|
276
|
+
|
|
277
|
+
::
|
|
278
|
+
|
|
279
|
+
sage: split_str_by_op('(a) + (b)', op='+', strip_parentheses=True)
|
|
280
|
+
('a', 'b')
|
|
281
|
+
sage: split_str_by_op('(a) + (b)', op='+', strip_parentheses=False)
|
|
282
|
+
('(a)', '(b)')
|
|
283
|
+
sage: split_str_by_op(' ( t ) ', op='+', strip_parentheses=False)
|
|
284
|
+
('( t )',)
|
|
285
|
+
|
|
286
|
+
::
|
|
287
|
+
|
|
288
|
+
sage: split_str_by_op(' ( t ) ', op=None)
|
|
289
|
+
('t',)
|
|
290
|
+
sage: split_str_by_op(' ( t )s', op=None)
|
|
291
|
+
('(t)s',)
|
|
292
|
+
sage: split_str_by_op(' ( t ) s', op=None)
|
|
293
|
+
('t', 's')
|
|
294
|
+
|
|
295
|
+
::
|
|
296
|
+
|
|
297
|
+
sage: split_str_by_op('(e^(n*log(n)))^SR.subring(no_variables=True)', '*')
|
|
298
|
+
('(e^(n*log(n)))^SR.subring(no_variables=True)',)
|
|
299
|
+
"""
|
|
300
|
+
def is_balanced(s):
|
|
301
|
+
open = 0
|
|
302
|
+
for l in s:
|
|
303
|
+
if l == '(':
|
|
304
|
+
open += 1
|
|
305
|
+
elif l == ')':
|
|
306
|
+
open -= 1
|
|
307
|
+
if open < 0:
|
|
308
|
+
return False
|
|
309
|
+
return bool(open == 0)
|
|
310
|
+
|
|
311
|
+
factors = []
|
|
312
|
+
balanced = True
|
|
313
|
+
if string and op is not None and string.startswith(op):
|
|
314
|
+
raise ValueError("'%s' is invalid since it starts with a '%s'." %
|
|
315
|
+
(string, op))
|
|
316
|
+
for s in string.split(op):
|
|
317
|
+
if not s:
|
|
318
|
+
factors[-1] += op
|
|
319
|
+
balanced = False
|
|
320
|
+
continue
|
|
321
|
+
if not s.strip():
|
|
322
|
+
raise ValueError("'%s' is invalid since a '%s' follows a '%s'." %
|
|
323
|
+
(string, op, op))
|
|
324
|
+
if not balanced:
|
|
325
|
+
s = factors.pop() + (op if op else '') + s
|
|
326
|
+
balanced = is_balanced(s)
|
|
327
|
+
factors.append(s)
|
|
328
|
+
|
|
329
|
+
if not balanced:
|
|
330
|
+
raise ValueError("Parentheses in '%s' are not balanced." % (string,))
|
|
331
|
+
|
|
332
|
+
def strip(s):
|
|
333
|
+
s = s.strip()
|
|
334
|
+
if not s:
|
|
335
|
+
return s
|
|
336
|
+
if strip_parentheses and s[0] == '(' and s[-1] == ')':
|
|
337
|
+
t = s[1:-1]
|
|
338
|
+
if is_balanced(t):
|
|
339
|
+
s = t
|
|
340
|
+
return s.strip()
|
|
341
|
+
|
|
342
|
+
return tuple(strip(f) for f in factors)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def repr_op(left, op, right=None, latex=False):
|
|
346
|
+
r"""
|
|
347
|
+
Create a string ``left op right`` with
|
|
348
|
+
taking care of parentheses in its operands.
|
|
349
|
+
|
|
350
|
+
INPUT:
|
|
351
|
+
|
|
352
|
+
- ``left`` -- an element
|
|
353
|
+
|
|
354
|
+
- ``op`` -- string
|
|
355
|
+
|
|
356
|
+
- ``right`` -- an element
|
|
357
|
+
|
|
358
|
+
- ``latex`` -- boolean (default: ``False``); if set, then
|
|
359
|
+
LaTeX-output is returned
|
|
360
|
+
|
|
361
|
+
OUTPUT: string
|
|
362
|
+
|
|
363
|
+
EXAMPLES::
|
|
364
|
+
|
|
365
|
+
sage: from sage.rings.asymptotic.misc import repr_op
|
|
366
|
+
sage: repr_op('a^b', '^', 'c')
|
|
367
|
+
'(a^b)^c'
|
|
368
|
+
|
|
369
|
+
TESTS::
|
|
370
|
+
|
|
371
|
+
sage: repr_op('a-b', '^', 'c')
|
|
372
|
+
'(a-b)^c'
|
|
373
|
+
sage: repr_op('a+b', '^', 'c')
|
|
374
|
+
'(a+b)^c'
|
|
375
|
+
|
|
376
|
+
::
|
|
377
|
+
|
|
378
|
+
sage: print(repr_op(r'\frac{1}{2}', '^', 'c', latex=True))
|
|
379
|
+
\left(\frac{1}{2}\right)^c
|
|
380
|
+
|
|
381
|
+
::
|
|
382
|
+
|
|
383
|
+
sage: repr_op('Arg', '_', 'Symbolic Ring')
|
|
384
|
+
'Arg_(Symbolic Ring)'
|
|
385
|
+
"""
|
|
386
|
+
left = str(left)
|
|
387
|
+
right = str(right) if right is not None else ''
|
|
388
|
+
|
|
389
|
+
def add_parentheses(s, op):
|
|
390
|
+
if op in ('^', '_'):
|
|
391
|
+
signals = ('^', '/', '*', '-', '+', ' ')
|
|
392
|
+
else:
|
|
393
|
+
return s
|
|
394
|
+
if any(sig in s for sig in signals) or latex and s.startswith(r'\frac'):
|
|
395
|
+
if latex:
|
|
396
|
+
return r'\left({}\right)'.format(s)
|
|
397
|
+
return '({})'.format(s)
|
|
398
|
+
return s
|
|
399
|
+
|
|
400
|
+
return add_parentheses(left, op) + op + add_parentheses(right, op)
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def combine_exceptions(e, *f):
|
|
404
|
+
r"""
|
|
405
|
+
Helper function which combines the messages of the given exceptions.
|
|
406
|
+
|
|
407
|
+
INPUT:
|
|
408
|
+
|
|
409
|
+
- ``e`` -- an exception
|
|
410
|
+
|
|
411
|
+
- ``*f`` -- exceptions
|
|
412
|
+
|
|
413
|
+
OUTPUT: an exception
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: from sage.rings.asymptotic.misc import combine_exceptions
|
|
418
|
+
sage: raise combine_exceptions(ValueError('Outer.'), TypeError('Inner.'))
|
|
419
|
+
Traceback (most recent call last):
|
|
420
|
+
...
|
|
421
|
+
ValueError: Outer.
|
|
422
|
+
> *previous* TypeError: Inner.
|
|
423
|
+
sage: raise combine_exceptions(ValueError('Outer.'),
|
|
424
|
+
....: TypeError('Inner1.'), TypeError('Inner2.'))
|
|
425
|
+
Traceback (most recent call last):
|
|
426
|
+
...
|
|
427
|
+
ValueError: Outer.
|
|
428
|
+
> *previous* TypeError: Inner1.
|
|
429
|
+
> *and* TypeError: Inner2.
|
|
430
|
+
sage: raise combine_exceptions(ValueError('Outer.'),
|
|
431
|
+
....: combine_exceptions(TypeError('Middle.'),
|
|
432
|
+
....: TypeError('Inner.')))
|
|
433
|
+
Traceback (most recent call last):
|
|
434
|
+
...
|
|
435
|
+
ValueError: Outer.
|
|
436
|
+
> *previous* TypeError: Middle.
|
|
437
|
+
>> *previous* TypeError: Inner.
|
|
438
|
+
"""
|
|
439
|
+
import re
|
|
440
|
+
msg = ('\n *previous* ' +
|
|
441
|
+
'\n *and* '.join("%s: %s" % (ff.__class__.__name__, str(ff)) for ff in f))
|
|
442
|
+
msg = re.sub(r'^([>]* \*previous\*)', r'>\1', msg, flags=re.MULTILINE)
|
|
443
|
+
msg = re.sub(r'^([>]* \*and\*)', r'>\1', msg, flags=re.MULTILINE)
|
|
444
|
+
msg = str(e.args if len(e.args) > 1 else e.args[0]) + msg
|
|
445
|
+
e.args = (msg,)
|
|
446
|
+
return e
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def substitute_raise_exception(element, e):
|
|
450
|
+
r"""
|
|
451
|
+
Raise an error describing what went wrong with the substitution.
|
|
452
|
+
|
|
453
|
+
INPUT:
|
|
454
|
+
|
|
455
|
+
- ``element`` -- an element
|
|
456
|
+
|
|
457
|
+
- ``e`` -- an exception which is included in the raised error message
|
|
458
|
+
|
|
459
|
+
OUTPUT: raise an exception of the same type as ``e``
|
|
460
|
+
|
|
461
|
+
TESTS::
|
|
462
|
+
|
|
463
|
+
sage: from sage.rings.asymptotic.misc import substitute_raise_exception
|
|
464
|
+
sage: substitute_raise_exception(x, Exception('blub')) # needs sage.symbolic
|
|
465
|
+
Traceback (most recent call last):
|
|
466
|
+
...
|
|
467
|
+
Exception: Cannot substitute in x in Symbolic Ring.
|
|
468
|
+
> *previous* Exception: blub
|
|
469
|
+
"""
|
|
470
|
+
raise combine_exceptions(
|
|
471
|
+
type(e)('Cannot substitute in %s in %s.' %
|
|
472
|
+
(element, element.parent())), e)
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
def bidirectional_merge_overlapping(A, B, key=None):
|
|
476
|
+
r"""
|
|
477
|
+
Merge the two overlapping tuples/lists.
|
|
478
|
+
|
|
479
|
+
INPUT:
|
|
480
|
+
|
|
481
|
+
- ``A`` -- list or tuple (type has to coincide with type of ``B``)
|
|
482
|
+
|
|
483
|
+
- ``B`` -- list or tuple (type has to coincide with type of ``A``)
|
|
484
|
+
|
|
485
|
+
- ``key`` -- (default: ``None``) a function. If ``None``, then the
|
|
486
|
+
identity is used. This ``key``-function applied on an element
|
|
487
|
+
of the list/tuple is used for comparison. Thus elements with the
|
|
488
|
+
same key are considered as equal.
|
|
489
|
+
|
|
490
|
+
OUTPUT:
|
|
491
|
+
|
|
492
|
+
A pair of lists or tuples (depending on the type of ``A`` and ``B``).
|
|
493
|
+
|
|
494
|
+
.. NOTE::
|
|
495
|
+
|
|
496
|
+
Suppose we can decompose the list `A=ac` and `B=cb` with
|
|
497
|
+
lists `a`, `b`, `c`, where `c` is nonempty. Then
|
|
498
|
+
:func:`bidirectional_merge_overlapping` returns the pair `(acb, acb)`.
|
|
499
|
+
|
|
500
|
+
Suppose a ``key``-function is specified and `A=ac_A` and
|
|
501
|
+
`B=c_Bb`, where the list of keys of the elements of `c_A`
|
|
502
|
+
equals the list of keys of the elements of `c_B`. Then
|
|
503
|
+
:func:`bidirectional_merge_overlapping` returns the pair `(ac_Ab, ac_Bb)`.
|
|
504
|
+
|
|
505
|
+
After unsuccessfully merging `A=ac` and `B=cb`,
|
|
506
|
+
a merge of `A=ca` and `B=bc` is tried.
|
|
507
|
+
|
|
508
|
+
TESTS::
|
|
509
|
+
|
|
510
|
+
sage: from sage.rings.asymptotic.misc import bidirectional_merge_overlapping
|
|
511
|
+
sage: def f(L, s):
|
|
512
|
+
....: return list((ell, s) for ell in L)
|
|
513
|
+
sage: key = lambda k: k[0]
|
|
514
|
+
sage: bidirectional_merge_overlapping(f([0..3], 'a'), f([5..7], 'b'), key)
|
|
515
|
+
Traceback (most recent call last):
|
|
516
|
+
...
|
|
517
|
+
ValueError: Input does not have an overlap.
|
|
518
|
+
sage: bidirectional_merge_overlapping(f([0..2], 'a'), f([4..7], 'b'), key)
|
|
519
|
+
Traceback (most recent call last):
|
|
520
|
+
...
|
|
521
|
+
ValueError: Input does not have an overlap.
|
|
522
|
+
sage: bidirectional_merge_overlapping(f([4..7], 'a'), f([0..2], 'b'), key)
|
|
523
|
+
Traceback (most recent call last):
|
|
524
|
+
...
|
|
525
|
+
ValueError: Input does not have an overlap.
|
|
526
|
+
sage: bidirectional_merge_overlapping(f([0..3], 'a'), f([3..4], 'b'), key)
|
|
527
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a'), (4, 'b')],
|
|
528
|
+
[(0, 'a'), (1, 'a'), (2, 'a'), (3, 'b'), (4, 'b')])
|
|
529
|
+
sage: bidirectional_merge_overlapping(f([3..4], 'a'), f([0..3], 'b'), key)
|
|
530
|
+
([(0, 'b'), (1, 'b'), (2, 'b'), (3, 'a'), (4, 'a')],
|
|
531
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b'), (4, 'a')])
|
|
532
|
+
sage: bidirectional_merge_overlapping(f([0..1], 'a'), f([0..4], 'b'), key)
|
|
533
|
+
([(0, 'a'), (1, 'a'), (2, 'b'), (3, 'b'), (4, 'b')],
|
|
534
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b'), (4, 'b')])
|
|
535
|
+
sage: bidirectional_merge_overlapping(f([0..3], 'a'), f([0..1], 'b'), key)
|
|
536
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
537
|
+
[(0, 'b'), (1, 'b'), (2, 'a'), (3, 'a')])
|
|
538
|
+
sage: bidirectional_merge_overlapping(f([0..3], 'a'), f([1..3], 'b'), key)
|
|
539
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
540
|
+
[(0, 'a'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
541
|
+
sage: bidirectional_merge_overlapping(f([1..3], 'a'), f([0..3], 'b'), key)
|
|
542
|
+
([(0, 'b'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
543
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
544
|
+
sage: bidirectional_merge_overlapping(f([0..6], 'a'), f([3..4], 'b'), key)
|
|
545
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'), (6, 'a')],
|
|
546
|
+
[(0, 'a'), (1, 'a'), (2, 'a'), (3, 'b'), (4, 'b'), (5, 'a'), (6, 'a')])
|
|
547
|
+
sage: bidirectional_merge_overlapping(f([0..3], 'a'), f([1..2], 'b'), key)
|
|
548
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
549
|
+
[(0, 'a'), (1, 'b'), (2, 'b'), (3, 'a')])
|
|
550
|
+
sage: bidirectional_merge_overlapping(f([1..2], 'a'), f([0..3], 'b'), key)
|
|
551
|
+
([(0, 'b'), (1, 'a'), (2, 'a'), (3, 'b')],
|
|
552
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
553
|
+
sage: bidirectional_merge_overlapping(f([1..3], 'a'), f([1..3], 'b'), key)
|
|
554
|
+
([(1, 'a'), (2, 'a'), (3, 'a')],
|
|
555
|
+
[(1, 'b'), (2, 'b'), (3, 'b')])
|
|
556
|
+
"""
|
|
557
|
+
if key is None:
|
|
558
|
+
Akeys = A
|
|
559
|
+
Bkeys = B
|
|
560
|
+
else:
|
|
561
|
+
Akeys = tuple(key(a) for a in A)
|
|
562
|
+
Bkeys = tuple(key(b) for b in B)
|
|
563
|
+
|
|
564
|
+
def find_overlapping_index(A, B):
|
|
565
|
+
if len(B) > len(A) - 2:
|
|
566
|
+
raise StopIteration
|
|
567
|
+
matches = iter(i for i in range(1, len(A) - len(B))
|
|
568
|
+
if A[i:i+len(B)] == B)
|
|
569
|
+
return next(matches)
|
|
570
|
+
|
|
571
|
+
def find_mergedoverlapping_index(A, B):
|
|
572
|
+
"""
|
|
573
|
+
Return in index i where to merge two overlapping tuples/lists ``A`` and ``B``.
|
|
574
|
+
|
|
575
|
+
Then ``A + B[i:]`` or ``A[:-i] + B`` are the merged tuples/lists.
|
|
576
|
+
|
|
577
|
+
Adapted from https://stackoverflow.com/a/30056066/1052778.
|
|
578
|
+
"""
|
|
579
|
+
matches = iter(i for i in range(min(len(A), len(B)), 0, -1)
|
|
580
|
+
if A[-i:] == B[:i])
|
|
581
|
+
return next(matches, 0)
|
|
582
|
+
|
|
583
|
+
i = find_mergedoverlapping_index(Akeys, Bkeys)
|
|
584
|
+
if i > 0:
|
|
585
|
+
return A + B[i:], A[:-i] + B
|
|
586
|
+
|
|
587
|
+
i = find_mergedoverlapping_index(Bkeys, Akeys)
|
|
588
|
+
if i > 0:
|
|
589
|
+
return B[:-i] + A, B + A[i:]
|
|
590
|
+
|
|
591
|
+
try:
|
|
592
|
+
i = find_overlapping_index(Akeys, Bkeys)
|
|
593
|
+
except StopIteration:
|
|
594
|
+
pass
|
|
595
|
+
else:
|
|
596
|
+
return A, A[:i] + B + A[i+len(B):]
|
|
597
|
+
|
|
598
|
+
try:
|
|
599
|
+
i = find_overlapping_index(Bkeys, Akeys)
|
|
600
|
+
except StopIteration:
|
|
601
|
+
pass
|
|
602
|
+
else:
|
|
603
|
+
return B[:i] + A + B[i+len(A):], B
|
|
604
|
+
|
|
605
|
+
raise ValueError('Input does not have an overlap.')
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def bidirectional_merge_sorted(A, B, key=None):
|
|
609
|
+
r"""
|
|
610
|
+
Merge the two tuples/lists, keeping the orders provided by them.
|
|
611
|
+
|
|
612
|
+
INPUT:
|
|
613
|
+
|
|
614
|
+
- ``A`` -- list or tuple (type has to coincide with type of ``B``)
|
|
615
|
+
|
|
616
|
+
- ``B`` -- list or tuple (type has to coincide with type of ``A``)
|
|
617
|
+
|
|
618
|
+
- ``key`` -- (default: ``None``) a function. If ``None``, then the
|
|
619
|
+
identity is used. This ``key``-function applied on an element
|
|
620
|
+
of the list/tuple is used for comparison. Thus elements with the
|
|
621
|
+
same key are considered as equal.
|
|
622
|
+
|
|
623
|
+
.. NOTE::
|
|
624
|
+
|
|
625
|
+
The two tuples/list need to overlap, i.e. need at least
|
|
626
|
+
one key in common.
|
|
627
|
+
|
|
628
|
+
OUTPUT:
|
|
629
|
+
|
|
630
|
+
A pair of lists containing all elements totally ordered. (The first
|
|
631
|
+
component uses ``A`` as a merge base, the second component ``B``.)
|
|
632
|
+
|
|
633
|
+
If merging fails, then a
|
|
634
|
+
:python:`RuntimeError<library/exceptions.html#exceptions.RuntimeError>`
|
|
635
|
+
is raised.
|
|
636
|
+
|
|
637
|
+
TESTS::
|
|
638
|
+
|
|
639
|
+
sage: from sage.rings.asymptotic.misc import bidirectional_merge_sorted
|
|
640
|
+
sage: def f(L, s):
|
|
641
|
+
....: return list((ell, s) for ell in L)
|
|
642
|
+
sage: key = lambda k: k[0]
|
|
643
|
+
sage: bidirectional_merge_sorted(f([0..3], 'a'), f([5..7], 'b'), key)
|
|
644
|
+
Traceback (most recent call last):
|
|
645
|
+
...
|
|
646
|
+
RuntimeError: no common elements
|
|
647
|
+
sage: bidirectional_merge_sorted(f([0..2], 'a'), f([4..7], 'b'), key)
|
|
648
|
+
Traceback (most recent call last):
|
|
649
|
+
...
|
|
650
|
+
RuntimeError: no common elements
|
|
651
|
+
sage: bidirectional_merge_sorted(f([4..7], 'a'), f([0..2], 'b'), key)
|
|
652
|
+
Traceback (most recent call last):
|
|
653
|
+
...
|
|
654
|
+
RuntimeError: no common elements
|
|
655
|
+
sage: bidirectional_merge_sorted(f([0..3], 'a'), f([3..4], 'b'), key)
|
|
656
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a'), (4, 'b')],
|
|
657
|
+
[(0, 'a'), (1, 'a'), (2, 'a'), (3, 'b'), (4, 'b')])
|
|
658
|
+
sage: bidirectional_merge_sorted(f([3..4], 'a'), f([0..3], 'b'), key)
|
|
659
|
+
([(0, 'b'), (1, 'b'), (2, 'b'), (3, 'a'), (4, 'a')],
|
|
660
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b'), (4, 'a')])
|
|
661
|
+
sage: bidirectional_merge_sorted(f([0..1], 'a'), f([0..4], 'b'), key)
|
|
662
|
+
([(0, 'a'), (1, 'a'), (2, 'b'), (3, 'b'), (4, 'b')],
|
|
663
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b'), (4, 'b')])
|
|
664
|
+
sage: bidirectional_merge_sorted(f([0..3], 'a'), f([0..1], 'b'), key)
|
|
665
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
666
|
+
[(0, 'b'), (1, 'b'), (2, 'a'), (3, 'a')])
|
|
667
|
+
sage: bidirectional_merge_sorted(f([0..3], 'a'), f([1..3], 'b'), key)
|
|
668
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
669
|
+
[(0, 'a'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
670
|
+
sage: bidirectional_merge_sorted(f([1..3], 'a'), f([0..3], 'b'), key)
|
|
671
|
+
([(0, 'b'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
672
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
673
|
+
sage: bidirectional_merge_sorted(f([0..6], 'a'), f([3..4], 'b'), key)
|
|
674
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'), (6, 'a')],
|
|
675
|
+
[(0, 'a'), (1, 'a'), (2, 'a'), (3, 'b'), (4, 'b'), (5, 'a'), (6, 'a')])
|
|
676
|
+
sage: bidirectional_merge_sorted(f([0..3], 'a'), f([1..2], 'b'), key)
|
|
677
|
+
([(0, 'a'), (1, 'a'), (2, 'a'), (3, 'a')],
|
|
678
|
+
[(0, 'a'), (1, 'b'), (2, 'b'), (3, 'a')])
|
|
679
|
+
sage: bidirectional_merge_sorted(f([1..2], 'a'), f([0..3], 'b'), key)
|
|
680
|
+
([(0, 'b'), (1, 'a'), (2, 'a'), (3, 'b')],
|
|
681
|
+
[(0, 'b'), (1, 'b'), (2, 'b'), (3, 'b')])
|
|
682
|
+
sage: bidirectional_merge_sorted(f([1..3], 'a'), f([1..3], 'b'), key)
|
|
683
|
+
([(1, 'a'), (2, 'a'), (3, 'a')],
|
|
684
|
+
[(1, 'b'), (2, 'b'), (3, 'b')])
|
|
685
|
+
|
|
686
|
+
::
|
|
687
|
+
|
|
688
|
+
sage: bidirectional_merge_sorted(f([1, 2, 3], 'a'), f([1, 3], 'b'), key)
|
|
689
|
+
([(1, 'a'), (2, 'a'), (3, 'a')],
|
|
690
|
+
[(1, 'b'), (2, 'a'), (3, 'b')])
|
|
691
|
+
sage: bidirectional_merge_sorted(f([1, 4, 5, 6], 'a'), f([1, 2, 3, 4, 6], 'b'), key)
|
|
692
|
+
([(1, 'a'), (2, 'b'), (3, 'b'), (4, 'a'), (5, 'a'), (6, 'a')],
|
|
693
|
+
[(1, 'b'), (2, 'b'), (3, 'b'), (4, 'b'), (5, 'a'), (6, 'b')])
|
|
694
|
+
sage: bidirectional_merge_sorted(f([1, 2, 3, 4], 'a'), f([1, 3, 5], 'b'), key)
|
|
695
|
+
Traceback (most recent call last):
|
|
696
|
+
...
|
|
697
|
+
RuntimeError: sorting not unique
|
|
698
|
+
sage: bidirectional_merge_sorted(f([1, 2], 'a'), f([2, 1], 'b'), key)
|
|
699
|
+
Traceback (most recent call last):
|
|
700
|
+
...
|
|
701
|
+
RuntimeError: sorting in lists not compatible
|
|
702
|
+
sage: bidirectional_merge_sorted(f([1, 2, 4], 'a'), f([1, 3, 4], 'b'), key)
|
|
703
|
+
Traceback (most recent call last):
|
|
704
|
+
...
|
|
705
|
+
RuntimeError: sorting not unique
|
|
706
|
+
"""
|
|
707
|
+
if key is None:
|
|
708
|
+
Akeys = A
|
|
709
|
+
Bkeys = B
|
|
710
|
+
else:
|
|
711
|
+
Akeys = tuple(key(a) for a in A)
|
|
712
|
+
Bkeys = tuple(key(b) for b in B)
|
|
713
|
+
|
|
714
|
+
matches = tuple((i, j)
|
|
715
|
+
for i, a in enumerate(Akeys)
|
|
716
|
+
for j, b in enumerate(Bkeys)
|
|
717
|
+
if a == b)
|
|
718
|
+
if not matches:
|
|
719
|
+
raise RuntimeError('no common elements')
|
|
720
|
+
|
|
721
|
+
resultA = []
|
|
722
|
+
resultB = []
|
|
723
|
+
last = (0, 0)
|
|
724
|
+
end = (len(A), len(B))
|
|
725
|
+
for current in matches + (end,):
|
|
726
|
+
if not all(a <= b for a, b in zip(last, current)):
|
|
727
|
+
raise RuntimeError('sorting in lists not compatible')
|
|
728
|
+
if last[0] == current[0]:
|
|
729
|
+
resultA.extend(B[last[1]:current[1]])
|
|
730
|
+
resultB.extend(B[last[1]:current[1]])
|
|
731
|
+
elif last[1] == current[1]:
|
|
732
|
+
resultA.extend(A[last[0]:current[0]])
|
|
733
|
+
resultB.extend(A[last[0]:current[0]])
|
|
734
|
+
else:
|
|
735
|
+
raise RuntimeError('sorting not unique')
|
|
736
|
+
if current != end:
|
|
737
|
+
resultA.append(A[current[0]])
|
|
738
|
+
resultB.append(B[current[1]])
|
|
739
|
+
last = (current[0]+1, current[1]+1)
|
|
740
|
+
|
|
741
|
+
return (resultA, resultB)
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
def log_string(element, base=None):
|
|
745
|
+
r"""
|
|
746
|
+
Return a representation of the log of the given element to the
|
|
747
|
+
given base.
|
|
748
|
+
|
|
749
|
+
INPUT:
|
|
750
|
+
|
|
751
|
+
- ``element`` -- an object
|
|
752
|
+
|
|
753
|
+
- ``base`` -- an object or ``None``
|
|
754
|
+
|
|
755
|
+
OUTPUT: string
|
|
756
|
+
|
|
757
|
+
EXAMPLES::
|
|
758
|
+
|
|
759
|
+
sage: from sage.rings.asymptotic.misc import log_string
|
|
760
|
+
sage: log_string(3)
|
|
761
|
+
'log(3)'
|
|
762
|
+
sage: log_string(3, base=42)
|
|
763
|
+
'log(3, base=42)'
|
|
764
|
+
"""
|
|
765
|
+
basestr = ', base=' + str(base) if base else ''
|
|
766
|
+
return 'log(%s%s)' % (element, basestr)
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
def strip_symbolic(expression):
|
|
770
|
+
r"""
|
|
771
|
+
Return, if possible, the underlying (numeric) object of
|
|
772
|
+
the symbolic expression.
|
|
773
|
+
|
|
774
|
+
If ``expression`` is not symbolic, then ``expression`` is returned.
|
|
775
|
+
|
|
776
|
+
INPUT:
|
|
777
|
+
|
|
778
|
+
- ``expression`` -- an object
|
|
779
|
+
|
|
780
|
+
OUTPUT: an object
|
|
781
|
+
|
|
782
|
+
EXAMPLES::
|
|
783
|
+
|
|
784
|
+
sage: # needs sage.symbolic
|
|
785
|
+
sage: from sage.rings.asymptotic.misc import strip_symbolic
|
|
786
|
+
sage: strip_symbolic(SR(2)); _.parent()
|
|
787
|
+
2
|
|
788
|
+
Integer Ring
|
|
789
|
+
sage: strip_symbolic(SR(2/3)); _.parent()
|
|
790
|
+
2/3
|
|
791
|
+
Rational Field
|
|
792
|
+
sage: strip_symbolic(SR('x')); _.parent()
|
|
793
|
+
x
|
|
794
|
+
Symbolic Ring
|
|
795
|
+
sage: strip_symbolic(pi); _.parent()
|
|
796
|
+
pi
|
|
797
|
+
Symbolic Ring
|
|
798
|
+
"""
|
|
799
|
+
from sage.structure.element import parent, Element
|
|
800
|
+
from sage.symbolic.ring import SymbolicRing
|
|
801
|
+
|
|
802
|
+
P = parent(expression)
|
|
803
|
+
if isinstance(P, SymbolicRing):
|
|
804
|
+
try:
|
|
805
|
+
stripped = expression.pyobject()
|
|
806
|
+
if isinstance(stripped, Element):
|
|
807
|
+
return stripped
|
|
808
|
+
except TypeError:
|
|
809
|
+
pass
|
|
810
|
+
return expression
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
class NotImplementedOZero(NotImplementedError):
|
|
814
|
+
r"""
|
|
815
|
+
A special :python:`NotImplementedError<library/exceptions.html#exceptions.NotImplementedError>`
|
|
816
|
+
which is raised when the result is O(0) which means 0
|
|
817
|
+
for sufficiently large values of the variable.
|
|
818
|
+
"""
|
|
819
|
+
def __init__(self, asymptotic_ring=None, var=None, exact_part=0):
|
|
820
|
+
r"""
|
|
821
|
+
INPUT:
|
|
822
|
+
|
|
823
|
+
- ``asymptotic_ring`` -- (default: ``None``) an :class:`AsymptoticRing`
|
|
824
|
+
or ``None``
|
|
825
|
+
|
|
826
|
+
- ``var`` -- (default: ``None``) a string
|
|
827
|
+
|
|
828
|
+
Either ``asymptotic_ring`` or ``var`` has to be specified.
|
|
829
|
+
|
|
830
|
+
- ``exact_part`` -- (default: ``0``) asymptotic expansion
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: from sage.rings.asymptotic.misc import NotImplementedOZero
|
|
835
|
+
|
|
836
|
+
sage: # needs sage.symbolic
|
|
837
|
+
sage: A = AsymptoticRing('n^ZZ', ZZ)
|
|
838
|
+
sage: raise NotImplementedOZero(A)
|
|
839
|
+
Traceback (most recent call last):
|
|
840
|
+
...
|
|
841
|
+
NotImplementedOZero: got O(0)
|
|
842
|
+
The error term O(0) means 0 for sufficiently large n.
|
|
843
|
+
|
|
844
|
+
sage: raise NotImplementedOZero(var='m')
|
|
845
|
+
Traceback (most recent call last):
|
|
846
|
+
...
|
|
847
|
+
NotImplementedOZero: got O(0)
|
|
848
|
+
The error term O(0) means 0 for sufficiently large m.
|
|
849
|
+
|
|
850
|
+
TESTS::
|
|
851
|
+
|
|
852
|
+
sage: raise NotImplementedOZero(A, var='m') # needs sage.symbolic
|
|
853
|
+
Traceback (most recent call last):
|
|
854
|
+
...
|
|
855
|
+
ValueError: specify either 'asymptotic_ring' or 'var'
|
|
856
|
+
sage: raise NotImplementedOZero()
|
|
857
|
+
Traceback (most recent call last):
|
|
858
|
+
...
|
|
859
|
+
ValueError: specify either 'asymptotic_ring' or 'var'
|
|
860
|
+
"""
|
|
861
|
+
if (asymptotic_ring is None) == (var is None):
|
|
862
|
+
raise ValueError("specify either 'asymptotic_ring' or 'var'")
|
|
863
|
+
|
|
864
|
+
if var is None:
|
|
865
|
+
var = ', '.join(str(g) for g in asymptotic_ring.gens())
|
|
866
|
+
message = ('got {}\n'.format(('{} + '.format(exact_part) if exact_part else '')
|
|
867
|
+
+ 'O(0)') +
|
|
868
|
+
'The error term O(0) '
|
|
869
|
+
'means 0 for sufficiently large {}.'.format(var))
|
|
870
|
+
|
|
871
|
+
if asymptotic_ring is not None and isinstance(exact_part, int) and exact_part == 0:
|
|
872
|
+
exact_part = asymptotic_ring.zero()
|
|
873
|
+
self.exact_part = exact_part
|
|
874
|
+
|
|
875
|
+
super().__init__(message)
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
class NotImplementedBZero(NotImplementedError):
|
|
879
|
+
r"""
|
|
880
|
+
A special :python:`NotImplementedError<library/exceptions.html#exceptions.NotImplementedError>`
|
|
881
|
+
which is raised when the result is B(0) which means 0
|
|
882
|
+
for sufficiently large values of the variable.
|
|
883
|
+
"""
|
|
884
|
+
def __init__(self, asymptotic_ring=None, var=None, exact_part=0):
|
|
885
|
+
r"""
|
|
886
|
+
INPUT:
|
|
887
|
+
|
|
888
|
+
- ``asymptotic_ring`` -- (default: ``None``) an :class:`AsymptoticRing`
|
|
889
|
+
or ``None``
|
|
890
|
+
|
|
891
|
+
- ``var`` -- (default: ``None``) string
|
|
892
|
+
|
|
893
|
+
Either ``asymptotic_ring`` or ``var`` has to be specified.
|
|
894
|
+
|
|
895
|
+
- ``exact_part`` -- (default: ``0``) asymptotic expansion
|
|
896
|
+
|
|
897
|
+
EXAMPLES::
|
|
898
|
+
|
|
899
|
+
sage: from sage.rings.asymptotic.misc import NotImplementedBZero
|
|
900
|
+
|
|
901
|
+
sage: # needs sage.symbolic
|
|
902
|
+
sage: A = AsymptoticRing('n^ZZ', ZZ)
|
|
903
|
+
sage: raise NotImplementedBZero(A)
|
|
904
|
+
Traceback (most recent call last):
|
|
905
|
+
...
|
|
906
|
+
NotImplementedBZero: got B(0)
|
|
907
|
+
The error term B(0) means 0 for sufficiently large n.
|
|
908
|
+
sage: raise NotImplementedBZero(var='m')
|
|
909
|
+
Traceback (most recent call last):
|
|
910
|
+
...
|
|
911
|
+
NotImplementedBZero: got B(0)
|
|
912
|
+
The error term B(0) means 0 for sufficiently large m.
|
|
913
|
+
sage: AR.<n> = AsymptoticRing('n^QQ', QQ)
|
|
914
|
+
sage: AR(0).B(42)
|
|
915
|
+
Traceback (most recent call last):
|
|
916
|
+
...
|
|
917
|
+
NotImplementedBZero: got B(0)
|
|
918
|
+
The error term B(0) means 0 for sufficiently large n.
|
|
919
|
+
|
|
920
|
+
TESTS::
|
|
921
|
+
|
|
922
|
+
sage: raise NotImplementedBZero(A, var='m') # needs sage.symbolic
|
|
923
|
+
Traceback (most recent call last):
|
|
924
|
+
...
|
|
925
|
+
ValueError: specify either 'asymptotic_ring' or 'var'
|
|
926
|
+
sage: raise NotImplementedBZero()
|
|
927
|
+
Traceback (most recent call last):
|
|
928
|
+
...
|
|
929
|
+
ValueError: specify either 'asymptotic_ring' or 'var'
|
|
930
|
+
"""
|
|
931
|
+
if (asymptotic_ring is None) == (var is None):
|
|
932
|
+
raise ValueError("specify either 'asymptotic_ring' or 'var'")
|
|
933
|
+
|
|
934
|
+
if var is None:
|
|
935
|
+
var = ', '.join(str(g) for g in asymptotic_ring.gens())
|
|
936
|
+
message = ('got {}\n'.format(('{} + '.format(exact_part) if exact_part else '')
|
|
937
|
+
+ 'B(0)') +
|
|
938
|
+
'The error term B(0) '
|
|
939
|
+
'means 0 for sufficiently large {}.'.format(var))
|
|
940
|
+
|
|
941
|
+
if asymptotic_ring is not None and isinstance(exact_part, int) and exact_part == 0:
|
|
942
|
+
exact_part = asymptotic_ring.zero()
|
|
943
|
+
self.exact_part = exact_part
|
|
944
|
+
|
|
945
|
+
super().__init__(message)
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
def transform_category(category,
|
|
949
|
+
subcategory_mapping, axiom_mapping,
|
|
950
|
+
initial_category=None):
|
|
951
|
+
r"""
|
|
952
|
+
Transform ``category`` to a new category according to the given
|
|
953
|
+
mappings.
|
|
954
|
+
|
|
955
|
+
INPUT:
|
|
956
|
+
|
|
957
|
+
- ``category`` -- a category
|
|
958
|
+
|
|
959
|
+
- ``subcategory_mapping`` -- list (or other iterable) of triples
|
|
960
|
+
``(from, to, mandatory)``, where
|
|
961
|
+
|
|
962
|
+
- ``from`` and ``to`` are categories and
|
|
963
|
+
- ``mandatory`` is a boolean.
|
|
964
|
+
|
|
965
|
+
- ``axiom_mapping`` -- list (or other iterable) of triples
|
|
966
|
+
``(from, to, mandatory)``, where
|
|
967
|
+
|
|
968
|
+
- ``from`` and ``to`` are strings describing axioms and
|
|
969
|
+
- ``mandatory`` is a boolean.
|
|
970
|
+
|
|
971
|
+
- ``initial_category`` -- (default: ``None``) a category. When
|
|
972
|
+
transforming the given category, this ``initial_category`` is
|
|
973
|
+
used as a starting point of the result. This means the resulting
|
|
974
|
+
category will be a subcategory of ``initial_category``.
|
|
975
|
+
If ``initial_category`` is ``None``, then the
|
|
976
|
+
:class:`category of objects <sage.categories.objects.Objects>`
|
|
977
|
+
is used.
|
|
978
|
+
|
|
979
|
+
OUTPUT: a category
|
|
980
|
+
|
|
981
|
+
.. NOTE::
|
|
982
|
+
|
|
983
|
+
Consider a subcategory mapping ``(from, to, mandatory)``. If
|
|
984
|
+
``category`` is a subcategory of ``from``, then the
|
|
985
|
+
returned category will be a subcategory of ``to``. Otherwise and
|
|
986
|
+
if ``mandatory`` is set, then an error is raised.
|
|
987
|
+
|
|
988
|
+
Consider an axiom mapping ``(from, to, mandatory)``. If
|
|
989
|
+
``category`` is has axiom ``from``, then the
|
|
990
|
+
returned category will have axiom ``to``. Otherwise and
|
|
991
|
+
if ``mandatory`` is set, then an error is raised.
|
|
992
|
+
|
|
993
|
+
EXAMPLES::
|
|
994
|
+
|
|
995
|
+
sage: from sage.rings.asymptotic.misc import transform_category
|
|
996
|
+
sage: from sage.categories.additive_semigroups import AdditiveSemigroups
|
|
997
|
+
sage: from sage.categories.additive_monoids import AdditiveMonoids
|
|
998
|
+
sage: from sage.categories.additive_groups import AdditiveGroups
|
|
999
|
+
sage: S = [
|
|
1000
|
+
....: (Sets(), Sets(), True),
|
|
1001
|
+
....: (Posets(), Posets(), False),
|
|
1002
|
+
....: (AdditiveMagmas(), Magmas(), False)]
|
|
1003
|
+
sage: A = [
|
|
1004
|
+
....: ('AdditiveAssociative', 'Associative', False),
|
|
1005
|
+
....: ('AdditiveUnital', 'Unital', False),
|
|
1006
|
+
....: ('AdditiveInverse', 'Inverse', False),
|
|
1007
|
+
....: ('AdditiveCommutative', 'Commutative', False)]
|
|
1008
|
+
sage: transform_category(Objects(), S, A)
|
|
1009
|
+
Traceback (most recent call last):
|
|
1010
|
+
...
|
|
1011
|
+
ValueError: Category of objects is not
|
|
1012
|
+
a subcategory of Category of sets.
|
|
1013
|
+
sage: transform_category(Sets(), S, A)
|
|
1014
|
+
Category of sets
|
|
1015
|
+
sage: transform_category(Posets(), S, A)
|
|
1016
|
+
Category of posets
|
|
1017
|
+
sage: transform_category(AdditiveSemigroups(), S, A)
|
|
1018
|
+
Category of semigroups
|
|
1019
|
+
sage: transform_category(AdditiveMonoids(), S, A)
|
|
1020
|
+
Category of monoids
|
|
1021
|
+
sage: transform_category(AdditiveGroups(), S, A)
|
|
1022
|
+
Category of groups
|
|
1023
|
+
sage: transform_category(AdditiveGroups().AdditiveCommutative(), S, A)
|
|
1024
|
+
Category of commutative groups
|
|
1025
|
+
|
|
1026
|
+
::
|
|
1027
|
+
|
|
1028
|
+
sage: transform_category(AdditiveGroups().AdditiveCommutative(), S, A,
|
|
1029
|
+
....: initial_category=Posets())
|
|
1030
|
+
Join of Category of commutative groups
|
|
1031
|
+
and Category of posets
|
|
1032
|
+
|
|
1033
|
+
::
|
|
1034
|
+
|
|
1035
|
+
sage: transform_category(ZZ.category(), S, A)
|
|
1036
|
+
Category of commutative groups
|
|
1037
|
+
sage: transform_category(QQ.category(), S, A)
|
|
1038
|
+
Category of commutative groups
|
|
1039
|
+
sage: transform_category(SR.category(), S, A) # needs sage.symbolic
|
|
1040
|
+
Category of commutative groups
|
|
1041
|
+
sage: transform_category(Fields(), S, A)
|
|
1042
|
+
Category of commutative groups
|
|
1043
|
+
sage: transform_category(ZZ['t'].category(), S, A)
|
|
1044
|
+
Category of commutative groups
|
|
1045
|
+
|
|
1046
|
+
::
|
|
1047
|
+
|
|
1048
|
+
sage: A[-1] = ('Commutative', 'AdditiveCommutative', True)
|
|
1049
|
+
sage: transform_category(Groups(), S, A)
|
|
1050
|
+
Traceback (most recent call last):
|
|
1051
|
+
...
|
|
1052
|
+
ValueError: Category of groups does not have
|
|
1053
|
+
axiom Commutative.
|
|
1054
|
+
"""
|
|
1055
|
+
if initial_category is None:
|
|
1056
|
+
from sage.categories.objects import Objects
|
|
1057
|
+
result = Objects()
|
|
1058
|
+
else:
|
|
1059
|
+
result = initial_category
|
|
1060
|
+
|
|
1061
|
+
for A, B, mandatory in subcategory_mapping:
|
|
1062
|
+
if category.is_subcategory(A):
|
|
1063
|
+
result &= B
|
|
1064
|
+
elif mandatory:
|
|
1065
|
+
raise ValueError('%s is not a subcategory of %s.' %
|
|
1066
|
+
(category, A))
|
|
1067
|
+
|
|
1068
|
+
axioms = category.axioms()
|
|
1069
|
+
for A, B, mandatory in axiom_mapping:
|
|
1070
|
+
if A in axioms:
|
|
1071
|
+
result = result._with_axiom(B)
|
|
1072
|
+
elif mandatory:
|
|
1073
|
+
raise ValueError('%s does not have axiom %s.' %
|
|
1074
|
+
(category, A))
|
|
1075
|
+
|
|
1076
|
+
return result
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
class Locals(dict):
|
|
1080
|
+
r"""
|
|
1081
|
+
A frozen dictionary-like class for storing locals
|
|
1082
|
+
of an :class:`~sage.rings.asymptotic.asymptotic_ring.AsymptoticRing`.
|
|
1083
|
+
|
|
1084
|
+
EXAMPLES::
|
|
1085
|
+
|
|
1086
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1087
|
+
sage: locals = Locals({'a': 42})
|
|
1088
|
+
sage: locals['a']
|
|
1089
|
+
42
|
|
1090
|
+
|
|
1091
|
+
The object contains default values (see :meth:`default_locals`)
|
|
1092
|
+
for some keys::
|
|
1093
|
+
|
|
1094
|
+
sage: locals['log']
|
|
1095
|
+
<function log at 0x...>
|
|
1096
|
+
"""
|
|
1097
|
+
def __getitem__(self, key):
|
|
1098
|
+
r"""
|
|
1099
|
+
Return an item.
|
|
1100
|
+
|
|
1101
|
+
TESTS::
|
|
1102
|
+
|
|
1103
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1104
|
+
sage: locals = Locals()
|
|
1105
|
+
sage: locals
|
|
1106
|
+
{}
|
|
1107
|
+
sage: locals['log'] # indirect doctest
|
|
1108
|
+
<function log at 0x...>
|
|
1109
|
+
"""
|
|
1110
|
+
try:
|
|
1111
|
+
return super().__getitem__(key)
|
|
1112
|
+
except KeyError as ke:
|
|
1113
|
+
try:
|
|
1114
|
+
return self.default_locals()[key]
|
|
1115
|
+
except KeyError:
|
|
1116
|
+
raise ke
|
|
1117
|
+
|
|
1118
|
+
def __setitem__(self, key, value):
|
|
1119
|
+
r"""
|
|
1120
|
+
Set an item.
|
|
1121
|
+
|
|
1122
|
+
This raises an error as the object is immutable.
|
|
1123
|
+
|
|
1124
|
+
TESTS::
|
|
1125
|
+
|
|
1126
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1127
|
+
sage: locals = Locals()
|
|
1128
|
+
sage: locals['a'] = 4 # indirect doctest
|
|
1129
|
+
Traceback (most recent call last):
|
|
1130
|
+
...
|
|
1131
|
+
TypeError: locals dictionary is frozen,
|
|
1132
|
+
therefore does not support item assignment
|
|
1133
|
+
"""
|
|
1134
|
+
raise TypeError('locals dictionary is frozen, therefore does not support item assignment')
|
|
1135
|
+
|
|
1136
|
+
@cached_method
|
|
1137
|
+
def _data_(self):
|
|
1138
|
+
r"""
|
|
1139
|
+
Return stored data as tuple sorted by their keys.
|
|
1140
|
+
|
|
1141
|
+
TESTS::
|
|
1142
|
+
|
|
1143
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1144
|
+
sage: locals = Locals({'a': 2, 'b': 1})
|
|
1145
|
+
sage: locals._data_()
|
|
1146
|
+
(('a', 2), ('b', 1))
|
|
1147
|
+
"""
|
|
1148
|
+
return tuple(sorted(self.items(), key=lambda k_v: k_v[0]))
|
|
1149
|
+
|
|
1150
|
+
def __hash__(self):
|
|
1151
|
+
r"""
|
|
1152
|
+
Return a hash value.
|
|
1153
|
+
|
|
1154
|
+
TESTS::
|
|
1155
|
+
|
|
1156
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1157
|
+
sage: locals = Locals({'a': 2, 'b': 1})
|
|
1158
|
+
sage: hash(locals) # random
|
|
1159
|
+
-42
|
|
1160
|
+
"""
|
|
1161
|
+
return hash(self._data_())
|
|
1162
|
+
|
|
1163
|
+
@cached_method
|
|
1164
|
+
def default_locals(self):
|
|
1165
|
+
r"""
|
|
1166
|
+
Return the default locals used in
|
|
1167
|
+
the :class:`~sage.rings.asymptotic.asymptotic_ring.AsymptoticRing`.
|
|
1168
|
+
|
|
1169
|
+
OUTPUT: a dictionary
|
|
1170
|
+
|
|
1171
|
+
EXAMPLES::
|
|
1172
|
+
|
|
1173
|
+
sage: from sage.rings.asymptotic.misc import Locals
|
|
1174
|
+
sage: locals = Locals({'a': 2, 'b': 1})
|
|
1175
|
+
sage: locals
|
|
1176
|
+
{'a': 2, 'b': 1}
|
|
1177
|
+
sage: locals.default_locals()
|
|
1178
|
+
{'log': <function log at 0x...>}
|
|
1179
|
+
sage: locals['log']
|
|
1180
|
+
<function log at 0x...>
|
|
1181
|
+
"""
|
|
1182
|
+
from sage.functions.log import log
|
|
1183
|
+
return {
|
|
1184
|
+
'log': log}
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
class WithLocals(SageObject):
|
|
1188
|
+
r"""
|
|
1189
|
+
A class extensions for handling local values; see also
|
|
1190
|
+
:class:`Locals`.
|
|
1191
|
+
|
|
1192
|
+
This is used in the
|
|
1193
|
+
:class:`~sage.rings.asymptotic.asymptotic_ring.AsymptoticRing`.
|
|
1194
|
+
|
|
1195
|
+
EXAMPLES::
|
|
1196
|
+
|
|
1197
|
+
sage: A.<n> = AsymptoticRing('n^ZZ', QQ, locals={'a': 42}) # needs sage.symbolic
|
|
1198
|
+
sage: A.locals() # needs sage.symbolic
|
|
1199
|
+
{'a': 42}
|
|
1200
|
+
"""
|
|
1201
|
+
@staticmethod
|
|
1202
|
+
def _convert_locals_(locals):
|
|
1203
|
+
r"""
|
|
1204
|
+
This helper method return data converted to :class:`Locals`.
|
|
1205
|
+
|
|
1206
|
+
TESTS::
|
|
1207
|
+
|
|
1208
|
+
sage: # needs sage.symbolic
|
|
1209
|
+
sage: A.<n> = AsymptoticRing('n^ZZ', QQ)
|
|
1210
|
+
sage: locals = A._convert_locals_({'a': 42}); locals
|
|
1211
|
+
{'a': 42}
|
|
1212
|
+
sage: type(locals)
|
|
1213
|
+
<class 'sage.rings.asymptotic.misc.Locals'>
|
|
1214
|
+
"""
|
|
1215
|
+
if locals is None:
|
|
1216
|
+
return Locals()
|
|
1217
|
+
return Locals(locals)
|
|
1218
|
+
|
|
1219
|
+
def locals(self, locals=None):
|
|
1220
|
+
r"""
|
|
1221
|
+
Return the actual :class:`Locals` object to be used.
|
|
1222
|
+
|
|
1223
|
+
INPUT:
|
|
1224
|
+
|
|
1225
|
+
- ``locals`` -- an object
|
|
1226
|
+
|
|
1227
|
+
If ``locals`` is not ``None``, then a :class:`Locals` object
|
|
1228
|
+
is created and returned.
|
|
1229
|
+
If ``locals`` is ``None``, then a stored :class:`Locals` object,
|
|
1230
|
+
if any, is returned. Otherwise, an empty (i.e. no values except
|
|
1231
|
+
the default values)
|
|
1232
|
+
:class:`Locals` object is created and returned.
|
|
1233
|
+
|
|
1234
|
+
OUTPUT: a :class:`Locals` object
|
|
1235
|
+
|
|
1236
|
+
TESTS::
|
|
1237
|
+
|
|
1238
|
+
sage: # needs sage.symbolic
|
|
1239
|
+
sage: A.<n> = AsymptoticRing('n^ZZ', QQ, locals={'a': 42})
|
|
1240
|
+
sage: A.locals()
|
|
1241
|
+
{'a': 42}
|
|
1242
|
+
sage: A.locals({'a': 41})
|
|
1243
|
+
{'a': 41}
|
|
1244
|
+
sage: A.locals({'b': -3})
|
|
1245
|
+
{'b': -3}
|
|
1246
|
+
"""
|
|
1247
|
+
if locals is None:
|
|
1248
|
+
try:
|
|
1249
|
+
locals = self._locals_
|
|
1250
|
+
except AttributeError:
|
|
1251
|
+
pass
|
|
1252
|
+
return self._convert_locals_(locals)
|