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,719 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Punctured code
|
|
5
|
+
|
|
6
|
+
Let `C` be a linear code. Let `C_i` be the set of all words of `C` with the
|
|
7
|
+
`i`-th coordinate being removed. `C_i` is the punctured code of `C`
|
|
8
|
+
on the `i`-th position.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
#*****************************************************************************
|
|
12
|
+
# Copyright (C) 2015 David Lucas <david.lucas@inria.fr>
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
# http://www.gnu.org/licenses/
|
|
19
|
+
#*****************************************************************************
|
|
20
|
+
|
|
21
|
+
from .linear_code import AbstractLinearCode
|
|
22
|
+
from .encoder import Encoder
|
|
23
|
+
from .decoder import Decoder, DecodingError
|
|
24
|
+
from sage.misc.cachefunc import cached_method
|
|
25
|
+
from sage.rings.integer import Integer
|
|
26
|
+
from sage.modules.free_module import VectorSpace
|
|
27
|
+
from sage.modules.free_module_element import vector
|
|
28
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
29
|
+
from copy import copy
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _puncture(v, points):
|
|
33
|
+
r"""
|
|
34
|
+
Return v punctured as the positions listed in ``points``.
|
|
35
|
+
|
|
36
|
+
INPUT:
|
|
37
|
+
|
|
38
|
+
- ``v`` -- a vector or a list of vectors
|
|
39
|
+
|
|
40
|
+
- ``points`` -- set of integers, or an integer
|
|
41
|
+
|
|
42
|
+
EXAMPLES::
|
|
43
|
+
|
|
44
|
+
sage: v = vector(GF(7), (2,3,0,2,1,5,1,5,6,5,3))
|
|
45
|
+
sage: from sage.coding.punctured_code import _puncture
|
|
46
|
+
sage: _puncture(v, {4, 3})
|
|
47
|
+
(2, 3, 0, 5, 1, 5, 6, 5, 3)
|
|
48
|
+
"""
|
|
49
|
+
if not isinstance(points, (Integer, int, set)):
|
|
50
|
+
raise TypeError("points must be either a Sage Integer, a Python int, or a set")
|
|
51
|
+
if isinstance(v, list):
|
|
52
|
+
size = len(v[0])
|
|
53
|
+
S = VectorSpace(v[0].base_ring(), size - len(points))
|
|
54
|
+
l = []
|
|
55
|
+
for i in v:
|
|
56
|
+
new_v = [i[j] for j in range(size) if j not in points]
|
|
57
|
+
l.append(S(new_v))
|
|
58
|
+
return l
|
|
59
|
+
S = VectorSpace(v.base_ring(), len(v) - len(points))
|
|
60
|
+
new_v = [v[i] for i in range(len(v)) if i not in points]
|
|
61
|
+
return S(new_v)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _insert_punctured_positions(l, punctured_points, value=None):
|
|
65
|
+
r"""
|
|
66
|
+
Return ``l`` with ``value`` inserted in the corresponding
|
|
67
|
+
position from ``punctured_points``.
|
|
68
|
+
|
|
69
|
+
INPUT:
|
|
70
|
+
|
|
71
|
+
- ``l`` -- list
|
|
72
|
+
|
|
73
|
+
- ``punctured_points`` -- set of integers
|
|
74
|
+
|
|
75
|
+
- ``value`` -- (default: ``None``) an element to insert in every position
|
|
76
|
+
given in``punctured_points``. If it is let to ``None``, a random value
|
|
77
|
+
will be chosen for each insertion.
|
|
78
|
+
|
|
79
|
+
EXAMPLES::
|
|
80
|
+
|
|
81
|
+
sage: from sage.coding.punctured_code import _insert_punctured_positions
|
|
82
|
+
sage: _insert_punctured_positions([1,2,3,4], {2,4,5}, 1)
|
|
83
|
+
[1, 2, 1, 3, 1, 1, 4]
|
|
84
|
+
"""
|
|
85
|
+
F = l[0].base_ring()
|
|
86
|
+
final = [None] * (len(l) + len(punctured_points))
|
|
87
|
+
for i in punctured_points:
|
|
88
|
+
if value is None:
|
|
89
|
+
final[i] = F.random_element()
|
|
90
|
+
else:
|
|
91
|
+
final[i] = value
|
|
92
|
+
index = 0
|
|
93
|
+
for i in range(len(final)):
|
|
94
|
+
if final[i] is None:
|
|
95
|
+
final[i] = l[index]
|
|
96
|
+
index += 1
|
|
97
|
+
return final
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class PuncturedCode(AbstractLinearCode):
|
|
101
|
+
r"""
|
|
102
|
+
Representation of a punctured code.
|
|
103
|
+
|
|
104
|
+
- ``C`` -- a linear code
|
|
105
|
+
|
|
106
|
+
- ``positions`` -- the positions where ``C`` will be punctured. It can be
|
|
107
|
+
either an integer if one need to puncture only one position, a list or a
|
|
108
|
+
set of positions to puncture. If the same position is passed several
|
|
109
|
+
times, it will be considered only once.
|
|
110
|
+
|
|
111
|
+
EXAMPLES::
|
|
112
|
+
|
|
113
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
114
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
115
|
+
sage: Cp
|
|
116
|
+
Puncturing of [11, 5] linear code over GF(7) on position(s) [3]
|
|
117
|
+
|
|
118
|
+
sage: Cp = codes.PuncturedCode(C, {3, 5})
|
|
119
|
+
sage: Cp
|
|
120
|
+
Puncturing of [11, 5] linear code over GF(7) on position(s) [3, 5]
|
|
121
|
+
"""
|
|
122
|
+
_registered_encoders = {}
|
|
123
|
+
_registered_decoders = {}
|
|
124
|
+
|
|
125
|
+
def __init__(self, C, positions):
|
|
126
|
+
r"""
|
|
127
|
+
TESTS:
|
|
128
|
+
|
|
129
|
+
If one of the positions to puncture is bigger than the length of ``C``,
|
|
130
|
+
an exception will be raised::
|
|
131
|
+
|
|
132
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
133
|
+
sage: Cp = codes.PuncturedCode(C, {4,8,15})
|
|
134
|
+
Traceback (most recent call last):
|
|
135
|
+
...
|
|
136
|
+
ValueError: Positions to puncture must be positive integers smaller
|
|
137
|
+
than the length of the provided code
|
|
138
|
+
"""
|
|
139
|
+
if not isinstance(positions, (Integer, int, set, list)):
|
|
140
|
+
raise TypeError("positions must be either a Sage Integer, a Python int, a set or a list")
|
|
141
|
+
if isinstance(positions, (list, set)) and not all(isinstance(i, (int, Integer)) for i in positions):
|
|
142
|
+
raise TypeError("if positions is a list or a set, it has to contain only Python ints or Sage Integers")
|
|
143
|
+
if isinstance(positions, (Integer, int)):
|
|
144
|
+
positions = {positions}
|
|
145
|
+
if isinstance(positions, list):
|
|
146
|
+
positions = set(positions)
|
|
147
|
+
if not isinstance(C, AbstractLinearCode):
|
|
148
|
+
raise ValueError("Provided code must be a linear code")
|
|
149
|
+
if not all(i in range(C.length()) for i in positions):
|
|
150
|
+
raise ValueError("Positions to puncture must be positive integers smaller than the length of the provided code")
|
|
151
|
+
super().__init__(C.base_ring(), C.length() - len(positions),
|
|
152
|
+
"PuncturedMatrix", "OriginalCode")
|
|
153
|
+
self._original_code = C
|
|
154
|
+
self._positions = positions
|
|
155
|
+
|
|
156
|
+
def __eq__(self, other):
|
|
157
|
+
r"""
|
|
158
|
+
Test equality between two Punctured codes.
|
|
159
|
+
|
|
160
|
+
EXAMPLES::
|
|
161
|
+
|
|
162
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
163
|
+
sage: Cp1 = codes.PuncturedCode(C, 2)
|
|
164
|
+
sage: Cp2 = codes.PuncturedCode(C, 2)
|
|
165
|
+
sage: Cp1 == Cp2
|
|
166
|
+
True
|
|
167
|
+
"""
|
|
168
|
+
return isinstance(other, PuncturedCode) \
|
|
169
|
+
and self.punctured_positions() == other.punctured_positions() \
|
|
170
|
+
and self.original_code() == other.original_code()
|
|
171
|
+
|
|
172
|
+
def _repr_(self):
|
|
173
|
+
r"""
|
|
174
|
+
Return a string representation of ``self``.
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
179
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
180
|
+
sage: Cp
|
|
181
|
+
Puncturing of [11, 5] linear code over GF(7) on position(s) [3]
|
|
182
|
+
"""
|
|
183
|
+
return "Puncturing of %s on position(s) %s"\
|
|
184
|
+
% (self.original_code(), list(self.punctured_positions()))
|
|
185
|
+
|
|
186
|
+
def _latex_(self):
|
|
187
|
+
r"""
|
|
188
|
+
Return a latex representation of ``self``.
|
|
189
|
+
|
|
190
|
+
EXAMPLES::
|
|
191
|
+
|
|
192
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
193
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
194
|
+
sage: latex(Cp)
|
|
195
|
+
\textnormal{Puncturing of [11, 5] linear code over GF(7) on position(s) } [3]
|
|
196
|
+
"""
|
|
197
|
+
return "\\textnormal{Puncturing of %s on position(s) } %s"\
|
|
198
|
+
% (self.original_code(), list(self.punctured_positions()))
|
|
199
|
+
|
|
200
|
+
def punctured_positions(self):
|
|
201
|
+
r"""
|
|
202
|
+
Return the list of positions which were punctured on the original code.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
207
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
208
|
+
sage: Cp.punctured_positions()
|
|
209
|
+
{3}
|
|
210
|
+
"""
|
|
211
|
+
return self._positions
|
|
212
|
+
|
|
213
|
+
def original_code(self):
|
|
214
|
+
r"""
|
|
215
|
+
Return the linear code which was punctured to get ``self``.
|
|
216
|
+
|
|
217
|
+
EXAMPLES::
|
|
218
|
+
|
|
219
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
220
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
221
|
+
sage: Cp.original_code()
|
|
222
|
+
[11, 5] linear code over GF(7)
|
|
223
|
+
"""
|
|
224
|
+
return self._original_code
|
|
225
|
+
|
|
226
|
+
def dimension(self):
|
|
227
|
+
r"""
|
|
228
|
+
Return the dimension of ``self``.
|
|
229
|
+
|
|
230
|
+
EXAMPLES::
|
|
231
|
+
|
|
232
|
+
sage: set_random_seed(42)
|
|
233
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
234
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
235
|
+
sage: Cp.dimension()
|
|
236
|
+
5
|
|
237
|
+
"""
|
|
238
|
+
if hasattr(self, '_dimension'):
|
|
239
|
+
return self._dimension
|
|
240
|
+
self._dimension = self.generator_matrix().rank()
|
|
241
|
+
return self._dimension
|
|
242
|
+
|
|
243
|
+
def random_element(self, *args, **kwds):
|
|
244
|
+
r"""
|
|
245
|
+
Return a random codeword of ``self``.
|
|
246
|
+
|
|
247
|
+
This method does not trigger the computation of
|
|
248
|
+
``self``'s :meth:`sage.coding.linear_code_no_metric.generator_matrix`.
|
|
249
|
+
|
|
250
|
+
INPUT:
|
|
251
|
+
|
|
252
|
+
- ``agrs``, ``kwds`` -- extra positional arguments passed to
|
|
253
|
+
:meth:`sage.modules.free_module.random_element`
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
258
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
259
|
+
sage: Cp.random_element() in Cp
|
|
260
|
+
True
|
|
261
|
+
"""
|
|
262
|
+
C_original = self.original_code()
|
|
263
|
+
m = (C_original.base_ring() ** C_original.dimension()).random_element()
|
|
264
|
+
c = C_original.encode(m)
|
|
265
|
+
return _puncture(c, self.punctured_positions())
|
|
266
|
+
|
|
267
|
+
def encode(self, m, original_encode=False, encoder_name=None, **kwargs):
|
|
268
|
+
r"""
|
|
269
|
+
Transform an element of the message space into an element of the code.
|
|
270
|
+
|
|
271
|
+
INPUT:
|
|
272
|
+
|
|
273
|
+
- ``m`` -- a vector of the message space of the code
|
|
274
|
+
|
|
275
|
+
- ``original_encode`` -- boolean (default: ``False``); if this is set
|
|
276
|
+
to ``True``, ``m`` will be encoded using an Encoder of ``self``'s
|
|
277
|
+
:meth:`original_code`. This allow to avoid the computation of a
|
|
278
|
+
generator matrix for ``self``.
|
|
279
|
+
|
|
280
|
+
- ``encoder_name`` -- (default: ``None``) name of the encoder which will be used
|
|
281
|
+
to encode ``word``. The default encoder of ``self`` will be used if
|
|
282
|
+
default value is kept.
|
|
283
|
+
|
|
284
|
+
OUTPUT: an element of ``self``
|
|
285
|
+
|
|
286
|
+
EXAMPLES::
|
|
287
|
+
|
|
288
|
+
sage: M = matrix(GF(7), [[1, 0, 0, 0, 3, 4, 6],
|
|
289
|
+
....: [0, 1, 0, 6, 1, 6, 4],
|
|
290
|
+
....: [0, 0, 1, 5, 2, 2, 4]])
|
|
291
|
+
sage: C_original = LinearCode(M)
|
|
292
|
+
sage: Cp = codes.PuncturedCode(C_original, 2)
|
|
293
|
+
sage: m = vector(GF(7), [1, 3, 5])
|
|
294
|
+
sage: Cp.encode(m)
|
|
295
|
+
(1, 3, 5, 5, 0, 2)
|
|
296
|
+
"""
|
|
297
|
+
if original_encode:
|
|
298
|
+
c = self.original_code().encode(m, encoder_name, **kwargs)
|
|
299
|
+
return _puncture(c, self.punctured_positions, self)
|
|
300
|
+
return self.encoder(encoder_name, **kwargs).encode(m)
|
|
301
|
+
|
|
302
|
+
@cached_method
|
|
303
|
+
def structured_representation(self):
|
|
304
|
+
r"""
|
|
305
|
+
Return ``self`` as a structured code object.
|
|
306
|
+
|
|
307
|
+
If ``self`` has a specific structured representation (e.g. a punctured GRS code is
|
|
308
|
+
a GRS code too), it will return this representation, else it returns a
|
|
309
|
+
:class:`sage.coding.linear_code.LinearCode`.
|
|
310
|
+
|
|
311
|
+
EXAMPLES:
|
|
312
|
+
|
|
313
|
+
We consider a GRS code::
|
|
314
|
+
|
|
315
|
+
sage: C_grs = codes.GeneralizedReedSolomonCode(GF(59).list()[:40], 12)
|
|
316
|
+
|
|
317
|
+
A punctured GRS code is still a GRS code::
|
|
318
|
+
|
|
319
|
+
sage: Cp_grs = codes.PuncturedCode(C_grs, 3)
|
|
320
|
+
sage: Cp_grs.structured_representation()
|
|
321
|
+
[39, 12, 28] Reed-Solomon Code over GF(59)
|
|
322
|
+
|
|
323
|
+
Another example with structureless linear codes::
|
|
324
|
+
|
|
325
|
+
sage: set_random_seed(42)
|
|
326
|
+
sage: C_lin = codes.random_linear_code(GF(2), 10, 5)
|
|
327
|
+
sage: Cp_lin = codes.PuncturedCode(C_lin, 2)
|
|
328
|
+
sage: Cp_lin.structured_representation()
|
|
329
|
+
[9, 5] linear code over GF(2)
|
|
330
|
+
"""
|
|
331
|
+
C = self.original_code()
|
|
332
|
+
pts = copy(self.punctured_positions())
|
|
333
|
+
list_pts = list(pts)
|
|
334
|
+
while isinstance(C, PuncturedCode):
|
|
335
|
+
cur_pts = list(C.punctured_positions())
|
|
336
|
+
list_len = len(list_pts)
|
|
337
|
+
for p in cur_pts:
|
|
338
|
+
for i in range(list_len):
|
|
339
|
+
if (p <= list_pts[i]):
|
|
340
|
+
list_pts[i] += 1
|
|
341
|
+
list_pts += cur_pts
|
|
342
|
+
C = C.original_code()
|
|
343
|
+
return C._punctured_form(set(list_pts))
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
class PuncturedCodePuncturedMatrixEncoder(Encoder):
|
|
347
|
+
r"""
|
|
348
|
+
Encoder using original code generator matrix to compute the punctured code's one.
|
|
349
|
+
|
|
350
|
+
INPUT:
|
|
351
|
+
|
|
352
|
+
- ``code`` -- the associated code of this encoder
|
|
353
|
+
|
|
354
|
+
EXAMPLES::
|
|
355
|
+
|
|
356
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
357
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
358
|
+
sage: E = codes.encoders.PuncturedCodePuncturedMatrixEncoder(Cp)
|
|
359
|
+
sage: E
|
|
360
|
+
Punctured matrix-based encoder for the
|
|
361
|
+
Puncturing of [11, 5] linear code over GF(7) on position(s) [3]
|
|
362
|
+
"""
|
|
363
|
+
|
|
364
|
+
def __init__(self, code):
|
|
365
|
+
r"""
|
|
366
|
+
TESTS:
|
|
367
|
+
|
|
368
|
+
If ``code`` is not a ``PuncturedCode``, an exception is raised::
|
|
369
|
+
|
|
370
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
371
|
+
sage: codes.encoders.PuncturedCodePuncturedMatrixEncoder(C)
|
|
372
|
+
Traceback (most recent call last):
|
|
373
|
+
...
|
|
374
|
+
TypeError: code has to be an instance of PuncturedCode class
|
|
375
|
+
"""
|
|
376
|
+
if not isinstance(code, PuncturedCode):
|
|
377
|
+
raise TypeError("code has to be an instance of PuncturedCode class")
|
|
378
|
+
super().__init__(code)
|
|
379
|
+
|
|
380
|
+
def _repr_(self):
|
|
381
|
+
r"""
|
|
382
|
+
Return a string representation of ``self``.
|
|
383
|
+
|
|
384
|
+
EXAMPLES::
|
|
385
|
+
|
|
386
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
387
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
388
|
+
sage: E = codes.encoders.PuncturedCodePuncturedMatrixEncoder(Cp)
|
|
389
|
+
sage: E
|
|
390
|
+
Punctured matrix-based encoder for the Puncturing of [11, 5] linear code over GF(7) on position(s) [3]
|
|
391
|
+
"""
|
|
392
|
+
return "Punctured matrix-based encoder for the %s" % self.code()
|
|
393
|
+
|
|
394
|
+
def _latex_(self):
|
|
395
|
+
r"""
|
|
396
|
+
Return a latex representation of ``self``.
|
|
397
|
+
|
|
398
|
+
EXAMPLES::
|
|
399
|
+
|
|
400
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
401
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
402
|
+
sage: E = codes.encoders.PuncturedCodePuncturedMatrixEncoder(Cp)
|
|
403
|
+
sage: latex(E)
|
|
404
|
+
\textnormal{Punctured matrix-based encoder for the }\textnormal{Puncturing of [11, 5] linear code over GF(7) on position(s) } [3]
|
|
405
|
+
"""
|
|
406
|
+
return "\\textnormal{Punctured matrix-based encoder for the }%s" % self.code()._latex_()
|
|
407
|
+
|
|
408
|
+
@cached_method
|
|
409
|
+
def generator_matrix(self):
|
|
410
|
+
r"""
|
|
411
|
+
Return a generator matrix of the associated code of ``self``.
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: set_random_seed(10)
|
|
416
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
417
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
418
|
+
sage: E = codes.encoders.PuncturedCodePuncturedMatrixEncoder(Cp)
|
|
419
|
+
sage: E.generator_matrix()
|
|
420
|
+
[1 0 0 0 0 5 2 6 0 6]
|
|
421
|
+
[0 1 0 0 0 5 2 2 1 1]
|
|
422
|
+
[0 0 1 0 0 6 2 4 0 4]
|
|
423
|
+
[0 0 0 1 0 0 6 3 3 3]
|
|
424
|
+
[0 0 0 0 1 0 1 3 4 3]
|
|
425
|
+
"""
|
|
426
|
+
C = self.code().original_code()
|
|
427
|
+
pos = self.code().punctured_positions()
|
|
428
|
+
M = C.generator_matrix()
|
|
429
|
+
G = M.delete_columns(list(pos))
|
|
430
|
+
G = G.echelon_form()
|
|
431
|
+
k = G.rank()
|
|
432
|
+
M = G[:k]
|
|
433
|
+
M.set_immutable()
|
|
434
|
+
return M
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
class PuncturedCodeOriginalCodeDecoder(Decoder):
|
|
438
|
+
r"""
|
|
439
|
+
Decoder decoding through a decoder over the original code of its punctured code.
|
|
440
|
+
|
|
441
|
+
INPUT:
|
|
442
|
+
|
|
443
|
+
- ``code`` -- the associated code of this encoder
|
|
444
|
+
|
|
445
|
+
- ``strategy`` -- (default: ``None``) the strategy used to decode.
|
|
446
|
+
The available strategies are:
|
|
447
|
+
|
|
448
|
+
* ``'error-erasure'`` -- uses an error-erasure decoder over the original
|
|
449
|
+
code if available, fails otherwise.
|
|
450
|
+
|
|
451
|
+
* ``'random-values'`` -- fills the punctured positions with random elements
|
|
452
|
+
in ``code``'s base field and tries to decode using
|
|
453
|
+
the default decoder of the original code
|
|
454
|
+
|
|
455
|
+
* ``'try-all'`` -- fills the punctured positions with every possible
|
|
456
|
+
combination of symbols until decoding succeeds, or until every
|
|
457
|
+
combination have been tried
|
|
458
|
+
|
|
459
|
+
* ``None`` -- uses ``error-erasure`` if an error-erasure decoder is
|
|
460
|
+
available, switch to ``random-values`` behaviour otherwise
|
|
461
|
+
|
|
462
|
+
- ``original_decoder`` -- (default: ``None``) the decoder that will be used over the original code.
|
|
463
|
+
It has to be a decoder object over the original code.
|
|
464
|
+
This argument takes precedence over ``strategy``: if both ``original_decoder`` and ``strategy``
|
|
465
|
+
are filled, ``self`` will use the ``original_decoder`` to decode over the original code.
|
|
466
|
+
If ``original_decoder`` is set to ``None``, it will use the decoder picked by ``strategy``.
|
|
467
|
+
|
|
468
|
+
- ``**kwargs`` -- all extra arguments are forwarded to original code's decoder
|
|
469
|
+
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
473
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
474
|
+
sage: codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
475
|
+
Decoder of Puncturing of [15, 7, 9] Reed-Solomon Code over GF(16) on position(s) [3]
|
|
476
|
+
through Error-Erasure decoder for [15, 7, 9] Reed-Solomon Code over GF(16)
|
|
477
|
+
|
|
478
|
+
As seen above, if all optional are left blank, and if an error-erasure
|
|
479
|
+
decoder is available, it will be chosen as the original decoder. Now, if
|
|
480
|
+
one forces ``strategy`` to ``'try-all'`` or ``'random-values'``, the default
|
|
481
|
+
decoder of the original code will be chosen, even if an error-erasure is
|
|
482
|
+
available::
|
|
483
|
+
|
|
484
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
485
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
486
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp, strategy='try-all')
|
|
487
|
+
sage: "error-erasure" in D.decoder_type()
|
|
488
|
+
False
|
|
489
|
+
|
|
490
|
+
And if one fills ``original_decoder`` and ``strategy`` fields with
|
|
491
|
+
contradictory elements, the ``original_decoder`` takes precedence::
|
|
492
|
+
|
|
493
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
494
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
495
|
+
sage: Dor = C.decoder("Gao")
|
|
496
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp, original_decoder=Dor,
|
|
497
|
+
....: strategy='error-erasure')
|
|
498
|
+
sage: D.original_decoder() == Dor
|
|
499
|
+
True
|
|
500
|
+
"""
|
|
501
|
+
|
|
502
|
+
def __init__(self, code, strategy=None, original_decoder=None, **kwargs):
|
|
503
|
+
r"""
|
|
504
|
+
TESTS:
|
|
505
|
+
|
|
506
|
+
If ``code`` is not a ``PuncturedCode``, an exception is raised::
|
|
507
|
+
|
|
508
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
509
|
+
sage: codes.decoders.PuncturedCodeOriginalCodeDecoder(C)
|
|
510
|
+
Traceback (most recent call last):
|
|
511
|
+
...
|
|
512
|
+
TypeError: code has to be an instance of PuncturedCode class
|
|
513
|
+
|
|
514
|
+
If one tries to pass an original_decoder whose associated code is not the original
|
|
515
|
+
code of ``self``, it returns an error::
|
|
516
|
+
|
|
517
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
518
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
519
|
+
sage: C2 = codes.GeneralizedReedSolomonCode(GF(7).list()[:6], 3)
|
|
520
|
+
sage: D = Cp.decoder(original_decoder = C2.decoder())
|
|
521
|
+
Traceback (most recent call last):
|
|
522
|
+
...
|
|
523
|
+
ValueError: Original decoder must have the original code of its associated punctured code as associated code
|
|
524
|
+
|
|
525
|
+
If one tries to use ``'error-erasure'`` strategy when the original code has no such
|
|
526
|
+
decoder, it returns an error::
|
|
527
|
+
|
|
528
|
+
sage: C = codes.random_linear_code(GF(7), 11, 5)
|
|
529
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
530
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp, strategy = 'error-erasure')
|
|
531
|
+
Traceback (most recent call last):
|
|
532
|
+
...
|
|
533
|
+
ValueError: Original code has no error-erasure decoder
|
|
534
|
+
"""
|
|
535
|
+
if not isinstance(code, PuncturedCode):
|
|
536
|
+
raise TypeError("code has to be an instance of PuncturedCode class")
|
|
537
|
+
|
|
538
|
+
original_code = code.original_code()
|
|
539
|
+
if original_decoder is not None:
|
|
540
|
+
if not isinstance(original_decoder, Decoder):
|
|
541
|
+
raise TypeError("original_decoder must be a decoder object")
|
|
542
|
+
if not original_decoder.code() == original_code:
|
|
543
|
+
raise ValueError("Original decoder must have the original code of its associated punctured code as associated code")
|
|
544
|
+
if 'error-erasure' in original_decoder.decoder_type():
|
|
545
|
+
strategy = 'error-erasure'
|
|
546
|
+
self._original_decoder = original_decoder
|
|
547
|
+
elif strategy == 'error-erasure':
|
|
548
|
+
error_erasure = False
|
|
549
|
+
for D in original_code._registered_decoders.values():
|
|
550
|
+
if 'error-erasure' in D._decoder_type:
|
|
551
|
+
error_erasure = True
|
|
552
|
+
self._original_decoder = D(original_code, **kwargs)
|
|
553
|
+
break
|
|
554
|
+
if not error_erasure:
|
|
555
|
+
raise ValueError("Original code has no error-erasure decoder")
|
|
556
|
+
elif strategy == 'random-values' or strategy == 'try-all':
|
|
557
|
+
self._original_decoder = code.original_code().decoder(**kwargs)
|
|
558
|
+
else:
|
|
559
|
+
error_erasure = False
|
|
560
|
+
for D in original_code._registered_decoders.values():
|
|
561
|
+
if 'error-erasure' in D._decoder_type:
|
|
562
|
+
error_erasure = True
|
|
563
|
+
self._original_decoder = D(original_code, **kwargs)
|
|
564
|
+
break
|
|
565
|
+
if not error_erasure:
|
|
566
|
+
self._original_decoder = original_code.decoder(**kwargs)
|
|
567
|
+
self._strategy = strategy
|
|
568
|
+
self._decoder_type = copy(self._decoder_type)
|
|
569
|
+
self._decoder_type.remove("dynamic")
|
|
570
|
+
self._decoder_type = self._original_decoder.decoder_type()
|
|
571
|
+
super().__init__(code, code.ambient_space(),
|
|
572
|
+
self._original_decoder.connected_encoder())
|
|
573
|
+
|
|
574
|
+
def _repr_(self):
|
|
575
|
+
r"""
|
|
576
|
+
Return a string representation of ``self``.
|
|
577
|
+
|
|
578
|
+
EXAMPLES::
|
|
579
|
+
|
|
580
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
581
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
582
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
583
|
+
sage: D
|
|
584
|
+
Decoder of Puncturing of [15, 7, 9] Reed-Solomon Code over GF(16) on position(s) [3] through Error-Erasure decoder for [15, 7, 9] Reed-Solomon Code over GF(16)
|
|
585
|
+
"""
|
|
586
|
+
return "Decoder of %s through %s" % (self.code(), self.original_decoder())
|
|
587
|
+
|
|
588
|
+
def _latex_(self):
|
|
589
|
+
r"""
|
|
590
|
+
Return a latex representation of ``self``.
|
|
591
|
+
|
|
592
|
+
EXAMPLES::
|
|
593
|
+
|
|
594
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
595
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
596
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
597
|
+
sage: latex(D)
|
|
598
|
+
\textnormal{Decoder of } Puncturing of [15, 7, 9] Reed-Solomon Code over GF(16) on position(s) [3] \textnormal{ through } Error-Erasure decoder for [15, 7, 9] Reed-Solomon Code over GF(16)
|
|
599
|
+
"""
|
|
600
|
+
return "\\textnormal{Decoder of } %s \\textnormal{ through } %s" % (self.code(), self.original_decoder())
|
|
601
|
+
|
|
602
|
+
def original_decoder(self):
|
|
603
|
+
r"""
|
|
604
|
+
Return the decoder over the original code that will be used to decode words of
|
|
605
|
+
:meth:`sage.coding.decoder.Decoder.code`.
|
|
606
|
+
|
|
607
|
+
EXAMPLES::
|
|
608
|
+
|
|
609
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
610
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
611
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
612
|
+
sage: D.original_decoder()
|
|
613
|
+
Error-Erasure decoder for [15, 7, 9] Reed-Solomon Code over GF(16)
|
|
614
|
+
"""
|
|
615
|
+
return self._original_decoder
|
|
616
|
+
|
|
617
|
+
def decode_to_code(self, y):
|
|
618
|
+
r"""
|
|
619
|
+
Decode ``y`` to an element in :meth:`sage.coding.decoder.Decoder.code`.
|
|
620
|
+
|
|
621
|
+
EXAMPLES::
|
|
622
|
+
|
|
623
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
624
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
625
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
626
|
+
sage: c = Cp.random_element()
|
|
627
|
+
sage: Chan = channels.StaticErrorRateChannel(Cp.ambient_space(), 3)
|
|
628
|
+
sage: y = Chan(c)
|
|
629
|
+
sage: y in Cp
|
|
630
|
+
False
|
|
631
|
+
sage: D.decode_to_code(y) == c
|
|
632
|
+
True
|
|
633
|
+
"""
|
|
634
|
+
D = self.original_decoder()
|
|
635
|
+
C = self.code()
|
|
636
|
+
A = C.original_code().ambient_space()
|
|
637
|
+
Cor = C.original_code()
|
|
638
|
+
pts = C.punctured_positions()
|
|
639
|
+
F = self.code().base_field()
|
|
640
|
+
zero, one = F.zero(), F.one()
|
|
641
|
+
if "error-erasure" in D.decoder_type():
|
|
642
|
+
if isinstance(y, (tuple, list)):
|
|
643
|
+
y, e = y[0], y[1]
|
|
644
|
+
e_list = e.list()
|
|
645
|
+
e_list = _insert_punctured_positions(e_list, pts, one)
|
|
646
|
+
else:
|
|
647
|
+
e_list = [one if i in pts else zero for i in range(Cor.length())]
|
|
648
|
+
e = vector(GF(2), e_list)
|
|
649
|
+
yl = y.list()
|
|
650
|
+
yl = _insert_punctured_positions(yl, pts, zero)
|
|
651
|
+
y = A(yl)
|
|
652
|
+
return _puncture(D.decode_to_code((y, e)), pts)
|
|
653
|
+
elif self._strategy == 'try-all':
|
|
654
|
+
end = False
|
|
655
|
+
yl = y.list()
|
|
656
|
+
I = iter(VectorSpace(F, len(pts)))
|
|
657
|
+
list_pts = list(pts)
|
|
658
|
+
list_pts.sort()
|
|
659
|
+
shift = 0
|
|
660
|
+
for i in list_pts:
|
|
661
|
+
yl.insert(i + shift, zero)
|
|
662
|
+
shift += 1
|
|
663
|
+
values = next(I)
|
|
664
|
+
while not end:
|
|
665
|
+
try:
|
|
666
|
+
shift = 0
|
|
667
|
+
for i in list_pts:
|
|
668
|
+
yl[i + shift] = values[shift]
|
|
669
|
+
shift += 1
|
|
670
|
+
y = A(yl)
|
|
671
|
+
values = next(I)
|
|
672
|
+
try:
|
|
673
|
+
c_or = self.original_decoder().decode_to_code(y)
|
|
674
|
+
end = True
|
|
675
|
+
break
|
|
676
|
+
except Exception:
|
|
677
|
+
pass
|
|
678
|
+
except StopIteration:
|
|
679
|
+
raise DecodingError
|
|
680
|
+
return _puncture(c_or, pts)
|
|
681
|
+
A = Cor.ambient_space()
|
|
682
|
+
yl = y.list()
|
|
683
|
+
yl = _insert_punctured_positions(yl, pts)
|
|
684
|
+
y = A(yl)
|
|
685
|
+
return _puncture(D.decode_to_code(y), pts)
|
|
686
|
+
|
|
687
|
+
def decoding_radius(self, number_erasures=None):
|
|
688
|
+
r"""
|
|
689
|
+
Return the maximal number of errors that ``self`` can decode.
|
|
690
|
+
|
|
691
|
+
EXAMPLES::
|
|
692
|
+
|
|
693
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(16, 'a').list()[:15], 7)
|
|
694
|
+
sage: Cp = codes.PuncturedCode(C, 3)
|
|
695
|
+
sage: D = codes.decoders.PuncturedCodeOriginalCodeDecoder(Cp)
|
|
696
|
+
sage: D.decoding_radius(2)
|
|
697
|
+
2
|
|
698
|
+
"""
|
|
699
|
+
punctured = len(self.code().punctured_positions())
|
|
700
|
+
D = self.original_decoder()
|
|
701
|
+
if self._strategy != 'try-all' and "error-erasure" not in D.decoder_type():
|
|
702
|
+
if D.decoding_radius() - punctured >= 0:
|
|
703
|
+
return D.decoding_radius() - punctured
|
|
704
|
+
else:
|
|
705
|
+
return 0
|
|
706
|
+
elif "error-erasure" in D.decoder_type() and number_erasures is not None:
|
|
707
|
+
diff = self.code().original_code().minimum_distance() - number_erasures - punctured - 1
|
|
708
|
+
if diff <= 0:
|
|
709
|
+
raise ValueError("The number of erasures exceeds decoding capability")
|
|
710
|
+
return diff // 2
|
|
711
|
+
elif "error-erasure" in D.decoder_type() and number_erasures is None:
|
|
712
|
+
raise ValueError("You must provide the number of erasures")
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
####################### registration ###############################
|
|
716
|
+
|
|
717
|
+
PuncturedCode._registered_encoders["PuncturedMatrix"] = PuncturedCodePuncturedMatrixEncoder
|
|
718
|
+
PuncturedCode._registered_decoders["OriginalCode"] = PuncturedCodeOriginalCodeDecoder
|
|
719
|
+
PuncturedCodeOriginalCodeDecoder._decoder_type = {"dynamic"}
|