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,897 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings sage.symbolic
|
|
3
|
+
r"""
|
|
4
|
+
Guruswami-Sudan decoder for (Generalized) Reed-Solomon codes
|
|
5
|
+
|
|
6
|
+
REFERENCES:
|
|
7
|
+
|
|
8
|
+
- [GS1999]_
|
|
9
|
+
|
|
10
|
+
- [Nie2013]_
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- Johan S. R. Nielsen, original implementation (see [Nie]_ for details)
|
|
15
|
+
- David Lucas, ported the original implementation in Sage
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
# Copyright (C) 2015 David Lucas <david.lucas@inria.fr>
|
|
20
|
+
# 2015 Johan S. R. Nielsen <jsrn@jsrn.dk>
|
|
21
|
+
#
|
|
22
|
+
# This program is free software: you can redistribute it and/or modify
|
|
23
|
+
# it under the terms of the GNU General Public License as published by
|
|
24
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
25
|
+
# (at your option) any later version.
|
|
26
|
+
# https://www.gnu.org/licenses/
|
|
27
|
+
# ****************************************************************************
|
|
28
|
+
|
|
29
|
+
from sage.coding.grs_code import GeneralizedReedSolomonCode
|
|
30
|
+
from sage.rings.integer_ring import ZZ
|
|
31
|
+
from sage.coding.decoder import Decoder
|
|
32
|
+
from sage.coding.guruswami_sudan.interpolation import gs_interpolation_linalg, gs_interpolation_lee_osullivan
|
|
33
|
+
from sage.coding.guruswami_sudan.utils import (johnson_radius,
|
|
34
|
+
gilt,
|
|
35
|
+
solve_degree2_to_integer_range)
|
|
36
|
+
from sage.functions.other import floor
|
|
37
|
+
from sage.misc.functional import sqrt
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def n_k_params(C, n_k):
|
|
41
|
+
r"""
|
|
42
|
+
Internal helper function for the :class:`GRSGuruswamiSudanDecoder` class for
|
|
43
|
+
allowing to specify either a GRS code `C` or the length and dimensions `n,
|
|
44
|
+
k` directly, in all the static functions.
|
|
45
|
+
|
|
46
|
+
If neither `C` or `n,k` were specified to those functions, an appropriate
|
|
47
|
+
error should be raised. Otherwise, `n, k` of the code or the supplied tuple
|
|
48
|
+
directly is returned.
|
|
49
|
+
|
|
50
|
+
INPUT:
|
|
51
|
+
|
|
52
|
+
- ``C`` -- a GRS code or ``None``
|
|
53
|
+
|
|
54
|
+
- ``n_k`` -- tuple `(n,k)` being length and dimension of a GRS code, or
|
|
55
|
+
``None``
|
|
56
|
+
|
|
57
|
+
OUTPUT:
|
|
58
|
+
|
|
59
|
+
- ``n_k`` -- tuple `(n,k)` being length and dimension of a GRS code
|
|
60
|
+
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: from sage.coding.guruswami_sudan.gs_decoder import n_k_params
|
|
64
|
+
sage: n_k_params(None, (10, 5))
|
|
65
|
+
(10, 5)
|
|
66
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(11).list()[:10], 5)
|
|
67
|
+
sage: n_k_params(C, None)
|
|
68
|
+
(10, 5)
|
|
69
|
+
sage: n_k_params(None,None)
|
|
70
|
+
Traceback (most recent call last):
|
|
71
|
+
...
|
|
72
|
+
ValueError: Please provide either the code or its length and dimension
|
|
73
|
+
sage: n_k_params(C, (12, 2))
|
|
74
|
+
Traceback (most recent call last):
|
|
75
|
+
...
|
|
76
|
+
ValueError: Please provide only the code or its length and dimension
|
|
77
|
+
"""
|
|
78
|
+
if C is not None and n_k is not None:
|
|
79
|
+
raise ValueError("Please provide only the code or its length and dimension")
|
|
80
|
+
elif C is None and n_k is None:
|
|
81
|
+
raise ValueError("Please provide either the code or its length and dimension")
|
|
82
|
+
elif C is not None:
|
|
83
|
+
return C.length(), C.dimension()
|
|
84
|
+
elif n_k is not None and not isinstance(n_k, tuple):
|
|
85
|
+
raise ValueError("n_k has to be a tuple")
|
|
86
|
+
elif n_k is not None:
|
|
87
|
+
return n_k
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def roth_ruckenstein_root_finder(p, maxd=None, precision=None):
|
|
91
|
+
"""
|
|
92
|
+
Wrapper for Roth-Ruckenstein algorithm to compute the roots of a polynomial
|
|
93
|
+
with coefficients in `F[x]`.
|
|
94
|
+
|
|
95
|
+
TESTS::
|
|
96
|
+
|
|
97
|
+
sage: from sage.coding.guruswami_sudan.gs_decoder import roth_ruckenstein_root_finder
|
|
98
|
+
sage: R.<x> = GF(13)[]
|
|
99
|
+
sage: S.<y> = R[]
|
|
100
|
+
sage: p = (y - x^2 - x - 1) * (y + x + 1)
|
|
101
|
+
sage: roth_ruckenstein_root_finder(p, maxd = 2)
|
|
102
|
+
[12*x + 12, x^2 + x + 1]
|
|
103
|
+
"""
|
|
104
|
+
gens = p.parent().gens()
|
|
105
|
+
if len(gens) == 2:
|
|
106
|
+
p = p.polynomial(gens[1])
|
|
107
|
+
return p.roots(multiplicities=False, degree_bound=maxd, algorithm='Roth-Ruckenstein')
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def alekhnovich_root_finder(p, maxd=None, precision=None):
|
|
111
|
+
"""
|
|
112
|
+
Wrapper for Alekhnovich's algorithm to compute the roots of a polynomial
|
|
113
|
+
with coefficients in `F[x]`.
|
|
114
|
+
|
|
115
|
+
TESTS::
|
|
116
|
+
|
|
117
|
+
sage: from sage.coding.guruswami_sudan.gs_decoder import alekhnovich_root_finder
|
|
118
|
+
sage: R.<x> = GF(13)[]
|
|
119
|
+
sage: S.<y> = R[]
|
|
120
|
+
sage: p = (y - x^2 - x - 1) * (y + x + 1)
|
|
121
|
+
sage: alekhnovich_root_finder(p, maxd = 2)
|
|
122
|
+
[12*x + 12, x^2 + x + 1]
|
|
123
|
+
"""
|
|
124
|
+
gens = p.parent().gens()
|
|
125
|
+
if len(gens) == 2:
|
|
126
|
+
p = p.polynomial(gens[1])
|
|
127
|
+
return p.roots(multiplicities=False, degree_bound=maxd, algorithm='Alekhnovich')
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class GRSGuruswamiSudanDecoder(Decoder):
|
|
131
|
+
r"""
|
|
132
|
+
The Guruswami-Sudan list-decoding algorithm for decoding Generalized
|
|
133
|
+
Reed-Solomon codes.
|
|
134
|
+
|
|
135
|
+
The Guruswami-Sudan algorithm is a polynomial time algorithm to decode
|
|
136
|
+
beyond half the minimum distance of the code. It can decode up to the
|
|
137
|
+
Johnson radius which is `n - \sqrt(n(n-d))`, where `n, d` is the length,
|
|
138
|
+
respectively minimum distance of the RS code. See [GS1999]_ for more details.
|
|
139
|
+
It is a list-decoder meaning that it returns a list of all closest codewords
|
|
140
|
+
or their corresponding message polynomials. Note that the output of the
|
|
141
|
+
``decode_to_code`` and ``decode_to_message`` methods are therefore lists.
|
|
142
|
+
|
|
143
|
+
The algorithm has two free parameters, the list size and the multiplicity,
|
|
144
|
+
and these determine how many errors the method will correct: generally,
|
|
145
|
+
higher decoding radius requires larger values of these parameters. To decode
|
|
146
|
+
all the way to the Johnson radius, one generally needs values in the order
|
|
147
|
+
of `O(n^2)`, while decoding just one error less requires just `O(n)`.
|
|
148
|
+
|
|
149
|
+
This class has static methods for computing choices of parameters given the
|
|
150
|
+
decoding radius or vice versa.
|
|
151
|
+
|
|
152
|
+
The Guruswami-Sudan consists of two computationally intensive steps:
|
|
153
|
+
Interpolation and Root finding, either of which can be completed in multiple
|
|
154
|
+
ways. This implementation allows choosing the sub-algorithms among currently
|
|
155
|
+
implemented possibilities, or supplying your own.
|
|
156
|
+
|
|
157
|
+
INPUT:
|
|
158
|
+
|
|
159
|
+
- ``code`` -- a code associated to this decoder
|
|
160
|
+
|
|
161
|
+
- ``tau`` -- integer (default: ``None``); the number of errors one wants the
|
|
162
|
+
Guruswami-Sudan algorithm to correct
|
|
163
|
+
|
|
164
|
+
- ``parameters`` -- (default: ``None``) a pair of integers, where:
|
|
165
|
+
|
|
166
|
+
- the first integer is the multiplicity parameter, and
|
|
167
|
+
- the second integer is the list size parameter.
|
|
168
|
+
|
|
169
|
+
- ``interpolation_alg`` -- (default: ``None``) the interpolation algorithm
|
|
170
|
+
that will be used. The following possibilities are currently available:
|
|
171
|
+
|
|
172
|
+
* ``'LinearAlgebra'`` -- uses a linear system solver.
|
|
173
|
+
* ``'LeeOSullivan'`` -- uses Lee O'Sullivan method based on row reduction
|
|
174
|
+
of a matrix
|
|
175
|
+
* ``None`` -- one of the above will be chosen based on the size of the
|
|
176
|
+
code and the parameters.
|
|
177
|
+
|
|
178
|
+
You can also supply your own function to perform the interpolation. See
|
|
179
|
+
NOTE section for details on the signature of this function.
|
|
180
|
+
|
|
181
|
+
- ``root_finder`` -- (default: ``None``) the rootfinding algorithm that will
|
|
182
|
+
be used. The following possibilities are currently available:
|
|
183
|
+
|
|
184
|
+
* ``'Alekhnovich'`` -- uses Alekhnovich's algorithm.
|
|
185
|
+
|
|
186
|
+
* ``'RothRuckenstein'`` -- uses Roth-Ruckenstein algorithm.
|
|
187
|
+
|
|
188
|
+
* ``None`` -- one of the above will be chosen based on the size of the
|
|
189
|
+
code and the parameters.
|
|
190
|
+
|
|
191
|
+
You can also supply your own function to perform the interpolation. See
|
|
192
|
+
NOTE section for details on the signature of this function.
|
|
193
|
+
|
|
194
|
+
.. NOTE::
|
|
195
|
+
|
|
196
|
+
One has to provide either ``tau`` or ``parameters``. If neither are given,
|
|
197
|
+
an exception will be raised.
|
|
198
|
+
|
|
199
|
+
If one provides a function as ``root_finder``, its signature has to be:
|
|
200
|
+
``my_rootfinder(Q, maxd=default_value, precision=default_value)``. `Q`
|
|
201
|
+
will be given as an element of `F[x][y]`. The function must return the
|
|
202
|
+
roots as a list of polynomials over a univariate polynomial ring. See
|
|
203
|
+
:meth:`roth_ruckenstein_root_finder` for an example.
|
|
204
|
+
|
|
205
|
+
If one provides a function as ``interpolation_alg``, its signature has
|
|
206
|
+
to be: ``my_inter(interpolation_points, tau, s_and_l, wy)``. See
|
|
207
|
+
:meth:`sage.coding.guruswami_sudan.interpolation.gs_interpolation_linalg`
|
|
208
|
+
for an example.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
213
|
+
sage: D = codes.decoders.GRSGuruswamiSudanDecoder(C, tau=97); D
|
|
214
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251)
|
|
215
|
+
decoding 97 errors with parameters (1, 2)
|
|
216
|
+
|
|
217
|
+
One can specify multiplicity and list size instead of ``tau``::
|
|
218
|
+
|
|
219
|
+
sage: D = codes.decoders.GRSGuruswamiSudanDecoder(C, parameters=(1,2)); D
|
|
220
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251)
|
|
221
|
+
decoding 97 errors with parameters (1, 2)
|
|
222
|
+
|
|
223
|
+
One can pass a method as ``root_finder`` (works also for ``interpolation_alg``)::
|
|
224
|
+
|
|
225
|
+
sage: from sage.coding.guruswami_sudan.gs_decoder import roth_ruckenstein_root_finder
|
|
226
|
+
sage: rf = roth_ruckenstein_root_finder
|
|
227
|
+
sage: D = codes.decoders.GRSGuruswamiSudanDecoder(C, parameters=(1,2),
|
|
228
|
+
....: root_finder=rf); D
|
|
229
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251)
|
|
230
|
+
decoding 97 errors with parameters (1, 2)
|
|
231
|
+
|
|
232
|
+
If one wants to use the native Sage algorithms for the root finding step,
|
|
233
|
+
one can directly pass the string given in the ``Input`` block of this class.
|
|
234
|
+
This works for ``interpolation_alg`` as well::
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
sage: D = codes.decoders.GRSGuruswamiSudanDecoder(C, parameters=(1,2),
|
|
238
|
+
....: root_finder='RothRuckenstein'); D
|
|
239
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251)
|
|
240
|
+
decoding 97 errors with parameters (1, 2)
|
|
241
|
+
|
|
242
|
+
Actually, we can construct the decoder from ``C`` directly::
|
|
243
|
+
|
|
244
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97); D
|
|
245
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251)
|
|
246
|
+
decoding 97 errors with parameters (1, 2)
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
####################### static methods ###############################
|
|
250
|
+
|
|
251
|
+
@staticmethod
|
|
252
|
+
def parameters_given_tau(tau, C=None, n_k=None):
|
|
253
|
+
r"""
|
|
254
|
+
Return the smallest possible multiplicity and list size given the
|
|
255
|
+
given parameters of the code and decoding radius.
|
|
256
|
+
|
|
257
|
+
INPUT:
|
|
258
|
+
|
|
259
|
+
- ``tau`` -- integer; number of errors one wants the Guruswami-Sudan
|
|
260
|
+
algorithm to correct
|
|
261
|
+
- ``C`` -- (default: ``None``) a :class:`GeneralizedReedSolomonCode`
|
|
262
|
+
- ``n_k`` -- (default: ``None``) a pair of integers, respectively the
|
|
263
|
+
length and the dimension of the :class:`GeneralizedReedSolomonCode`
|
|
264
|
+
|
|
265
|
+
OUTPUT:
|
|
266
|
+
|
|
267
|
+
- ``(s, l)`` -- a pair of integers, where:
|
|
268
|
+
|
|
269
|
+
- ``s`` is the multiplicity parameter, and
|
|
270
|
+
- ``l`` is the list size parameter.
|
|
271
|
+
|
|
272
|
+
.. NOTE::
|
|
273
|
+
|
|
274
|
+
One should to provide either ``C`` or ``(n, k)``. If neither or both
|
|
275
|
+
are given, an exception will be raised.
|
|
276
|
+
|
|
277
|
+
EXAMPLES::
|
|
278
|
+
|
|
279
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
280
|
+
sage: tau, n, k = 97, 250, 70
|
|
281
|
+
sage: GSD.parameters_given_tau(tau, n_k=(n, k))
|
|
282
|
+
(1, 2)
|
|
283
|
+
|
|
284
|
+
Another example with a bigger decoding radius::
|
|
285
|
+
|
|
286
|
+
sage: tau, n, k = 118, 250, 70
|
|
287
|
+
sage: GSD.parameters_given_tau(tau, n_k=(n, k))
|
|
288
|
+
(47, 89)
|
|
289
|
+
|
|
290
|
+
Choosing a decoding radius which is too large results in an errors::
|
|
291
|
+
|
|
292
|
+
sage: tau = 200
|
|
293
|
+
sage: GSD.parameters_given_tau(tau, n_k=(n, k))
|
|
294
|
+
Traceback (most recent call last):
|
|
295
|
+
...
|
|
296
|
+
ValueError: The decoding radius must be less than
|
|
297
|
+
the Johnson radius (which is 118.66)
|
|
298
|
+
"""
|
|
299
|
+
n,k = n_k_params(C, n_k)
|
|
300
|
+
|
|
301
|
+
johnson = johnson_radius(n, n - k + 1)
|
|
302
|
+
if tau >= johnson:
|
|
303
|
+
raise ValueError("The decoding radius must be less than the Johnson radius (which is %.2f)"
|
|
304
|
+
% float(johnson))
|
|
305
|
+
|
|
306
|
+
# We start with l=1 and check if a satisfiable s can be chosen. We keep
|
|
307
|
+
# increasing l by 1 until this is the case. The governing equation is
|
|
308
|
+
# s*(s+1)/2 * n < (l+1)*s*(n-tau) - l*(l+1)/2*(k-1)
|
|
309
|
+
# See [GS1999]_
|
|
310
|
+
def try_l(l):
|
|
311
|
+
(mins,maxs) = solve_degree2_to_integer_range(n, n-2*(l+1)*(n-tau), (k-1)*l*(l+1))
|
|
312
|
+
if maxs > 0 and maxs >= mins:
|
|
313
|
+
return max(1, mins)
|
|
314
|
+
else:
|
|
315
|
+
return None
|
|
316
|
+
s, l = None, 0
|
|
317
|
+
while s is None:
|
|
318
|
+
l += 1
|
|
319
|
+
s = try_l(l)
|
|
320
|
+
|
|
321
|
+
return (s, l)
|
|
322
|
+
|
|
323
|
+
@staticmethod
|
|
324
|
+
def guruswami_sudan_decoding_radius(C=None, n_k=None, l=None, s=None):
|
|
325
|
+
r"""
|
|
326
|
+
Return the maximal decoding radius of the Guruswami-Sudan decoder and
|
|
327
|
+
the parameter choices needed for this.
|
|
328
|
+
|
|
329
|
+
If ``s`` is set but ``l`` is not it will return the best decoding radius using this ``s``
|
|
330
|
+
alongside with the required ``l``. Vice versa for ``l``. If both are
|
|
331
|
+
set, it returns the decoding radius given this parameter choice.
|
|
332
|
+
|
|
333
|
+
INPUT:
|
|
334
|
+
|
|
335
|
+
- ``C`` -- (default: ``None``) a :class:`GeneralizedReedSolomonCode`
|
|
336
|
+
- ``n_k`` -- (default: ``None``) a pair of integers, respectively the
|
|
337
|
+
length and the dimension of the :class:`GeneralizedReedSolomonCode`
|
|
338
|
+
- ``s`` -- integer (default: ``None``); the multiplicity parameter of
|
|
339
|
+
Guruswami-Sudan algorithm
|
|
340
|
+
- ``l`` -- integer (default: ``None``); the list size parameter
|
|
341
|
+
|
|
342
|
+
.. NOTE::
|
|
343
|
+
|
|
344
|
+
One has to provide either ``C`` or ``n_k``. If none or both are
|
|
345
|
+
given, an exception will be raised.
|
|
346
|
+
|
|
347
|
+
OUTPUT:
|
|
348
|
+
|
|
349
|
+
- ``(tau, (s, l))`` -- where
|
|
350
|
+
|
|
351
|
+
- ``tau`` is the obtained decoding radius, and
|
|
352
|
+
|
|
353
|
+
- ``(s, l)`` are the multiplicity parameter and the list size
|
|
354
|
+
parameter giving the radius
|
|
355
|
+
|
|
356
|
+
EXAMPLES::
|
|
357
|
+
|
|
358
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
359
|
+
sage: n, k = 250, 70
|
|
360
|
+
sage: GSD.guruswami_sudan_decoding_radius(n_k=(n, k))
|
|
361
|
+
(118, (47, 89))
|
|
362
|
+
|
|
363
|
+
One parameter can be restricted at a time::
|
|
364
|
+
|
|
365
|
+
sage: n, k = 250, 70
|
|
366
|
+
sage: GSD.guruswami_sudan_decoding_radius(n_k=(n, k), s=3)
|
|
367
|
+
(109, (3, 5))
|
|
368
|
+
sage: GSD.guruswami_sudan_decoding_radius(n_k=(n, k), l=7)
|
|
369
|
+
(111, (4, 7))
|
|
370
|
+
|
|
371
|
+
The function can also just compute the decoding radius given the parameters::
|
|
372
|
+
|
|
373
|
+
sage: GSD.guruswami_sudan_decoding_radius(n_k=(n, k), s=2, l=6)
|
|
374
|
+
(92, (2, 6))
|
|
375
|
+
"""
|
|
376
|
+
n,k = n_k_params(C, n_k)
|
|
377
|
+
|
|
378
|
+
def get_tau(s, l):
|
|
379
|
+
"Return the decoding radius given this s and l"
|
|
380
|
+
if s <= 0 or l <= 0:
|
|
381
|
+
return -1
|
|
382
|
+
return gilt(n - n/2*(s+1)/(l+1) - (k-1)/2*l/s)
|
|
383
|
+
if l is None and s is None:
|
|
384
|
+
tau = gilt(johnson_radius(n, n - k + 1))
|
|
385
|
+
return (tau, GRSGuruswamiSudanDecoder.parameters_given_tau(tau, n_k=(n, k)))
|
|
386
|
+
if l is not None and s is not None:
|
|
387
|
+
return (get_tau(s,l), (s,l))
|
|
388
|
+
|
|
389
|
+
# Either s or l is set, but not both. First a shared local function
|
|
390
|
+
def find_integral_max(real_max, f):
|
|
391
|
+
"""Given a real (local) maximum of a function `f`, return that of
|
|
392
|
+
the integers around ``real_max`` which gives the (local) integral
|
|
393
|
+
maximum, and the value of at that point."""
|
|
394
|
+
if real_max in ZZ:
|
|
395
|
+
int_max = ZZ(real_max)
|
|
396
|
+
return (int_max, f(int_max))
|
|
397
|
+
else:
|
|
398
|
+
x_f = floor(real_max)
|
|
399
|
+
x_c = x_f + 1
|
|
400
|
+
f_f, f_c = f(x_f), f(x_c)
|
|
401
|
+
return (x_f, f_f) if f_f >= f_c else (x_c, f_c)
|
|
402
|
+
|
|
403
|
+
if s is not None:
|
|
404
|
+
# maximising tau under condition
|
|
405
|
+
# n*(s+1 choose 2) < (ell+1)*s*(n-tau) - (ell+1 choose 2)*(k-1)
|
|
406
|
+
# knowing n and s, we can just minimise
|
|
407
|
+
# ( n*(s+1 choose 2) + (ell+1 choose 2)*(k-1) )/(ell+1)
|
|
408
|
+
# Differentiating and setting to zero yields ell best choice:
|
|
409
|
+
lmax = sqrt(n*s*(s+1.)/(k-1.)) - 1.
|
|
410
|
+
#the best integral value will be
|
|
411
|
+
(l,tau) = find_integral_max(lmax, lambda l: get_tau(s,l))
|
|
412
|
+
#Note that we have not proven that this ell is minimal in integral
|
|
413
|
+
#sense! It just seems that this most often happens
|
|
414
|
+
return (tau,(s,l))
|
|
415
|
+
if l is not None:
|
|
416
|
+
# Acquired similarly to when restricting s
|
|
417
|
+
smax = sqrt((k-1.)/n*l*(l+1.))
|
|
418
|
+
(s,tau) = find_integral_max(smax, lambda s: get_tau(s,l))
|
|
419
|
+
return (tau, (s,l))
|
|
420
|
+
|
|
421
|
+
@staticmethod
|
|
422
|
+
def _suitable_parameters_given_tau(tau, C=None, n_k=None):
|
|
423
|
+
r"""
|
|
424
|
+
Return quite good multiplicity and list size parameters for the code
|
|
425
|
+
parameters and the decoding radius.
|
|
426
|
+
|
|
427
|
+
These parameters are not guaranteed to be the best ones possible
|
|
428
|
+
for the provided ``tau``, but arise from easily-evaluated closed
|
|
429
|
+
expressions and are very good approximations of the best ones.
|
|
430
|
+
|
|
431
|
+
See [Nie2013]_ pages 53-54, proposition 3.11 for details.
|
|
432
|
+
|
|
433
|
+
INPUT:
|
|
434
|
+
|
|
435
|
+
- ``tau`` -- integer; number of errors one wants the Guruswami-Sudan
|
|
436
|
+
algorithm to correct
|
|
437
|
+
- ``C`` -- (default: ``None``) a :class:`GeneralizedReedSolomonCode`
|
|
438
|
+
- ``n_k`` -- (default: ``None``) a pair of integers, respectively the
|
|
439
|
+
length and the dimension of the :class:`GeneralizedReedSolomonCode`
|
|
440
|
+
|
|
441
|
+
OUTPUT:
|
|
442
|
+
|
|
443
|
+
- ``(s, l)`` -- a pair of integers, where:
|
|
444
|
+
|
|
445
|
+
- ``s`` is the multiplicity parameter, and
|
|
446
|
+
- ``l`` is the list size parameter.
|
|
447
|
+
|
|
448
|
+
.. NOTE::
|
|
449
|
+
|
|
450
|
+
One has to provide either ``C`` or ``(n, k)``. If neither or both
|
|
451
|
+
are given, an exception will be raised.
|
|
452
|
+
|
|
453
|
+
EXAMPLES:
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
The following is an example where the parameters are optimal::
|
|
457
|
+
|
|
458
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
459
|
+
sage: tau = 98
|
|
460
|
+
sage: n, k = 250, 70
|
|
461
|
+
sage: GSD._suitable_parameters_given_tau(tau, n_k=(n, k))
|
|
462
|
+
(2, 3)
|
|
463
|
+
sage: GSD.parameters_given_tau(tau, n_k=(n, k))
|
|
464
|
+
(2, 3)
|
|
465
|
+
|
|
466
|
+
This is an example where they are not::
|
|
467
|
+
|
|
468
|
+
sage: tau = 97
|
|
469
|
+
sage: n, k = 250, 70
|
|
470
|
+
sage: GSD._suitable_parameters_given_tau(tau, n_k=(n, k))
|
|
471
|
+
(2, 3)
|
|
472
|
+
sage: GSD.parameters_given_tau(tau, n_k=(n, k))
|
|
473
|
+
(1, 2)
|
|
474
|
+
|
|
475
|
+
We can provide a GRS code instead of `n` and `k` directly::
|
|
476
|
+
|
|
477
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
478
|
+
sage: GSD._suitable_parameters_given_tau(tau, C=C)
|
|
479
|
+
(2, 3)
|
|
480
|
+
|
|
481
|
+
Another one with a bigger ``tau``::
|
|
482
|
+
|
|
483
|
+
sage: GSD._suitable_parameters_given_tau(118, C=C)
|
|
484
|
+
(47, 89)
|
|
485
|
+
"""
|
|
486
|
+
n,k = n_k_params(C, n_k)
|
|
487
|
+
w = k - 1
|
|
488
|
+
atau = n - tau
|
|
489
|
+
smin = tau * w / (atau ** 2 - n * w)
|
|
490
|
+
s = floor(1 + smin)
|
|
491
|
+
D = (s - smin) * (atau ** 2 - n * w) * s + (w**2) / 4
|
|
492
|
+
l = floor(atau / w * s + 0.5 - sqrt(D)/w)
|
|
493
|
+
return (s, l)
|
|
494
|
+
|
|
495
|
+
@staticmethod
|
|
496
|
+
def gs_satisfactory(tau, s, l, C=None, n_k=None):
|
|
497
|
+
r"""
|
|
498
|
+
Return whether input parameters satisfy the governing equation of
|
|
499
|
+
Guruswami-Sudan.
|
|
500
|
+
|
|
501
|
+
See [Nie2013]_ page 49, definition 3.3 and proposition 3.4 for details.
|
|
502
|
+
|
|
503
|
+
INPUT:
|
|
504
|
+
|
|
505
|
+
- ``tau`` -- integer; number of errors one expects Guruswami-Sudan algorithm
|
|
506
|
+
to correct
|
|
507
|
+
- ``s`` -- integer; multiplicity parameter of Guruswami-Sudan algorithm
|
|
508
|
+
- ``l`` -- integer; list size parameter
|
|
509
|
+
- ``C`` -- (default: ``None``) a :class:`GeneralizedReedSolomonCode`
|
|
510
|
+
- ``n_k`` -- (default: ``None``) a tuple of integers, respectively the
|
|
511
|
+
length and the dimension of the :class:`GeneralizedReedSolomonCode`
|
|
512
|
+
|
|
513
|
+
.. NOTE::
|
|
514
|
+
|
|
515
|
+
One has to provide either ``C`` or ``(n, k)``. If none or both are
|
|
516
|
+
given, an exception will be raised.
|
|
517
|
+
|
|
518
|
+
EXAMPLES::
|
|
519
|
+
|
|
520
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
521
|
+
sage: tau, s, l = 97, 1, 2
|
|
522
|
+
sage: n, k = 250, 70
|
|
523
|
+
sage: GSD.gs_satisfactory(tau, s, l, n_k=(n, k))
|
|
524
|
+
True
|
|
525
|
+
|
|
526
|
+
One can also pass a GRS code::
|
|
527
|
+
|
|
528
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
529
|
+
sage: GSD.gs_satisfactory(tau, s, l, C=C)
|
|
530
|
+
True
|
|
531
|
+
|
|
532
|
+
Another example where ``s`` and ``l`` does not satisfy the equation::
|
|
533
|
+
|
|
534
|
+
sage: tau, s, l = 118, 47, 80
|
|
535
|
+
sage: GSD.gs_satisfactory(tau, s, l, n_k=(n, k))
|
|
536
|
+
False
|
|
537
|
+
|
|
538
|
+
If one provides both ``C`` and ``n_k`` an exception is returned::
|
|
539
|
+
|
|
540
|
+
sage: tau, s, l = 97, 1, 2
|
|
541
|
+
sage: n, k = 250, 70
|
|
542
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
543
|
+
sage: GSD.gs_satisfactory(tau, s, l, C=C, n_k=(n, k))
|
|
544
|
+
Traceback (most recent call last):
|
|
545
|
+
...
|
|
546
|
+
ValueError: Please provide only the code or its length and dimension
|
|
547
|
+
|
|
548
|
+
Same if one provides none of these::
|
|
549
|
+
|
|
550
|
+
sage: GSD.gs_satisfactory(tau, s, l)
|
|
551
|
+
Traceback (most recent call last):
|
|
552
|
+
...
|
|
553
|
+
ValueError: Please provide either the code or its length and dimension
|
|
554
|
+
"""
|
|
555
|
+
n,k = n_k_params(C, n_k)
|
|
556
|
+
return l > 0 and s > 0 and n * s * (s+1) < (l+1) * (2*s*(n-tau) - (k-1) * l)
|
|
557
|
+
|
|
558
|
+
####################### decoder itself ###############################
|
|
559
|
+
def __init__(self, code, tau=None, parameters=None, interpolation_alg=None, root_finder=None):
|
|
560
|
+
r"""
|
|
561
|
+
TESTS:
|
|
562
|
+
|
|
563
|
+
If neither ``tau`` nor ``parameters`` is given, an exception is returned::
|
|
564
|
+
|
|
565
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
566
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
567
|
+
sage: D = GSD(C)
|
|
568
|
+
Traceback (most recent call last):
|
|
569
|
+
...
|
|
570
|
+
ValueError: Specify either tau or parameters
|
|
571
|
+
|
|
572
|
+
If one provides something else than one of the allowed strings or a method as ``interpolation_alg``,
|
|
573
|
+
an exception is returned::
|
|
574
|
+
|
|
575
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
576
|
+
sage: D = GSD(C, tau=97, interpolation_alg=42)
|
|
577
|
+
Traceback (most recent call last):
|
|
578
|
+
...
|
|
579
|
+
ValueError: Please provide a method or one of the allowed strings for interpolation_alg
|
|
580
|
+
|
|
581
|
+
Same thing for ``root_finder``::
|
|
582
|
+
|
|
583
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
584
|
+
sage: D = GSD(C, tau=97, root_finder='FortyTwo')
|
|
585
|
+
Traceback (most recent call last):
|
|
586
|
+
...
|
|
587
|
+
ValueError: Please provide a method or one of the allowed strings for root_finder
|
|
588
|
+
|
|
589
|
+
If one provides a full set of parameters (tau, s and l) which are not satisfactory, an
|
|
590
|
+
error message is returned::
|
|
591
|
+
|
|
592
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
593
|
+
sage: D = GSD(C, tau=142, parameters=(1, 2))
|
|
594
|
+
Traceback (most recent call last):
|
|
595
|
+
...
|
|
596
|
+
ValueError: Impossible parameters for the Guruswami-Sudan algorithm
|
|
597
|
+
|
|
598
|
+
If ``code`` is not a GRS code, an error is raised::
|
|
599
|
+
|
|
600
|
+
sage: C = codes.random_linear_code(GF(11), 10, 4)
|
|
601
|
+
sage: GSD(C, tau=2)
|
|
602
|
+
Traceback (most recent call last):
|
|
603
|
+
...
|
|
604
|
+
ValueError: code has to be a generalized Reed-Solomon code
|
|
605
|
+
"""
|
|
606
|
+
if not isinstance(code, GeneralizedReedSolomonCode):
|
|
607
|
+
raise ValueError("code has to be a generalized Reed-Solomon code")
|
|
608
|
+
n, k = code.length(), code.dimension()
|
|
609
|
+
if tau and parameters:
|
|
610
|
+
if not GRSGuruswamiSudanDecoder.gs_satisfactory(tau, parameters[0], parameters[1], C=code):
|
|
611
|
+
raise ValueError("Impossible parameters for the Guruswami-Sudan algorithm")
|
|
612
|
+
self._tau, self._s, self._ell = tau, parameters[0], parameters[1]
|
|
613
|
+
elif tau:
|
|
614
|
+
self._tau = tau
|
|
615
|
+
self._s, self._ell = GRSGuruswamiSudanDecoder.parameters_given_tau(tau, n_k=(n, k))
|
|
616
|
+
elif parameters:
|
|
617
|
+
self._s = parameters[0]
|
|
618
|
+
self._ell = parameters[1]
|
|
619
|
+
(self._tau,_) = GRSGuruswamiSudanDecoder.guruswami_sudan_decoding_radius(C=code, s=self._s, l=self._ell)
|
|
620
|
+
else:
|
|
621
|
+
raise ValueError("Specify either tau or parameters")
|
|
622
|
+
if callable(interpolation_alg):
|
|
623
|
+
self._interpolation_alg = interpolation_alg
|
|
624
|
+
elif interpolation_alg is None or interpolation_alg == "LeeOSullivan":
|
|
625
|
+
self._interpolation_alg = gs_interpolation_lee_osullivan
|
|
626
|
+
elif interpolation_alg == "LinearAlgebra":
|
|
627
|
+
self._interpolation_alg = gs_interpolation_linalg
|
|
628
|
+
else:
|
|
629
|
+
raise ValueError("Please provide a method or one of the allowed strings for interpolation_alg")
|
|
630
|
+
if callable(root_finder):
|
|
631
|
+
self._root_finder = root_finder
|
|
632
|
+
elif root_finder == "RothRuckenstein":
|
|
633
|
+
self._root_finder = roth_ruckenstein_root_finder
|
|
634
|
+
elif root_finder is None or root_finder == "Alekhnovich":
|
|
635
|
+
self._root_finder = alekhnovich_root_finder
|
|
636
|
+
else:
|
|
637
|
+
raise ValueError("Please provide a method or one of the allowed strings for root_finder")
|
|
638
|
+
super().__init__(code, code.ambient_space(), "EvaluationPolynomial")
|
|
639
|
+
|
|
640
|
+
def _repr_(self):
|
|
641
|
+
r"""
|
|
642
|
+
Return a string representation of ``self``.
|
|
643
|
+
|
|
644
|
+
EXAMPLES::
|
|
645
|
+
|
|
646
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
647
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
648
|
+
sage: D
|
|
649
|
+
Guruswami-Sudan decoder for [250, 70, 181] Reed-Solomon Code over GF(251) decoding 97 errors with parameters (1, 2)
|
|
650
|
+
"""
|
|
651
|
+
return "Guruswami-Sudan decoder for %s decoding %s errors with parameters %s" % (self.code(), self.decoding_radius(), (self.multiplicity(), self.list_size()))
|
|
652
|
+
|
|
653
|
+
def _latex_(self):
|
|
654
|
+
r"""
|
|
655
|
+
Return a string representation of ``self``.
|
|
656
|
+
|
|
657
|
+
EXAMPLES::
|
|
658
|
+
|
|
659
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
660
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
661
|
+
sage: latex(D)
|
|
662
|
+
\textnormal{Guruswami-Sudan decoder for } [250, 70, 181] \textnormal{ Reed-Solomon Code over } \Bold{F}_{251}\textnormal{ decoding }97\textnormal{ errors with parameters }(1, 2)
|
|
663
|
+
"""
|
|
664
|
+
return "\\textnormal{Guruswami-Sudan decoder for } %s\\textnormal{ decoding }%s\\textnormal{ errors with parameters }%s" % (self.code()._latex_(), self.decoding_radius(), (self.multiplicity(), self.list_size()))
|
|
665
|
+
|
|
666
|
+
def __eq__(self, other):
|
|
667
|
+
r"""
|
|
668
|
+
Test equality between GRSGuruswamiSudanDecoder objects.
|
|
669
|
+
|
|
670
|
+
EXAMPLES::
|
|
671
|
+
|
|
672
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
673
|
+
sage: D1 = C.decoder("GuruswamiSudan", tau=97)
|
|
674
|
+
sage: D2 = C.decoder("GuruswamiSudan", tau=97)
|
|
675
|
+
sage: D1.__eq__(D2)
|
|
676
|
+
True
|
|
677
|
+
"""
|
|
678
|
+
return isinstance(other, GRSGuruswamiSudanDecoder)\
|
|
679
|
+
and self.code() == other.code()\
|
|
680
|
+
and self.decoding_radius() == other.decoding_radius()\
|
|
681
|
+
and self.multiplicity() == other.multiplicity()\
|
|
682
|
+
and self.list_size() == other.list_size()\
|
|
683
|
+
and self.interpolation_algorithm() == other.interpolation_algorithm()\
|
|
684
|
+
and self.rootfinding_algorithm() == other.rootfinding_algorithm()
|
|
685
|
+
|
|
686
|
+
def interpolation_algorithm(self):
|
|
687
|
+
r"""
|
|
688
|
+
Return the interpolation algorithm that will be used.
|
|
689
|
+
|
|
690
|
+
Remember that its signature has to be:
|
|
691
|
+
``my_inter(interpolation_points, tau, s_and_l, wy)``.
|
|
692
|
+
See :meth:`sage.coding.guruswami_sudan.interpolation.gs_interpolation_linalg`
|
|
693
|
+
for an example.
|
|
694
|
+
|
|
695
|
+
EXAMPLES::
|
|
696
|
+
|
|
697
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
698
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
699
|
+
sage: D.interpolation_algorithm()
|
|
700
|
+
<function gs_interpolation_lee_osullivan at 0x...>
|
|
701
|
+
"""
|
|
702
|
+
return self._interpolation_alg
|
|
703
|
+
|
|
704
|
+
def rootfinding_algorithm(self):
|
|
705
|
+
r"""
|
|
706
|
+
Return the rootfinding algorithm that will be used.
|
|
707
|
+
|
|
708
|
+
Remember that its signature has to be:
|
|
709
|
+
``my_rootfinder(Q, maxd=default_value, precision=default_value)``.
|
|
710
|
+
See :meth:`roth_ruckenstein_root_finder`
|
|
711
|
+
for an example.
|
|
712
|
+
|
|
713
|
+
EXAMPLES::
|
|
714
|
+
|
|
715
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
716
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
717
|
+
sage: D.rootfinding_algorithm()
|
|
718
|
+
<function alekhnovich_root_finder at 0x...>
|
|
719
|
+
"""
|
|
720
|
+
return self._root_finder
|
|
721
|
+
|
|
722
|
+
def parameters(self):
|
|
723
|
+
r"""
|
|
724
|
+
Return the multiplicity and list size parameters of ``self``.
|
|
725
|
+
|
|
726
|
+
EXAMPLES::
|
|
727
|
+
|
|
728
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
729
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
730
|
+
sage: D.parameters()
|
|
731
|
+
(1, 2)
|
|
732
|
+
"""
|
|
733
|
+
return (self._s, self._ell)
|
|
734
|
+
|
|
735
|
+
def multiplicity(self):
|
|
736
|
+
r"""
|
|
737
|
+
Return the multiplicity parameter of ``self``.
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
742
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
743
|
+
sage: D.multiplicity()
|
|
744
|
+
1
|
|
745
|
+
"""
|
|
746
|
+
return self._s
|
|
747
|
+
|
|
748
|
+
def list_size(self):
|
|
749
|
+
r"""
|
|
750
|
+
Return the list size parameter of ``self``.
|
|
751
|
+
|
|
752
|
+
EXAMPLES::
|
|
753
|
+
|
|
754
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
755
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
756
|
+
sage: D.list_size()
|
|
757
|
+
2
|
|
758
|
+
"""
|
|
759
|
+
return self._ell
|
|
760
|
+
|
|
761
|
+
def decode_to_message(self, r):
|
|
762
|
+
r"""
|
|
763
|
+
Decode ``r`` to the list of polynomials whose encoding by
|
|
764
|
+
:meth:`self.code()` is within Hamming distance
|
|
765
|
+
:meth:`self.decoding_radius` of ``r``.
|
|
766
|
+
|
|
767
|
+
INPUT:
|
|
768
|
+
|
|
769
|
+
- ``r`` -- a received word, i.e. a vector in `F^n` where `F` and `n` are
|
|
770
|
+
the base field respectively length of :meth:`self.code`
|
|
771
|
+
|
|
772
|
+
EXAMPLES::
|
|
773
|
+
|
|
774
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
775
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(17).list()[:15], 6)
|
|
776
|
+
sage: D = GSD(C, tau=5)
|
|
777
|
+
sage: F.<x> = GF(17)[]
|
|
778
|
+
sage: m = 13*x^4 + 7*x^3 + 10*x^2 + 14*x + 3
|
|
779
|
+
sage: c = D.connected_encoder().encode(m)
|
|
780
|
+
sage: r = vector(GF(17), [3,13,12,0,0,7,5,1,8,11,15,12,14,7,10])
|
|
781
|
+
sage: (c-r).hamming_weight()
|
|
782
|
+
5
|
|
783
|
+
sage: messages = D.decode_to_message(r)
|
|
784
|
+
sage: len(messages)
|
|
785
|
+
2
|
|
786
|
+
sage: m in messages
|
|
787
|
+
True
|
|
788
|
+
|
|
789
|
+
TESTS:
|
|
790
|
+
|
|
791
|
+
If one has provided a method as a ``root_finder`` or a ``interpolation_alg`` which
|
|
792
|
+
does not fit the allowed signature, an exception will be raised::
|
|
793
|
+
|
|
794
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(17).list()[:15], 6)
|
|
795
|
+
sage: D = GSD(C, tau=5, root_finder=next_prime)
|
|
796
|
+
sage: F.<x> = GF(17)[]
|
|
797
|
+
sage: m = 9*x^5 + 10*x^4 + 9*x^3 + 7*x^2 + 15*x + 2
|
|
798
|
+
sage: c = D.connected_encoder().encode(m)
|
|
799
|
+
sage: r = vector(GF(17), [3,1,4,2,14,1,0,4,13,12,1,16,1,13,15])
|
|
800
|
+
sage: m in D.decode_to_message(r)
|
|
801
|
+
Traceback (most recent call last):
|
|
802
|
+
...
|
|
803
|
+
ValueError: The provided root-finding algorithm has a wrong signature.
|
|
804
|
+
See the documentation of `...rootfinding_algorithm()` for details
|
|
805
|
+
"""
|
|
806
|
+
return [self.connected_encoder().unencode(c) for c in self.decode_to_code(r)]
|
|
807
|
+
|
|
808
|
+
def decode_to_code(self, r):
|
|
809
|
+
r"""
|
|
810
|
+
Return the list of all codeword within radius :meth:`self.decoding_radius` of the received word `r`.
|
|
811
|
+
|
|
812
|
+
INPUT:
|
|
813
|
+
|
|
814
|
+
- ``r`` -- a received word, i.e. a vector in `F^n` where `F` and `n` are
|
|
815
|
+
the base field respectively length of :meth:`self.code`
|
|
816
|
+
|
|
817
|
+
EXAMPLES::
|
|
818
|
+
|
|
819
|
+
sage: GSD = codes.decoders.GRSGuruswamiSudanDecoder
|
|
820
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(17).list()[:15], 6)
|
|
821
|
+
sage: D = GSD(C, tau=5)
|
|
822
|
+
sage: c = vector(GF(17), [3,13,12,0,0,7,5,1,8,11,1,9,4,12,14])
|
|
823
|
+
sage: c in C
|
|
824
|
+
True
|
|
825
|
+
sage: r = vector(GF(17), [3,13,12,0,0,7,5,1,8,11,15,12,14,7,10])
|
|
826
|
+
sage: r in C
|
|
827
|
+
False
|
|
828
|
+
sage: codewords = D.decode_to_code(r)
|
|
829
|
+
sage: len(codewords)
|
|
830
|
+
2
|
|
831
|
+
sage: c in codewords
|
|
832
|
+
True
|
|
833
|
+
|
|
834
|
+
TESTS:
|
|
835
|
+
|
|
836
|
+
Check that :issue:`21347` is fixed::
|
|
837
|
+
|
|
838
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(13).list()[:10], 3)
|
|
839
|
+
sage: D = GSD(C, tau=4)
|
|
840
|
+
sage: c = vector(GF(13), [6, 8, 2, 1, 5, 1, 2, 8, 6, 9])
|
|
841
|
+
sage: e = vector(GF(13), [1, 0, 0, 1, 1, 0, 0, 1, 0, 1])
|
|
842
|
+
sage: D.decode_to_code(c+e)
|
|
843
|
+
[]
|
|
844
|
+
"""
|
|
845
|
+
C = self.code()
|
|
846
|
+
k = C.dimension()
|
|
847
|
+
alphas = C.evaluation_points()
|
|
848
|
+
colmults = C.column_multipliers()
|
|
849
|
+
s = self.multiplicity()
|
|
850
|
+
l = self.list_size()
|
|
851
|
+
tau = self.decoding_radius()
|
|
852
|
+
# SETUP INTERPOLATION PROBLEM
|
|
853
|
+
wy = k-1
|
|
854
|
+
points = [(alphas[i], r[i]/colmults[i]) for i in range(len(alphas))]
|
|
855
|
+
# SOLVE INTERPOLATION
|
|
856
|
+
try:
|
|
857
|
+
Q = self.interpolation_algorithm()(points, tau, (s,l), wy)
|
|
858
|
+
except TypeError:
|
|
859
|
+
raise ValueError("The provided interpolation algorithm has a wrong signature. See the documentation of `codes.decoders.GRSGuruswamiSudanDecoder.interpolation_algorithm()` for details")
|
|
860
|
+
# EXAMINE THE FACTORS AND CONVERT TO CODEWORDS
|
|
861
|
+
try:
|
|
862
|
+
polynomials = self.rootfinding_algorithm()(Q, maxd=wy)
|
|
863
|
+
except TypeError:
|
|
864
|
+
raise ValueError("The provided root-finding algorithm has a wrong signature. See the documentation of `codes.decoders.GRSGuruswamiSudanDecoder.rootfinding_algorithm()` for details")
|
|
865
|
+
if not polynomials:
|
|
866
|
+
return []
|
|
867
|
+
|
|
868
|
+
E = self.connected_encoder()
|
|
869
|
+
codewords = [ E.encode(f) for f in polynomials]
|
|
870
|
+
# Root-finding might find spurious roots. Return only the ones which give nearby codewords
|
|
871
|
+
return [ c for c in codewords if (r - c).hamming_weight() <= tau ]
|
|
872
|
+
|
|
873
|
+
def decoding_radius(self):
|
|
874
|
+
r"""
|
|
875
|
+
Return the maximal number of errors that ``self`` is able to correct.
|
|
876
|
+
|
|
877
|
+
EXAMPLES::
|
|
878
|
+
|
|
879
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
880
|
+
sage: D = C.decoder("GuruswamiSudan", tau=97)
|
|
881
|
+
sage: D.decoding_radius()
|
|
882
|
+
97
|
|
883
|
+
|
|
884
|
+
An example where tau is not one of the inputs to the constructor::
|
|
885
|
+
|
|
886
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(251).list()[:250], 70)
|
|
887
|
+
sage: D = C.decoder("GuruswamiSudan", parameters=(2,4))
|
|
888
|
+
sage: D.decoding_radius()
|
|
889
|
+
105
|
|
890
|
+
"""
|
|
891
|
+
return self._tau
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
####################### types ###############################
|
|
895
|
+
|
|
896
|
+
GeneralizedReedSolomonCode._registered_decoders["GuruswamiSudan"] = GRSGuruswamiSudanDecoder
|
|
897
|
+
GRSGuruswamiSudanDecoder._decoder_type = {"list-decoder", "always-succeed", "hard-decision"}
|