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,1179 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Steenrod algebra bases
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- John H. Palmieri (2008-07-30): version 0.9
|
|
8
|
+
- John H. Palmieri (2010-06-30): version 1.0
|
|
9
|
+
- Simon King (2011-10-25): Fix the use of cached functions
|
|
10
|
+
|
|
11
|
+
This package defines functions for computing various bases of the
|
|
12
|
+
Steenrod algebra, and for converting between the Milnor basis and
|
|
13
|
+
any other basis.
|
|
14
|
+
|
|
15
|
+
This packages implements a number of different bases, at least at
|
|
16
|
+
the prime 2. The Milnor and Serre-Cartan bases are the most
|
|
17
|
+
familiar and most standard ones, and all of the others are defined
|
|
18
|
+
in terms of one of these. The bases are described in the
|
|
19
|
+
documentation for the function
|
|
20
|
+
:func:`steenrod_algebra_basis`; also see the papers by
|
|
21
|
+
Monks [Mon1998]_ and Wood [Woo1998]_ for more information about them. For
|
|
22
|
+
commutator bases, see the preprint by Palmieri and Zhang [PZ2008]_.
|
|
23
|
+
|
|
24
|
+
- ``'milnor'`` -- Milnor basis
|
|
25
|
+
|
|
26
|
+
- ``'serre-cartan'`` or ``'adem'`` or ``'admissible'`` -- Serre-Cartan basis
|
|
27
|
+
|
|
28
|
+
Most of the rest of the bases are only defined when `p=2`. The only
|
|
29
|
+
exceptions are the `P^s_t`-bases and the commutator bases, which are
|
|
30
|
+
defined at all primes.
|
|
31
|
+
|
|
32
|
+
- ``'wood_y'`` -- Wood's Y basis
|
|
33
|
+
|
|
34
|
+
- ``'wood_z'`` -- Wood's Z basis
|
|
35
|
+
|
|
36
|
+
- ``'wall'``, ``'wall_long'`` -- Wall's basis
|
|
37
|
+
|
|
38
|
+
- ``'arnon_a'``, ``'arnon_a_long'`` -- Arnon's A basis
|
|
39
|
+
|
|
40
|
+
- ``'arnon_c'`` -- Arnon's C basis
|
|
41
|
+
|
|
42
|
+
- ``'pst'``, ``'pst_rlex'``, ``'pst_llex'``, ``'pst_deg'``, ``'pst_revz'`` --
|
|
43
|
+
various `P^s_t`-bases
|
|
44
|
+
|
|
45
|
+
- ``'comm'``, ``'comm_rlex'``, ``'comm_llex'``, ``'comm_deg'``, ``'comm_revz'``,
|
|
46
|
+
or these with ``'_long'`` appended -- various commutator bases
|
|
47
|
+
|
|
48
|
+
The main functions provided here are
|
|
49
|
+
|
|
50
|
+
- :func:`steenrod_algebra_basis`. This computes a tuple representing
|
|
51
|
+
basis elements for the Steenrod algebra in a given degree, at a
|
|
52
|
+
given prime, with respect to a given basis. It is a cached function.
|
|
53
|
+
|
|
54
|
+
- :func:`convert_to_milnor_matrix`. This returns the change-of-basis
|
|
55
|
+
matrix, in a given degree, from any basis to the Milnor basis. It is
|
|
56
|
+
a cached function.
|
|
57
|
+
|
|
58
|
+
- :func:`convert_from_milnor_matrix`. This returns the inverse of the
|
|
59
|
+
previous matrix.
|
|
60
|
+
|
|
61
|
+
INTERNAL DOCUMENTATION:
|
|
62
|
+
|
|
63
|
+
If you want to implement a new basis for the Steenrod algebra:
|
|
64
|
+
|
|
65
|
+
In the file :file:`steenrod_algebra.py`:
|
|
66
|
+
|
|
67
|
+
For the class :class:`SteenrodAlgebra_generic
|
|
68
|
+
<sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic>`, add functionality to the
|
|
69
|
+
methods:
|
|
70
|
+
|
|
71
|
+
- :meth:`_repr_term <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic._repr_term>`
|
|
72
|
+
|
|
73
|
+
- :meth:`degree_on_basis <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.degree_on_basis>`
|
|
74
|
+
|
|
75
|
+
- :meth:`_milnor_on_basis <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic._milnor_on_basis>`
|
|
76
|
+
|
|
77
|
+
- :meth:`an_element <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.an_element>`
|
|
78
|
+
|
|
79
|
+
In the file :file:`steenrod_algebra_misc.py`:
|
|
80
|
+
|
|
81
|
+
- add functionality to :func:`get_basis_name
|
|
82
|
+
<sage.algebras.steenrod.steenrod_algebra_misc.get_basis_name>`: this
|
|
83
|
+
should accept as input various synonyms for the basis, and its
|
|
84
|
+
output should be a canonical name for the basis.
|
|
85
|
+
|
|
86
|
+
- add a function ``BASIS_mono_to_string`` like
|
|
87
|
+
:func:`milnor_mono_to_string
|
|
88
|
+
<sage.algebras.steenrod.steenrod_algebra_misc.milnor_mono_to_string>`
|
|
89
|
+
or one of the other similar functions.
|
|
90
|
+
|
|
91
|
+
In this file :file:`steenrod_algebra_bases.py`:
|
|
92
|
+
|
|
93
|
+
- add appropriate lines to :func:`steenrod_algebra_basis`.
|
|
94
|
+
|
|
95
|
+
- add a function to compute the basis in a given dimension (to be
|
|
96
|
+
called by :func:`steenrod_algebra_basis`).
|
|
97
|
+
|
|
98
|
+
- modify :func:`steenrod_basis_error_check` so it checks the new
|
|
99
|
+
basis.
|
|
100
|
+
|
|
101
|
+
If the basis has an intrinsic way of defining a product, implement it
|
|
102
|
+
in the file :file:`steenrod_algebra_mult.py` and also in the
|
|
103
|
+
:meth:`product_on_basis
|
|
104
|
+
<sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.product_on_basis>`
|
|
105
|
+
method for :class:`SteenrodAlgebra_generic
|
|
106
|
+
<sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic>` in
|
|
107
|
+
:file:`steenrod_algebra.py`.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
# ****************************************************************************
|
|
111
|
+
# Copyright (C) 2008-2010 John H. Palmieri <palmieri@math.washington.edu>
|
|
112
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
113
|
+
# ****************************************************************************
|
|
114
|
+
|
|
115
|
+
from sage.misc.cachefunc import cached_function
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@cached_function
|
|
119
|
+
def convert_to_milnor_matrix(n, basis, p=2, generic='auto'):
|
|
120
|
+
r"""
|
|
121
|
+
Change-of-basis matrix, 'basis' to Milnor, in dimension
|
|
122
|
+
`n`, at the prime `p`.
|
|
123
|
+
|
|
124
|
+
INPUT:
|
|
125
|
+
|
|
126
|
+
- ``n`` -- nonnegative integer, the dimension
|
|
127
|
+
- ``basis`` -- string, the basis from which to convert
|
|
128
|
+
- ``p`` -- positive prime number (default: 2)
|
|
129
|
+
|
|
130
|
+
OUTPUT:
|
|
131
|
+
|
|
132
|
+
``matrix`` -- change-of-basis matrix, a square matrix over `\GF{p}`
|
|
133
|
+
|
|
134
|
+
EXAMPLES::
|
|
135
|
+
|
|
136
|
+
sage: # needs sage.combinat sage.modules
|
|
137
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
|
|
138
|
+
sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
|
|
139
|
+
[0 1]
|
|
140
|
+
[1 1]
|
|
141
|
+
sage: convert_to_milnor_matrix(45, 'milnor')
|
|
142
|
+
111 x 111 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
|
|
143
|
+
sage: convert_to_milnor_matrix(12, 'wall')
|
|
144
|
+
[1 0 0 1 0 0 0]
|
|
145
|
+
[1 1 0 0 0 1 0]
|
|
146
|
+
[0 1 0 1 0 0 0]
|
|
147
|
+
[0 0 0 1 0 0 0]
|
|
148
|
+
[1 1 0 0 1 0 0]
|
|
149
|
+
[0 0 1 1 1 0 1]
|
|
150
|
+
[0 0 0 0 1 0 1]
|
|
151
|
+
|
|
152
|
+
The function takes an optional argument, the prime `p` over
|
|
153
|
+
which to work::
|
|
154
|
+
|
|
155
|
+
sage: # needs sage.combinat sage.modules
|
|
156
|
+
sage: convert_to_milnor_matrix(17, 'adem', 3)
|
|
157
|
+
[0 0 1 1]
|
|
158
|
+
[0 0 0 1]
|
|
159
|
+
[1 1 1 1]
|
|
160
|
+
[0 1 0 1]
|
|
161
|
+
sage: convert_to_milnor_matrix(48, 'adem', 5)
|
|
162
|
+
[0 1]
|
|
163
|
+
[1 1]
|
|
164
|
+
sage: convert_to_milnor_matrix(36, 'adem', 3)
|
|
165
|
+
[0 0 1]
|
|
166
|
+
[0 1 0]
|
|
167
|
+
[1 2 0]
|
|
168
|
+
"""
|
|
169
|
+
from sage.matrix.constructor import matrix
|
|
170
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
171
|
+
from .steenrod_algebra import SteenrodAlgebra
|
|
172
|
+
if generic == 'auto':
|
|
173
|
+
generic = p != 2
|
|
174
|
+
if n == 0:
|
|
175
|
+
return matrix(GF(p), 1, 1, [[1]])
|
|
176
|
+
milnor_base = steenrod_algebra_basis(n, 'milnor', p, generic=generic)
|
|
177
|
+
rows = []
|
|
178
|
+
A = SteenrodAlgebra(basis=basis, p=p, generic=generic)
|
|
179
|
+
for poly in A.basis(n):
|
|
180
|
+
d = poly.milnor().monomial_coefficients()
|
|
181
|
+
for v in milnor_base:
|
|
182
|
+
entry = d.get(v, 0)
|
|
183
|
+
rows = rows + [entry]
|
|
184
|
+
d = len(milnor_base)
|
|
185
|
+
return matrix(GF(p), d, d, rows)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def convert_from_milnor_matrix(n, basis, p=2, generic='auto'):
|
|
189
|
+
r"""
|
|
190
|
+
Change-of-basis matrix, Milnor to ``basis``, in dimension `n`.
|
|
191
|
+
|
|
192
|
+
INPUT:
|
|
193
|
+
|
|
194
|
+
- ``n`` -- nonnegative integer, the dimension
|
|
195
|
+
|
|
196
|
+
- ``basis`` -- string, the basis to which to convert
|
|
197
|
+
|
|
198
|
+
- ``p`` -- positive prime number (default: 2)
|
|
199
|
+
|
|
200
|
+
OUTPUT:
|
|
201
|
+
|
|
202
|
+
``matrix`` -- change-of-basis matrix, a square matrix over `\GF{p}`
|
|
203
|
+
|
|
204
|
+
.. NOTE::
|
|
205
|
+
|
|
206
|
+
This is called internally. It is not intended for casual
|
|
207
|
+
users, so no error checking is made on the integer `n`, the
|
|
208
|
+
basis name, or the prime.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: # needs sage.combinat sage.modules
|
|
213
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_from_milnor_matrix, convert_to_milnor_matrix
|
|
214
|
+
sage: convert_from_milnor_matrix(12, 'wall')
|
|
215
|
+
[1 0 0 1 0 0 0]
|
|
216
|
+
[0 0 1 1 0 0 0]
|
|
217
|
+
[0 0 0 1 0 1 1]
|
|
218
|
+
[0 0 0 1 0 0 0]
|
|
219
|
+
[1 0 1 0 1 0 0]
|
|
220
|
+
[1 1 1 0 0 0 0]
|
|
221
|
+
[1 0 1 0 1 0 1]
|
|
222
|
+
sage: convert_from_milnor_matrix(38, 'serre_cartan')
|
|
223
|
+
72 x 72 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
|
|
224
|
+
sage: x = convert_to_milnor_matrix(20, 'wood_y')
|
|
225
|
+
sage: y = convert_from_milnor_matrix(20, 'wood_y')
|
|
226
|
+
sage: x*y
|
|
227
|
+
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
|
|
228
|
+
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
|
|
229
|
+
[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
|
|
230
|
+
[0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
|
|
231
|
+
[0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
|
|
232
|
+
[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
|
|
233
|
+
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
|
|
234
|
+
[0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
|
|
235
|
+
[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
|
|
236
|
+
[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
|
|
237
|
+
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
|
|
238
|
+
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
|
|
239
|
+
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
|
|
240
|
+
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
|
|
241
|
+
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
|
|
242
|
+
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
|
|
243
|
+
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
|
|
244
|
+
|
|
245
|
+
The function takes an optional argument, the prime `p` over
|
|
246
|
+
which to work::
|
|
247
|
+
|
|
248
|
+
sage: convert_from_milnor_matrix(17, 'adem', 3) # needs sage.combinat sage.modules
|
|
249
|
+
[2 1 1 2]
|
|
250
|
+
[0 2 0 1]
|
|
251
|
+
[1 2 0 0]
|
|
252
|
+
[0 1 0 0]
|
|
253
|
+
"""
|
|
254
|
+
mat = convert_to_milnor_matrix(n, basis, p, generic)
|
|
255
|
+
if mat.nrows():
|
|
256
|
+
return convert_to_milnor_matrix(n, basis, p, generic).inverse()
|
|
257
|
+
return mat
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@cached_function
|
|
261
|
+
def steenrod_algebra_basis(n, basis='milnor', p=2, **kwds):
|
|
262
|
+
r"""
|
|
263
|
+
Basis for the Steenrod algebra in degree `n`.
|
|
264
|
+
|
|
265
|
+
INPUT:
|
|
266
|
+
|
|
267
|
+
- ``n`` -- nonnegative integer
|
|
268
|
+
- ``basis`` -- string, which basis to use (default: ``'milnor'``)
|
|
269
|
+
- ``p`` -- positive prime number (default: 2)
|
|
270
|
+
- ``profile`` -- profile function (default: ``None``); this
|
|
271
|
+
is just passed on to the functions :func:`milnor_basis` and
|
|
272
|
+
:func:`pst_basis`
|
|
273
|
+
- ``truncation_type`` -- truncation type, either 0 or ``Infinity``
|
|
274
|
+
(default: ``Infinity`` if no profile function is specified,
|
|
275
|
+
0 otherwise). This is just passed on to the function
|
|
276
|
+
:func:`milnor_basis`.
|
|
277
|
+
- ``generic`` -- boolean (default: ``None``)
|
|
278
|
+
|
|
279
|
+
OUTPUT:
|
|
280
|
+
|
|
281
|
+
Tuple of objects representing basis elements for the Steenrod algebra
|
|
282
|
+
in dimension n.
|
|
283
|
+
|
|
284
|
+
The choices for the string ``basis`` are as follows; see the
|
|
285
|
+
documentation for :mod:`sage.algebras.steenrod.steenrod_algebra`
|
|
286
|
+
for details on each basis:
|
|
287
|
+
|
|
288
|
+
- ``'milnor'`` -- Milnor basis
|
|
289
|
+
- ``'serre-cartan'`` or ``'adem'`` or ``'admissible'`` -- Serre-Cartan basis
|
|
290
|
+
- ``'pst'``, ``'pst_rlex'``, ``'pst_llex'``, ``'pst_deg'``, ``'pst_revz'`` --
|
|
291
|
+
various `P^s_t`-bases
|
|
292
|
+
- ``'comm'``, ``'comm_rlex'``, ``'comm_llex'``, ``'comm_deg'``, ``'comm_revz'``, or
|
|
293
|
+
any of these with ``'_long'`` appended -- various commutator bases
|
|
294
|
+
|
|
295
|
+
The rest of these bases are only defined when `p=2`.
|
|
296
|
+
|
|
297
|
+
- ``'wood_y'`` -- Wood's Y basis
|
|
298
|
+
- ``'wood_z'`` -- Wood's Z basis
|
|
299
|
+
- ``'wall'`` or ``'wall_long'`` -- Wall's basis
|
|
300
|
+
- ``'arnon_a'`` or ``'arnon_a_long'`` -- Arnon's A basis
|
|
301
|
+
- ``'arnon_c'`` -- Arnon's C basis
|
|
302
|
+
|
|
303
|
+
EXAMPLES::
|
|
304
|
+
|
|
305
|
+
sage: # needs sage.combinat
|
|
306
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import steenrod_algebra_basis
|
|
307
|
+
sage: steenrod_algebra_basis(7, 'milnor') # indirect doctest
|
|
308
|
+
((0, 0, 1), (1, 2), (4, 1), (7,))
|
|
309
|
+
sage: steenrod_algebra_basis(5) # milnor basis is the default
|
|
310
|
+
((2, 1), (5,))
|
|
311
|
+
|
|
312
|
+
Bases in negative dimensions are empty::
|
|
313
|
+
|
|
314
|
+
sage: steenrod_algebra_basis(-2, 'wall') # needs sage.combinat
|
|
315
|
+
()
|
|
316
|
+
|
|
317
|
+
The third (optional) argument to 'steenrod_algebra_basis' is the
|
|
318
|
+
prime p::
|
|
319
|
+
|
|
320
|
+
sage: # needs sage.combinat
|
|
321
|
+
sage: steenrod_algebra_basis(9, 'milnor', p=3)
|
|
322
|
+
(((1,), (1,)), ((0,), (2,)))
|
|
323
|
+
sage: steenrod_algebra_basis(9, 'milnor', 3)
|
|
324
|
+
(((1,), (1,)), ((0,), (2,)))
|
|
325
|
+
sage: steenrod_algebra_basis(17, 'milnor', 3)
|
|
326
|
+
(((2,), ()), ((1,), (3,)), ((0,), (0, 1)), ((0,), (4,)))
|
|
327
|
+
|
|
328
|
+
Other bases::
|
|
329
|
+
|
|
330
|
+
sage: # needs sage.combinat
|
|
331
|
+
sage: steenrod_algebra_basis(7, 'admissible')
|
|
332
|
+
((7,), (6, 1), (4, 2, 1), (5, 2))
|
|
333
|
+
sage: steenrod_algebra_basis(13, 'admissible', p=3)
|
|
334
|
+
((1, 3, 0), (0, 3, 1))
|
|
335
|
+
sage: steenrod_algebra_basis(5, 'wall')
|
|
336
|
+
(((2, 2), (0, 0)), ((1, 1), (1, 0)))
|
|
337
|
+
sage: steenrod_algebra_basis(5, 'wall_long')
|
|
338
|
+
(((2, 2), (0, 0)), ((1, 1), (1, 0)))
|
|
339
|
+
sage: steenrod_algebra_basis(5, 'pst-rlex')
|
|
340
|
+
(((0, 1), (2, 1)), ((1, 1), (0, 2)))
|
|
341
|
+
"""
|
|
342
|
+
from .steenrod_algebra_misc import get_basis_name
|
|
343
|
+
try:
|
|
344
|
+
if n < 0 or int(n) != n:
|
|
345
|
+
return ()
|
|
346
|
+
except TypeError:
|
|
347
|
+
return ()
|
|
348
|
+
|
|
349
|
+
generic = kwds.get("generic", p != 2)
|
|
350
|
+
|
|
351
|
+
basis_name = get_basis_name(basis, p, generic=generic)
|
|
352
|
+
if basis_name.find('long') >= 0:
|
|
353
|
+
basis_name = basis_name.rsplit('_', 1)[0]
|
|
354
|
+
|
|
355
|
+
profile = kwds.get("profile", None)
|
|
356
|
+
if (profile is not None and profile != () and profile != ((), ())
|
|
357
|
+
and basis != 'milnor' and basis.find('pst') == -1):
|
|
358
|
+
raise ValueError("profile functions may only be used with the Milnor or pst bases")
|
|
359
|
+
|
|
360
|
+
# Milnor basis
|
|
361
|
+
if basis_name == 'milnor':
|
|
362
|
+
return milnor_basis(n, p, **kwds)
|
|
363
|
+
# Serre-Cartan basis
|
|
364
|
+
elif basis_name == 'serre-cartan':
|
|
365
|
+
return serre_cartan_basis(n, p, **kwds)
|
|
366
|
+
# Atomic bases, p odd:
|
|
367
|
+
elif generic and (basis_name.find('pst') >= 0
|
|
368
|
+
or basis_name.find('comm') >= 0):
|
|
369
|
+
return atomic_basis_odd(n, basis_name, p, **kwds)
|
|
370
|
+
# Atomic bases, p=2
|
|
371
|
+
elif not generic and (basis_name == 'woody' or basis_name == 'woodz'
|
|
372
|
+
or basis_name == 'wall' or basis_name == 'arnona'
|
|
373
|
+
or basis_name.find('pst') >= 0
|
|
374
|
+
or basis_name.find('comm') >= 0):
|
|
375
|
+
return atomic_basis(n, basis_name, **kwds)
|
|
376
|
+
# Arnon 'C' basis
|
|
377
|
+
elif not generic and basis == 'arnonc':
|
|
378
|
+
return arnonC_basis(n)
|
|
379
|
+
else:
|
|
380
|
+
raise ValueError("unknown basis: %s at the prime %s" % (basis, p))
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
# helper functions for producing bases
|
|
384
|
+
|
|
385
|
+
def restricted_partitions(n, l, no_repeats=False):
|
|
386
|
+
"""
|
|
387
|
+
Iterator over 'restricted' partitions of `n`: partitions with parts taken
|
|
388
|
+
from list `l`.
|
|
389
|
+
|
|
390
|
+
INPUT:
|
|
391
|
+
|
|
392
|
+
- ``n`` -- nonnegative integer
|
|
393
|
+
- ``l`` -- list of positive integers
|
|
394
|
+
- ``no_repeats`` -- boolean (default: ``False``); if ``True``,
|
|
395
|
+
only return partitions with no repeated parts
|
|
396
|
+
|
|
397
|
+
OUTPUT: iterator of lists
|
|
398
|
+
|
|
399
|
+
One could also use ``Partitions(n, parts_in=l)``, but this
|
|
400
|
+
function may be faster. Also, while ``Partitions(n, parts_in=l,
|
|
401
|
+
max_slope=-1)`` should in theory return the partitions of `n` with
|
|
402
|
+
parts in ``l`` with no repetitions, the ``max_slope=-1`` argument
|
|
403
|
+
is ignored, so it does not work. (At the moment, the
|
|
404
|
+
``no_repeats=True`` case is the only one used in the code.)
|
|
405
|
+
|
|
406
|
+
.. TODO::
|
|
407
|
+
|
|
408
|
+
This should be re-implemented in a non-recursive way.
|
|
409
|
+
|
|
410
|
+
EXAMPLES::
|
|
411
|
+
|
|
412
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import restricted_partitions
|
|
413
|
+
sage: list(restricted_partitions(10, [7,5,1]))
|
|
414
|
+
[[7, 1, 1, 1], [5, 5], [5, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
|
415
|
+
sage: list(restricted_partitions(10, [6,5,4,3,2,1], no_repeats=True))
|
|
416
|
+
[[6, 4], [6, 3, 1], [5, 4, 1], [5, 3, 2], [4, 3, 2, 1]]
|
|
417
|
+
sage: list(restricted_partitions(10, [6,4,2]))
|
|
418
|
+
[[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
|
|
419
|
+
sage: list(restricted_partitions(10, [6,4,2], no_repeats=True))
|
|
420
|
+
[[6, 4]]
|
|
421
|
+
|
|
422
|
+
``l`` may have repeated elements. If ``no_repeats`` is ``False``, this
|
|
423
|
+
has no effect. If ``no_repeats`` is ``True``, and if the repeated
|
|
424
|
+
elements appear consecutively in ``l``, then each element may be
|
|
425
|
+
used only as many times as it appears in ``l``::
|
|
426
|
+
|
|
427
|
+
sage: list(restricted_partitions(10, [6,4,2,2], no_repeats=True))
|
|
428
|
+
[[6, 4], [6, 2, 2]]
|
|
429
|
+
sage: list(restricted_partitions(10, [6,4,2,2,2], no_repeats=True))
|
|
430
|
+
[[6, 4], [6, 2, 2], [4, 2, 2, 2]]
|
|
431
|
+
|
|
432
|
+
(If the repeated elements don't appear consecutively, the results
|
|
433
|
+
are likely meaningless, containing several partitions more than
|
|
434
|
+
once, for example.)
|
|
435
|
+
|
|
436
|
+
In the following examples, ``no_repeats`` is ``False``::
|
|
437
|
+
|
|
438
|
+
sage: list(restricted_partitions(10, [6,4,2]))
|
|
439
|
+
[[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
|
|
440
|
+
sage: list(restricted_partitions(10, [6,4,2,2,2]))
|
|
441
|
+
[[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
|
|
442
|
+
sage: list(restricted_partitions(10, [6,4,4,4,2,2,2,2,2,2]))
|
|
443
|
+
[[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
|
|
444
|
+
"""
|
|
445
|
+
if n < 0:
|
|
446
|
+
return
|
|
447
|
+
|
|
448
|
+
if n == 0:
|
|
449
|
+
yield []
|
|
450
|
+
return
|
|
451
|
+
|
|
452
|
+
index = 1 if no_repeats else 0
|
|
453
|
+
old_i = 0
|
|
454
|
+
for i in l:
|
|
455
|
+
if old_i != i:
|
|
456
|
+
for sigma in restricted_partitions(n - i, l[index:], no_repeats):
|
|
457
|
+
yield [i] + sigma
|
|
458
|
+
index += 1
|
|
459
|
+
old_i = i
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def xi_degrees(n, p=2, reverse=True):
|
|
463
|
+
r"""
|
|
464
|
+
Decreasing list of degrees of the `\xi_i`'s, starting in degree `n`.
|
|
465
|
+
|
|
466
|
+
INPUT:
|
|
467
|
+
|
|
468
|
+
- ``n`` -- integer
|
|
469
|
+
- ``p`` -- prime number (default: 2)
|
|
470
|
+
- ``reverse`` -- boolean (default: ``True``)
|
|
471
|
+
|
|
472
|
+
OUTPUT: list of integers
|
|
473
|
+
|
|
474
|
+
When `p=2`: decreasing list of the degrees of the `\xi_i`'s with
|
|
475
|
+
degree at most `n`.
|
|
476
|
+
|
|
477
|
+
At odd primes: decreasing list of these degrees, each divided by
|
|
478
|
+
`2(p-1)`.
|
|
479
|
+
|
|
480
|
+
If ``reverse`` is ``False``, then return an increasing list rather
|
|
481
|
+
than a decreasing one.
|
|
482
|
+
|
|
483
|
+
EXAMPLES::
|
|
484
|
+
|
|
485
|
+
sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17)
|
|
486
|
+
[15, 7, 3, 1]
|
|
487
|
+
sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17, reverse=False)
|
|
488
|
+
[1, 3, 7, 15]
|
|
489
|
+
sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17, p=3)
|
|
490
|
+
[13, 4, 1]
|
|
491
|
+
sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(400, p=17)
|
|
492
|
+
[307, 18, 1]
|
|
493
|
+
"""
|
|
494
|
+
from sage.rings.integer import Integer
|
|
495
|
+
if n <= 0:
|
|
496
|
+
return []
|
|
497
|
+
N = Integer(n*(p-1) + 1)
|
|
498
|
+
l = [(p**d-1)//(p-1) for d in range(1, N.exact_log(p)+1)]
|
|
499
|
+
if reverse:
|
|
500
|
+
l.reverse()
|
|
501
|
+
return l
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
########################################################
|
|
505
|
+
# Functions for defining bases.
|
|
506
|
+
|
|
507
|
+
# These should each return a tuple of tuples of the appropriate form
|
|
508
|
+
# for the basis. For example, at the prime 2, the Milnor basis
|
|
509
|
+
# element Sq(a,b,c,...) corresponds to the tuple (a, b, c, ...), while
|
|
510
|
+
# at odd primes, the element Q_i Q_j ... P(a, b, ...) corresponds to
|
|
511
|
+
# the pair ((i, j, ...), (a, b, ...)). See each function for more
|
|
512
|
+
# information.
|
|
513
|
+
|
|
514
|
+
def milnor_basis(n, p=2, **kwds):
|
|
515
|
+
r"""
|
|
516
|
+
Milnor basis in dimension `n` with profile function ``profile``.
|
|
517
|
+
|
|
518
|
+
INPUT:
|
|
519
|
+
|
|
520
|
+
- ``n`` -- nonnegative integer
|
|
521
|
+
|
|
522
|
+
- ``p`` -- positive prime number (default: 2)
|
|
523
|
+
|
|
524
|
+
- ``profile`` -- profile function (default: ``None``).
|
|
525
|
+
Together with ``truncation_type``, specify the profile function
|
|
526
|
+
to be used; ``None`` means the profile function for the entire
|
|
527
|
+
Steenrod algebra. See
|
|
528
|
+
:mod:`sage.algebras.steenrod.steenrod_algebra` and
|
|
529
|
+
:func:`SteenrodAlgebra <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra>`
|
|
530
|
+
for information on profile functions.
|
|
531
|
+
|
|
532
|
+
- ``truncation_type`` -- truncation type, either 0 or ``Infinity``
|
|
533
|
+
(default: ``Infinity`` if no profile function is specified,
|
|
534
|
+
0 otherwise)
|
|
535
|
+
|
|
536
|
+
OUTPUT: tuple of mod `p` Milnor basis elements in dimension `n`
|
|
537
|
+
|
|
538
|
+
At the prime 2, the Milnor basis consists of symbols of the form
|
|
539
|
+
`\text{Sq}(m_1, m_2, ..., m_t)`, where each
|
|
540
|
+
`m_i` is a nonnegative integer and if `t>1`, then
|
|
541
|
+
`m_t \neq 0`. At odd primes, it consists of symbols of the
|
|
542
|
+
form `Q_{e_1} Q_{e_2} ... P(m_1, m_2, ..., m_t)`,
|
|
543
|
+
where `0 \leq e_1 < e_2 < ...`, each `m_i` is a
|
|
544
|
+
nonnegative integer, and if `t>1`, then
|
|
545
|
+
`m_t \neq 0`.
|
|
546
|
+
|
|
547
|
+
EXAMPLES::
|
|
548
|
+
|
|
549
|
+
sage: # needs sage.combinat
|
|
550
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import milnor_basis
|
|
551
|
+
sage: milnor_basis(7)
|
|
552
|
+
((0, 0, 1), (1, 2), (4, 1), (7,))
|
|
553
|
+
sage: milnor_basis(7, 2)
|
|
554
|
+
((0, 0, 1), (1, 2), (4, 1), (7,))
|
|
555
|
+
sage: milnor_basis(4, 2)
|
|
556
|
+
((1, 1), (4,))
|
|
557
|
+
sage: milnor_basis(4, 2, profile=[2,1])
|
|
558
|
+
((1, 1),)
|
|
559
|
+
sage: milnor_basis(4, 2, profile=(), truncation_type=0)
|
|
560
|
+
()
|
|
561
|
+
sage: milnor_basis(4, 2, profile=(), truncation_type=Infinity)
|
|
562
|
+
((1, 1), (4,))
|
|
563
|
+
sage: milnor_basis(9, 3)
|
|
564
|
+
(((1,), (1,)), ((0,), (2,)))
|
|
565
|
+
sage: milnor_basis(17, 3)
|
|
566
|
+
(((2,), ()), ((1,), (3,)), ((0,), (0, 1)), ((0,), (4,)))
|
|
567
|
+
sage: milnor_basis(48, p=5)
|
|
568
|
+
(((), (0, 1)), ((), (6,)))
|
|
569
|
+
sage: len(milnor_basis(100,3))
|
|
570
|
+
13
|
|
571
|
+
sage: len(milnor_basis(200,7))
|
|
572
|
+
0
|
|
573
|
+
sage: len(milnor_basis(240,7))
|
|
574
|
+
3
|
|
575
|
+
sage: len(milnor_basis(240,7, profile=((),()), truncation_type=Infinity))
|
|
576
|
+
3
|
|
577
|
+
sage: len(milnor_basis(240,7, profile=((),()), truncation_type=0))
|
|
578
|
+
0
|
|
579
|
+
"""
|
|
580
|
+
generic = kwds.get('generic', p != 2)
|
|
581
|
+
|
|
582
|
+
if n == 0:
|
|
583
|
+
if not generic:
|
|
584
|
+
return ((),)
|
|
585
|
+
else:
|
|
586
|
+
return (((), ()),)
|
|
587
|
+
|
|
588
|
+
from sage.rings.infinity import Infinity
|
|
589
|
+
from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
|
|
590
|
+
profile = kwds.get("profile", None)
|
|
591
|
+
trunc = kwds.get("truncation_type", None)
|
|
592
|
+
if trunc is None:
|
|
593
|
+
if profile is not None:
|
|
594
|
+
trunc = 0
|
|
595
|
+
else:
|
|
596
|
+
trunc = Infinity
|
|
597
|
+
|
|
598
|
+
result = []
|
|
599
|
+
if not generic:
|
|
600
|
+
for mono in WeightedIntegerVectors(n, xi_degrees(n, reverse=False)):
|
|
601
|
+
exponents = list(mono)
|
|
602
|
+
while exponents and exponents[-1] == 0:
|
|
603
|
+
exponents.pop(-1)
|
|
604
|
+
# check profile:
|
|
605
|
+
okay = True
|
|
606
|
+
if profile is not None and len(profile) > 0:
|
|
607
|
+
for i in range(len(exponents)):
|
|
608
|
+
if ((len(profile) > i and exponents[i] >= 2**profile[i])
|
|
609
|
+
or (len(profile) <= i and trunc < Infinity
|
|
610
|
+
and exponents[i] >= 2**trunc)):
|
|
611
|
+
okay = False
|
|
612
|
+
break
|
|
613
|
+
else:
|
|
614
|
+
# profile is empty
|
|
615
|
+
okay = (trunc == Infinity)
|
|
616
|
+
if okay:
|
|
617
|
+
result.append(tuple(exponents))
|
|
618
|
+
else: # p odd
|
|
619
|
+
# first find the P part of each basis element.
|
|
620
|
+
# in this part of the code (the P part), all dimensions are
|
|
621
|
+
# divided by 2(p-1).
|
|
622
|
+
for dim in range(n//(2*(p-1)) + 1):
|
|
623
|
+
if dim == 0:
|
|
624
|
+
P_result = [[0]]
|
|
625
|
+
else:
|
|
626
|
+
P_result = []
|
|
627
|
+
for mono in WeightedIntegerVectors(dim, xi_degrees(dim, p=p, reverse=False)):
|
|
628
|
+
p_mono = list(mono)
|
|
629
|
+
while p_mono and p_mono[-1] == 0:
|
|
630
|
+
p_mono.pop(-1)
|
|
631
|
+
if p_mono:
|
|
632
|
+
P_result.append(p_mono)
|
|
633
|
+
# now find the Q part of the basis element.
|
|
634
|
+
# dimensions here are back to normal.
|
|
635
|
+
for p_mono in P_result:
|
|
636
|
+
deg = n - 2*dim*(p-1)
|
|
637
|
+
q_degrees = [1+2*(p-1)*d for d in
|
|
638
|
+
xi_degrees(int((deg - 1)//(2*(p-1))), p)] + [1]
|
|
639
|
+
q_degrees_decrease = q_degrees
|
|
640
|
+
q_degrees.reverse()
|
|
641
|
+
if deg % (2*(p-1)) <= len(q_degrees):
|
|
642
|
+
# if this inequality fails, no way to have a partition
|
|
643
|
+
# with distinct parts.
|
|
644
|
+
for sigma in restricted_partitions(deg,
|
|
645
|
+
q_degrees_decrease,
|
|
646
|
+
no_repeats=True):
|
|
647
|
+
index = 0
|
|
648
|
+
q_mono = []
|
|
649
|
+
for q in q_degrees:
|
|
650
|
+
if q in sigma:
|
|
651
|
+
q_mono.append(index)
|
|
652
|
+
index += 1
|
|
653
|
+
# check profile:
|
|
654
|
+
okay = True
|
|
655
|
+
if profile is not None and (len(profile[0]) > 0
|
|
656
|
+
or len(profile[1]) > 0):
|
|
657
|
+
# check profile function for q_mono
|
|
658
|
+
for i in q_mono:
|
|
659
|
+
if ((len(profile[1]) > i and profile[1][i] == 1)
|
|
660
|
+
or (len(profile[1]) <= i and trunc == 0)):
|
|
661
|
+
okay = False
|
|
662
|
+
break
|
|
663
|
+
# check profile function for p_mono
|
|
664
|
+
for i in range(len(p_mono)):
|
|
665
|
+
if okay and ((len(profile[0]) > i and p_mono[i] >= p**profile[0][i])
|
|
666
|
+
or (len(profile[0]) <= i and trunc < Infinity
|
|
667
|
+
and p_mono[i] >= p**trunc)):
|
|
668
|
+
okay = False
|
|
669
|
+
break
|
|
670
|
+
else:
|
|
671
|
+
# profile is empty
|
|
672
|
+
okay = (trunc == Infinity)
|
|
673
|
+
if okay:
|
|
674
|
+
if list(p_mono) == [0]:
|
|
675
|
+
p_mono = []
|
|
676
|
+
result.append((tuple(q_mono), tuple(p_mono)))
|
|
677
|
+
return tuple(result)
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
def serre_cartan_basis(n, p=2, bound=1, **kwds):
|
|
681
|
+
r"""
|
|
682
|
+
Serre-Cartan basis in dimension `n`.
|
|
683
|
+
|
|
684
|
+
INPUT:
|
|
685
|
+
|
|
686
|
+
- ``n`` -- nonnegative integer
|
|
687
|
+
- ``bound`` -- positive integer (optional)
|
|
688
|
+
- ``prime`` -- positive prime number (default: 2)
|
|
689
|
+
|
|
690
|
+
OUTPUT: tuple of mod `p` Serre-Cartan basis elements in dimension `n`
|
|
691
|
+
|
|
692
|
+
The Serre-Cartan basis consists of 'admissible monomials in the
|
|
693
|
+
Steenrod squares'. Thus at the prime 2, it consists of monomials
|
|
694
|
+
`\text{Sq}^{m_1} \text{Sq}^{m_2} ... \text{Sq}^{m_t}` with `m_i
|
|
695
|
+
\geq 2m_{i+1}` for each `i`. At odd primes, it consists of
|
|
696
|
+
monomials `\beta^{e_0} P^{s_1} \beta^{e_1} P^{s_2} ... P^{s_k}
|
|
697
|
+
\beta^{e_k}` with each `e_i` either 0 or 1, `s_i \geq p s_{i+1} +
|
|
698
|
+
e_i` for all `i`, and `s_k \geq 1`.
|
|
699
|
+
|
|
700
|
+
EXAMPLES::
|
|
701
|
+
|
|
702
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import serre_cartan_basis
|
|
703
|
+
sage: serre_cartan_basis(7)
|
|
704
|
+
((7,), (6, 1), (4, 2, 1), (5, 2))
|
|
705
|
+
sage: serre_cartan_basis(13,3)
|
|
706
|
+
((1, 3, 0), (0, 3, 1))
|
|
707
|
+
sage: serre_cartan_basis(50,5)
|
|
708
|
+
((1, 5, 0, 1, 1), (1, 6, 1))
|
|
709
|
+
|
|
710
|
+
If optional argument ``bound`` is present, include only those monomials
|
|
711
|
+
whose last term is at least ``bound`` (when `p=2`), or those for which
|
|
712
|
+
`s_k - e_k \geq bound` (when `p` is odd). ::
|
|
713
|
+
|
|
714
|
+
sage: serre_cartan_basis(7, bound=2)
|
|
715
|
+
((7,), (5, 2))
|
|
716
|
+
sage: serre_cartan_basis(13, 3, bound=3)
|
|
717
|
+
((1, 3, 0),)
|
|
718
|
+
"""
|
|
719
|
+
generic = kwds.get('generic', p != 2)
|
|
720
|
+
|
|
721
|
+
if n == 0:
|
|
722
|
+
return ((),)
|
|
723
|
+
else:
|
|
724
|
+
if not generic:
|
|
725
|
+
# Build basis recursively. last = last term.
|
|
726
|
+
# last is >= bound, and we will append (last,) to the end of
|
|
727
|
+
# elements from serre_cartan_basis (n - last, bound=2 * last).
|
|
728
|
+
# This means that 2 last <= n - last, or 3 last <= n.
|
|
729
|
+
result = [(n,)]
|
|
730
|
+
for last in range(bound, 1+n//3):
|
|
731
|
+
for vec in serre_cartan_basis(n - last, bound=2 * last):
|
|
732
|
+
new = vec + (last,)
|
|
733
|
+
result.append(new)
|
|
734
|
+
else: # p odd
|
|
735
|
+
if n % (2 * (p-1)) == 0 and n//(2 * (p-1)) >= bound:
|
|
736
|
+
result = [(0, int(n//(2 * (p-1))), 0)]
|
|
737
|
+
elif n == 1:
|
|
738
|
+
result = [(1,)]
|
|
739
|
+
else:
|
|
740
|
+
result = []
|
|
741
|
+
# 2 cases: append P^{last}, or append P^{last} beta
|
|
742
|
+
# case 1: append P^{last}
|
|
743
|
+
for last in range(bound, 1+n//(2*(p - 1))):
|
|
744
|
+
if n - 2*(p-1)*last > 0:
|
|
745
|
+
for vec in serre_cartan_basis(n - 2*(p-1)*last,
|
|
746
|
+
p, p*last, generic=generic):
|
|
747
|
+
result.append(vec + (last,0))
|
|
748
|
+
# case 2: append P^{last} beta
|
|
749
|
+
if bound == 1:
|
|
750
|
+
bound = 0
|
|
751
|
+
for last in range(bound+1, 1+n//(2*(p - 1))):
|
|
752
|
+
basis = serre_cartan_basis(n - 2*(p-1)*last - 1,
|
|
753
|
+
p, p*last, generic=generic)
|
|
754
|
+
for vec in basis:
|
|
755
|
+
if vec == ():
|
|
756
|
+
vec = (0,)
|
|
757
|
+
new = vec + (last, 1)
|
|
758
|
+
result.append(new)
|
|
759
|
+
return tuple(result)
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
def atomic_basis(n, basis, **kwds):
|
|
763
|
+
r"""
|
|
764
|
+
Basis for dimension `n` made of elements in 'atomic' degrees:
|
|
765
|
+
degrees of the form `2^i (2^j - 1)`.
|
|
766
|
+
|
|
767
|
+
This works at the prime 2 only.
|
|
768
|
+
|
|
769
|
+
INPUT:
|
|
770
|
+
|
|
771
|
+
- ``n`` -- nonnegative integer
|
|
772
|
+
|
|
773
|
+
- ``basis`` -- string, the name of the basis
|
|
774
|
+
|
|
775
|
+
- ``profile`` -- profile function (default: ``None``).
|
|
776
|
+
Together with ``truncation_type``, specify the profile function
|
|
777
|
+
to be used; ``None`` means the profile function for the entire
|
|
778
|
+
Steenrod algebra. See
|
|
779
|
+
:mod:`sage.algebras.steenrod.steenrod_algebra` and
|
|
780
|
+
:func:`SteenrodAlgebra` for information on profile functions.
|
|
781
|
+
|
|
782
|
+
- ``truncation_type`` -- truncation type, either 0 or ``Infinity``
|
|
783
|
+
(default: ``Infinity`` if no profile function is specified,
|
|
784
|
+
0 otherwise).
|
|
785
|
+
|
|
786
|
+
OUTPUT: tuple of basis elements in dimension `n`
|
|
787
|
+
|
|
788
|
+
The atomic bases include Wood's Y and Z bases, Wall's basis,
|
|
789
|
+
Arnon's A basis, the `P^s_t`-bases, and the commutator
|
|
790
|
+
bases. (All of these bases are constructed similarly, hence their
|
|
791
|
+
constructions have been consolidated into a single function. Also,
|
|
792
|
+
see the documentation for :func:`steenrod_algebra_basis` for
|
|
793
|
+
descriptions of them.) For `P^s_t`-bases, you may also specify a
|
|
794
|
+
profile function and truncation type; profile functions are ignored
|
|
795
|
+
for the other bases.
|
|
796
|
+
|
|
797
|
+
EXAMPLES::
|
|
798
|
+
|
|
799
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import atomic_basis
|
|
800
|
+
sage: atomic_basis(6,'woody')
|
|
801
|
+
(((1, 0), (0, 1), (0, 0)), ((2, 0), (1, 0)), ((1, 1),))
|
|
802
|
+
sage: atomic_basis(8,'woodz')
|
|
803
|
+
(((2, 0), (0, 1), (0, 0)), ((0, 2), (0, 0)), ((1, 1), (1, 0)), ((3, 0),))
|
|
804
|
+
sage: atomic_basis(6,'woodz') == atomic_basis(6, 'woody')
|
|
805
|
+
True
|
|
806
|
+
sage: atomic_basis(9,'woodz') == atomic_basis(9, 'woody')
|
|
807
|
+
False
|
|
808
|
+
|
|
809
|
+
Wall's basis::
|
|
810
|
+
|
|
811
|
+
sage: atomic_basis(8,'wall')
|
|
812
|
+
(((2, 2), (1, 0), (0, 0)), ((2, 0), (0, 0)), ((2, 1), (1, 1)), ((3, 3),))
|
|
813
|
+
|
|
814
|
+
Arnon's A basis::
|
|
815
|
+
|
|
816
|
+
sage: atomic_basis(7,'arnona')
|
|
817
|
+
(((0, 0), (1, 1), (2, 2)), ((0, 0), (2, 1)), ((1, 0), (2, 2)), ((2, 0),))
|
|
818
|
+
|
|
819
|
+
`P^s_t`-bases::
|
|
820
|
+
|
|
821
|
+
sage: atomic_basis(7,'pst_rlex')
|
|
822
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((2, 1), (0, 2)), ((0, 3),))
|
|
823
|
+
sage: atomic_basis(7,'pst_llex')
|
|
824
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
825
|
+
sage: atomic_basis(7,'pst_deg')
|
|
826
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
827
|
+
sage: atomic_basis(7,'pst_revz')
|
|
828
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
829
|
+
|
|
830
|
+
Commutator bases::
|
|
831
|
+
|
|
832
|
+
sage: atomic_basis(7,'comm_rlex')
|
|
833
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((2, 1), (0, 2)), ((0, 3),))
|
|
834
|
+
sage: atomic_basis(7,'comm_llex')
|
|
835
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
836
|
+
sage: atomic_basis(7,'comm_deg')
|
|
837
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
838
|
+
sage: atomic_basis(7,'comm_revz')
|
|
839
|
+
(((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
|
|
840
|
+
"""
|
|
841
|
+
def degree_dictionary(n, basis):
|
|
842
|
+
"""
|
|
843
|
+
Dictionary of atomic degrees for basis up to degree `n`.
|
|
844
|
+
|
|
845
|
+
The keys for the dictionary are the atomic degrees -- the numbers of
|
|
846
|
+
the form `2^i (2^j - 1)` -- which are less than or equal to `n`. The value
|
|
847
|
+
associated to such a degree depends on basis; it has the form
|
|
848
|
+
`(s,t)`, where `(s,t)` is a pair of integers which indexes the
|
|
849
|
+
corresponding element.
|
|
850
|
+
"""
|
|
851
|
+
dict = {}
|
|
852
|
+
if basis.find('wood') >= 0:
|
|
853
|
+
k = 0
|
|
854
|
+
m = 0
|
|
855
|
+
deg = 2**m * (2**(k+1) - 1)
|
|
856
|
+
while deg <= n:
|
|
857
|
+
dict[deg] = (m,k)
|
|
858
|
+
if m > 0:
|
|
859
|
+
m = m - 1
|
|
860
|
+
k = k + 1
|
|
861
|
+
else:
|
|
862
|
+
m = k + 1
|
|
863
|
+
k = 0
|
|
864
|
+
deg = 2**m * (2**(k+1) - 1)
|
|
865
|
+
elif basis.find('wall') >= 0 or basis.find('arnon') >= 0:
|
|
866
|
+
k = 0
|
|
867
|
+
m = 0
|
|
868
|
+
deg = 2**k * (2**(m-k+1) - 1)
|
|
869
|
+
while deg <= n:
|
|
870
|
+
dict[deg] = (m,k)
|
|
871
|
+
if k == 0:
|
|
872
|
+
m = m + 1
|
|
873
|
+
k = m
|
|
874
|
+
else:
|
|
875
|
+
k = k - 1
|
|
876
|
+
deg = 2**k * (2**(m-k+1) - 1)
|
|
877
|
+
elif basis.find('pst') >= 0 or basis.find('comm') >= 0:
|
|
878
|
+
s = 0
|
|
879
|
+
t = 1
|
|
880
|
+
deg = 2**s * (2**t - 1)
|
|
881
|
+
while deg <= n:
|
|
882
|
+
if basis.find('pst') >= 0:
|
|
883
|
+
dict[deg] = (s,t)
|
|
884
|
+
else: # comm
|
|
885
|
+
dict[deg] = (s,t)
|
|
886
|
+
if s == 0:
|
|
887
|
+
s = t
|
|
888
|
+
t = 1
|
|
889
|
+
else:
|
|
890
|
+
s = s - 1
|
|
891
|
+
t = t + 1
|
|
892
|
+
deg = 2**s * (2**t - 1)
|
|
893
|
+
return dict
|
|
894
|
+
|
|
895
|
+
def sorting_pair(s, t, basis): # pair used for sorting the basis
|
|
896
|
+
if basis.find('wood') >= 0 and basis.find('z') >= 0:
|
|
897
|
+
return (-s-t,-s)
|
|
898
|
+
elif basis.find('wood') >= 0 or basis.find('wall') >= 0 or \
|
|
899
|
+
basis.find('arnon') >= 0:
|
|
900
|
+
return (-s,-t)
|
|
901
|
+
elif basis.find('rlex') >= 0:
|
|
902
|
+
return (t,s)
|
|
903
|
+
elif basis.find('llex') >= 0:
|
|
904
|
+
return (s,t)
|
|
905
|
+
elif basis.find('deg') >= 0:
|
|
906
|
+
return (s+t,t)
|
|
907
|
+
elif basis.find('revz') >= 0:
|
|
908
|
+
return (s+t,s)
|
|
909
|
+
|
|
910
|
+
from sage.rings.infinity import Infinity
|
|
911
|
+
profile = kwds.get("profile", None)
|
|
912
|
+
trunc = kwds.get("truncation_type", None)
|
|
913
|
+
if profile is not None and trunc is None:
|
|
914
|
+
trunc = 0
|
|
915
|
+
|
|
916
|
+
if n == 0:
|
|
917
|
+
return ((),)
|
|
918
|
+
else:
|
|
919
|
+
result = []
|
|
920
|
+
degrees_etc = degree_dictionary(n, basis)
|
|
921
|
+
degrees = list(degrees_etc)
|
|
922
|
+
for sigma in restricted_partitions(n, degrees, no_repeats=True):
|
|
923
|
+
big_list = [degrees_etc[part] for part in sigma]
|
|
924
|
+
big_list.sort(key=lambda x: sorting_pair(x[0], x[1], basis))
|
|
925
|
+
# reverse = True)
|
|
926
|
+
# arnon: sort like wall, then reverse end result
|
|
927
|
+
if basis.find('arnon') >= 0:
|
|
928
|
+
big_list.reverse()
|
|
929
|
+
|
|
930
|
+
# check profile:
|
|
931
|
+
okay = True
|
|
932
|
+
if basis.find('pst') >= 0:
|
|
933
|
+
if profile is not None and len(profile) > 0:
|
|
934
|
+
for (s,t) in big_list:
|
|
935
|
+
if ((len(profile) > t-1 and profile[t-1] <= s)
|
|
936
|
+
or (len(profile) <= t-1 and trunc < Infinity)):
|
|
937
|
+
okay = False
|
|
938
|
+
break
|
|
939
|
+
if okay:
|
|
940
|
+
result.append(tuple(big_list))
|
|
941
|
+
return tuple(result)
|
|
942
|
+
|
|
943
|
+
|
|
944
|
+
@cached_function
|
|
945
|
+
def arnonC_basis(n, bound=1):
|
|
946
|
+
r"""
|
|
947
|
+
Arnon's C basis in dimension `n`.
|
|
948
|
+
|
|
949
|
+
INPUT:
|
|
950
|
+
|
|
951
|
+
- ``n`` -- nonnegative integer
|
|
952
|
+
|
|
953
|
+
- ``bound`` -- positive integer (optional)
|
|
954
|
+
|
|
955
|
+
OUTPUT: tuple of basis elements in dimension `n`
|
|
956
|
+
|
|
957
|
+
The elements of Arnon's C basis are monomials of the form
|
|
958
|
+
`\text{Sq}^{t_1} ... \text{Sq}^{t_m}` where for each
|
|
959
|
+
`i`, we have `t_i \leq 2t_{i+1}` and
|
|
960
|
+
`2^i | t_{m-i}`.
|
|
961
|
+
|
|
962
|
+
EXAMPLES::
|
|
963
|
+
|
|
964
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import arnonC_basis
|
|
965
|
+
sage: arnonC_basis(7)
|
|
966
|
+
((7,), (2, 5), (4, 3), (4, 2, 1))
|
|
967
|
+
|
|
968
|
+
If optional argument ``bound`` is present, include only those monomials
|
|
969
|
+
whose first term is at least as large as ``bound``::
|
|
970
|
+
|
|
971
|
+
sage: arnonC_basis(7,3)
|
|
972
|
+
((7,), (4, 3), (4, 2, 1))
|
|
973
|
+
"""
|
|
974
|
+
if n == 0:
|
|
975
|
+
return ((),)
|
|
976
|
+
|
|
977
|
+
# Build basis recursively. first = first term.
|
|
978
|
+
# first is >= bound, and we will prepend (first,) to the
|
|
979
|
+
# elements from arnonC_basis (n - first, first / 2).
|
|
980
|
+
# first also must be divisible by 2**(len(old-basis-elt))
|
|
981
|
+
# This means that 3 first <= 2 n.
|
|
982
|
+
result = [(n,)]
|
|
983
|
+
for first in range(bound, 1 + 2 * n // 3):
|
|
984
|
+
tup = (first,)
|
|
985
|
+
result.extend(tup + vec
|
|
986
|
+
for vec in arnonC_basis(n - first, max(first // 2, 1))
|
|
987
|
+
if not first % 2**len(vec))
|
|
988
|
+
return tuple(result)
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
def atomic_basis_odd(n, basis, p, **kwds):
|
|
992
|
+
r"""
|
|
993
|
+
`P^s_t`-bases and commutator basis in dimension `n` at odd primes.
|
|
994
|
+
|
|
995
|
+
This function is called ``atomic_basis_odd`` in analogy with
|
|
996
|
+
:func:`atomic_basis`.
|
|
997
|
+
|
|
998
|
+
INPUT:
|
|
999
|
+
|
|
1000
|
+
- ``n`` -- nonnegative integer
|
|
1001
|
+
|
|
1002
|
+
- ``basis`` -- string, the name of the basis
|
|
1003
|
+
|
|
1004
|
+
- ``p`` -- positive prime number
|
|
1005
|
+
|
|
1006
|
+
- ``profile`` -- profile function (default: ``None``).
|
|
1007
|
+
Together with ``truncation_type``, specify the profile function
|
|
1008
|
+
to be used; ``None`` means the profile function for the entire
|
|
1009
|
+
Steenrod algebra. See
|
|
1010
|
+
:mod:`sage.algebras.steenrod.steenrod_algebra` and
|
|
1011
|
+
:func:`SteenrodAlgebra` for information on profile functions.
|
|
1012
|
+
|
|
1013
|
+
- ``truncation_type`` -- truncation type, either 0 or ``Infinity``
|
|
1014
|
+
(default: ``Infinity`` if no profile function is specified,
|
|
1015
|
+
0 otherwise).
|
|
1016
|
+
|
|
1017
|
+
OUTPUT: tuple of basis elements in dimension `n`
|
|
1018
|
+
|
|
1019
|
+
The only possible difference in the implementations for `P^s_t`
|
|
1020
|
+
bases and commutator bases is that the former make sense, and
|
|
1021
|
+
require filtering, if there is a nontrivial profile function.
|
|
1022
|
+
This function is called by :func:`steenrod_algebra_basis`, and it
|
|
1023
|
+
will not be called for commutator bases if there is a profile
|
|
1024
|
+
function, so we treat the two bases exactly the same.
|
|
1025
|
+
|
|
1026
|
+
EXAMPLES::
|
|
1027
|
+
|
|
1028
|
+
sage: # needs sage.combinat
|
|
1029
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import atomic_basis_odd
|
|
1030
|
+
sage: atomic_basis_odd(8, 'pst_rlex', 3)
|
|
1031
|
+
(((), (((0, 1), 2),)),)
|
|
1032
|
+
sage: atomic_basis_odd(18, 'pst_rlex', 3)
|
|
1033
|
+
(((0, 2), ()), ((0, 1), (((1, 1), 1),)))
|
|
1034
|
+
sage: atomic_basis_odd(18, 'pst_rlex', 3, profile=((), (2,2,2)))
|
|
1035
|
+
(((0, 2), ()),)
|
|
1036
|
+
"""
|
|
1037
|
+
def sorting_pair(s, t, basis): # pair used for sorting the basis
|
|
1038
|
+
if basis.find('rlex') >= 0:
|
|
1039
|
+
return (t, s)
|
|
1040
|
+
elif basis.find('llex') >= 0:
|
|
1041
|
+
return (s, t)
|
|
1042
|
+
elif basis.find('deg') >= 0:
|
|
1043
|
+
return (s + t, t)
|
|
1044
|
+
elif basis.find('revz') >= 0:
|
|
1045
|
+
return (s + t, s)
|
|
1046
|
+
|
|
1047
|
+
generic = kwds.get('generic', p != 2)
|
|
1048
|
+
if n == 0:
|
|
1049
|
+
if not generic:
|
|
1050
|
+
return ((),)
|
|
1051
|
+
else:
|
|
1052
|
+
return (((), ()),)
|
|
1053
|
+
|
|
1054
|
+
from sage.rings.integer import Integer
|
|
1055
|
+
from sage.rings.infinity import Infinity
|
|
1056
|
+
from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
|
|
1057
|
+
profile = kwds.get("profile", None)
|
|
1058
|
+
trunc = kwds.get("truncation_type", 0)
|
|
1059
|
+
|
|
1060
|
+
result = []
|
|
1061
|
+
for dim in range(n//(2*p-2) + 1):
|
|
1062
|
+
P_result = []
|
|
1063
|
+
for v in WeightedIntegerVectors(dim, xi_degrees(dim, p=p, reverse=False)):
|
|
1064
|
+
mono = []
|
|
1065
|
+
for t, a in enumerate(v):
|
|
1066
|
+
for s, pow in enumerate(Integer(a).digits(p)):
|
|
1067
|
+
if pow > 0:
|
|
1068
|
+
mono.append(((s, t+1), pow))
|
|
1069
|
+
P_result.append(mono)
|
|
1070
|
+
for p_mono in P_result:
|
|
1071
|
+
p_mono.sort(key=lambda x: sorting_pair(x[0][0], x[0][1], basis))
|
|
1072
|
+
deg = n - 2*dim*(p-1)
|
|
1073
|
+
q_degrees = [1+2*(p-1)*d for d in
|
|
1074
|
+
xi_degrees((deg - 1)//(2*(p-1)), p)] + [1]
|
|
1075
|
+
q_degrees_decrease = q_degrees
|
|
1076
|
+
q_degrees.reverse()
|
|
1077
|
+
if deg % (2*(p-1)) <= len(q_degrees):
|
|
1078
|
+
# if this inequality fails, no way to have a partition
|
|
1079
|
+
# with distinct parts.
|
|
1080
|
+
for sigma in restricted_partitions(deg,
|
|
1081
|
+
q_degrees_decrease,
|
|
1082
|
+
no_repeats=True):
|
|
1083
|
+
q_mono = [index for index, q in enumerate(q_degrees)
|
|
1084
|
+
if q in sigma]
|
|
1085
|
+
# check profile:
|
|
1086
|
+
okay = True
|
|
1087
|
+
if profile is not None and profile != ((), ()):
|
|
1088
|
+
# check profile function for q_mono
|
|
1089
|
+
for i in q_mono:
|
|
1090
|
+
if ((len(profile[1]) > i and profile[1][i] == 1)
|
|
1091
|
+
or (len(profile[1]) <= i and trunc == 0)):
|
|
1092
|
+
okay = False
|
|
1093
|
+
break
|
|
1094
|
+
|
|
1095
|
+
for ((s, t), _) in p_mono:
|
|
1096
|
+
if ((len(profile[0]) > t-1 and profile[0][t-1] <= s)
|
|
1097
|
+
or (len(profile[0]) <= t-1 and trunc < Infinity)):
|
|
1098
|
+
okay = False
|
|
1099
|
+
break
|
|
1100
|
+
|
|
1101
|
+
if okay:
|
|
1102
|
+
if list(p_mono) == [0]:
|
|
1103
|
+
p_mono = []
|
|
1104
|
+
result.append((tuple(q_mono), tuple(p_mono)))
|
|
1105
|
+
return tuple(result)
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
#############################################################################
|
|
1109
|
+
def steenrod_basis_error_check(dim, p, **kwds):
|
|
1110
|
+
"""
|
|
1111
|
+
This performs crude error checking.
|
|
1112
|
+
|
|
1113
|
+
INPUT:
|
|
1114
|
+
|
|
1115
|
+
- ``dim`` -- nonnegative integer
|
|
1116
|
+
- ``p`` -- positive prime number
|
|
1117
|
+
|
|
1118
|
+
OUTPUT: none
|
|
1119
|
+
|
|
1120
|
+
This checks to see if the different bases have the same length, and
|
|
1121
|
+
if the change-of-basis matrices are invertible. If something goes
|
|
1122
|
+
wrong, an error message is printed.
|
|
1123
|
+
|
|
1124
|
+
This function checks at the prime `p` as the dimension goes up
|
|
1125
|
+
from 0 to ``dim``.
|
|
1126
|
+
|
|
1127
|
+
If you set the Sage verbosity level to a positive integer (using
|
|
1128
|
+
``set_verbose(n)``), then some extra messages will be printed.
|
|
1129
|
+
|
|
1130
|
+
EXAMPLES::
|
|
1131
|
+
|
|
1132
|
+
sage: # long time
|
|
1133
|
+
sage: from sage.algebras.steenrod.steenrod_algebra_bases import steenrod_basis_error_check
|
|
1134
|
+
sage: steenrod_basis_error_check(15, 2)
|
|
1135
|
+
sage: steenrod_basis_error_check(15, 2, generic=True)
|
|
1136
|
+
sage: steenrod_basis_error_check(40, 3)
|
|
1137
|
+
sage: steenrod_basis_error_check(80, 5)
|
|
1138
|
+
"""
|
|
1139
|
+
from sage.misc.verbose import verbose
|
|
1140
|
+
generic = kwds.get('generic', p != 2)
|
|
1141
|
+
|
|
1142
|
+
if not generic:
|
|
1143
|
+
bases = ('adem','woody', 'woodz', 'wall', 'arnona', 'arnonc',
|
|
1144
|
+
'pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz',
|
|
1145
|
+
'comm_rlex', 'comm_llex', 'comm_deg', 'comm_revz')
|
|
1146
|
+
else:
|
|
1147
|
+
bases = ('adem',
|
|
1148
|
+
'pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz',
|
|
1149
|
+
'comm_rlex', 'comm_llex', 'comm_deg', 'comm_revz')
|
|
1150
|
+
|
|
1151
|
+
for i in range(dim):
|
|
1152
|
+
if i % 5 == 0:
|
|
1153
|
+
verbose("up to dimension %s" % i)
|
|
1154
|
+
milnor_dim = len(steenrod_algebra_basis.f(i,'milnor',p=p,generic=generic))
|
|
1155
|
+
for B in bases:
|
|
1156
|
+
if milnor_dim != len(steenrod_algebra_basis.f(i,B,p,generic=generic)):
|
|
1157
|
+
print("problem with milnor/{} in dimension {}".format(B, i))
|
|
1158
|
+
mat = convert_to_milnor_matrix.f(i,B,p,generic=generic)
|
|
1159
|
+
if mat.nrows() != 0 and not mat.is_invertible():
|
|
1160
|
+
print("%s invertibility problem in dim %s at p=%s" % (B, i, p))
|
|
1161
|
+
|
|
1162
|
+
verbose("done checking, no profiles")
|
|
1163
|
+
|
|
1164
|
+
bases = ('pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz')
|
|
1165
|
+
if not generic:
|
|
1166
|
+
profiles = [(4,3,2,1), (2,2,3,1,1), (0,0,0,2)]
|
|
1167
|
+
else:
|
|
1168
|
+
profiles = [((3,2,1), ()), ((), (2,1,2)), ((3,2,1), (2,2,2,2))]
|
|
1169
|
+
|
|
1170
|
+
for i in range(dim):
|
|
1171
|
+
if i % 5 == 0:
|
|
1172
|
+
verbose("up to dimension %s" % i)
|
|
1173
|
+
for pro in profiles:
|
|
1174
|
+
milnor_dim = len(steenrod_algebra_basis.f(i,'milnor',p=p,profile=pro,generic=generic))
|
|
1175
|
+
for B in bases:
|
|
1176
|
+
if milnor_dim != len(steenrod_algebra_basis.f(i,B,p,profile=pro,generic=generic)):
|
|
1177
|
+
print("problem with milnor/%s in dimension %s with profile %s" % (B, i, pro))
|
|
1178
|
+
|
|
1179
|
+
verbose("done checking with profiles")
|