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,595 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.graphs
|
|
3
|
+
r"""
|
|
4
|
+
Algebraic topological model for a cell complex
|
|
5
|
+
|
|
6
|
+
This file contains two functions, :func:`algebraic_topological_model`
|
|
7
|
+
and :func:`algebraic_topological_model_delta_complex`. The second
|
|
8
|
+
works more generally: for all simplicial, cubical, and
|
|
9
|
+
`\Delta`-complexes. The first only works for simplicial and cubical
|
|
10
|
+
complexes, but it is faster in those cases.
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- John H. Palmieri (2015-09)
|
|
15
|
+
"""
|
|
16
|
+
########################################################################
|
|
17
|
+
# Copyright (C) 2015 John H. Palmieri <palmieri@math.washington.edu>
|
|
18
|
+
#
|
|
19
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
20
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
21
|
+
# the License, or (at your option) any later version.
|
|
22
|
+
#
|
|
23
|
+
# https://www.gnu.org/licenses/
|
|
24
|
+
########################################################################
|
|
25
|
+
|
|
26
|
+
# TODO: cythonize this.
|
|
27
|
+
|
|
28
|
+
from sage.modules.free_module_element import vector
|
|
29
|
+
from sage.modules.free_module import VectorSpace
|
|
30
|
+
from sage.matrix.constructor import matrix, zero_matrix
|
|
31
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
32
|
+
from .chain_complex import ChainComplex
|
|
33
|
+
from .chain_complex_morphism import ChainComplexMorphism
|
|
34
|
+
from .chain_homotopy import ChainContraction
|
|
35
|
+
from sage.rings.rational_field import QQ
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def algebraic_topological_model(K, base_ring=None):
|
|
39
|
+
r"""
|
|
40
|
+
Algebraic topological model for cell complex ``K``
|
|
41
|
+
with coefficients in the field ``base_ring``.
|
|
42
|
+
|
|
43
|
+
INPUT:
|
|
44
|
+
|
|
45
|
+
- ``K`` -- either a simplicial complex or a cubical complex
|
|
46
|
+
- ``base_ring`` -- coefficient ring; must be a field
|
|
47
|
+
|
|
48
|
+
OUTPUT: a pair ``(phi, M)`` consisting of
|
|
49
|
+
|
|
50
|
+
- chain contraction ``phi``
|
|
51
|
+
- chain complex `M`
|
|
52
|
+
|
|
53
|
+
This construction appears in a paper by Pilarczyk and Réal [PR2015]_.
|
|
54
|
+
Given a cell complex `K` and a field `F`, there is a chain complex
|
|
55
|
+
`C` associated to `K` with coefficients in `F`. The *algebraic
|
|
56
|
+
topological model* for `K` is a chain complex `M` with trivial
|
|
57
|
+
differential, along with chain maps `\pi: C \to M` and `\iota: M
|
|
58
|
+
\to C` such that
|
|
59
|
+
|
|
60
|
+
- `\pi \iota = 1_M`, and
|
|
61
|
+
- there is a chain homotopy `\phi` between `1_C` and `\iota \pi`.
|
|
62
|
+
|
|
63
|
+
In particular, `\pi` and `\iota` induce isomorphisms on homology,
|
|
64
|
+
and since `M` has trivial differential, it is its own homology,
|
|
65
|
+
and thus also the homology of `C`. Thus `\iota` lifts homology
|
|
66
|
+
classes to their cycle representatives.
|
|
67
|
+
|
|
68
|
+
The chain homotopy `\phi` satisfies some additional properties,
|
|
69
|
+
making it a *chain contraction*:
|
|
70
|
+
|
|
71
|
+
- `\phi \phi = 0`,
|
|
72
|
+
- `\pi \phi = 0`,
|
|
73
|
+
- `\phi \iota = 0`.
|
|
74
|
+
|
|
75
|
+
Given an algebraic topological model for `K`, it is then easy to
|
|
76
|
+
compute cup products and cohomology operations on the cohomology
|
|
77
|
+
of `K`, as described in [GDR2003]_ and [PR2015]_.
|
|
78
|
+
|
|
79
|
+
Implementation details: the cell complex `K` must have an
|
|
80
|
+
:meth:`~sage.topology.cell_complex.GenericCellComplex.n_cells`
|
|
81
|
+
method from which we can extract a list of cells in each
|
|
82
|
+
dimension. Combining the lists in increasing order of dimension
|
|
83
|
+
then defines a filtration of the complex: a list of cells in which
|
|
84
|
+
the boundary of each cell consists of cells earlier in the
|
|
85
|
+
list. This is required by Pilarczyk and Réal's algorithm. There
|
|
86
|
+
must also be a
|
|
87
|
+
:meth:`~sage.topology.cell_complex.GenericCellComplex.chain_complex`
|
|
88
|
+
method, to construct the chain complex `C` associated to this
|
|
89
|
+
chain complex.
|
|
90
|
+
|
|
91
|
+
In particular, this works for simplicial complexes and cubical
|
|
92
|
+
complexes. It doesn't work for `\Delta`-complexes, though: the list
|
|
93
|
+
of their `n`-cells has the wrong format.
|
|
94
|
+
|
|
95
|
+
Note that from the chain contraction ``phi``, one can recover the
|
|
96
|
+
chain maps `\pi` and `\iota` via ``phi.pi()`` and
|
|
97
|
+
``phi.iota()``. Then one can recover `C` and `M` from, for
|
|
98
|
+
example, ``phi.pi().domain()`` and ``phi.pi().codomain()``,
|
|
99
|
+
respectively.
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: from sage.homology.algebraic_topological_model import algebraic_topological_model
|
|
104
|
+
sage: RP2 = simplicial_complexes.RealProjectivePlane()
|
|
105
|
+
sage: phi, M = algebraic_topological_model(RP2, GF(2))
|
|
106
|
+
sage: M.homology()
|
|
107
|
+
{0: Vector space of dimension 1 over Finite Field of size 2,
|
|
108
|
+
1: Vector space of dimension 1 over Finite Field of size 2,
|
|
109
|
+
2: Vector space of dimension 1 over Finite Field of size 2}
|
|
110
|
+
sage: T = cubical_complexes.Torus()
|
|
111
|
+
sage: phi, M = algebraic_topological_model(T, QQ)
|
|
112
|
+
sage: M.homology()
|
|
113
|
+
{0: Vector space of dimension 1 over Rational Field,
|
|
114
|
+
1: Vector space of dimension 2 over Rational Field,
|
|
115
|
+
2: Vector space of dimension 1 over Rational Field}
|
|
116
|
+
|
|
117
|
+
If you want to work with cohomology rather than homology, just
|
|
118
|
+
dualize the outputs of this function::
|
|
119
|
+
|
|
120
|
+
sage: M.dual().homology()
|
|
121
|
+
{0: Vector space of dimension 1 over Rational Field,
|
|
122
|
+
1: Vector space of dimension 2 over Rational Field,
|
|
123
|
+
2: Vector space of dimension 1 over Rational Field}
|
|
124
|
+
sage: M.dual().degree_of_differential()
|
|
125
|
+
1
|
|
126
|
+
sage: phi.dual()
|
|
127
|
+
Chain homotopy between:
|
|
128
|
+
Chain complex endomorphism of
|
|
129
|
+
Chain complex with at most 3 nonzero terms over Rational Field
|
|
130
|
+
and Chain complex morphism:
|
|
131
|
+
From: Chain complex with at most 3 nonzero terms over Rational Field
|
|
132
|
+
To: Chain complex with at most 3 nonzero terms over Rational Field
|
|
133
|
+
|
|
134
|
+
In degree 0, the inclusion of the homology `M` into the chain
|
|
135
|
+
complex `C` sends the homology generator to a single vertex::
|
|
136
|
+
|
|
137
|
+
sage: K = simplicial_complexes.Simplex(2)
|
|
138
|
+
sage: phi, M = algebraic_topological_model(K, QQ)
|
|
139
|
+
sage: phi.iota().in_degree(0)
|
|
140
|
+
[0]
|
|
141
|
+
[0]
|
|
142
|
+
[1]
|
|
143
|
+
|
|
144
|
+
In cohomology, though, one needs the dual of every degree 0 cell
|
|
145
|
+
to detect the degree 0 cohomology generator::
|
|
146
|
+
|
|
147
|
+
sage: phi.dual().iota().in_degree(0)
|
|
148
|
+
[1]
|
|
149
|
+
[1]
|
|
150
|
+
[1]
|
|
151
|
+
|
|
152
|
+
TESTS::
|
|
153
|
+
|
|
154
|
+
sage: T = cubical_complexes.Torus()
|
|
155
|
+
sage: C = T.chain_complex()
|
|
156
|
+
sage: H, M = T.algebraic_topological_model()
|
|
157
|
+
sage: C.differential(1) * H.iota().in_degree(1).column(0) == 0
|
|
158
|
+
True
|
|
159
|
+
sage: C.differential(1) * H.iota().in_degree(1).column(1) == 0
|
|
160
|
+
True
|
|
161
|
+
sage: coC = T.chain_complex(cochain=True)
|
|
162
|
+
sage: coC.differential(1) * H.dual().iota().in_degree(1).column(0) == 0
|
|
163
|
+
True
|
|
164
|
+
sage: coC.differential(1) * H.dual().iota().in_degree(1).column(1) == 0
|
|
165
|
+
True
|
|
166
|
+
"""
|
|
167
|
+
if not base_ring.is_field():
|
|
168
|
+
raise ValueError('the coefficient ring must be a field')
|
|
169
|
+
|
|
170
|
+
# The following are all dictionaries indexed by dimension.
|
|
171
|
+
# For each n, gens[n] is an ordered list of the n-cells generating the complex M.
|
|
172
|
+
gens = {}
|
|
173
|
+
# For each n, phi_dict[n] is a dictionary of the form {idx:
|
|
174
|
+
# vector}, where idx is the index of an n-cell in the list of
|
|
175
|
+
# n-cells in K, and vector is the image of that n-cell, as an
|
|
176
|
+
# element in the free module of (n+1)-chains for K.
|
|
177
|
+
phi_dict = {}
|
|
178
|
+
# For each n, pi_dict[n] is a dictionary of the same form, except
|
|
179
|
+
# that the target vectors should be elements of the chain complex M.
|
|
180
|
+
pi_dict = {}
|
|
181
|
+
# For each n, iota_dict[n] is a dictionary of the form {cell:
|
|
182
|
+
# vector}, where cell is one of the generators for M and vector is
|
|
183
|
+
# its image in C, as an element in the free module of n-chains.
|
|
184
|
+
iota_dict = {}
|
|
185
|
+
|
|
186
|
+
for n in range(K.dimension()+1):
|
|
187
|
+
gens[n] = []
|
|
188
|
+
phi_dict[n] = {}
|
|
189
|
+
pi_dict[n] = {}
|
|
190
|
+
iota_dict[n] = {}
|
|
191
|
+
|
|
192
|
+
C = K.chain_complex(base_ring=base_ring)
|
|
193
|
+
# old_cells: cells one dimension lower.
|
|
194
|
+
old_cells = []
|
|
195
|
+
|
|
196
|
+
for dim in range(K.dimension()+1):
|
|
197
|
+
n_cells = K._n_cells_sorted(dim)
|
|
198
|
+
diff = C.differential(dim)
|
|
199
|
+
# diff is sparse and low density. Dense matrices are faster
|
|
200
|
+
# over finite fields, but for low density matrices, sparse
|
|
201
|
+
# matrices are faster over the rationals.
|
|
202
|
+
if base_ring != QQ:
|
|
203
|
+
diff = diff.dense_matrix()
|
|
204
|
+
|
|
205
|
+
rank = len(n_cells)
|
|
206
|
+
old_rank = len(old_cells)
|
|
207
|
+
V_old = VectorSpace(base_ring, old_rank)
|
|
208
|
+
zero = V_old.zero_vector()
|
|
209
|
+
|
|
210
|
+
for c_idx, c in enumerate(zip(n_cells, VectorSpace(base_ring, rank).gens())):
|
|
211
|
+
# c is the pair (cell, the corresponding standard basis
|
|
212
|
+
# vector in the free module of chains). Separate its
|
|
213
|
+
# components, calling them c and c_vec:
|
|
214
|
+
c_vec = c[1]
|
|
215
|
+
c = c[0]
|
|
216
|
+
# No need to set zero values for any of the maps: we will
|
|
217
|
+
# assume any unset values are zero.
|
|
218
|
+
# From the paper: phi_dict[c] = 0.
|
|
219
|
+
|
|
220
|
+
# c_bar = c - phi(bdry(c))
|
|
221
|
+
c_bar = c_vec
|
|
222
|
+
bdry_c = diff * c_vec
|
|
223
|
+
# Apply phi to bdry_c and subtract from c_bar.
|
|
224
|
+
for (idx, coord) in bdry_c.items():
|
|
225
|
+
try:
|
|
226
|
+
c_bar -= coord * phi_dict[dim-1][idx]
|
|
227
|
+
except KeyError:
|
|
228
|
+
pass
|
|
229
|
+
|
|
230
|
+
bdry_c_bar = diff * c_bar
|
|
231
|
+
|
|
232
|
+
# Evaluate pi(bdry(c_bar)).
|
|
233
|
+
pi_bdry_c_bar = zero
|
|
234
|
+
|
|
235
|
+
for (idx, coeff) in bdry_c_bar.items():
|
|
236
|
+
try:
|
|
237
|
+
pi_bdry_c_bar += coeff * pi_dict[dim-1][idx]
|
|
238
|
+
except KeyError:
|
|
239
|
+
pass
|
|
240
|
+
|
|
241
|
+
# One small typo in the published algorithm: it says
|
|
242
|
+
# "if bdry(c_bar) == 0", but should say
|
|
243
|
+
# "if pi(bdry(c_bar)) == 0".
|
|
244
|
+
if not pi_bdry_c_bar:
|
|
245
|
+
# Append c to list of gens.
|
|
246
|
+
gens[dim].append(c)
|
|
247
|
+
# iota(c) = c_bar
|
|
248
|
+
iota_dict[dim][c] = c_bar
|
|
249
|
+
# pi(c) = c
|
|
250
|
+
pi_dict[dim][c_idx] = c_vec
|
|
251
|
+
else:
|
|
252
|
+
# Take any u in gens so that lambda_i = <u, pi(bdry(c_bar))> != 0.
|
|
253
|
+
# u_idx will be the index of the corresponding cell.
|
|
254
|
+
for u_idx in pi_bdry_c_bar.nonzero_positions():
|
|
255
|
+
lambda_i = pi_bdry_c_bar[u_idx]
|
|
256
|
+
# Now find the actual cell.
|
|
257
|
+
u = old_cells[u_idx]
|
|
258
|
+
if u in gens[dim-1]:
|
|
259
|
+
break
|
|
260
|
+
|
|
261
|
+
# pi(c) = 0: no need to do anything about this.
|
|
262
|
+
for c_j_idx in range(old_rank):
|
|
263
|
+
# eta_ij = <u, pi(c_j)>.
|
|
264
|
+
try:
|
|
265
|
+
eta_ij = pi_dict[dim-1][c_j_idx][u_idx]
|
|
266
|
+
except (KeyError, IndexError):
|
|
267
|
+
eta_ij = 0
|
|
268
|
+
if eta_ij:
|
|
269
|
+
# Adjust phi(c_j).
|
|
270
|
+
try:
|
|
271
|
+
phi_dict[dim-1][c_j_idx] += eta_ij * lambda_i**(-1) * c_bar
|
|
272
|
+
except KeyError:
|
|
273
|
+
phi_dict[dim-1][c_j_idx] = eta_ij * lambda_i**(-1) * c_bar
|
|
274
|
+
# Adjust pi(c_j).
|
|
275
|
+
try:
|
|
276
|
+
pi_dict[dim-1][c_j_idx] += -eta_ij * lambda_i**(-1) * pi_bdry_c_bar
|
|
277
|
+
except KeyError:
|
|
278
|
+
pi_dict[dim-1][c_j_idx] = -eta_ij * lambda_i**(-1) * pi_bdry_c_bar
|
|
279
|
+
|
|
280
|
+
gens[dim-1].remove(u)
|
|
281
|
+
del iota_dict[dim-1][u]
|
|
282
|
+
old_cells = n_cells
|
|
283
|
+
|
|
284
|
+
# Now we have constructed the raw data for M, pi, iota, phi, so we
|
|
285
|
+
# have to convert that to data which can be used to construct chain
|
|
286
|
+
# complexes, chain maps, and chain contractions.
|
|
287
|
+
|
|
288
|
+
# M_data will contain (trivial) matrices defining the differential
|
|
289
|
+
# on M. Keep track of the sizes using "M_rows" and "M_cols", which are
|
|
290
|
+
# just the ranks of consecutive graded pieces of M.
|
|
291
|
+
M_data = {}
|
|
292
|
+
M_rows = 0
|
|
293
|
+
# pi_data: the matrices defining pi. Similar for iota_data and phi_data.
|
|
294
|
+
pi_data = {}
|
|
295
|
+
iota_data = {}
|
|
296
|
+
phi_data = {}
|
|
297
|
+
for n in range(K.dimension()+1):
|
|
298
|
+
n_cells = K._n_cells_sorted(n)
|
|
299
|
+
# Remove zero entries from pi_dict and phi_dict.
|
|
300
|
+
pi_dict[n] = {i: pi_dict[n][i] for i in pi_dict[n] if pi_dict[n][i]}
|
|
301
|
+
phi_dict[n] = {i: phi_dict[n][i] for i in phi_dict[n] if phi_dict[n][i]}
|
|
302
|
+
# Convert gens to data defining the chain complex M with
|
|
303
|
+
# trivial differential.
|
|
304
|
+
M_cols = len(gens[n])
|
|
305
|
+
M_data[n] = zero_matrix(base_ring, M_rows, M_cols)
|
|
306
|
+
M_rows = M_cols
|
|
307
|
+
# Convert the dictionaries for pi, iota, phi to matrices which
|
|
308
|
+
# will define chain maps and chain homotopies.
|
|
309
|
+
pi_cols = []
|
|
310
|
+
phi_cols = []
|
|
311
|
+
for (idx, c) in enumerate(n_cells):
|
|
312
|
+
# First pi:
|
|
313
|
+
if idx in pi_dict[n]:
|
|
314
|
+
column = vector(base_ring, M_rows)
|
|
315
|
+
for (entry, coeff) in pi_dict[n][idx].items():
|
|
316
|
+
# Translate from cells in n_cells to cells in gens[n].
|
|
317
|
+
column[gens[n].index(n_cells[entry])] = coeff
|
|
318
|
+
else:
|
|
319
|
+
column = vector(base_ring, M_rows)
|
|
320
|
+
pi_cols.append(column)
|
|
321
|
+
|
|
322
|
+
# Now phi:
|
|
323
|
+
try:
|
|
324
|
+
column = phi_dict[n][idx]
|
|
325
|
+
except KeyError:
|
|
326
|
+
column = vector(base_ring, len(K.n_cells(n+1)))
|
|
327
|
+
phi_cols.append(column)
|
|
328
|
+
# Now iota:
|
|
329
|
+
iota_cols = [iota_dict[n][c] for c in gens[n]]
|
|
330
|
+
|
|
331
|
+
pi_data[n] = matrix(base_ring, pi_cols).transpose()
|
|
332
|
+
iota_data[n] = matrix(base_ring, len(gens[n]), len(n_cells), iota_cols).transpose()
|
|
333
|
+
phi_data[n] = matrix(base_ring, phi_cols).transpose()
|
|
334
|
+
|
|
335
|
+
M = ChainComplex(M_data, base_ring=base_ring, degree=-1)
|
|
336
|
+
pi = ChainComplexMorphism(pi_data, C, M)
|
|
337
|
+
iota = ChainComplexMorphism(iota_data, M, C)
|
|
338
|
+
phi = ChainContraction(phi_data, pi, iota)
|
|
339
|
+
return phi, M
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def algebraic_topological_model_delta_complex(K, base_ring=None):
|
|
343
|
+
r"""
|
|
344
|
+
Algebraic topological model for cell complex ``K``
|
|
345
|
+
with coefficients in the field ``base_ring``.
|
|
346
|
+
|
|
347
|
+
This has the same basic functionality as
|
|
348
|
+
:func:`algebraic_topological_model`, but it also works for
|
|
349
|
+
`\Delta`-complexes. For simplicial and cubical complexes it is
|
|
350
|
+
somewhat slower, though.
|
|
351
|
+
|
|
352
|
+
INPUT:
|
|
353
|
+
|
|
354
|
+
- ``K`` -- a simplicial complex, a cubical complex, or a
|
|
355
|
+
`\Delta`-complex
|
|
356
|
+
- ``base_ring`` -- coefficient ring; must be a field
|
|
357
|
+
|
|
358
|
+
OUTPUT: a pair ``(phi, M)`` consisting of
|
|
359
|
+
|
|
360
|
+
- chain contraction ``phi``
|
|
361
|
+
- chain complex `M`
|
|
362
|
+
|
|
363
|
+
See :func:`algebraic_topological_model` for the main
|
|
364
|
+
documentation. The difference in implementation between the two:
|
|
365
|
+
this uses matrix and vector algebra. The other function does more
|
|
366
|
+
of the computations "by hand" and uses cells (given as simplices
|
|
367
|
+
or cubes) to index various dictionaries. Since the cells in
|
|
368
|
+
`\Delta`-complexes are not as nice, the other function does not
|
|
369
|
+
work for them, while this function relies almost entirely on the
|
|
370
|
+
structure of the associated chain complex.
|
|
371
|
+
|
|
372
|
+
EXAMPLES::
|
|
373
|
+
|
|
374
|
+
sage: from sage.homology.algebraic_topological_model import algebraic_topological_model_delta_complex as AT_model
|
|
375
|
+
sage: RP2 = simplicial_complexes.RealProjectivePlane()
|
|
376
|
+
sage: phi, M = AT_model(RP2, GF(2))
|
|
377
|
+
sage: M.homology()
|
|
378
|
+
{0: Vector space of dimension 1 over Finite Field of size 2,
|
|
379
|
+
1: Vector space of dimension 1 over Finite Field of size 2,
|
|
380
|
+
2: Vector space of dimension 1 over Finite Field of size 2}
|
|
381
|
+
sage: T = delta_complexes.Torus()
|
|
382
|
+
sage: phi, M = AT_model(T, QQ)
|
|
383
|
+
sage: M.homology()
|
|
384
|
+
{0: Vector space of dimension 1 over Rational Field,
|
|
385
|
+
1: Vector space of dimension 2 over Rational Field,
|
|
386
|
+
2: Vector space of dimension 1 over Rational Field}
|
|
387
|
+
|
|
388
|
+
If you want to work with cohomology rather than homology, just
|
|
389
|
+
dualize the outputs of this function::
|
|
390
|
+
|
|
391
|
+
sage: M.dual().homology()
|
|
392
|
+
{0: Vector space of dimension 1 over Rational Field,
|
|
393
|
+
1: Vector space of dimension 2 over Rational Field,
|
|
394
|
+
2: Vector space of dimension 1 over Rational Field}
|
|
395
|
+
sage: M.dual().degree_of_differential()
|
|
396
|
+
1
|
|
397
|
+
sage: phi.dual()
|
|
398
|
+
Chain homotopy between:
|
|
399
|
+
Chain complex endomorphism of Chain complex with at most 3 nonzero terms over Rational Field
|
|
400
|
+
and Chain complex morphism:
|
|
401
|
+
From: Chain complex with at most 3 nonzero terms over Rational Field
|
|
402
|
+
To: Chain complex with at most 3 nonzero terms over Rational Field
|
|
403
|
+
|
|
404
|
+
In degree 0, the inclusion of the homology `M` into the chain
|
|
405
|
+
complex `C` sends the homology generator to a single vertex::
|
|
406
|
+
|
|
407
|
+
sage: K = delta_complexes.Simplex(2)
|
|
408
|
+
sage: phi, M = AT_model(K, QQ)
|
|
409
|
+
sage: phi.iota().in_degree(0)
|
|
410
|
+
[0]
|
|
411
|
+
[0]
|
|
412
|
+
[1]
|
|
413
|
+
|
|
414
|
+
In cohomology, though, one needs the dual of every degree 0 cell
|
|
415
|
+
to detect the degree 0 cohomology generator::
|
|
416
|
+
|
|
417
|
+
sage: phi.dual().iota().in_degree(0)
|
|
418
|
+
[1]
|
|
419
|
+
[1]
|
|
420
|
+
[1]
|
|
421
|
+
|
|
422
|
+
TESTS::
|
|
423
|
+
|
|
424
|
+
sage: T = cubical_complexes.Torus()
|
|
425
|
+
sage: C = T.chain_complex()
|
|
426
|
+
sage: H, M = AT_model(T, QQ)
|
|
427
|
+
sage: C.differential(1) * H.iota().in_degree(1).column(0) == 0
|
|
428
|
+
True
|
|
429
|
+
sage: C.differential(1) * H.iota().in_degree(1).column(1) == 0
|
|
430
|
+
True
|
|
431
|
+
sage: coC = T.chain_complex(cochain=True)
|
|
432
|
+
sage: coC.differential(1) * H.dual().iota().in_degree(1).column(0) == 0
|
|
433
|
+
True
|
|
434
|
+
sage: coC.differential(1) * H.dual().iota().in_degree(1).column(1) == 0
|
|
435
|
+
True
|
|
436
|
+
"""
|
|
437
|
+
def conditionally_sparse(m):
|
|
438
|
+
"""
|
|
439
|
+
Return a sparse matrix if the characteristic is zero.
|
|
440
|
+
|
|
441
|
+
Multiplication of matrices with low density seems to be quicker
|
|
442
|
+
if the matrices are sparse, when over the rationals. Over
|
|
443
|
+
finite fields, dense matrices are faster regardless of
|
|
444
|
+
density.
|
|
445
|
+
"""
|
|
446
|
+
if base_ring == QQ:
|
|
447
|
+
return m.sparse_matrix()
|
|
448
|
+
else:
|
|
449
|
+
return m
|
|
450
|
+
|
|
451
|
+
if not base_ring.is_field():
|
|
452
|
+
raise ValueError('the coefficient ring must be a field')
|
|
453
|
+
|
|
454
|
+
# The following are all dictionaries indexed by dimension.
|
|
455
|
+
# For each n, gens[n] is an ordered list of the n-cells generating the complex M.
|
|
456
|
+
gens = {}
|
|
457
|
+
pi_data = {}
|
|
458
|
+
phi_data = {}
|
|
459
|
+
iota_data = {}
|
|
460
|
+
|
|
461
|
+
for n in range(-1, K.dimension()+1):
|
|
462
|
+
gens[n] = []
|
|
463
|
+
|
|
464
|
+
C = K.chain_complex(base_ring=base_ring)
|
|
465
|
+
n_cells = []
|
|
466
|
+
pi_cols = []
|
|
467
|
+
iota_cols = {}
|
|
468
|
+
|
|
469
|
+
for dim in range(K.dimension()+1):
|
|
470
|
+
# old_cells: cells one dimension lower.
|
|
471
|
+
old_cells = n_cells
|
|
472
|
+
# n_cells: the standard basis for the vector space C.free_module(dim).
|
|
473
|
+
n_cells = C.free_module(dim).gens()
|
|
474
|
+
diff = C.differential(dim)
|
|
475
|
+
# diff is sparse and low density. Dense matrices are faster
|
|
476
|
+
# over finite fields, but for low density matrices, sparse
|
|
477
|
+
# matrices are faster over the rationals.
|
|
478
|
+
if base_ring != QQ:
|
|
479
|
+
diff = diff.dense_matrix()
|
|
480
|
+
|
|
481
|
+
rank = len(n_cells)
|
|
482
|
+
old_rank = len(old_cells)
|
|
483
|
+
|
|
484
|
+
# Create some matrix spaces to try to speed up matrix creation.
|
|
485
|
+
MS_pi_t = MatrixSpace(base_ring, old_rank, len(gens[dim-1]))
|
|
486
|
+
|
|
487
|
+
pi_old = MS_pi_t.matrix(pi_cols).transpose()
|
|
488
|
+
iota_cols_old = iota_cols
|
|
489
|
+
iota_cols = {}
|
|
490
|
+
pi_cols_old = pi_cols
|
|
491
|
+
pi_cols = []
|
|
492
|
+
phi_old = MatrixSpace(base_ring, rank, old_rank, sparse=(base_ring == QQ)).zero()
|
|
493
|
+
phi_old_cols = phi_old.columns()
|
|
494
|
+
phi_old = conditionally_sparse(phi_old)
|
|
495
|
+
to_be_deleted = []
|
|
496
|
+
|
|
497
|
+
zero_vector = vector(base_ring, rank)
|
|
498
|
+
pi_nrows = pi_old.nrows()
|
|
499
|
+
|
|
500
|
+
for c_idx, c in enumerate(n_cells):
|
|
501
|
+
# c_bar = c - phi(bdry(c)):
|
|
502
|
+
# Avoid a bug in matrix-vector multiplication (trac 19378):
|
|
503
|
+
if not diff:
|
|
504
|
+
c_bar = c
|
|
505
|
+
pi_bdry_c_bar = False
|
|
506
|
+
else:
|
|
507
|
+
if base_ring == QQ:
|
|
508
|
+
c_bar = c - phi_old * (diff * c)
|
|
509
|
+
pi_bdry_c_bar = conditionally_sparse(pi_old) * (diff * c_bar)
|
|
510
|
+
else:
|
|
511
|
+
c_bar = c - phi_old * diff * c
|
|
512
|
+
pi_bdry_c_bar = conditionally_sparse(pi_old) * diff * c_bar
|
|
513
|
+
|
|
514
|
+
# One small typo in the published algorithm: it says
|
|
515
|
+
# "if bdry(c_bar) == 0", but should say
|
|
516
|
+
# "if pi(bdry(c_bar)) == 0".
|
|
517
|
+
if not pi_bdry_c_bar:
|
|
518
|
+
# Append c to list of gens.
|
|
519
|
+
gens[dim].append(c_idx)
|
|
520
|
+
# iota(c) = c_bar
|
|
521
|
+
iota_cols[c_idx] = c_bar
|
|
522
|
+
# pi(c) = c
|
|
523
|
+
pi_cols.append(c)
|
|
524
|
+
else:
|
|
525
|
+
# Take any u in gens so that lambda_i = <u, pi(bdry(c_bar))> != 0.
|
|
526
|
+
# u_idx will be the index of the corresponding cell.
|
|
527
|
+
(u_idx, lambda_i) = pi_bdry_c_bar.leading_item()
|
|
528
|
+
for (u_idx, lambda_i) in pi_bdry_c_bar.items():
|
|
529
|
+
if u_idx not in to_be_deleted:
|
|
530
|
+
break
|
|
531
|
+
# This element/column needs to be deleted from gens and
|
|
532
|
+
# iota_old. Do that later.
|
|
533
|
+
to_be_deleted.append(u_idx)
|
|
534
|
+
# pi(c) = 0.
|
|
535
|
+
pi_cols.append(zero_vector)
|
|
536
|
+
for c_j_idx, c_j in enumerate(old_cells):
|
|
537
|
+
# eta_ij = <u, pi(c_j)>.
|
|
538
|
+
# That is, eta_ij is the u_idx entry in the vector pi_old * c_j:
|
|
539
|
+
eta_ij = c_j.dot_product(pi_old.row(u_idx))
|
|
540
|
+
if eta_ij:
|
|
541
|
+
# Adjust phi(c_j).
|
|
542
|
+
phi_old_cols[c_j_idx] += eta_ij * lambda_i**(-1) * c_bar
|
|
543
|
+
# Adjust pi(c_j).
|
|
544
|
+
pi_cols_old[c_j_idx] -= eta_ij * lambda_i**(-1) * pi_bdry_c_bar
|
|
545
|
+
|
|
546
|
+
# The matrices involved have many zero entries. For
|
|
547
|
+
# such matrices, using sparse matrices is faster over
|
|
548
|
+
# the rationals, slower over finite fields.
|
|
549
|
+
phi_old = matrix(base_ring, phi_old_cols, sparse=(base_ring == QQ)).transpose()
|
|
550
|
+
keep = vector(base_ring, pi_nrows, {i: 1 for i in range(pi_nrows)
|
|
551
|
+
if i not in to_be_deleted})
|
|
552
|
+
cols = [v.pairwise_product(keep) for v in pi_cols_old]
|
|
553
|
+
pi_old = MS_pi_t.matrix(cols).transpose()
|
|
554
|
+
|
|
555
|
+
# Here cols is a temporary storage for the columns of iota.
|
|
556
|
+
cols = [iota_cols_old[i] for i in sorted(iota_cols_old.keys())]
|
|
557
|
+
for r in sorted(to_be_deleted, reverse=True):
|
|
558
|
+
del cols[r]
|
|
559
|
+
del gens[dim-1][r]
|
|
560
|
+
iota_data[dim-1] = matrix(base_ring, len(gens[dim-1]), old_rank, cols).transpose()
|
|
561
|
+
# keep: rows to keep in pi_cols_old. Start with all
|
|
562
|
+
# columns, then delete those in to_be_deleted.
|
|
563
|
+
keep = sorted(set(range(pi_nrows)).difference(to_be_deleted))
|
|
564
|
+
# Now cols is a temporary storage for columns of pi.
|
|
565
|
+
cols = [v.list_from_positions(keep) for v in pi_cols_old]
|
|
566
|
+
pi_data[dim-1] = matrix(base_ring, old_rank, len(gens[dim-1]), cols).transpose()
|
|
567
|
+
phi_data[dim-1] = phi_old
|
|
568
|
+
|
|
569
|
+
V_gens = VectorSpace(base_ring, len(gens[dim]))
|
|
570
|
+
if pi_cols:
|
|
571
|
+
cols = []
|
|
572
|
+
for v in pi_cols:
|
|
573
|
+
cols.append(V_gens(v.list_from_positions(gens[dim])))
|
|
574
|
+
pi_cols = cols
|
|
575
|
+
|
|
576
|
+
pi_data[dim] = matrix(base_ring, rank, len(gens[dim]), pi_cols).transpose()
|
|
577
|
+
cols = [iota_cols[i] for i in sorted(iota_cols.keys())]
|
|
578
|
+
iota_data[dim] = matrix(base_ring, len(gens[dim]), rank, cols).transpose()
|
|
579
|
+
|
|
580
|
+
# M_data will contain (trivial) matrices defining the differential
|
|
581
|
+
# on M. Keep track of the sizes using "M_rows" and "M_cols", which are
|
|
582
|
+
# just the ranks of consecutive graded pieces of M.
|
|
583
|
+
M_data = {}
|
|
584
|
+
M_rows = 0
|
|
585
|
+
for n in range(K.dimension()+1):
|
|
586
|
+
M_cols = len(gens[n])
|
|
587
|
+
M_data[n] = zero_matrix(base_ring, M_rows, M_cols)
|
|
588
|
+
M_rows = M_cols
|
|
589
|
+
|
|
590
|
+
M = ChainComplex(M_data, base_ring=base_ring, degree=-1)
|
|
591
|
+
|
|
592
|
+
pi = ChainComplexMorphism(pi_data, C, M)
|
|
593
|
+
iota = ChainComplexMorphism(iota_data, M, C)
|
|
594
|
+
phi = ChainContraction(phi_data, pi, iota)
|
|
595
|
+
return phi, M
|
sage/homology/all.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
from sage.homology.chain_complex import ChainComplex
|
|
3
|
+
|
|
4
|
+
from sage.homology.chain_complex_morphism import ChainComplexMorphism
|
|
5
|
+
|
|
6
|
+
from sage.misc.lazy_import import lazy_import
|
|
7
|
+
lazy_import('sage.homology.koszul_complex', 'KoszulComplex')
|
|
8
|
+
del lazy_import
|