passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,954 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Multiplication for elements of the Steenrod algebra
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- John H. Palmieri (2008-07-30: version 0.9) initial version: Milnor
|
|
9
|
+
multiplication.
|
|
10
|
+
- John H. Palmieri (2010-06-30: version 1.0) multiplication of
|
|
11
|
+
Serre-Cartan basis elements using the Adem relations.
|
|
12
|
+
- Simon King (2011-10-25): Fix the use of cached functions.
|
|
13
|
+
|
|
14
|
+
.. rubric:: Milnor multiplication, `p=2`
|
|
15
|
+
|
|
16
|
+
See Milnor's paper [Mil1958]_ for proofs, etc.
|
|
17
|
+
|
|
18
|
+
To multiply Milnor basis elements `\text{Sq}(r_1, r_2, ...)` and
|
|
19
|
+
`\text{Sq}(s_1, s_2,...)` at the prime 2, form all possible matrices
|
|
20
|
+
`M` with rows and columns indexed starting at 0, with position (0,0)
|
|
21
|
+
deleted (or ignored), with `s_i` equal to the sum of column `i` for
|
|
22
|
+
each `i`, and with `r_j` equal to the 'weighted' sum of row `j`. The
|
|
23
|
+
weights are as follows: elements from column `i` are multiplied by
|
|
24
|
+
`2^i`. For example, to multiply `\text{Sq}(2)` and `\text{Sq}(1,1)`,
|
|
25
|
+
form the matrices
|
|
26
|
+
|
|
27
|
+
.. MATH::
|
|
28
|
+
|
|
29
|
+
\begin{Vmatrix}
|
|
30
|
+
* & 1 & 1 \\
|
|
31
|
+
2 & 0 & 0
|
|
32
|
+
\end{Vmatrix}
|
|
33
|
+
\quad \text{and} \quad
|
|
34
|
+
\begin{Vmatrix}
|
|
35
|
+
* & 0 & 1 \\
|
|
36
|
+
0 & 1 & 0
|
|
37
|
+
\end{Vmatrix}
|
|
38
|
+
|
|
39
|
+
(The `*` is the ignored (0,0)-entry of the matrix.) For each such
|
|
40
|
+
matrix `M`, compute a multinomial coefficient, mod 2: for each
|
|
41
|
+
diagonal `\{m_{ij}: i+j=n\}`, compute `(\sum m_{i,j}!) / (m_{0,n}!
|
|
42
|
+
m_{1,n-1}! ... m_{n,0}!)`. Multiply these together for all `n`. (To
|
|
43
|
+
compute this mod 2, view the entries of the matrix as their base 2
|
|
44
|
+
expansions; then this coefficient is zero if and only if there is some
|
|
45
|
+
diagonal containing two numbers which have a summand in common in
|
|
46
|
+
their base 2 expansion. For example, if 3 and 10 are in the same
|
|
47
|
+
diagonal, the coefficient is zero, because `3=1+2` and `10=2+8`: they
|
|
48
|
+
both have a summand of 2.)
|
|
49
|
+
|
|
50
|
+
Now, for each matrix with multinomial coefficient 1, let `t_n` be
|
|
51
|
+
the sum of the `n`-th diagonal in the matrix; then
|
|
52
|
+
|
|
53
|
+
.. MATH::
|
|
54
|
+
|
|
55
|
+
\text{Sq}(r_1, r_2, ...) \text{Sq}(s_1, s_2, ...) = \sum \text{Sq}(t_1, t_2, ...)
|
|
56
|
+
|
|
57
|
+
The function :func:`milnor_multiplication` takes as input two tuples
|
|
58
|
+
of nonnegative integers, `r` and `s`, which represent
|
|
59
|
+
`\text{Sq}(r)=\text{Sq}(r_1, r_2, ...)` and
|
|
60
|
+
`\text{Sq}(s)=\text{Sq}(s_1, s_2, ...)`; it returns as output a
|
|
61
|
+
dictionary whose keys are tuples `t=(t_1, t_2, ...)` of nonnegative
|
|
62
|
+
integers, and for each tuple the associated value is the coefficient
|
|
63
|
+
of `\text{Sq}(t)` in the product formula. (Since we are working mod 2,
|
|
64
|
+
this coefficient is 1 -- if it is zero, the element is omitted from
|
|
65
|
+
the dictionary altogether).
|
|
66
|
+
|
|
67
|
+
.. rubric:: Milnor multiplication, odd primes
|
|
68
|
+
|
|
69
|
+
As for the `p=2` case, see Milnor's paper [Mil1958]_ for proofs.
|
|
70
|
+
|
|
71
|
+
Fix an odd prime `p`. There are three steps to multiply Milnor basis
|
|
72
|
+
elements `Q_{f_1} Q_{f_2} ... \mathcal{P}(q_1, q_2, ...)` and
|
|
73
|
+
`Q_{g_1} Q_{g_2} ... \mathcal{P}(s_1, s_2,...)`: first, use the formula
|
|
74
|
+
|
|
75
|
+
.. MATH::
|
|
76
|
+
|
|
77
|
+
\mathcal{P}(q_1, q_2, ...) Q_k = Q_k \mathcal{P}(q_1, q_2, ...)
|
|
78
|
+
+ Q_{k+1} \mathcal{P}(q_1 - p^k, q_2, ...)
|
|
79
|
+
+ Q_{k+2} \mathcal{P}(q_1, q_2 - p^k, ...)
|
|
80
|
+
+ ...
|
|
81
|
+
|
|
82
|
+
Second, use the fact that the `Q_k`'s form an exterior algebra: `Q_k^2 =
|
|
83
|
+
0` for all `k`, and if `i \neq j`, then `Q_i` and `Q_j` anticommute:
|
|
84
|
+
`Q_i Q_j = -Q_j Q_i`. After these two steps, the product is a linear
|
|
85
|
+
combination of terms of the form
|
|
86
|
+
|
|
87
|
+
.. MATH::
|
|
88
|
+
|
|
89
|
+
Q_{e_1} Q_{e_2} ... \mathcal{P}(r_1, r_2, ...) \mathcal{P}(s_1, s_2, ...).
|
|
90
|
+
|
|
91
|
+
Finally, use Milnor matrices to multiply the pairs of
|
|
92
|
+
`\mathcal{P}(...)` terms, as at the prime 2: form all possible
|
|
93
|
+
matrices `M` with rows and columns indexed starting at 0, with
|
|
94
|
+
position (0,0) deleted (or ignored), with `s_i` equal to the sum of
|
|
95
|
+
column `i` for each `i`, and with `r_j` equal to the weighted sum of
|
|
96
|
+
row `j`: elements from column `i` are multiplied by `p^i`. For
|
|
97
|
+
example when `p=5`, to multiply `\mathcal{P}(5)` and
|
|
98
|
+
`\mathcal{P}(1,1)`, form the matrices
|
|
99
|
+
|
|
100
|
+
.. MATH::
|
|
101
|
+
|
|
102
|
+
\begin{Vmatrix}
|
|
103
|
+
* & 1 & 1 \\
|
|
104
|
+
5 & 0 & 0
|
|
105
|
+
\end{Vmatrix}
|
|
106
|
+
\quad \text{and} \quad
|
|
107
|
+
\begin{Vmatrix}
|
|
108
|
+
* & 0 & 1 \\
|
|
109
|
+
0 & 1 & 0
|
|
110
|
+
\end{Vmatrix}
|
|
111
|
+
|
|
112
|
+
For each such matrix `M`, compute a multinomial coefficient, mod `p`:
|
|
113
|
+
for each diagonal `\{m_{ij}: i+j=n\}`, compute `(\sum m_{i,j}!) /
|
|
114
|
+
(m_{0,n}! m_{1,n-1}! ... m_{n,0}!)`. Multiply these together for
|
|
115
|
+
all `n`.
|
|
116
|
+
|
|
117
|
+
Now, for each matrix with nonzero multinomial coefficient `b_M`, let
|
|
118
|
+
`t_n` be the sum of the `n`-th diagonal in the matrix; then
|
|
119
|
+
|
|
120
|
+
.. MATH::
|
|
121
|
+
|
|
122
|
+
\mathcal{P}(r_1, r_2, ...) \mathcal{P}(s_1, s_2, ...)
|
|
123
|
+
= \sum b_M \mathcal{P}(t_1, t_2, ...)
|
|
124
|
+
|
|
125
|
+
For example when `p=5`, we have
|
|
126
|
+
|
|
127
|
+
.. MATH::
|
|
128
|
+
|
|
129
|
+
\mathcal{P}(5) \mathcal{P}(1,1) = \mathcal{P}(6,1) + 2 \mathcal{P}(0,2).
|
|
130
|
+
|
|
131
|
+
The function :func:`milnor_multiplication` takes as input two pairs of
|
|
132
|
+
tuples of nonnegative integers, `(g,q)` and `(f,s)`, which represent
|
|
133
|
+
`Q_{g_1} Q_{g_2} ... \mathcal{P}(q_1, q_2, ...)` and
|
|
134
|
+
`Q_{f_1} Q_{f_2} ... \mathcal{P}(s_1, s_2, ...)`. It returns as output a
|
|
135
|
+
dictionary whose keys are pairs of tuples `(e,t)` of nonnegative
|
|
136
|
+
integers, and for each tuple the associated value is the coefficient
|
|
137
|
+
in the product formula.
|
|
138
|
+
|
|
139
|
+
.. rubric:: The Adem relations and admissible sequences
|
|
140
|
+
|
|
141
|
+
If `p=2`, then the mod 2 Steenrod algebra is generated by Steenrod
|
|
142
|
+
squares `\text{Sq}^a` for `a \geq 0` (equal to the Milnor basis element
|
|
143
|
+
`\text{Sq}(a)`). The *Adem relations* are as follows: if `a < 2b`,
|
|
144
|
+
|
|
145
|
+
.. MATH::
|
|
146
|
+
|
|
147
|
+
\text{Sq}^a \text{Sq}^b = \sum_{j=0}^{a/2} \binom{b-j-1}{a-2j} \text{Sq}^{a+b-j} \text{Sq}^j
|
|
148
|
+
|
|
149
|
+
A monomial `\text{Sq}^{i_1} \text{Sq}^{i_2} ... \text{Sq}^{i_n}` is called *admissible* if
|
|
150
|
+
`i_k \geq 2 i_{k+1}` for all `k`. One can use the Adem relations to
|
|
151
|
+
show that the admissible monomials span the Steenrod algebra, as a
|
|
152
|
+
vector space; with more work, one can show that the admissible
|
|
153
|
+
monomials are also linearly independent. They form the *Serre-Cartan*
|
|
154
|
+
basis for the Steenrod algebra. To multiply a collection of
|
|
155
|
+
admissible monomials, concatenate them and see if the result is
|
|
156
|
+
admissible. If it is, you're done. If not, find the first pair `\text{Sq}^a
|
|
157
|
+
\text{Sq}^b` where it fails to be admissible and apply the Adem relations
|
|
158
|
+
there. Repeat with the resulting terms. One can prove that this
|
|
159
|
+
process terminates in a finite number of steps, and therefore gives a
|
|
160
|
+
procedure for multiplying elements of the Serre-Cartan basis.
|
|
161
|
+
|
|
162
|
+
At an odd prime `p`, the Steenrod algebra is generated by the `p`-th
|
|
163
|
+
power operations `\mathcal{P}^a` (the same as `\mathcal{P}(a)` in the
|
|
164
|
+
Milnor basis) and the Bockstein operation `\beta` (= `Q_0` in the
|
|
165
|
+
Milnor basis). The odd primary *Adem relations* are as follows: if `a
|
|
166
|
+
< pb`,
|
|
167
|
+
|
|
168
|
+
.. MATH::
|
|
169
|
+
|
|
170
|
+
\mathcal{P}^a \mathcal{P}^b = \sum_{j=0}^{a/p} (-1)^{a+j}
|
|
171
|
+
\binom{(b-j)(p-1)-1}{a-pj} \mathcal{P}^{a+b-j} \mathcal{P}^j
|
|
172
|
+
|
|
173
|
+
Also, if `a \leq pb`,
|
|
174
|
+
|
|
175
|
+
.. MATH::
|
|
176
|
+
|
|
177
|
+
\mathcal{P}^a \beta \mathcal{P}^b = \sum_{j=0}^{a/p} (-1)^{a+j}
|
|
178
|
+
\binom{(b-j)(p-1)}{a-pj} \beta \mathcal{P}^{a+b-j} \mathcal{P}^j +
|
|
179
|
+
\sum_{j=0}^{a/p} (-1)^{a+j-1} \binom{(b-j)(p-1)-1}{a-pj-1}
|
|
180
|
+
\mathcal{P}^{a+b-j} \beta \mathcal{P}^j
|
|
181
|
+
|
|
182
|
+
The *admissible* monomials at an odd prime are products of the form
|
|
183
|
+
|
|
184
|
+
.. MATH::
|
|
185
|
+
|
|
186
|
+
\beta^{\epsilon_0} \mathcal{P}^{s_1} \beta^{\epsilon_1}
|
|
187
|
+
\mathcal{P}^{s_2} ... \mathcal{P}^{s_n} \beta^{\epsilon_n}
|
|
188
|
+
|
|
189
|
+
where `s_k \geq \epsilon_{k+1} + p s_{k+1}` for all `k`. As at the
|
|
190
|
+
prime 2, these form a basis for the Steenrod algebra.
|
|
191
|
+
|
|
192
|
+
The main function for this is :func:`make_mono_admissible`,
|
|
193
|
+
which converts a product of Steenrod
|
|
194
|
+
squares or `p`-th power operations and Bocksteins into a dictionary
|
|
195
|
+
representing a sum of admissible monomials.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
# ****************************************************************************
|
|
199
|
+
# Copyright (C) 2008-2010 John H. Palmieri <palmieri@math.washington.edu>
|
|
200
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
201
|
+
# ****************************************************************************
|
|
202
|
+
|
|
203
|
+
from sage.misc.cachefunc import cached_function
|
|
204
|
+
|
|
205
|
+
# Milnor, p=2
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def milnor_multiplication(r, s):
|
|
209
|
+
r"""
|
|
210
|
+
Product of Milnor basis elements r and s at the prime 2.
|
|
211
|
+
|
|
212
|
+
INPUT:
|
|
213
|
+
|
|
214
|
+
- ``r`` -- tuple of nonnegative integers
|
|
215
|
+
- ``s`` -- tuple of nonnegative integers
|
|
216
|
+
|
|
217
|
+
OUTPUT:
|
|
218
|
+
|
|
219
|
+
Dictionary of terms of the form (tuple: coeff), where
|
|
220
|
+
'tuple' is a tuple of nonnegative integers and 'coeff' is 1.
|
|
221
|
+
|
|
222
|
+
This computes Milnor matrices for the product of `\text{Sq}(r)`
|
|
223
|
+
and `\text{Sq}(s)`, computes their multinomial coefficients, and
|
|
224
|
+
for each matrix whose coefficient is 1, add `\text{Sq}(t)` to the
|
|
225
|
+
output, where `t` is the tuple formed by the diagonals sums from
|
|
226
|
+
the matrix.
|
|
227
|
+
|
|
228
|
+
EXAMPLES::
|
|
229
|
+
|
|
230
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import milnor_multiplication
|
|
231
|
+
sage: milnor_multiplication((2,), (1,)) == {(0, 1): 1, (3,): 1}
|
|
232
|
+
True
|
|
233
|
+
sage: sorted(milnor_multiplication((4,), (2,1)).items())
|
|
234
|
+
[((0, 3), 1), ((2, 0, 1), 1), ((6, 1), 1)]
|
|
235
|
+
sage: sorted(milnor_multiplication((2,4), (0,1)).items())
|
|
236
|
+
[((2, 0, 0, 1), 1), ((2, 5), 1)]
|
|
237
|
+
|
|
238
|
+
These examples correspond to the following product computations:
|
|
239
|
+
|
|
240
|
+
.. MATH::
|
|
241
|
+
|
|
242
|
+
\text{Sq}(2) \text{Sq}(1) = \text{Sq}(0,1) + \text{Sq}(3)
|
|
243
|
+
|
|
244
|
+
\text{Sq}(4) \text{Sq}(2,1) = \text{Sq}(6,1) + \text{Sq}(0,3) + \text{Sq}(2,0,1)
|
|
245
|
+
|
|
246
|
+
\text{Sq}(2,4) \text{Sq}(0,1) = \text{Sq}(2, 5) + \text{Sq}(2, 0, 0, 1)
|
|
247
|
+
|
|
248
|
+
This uses the same algorithm Monks does in his Maple package: see
|
|
249
|
+
http://mathweb.scranton.edu/monks/software/Steenrod/steen.html.
|
|
250
|
+
"""
|
|
251
|
+
result = {}
|
|
252
|
+
rows = len(r) + 1
|
|
253
|
+
cols = len(s) + 1
|
|
254
|
+
diags = len(r) + len(s)
|
|
255
|
+
# initialize matrix
|
|
256
|
+
M = list(range(rows))
|
|
257
|
+
for i in range(rows):
|
|
258
|
+
M[i] = [0]*cols
|
|
259
|
+
for j in range(1,cols):
|
|
260
|
+
M[0][j] = s[j-1]
|
|
261
|
+
for i in range(1,rows):
|
|
262
|
+
M[i][0] = r[i-1]
|
|
263
|
+
for j in range(1,cols):
|
|
264
|
+
M[i][j] = 0
|
|
265
|
+
found = True
|
|
266
|
+
while found:
|
|
267
|
+
# check diagonals
|
|
268
|
+
n = 1
|
|
269
|
+
okay = 1
|
|
270
|
+
diagonal = [0]*diags
|
|
271
|
+
while n <= diags and okay is not None:
|
|
272
|
+
nth_diagonal = [M[i][n-i] for i in range(max(0,n-cols+1), min(1+n,rows))]
|
|
273
|
+
okay = multinomial(nth_diagonal)
|
|
274
|
+
diagonal[n-1] = okay
|
|
275
|
+
n = n + 1
|
|
276
|
+
if okay is not None:
|
|
277
|
+
i = diags - 1
|
|
278
|
+
while i >= 0 and diagonal[i] == 0:
|
|
279
|
+
i = i - 1
|
|
280
|
+
t = tuple(diagonal[:i+1])
|
|
281
|
+
# reduce mod two:
|
|
282
|
+
if t in result:
|
|
283
|
+
del result[t]
|
|
284
|
+
else:
|
|
285
|
+
result[t] = 1
|
|
286
|
+
# now look for new matrices:
|
|
287
|
+
found = False
|
|
288
|
+
i = 1
|
|
289
|
+
while not found and i < rows:
|
|
290
|
+
sum = M[i][0]
|
|
291
|
+
j = 1
|
|
292
|
+
while not found and j < cols:
|
|
293
|
+
# check to see if column index j is small enough
|
|
294
|
+
if sum >= 2**j:
|
|
295
|
+
# now check to see if there's anything above this entry
|
|
296
|
+
# to add to it
|
|
297
|
+
temp_col_sum = 0
|
|
298
|
+
for k in range(i):
|
|
299
|
+
temp_col_sum += M[k][j]
|
|
300
|
+
if temp_col_sum != 0:
|
|
301
|
+
found = True
|
|
302
|
+
for row in range(1,i):
|
|
303
|
+
M[row][0] = r[row-1]
|
|
304
|
+
for col in range(1,cols):
|
|
305
|
+
M[0][col] = M[0][col] + M[row][col]
|
|
306
|
+
M[row][col] = 0
|
|
307
|
+
for col in range(1,j):
|
|
308
|
+
M[0][col] = M[0][col] + M[i][col]
|
|
309
|
+
M[i][col] = 0
|
|
310
|
+
M[0][j] = M[0][j] - 1
|
|
311
|
+
M[i][j] = M[i][j] + 1
|
|
312
|
+
M[i][0] = sum - 2**j
|
|
313
|
+
else:
|
|
314
|
+
sum = sum + M[i][j] * 2**j
|
|
315
|
+
else:
|
|
316
|
+
sum = sum + M[i][j] * 2**j
|
|
317
|
+
j += 1
|
|
318
|
+
i += 1
|
|
319
|
+
return result
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def multinomial(list):
|
|
323
|
+
r"""
|
|
324
|
+
Multinomial coefficient of list, mod 2.
|
|
325
|
+
|
|
326
|
+
INPUT:
|
|
327
|
+
|
|
328
|
+
- ``list`` -- list of integers
|
|
329
|
+
|
|
330
|
+
OUTPUT: none if the multinomial coefficient is 0, or sum of list if it is 1
|
|
331
|
+
|
|
332
|
+
Given the input `[n_1, n_2, n_3, ...]`, this computes the
|
|
333
|
+
multinomial coefficient `(n_1 + n_2 + n_3 + ...)! / (n_1! n_2!
|
|
334
|
+
n_3! ...)`, mod 2. The method is roughly this: expand each
|
|
335
|
+
`n_i` in binary. If there is a 1 in the same digit for any `n_i`
|
|
336
|
+
and `n_j` with `i\neq j`, then the coefficient is 0; otherwise, it
|
|
337
|
+
is 1.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import multinomial
|
|
342
|
+
sage: multinomial([1,2,4])
|
|
343
|
+
7
|
|
344
|
+
sage: multinomial([1,2,5])
|
|
345
|
+
sage: multinomial([1,2,12,192,256])
|
|
346
|
+
463
|
|
347
|
+
|
|
348
|
+
This function does not compute any factorials, so the following are
|
|
349
|
+
actually reasonable to do::
|
|
350
|
+
|
|
351
|
+
sage: multinomial([1,65536])
|
|
352
|
+
65537
|
|
353
|
+
sage: multinomial([4,65535])
|
|
354
|
+
sage: multinomial([32768,65536])
|
|
355
|
+
98304
|
|
356
|
+
"""
|
|
357
|
+
old_sum = list[0]
|
|
358
|
+
okay = True
|
|
359
|
+
i = 1
|
|
360
|
+
while okay and i < len(list):
|
|
361
|
+
j = 1
|
|
362
|
+
while okay and j <= min(old_sum, list[i]):
|
|
363
|
+
if j & old_sum == j:
|
|
364
|
+
okay = (j & list[i] == 0)
|
|
365
|
+
j = j << 1
|
|
366
|
+
old_sum = old_sum + list[i]
|
|
367
|
+
i = i + 1
|
|
368
|
+
if okay:
|
|
369
|
+
return old_sum
|
|
370
|
+
else:
|
|
371
|
+
return None
|
|
372
|
+
|
|
373
|
+
# Milnor, p odd
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def milnor_multiplication_odd(m1, m2, p):
|
|
377
|
+
r"""
|
|
378
|
+
Product of Milnor basis elements defined by m1 and m2 at the odd prime p.
|
|
379
|
+
|
|
380
|
+
INPUT:
|
|
381
|
+
|
|
382
|
+
- ``m1`` -- pair of tuples (e,r), where e is an increasing tuple of
|
|
383
|
+
nonnegative integers and r is a tuple of nonnegative integers
|
|
384
|
+
- ``m2`` -- pair of tuples (f,s), same format as m1
|
|
385
|
+
- ``p`` -- odd prime number
|
|
386
|
+
|
|
387
|
+
OUTPUT:
|
|
388
|
+
|
|
389
|
+
Dictionary of terms of the form (tuple: coeff), where 'tuple' is
|
|
390
|
+
a pair of tuples, as for r and s, and 'coeff' is an integer mod p.
|
|
391
|
+
|
|
392
|
+
This computes the product of the Milnor basis elements
|
|
393
|
+
`Q_{e_1} Q_{e_2} ... P(r_1, r_2, ...)` and
|
|
394
|
+
`Q_{f_1} Q_{f_2} ... P(s_1, s_2, ...)`.
|
|
395
|
+
|
|
396
|
+
EXAMPLES::
|
|
397
|
+
|
|
398
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import milnor_multiplication_odd
|
|
399
|
+
sage: sorted(milnor_multiplication_odd(((0,2),(5,)), ((1,),(1,)), 5).items())
|
|
400
|
+
[(((0, 1, 2), (0, 1)), 4), (((0, 1, 2), (6,)), 4)]
|
|
401
|
+
sage: milnor_multiplication_odd(((0,2,4),()), ((1,3),()), 7)
|
|
402
|
+
{((0, 1, 2, 3, 4), ()): 6}
|
|
403
|
+
sage: milnor_multiplication_odd(((0,2,4),()), ((1,5),()), 7)
|
|
404
|
+
{((0, 1, 2, 4, 5), ()): 1}
|
|
405
|
+
sage: sorted(milnor_multiplication_odd(((),(6,)), ((),(2,)), 3).items())
|
|
406
|
+
[(((), (0, 2)), 1), (((), (4, 1)), 1), (((), (8,)), 1)]
|
|
407
|
+
|
|
408
|
+
These examples correspond to the following product computations:
|
|
409
|
+
|
|
410
|
+
.. MATH::
|
|
411
|
+
|
|
412
|
+
p=5: \quad Q_0 Q_2 \mathcal{P}(5) Q_1 \mathcal{P}(1) = 4 Q_0 Q_1 Q_2 \mathcal{P}(0,1) + 4 Q_0 Q_1 Q_2 \mathcal{P}(6)
|
|
413
|
+
|
|
414
|
+
p=7: \quad (Q_0 Q_2 Q_4) (Q_1 Q_3) = 6 Q_0 Q_1 Q_2 Q_3 Q_4
|
|
415
|
+
|
|
416
|
+
p=7: \quad (Q_0 Q_2 Q_4) (Q_1 Q_5) = Q_0 Q_1 Q_2 Q_3 Q_5
|
|
417
|
+
|
|
418
|
+
p=3: \quad \mathcal{P}(6) \mathcal{P}(2) = \mathcal{P}(0,2) + \mathcal{P}(4,1) + \mathcal{P}(8)
|
|
419
|
+
|
|
420
|
+
The following used to fail until the trailing zeroes were
|
|
421
|
+
eliminated in p_mono::
|
|
422
|
+
|
|
423
|
+
sage: A = SteenrodAlgebra(3)
|
|
424
|
+
sage: a = A.P(0,3); b = A.P(12); c = A.Q(1,2)
|
|
425
|
+
sage: (a+b)*c == a*c + b*c
|
|
426
|
+
True
|
|
427
|
+
|
|
428
|
+
Test that the bug reported in :issue:`7212` has been fixed::
|
|
429
|
+
|
|
430
|
+
sage: A.P(36,6)*A.P(27,9,81)
|
|
431
|
+
2 P(13,21,83) + P(14,24,82) + P(17,20,83) + P(25,18,83) + P(26,21,82) + P(36,15,80,1) + P(49,12,83) + 2 P(50,15,82) + 2 P(53,11,83) + 2 P(63,15,81)
|
|
432
|
+
|
|
433
|
+
Associativity once failed because of a sign error::
|
|
434
|
+
|
|
435
|
+
sage: a,b,c = A.Q_exp(0,1), A.P(3), A.Q_exp(1,1)
|
|
436
|
+
sage: (a*b)*c == a*(b*c)
|
|
437
|
+
True
|
|
438
|
+
|
|
439
|
+
This uses the same algorithm Monks does in his Maple package to
|
|
440
|
+
iterate through the possible matrices: see
|
|
441
|
+
http://mathweb.scranton.edu/monks/software/Steenrod/steen.html.
|
|
442
|
+
"""
|
|
443
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
444
|
+
F = GF(p)
|
|
445
|
+
(f,s) = m2
|
|
446
|
+
# First compute Q_e0 Q_e1 ... P(r1, r2, ...) Q_f0 Q_f1 ...
|
|
447
|
+
# Store results (as dictionary of pairs of tuples) in 'answer'.
|
|
448
|
+
answer = {m1: F(1)}
|
|
449
|
+
for k in f:
|
|
450
|
+
old_answer = answer
|
|
451
|
+
answer = {}
|
|
452
|
+
for mono in old_answer:
|
|
453
|
+
if k not in mono[0]:
|
|
454
|
+
q_mono = set(mono[0])
|
|
455
|
+
if q_mono:
|
|
456
|
+
ind = len(q_mono.intersection(range(k,1+max(q_mono))))
|
|
457
|
+
else:
|
|
458
|
+
ind = 0
|
|
459
|
+
coeff = (-1)**ind * old_answer[mono]
|
|
460
|
+
lst = list(mono[0])
|
|
461
|
+
if ind == 0:
|
|
462
|
+
lst.append(k)
|
|
463
|
+
else:
|
|
464
|
+
lst.insert(-ind,k)
|
|
465
|
+
q_mono = tuple(lst)
|
|
466
|
+
p_mono = mono[1]
|
|
467
|
+
answer[(q_mono, p_mono)] = F(coeff)
|
|
468
|
+
for i in range(1,1+len(mono[1])):
|
|
469
|
+
if (k+i not in mono[0]) and (p**k <= mono[1][i-1]):
|
|
470
|
+
q_mono = set(mono[0])
|
|
471
|
+
if q_mono:
|
|
472
|
+
ind = len(q_mono.intersection(range(k+i,1+max(q_mono))))
|
|
473
|
+
else:
|
|
474
|
+
ind = 0
|
|
475
|
+
coeff = (-1)**ind * old_answer[mono]
|
|
476
|
+
lst = list(mono[0])
|
|
477
|
+
if ind == 0:
|
|
478
|
+
lst.append(k+i)
|
|
479
|
+
else:
|
|
480
|
+
lst.insert(-ind,k+i)
|
|
481
|
+
q_mono = tuple(lst)
|
|
482
|
+
p_mono = list(mono[1])
|
|
483
|
+
p_mono[i-1] = p_mono[i-1] - p**k
|
|
484
|
+
|
|
485
|
+
# The next two lines were added so that p_mono will not
|
|
486
|
+
# have trailing zeros. This makes p_mono uniquely
|
|
487
|
+
# determined by P(*p_mono).
|
|
488
|
+
|
|
489
|
+
while p_mono and p_mono[-1] == 0:
|
|
490
|
+
p_mono.pop()
|
|
491
|
+
|
|
492
|
+
answer[(q_mono, tuple(p_mono))] = F(coeff)
|
|
493
|
+
# Now for the Milnor matrices. For each entry '(e,r): coeff' in answer,
|
|
494
|
+
# multiply r with s. Record coefficient for matrix and multiply by coeff.
|
|
495
|
+
# Store in 'result'.
|
|
496
|
+
if not s:
|
|
497
|
+
result = answer
|
|
498
|
+
else:
|
|
499
|
+
result = {}
|
|
500
|
+
for (e, r) in answer:
|
|
501
|
+
old_coeff = answer[(e,r)]
|
|
502
|
+
# Milnor multiplication for r and s
|
|
503
|
+
rows = len(r) + 1
|
|
504
|
+
cols = len(s) + 1
|
|
505
|
+
diags = len(r) + len(s)
|
|
506
|
+
# initialize matrix
|
|
507
|
+
M = list(range(rows))
|
|
508
|
+
for i in range(rows):
|
|
509
|
+
M[i] = [0]*cols
|
|
510
|
+
for j in range(1,cols):
|
|
511
|
+
M[0][j] = s[j-1]
|
|
512
|
+
for i in range(1,rows):
|
|
513
|
+
M[i][0] = r[i-1]
|
|
514
|
+
for j in range(1,cols):
|
|
515
|
+
M[i][j] = 0
|
|
516
|
+
found = True
|
|
517
|
+
while found:
|
|
518
|
+
# check diagonals
|
|
519
|
+
n = 1
|
|
520
|
+
coeff = old_coeff
|
|
521
|
+
diagonal = [0]*diags
|
|
522
|
+
while n <= diags and coeff != 0:
|
|
523
|
+
nth_diagonal = [M[i][n-i] for i in range(max(0,n-cols+1), min(1+n,rows))]
|
|
524
|
+
coeff = coeff * multinomial_odd(nth_diagonal,p)
|
|
525
|
+
diagonal[n-1] = sum(nth_diagonal)
|
|
526
|
+
n = n + 1
|
|
527
|
+
if F(coeff) != 0:
|
|
528
|
+
i = diags - 1
|
|
529
|
+
while i >= 0 and diagonal[i] == 0:
|
|
530
|
+
i = i - 1
|
|
531
|
+
t = tuple(diagonal[:i+1])
|
|
532
|
+
if (e,t) in result:
|
|
533
|
+
result[(e,t)] = F(coeff + result[(e,t)])
|
|
534
|
+
else:
|
|
535
|
+
result[(e,t)] = F(coeff)
|
|
536
|
+
# now look for new matrices:
|
|
537
|
+
found = False
|
|
538
|
+
i = 1
|
|
539
|
+
while not found and i < rows:
|
|
540
|
+
temp_sum = M[i][0]
|
|
541
|
+
j = 1
|
|
542
|
+
while not found and j < cols:
|
|
543
|
+
# check to see if column index j is small enough
|
|
544
|
+
if temp_sum >= p**j:
|
|
545
|
+
# now check to see if there's anything above this entry
|
|
546
|
+
# to add to it
|
|
547
|
+
temp_col_sum = 0
|
|
548
|
+
for k in range(i):
|
|
549
|
+
temp_col_sum += M[k][j]
|
|
550
|
+
if temp_col_sum != 0:
|
|
551
|
+
found = True
|
|
552
|
+
for row in range(1,i):
|
|
553
|
+
M[row][0] = r[row-1]
|
|
554
|
+
for col in range(1,cols):
|
|
555
|
+
M[0][col] = M[0][col] + M[row][col]
|
|
556
|
+
M[row][col] = 0
|
|
557
|
+
for col in range(1,j):
|
|
558
|
+
M[0][col] = M[0][col] + M[i][col]
|
|
559
|
+
M[i][col] = 0
|
|
560
|
+
M[0][j] = M[0][j] - 1
|
|
561
|
+
M[i][j] = M[i][j] + 1
|
|
562
|
+
M[i][0] = temp_sum - p**j
|
|
563
|
+
else:
|
|
564
|
+
temp_sum += M[i][j] * p**j
|
|
565
|
+
else:
|
|
566
|
+
temp_sum += M[i][j] * p**j
|
|
567
|
+
j = j + 1
|
|
568
|
+
i = i + 1
|
|
569
|
+
return result
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
def multinomial_odd(list, p):
|
|
573
|
+
r"""
|
|
574
|
+
Multinomial coefficient of list, mod p.
|
|
575
|
+
|
|
576
|
+
INPUT:
|
|
577
|
+
|
|
578
|
+
- ``list`` -- list of integers
|
|
579
|
+
- ``p`` -- a prime number
|
|
580
|
+
|
|
581
|
+
OUTPUT: associated multinomial coefficient, mod p
|
|
582
|
+
|
|
583
|
+
Given the input `[n_1, n_2, n_3, ...]`, this computes the
|
|
584
|
+
multinomial coefficient `(n_1 + n_2 + n_3 + ...)! / (n_1! n_2!
|
|
585
|
+
n_3! ...)`, mod `p`. The method is this: expand each `n_i` in
|
|
586
|
+
base `p`: `n_i = \sum_j p^j n_{ij}`. Do the same for the sum of
|
|
587
|
+
the `n_i`'s, which we call `m`: `m = \sum_j p^j m_j`. Then the
|
|
588
|
+
multinomial coefficient is congruent, mod `p`, to the product of
|
|
589
|
+
the multinomial coefficients `m_j! / (n_{1j}! n_{2j}! ...)`.
|
|
590
|
+
|
|
591
|
+
Furthermore, any multinomial coefficient `m! / (n_1! n_2! ...)`
|
|
592
|
+
can be computed as a product of binomial coefficients: it equals
|
|
593
|
+
|
|
594
|
+
.. MATH::
|
|
595
|
+
|
|
596
|
+
\binom{n_1}{n_1} \binom{n_1 + n_2}{n_2} \binom{n_1 + n_2 + n_3}{n_3} ...
|
|
597
|
+
|
|
598
|
+
This is convenient because Sage's binomial function returns
|
|
599
|
+
integers, not rational numbers (as would be produced just by
|
|
600
|
+
dividing factorials).
|
|
601
|
+
|
|
602
|
+
EXAMPLES::
|
|
603
|
+
|
|
604
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import multinomial_odd
|
|
605
|
+
sage: multinomial_odd([1,2,4], 2)
|
|
606
|
+
1
|
|
607
|
+
sage: multinomial_odd([1,2,4], 7)
|
|
608
|
+
0
|
|
609
|
+
sage: multinomial_odd([1,2,4], 11)
|
|
610
|
+
6
|
|
611
|
+
sage: multinomial_odd([1,2,4], 101)
|
|
612
|
+
4
|
|
613
|
+
sage: multinomial_odd([1,2,4], 107)
|
|
614
|
+
105
|
|
615
|
+
"""
|
|
616
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
617
|
+
from sage.rings.integer import Integer
|
|
618
|
+
from sage.arith.misc import binomial
|
|
619
|
+
n = sum(list)
|
|
620
|
+
answer = 1
|
|
621
|
+
F = GF(p)
|
|
622
|
+
n_expansion = Integer(n).digits(p)
|
|
623
|
+
list_expansion = [Integer(k).digits(p) for k in list]
|
|
624
|
+
index = 0
|
|
625
|
+
while answer != 0 and index < len(n_expansion):
|
|
626
|
+
multi = F(1)
|
|
627
|
+
partial_sum = 0
|
|
628
|
+
for exp in list_expansion:
|
|
629
|
+
if index < len(exp):
|
|
630
|
+
partial_sum = partial_sum + exp[index]
|
|
631
|
+
multi = F(multi * binomial(partial_sum, exp[index]))
|
|
632
|
+
answer = F(answer * multi)
|
|
633
|
+
index += 1
|
|
634
|
+
return answer
|
|
635
|
+
|
|
636
|
+
# Adem relations, Serre-Cartan basis, admissible sequences
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def binomial_mod2(n, k):
|
|
640
|
+
r"""
|
|
641
|
+
The binomial coefficient `\binom{n}{k}`, computed mod 2.
|
|
642
|
+
|
|
643
|
+
INPUT:
|
|
644
|
+
|
|
645
|
+
- `n`, `k` -- integers
|
|
646
|
+
|
|
647
|
+
OUTPUT: `n` choose `k`, mod 2
|
|
648
|
+
|
|
649
|
+
EXAMPLES::
|
|
650
|
+
|
|
651
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import binomial_mod2
|
|
652
|
+
sage: binomial_mod2(4,2)
|
|
653
|
+
0
|
|
654
|
+
sage: binomial_mod2(5,4)
|
|
655
|
+
1
|
|
656
|
+
sage: binomial_mod2(3 * 32768, 32768)
|
|
657
|
+
1
|
|
658
|
+
sage: binomial_mod2(4 * 32768, 32768)
|
|
659
|
+
0
|
|
660
|
+
"""
|
|
661
|
+
if n < k:
|
|
662
|
+
return 0
|
|
663
|
+
elif ((n-k) & k) == 0:
|
|
664
|
+
return 1
|
|
665
|
+
else:
|
|
666
|
+
return 0
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
def binomial_modp(n, k, p):
|
|
670
|
+
r"""
|
|
671
|
+
The binomial coefficient `\binom{n}{k}`, computed mod `p`.
|
|
672
|
+
|
|
673
|
+
INPUT:
|
|
674
|
+
|
|
675
|
+
- `n`, `k` -- integers
|
|
676
|
+
- ``p`` -- prime number
|
|
677
|
+
|
|
678
|
+
OUTPUT: `n` choose `k`, mod `p`
|
|
679
|
+
|
|
680
|
+
EXAMPLES::
|
|
681
|
+
|
|
682
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import binomial_modp
|
|
683
|
+
sage: binomial_modp(5,2,3)
|
|
684
|
+
1
|
|
685
|
+
sage: binomial_modp(6,2,11) # 6 choose 2 = 15
|
|
686
|
+
4
|
|
687
|
+
"""
|
|
688
|
+
if n < k:
|
|
689
|
+
return 0
|
|
690
|
+
return multinomial_odd([n-k, k], p)
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
@cached_function
|
|
694
|
+
def adem(a, b, c=0, p=2, generic=None):
|
|
695
|
+
r"""
|
|
696
|
+
The mod `p` Adem relations.
|
|
697
|
+
|
|
698
|
+
INPUT:
|
|
699
|
+
|
|
700
|
+
- `a`, `b`, `c` -- nonnegative integers (optional); corresponding
|
|
701
|
+
to either `P^a P^b` or (if `c` present) to `P^a \beta^b P^c`
|
|
702
|
+
- ``p`` -- positive prime number (default: 2)
|
|
703
|
+
- ``generic`` -- whether to use the generic Steenrod algebra, (default: depends on prime)
|
|
704
|
+
|
|
705
|
+
OUTPUT:
|
|
706
|
+
|
|
707
|
+
a dictionary representing the mod `p` Adem relations
|
|
708
|
+
applied to `P^a P^b` or (if `c` present) to `P^a \beta^b P^c`.
|
|
709
|
+
|
|
710
|
+
The mod `p` Adem relations for the mod `p` Steenrod algebra are as
|
|
711
|
+
follows: if `p=2`, then if `a < 2b`,
|
|
712
|
+
|
|
713
|
+
.. MATH::
|
|
714
|
+
|
|
715
|
+
\text{Sq}^a \text{Sq}^b = \sum_{j=0}^{a/2} \binom{b-j-1}{a-2j} \text{Sq}^{a+b-j} \text{Sq}^j
|
|
716
|
+
|
|
717
|
+
If `p` is odd, then if `a < pb`,
|
|
718
|
+
|
|
719
|
+
.. MATH::
|
|
720
|
+
|
|
721
|
+
P^a P^b = \sum_{j=0}^{a/p} (-1)^{a+j} \binom{(b-j)(p-1)-1}{a-pj} P^{a+b-j} P^j
|
|
722
|
+
|
|
723
|
+
Also for `p` odd, if `a \leq pb`,
|
|
724
|
+
|
|
725
|
+
.. MATH::
|
|
726
|
+
|
|
727
|
+
P^a \beta P^b = \sum_{j=0}^{a/p} (-1)^{a+j} \binom{(b-j)(p-1)}{a-pj} \beta P^{a+b-j} P^j
|
|
728
|
+
+ \sum_{j=0}^{a/p} (-1)^{a+j-1} \binom{(b-j)(p-1)-1}{a-pj-1} P^{a+b-j} \beta P^j
|
|
729
|
+
|
|
730
|
+
EXAMPLES:
|
|
731
|
+
|
|
732
|
+
If two arguments (`a` and `b`) are given, then computations are
|
|
733
|
+
done mod 2. If `a \geq 2b`, then the dictionary {(a,b): 1} is
|
|
734
|
+
returned. Otherwise, the right side of the mod 2 Adem relation
|
|
735
|
+
for `\text{Sq}^a \text{Sq}^b` is returned. For example, since
|
|
736
|
+
`\text{Sq}^2 \text{Sq}^2 = \text{Sq}^3 \text{Sq}^1`, we have::
|
|
737
|
+
|
|
738
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import adem
|
|
739
|
+
sage: adem(2,2) # indirect doctest
|
|
740
|
+
{(3, 1): 1}
|
|
741
|
+
sage: adem(4,2)
|
|
742
|
+
{(4, 2): 1}
|
|
743
|
+
sage: adem(4,4) == {(6, 2): 1, (7, 1): 1}
|
|
744
|
+
True
|
|
745
|
+
|
|
746
|
+
If `p` is given and is odd, then with two inputs `a` and `b`, the
|
|
747
|
+
Adem relation for `P^a P^b` is computed. With three inputs `a`,
|
|
748
|
+
`b`, `c`, the Adem relation for `P^a \beta^b P^c` is computed.
|
|
749
|
+
In either case, the keys in the output are all tuples of odd length,
|
|
750
|
+
with ``(i_1, i_2, ..., i_m)`` representing
|
|
751
|
+
|
|
752
|
+
.. MATH::
|
|
753
|
+
|
|
754
|
+
\beta^{i_1} P^{i_2} \beta^{i_3} P^{i_4} ... \beta^{i_m}
|
|
755
|
+
|
|
756
|
+
For instance::
|
|
757
|
+
|
|
758
|
+
sage: adem(3,1, p=3)
|
|
759
|
+
{(0, 3, 0, 1, 0): 1}
|
|
760
|
+
sage: adem(3,0,1, p=3)
|
|
761
|
+
{(0, 3, 0, 1, 0): 1}
|
|
762
|
+
sage: adem(1,0,1, p=7)
|
|
763
|
+
{(0, 2, 0): 2}
|
|
764
|
+
sage: adem(1,1,1, p=5) == {(0, 2, 1): 1, (1, 2, 0): 1}
|
|
765
|
+
True
|
|
766
|
+
sage: adem(1,1,2, p=5) == {(0, 3, 1): 1, (1, 3, 0): 2}
|
|
767
|
+
True
|
|
768
|
+
"""
|
|
769
|
+
if generic is None:
|
|
770
|
+
generic = (p != 2)
|
|
771
|
+
if not generic:
|
|
772
|
+
if b == 0:
|
|
773
|
+
return {(a,): 1}
|
|
774
|
+
elif a == 0:
|
|
775
|
+
return {(b,): 1}
|
|
776
|
+
elif a >= 2*b:
|
|
777
|
+
return {(a,b): 1}
|
|
778
|
+
result = {}
|
|
779
|
+
for c in range(1 + a//2):
|
|
780
|
+
if binomial_mod2(b-c-1, a-2*c) == 1:
|
|
781
|
+
if c == 0:
|
|
782
|
+
result[(a+b,)] = 1
|
|
783
|
+
else:
|
|
784
|
+
result[(a+b-c,c)] = 1
|
|
785
|
+
return result
|
|
786
|
+
# p odd
|
|
787
|
+
if a == 0 and b == 0:
|
|
788
|
+
return {(c,): 1}
|
|
789
|
+
if c == 0:
|
|
790
|
+
bockstein = 0
|
|
791
|
+
A = a
|
|
792
|
+
B = b
|
|
793
|
+
else:
|
|
794
|
+
A = a
|
|
795
|
+
B = c
|
|
796
|
+
bockstein = b # should be 0 or 1
|
|
797
|
+
if A == 0:
|
|
798
|
+
return {(bockstein, B, 0): 1}
|
|
799
|
+
if B == 0:
|
|
800
|
+
return {(0, A, bockstein): 1}
|
|
801
|
+
if bockstein == 0:
|
|
802
|
+
if A >= p*B: # admissible
|
|
803
|
+
return {(0,A,0,B,0): 1}
|
|
804
|
+
result = {}
|
|
805
|
+
for j in range(1 + a//p):
|
|
806
|
+
coeff = (-1)**(A+j) * binomial_modp((B-j) * (p-1) - 1, A - p*j, p)
|
|
807
|
+
if coeff % p != 0:
|
|
808
|
+
if j == 0:
|
|
809
|
+
result[(0,A+B,0)] = coeff
|
|
810
|
+
else:
|
|
811
|
+
result[(0,A+B-j,0,j,0)] = coeff
|
|
812
|
+
else:
|
|
813
|
+
if A >= p*B + 1: # admissible
|
|
814
|
+
return {(0,A,1,B,0): 1}
|
|
815
|
+
result = {}
|
|
816
|
+
for j in range(1 + a//p):
|
|
817
|
+
coeff = (-1)**(A+j) * binomial_modp((B-j) * (p-1), A - p*j, p)
|
|
818
|
+
if coeff % p != 0:
|
|
819
|
+
if j == 0:
|
|
820
|
+
result[(1,A+B,0)] = coeff
|
|
821
|
+
else:
|
|
822
|
+
result[(1,A+B-j,0,j,0)] = coeff
|
|
823
|
+
for j in range(1 + (a-1)//p):
|
|
824
|
+
coeff = (-1)**(A+j-1) * binomial_modp((B-j) * (p-1) - 1, A - p*j - 1, p)
|
|
825
|
+
if coeff % p != 0:
|
|
826
|
+
if j == 0:
|
|
827
|
+
result[(0,A+B,1)] = coeff
|
|
828
|
+
else:
|
|
829
|
+
result[(0,A+B-j,1,j,0)] = coeff
|
|
830
|
+
return result
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
@cached_function
|
|
834
|
+
def make_mono_admissible(mono, p=2, generic=None):
|
|
835
|
+
r"""
|
|
836
|
+
Given a tuple ``mono``, view it as a product of Steenrod
|
|
837
|
+
operations, and return a dictionary giving data equivalent to
|
|
838
|
+
writing that product as a linear combination of admissible
|
|
839
|
+
monomials.
|
|
840
|
+
|
|
841
|
+
When `p=2`, the sequence (and hence the corresponding monomial)
|
|
842
|
+
`(i_1, i_2, ...)` is admissible if `i_j \geq 2 i_{j+1}` for all
|
|
843
|
+
`j`.
|
|
844
|
+
|
|
845
|
+
When `p` is odd, the sequence `(e_1, i_1, e_2, i_2, ...)` is
|
|
846
|
+
admissible if `i_j \geq e_{j+1} + p i_{j+1}` for all `j`.
|
|
847
|
+
|
|
848
|
+
INPUT:
|
|
849
|
+
|
|
850
|
+
- ``mono`` -- tuple of nonnegative integers
|
|
851
|
+
- ``p`` -- prime number (default: 2)
|
|
852
|
+
- ``generic`` -- whether to use the generic Steenrod algebra (default: depends on prime)
|
|
853
|
+
|
|
854
|
+
OUTPUT:
|
|
855
|
+
|
|
856
|
+
Dictionary of terms of the form (tuple: coeff), where
|
|
857
|
+
'tuple' is an admissible tuple of nonnegative integers and
|
|
858
|
+
'coeff' is its coefficient. This corresponds to a linear
|
|
859
|
+
combination of admissible monomials. When `p` is odd, each tuple
|
|
860
|
+
must have an odd length: it should be of the form `(e_1, i_1, e_2,
|
|
861
|
+
i_2, ..., e_k)` where each `e_j` is either 0 or 1 and each `i_j`
|
|
862
|
+
is a positive integer: this corresponds to the admissible monomial
|
|
863
|
+
|
|
864
|
+
.. MATH::
|
|
865
|
+
|
|
866
|
+
\beta^{e_1} \mathcal{P}^{i_2} \beta^{e_2} \mathcal{P}^{i_2} ...
|
|
867
|
+
\mathcal{P}^{i_k} \beta^{e_k}
|
|
868
|
+
|
|
869
|
+
ALGORITHM:
|
|
870
|
+
|
|
871
|
+
Given `(i_1, i_2, i_3, ...)`, apply the Adem relations to the first
|
|
872
|
+
pair (or triple when `p` is odd) where the sequence is inadmissible,
|
|
873
|
+
and then apply this function recursively to each of the resulting
|
|
874
|
+
tuples `(i_1, ..., i_{j-1}, NEW, i_{j+2}, ...)`, keeping track of
|
|
875
|
+
the coefficients.
|
|
876
|
+
|
|
877
|
+
EXAMPLES::
|
|
878
|
+
|
|
879
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_mult import make_mono_admissible
|
|
880
|
+
sage: make_mono_admissible((12,)) # already admissible, indirect doctest
|
|
881
|
+
{(12,): 1}
|
|
882
|
+
sage: make_mono_admissible((2,1)) # already admissible
|
|
883
|
+
{(2, 1): 1}
|
|
884
|
+
sage: make_mono_admissible((2,2))
|
|
885
|
+
{(3, 1): 1}
|
|
886
|
+
sage: make_mono_admissible((2, 2, 2))
|
|
887
|
+
{(5, 1): 1}
|
|
888
|
+
sage: make_mono_admissible((0, 2, 0, 1, 0), p=7)
|
|
889
|
+
{(0, 3, 0): 3}
|
|
890
|
+
|
|
891
|
+
Test the fix from :issue:`13796`::
|
|
892
|
+
|
|
893
|
+
sage: SteenrodAlgebra(p=2, basis='adem').Q(2) * (Sq(6) * Sq(2)) # indirect doctest # needs sage.combinat
|
|
894
|
+
Sq^10 Sq^4 Sq^1 + Sq^10 Sq^5 + Sq^12 Sq^3 + Sq^13 Sq^2
|
|
895
|
+
"""
|
|
896
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
897
|
+
if generic is None:
|
|
898
|
+
generic = p != 2
|
|
899
|
+
F = GF(p)
|
|
900
|
+
if len(mono) == 1:
|
|
901
|
+
return {mono: 1}
|
|
902
|
+
if not generic and len(mono) == 2:
|
|
903
|
+
return adem(*mono, p=p, generic=generic)
|
|
904
|
+
if not generic:
|
|
905
|
+
# check to see if admissible:
|
|
906
|
+
admissible = True
|
|
907
|
+
for j in range(len(mono)-1):
|
|
908
|
+
if mono[j] < 2*mono[j+1]:
|
|
909
|
+
admissible = False
|
|
910
|
+
break
|
|
911
|
+
if admissible:
|
|
912
|
+
return {mono: 1}
|
|
913
|
+
# else j is the first index where admissibility fails
|
|
914
|
+
ans = {}
|
|
915
|
+
y = adem(mono[j], mono[j+1])
|
|
916
|
+
for x in y:
|
|
917
|
+
new = mono[:j] + x + mono[j+2:]
|
|
918
|
+
new = make_mono_admissible(new)
|
|
919
|
+
for m in new:
|
|
920
|
+
if m in ans:
|
|
921
|
+
ans[m] = ans[m] + y[x] * new[m]
|
|
922
|
+
if F(ans[m]) == 0:
|
|
923
|
+
del ans[m]
|
|
924
|
+
else:
|
|
925
|
+
ans[m] = y[x] * new[m]
|
|
926
|
+
return ans
|
|
927
|
+
# p odd
|
|
928
|
+
# check to see if admissible:
|
|
929
|
+
admissible = True
|
|
930
|
+
for j in range(1, len(mono)-2, 2):
|
|
931
|
+
if mono[j] < mono[j+1] + p*mono[j+2]:
|
|
932
|
+
admissible = False
|
|
933
|
+
break
|
|
934
|
+
if admissible:
|
|
935
|
+
return {mono: 1}
|
|
936
|
+
# else j is the first index where admissibility fails
|
|
937
|
+
ans = {}
|
|
938
|
+
y = adem(*mono[j:j+3], p=p, generic=True)
|
|
939
|
+
for x in y:
|
|
940
|
+
new_x = list(x)
|
|
941
|
+
new_x[0] = mono[j-1] + x[0]
|
|
942
|
+
if len(mono) >= j+3:
|
|
943
|
+
new_x[-1] = mono[j+3] + x[-1]
|
|
944
|
+
if new_x[0] <= 1 and new_x[-1] <= 1:
|
|
945
|
+
new = mono[:j-1] + tuple(new_x) + mono[j+4:]
|
|
946
|
+
new = make_mono_admissible(new, p, generic=True)
|
|
947
|
+
for m in new:
|
|
948
|
+
if m in ans:
|
|
949
|
+
ans[m] = ans[m] + y[x] * new[m]
|
|
950
|
+
if F(ans[m]) == 0:
|
|
951
|
+
del ans[m]
|
|
952
|
+
else:
|
|
953
|
+
ans[m] = y[x] * new[m]
|
|
954
|
+
return ans
|