passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.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 +808 -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-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-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-x86_64-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,1340 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.combinat
|
|
3
|
+
r"""
|
|
4
|
+
Finitely presented graded modules
|
|
5
|
+
|
|
6
|
+
Let `R` be a connected graded algebra. A finitely presented module
|
|
7
|
+
over `R` is a module isomorphic to the cokernel of an `R`-linear
|
|
8
|
+
homomorphism `f: F_1 \to F_0` of finitely generated free modules: the
|
|
9
|
+
generators of `F_0` correspond to the generators of the module, and
|
|
10
|
+
the generators of `F_1` correspond to its relations, via the map `f`.
|
|
11
|
+
|
|
12
|
+
This module class takes as input a set of generators and relations
|
|
13
|
+
and uses them to construct a presentation, using the class
|
|
14
|
+
:class:`~sage.modules.fp_graded.free_morphism.FreeGradedModuleMorphism`.
|
|
15
|
+
It also allows such a morphism as input.
|
|
16
|
+
|
|
17
|
+
This package was designed with homological algebra in mind, and its API
|
|
18
|
+
focuses on maps rather than objects. A good example of this is the kernel
|
|
19
|
+
function :meth:`sage.modules.fp_graded.morphism.FPModuleMorphism.kernel_inclusion`,
|
|
20
|
+
which computes the kernel of a homomorphism `f: M\to N`. Its return value
|
|
21
|
+
is not an instance of the module class, but rather an injective homomorphism
|
|
22
|
+
`i: K\to M` with the property that `\operatorname{im}(i) = \ker(f)`.
|
|
23
|
+
|
|
24
|
+
.. NOTE::
|
|
25
|
+
|
|
26
|
+
Some methods here require in addition that `R` be an algebra over a
|
|
27
|
+
field or a PID and that Sage has a description of a basis for `R`.
|
|
28
|
+
|
|
29
|
+
AUTHORS:
|
|
30
|
+
|
|
31
|
+
- Robert R. Bruner, Michael J. Catanzaro (2012): Initial version.
|
|
32
|
+
- Sverre Lunoee--Nielsen and Koen van Woerden (2019-11-29): Updated the
|
|
33
|
+
original software to Sage version 8.9.
|
|
34
|
+
- Sverre Lunoee--Nielsen (2020-07-01): Refactored the code and added
|
|
35
|
+
new documentation and tests.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# *****************************************************************************
|
|
39
|
+
# Copyright (C) 2011 Robert R. Bruner <rrb@math.wayne.edu> and
|
|
40
|
+
# Michael J. Catanzaro <mike@math.wayne.edu>
|
|
41
|
+
#
|
|
42
|
+
# This program is free software: you can redistribute it and/or modify
|
|
43
|
+
# it under the terms of the GNU General Public License as published by
|
|
44
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
45
|
+
# (at your option) any later version.
|
|
46
|
+
# https://www.gnu.org/licenses/
|
|
47
|
+
# ****************************************************************************
|
|
48
|
+
|
|
49
|
+
from sage.categories.homset import Hom
|
|
50
|
+
from sage.categories.morphism import Morphism
|
|
51
|
+
from sage.misc.cachefunc import cached_method
|
|
52
|
+
from sage.rings.infinity import infinity
|
|
53
|
+
from sage.categories.graded_modules import GradedModules
|
|
54
|
+
from sage.modules.module import Module
|
|
55
|
+
from sage.structure.indexed_generators import IndexedGenerators
|
|
56
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
57
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
58
|
+
from sage.structure.element import parent
|
|
59
|
+
|
|
60
|
+
from sage.modules.fp_graded.free_module import FreeGradedModule
|
|
61
|
+
from sage.modules.fp_graded.free_element import FreeGradedModuleElement
|
|
62
|
+
from sage.modules.fp_graded.element import FPElement
|
|
63
|
+
|
|
64
|
+
# Note that some of the methods below assume that the base ring is a
|
|
65
|
+
# field and that the graded algebra has a chosen free module basis in
|
|
66
|
+
# each degree. See for example :meth:`basis_elements`,
|
|
67
|
+
# :meth:`element_from_coordinates`, :meth:`__getitem__`,
|
|
68
|
+
# :meth:`vector_presentation`, and possibly others.
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class FPModule(UniqueRepresentation, IndexedGenerators, Module):
|
|
72
|
+
r"""
|
|
73
|
+
A finitely presented module over a connected graded algebra.
|
|
74
|
+
|
|
75
|
+
INPUT:
|
|
76
|
+
|
|
77
|
+
One of the following:
|
|
78
|
+
|
|
79
|
+
- ``arg0`` -- a morphism such that the module is the cokernel, or
|
|
80
|
+
a free graded module, in which case the output is the same
|
|
81
|
+
module, viewed as finitely presented
|
|
82
|
+
|
|
83
|
+
Otherwise:
|
|
84
|
+
|
|
85
|
+
- ``arg0`` -- the graded connected algebra over which the module is
|
|
86
|
+
defined; this algebra must be equipped with a graded basis
|
|
87
|
+
|
|
88
|
+
- ``generator_degrees`` -- tuple of integer degrees
|
|
89
|
+
|
|
90
|
+
- ``relations`` -- tuple of relations; a relation is a tuple of
|
|
91
|
+
coefficients `(c_1, \ldots, c_n)`, ordered so that they
|
|
92
|
+
correspond to the module generators, that is, such a tuple
|
|
93
|
+
corresponds to the relation
|
|
94
|
+
|
|
95
|
+
.. MATH::
|
|
96
|
+
|
|
97
|
+
c_1 g_1 + \ldots + c_n g_n = 0
|
|
98
|
+
|
|
99
|
+
if the generators are `(g_1, \ldots, g_n)`
|
|
100
|
+
|
|
101
|
+
EXAMPLES::
|
|
102
|
+
|
|
103
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
104
|
+
|
|
105
|
+
sage: E.<x,y> = ExteriorAlgebra(QQ)
|
|
106
|
+
sage: M = FPModule(E, [0, 1], [[x, 1]])
|
|
107
|
+
sage: a, b = M.generators()
|
|
108
|
+
sage: x*a + b == 0
|
|
109
|
+
True
|
|
110
|
+
sage: (x*a + b).normalize()
|
|
111
|
+
0
|
|
112
|
+
|
|
113
|
+
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
114
|
+
sage: M = FPModule(A3, [0, 1], [[Sq(2), Sq(1)]])
|
|
115
|
+
sage: M.generators()
|
|
116
|
+
(g[0], g[1])
|
|
117
|
+
sage: M.relations()
|
|
118
|
+
(Sq(2)*g[0] + Sq(1)*g[1],)
|
|
119
|
+
sage: M.is_trivial()
|
|
120
|
+
False
|
|
121
|
+
|
|
122
|
+
sage: Z = FPModule(A3, [])
|
|
123
|
+
sage: Z.generators()
|
|
124
|
+
()
|
|
125
|
+
sage: Z.relations()
|
|
126
|
+
()
|
|
127
|
+
sage: Z.is_trivial()
|
|
128
|
+
True
|
|
129
|
+
|
|
130
|
+
sage: from sage.modules.fp_graded.free_module import FreeGradedModule
|
|
131
|
+
sage: F = FreeGradedModule(E, [0, 1])
|
|
132
|
+
sage: one = Hom(F, F).identity()
|
|
133
|
+
sage: Z = FPModule(one)
|
|
134
|
+
sage: Z.is_trivial()
|
|
135
|
+
True
|
|
136
|
+
|
|
137
|
+
sage: FPModule(E.free_graded_module([0, 1]))
|
|
138
|
+
Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field
|
|
139
|
+
"""
|
|
140
|
+
@staticmethod
|
|
141
|
+
def __classcall__(cls, arg0, generator_degrees=None, relations=(), names=None):
|
|
142
|
+
r"""
|
|
143
|
+
Normalize input to ensure a unique representation.
|
|
144
|
+
|
|
145
|
+
TESTS::
|
|
146
|
+
|
|
147
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
148
|
+
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
149
|
+
sage: M1.<m0,m1> = FPModule(A3, [0, 1], [[Sq(2), Sq(1)]])
|
|
150
|
+
sage: M2 = FPModule(A3, (0, 1), [[Sq(2), Sq(1)]], names='m0,m1')
|
|
151
|
+
sage: M1 is M2
|
|
152
|
+
True
|
|
153
|
+
"""
|
|
154
|
+
if names is not None:
|
|
155
|
+
from sage.structure.category_object import normalize_names
|
|
156
|
+
names = normalize_names(-1, names)
|
|
157
|
+
|
|
158
|
+
# If given a morphism, then that defines a module
|
|
159
|
+
if isinstance(arg0, Morphism):
|
|
160
|
+
if arg0.is_zero():
|
|
161
|
+
# This morphism defines a free module, so just use the codomain
|
|
162
|
+
return arg0.codomain()
|
|
163
|
+
return super().__classcall__(cls, arg0, names=names)
|
|
164
|
+
|
|
165
|
+
if isinstance(arg0, FreeGradedModule):
|
|
166
|
+
return arg0
|
|
167
|
+
|
|
168
|
+
if generator_degrees is None:
|
|
169
|
+
raise ValueError("the generator_degrees must be specified")
|
|
170
|
+
|
|
171
|
+
# The free module on the generators of the module.
|
|
172
|
+
generator_module = arg0.free_graded_module(generator_degrees, names=names)
|
|
173
|
+
|
|
174
|
+
if not relations: # If we are trivially free, then just use the free module
|
|
175
|
+
return generator_module
|
|
176
|
+
|
|
177
|
+
# Use the coefficients given for the relations and make module elements
|
|
178
|
+
# from them. Filter out the zero elements, as they are redundant.
|
|
179
|
+
rels = [v for v in [generator_module(r) for r in relations] if not v.is_zero()]
|
|
180
|
+
|
|
181
|
+
# The free module for the relations of the module.
|
|
182
|
+
relations_module = arg0.free_graded_module(tuple([r.degree() for r in rels]))
|
|
183
|
+
|
|
184
|
+
# The module we want to model is the cokernel of the following morphism
|
|
185
|
+
j = Hom(relations_module, generator_module)(rels)
|
|
186
|
+
return super().__classcall__(cls, j, names=names)
|
|
187
|
+
|
|
188
|
+
def __init__(self, j, names):
|
|
189
|
+
r"""
|
|
190
|
+
Create a finitely presented module over a connected graded algebra.
|
|
191
|
+
|
|
192
|
+
TESTS::
|
|
193
|
+
|
|
194
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
195
|
+
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
196
|
+
sage: M = FPModule(A3, [0, 1], [[Sq(2), Sq(1)]])
|
|
197
|
+
sage: TestSuite(M).run()
|
|
198
|
+
|
|
199
|
+
Checking containment::
|
|
200
|
+
|
|
201
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
202
|
+
sage: M = FPModule(SteenrodAlgebra(2), [0,1], [[Sq(4), Sq(3)]])
|
|
203
|
+
sage: x = M([Sq(1), 1])
|
|
204
|
+
sage: x in M
|
|
205
|
+
True
|
|
206
|
+
sage: N = FPModule(SteenrodAlgebra(2), [0], [[Sq(2)]])
|
|
207
|
+
sage: y = Sq(2) * N.generator(0)
|
|
208
|
+
sage: y in M
|
|
209
|
+
False
|
|
210
|
+
"""
|
|
211
|
+
self._j = j
|
|
212
|
+
codomain = j.codomain()
|
|
213
|
+
|
|
214
|
+
self._generator_degrees = codomain.generator_degrees()
|
|
215
|
+
algebra = codomain.base_ring()
|
|
216
|
+
|
|
217
|
+
# Call the base class constructors.
|
|
218
|
+
keys = j.codomain().basis().keys()
|
|
219
|
+
cat = GradedModules(algebra).FinitelyPresented()
|
|
220
|
+
IndexedGenerators.__init__(self, keys)
|
|
221
|
+
Module.__init__(self, algebra, category=cat, names=names)
|
|
222
|
+
|
|
223
|
+
from sage.combinat.family import Family
|
|
224
|
+
self._spanning_set = Family(self._indices, self.monomial)
|
|
225
|
+
|
|
226
|
+
Element = FPElement
|
|
227
|
+
|
|
228
|
+
def defining_homomorphism(self):
|
|
229
|
+
"""
|
|
230
|
+
Return the homomorphism defining ``self``.
|
|
231
|
+
|
|
232
|
+
``self`` is a finitely presented module defined as the
|
|
233
|
+
cokernel of a map `j: F_0 \to F_1` of free modules, and this
|
|
234
|
+
returns that map.
|
|
235
|
+
|
|
236
|
+
EXAMPLES::
|
|
237
|
+
|
|
238
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
239
|
+
sage: E.<x,y> = ExteriorAlgebra(QQ)
|
|
240
|
+
sage: M = FPModule(E, [0, 1], [[x, 1]])
|
|
241
|
+
sage: M.defining_homomorphism()
|
|
242
|
+
Module morphism:
|
|
243
|
+
From: Free graded left module on 1 generator over The exterior algebra of rank 2 over Rational Field
|
|
244
|
+
To: Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field
|
|
245
|
+
Defn: g[1] |--> x*g[0] + g[1]
|
|
246
|
+
"""
|
|
247
|
+
return self._j
|
|
248
|
+
|
|
249
|
+
def _free_module(self):
|
|
250
|
+
"""
|
|
251
|
+
Return the free module of which ``self`` is a quotient.
|
|
252
|
+
|
|
253
|
+
EXAMPLES::
|
|
254
|
+
|
|
255
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
256
|
+
sage: A = SteenrodAlgebra()
|
|
257
|
+
sage: M.<x,y> = FPModule(A, [0, 1], [[Sq(2), Sq(1)]])
|
|
258
|
+
sage: M.generators()
|
|
259
|
+
(x, y)
|
|
260
|
+
sage: F = M._free_module()
|
|
261
|
+
sage: F.generators()
|
|
262
|
+
(x, y)
|
|
263
|
+
"""
|
|
264
|
+
return self._j.codomain()
|
|
265
|
+
|
|
266
|
+
def change_ring(self, algebra):
|
|
267
|
+
r"""
|
|
268
|
+
Change the base ring of ``self``.
|
|
269
|
+
|
|
270
|
+
INPUT:
|
|
271
|
+
|
|
272
|
+
- ``algebra`` -- a connected graded algebra
|
|
273
|
+
|
|
274
|
+
OUTPUT:
|
|
275
|
+
|
|
276
|
+
The finitely presented module over ``algebra`` defined with the
|
|
277
|
+
exact same number of generators of the same degrees and relations
|
|
278
|
+
as ``self``.
|
|
279
|
+
|
|
280
|
+
EXAMPLES::
|
|
281
|
+
|
|
282
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
283
|
+
sage: A = SteenrodAlgebra(2)
|
|
284
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
285
|
+
|
|
286
|
+
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
|
|
287
|
+
sage: N = M.change_ring(A2); N
|
|
288
|
+
Finitely presented left module on 2 generators and 1 relation over
|
|
289
|
+
sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
290
|
+
|
|
291
|
+
Changing back yields the original module::
|
|
292
|
+
|
|
293
|
+
sage: N.change_ring(A) is M
|
|
294
|
+
True
|
|
295
|
+
|
|
296
|
+
TESTS:
|
|
297
|
+
|
|
298
|
+
Subclasses preserve their type::
|
|
299
|
+
|
|
300
|
+
sage: from sage.modules.fp_graded.steenrod.module import SteenrodFPModule
|
|
301
|
+
sage: A = SteenrodAlgebra(2)
|
|
302
|
+
sage: A1 = SteenrodAlgebra(2, profile=(2,1))
|
|
303
|
+
|
|
304
|
+
sage: M = SteenrodFPModule(A, [0,1], [[Sq(2), Sq(1)]])
|
|
305
|
+
sage: N = M.change_ring(A1)
|
|
306
|
+
sage: isinstance(N, SteenrodFPModule)
|
|
307
|
+
True
|
|
308
|
+
|
|
309
|
+
Changing back yields the original module::
|
|
310
|
+
|
|
311
|
+
sage: N.change_ring(A) is M
|
|
312
|
+
True
|
|
313
|
+
"""
|
|
314
|
+
return type(self).__base__(self._j.change_ring(algebra), names=self._names)
|
|
315
|
+
|
|
316
|
+
def _from_dict(self, d, coerce=False, remove_zeros=True):
|
|
317
|
+
r"""
|
|
318
|
+
Construct an element of ``self`` from an ``{index: coefficient}``
|
|
319
|
+
dictionary.
|
|
320
|
+
|
|
321
|
+
INPUT:
|
|
322
|
+
|
|
323
|
+
- ``d`` -- dictionary
|
|
324
|
+
|
|
325
|
+
This code is taken from the method of the same name for
|
|
326
|
+
``sage.combinat.free_module.FreeModule``.
|
|
327
|
+
|
|
328
|
+
EXAMPLES::
|
|
329
|
+
|
|
330
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
331
|
+
sage: M = FPModule(SteenrodAlgebra(2), [0,1], [[Sq(4), Sq(3)]])
|
|
332
|
+
sage: x = M.an_element()
|
|
333
|
+
sage: M._from_dict(x.monomial_coefficients()) == x
|
|
334
|
+
True
|
|
335
|
+
"""
|
|
336
|
+
assert isinstance(d, dict)
|
|
337
|
+
if coerce:
|
|
338
|
+
R = self.base_ring()
|
|
339
|
+
d = {key: R(coeff) for key, coeff in d.items()}
|
|
340
|
+
if remove_zeros:
|
|
341
|
+
d = {key: coeff for key, coeff in d.items() if coeff}
|
|
342
|
+
return self.element_class(self, d)
|
|
343
|
+
|
|
344
|
+
def _monomial(self, index):
|
|
345
|
+
"""
|
|
346
|
+
EXAMPLES::
|
|
347
|
+
|
|
348
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
349
|
+
sage: M = FPModule(SteenrodAlgebra(2), [0,1], [[Sq(4), Sq(3)]])
|
|
350
|
+
sage: M._monomial(0)
|
|
351
|
+
g[0]
|
|
352
|
+
|
|
353
|
+
TESTS::
|
|
354
|
+
|
|
355
|
+
sage: M.monomial(3)
|
|
356
|
+
Traceback (most recent call last):
|
|
357
|
+
...
|
|
358
|
+
ValueError: index not in indices
|
|
359
|
+
"""
|
|
360
|
+
if index not in self._indices:
|
|
361
|
+
raise ValueError("index not in indices")
|
|
362
|
+
return self._from_dict({index: self.base_ring().one()}, remove_zeros=False)
|
|
363
|
+
|
|
364
|
+
@lazy_attribute
|
|
365
|
+
def monomial(self):
|
|
366
|
+
"""
|
|
367
|
+
Return the basis element indexed by ``i``.
|
|
368
|
+
|
|
369
|
+
INPUT:
|
|
370
|
+
|
|
371
|
+
- ``i`` -- an element of the index set
|
|
372
|
+
|
|
373
|
+
EXAMPLES::
|
|
374
|
+
|
|
375
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
376
|
+
sage: M = FPModule(SteenrodAlgebra(2), [0,1], [[Sq(4), Sq(3)]])
|
|
377
|
+
sage: M.monomial(0)
|
|
378
|
+
g[0]
|
|
379
|
+
sage: M.monomial(1)
|
|
380
|
+
g[1]
|
|
381
|
+
"""
|
|
382
|
+
# Should use a real Map, as soon as combinatorial_classes are enumerated sets, and therefore parents
|
|
383
|
+
from sage.categories.poor_man_map import PoorManMap
|
|
384
|
+
return PoorManMap(self._monomial, domain=self._indices, codomain=self, name="Term map")
|
|
385
|
+
|
|
386
|
+
@cached_method
|
|
387
|
+
def zero(self):
|
|
388
|
+
r"""
|
|
389
|
+
Return the zero element.
|
|
390
|
+
|
|
391
|
+
EXAMPLES::
|
|
392
|
+
|
|
393
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
394
|
+
sage: M = FPModule(SteenrodAlgebra(2), [0,1], [[Sq(4), Sq(3)]])
|
|
395
|
+
sage: M.zero()
|
|
396
|
+
0
|
|
397
|
+
"""
|
|
398
|
+
return self.element_class(self, {})
|
|
399
|
+
|
|
400
|
+
def _element_constructor_(self, x):
|
|
401
|
+
r"""
|
|
402
|
+
Construct any element of ``self``.
|
|
403
|
+
|
|
404
|
+
INPUT:
|
|
405
|
+
|
|
406
|
+
- ``x`` -- tuple of coefficients, an element of FPModule, or the
|
|
407
|
+
zero integer constant
|
|
408
|
+
|
|
409
|
+
OUTPUT:
|
|
410
|
+
|
|
411
|
+
An instance of the element class with coefficients from ``x``, the
|
|
412
|
+
element ``x`` if it already was an element, or the zero element.
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
417
|
+
sage: A = SteenrodAlgebra(2)
|
|
418
|
+
sage: M.<a0,a2,a4> = FPModule(A, [0,2,4], [[Sq(4), Sq(2), 0]])
|
|
419
|
+
|
|
420
|
+
Creating an element from coefficients::
|
|
421
|
+
|
|
422
|
+
sage: e = M((Sq(6), 0, Sq(2))); e
|
|
423
|
+
Sq(6)*a0 + Sq(2)*a4
|
|
424
|
+
sage: e in M
|
|
425
|
+
True
|
|
426
|
+
|
|
427
|
+
Creating the zero element::
|
|
428
|
+
|
|
429
|
+
sage: z = M(0); z
|
|
430
|
+
0
|
|
431
|
+
sage: z.is_zero()
|
|
432
|
+
True
|
|
433
|
+
|
|
434
|
+
Idempotent on elements belonging to the module::
|
|
435
|
+
|
|
436
|
+
sage: M(e)
|
|
437
|
+
Sq(6)*a0 + Sq(2)*a4
|
|
438
|
+
sage: e is M(e)
|
|
439
|
+
True
|
|
440
|
+
"""
|
|
441
|
+
if parent(x) is self:
|
|
442
|
+
return x
|
|
443
|
+
if not self._generator_degrees: # the trivial module
|
|
444
|
+
return self.zero()
|
|
445
|
+
if not x:
|
|
446
|
+
return self.zero()
|
|
447
|
+
B = self._spanning_set
|
|
448
|
+
if isinstance(x, FreeGradedModuleElement):
|
|
449
|
+
if x.parent() is self._free_module():
|
|
450
|
+
# x.parent() should have the same generator list as self.
|
|
451
|
+
coeffs = x.monomial_coefficients()
|
|
452
|
+
return sum(coeffs[idx] * B[idx] for idx in coeffs)
|
|
453
|
+
raise ValueError("element is not in this module")
|
|
454
|
+
return self._from_dict({b: c for (c, b) in zip(x, self._indices) if c},
|
|
455
|
+
remove_zeros=False)
|
|
456
|
+
|
|
457
|
+
def _repr_(self):
|
|
458
|
+
r"""
|
|
459
|
+
Construct a string representation of ``self``.
|
|
460
|
+
|
|
461
|
+
EXAMPLES::
|
|
462
|
+
|
|
463
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
464
|
+
sage: A = SteenrodAlgebra(2)
|
|
465
|
+
sage: M = FPModule(A, [0,2,4], [[Sq(4),Sq(2),0]]); M
|
|
466
|
+
Finitely presented left module on 3 generators and 1 relation over
|
|
467
|
+
mod 2 Steenrod algebra, milnor basis
|
|
468
|
+
sage: N = FPModule(A, [0,1], [[Sq(2),Sq(1)], [Sq(2)*Sq(1),Sq(2)]]); N
|
|
469
|
+
Finitely presented left module on 2 generators and 2 relations over
|
|
470
|
+
mod 2 Steenrod algebra, milnor basis
|
|
471
|
+
sage: F = FPModule(A, [2]); F
|
|
472
|
+
Free graded left module on 1 generator over
|
|
473
|
+
mod 2 Steenrod algebra, milnor basis
|
|
474
|
+
"""
|
|
475
|
+
return "Finitely presented left module on %s generator%s and %s relation%s over %s"\
|
|
476
|
+
% (len(self._free_module().generator_degrees()),
|
|
477
|
+
"" if len(self._free_module().generator_degrees()) == 1 else "s",
|
|
478
|
+
len(self._j.values()), "" if len(self._j.values()) == 1 else "s",
|
|
479
|
+
self.base_ring())
|
|
480
|
+
|
|
481
|
+
def _repr_term(self, m):
|
|
482
|
+
"""
|
|
483
|
+
Return a string representing the generator indexed by ``m``.
|
|
484
|
+
|
|
485
|
+
EXAMPLES::
|
|
486
|
+
|
|
487
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
488
|
+
sage: A = SteenrodAlgebra(2)
|
|
489
|
+
sage: M = FPModule(A, [0,2,4], [[Sq(4),Sq(2),0]])
|
|
490
|
+
sage: M._repr_term(4)
|
|
491
|
+
'g[4]'
|
|
492
|
+
"""
|
|
493
|
+
return self._free_module()._repr_term(m)
|
|
494
|
+
|
|
495
|
+
def _latex_term(self, m):
|
|
496
|
+
"""
|
|
497
|
+
Return a LaTeX representing the generator indexed by ``m``.
|
|
498
|
+
|
|
499
|
+
EXAMPLES::
|
|
500
|
+
|
|
501
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
502
|
+
sage: A = SteenrodAlgebra(2)
|
|
503
|
+
sage: M = FPModule(A, [0,2,4], [[Sq(4),Sq(2),0]])
|
|
504
|
+
sage: M._latex_term(4)
|
|
505
|
+
'g_{4}'
|
|
506
|
+
"""
|
|
507
|
+
return self._free_module()._latex_term(m)
|
|
508
|
+
|
|
509
|
+
def connectivity(self):
|
|
510
|
+
r"""
|
|
511
|
+
The connectivity of ``self``.
|
|
512
|
+
|
|
513
|
+
Since a finitely presented module over a connected algebra is in
|
|
514
|
+
particular bounded below, the connectivity is an integer when the
|
|
515
|
+
module is non-trivial, and `+\infty` when the module is trivial.
|
|
516
|
+
|
|
517
|
+
EXAMPLES::
|
|
518
|
+
|
|
519
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
520
|
+
sage: A = SteenrodAlgebra(2)
|
|
521
|
+
|
|
522
|
+
sage: M = FPModule(A, [0,2,4], [[0, Sq(5), Sq(3)], [Sq(7), 0, Sq(2)*Sq(1)]])
|
|
523
|
+
sage: M.connectivity()
|
|
524
|
+
0
|
|
525
|
+
|
|
526
|
+
sage: G = FPModule(A, [0,2], [[1,0]])
|
|
527
|
+
sage: G.connectivity()
|
|
528
|
+
2
|
|
529
|
+
|
|
530
|
+
TESTS::
|
|
531
|
+
|
|
532
|
+
sage: C = FPModule(SteenrodAlgebra(2, profile=(3,2,1)), [0], relations=[[Sq(1)], [0]])
|
|
533
|
+
sage: C.connectivity()
|
|
534
|
+
0
|
|
535
|
+
|
|
536
|
+
sage: F = FPModule(A, [-1])
|
|
537
|
+
sage: F.connectivity()
|
|
538
|
+
-1
|
|
539
|
+
|
|
540
|
+
sage: F = FPModule(A, [])
|
|
541
|
+
sage: F.connectivity()
|
|
542
|
+
+Infinity
|
|
543
|
+
|
|
544
|
+
sage: F = FPModule(A, [0], [[1]])
|
|
545
|
+
sage: F.connectivity()
|
|
546
|
+
+Infinity
|
|
547
|
+
"""
|
|
548
|
+
# In case there are no relations, the connectivity is the equal to
|
|
549
|
+
# the connectivity of the free module on the generators.
|
|
550
|
+
if self._j._degree is None:
|
|
551
|
+
return self._free_module().connectivity()
|
|
552
|
+
|
|
553
|
+
# We must check that the generator(s) in the free generator module are
|
|
554
|
+
# not hit by relations, since we are not guaranteed that the
|
|
555
|
+
# presentation we have is minimal.
|
|
556
|
+
X = sorted(self.generator_degrees())
|
|
557
|
+
|
|
558
|
+
previous = None
|
|
559
|
+
for k in X:
|
|
560
|
+
if previous is not None and k == previous:
|
|
561
|
+
continue
|
|
562
|
+
if not self._j.vector_presentation(k - self._j._degree).is_surjective():
|
|
563
|
+
return k
|
|
564
|
+
previous = k
|
|
565
|
+
|
|
566
|
+
return infinity
|
|
567
|
+
|
|
568
|
+
def is_trivial(self) -> bool:
|
|
569
|
+
r"""
|
|
570
|
+
Return ``True`` if ``self`` is isomorphic to the trivial module
|
|
571
|
+
and ``False`` otherwise.
|
|
572
|
+
|
|
573
|
+
EXAMPLES::
|
|
574
|
+
|
|
575
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
576
|
+
sage: A = SteenrodAlgebra(2)
|
|
577
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
578
|
+
|
|
579
|
+
sage: M = FPModule(A2, [])
|
|
580
|
+
sage: M.is_trivial()
|
|
581
|
+
True
|
|
582
|
+
|
|
583
|
+
sage: N = FPModule(A, [1,2])
|
|
584
|
+
sage: N.is_trivial()
|
|
585
|
+
False
|
|
586
|
+
|
|
587
|
+
sage: P = FPModule(A, [1,2], [[1,0], [0,1]])
|
|
588
|
+
sage: P.is_trivial()
|
|
589
|
+
True
|
|
590
|
+
|
|
591
|
+
TESTS::
|
|
592
|
+
|
|
593
|
+
sage: C = FPModule(SteenrodAlgebra(2, profile=(3,2,1)), [0], [[Sq(1)], [0]])
|
|
594
|
+
sage: C.is_trivial()
|
|
595
|
+
False
|
|
596
|
+
|
|
597
|
+
sage: C = FPModule(SteenrodAlgebra(2), [0], [[Sq(1)], [1]])
|
|
598
|
+
sage: C.is_trivial()
|
|
599
|
+
True
|
|
600
|
+
"""
|
|
601
|
+
return self.connectivity() == infinity
|
|
602
|
+
|
|
603
|
+
def has_relations(self) -> bool:
|
|
604
|
+
r"""
|
|
605
|
+
Return ``True`` if no relations are defined, and ``False``
|
|
606
|
+
otherwise.
|
|
607
|
+
|
|
608
|
+
.. NOTE::
|
|
609
|
+
|
|
610
|
+
This module is free if this function returns ``False``, but a free
|
|
611
|
+
module can have (redundant) relations.
|
|
612
|
+
|
|
613
|
+
EXAMPLES::
|
|
614
|
+
|
|
615
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
616
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
617
|
+
|
|
618
|
+
sage: F = FPModule(A2, [1,2])
|
|
619
|
+
sage: F.has_relations()
|
|
620
|
+
False
|
|
621
|
+
|
|
622
|
+
sage: M = FPModule(A2, [1,2], [[Sq(2), Sq(1)]])
|
|
623
|
+
sage: M.has_relations()
|
|
624
|
+
True
|
|
625
|
+
|
|
626
|
+
A free module constructed with a redundant generator and relation::
|
|
627
|
+
|
|
628
|
+
sage: N = FPModule(A2, [0, 0], [[0, 1]])
|
|
629
|
+
sage: N.has_relations()
|
|
630
|
+
True
|
|
631
|
+
sage: # Computing a minimal presentation reveals an
|
|
632
|
+
....: # isomorphic module with no relations.
|
|
633
|
+
sage: N_min = N.minimal_presentation().domain()
|
|
634
|
+
sage: N_min.has_relations()
|
|
635
|
+
False
|
|
636
|
+
"""
|
|
637
|
+
return not self._j.is_zero()
|
|
638
|
+
|
|
639
|
+
def an_element(self, n=None):
|
|
640
|
+
r"""
|
|
641
|
+
An element of this module.
|
|
642
|
+
|
|
643
|
+
This function chooses deterministically an element, i.e. the output
|
|
644
|
+
depends only on the module and its input ``n``.
|
|
645
|
+
|
|
646
|
+
INPUT:
|
|
647
|
+
|
|
648
|
+
- ``n`` -- (optional) the degree of the element to construct
|
|
649
|
+
|
|
650
|
+
OUTPUT: a module element of the given degree
|
|
651
|
+
|
|
652
|
+
EXAMPLES::
|
|
653
|
+
|
|
654
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
655
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
656
|
+
sage: M = FPModule(A2, [0,2,4], [[0, Sq(5), Sq(3)], [Sq(7), 0, Sq(2)*Sq(1)]])
|
|
657
|
+
|
|
658
|
+
sage: [M.an_element(i) for i in range(10)]
|
|
659
|
+
[g[0],
|
|
660
|
+
Sq(1)*g[0],
|
|
661
|
+
Sq(2)*g[0] + g[2],
|
|
662
|
+
Sq(0,1)*g[0] + Sq(1)*g[2],
|
|
663
|
+
Sq(1,1)*g[0] + Sq(2)*g[2] + g[4],
|
|
664
|
+
Sq(2,1)*g[0] + Sq(0,1)*g[2] + Sq(1)*g[4],
|
|
665
|
+
Sq(0,2)*g[0] + Sq(1,1)*g[2] + Sq(2)*g[4],
|
|
666
|
+
Sq(0,0,1)*g[0] + Sq(2,1)*g[2] + Sq(0,1)*g[4],
|
|
667
|
+
Sq(1,0,1)*g[0] + Sq(6)*g[2] + Sq(1,1)*g[4],
|
|
668
|
+
Sq(2,0,1)*g[0] + Sq(4,1)*g[2] + Sq(2,1)*g[4]]
|
|
669
|
+
"""
|
|
670
|
+
a_free_element = self._free_module().an_element(n)
|
|
671
|
+
return self(a_free_element)
|
|
672
|
+
|
|
673
|
+
@cached_method
|
|
674
|
+
def basis_elements(self, n, verbose=False):
|
|
675
|
+
r"""
|
|
676
|
+
Return a basis for the free module of degree ``n`` module elements.
|
|
677
|
+
|
|
678
|
+
.. NOTE::
|
|
679
|
+
|
|
680
|
+
Suppose ``self`` is a module over the graded algebra `A` with
|
|
681
|
+
base ring `R`. This returns a basis as a free module over `R`.
|
|
682
|
+
|
|
683
|
+
INPUT:
|
|
684
|
+
|
|
685
|
+
- ``n`` -- integer
|
|
686
|
+
- ``verbose`` -- boolean (default: ``False``); controls whether log
|
|
687
|
+
messages should be emitted
|
|
688
|
+
|
|
689
|
+
OUTPUT:
|
|
690
|
+
|
|
691
|
+
A list of homogeneous module elements of degree ``n`` which is
|
|
692
|
+
a basis for the free module of all degree ``n`` module elements.
|
|
693
|
+
|
|
694
|
+
.. SEEALSO::
|
|
695
|
+
|
|
696
|
+
:meth:`vector_presentation`, :meth:`element_from_coordinates`
|
|
697
|
+
|
|
698
|
+
EXAMPLES::
|
|
699
|
+
|
|
700
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
701
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
702
|
+
sage: M.<m0,m2> = FPModule(A2, [0,2], [[Sq(4), Sq(2)], [0, Sq(6)]])
|
|
703
|
+
|
|
704
|
+
sage: M.basis_elements(4)
|
|
705
|
+
(Sq(1,1)*m0, Sq(4)*m0)
|
|
706
|
+
|
|
707
|
+
sage: M.basis_elements(5)
|
|
708
|
+
(Sq(2,1)*m0, Sq(5)*m0, Sq(0,1)*m2)
|
|
709
|
+
|
|
710
|
+
sage: M.basis_elements(25)
|
|
711
|
+
()
|
|
712
|
+
|
|
713
|
+
sage: M.basis_elements(0)
|
|
714
|
+
(m0,)
|
|
715
|
+
|
|
716
|
+
sage: M.basis_elements(2)
|
|
717
|
+
(Sq(2)*m0, m2)
|
|
718
|
+
|
|
719
|
+
TESTS::
|
|
720
|
+
|
|
721
|
+
sage: Z0 = FPModule(A2, [])
|
|
722
|
+
sage: Z0.basis_elements(n=10)
|
|
723
|
+
()
|
|
724
|
+
|
|
725
|
+
sage: Z1 = FPModule(A2, [1], [[1]])
|
|
726
|
+
sage: Z1.basis_elements(n=10)
|
|
727
|
+
()
|
|
728
|
+
"""
|
|
729
|
+
return tuple([self.element_from_coordinates(x, n) for
|
|
730
|
+
x in self.vector_presentation(n, verbose).basis()])
|
|
731
|
+
|
|
732
|
+
@cached_method
|
|
733
|
+
def element_from_coordinates(self, coordinates, n):
|
|
734
|
+
r"""
|
|
735
|
+
Return the module element in degree ``n`` having the given coordinates
|
|
736
|
+
with respect to the basis returned by :meth:`basis_elements`.
|
|
737
|
+
|
|
738
|
+
This function is inverse to
|
|
739
|
+
:meth:`sage.modules.fp_graded.element.FPElement.vector_presentation`.
|
|
740
|
+
|
|
741
|
+
INPUT:
|
|
742
|
+
|
|
743
|
+
- ``coordinates`` -- a vector of coordinates
|
|
744
|
+
- ``n`` -- the degree of the element to construct
|
|
745
|
+
|
|
746
|
+
OUTPUT:
|
|
747
|
+
|
|
748
|
+
A module element of degree ``n`` having the given coordinates
|
|
749
|
+
with respect to the basis returned by :meth:`basis_elements`.
|
|
750
|
+
|
|
751
|
+
EXAMPLES::
|
|
752
|
+
|
|
753
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
754
|
+
sage: A = SteenrodAlgebra(2)
|
|
755
|
+
sage: M = FPModule(A, [0], [[Sq(4)], [Sq(7)], [Sq(4)*Sq(9)]])
|
|
756
|
+
|
|
757
|
+
sage: M.vector_presentation(12).dimension()
|
|
758
|
+
3
|
|
759
|
+
sage: x = M.element_from_coordinates((0,1,0), 12); x
|
|
760
|
+
Sq(0,4)*g[0]
|
|
761
|
+
|
|
762
|
+
Applying the inverse function brings us back to the coordinate form::
|
|
763
|
+
|
|
764
|
+
sage: x.vector_presentation()
|
|
765
|
+
(0, 1, 0)
|
|
766
|
+
|
|
767
|
+
TESTS::
|
|
768
|
+
|
|
769
|
+
sage: M.element_from_coordinates((0,1,0,0), 12)
|
|
770
|
+
Traceback (most recent call last):
|
|
771
|
+
...
|
|
772
|
+
ValueError: the given coordinate vector has incorrect length (4);
|
|
773
|
+
it should have length 3
|
|
774
|
+
|
|
775
|
+
.. SEEALSO::
|
|
776
|
+
|
|
777
|
+
:meth:`sage.modules.fp_graded.module.FPModule.vector_presentation`
|
|
778
|
+
"""
|
|
779
|
+
M_n = self.vector_presentation(n)
|
|
780
|
+
|
|
781
|
+
if len(coordinates) != M_n.dimension():
|
|
782
|
+
raise ValueError('the given coordinate vector has incorrect length (%d); '
|
|
783
|
+
'it should have length %d' % (len(coordinates), M_n.dimension()))
|
|
784
|
+
|
|
785
|
+
free_element = self._free_module().element_from_coordinates(
|
|
786
|
+
M_n.lift(coordinates), n)
|
|
787
|
+
|
|
788
|
+
return self(free_element.dense_coefficient_list())
|
|
789
|
+
|
|
790
|
+
@cached_method
|
|
791
|
+
def vector_presentation(self, n, verbose=False):
|
|
792
|
+
r"""
|
|
793
|
+
Return a free module isomorphic to the free module of module
|
|
794
|
+
elements of degree ``n``.
|
|
795
|
+
|
|
796
|
+
INPUT:
|
|
797
|
+
|
|
798
|
+
- ``n`` -- the degree of the presentation
|
|
799
|
+
|
|
800
|
+
OUTPUT: a vector space
|
|
801
|
+
|
|
802
|
+
.. SEEALSO::
|
|
803
|
+
|
|
804
|
+
:meth:`basis_elements`, :meth:`element_from_coordinates`
|
|
805
|
+
|
|
806
|
+
EXAMPLES::
|
|
807
|
+
|
|
808
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
809
|
+
sage: A = SteenrodAlgebra(2)
|
|
810
|
+
sage: M = FPModule(A, [0,2,4], [[Sq(4),Sq(2),0]])
|
|
811
|
+
|
|
812
|
+
sage: V = M.vector_presentation(4)
|
|
813
|
+
sage: V.dimension()
|
|
814
|
+
3
|
|
815
|
+
|
|
816
|
+
sage: len(M.basis_elements(4))
|
|
817
|
+
3
|
|
818
|
+
|
|
819
|
+
TESTS::
|
|
820
|
+
|
|
821
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
822
|
+
sage: A = SteenrodAlgebra(2)
|
|
823
|
+
sage: M = FPModule(A, [0,2,4], [[Sq(4),Sq(2),0]])
|
|
824
|
+
sage: M[4].dimension()
|
|
825
|
+
3
|
|
826
|
+
"""
|
|
827
|
+
# Get the vector space presentation of the free module on the
|
|
828
|
+
# module generators.
|
|
829
|
+
F_n = self._free_module().vector_presentation(n)
|
|
830
|
+
|
|
831
|
+
# Compute the sub vector space generated by the relations.
|
|
832
|
+
spanning_set = []
|
|
833
|
+
|
|
834
|
+
if verbose:
|
|
835
|
+
num_total_iterations = 0
|
|
836
|
+
for relation in self._j.values():
|
|
837
|
+
if relation.is_zero():
|
|
838
|
+
continue
|
|
839
|
+
|
|
840
|
+
num_total_iterations += len(self.base_ring().basis(n - relation.degree()))
|
|
841
|
+
|
|
842
|
+
progress = 0
|
|
843
|
+
iteration_count = 0
|
|
844
|
+
|
|
845
|
+
for relation in self._j.values():
|
|
846
|
+
if relation.is_zero():
|
|
847
|
+
continue
|
|
848
|
+
|
|
849
|
+
for a in self.base_ring().basis(n - relation.degree()):
|
|
850
|
+
if verbose:
|
|
851
|
+
iteration_count += 1
|
|
852
|
+
prog = int(100 * iteration_count / num_total_iterations)
|
|
853
|
+
if prog > progress:
|
|
854
|
+
progress = prog
|
|
855
|
+
print('Progress: %d/100' % prog)
|
|
856
|
+
|
|
857
|
+
# assert: isinstance(FreeElement, relation)
|
|
858
|
+
v = (a * relation).vector_presentation()
|
|
859
|
+
if v is not None:
|
|
860
|
+
spanning_set.append(v)
|
|
861
|
+
|
|
862
|
+
R_n = F_n.submodule(spanning_set)
|
|
863
|
+
|
|
864
|
+
# Return the quotient of the free part by the relations.
|
|
865
|
+
return F_n / R_n
|
|
866
|
+
|
|
867
|
+
__getitem__ = vector_presentation
|
|
868
|
+
|
|
869
|
+
def _Hom_(self, Y, category):
|
|
870
|
+
r"""
|
|
871
|
+
The internal hook used by the free function
|
|
872
|
+
:meth:`sage.categories.homset.hom.Hom` to create homsets
|
|
873
|
+
involving ``self``.
|
|
874
|
+
|
|
875
|
+
TESTS::
|
|
876
|
+
|
|
877
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
878
|
+
sage: A = SteenrodAlgebra(2)
|
|
879
|
+
sage: F = FPModule(A, [1,3])
|
|
880
|
+
sage: L = FPModule(A, [2,3], [[Sq(2),Sq(1)], [0,Sq(2)]])
|
|
881
|
+
|
|
882
|
+
sage: Hom(F, L)
|
|
883
|
+
Set of Morphisms from Free graded left module on 2 generators ...
|
|
884
|
+
|
|
885
|
+
sage: M = A.free_graded_module((2,1))
|
|
886
|
+
sage: Hom(F, M)
|
|
887
|
+
Set of Morphisms from Free graded left module on 2 generators ...
|
|
888
|
+
"""
|
|
889
|
+
from .homspace import FPModuleHomspace
|
|
890
|
+
if not isinstance(Y, (FPModule, FreeGradedModule)):
|
|
891
|
+
raise ValueError('cannot create homspace between incompatible types:\n%s ->\n%s' % (self.__class__, type(Y)))
|
|
892
|
+
if Y.base_ring() != self.base_ring():
|
|
893
|
+
raise ValueError('the modules are not defined over the same base ring')
|
|
894
|
+
|
|
895
|
+
return FPModuleHomspace(self, Y, category)
|
|
896
|
+
|
|
897
|
+
def generator_degrees(self):
|
|
898
|
+
r"""
|
|
899
|
+
Return the degrees of the generators for ``self``.
|
|
900
|
+
|
|
901
|
+
EXAMPLES::
|
|
902
|
+
|
|
903
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
904
|
+
sage: A4 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
905
|
+
sage: N = FPModule(A4, [0, 1], [[Sq(2), Sq(1)]])
|
|
906
|
+
|
|
907
|
+
sage: N.generator_degrees()
|
|
908
|
+
(0, 1)
|
|
909
|
+
"""
|
|
910
|
+
return self._generator_degrees
|
|
911
|
+
|
|
912
|
+
def generators(self):
|
|
913
|
+
r"""
|
|
914
|
+
Return the generators of ``self``.
|
|
915
|
+
|
|
916
|
+
EXAMPLES::
|
|
917
|
+
|
|
918
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
919
|
+
sage: A4 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
920
|
+
|
|
921
|
+
sage: M = FPModule(A4, [0,0,2,3])
|
|
922
|
+
sage: M.generators()
|
|
923
|
+
(g[0, 0], g[0, 1], g[2, 0], g[3, 0])
|
|
924
|
+
|
|
925
|
+
sage: N = FPModule(A4, [0, 1], [[Sq(2), Sq(1)]], names='h')
|
|
926
|
+
sage: N.generators()
|
|
927
|
+
(h[0], h[1])
|
|
928
|
+
|
|
929
|
+
sage: Z = FPModule(A4, [])
|
|
930
|
+
sage: Z.generators()
|
|
931
|
+
()
|
|
932
|
+
"""
|
|
933
|
+
return tuple([self.generator(i) for i in range(len(self.generator_degrees()))])
|
|
934
|
+
|
|
935
|
+
gens = generators
|
|
936
|
+
|
|
937
|
+
def generator(self, index):
|
|
938
|
+
r"""
|
|
939
|
+
Return the module generator with the given index.
|
|
940
|
+
|
|
941
|
+
EXAMPLES::
|
|
942
|
+
|
|
943
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
944
|
+
sage: A4 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
945
|
+
|
|
946
|
+
sage: M = FPModule(A4, [0,2,3])
|
|
947
|
+
sage: M.generator(0)
|
|
948
|
+
g[0]
|
|
949
|
+
|
|
950
|
+
sage: N = FPModule(A4, [0, 1], [[Sq(2), Sq(1)]], names='h')
|
|
951
|
+
sage: N.generator(1)
|
|
952
|
+
h[1]
|
|
953
|
+
"""
|
|
954
|
+
return self(self._free_module().generator(index))
|
|
955
|
+
|
|
956
|
+
gen = generator
|
|
957
|
+
|
|
958
|
+
def relations(self):
|
|
959
|
+
r"""
|
|
960
|
+
Return the relations of ``self``.
|
|
961
|
+
|
|
962
|
+
EXAMPLES::
|
|
963
|
+
|
|
964
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
965
|
+
sage: A4 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
966
|
+
|
|
967
|
+
sage: M = FPModule(A4, [0,2,3])
|
|
968
|
+
sage: M.relations()
|
|
969
|
+
()
|
|
970
|
+
|
|
971
|
+
sage: N = FPModule(A4, [0, 1], [[Sq(2), Sq(1)]])
|
|
972
|
+
sage: N.relations()
|
|
973
|
+
(Sq(2)*g[0] + Sq(1)*g[1],)
|
|
974
|
+
|
|
975
|
+
sage: Z = FPModule(A4, [])
|
|
976
|
+
sage: Z.relations()
|
|
977
|
+
()
|
|
978
|
+
"""
|
|
979
|
+
return self._j.values()
|
|
980
|
+
|
|
981
|
+
def relation(self, index):
|
|
982
|
+
r"""
|
|
983
|
+
Return the module relation of the given index.
|
|
984
|
+
|
|
985
|
+
EXAMPLES::
|
|
986
|
+
|
|
987
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
988
|
+
sage: A4 = SteenrodAlgebra(2, profile=(4,3,2,1))
|
|
989
|
+
sage: N = FPModule(A4, [0, 1], [[Sq(2), Sq(1)]])
|
|
990
|
+
sage: N.relation(0)
|
|
991
|
+
Sq(2)*g[0] + Sq(1)*g[1]
|
|
992
|
+
"""
|
|
993
|
+
return self._j.values()[index]
|
|
994
|
+
|
|
995
|
+
def minimal_presentation(self, top_dim=None, verbose=False):
|
|
996
|
+
r"""
|
|
997
|
+
Return a minimal presentation of ``self``.
|
|
998
|
+
|
|
999
|
+
OUTPUT:
|
|
1000
|
+
|
|
1001
|
+
An isomorphism `M \to S`, where `M` has minimal presentation
|
|
1002
|
+
and `S` is ``self``.
|
|
1003
|
+
|
|
1004
|
+
EXAMPLES::
|
|
1005
|
+
|
|
1006
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
1007
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
1008
|
+
|
|
1009
|
+
sage: M = FPModule(A2, [0,1], [[Sq(2),Sq(1)],[0,Sq(2)],[Sq(3),0]])
|
|
1010
|
+
sage: i = M.minimal_presentation()
|
|
1011
|
+
sage: M_min = i.domain()
|
|
1012
|
+
|
|
1013
|
+
``i`` is an isomorphism between ``M_min`` and ``M``::
|
|
1014
|
+
|
|
1015
|
+
sage: i.codomain() is M
|
|
1016
|
+
True
|
|
1017
|
+
sage: i.is_injective()
|
|
1018
|
+
True
|
|
1019
|
+
sage: i.is_surjective()
|
|
1020
|
+
True
|
|
1021
|
+
|
|
1022
|
+
There are more relations in ``M`` than in ``M_min``::
|
|
1023
|
+
|
|
1024
|
+
sage: M.relations()
|
|
1025
|
+
(Sq(2)*g[0] + Sq(1)*g[1], Sq(2)*g[1], Sq(3)*g[0])
|
|
1026
|
+
sage: M_min.relations()
|
|
1027
|
+
(Sq(2)*g[0] + Sq(1)*g[1], Sq(2)*g[1])
|
|
1028
|
+
|
|
1029
|
+
TESTS::
|
|
1030
|
+
|
|
1031
|
+
sage: T = FPModule(A2, [0], [[1]])
|
|
1032
|
+
sage: T_min = T.minimal_presentation().domain()
|
|
1033
|
+
sage: T_min.is_trivial()
|
|
1034
|
+
True
|
|
1035
|
+
sage: T_min
|
|
1036
|
+
Free graded left module on 0 generators over ...
|
|
1037
|
+
|
|
1038
|
+
Similar example but using
|
|
1039
|
+
:class:`sage.modules.fp_graded.steenrod.module.SteenrodFPModule`::
|
|
1040
|
+
|
|
1041
|
+
sage: from sage.modules.fp_graded.steenrod.module import SteenrodFPModule
|
|
1042
|
+
sage: A = SteenrodAlgebra(2)
|
|
1043
|
+
sage: M = SteenrodFPModule(A, [0,1], [[Sq(2),Sq(1)],[0,Sq(2)],[Sq(3),0]])
|
|
1044
|
+
|
|
1045
|
+
sage: i = M.minimal_presentation()
|
|
1046
|
+
sage: i.codomain() is M
|
|
1047
|
+
True
|
|
1048
|
+
|
|
1049
|
+
sage: i.is_injective()
|
|
1050
|
+
True
|
|
1051
|
+
sage: i.is_surjective()
|
|
1052
|
+
True
|
|
1053
|
+
|
|
1054
|
+
sage: i.domain().relations()
|
|
1055
|
+
(Sq(2)*g[0] + Sq(1)*g[1], Sq(2)*g[1])
|
|
1056
|
+
|
|
1057
|
+
sage: i.codomain().relations()
|
|
1058
|
+
(Sq(2)*g[0] + Sq(1)*g[1], Sq(2)*g[1], Sq(3)*g[0])
|
|
1059
|
+
"""
|
|
1060
|
+
return Hom(self, self).identity().image(top_dim, verbose)
|
|
1061
|
+
|
|
1062
|
+
def suspension(self, t):
|
|
1063
|
+
r"""
|
|
1064
|
+
Return the suspension of ``self`` by degree ``t``.
|
|
1065
|
+
|
|
1066
|
+
INPUT:
|
|
1067
|
+
|
|
1068
|
+
- ``t`` -- integer degree by which the module is suspended
|
|
1069
|
+
|
|
1070
|
+
OUTPUT:
|
|
1071
|
+
|
|
1072
|
+
A module which is identical to this module by a shift of
|
|
1073
|
+
degrees by the integer ``t``.
|
|
1074
|
+
|
|
1075
|
+
EXAMPLES::
|
|
1076
|
+
|
|
1077
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
1078
|
+
sage: A = SteenrodAlgebra(2)
|
|
1079
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
1080
|
+
|
|
1081
|
+
sage: Y = FPModule(A2, [0], [[Sq(1)]])
|
|
1082
|
+
sage: X = Y.suspension(4)
|
|
1083
|
+
sage: X.generator_degrees()
|
|
1084
|
+
(4,)
|
|
1085
|
+
sage: X.relations()
|
|
1086
|
+
(Sq(1)*g[4],)
|
|
1087
|
+
|
|
1088
|
+
sage: M = FPModule(A, [2,3], [[Sq(2), Sq(1)], [0, Sq(2)]])
|
|
1089
|
+
sage: Q = M.suspension(1)
|
|
1090
|
+
sage: Q.generator_degrees()
|
|
1091
|
+
(3, 4)
|
|
1092
|
+
sage: Q.relations()
|
|
1093
|
+
(Sq(2)*g[3] + Sq(1)*g[4], Sq(2)*g[4])
|
|
1094
|
+
sage: Q = M.suspension(-3)
|
|
1095
|
+
sage: Q.generator_degrees()
|
|
1096
|
+
(-1, 0)
|
|
1097
|
+
sage: Q = M.suspension(0)
|
|
1098
|
+
sage: Q.generator_degrees()
|
|
1099
|
+
(2, 3)
|
|
1100
|
+
"""
|
|
1101
|
+
relations = tuple([r.dense_coefficient_list() for r in self._j._values])
|
|
1102
|
+
return type(self).__base__(self.base_ring(),
|
|
1103
|
+
tuple([g + t for g in self._generator_degrees]),
|
|
1104
|
+
relations)
|
|
1105
|
+
|
|
1106
|
+
def submodule_inclusion(self, spanning_elements):
|
|
1107
|
+
r"""
|
|
1108
|
+
Return the inclusion morphism of the submodule of ``self`` spanned
|
|
1109
|
+
by the given elements.
|
|
1110
|
+
|
|
1111
|
+
INPUT:
|
|
1112
|
+
|
|
1113
|
+
- ``spanning_elements`` -- an iterable of elements
|
|
1114
|
+
|
|
1115
|
+
OUTPUT: the inclusion of the submodule into this module
|
|
1116
|
+
|
|
1117
|
+
Because a submodule of a finitely presented module need not be
|
|
1118
|
+
finitely presented, this method will only work if the
|
|
1119
|
+
underlying algebra is finite-dimensional. Indeed, the current
|
|
1120
|
+
implementation only works if the algebra has a ``top_class``
|
|
1121
|
+
method, which gets used in
|
|
1122
|
+
:meth:`sage.modules.fp_graded.morphism._resolve_kernel`.
|
|
1123
|
+
|
|
1124
|
+
EXAMPLES::
|
|
1125
|
+
|
|
1126
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
1127
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
1128
|
+
|
|
1129
|
+
sage: M = FPModule(A2, [0,1], [[Sq(2),Sq(1)]])
|
|
1130
|
+
sage: i = M.submodule_inclusion([M.generator(0)])
|
|
1131
|
+
sage: i.codomain() is M
|
|
1132
|
+
True
|
|
1133
|
+
sage: i.is_injective()
|
|
1134
|
+
True
|
|
1135
|
+
sage: i.domain().generator_degrees()
|
|
1136
|
+
(0,)
|
|
1137
|
+
sage: i.domain().relations()
|
|
1138
|
+
(Sq(3)*g[0],)
|
|
1139
|
+
"""
|
|
1140
|
+
# Create the graded module on the set of spanning elements.
|
|
1141
|
+
degs = [x.degree() for x in spanning_elements]
|
|
1142
|
+
F = type(self).__base__(self.base_ring(), tuple(degs))
|
|
1143
|
+
|
|
1144
|
+
# The submodule is the module generated by the spanning elements.
|
|
1145
|
+
return Hom(F, self)(spanning_elements).image()
|
|
1146
|
+
|
|
1147
|
+
def resolution(self, k, top_dim=None, verbose=False):
|
|
1148
|
+
r"""
|
|
1149
|
+
Return a free resolution of this module of length ``k``.
|
|
1150
|
+
|
|
1151
|
+
INPUT:
|
|
1152
|
+
|
|
1153
|
+
- ``k`` -- nonnegative integer
|
|
1154
|
+
- ``top_dim`` -- stop the computation at this degree
|
|
1155
|
+
(default: ``None``, but required if the algebra is
|
|
1156
|
+
not finite-dimensional)
|
|
1157
|
+
- ``verbose`` -- boolean (default: ``False``); control if
|
|
1158
|
+
log messages should be emitted
|
|
1159
|
+
|
|
1160
|
+
OUTPUT: list of homomorphisms `[\epsilon, f_1, \ldots, f_k]` such that
|
|
1161
|
+
|
|
1162
|
+
.. MATH::
|
|
1163
|
+
|
|
1164
|
+
f_i: F_i \to F_{i-1} \text{ for } 1 < i \leq k,
|
|
1165
|
+
\qquad
|
|
1166
|
+
\epsilon: F_0 \to M,
|
|
1167
|
+
|
|
1168
|
+
where each `F_i` is a finitely generated free module, and the
|
|
1169
|
+
sequence
|
|
1170
|
+
|
|
1171
|
+
.. MATH::
|
|
1172
|
+
|
|
1173
|
+
F_k \xrightarrow{\mathit{f_k}} F_{k-1}
|
|
1174
|
+
\xrightarrow{\mathit{f_{k-1}}} \ldots \rightarrow F_0
|
|
1175
|
+
\xrightarrow{\epsilon} M \rightarrow 0
|
|
1176
|
+
|
|
1177
|
+
is exact. Note that the 0th element in this list is the map
|
|
1178
|
+
`\epsilon`, and the rest of the maps are between free
|
|
1179
|
+
modules.
|
|
1180
|
+
|
|
1181
|
+
EXAMPLES::
|
|
1182
|
+
|
|
1183
|
+
sage: from sage.modules.fp_graded.module import FPModule
|
|
1184
|
+
|
|
1185
|
+
sage: E.<x,y> = ExteriorAlgebra(QQ)
|
|
1186
|
+
sage: M = FPModule(E, [0], [[x], [y]])
|
|
1187
|
+
sage: res = M.resolution(3); res
|
|
1188
|
+
[Module morphism:
|
|
1189
|
+
From: Free graded left module on 1 generator over The exterior algebra of rank 2 over Rational Field
|
|
1190
|
+
To: Finitely presented left module on 1 generator and 2 relations over The exterior algebra of rank 2 over Rational Field
|
|
1191
|
+
Defn: g[0] |--> g[0],
|
|
1192
|
+
Module morphism:
|
|
1193
|
+
From: Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field
|
|
1194
|
+
To: Free graded left module on 1 generator over The exterior algebra of rank 2 over Rational Field
|
|
1195
|
+
Defn: g[1, 0] |--> x*g[0]
|
|
1196
|
+
g[1, 1] |--> y*g[0],
|
|
1197
|
+
Module morphism:
|
|
1198
|
+
From: Free graded left module on 3 generators over The exterior algebra of rank 2 over Rational Field
|
|
1199
|
+
To: Free graded left module on 2 generators over The exterior algebra of rank 2 over Rational Field
|
|
1200
|
+
Defn: g[2, 0] |--> x*g[1, 0]
|
|
1201
|
+
g[2, 1] |--> y*g[1, 0] + x*g[1, 1]
|
|
1202
|
+
g[2, 2] |--> y*g[1, 1],
|
|
1203
|
+
Module morphism:
|
|
1204
|
+
From: Free graded left module on 4 generators over The exterior algebra of rank 2 over Rational Field
|
|
1205
|
+
To: Free graded left module on 3 generators over The exterior algebra of rank 2 over Rational Field
|
|
1206
|
+
Defn: g[3, 0] |--> x*g[2, 0]
|
|
1207
|
+
g[3, 1] |--> y*g[2, 0] + x*g[2, 1]
|
|
1208
|
+
g[3, 2] |--> y*g[2, 1] + x*g[2, 2]
|
|
1209
|
+
g[3, 3] |--> y*g[2, 2]]
|
|
1210
|
+
sage: all((res[i] * res[i+1]).is_zero() for i in range(len(res)-1))
|
|
1211
|
+
True
|
|
1212
|
+
|
|
1213
|
+
sage: # needs sage.libs.flint
|
|
1214
|
+
sage: e = SymmetricFunctions(QQ).e()
|
|
1215
|
+
sage: M = FPModule(e, [0], [[e[2]+e[1,1]], [e[1,1]]])
|
|
1216
|
+
sage: res = M.resolution(3, top_dim=10)
|
|
1217
|
+
sage: all((res[i] * res[i+1]).is_zero() for i in range(2))
|
|
1218
|
+
True
|
|
1219
|
+
sage: res[-1].domain().is_trivial()
|
|
1220
|
+
True
|
|
1221
|
+
sage: M = FPModule(e, [0,2], [[e[2]+e[1,1], 0], [e[2,1], e[1]], [0, e[1,1]]])
|
|
1222
|
+
sage: res = M.resolution(3, top_dim=10)
|
|
1223
|
+
sage: all((res[i] * res[i+1]).is_zero() for i in range(2))
|
|
1224
|
+
True
|
|
1225
|
+
sage: res[-1].domain().is_trivial()
|
|
1226
|
+
True
|
|
1227
|
+
|
|
1228
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
1229
|
+
sage: M = FPModule(A2, [0,1], [[Sq(2), Sq(1)]])
|
|
1230
|
+
sage: M.resolution(0)
|
|
1231
|
+
[Module morphism:
|
|
1232
|
+
From: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1233
|
+
To: Finitely presented left module on 2 generators and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1234
|
+
Defn: g[0] |--> g[0]
|
|
1235
|
+
g[1] |--> g[1]]
|
|
1236
|
+
sage: res = M.resolution(4, verbose=True)
|
|
1237
|
+
Computing f_1 (1/4)
|
|
1238
|
+
Computing f_2 (2/4)
|
|
1239
|
+
Computing using the profile:
|
|
1240
|
+
(2, 1)
|
|
1241
|
+
Resolving the kernel in the range of dimensions [2, 8]: 2 3 4 5 6 7 8.
|
|
1242
|
+
Computing f_3 (3/4)
|
|
1243
|
+
Computing using the profile:
|
|
1244
|
+
(2, 1)
|
|
1245
|
+
Resolving the kernel in the range of dimensions [8, 14]: 8 9 10 11 12 13 14.
|
|
1246
|
+
Computing f_4 (4/4)
|
|
1247
|
+
Computing using the profile:
|
|
1248
|
+
(2, 1)
|
|
1249
|
+
Resolving the kernel in the range of dimensions [9, 16]: 9 10 11 12 13 14 15 16.
|
|
1250
|
+
sage: len(res)
|
|
1251
|
+
5
|
|
1252
|
+
sage: res
|
|
1253
|
+
[Module morphism:
|
|
1254
|
+
From: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1255
|
+
To: Finitely presented left module on 2 generators and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1256
|
+
Defn: g[0] |--> g[0]
|
|
1257
|
+
g[1] |--> g[1],
|
|
1258
|
+
Module morphism:
|
|
1259
|
+
From: Free graded left module on 1 generator over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1260
|
+
To: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1261
|
+
Defn: g[2] |--> Sq(2)*g[0] + Sq(1)*g[1],
|
|
1262
|
+
Module morphism:
|
|
1263
|
+
From: Free graded left module on 1 generator over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1264
|
+
To: Free graded left module on 1 generator over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1265
|
+
Defn: g[8] |--> Sq(3,1)*g[2],
|
|
1266
|
+
Module morphism:
|
|
1267
|
+
From: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1268
|
+
To: Free graded left module on 1 generator over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1269
|
+
Defn: g[9] |--> Sq(1)*g[8]
|
|
1270
|
+
g[10] |--> Sq(2)*g[8],
|
|
1271
|
+
Module morphism:
|
|
1272
|
+
From: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1273
|
+
To: Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
|
|
1274
|
+
Defn: g[10] |--> Sq(1)*g[9]
|
|
1275
|
+
g[12] |--> Sq(0,1)*g[9] + Sq(2)*g[10]]
|
|
1276
|
+
sage: for i in range(len(res)-1):
|
|
1277
|
+
....: assert (res[i] * res[i+1]).is_zero(), 'the result is not a complex'
|
|
1278
|
+
|
|
1279
|
+
We construct `\GF{3}` as a `\ZZ`-module (with trivial grading
|
|
1280
|
+
concentrated in degree 0) and compute its resolution::
|
|
1281
|
+
|
|
1282
|
+
sage: E = ExteriorAlgebra(ZZ, 0)
|
|
1283
|
+
sage: M = FPModule(E, [0], [[3]])
|
|
1284
|
+
sage: res = M.resolution(3)
|
|
1285
|
+
sage: res
|
|
1286
|
+
[Module morphism:
|
|
1287
|
+
From: Free graded left module on 1 generator over The exterior algebra of rank 0 over Integer Ring
|
|
1288
|
+
To: Finitely presented left module on 1 generator and 1 relation over The exterior algebra of rank 0 over Integer Ring
|
|
1289
|
+
Defn: g[0] |--> g[0],
|
|
1290
|
+
Module endomorphism of Free graded left module on 1 generator over The exterior algebra of rank 0 over Integer Ring
|
|
1291
|
+
Defn: g[0] |--> 3*g[0],
|
|
1292
|
+
Module morphism:
|
|
1293
|
+
From: Free graded left module on 0 generators over The exterior algebra of rank 0 over Integer Ring
|
|
1294
|
+
To: Free graded left module on 1 generator over The exterior algebra of rank 0 over Integer Ring,
|
|
1295
|
+
Module endomorphism of Free graded left module on 0 generators over The exterior algebra of rank 0 over Integer Ring]
|
|
1296
|
+
|
|
1297
|
+
TESTS::
|
|
1298
|
+
|
|
1299
|
+
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
|
|
1300
|
+
sage: M = FPModule(A2, [0,1], [[Sq(2), Sq(1)]])
|
|
1301
|
+
sage: res2 = M.resolution(2)
|
|
1302
|
+
sage: [type(f) for f in res2]
|
|
1303
|
+
[<class '...SteenrodFreeModuleHomspace...'>,
|
|
1304
|
+
<class '...SteenrodFreeModuleHomspace...'>,
|
|
1305
|
+
<class '...SteenrodFreeModuleHomspace...'>]
|
|
1306
|
+
"""
|
|
1307
|
+
def _print_progress(i, k):
|
|
1308
|
+
if verbose:
|
|
1309
|
+
print('Computing f_%d (%d/%d)' % (i, i, k))
|
|
1310
|
+
|
|
1311
|
+
if k < 0:
|
|
1312
|
+
raise ValueError('the length of the resolution must be nonnegative')
|
|
1313
|
+
|
|
1314
|
+
ret_complex = []
|
|
1315
|
+
|
|
1316
|
+
# Epsilon: F_0 -> M
|
|
1317
|
+
F_0 = self._free_module()
|
|
1318
|
+
epsilon = Hom(F_0, self)(self.generators())
|
|
1319
|
+
ret_complex.append(epsilon)
|
|
1320
|
+
|
|
1321
|
+
if k == 0:
|
|
1322
|
+
return ret_complex
|
|
1323
|
+
|
|
1324
|
+
# f_1: F_1 -> F_0
|
|
1325
|
+
_print_progress(1, k)
|
|
1326
|
+
F_1 = self._j.domain()
|
|
1327
|
+
pres = Hom(F_1, F_0)(tuple([F_0(x.dense_coefficient_list())
|
|
1328
|
+
for x in self._j.values()]))
|
|
1329
|
+
|
|
1330
|
+
ret_complex.append(pres)
|
|
1331
|
+
|
|
1332
|
+
# f_i: F_i -> F_i-1, for i > 1
|
|
1333
|
+
for i in range(2, k + 1):
|
|
1334
|
+
_print_progress(i, k)
|
|
1335
|
+
|
|
1336
|
+
f = ret_complex[i - 1]
|
|
1337
|
+
ret_complex.append(f._resolve_kernel(top_dim=top_dim,
|
|
1338
|
+
verbose=verbose))
|
|
1339
|
+
|
|
1340
|
+
return ret_complex
|