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,804 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Linear code constructors that do not preserve the structural information
|
|
5
|
+
|
|
6
|
+
This file contains a variety of constructions which builds the generator matrix
|
|
7
|
+
of special (or random) linear codes and wraps them in a
|
|
8
|
+
:class:`sage.coding.linear_code.LinearCode` object. These constructions are
|
|
9
|
+
therefore not rich objects such as
|
|
10
|
+
:class:`sage.coding.grs_code.GeneralizedReedSolomonCode`.
|
|
11
|
+
|
|
12
|
+
All codes available here can be accessed through the ``codes`` object::
|
|
13
|
+
|
|
14
|
+
sage: codes.random_linear_code(GF(2), 5, 2)
|
|
15
|
+
[5, 2] linear code over GF(2)
|
|
16
|
+
|
|
17
|
+
REFERENCES:
|
|
18
|
+
|
|
19
|
+
- [HP2003]_
|
|
20
|
+
|
|
21
|
+
AUTHORS:
|
|
22
|
+
|
|
23
|
+
- David Joyner (2007-05): initial version
|
|
24
|
+
|
|
25
|
+
- David Joyner (2008-02): added cyclic codes, Hamming codes
|
|
26
|
+
|
|
27
|
+
- David Joyner (2008-03): added BCH code, LinearCodeFromCheckmatrix, ReedSolomonCode, WalshCode,
|
|
28
|
+
DuadicCodeEvenPair, DuadicCodeOddPair, QR codes (even and odd)
|
|
29
|
+
|
|
30
|
+
- David Joyner (2008-09) fix for bug in BCHCode reported by F. Voloch
|
|
31
|
+
|
|
32
|
+
- David Joyner (2008-10) small docstring changes to WalshCode and walsh_matrix
|
|
33
|
+
"""
|
|
34
|
+
# ****************************************************************************
|
|
35
|
+
# Copyright (C) 2007 David Joyner <wdjoyner@gmail.com>
|
|
36
|
+
#
|
|
37
|
+
# This program is free software: you can redistribute it and/or modify
|
|
38
|
+
# it under the terms of the GNU General Public License as published by
|
|
39
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
40
|
+
# (at your option) any later version.
|
|
41
|
+
# https://www.gnu.org/licenses/
|
|
42
|
+
# ****************************************************************************
|
|
43
|
+
|
|
44
|
+
from sage.arith.misc import gcd, quadratic_residues
|
|
45
|
+
from sage.matrix.constructor import matrix
|
|
46
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
47
|
+
from sage.matrix.special import random_matrix
|
|
48
|
+
from sage.misc.misc_c import prod
|
|
49
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
50
|
+
from sage.rings.finite_rings.integer_mod import Mod
|
|
51
|
+
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
|
|
52
|
+
from sage.rings.integer import Integer
|
|
53
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
54
|
+
from sage.structure.sequence import Sequence, Sequence_generic
|
|
55
|
+
|
|
56
|
+
from .linear_code import LinearCode
|
|
57
|
+
|
|
58
|
+
############### utility functions ################
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _is_a_splitting(S1, S2, n, return_automorphism=False):
|
|
62
|
+
r"""
|
|
63
|
+
Check whether ``(S1,S2)`` is a splitting of `\ZZ/n\ZZ`.
|
|
64
|
+
|
|
65
|
+
A splitting of `R = \ZZ/n\ZZ` is a pair of subsets of `R` which is a
|
|
66
|
+
partition of `R \\backslash \{0\}` and such that there exists an element `r`
|
|
67
|
+
of `R` such that `r S_1 = S_2` and `r S_2 = S_1` (where `r S` is the
|
|
68
|
+
point-wise multiplication of the elements of `S` by `r`).
|
|
69
|
+
|
|
70
|
+
Splittings are useful for computing idempotents in the quotient
|
|
71
|
+
ring `Q = GF(q)[x]/(x^n-1)`.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``S1``, ``S2`` -- disjoint sublists partitioning ``[1, 2, ..., n-1]``
|
|
76
|
+
|
|
77
|
+
- ``n`` -- integer
|
|
78
|
+
|
|
79
|
+
- ``return_automorphism`` -- boolean (default: ``False``); whether to
|
|
80
|
+
return the automorphism exchanging `S_1` and `S_2`
|
|
81
|
+
|
|
82
|
+
OUTPUT:
|
|
83
|
+
|
|
84
|
+
If ``return_automorphism is False`` (default) the function returns boolean values.
|
|
85
|
+
|
|
86
|
+
Otherwise, it returns a pair ``(b, r)`` where ``b`` is a boolean indicating
|
|
87
|
+
whether `S1`, `S2` is a splitting of `n`, and `r` is such that `r S_1 = S_2`
|
|
88
|
+
and `r S_2 = S_1` (if `b` is ``False``, `r` is equal to ``None``).
|
|
89
|
+
|
|
90
|
+
EXAMPLES::
|
|
91
|
+
|
|
92
|
+
sage: from sage.coding.code_constructions import _is_a_splitting
|
|
93
|
+
sage: _is_a_splitting([1,2],[3,4],5)
|
|
94
|
+
True
|
|
95
|
+
sage: _is_a_splitting([1,2],[3,4],5,return_automorphism=True)
|
|
96
|
+
(True, 4)
|
|
97
|
+
|
|
98
|
+
sage: _is_a_splitting([1,3],[2,4,5,6],7)
|
|
99
|
+
False
|
|
100
|
+
sage: _is_a_splitting([1,3,4],[2,5,6],7)
|
|
101
|
+
False
|
|
102
|
+
|
|
103
|
+
sage: for P in SetPartitions(6,[3,3]): # needs sage.combinat
|
|
104
|
+
....: res,aut= _is_a_splitting(P[0],P[1],7,return_automorphism=True)
|
|
105
|
+
....: if res:
|
|
106
|
+
....: print((aut, P))
|
|
107
|
+
(3, {{1, 2, 4}, {3, 5, 6}})
|
|
108
|
+
(6, {{1, 2, 3}, {4, 5, 6}})
|
|
109
|
+
(6, {{1, 3, 5}, {2, 4, 6}})
|
|
110
|
+
(6, {{1, 4, 5}, {2, 3, 6}})
|
|
111
|
+
|
|
112
|
+
We illustrate now how to find idempotents in quotient rings::
|
|
113
|
+
|
|
114
|
+
sage: n = 11; q = 3
|
|
115
|
+
sage: C = Zmod(n).cyclotomic_cosets(q); C
|
|
116
|
+
[[0], [1, 3, 4, 5, 9], [2, 6, 7, 8, 10]]
|
|
117
|
+
sage: S1 = C[1]
|
|
118
|
+
sage: S2 = C[2]
|
|
119
|
+
sage: _is_a_splitting(S1,S2,11)
|
|
120
|
+
True
|
|
121
|
+
sage: F = GF(q)
|
|
122
|
+
sage: P.<x> = PolynomialRing(F,"x")
|
|
123
|
+
sage: I = Ideal(P,[x^n-1])
|
|
124
|
+
sage: Q.<x> = QuotientRing(P,I)
|
|
125
|
+
sage: i1 = -sum([x^i for i in S1]); i1
|
|
126
|
+
2*x^9 + 2*x^5 + 2*x^4 + 2*x^3 + 2*x
|
|
127
|
+
sage: i2 = -sum([x^i for i in S2]); i2
|
|
128
|
+
2*x^10 + 2*x^8 + 2*x^7 + 2*x^6 + 2*x^2
|
|
129
|
+
sage: i1^2 == i1
|
|
130
|
+
True
|
|
131
|
+
sage: i2^2 == i2
|
|
132
|
+
True
|
|
133
|
+
sage: (1-i1)^2 == 1-i1
|
|
134
|
+
True
|
|
135
|
+
sage: (1-i2)^2 == 1-i2
|
|
136
|
+
True
|
|
137
|
+
|
|
138
|
+
We return to dealing with polynomials (rather than elements of
|
|
139
|
+
quotient rings), so we can construct cyclic codes::
|
|
140
|
+
|
|
141
|
+
sage: P.<x> = PolynomialRing(F,"x")
|
|
142
|
+
sage: i1 = -sum([x^i for i in S1])
|
|
143
|
+
sage: i2 = -sum([x^i for i in S2])
|
|
144
|
+
sage: i1_sqrd = (i1^2).quo_rem(x^n-1)[1]
|
|
145
|
+
sage: i1_sqrd == i1
|
|
146
|
+
True
|
|
147
|
+
sage: i2_sqrd = (i2^2).quo_rem(x^n-1)[1]
|
|
148
|
+
sage: i2_sqrd == i2
|
|
149
|
+
True
|
|
150
|
+
sage: C1 = codes.CyclicCode(length = n, generator_pol = gcd(i1, x^n - 1))
|
|
151
|
+
sage: C2 = codes.CyclicCode(length = n, generator_pol = gcd(1-i2, x^n - 1))
|
|
152
|
+
sage: C1.dual_code().systematic_generator_matrix() == C2.systematic_generator_matrix()
|
|
153
|
+
True
|
|
154
|
+
|
|
155
|
+
This is a special case of Theorem 6.4.3 in [HP2003]_.
|
|
156
|
+
"""
|
|
157
|
+
R = IntegerModRing(n)
|
|
158
|
+
S1 = {R(x) for x in S1}
|
|
159
|
+
S2 = {R(x) for x in S2}
|
|
160
|
+
|
|
161
|
+
# we first check whether (S1,S2) is a partition of R - {0}
|
|
162
|
+
if (len(S1) + len(S2) != n-1 or len(S1) != len(S2) or
|
|
163
|
+
R.zero() in S1 or R.zero() in S2 or not S1.isdisjoint(S2)):
|
|
164
|
+
if return_automorphism:
|
|
165
|
+
return False, None
|
|
166
|
+
else:
|
|
167
|
+
return False
|
|
168
|
+
|
|
169
|
+
# now that we know that (S1,S2) is a partition, we look for an invertible
|
|
170
|
+
# element b that maps S1 to S2 by multiplication
|
|
171
|
+
for b in Integer(n).coprime_integers(n):
|
|
172
|
+
if b >= 2 and all(b * x in S2 for x in S1):
|
|
173
|
+
if return_automorphism:
|
|
174
|
+
return True, b
|
|
175
|
+
else:
|
|
176
|
+
return True
|
|
177
|
+
if return_automorphism:
|
|
178
|
+
return False, None
|
|
179
|
+
else:
|
|
180
|
+
return False
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _lift2smallest_field(a):
|
|
184
|
+
"""
|
|
185
|
+
INPUT:
|
|
186
|
+
|
|
187
|
+
- ``a`` -- an element of a finite field GF(q)
|
|
188
|
+
|
|
189
|
+
OUTPUT: the element b of the smallest subfield F of GF(q) for
|
|
190
|
+
which F(b)=a.
|
|
191
|
+
|
|
192
|
+
EXAMPLES::
|
|
193
|
+
|
|
194
|
+
sage: from sage.coding.code_constructions import _lift2smallest_field
|
|
195
|
+
sage: FF.<z> = GF(3^4,"z")
|
|
196
|
+
sage: a = z^10
|
|
197
|
+
sage: _lift2smallest_field(a)
|
|
198
|
+
(2*z + 1, Finite Field in z of size 3^2)
|
|
199
|
+
sage: a = z^40
|
|
200
|
+
sage: _lift2smallest_field(a)
|
|
201
|
+
(2, Finite Field of size 3)
|
|
202
|
+
|
|
203
|
+
AUTHORS:
|
|
204
|
+
|
|
205
|
+
- John Cremona
|
|
206
|
+
"""
|
|
207
|
+
FF = a.parent()
|
|
208
|
+
k = FF.degree()
|
|
209
|
+
if k == 1:
|
|
210
|
+
return a, FF
|
|
211
|
+
pol = a.minimal_polynomial()
|
|
212
|
+
d = pol.degree()
|
|
213
|
+
if d == k:
|
|
214
|
+
return a, FF
|
|
215
|
+
p = FF.characteristic()
|
|
216
|
+
F = GF((p, d), "z")
|
|
217
|
+
b = pol.roots(F, multiplicities=False)[0]
|
|
218
|
+
return b, F
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def permutation_action(g, v):
|
|
222
|
+
r"""
|
|
223
|
+
Return permutation of rows `g * v`.
|
|
224
|
+
|
|
225
|
+
Works on lists, matrices,
|
|
226
|
+
sequences and vectors (by permuting coordinates). The code requires
|
|
227
|
+
switching from `i` to `i+1` (and back again) since the :class:`SymmetricGroup`
|
|
228
|
+
is, by convention, the symmetric group on the "letters" `1`, `2`, ...,
|
|
229
|
+
`n` (not `0`, `1`, ..., `n-1`).
|
|
230
|
+
|
|
231
|
+
EXAMPLES::
|
|
232
|
+
|
|
233
|
+
sage: # needs sage.groups
|
|
234
|
+
sage: V = VectorSpace(GF(3),5)
|
|
235
|
+
sage: v = V([0,1,2,0,1])
|
|
236
|
+
sage: G = SymmetricGroup(5)
|
|
237
|
+
sage: g = G([(1,2,3)])
|
|
238
|
+
sage: permutation_action(g,v)
|
|
239
|
+
(1, 2, 0, 0, 1)
|
|
240
|
+
sage: g = G([()])
|
|
241
|
+
sage: permutation_action(g,v)
|
|
242
|
+
(0, 1, 2, 0, 1)
|
|
243
|
+
sage: g = G([(1,2,3,4,5)])
|
|
244
|
+
sage: permutation_action(g,v)
|
|
245
|
+
(1, 2, 0, 1, 0)
|
|
246
|
+
sage: L = Sequence([1,2,3,4,5])
|
|
247
|
+
sage: permutation_action(g,L)
|
|
248
|
+
[2, 3, 4, 5, 1]
|
|
249
|
+
sage: MS = MatrixSpace(GF(3),3,7)
|
|
250
|
+
sage: A = MS([[1,0,0,0,1,1,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,1]])
|
|
251
|
+
sage: S5 = SymmetricGroup(5)
|
|
252
|
+
sage: g = S5([(1,2,3)])
|
|
253
|
+
sage: A
|
|
254
|
+
[1 0 0 0 1 1 0]
|
|
255
|
+
[0 1 0 1 0 1 0]
|
|
256
|
+
[0 0 0 0 0 0 1]
|
|
257
|
+
sage: permutation_action(g,A)
|
|
258
|
+
[0 1 0 1 0 1 0]
|
|
259
|
+
[0 0 0 0 0 0 1]
|
|
260
|
+
[1 0 0 0 1 1 0]
|
|
261
|
+
|
|
262
|
+
It also works on lists and is a "left action"::
|
|
263
|
+
|
|
264
|
+
sage: # needs sage.groups
|
|
265
|
+
sage: v = [0,1,2,0,1]
|
|
266
|
+
sage: G = SymmetricGroup(5)
|
|
267
|
+
sage: g = G([(1,2,3)])
|
|
268
|
+
sage: gv = permutation_action(g,v); gv
|
|
269
|
+
[1, 2, 0, 0, 1]
|
|
270
|
+
sage: permutation_action(g,v) == g(v)
|
|
271
|
+
True
|
|
272
|
+
sage: h = G([(3,4)])
|
|
273
|
+
sage: gv = permutation_action(g,v)
|
|
274
|
+
sage: hgv = permutation_action(h,gv)
|
|
275
|
+
sage: hgv == permutation_action(h*g,v)
|
|
276
|
+
True
|
|
277
|
+
|
|
278
|
+
AUTHORS:
|
|
279
|
+
|
|
280
|
+
- David Joyner, licensed under the GPL v2 or greater.
|
|
281
|
+
"""
|
|
282
|
+
v_type_list = False
|
|
283
|
+
if isinstance(v, list):
|
|
284
|
+
v_type_list = True
|
|
285
|
+
v = Sequence(v)
|
|
286
|
+
if isinstance(v, Sequence_generic):
|
|
287
|
+
V = v.universe()
|
|
288
|
+
else:
|
|
289
|
+
V = v.parent()
|
|
290
|
+
n = len(list(v))
|
|
291
|
+
gv = [v[g(i + 1) - 1] for i in range(n)]
|
|
292
|
+
if v_type_list:
|
|
293
|
+
return gv
|
|
294
|
+
return V(gv)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def walsh_matrix(m0):
|
|
298
|
+
"""
|
|
299
|
+
This is the generator matrix of a Walsh code. The matrix of
|
|
300
|
+
codewords correspond to a Hadamard matrix.
|
|
301
|
+
|
|
302
|
+
EXAMPLES::
|
|
303
|
+
|
|
304
|
+
sage: walsh_matrix(2)
|
|
305
|
+
[0 0 1 1]
|
|
306
|
+
[0 1 0 1]
|
|
307
|
+
sage: walsh_matrix(3)
|
|
308
|
+
[0 0 0 0 1 1 1 1]
|
|
309
|
+
[0 0 1 1 0 0 1 1]
|
|
310
|
+
[0 1 0 1 0 1 0 1]
|
|
311
|
+
sage: C = LinearCode(walsh_matrix(4)); C
|
|
312
|
+
[16, 4] linear code over GF(2)
|
|
313
|
+
sage: C.spectrum()
|
|
314
|
+
[1, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
315
|
+
|
|
316
|
+
This last code has minimum distance 8.
|
|
317
|
+
|
|
318
|
+
REFERENCES:
|
|
319
|
+
|
|
320
|
+
- :wikipedia:`Hadamard_matrix`
|
|
321
|
+
"""
|
|
322
|
+
m = int(m0)
|
|
323
|
+
if m == 1:
|
|
324
|
+
return matrix(GF(2), 1, 2, [ 0, 1])
|
|
325
|
+
if m > 1:
|
|
326
|
+
row2 = [x.list() for x in walsh_matrix(m-1).augment(walsh_matrix(m-1)).rows()]
|
|
327
|
+
return matrix(GF(2), m, 2**m, [[0]*2**(m-1) + [1]*2**(m-1)] + row2)
|
|
328
|
+
raise ValueError("%s must be an integer > 0." % m0)
|
|
329
|
+
|
|
330
|
+
##################### main constructions #####################
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def DuadicCodeEvenPair(F, S1, S2):
|
|
334
|
+
r"""
|
|
335
|
+
Construct the "even pair" of duadic codes associated to the
|
|
336
|
+
"splitting" (see the docstring for ``_is_a_splitting``
|
|
337
|
+
for the definition) S1, S2 of n.
|
|
338
|
+
|
|
339
|
+
.. warning::
|
|
340
|
+
|
|
341
|
+
Maybe the splitting should be associated to a sum of
|
|
342
|
+
q-cyclotomic cosets mod n, where q is a *prime*.
|
|
343
|
+
|
|
344
|
+
EXAMPLES::
|
|
345
|
+
|
|
346
|
+
sage: from sage.coding.code_constructions import _is_a_splitting
|
|
347
|
+
sage: n = 11; q = 3
|
|
348
|
+
sage: C = Zmod(n).cyclotomic_cosets(q); C
|
|
349
|
+
[[0], [1, 3, 4, 5, 9], [2, 6, 7, 8, 10]]
|
|
350
|
+
sage: S1 = C[1]
|
|
351
|
+
sage: S2 = C[2]
|
|
352
|
+
sage: _is_a_splitting(S1,S2,11)
|
|
353
|
+
True
|
|
354
|
+
sage: codes.DuadicCodeEvenPair(GF(q),S1,S2)
|
|
355
|
+
([11, 5] Cyclic Code over GF(3),
|
|
356
|
+
[11, 5] Cyclic Code over GF(3))
|
|
357
|
+
"""
|
|
358
|
+
from sage.misc.stopgap import stopgap
|
|
359
|
+
stopgap("The function DuadicCodeEvenPair has several issues which may cause wrong results", 25896)
|
|
360
|
+
|
|
361
|
+
from .cyclic_code import CyclicCode
|
|
362
|
+
n = len(S1) + len(S2) + 1
|
|
363
|
+
if not _is_a_splitting(S1,S2,n):
|
|
364
|
+
raise TypeError("%s, %s must be a splitting of %s." % (S1,S2,n))
|
|
365
|
+
q = F.order()
|
|
366
|
+
k = Mod(q,n).multiplicative_order()
|
|
367
|
+
FF = GF(q**k,"z")
|
|
368
|
+
z = FF.gen()
|
|
369
|
+
zeta = z**((q**k-1)/n)
|
|
370
|
+
P1 = PolynomialRing(FF,"x")
|
|
371
|
+
x = P1.gen()
|
|
372
|
+
g1 = prod([x-zeta**i for i in S1+[0]])
|
|
373
|
+
g2 = prod([x-zeta**i for i in S2+[0]])
|
|
374
|
+
P2 = PolynomialRing(F,"x")
|
|
375
|
+
x = P2.gen()
|
|
376
|
+
gg1 = P2([_lift2smallest_field(c)[0] for c in g1.coefficients(sparse=False)])
|
|
377
|
+
gg2 = P2([_lift2smallest_field(c)[0] for c in g2.coefficients(sparse=False)])
|
|
378
|
+
C1 = CyclicCode(length=n, generator_pol=gg1)
|
|
379
|
+
C2 = CyclicCode(length=n, generator_pol=gg2)
|
|
380
|
+
return C1,C2
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
def DuadicCodeOddPair(F, S1, S2):
|
|
384
|
+
"""
|
|
385
|
+
Construct the "odd pair" of duadic codes associated to the
|
|
386
|
+
"splitting" S1, S2 of n.
|
|
387
|
+
|
|
388
|
+
.. warning::
|
|
389
|
+
|
|
390
|
+
Maybe the splitting should be associated to a sum of
|
|
391
|
+
q-cyclotomic cosets mod n, where q is a *prime*.
|
|
392
|
+
|
|
393
|
+
EXAMPLES::
|
|
394
|
+
|
|
395
|
+
sage: from sage.coding.code_constructions import _is_a_splitting
|
|
396
|
+
sage: n = 11; q = 3
|
|
397
|
+
sage: C = Zmod(n).cyclotomic_cosets(q); C
|
|
398
|
+
[[0], [1, 3, 4, 5, 9], [2, 6, 7, 8, 10]]
|
|
399
|
+
sage: S1 = C[1]
|
|
400
|
+
sage: S2 = C[2]
|
|
401
|
+
sage: _is_a_splitting(S1,S2,11)
|
|
402
|
+
True
|
|
403
|
+
sage: codes.DuadicCodeOddPair(GF(q),S1,S2)
|
|
404
|
+
([11, 6] Cyclic Code over GF(3),
|
|
405
|
+
[11, 6] Cyclic Code over GF(3))
|
|
406
|
+
|
|
407
|
+
This is consistent with Theorem 6.1.3 in [HP2003]_.
|
|
408
|
+
"""
|
|
409
|
+
from sage.misc.stopgap import stopgap
|
|
410
|
+
stopgap("The function DuadicCodeOddPair has several issues which may cause wrong results", 25896)
|
|
411
|
+
|
|
412
|
+
from .cyclic_code import CyclicCode
|
|
413
|
+
n = len(S1) + len(S2) + 1
|
|
414
|
+
if not _is_a_splitting(S1,S2,n):
|
|
415
|
+
raise TypeError("%s, %s must be a splitting of %s." % (S1,S2,n))
|
|
416
|
+
q = F.order()
|
|
417
|
+
k = Mod(q,n).multiplicative_order()
|
|
418
|
+
FF = GF(q**k,"z")
|
|
419
|
+
z = FF.gen()
|
|
420
|
+
zeta = z**((q**k-1)/n)
|
|
421
|
+
P1 = PolynomialRing(FF,"x")
|
|
422
|
+
x = P1.gen()
|
|
423
|
+
g1 = prod([x-zeta**i for i in S1+[0]])
|
|
424
|
+
g2 = prod([x-zeta**i for i in S2+[0]])
|
|
425
|
+
j = sum([x**i/n for i in range(n)])
|
|
426
|
+
P2 = PolynomialRing(F,"x")
|
|
427
|
+
x = P2.gen()
|
|
428
|
+
coeffs1 = [_lift2smallest_field(c)[0] for c in (g1+j).coefficients(sparse=False)]
|
|
429
|
+
coeffs2 = [_lift2smallest_field(c)[0] for c in (g2+j).coefficients(sparse=False)]
|
|
430
|
+
gg1 = P2(coeffs1)
|
|
431
|
+
gg2 = P2(coeffs2)
|
|
432
|
+
gg1 = gcd(gg1, x**n - 1)
|
|
433
|
+
gg2 = gcd(gg2, x**n - 1)
|
|
434
|
+
C1 = CyclicCode(length=n, generator_pol=gg1)
|
|
435
|
+
C2 = CyclicCode(length=n, generator_pol=gg2)
|
|
436
|
+
return C1,C2
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def ExtendedQuadraticResidueCode(n, F):
|
|
440
|
+
r"""
|
|
441
|
+
The extended quadratic residue code (or XQR code) is obtained from
|
|
442
|
+
a QR code by adding a check bit to the last coordinate. (These
|
|
443
|
+
codes have very remarkable properties such as large automorphism
|
|
444
|
+
groups and duality properties - see [HP2003]_, Section 6.6.3-6.6.4.)
|
|
445
|
+
|
|
446
|
+
INPUT:
|
|
447
|
+
|
|
448
|
+
- ``n`` -- an odd prime
|
|
449
|
+
|
|
450
|
+
- ``F`` -- a finite prime field whose order must be a
|
|
451
|
+
quadratic residue modulo `n`
|
|
452
|
+
|
|
453
|
+
OUTPUT: an extended quadratic residue code
|
|
454
|
+
|
|
455
|
+
EXAMPLES::
|
|
456
|
+
|
|
457
|
+
sage: C1 = codes.QuadraticResidueCode(7, GF(2))
|
|
458
|
+
sage: C2 = C1.extended_code()
|
|
459
|
+
sage: C3 = codes.ExtendedQuadraticResidueCode(7, GF(2)); C3
|
|
460
|
+
Extension of [7, 4] Cyclic Code over GF(2)
|
|
461
|
+
sage: C2 == C3
|
|
462
|
+
True
|
|
463
|
+
sage: C = codes.ExtendedQuadraticResidueCode(17, GF(2))
|
|
464
|
+
sage: C
|
|
465
|
+
Extension of [17, 9] Cyclic Code over GF(2)
|
|
466
|
+
sage: C3 = codes.QuadraticResidueCodeOddPair(7, GF(2))[0]
|
|
467
|
+
sage: C3x = C3.extended_code()
|
|
468
|
+
sage: C4 = codes.ExtendedQuadraticResidueCode(7, GF(2))
|
|
469
|
+
sage: C3x == C4
|
|
470
|
+
True
|
|
471
|
+
|
|
472
|
+
AUTHORS:
|
|
473
|
+
|
|
474
|
+
- David Joyner (07-2006)
|
|
475
|
+
"""
|
|
476
|
+
C = QuadraticResidueCodeOddPair(n,F)[0]
|
|
477
|
+
return C.extended_code()
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def from_parity_check_matrix(H):
|
|
481
|
+
r"""
|
|
482
|
+
Return the linear code that has ``H`` as a parity check matrix.
|
|
483
|
+
|
|
484
|
+
If ``H`` has dimensions `h \times n` then the linear code will have
|
|
485
|
+
dimension `n-h` and length `n`.
|
|
486
|
+
|
|
487
|
+
EXAMPLES::
|
|
488
|
+
|
|
489
|
+
sage: C = codes.HammingCode(GF(2), 3); C
|
|
490
|
+
[7, 4] Hamming Code over GF(2)
|
|
491
|
+
sage: H = C.parity_check_matrix(); H
|
|
492
|
+
[1 0 1 0 1 0 1]
|
|
493
|
+
[0 1 1 0 0 1 1]
|
|
494
|
+
[0 0 0 1 1 1 1]
|
|
495
|
+
sage: C2 = codes.from_parity_check_matrix(H); C2
|
|
496
|
+
[7, 4] linear code over GF(2)
|
|
497
|
+
sage: C2.systematic_generator_matrix() == C.systematic_generator_matrix()
|
|
498
|
+
True
|
|
499
|
+
"""
|
|
500
|
+
Cd = LinearCode(H)
|
|
501
|
+
return Cd.dual_code()
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def QuadraticResidueCode(n, F):
|
|
505
|
+
r"""
|
|
506
|
+
A quadratic residue code (or QR code) is a cyclic code whose
|
|
507
|
+
generator polynomial is the product of the polynomials
|
|
508
|
+
`x-\alpha^i` (`\alpha` is a primitive
|
|
509
|
+
`n`-th root of unity; `i` ranges over the set of
|
|
510
|
+
quadratic residues modulo `n`).
|
|
511
|
+
|
|
512
|
+
See :class:`QuadraticResidueCodeEvenPair` and
|
|
513
|
+
:class:`QuadraticResidueCodeOddPair` for a more general construction.
|
|
514
|
+
|
|
515
|
+
INPUT:
|
|
516
|
+
|
|
517
|
+
- ``n`` -- an odd prime
|
|
518
|
+
|
|
519
|
+
- ``F`` -- a finite prime field whose order must be a
|
|
520
|
+
quadratic residue modulo `n`
|
|
521
|
+
|
|
522
|
+
OUTPUT: a quadratic residue code
|
|
523
|
+
|
|
524
|
+
EXAMPLES::
|
|
525
|
+
|
|
526
|
+
sage: C = codes.QuadraticResidueCode(7, GF(2))
|
|
527
|
+
sage: C
|
|
528
|
+
[7, 4] Cyclic Code over GF(2)
|
|
529
|
+
sage: C = codes.QuadraticResidueCode(17, GF(2))
|
|
530
|
+
sage: C
|
|
531
|
+
[17, 9] Cyclic Code over GF(2)
|
|
532
|
+
sage: C1 = codes.QuadraticResidueCodeOddPair(7, GF(2))[0]
|
|
533
|
+
sage: C2 = codes.QuadraticResidueCode(7, GF(2))
|
|
534
|
+
sage: C1 == C2
|
|
535
|
+
True
|
|
536
|
+
sage: C1 = codes.QuadraticResidueCodeOddPair(17, GF(2))[0]
|
|
537
|
+
sage: C2 = codes.QuadraticResidueCode(17, GF(2))
|
|
538
|
+
sage: C1 == C2
|
|
539
|
+
True
|
|
540
|
+
|
|
541
|
+
AUTHORS:
|
|
542
|
+
|
|
543
|
+
- David Joyner (11-2005)
|
|
544
|
+
"""
|
|
545
|
+
return QuadraticResidueCodeOddPair(n,F)[0]
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def QuadraticResidueCodeEvenPair(n, F):
|
|
549
|
+
r"""
|
|
550
|
+
Quadratic residue codes of a given odd prime length and base ring
|
|
551
|
+
either don't exist at all or occur as 4-tuples - a pair of
|
|
552
|
+
"odd-like" codes and a pair of "even-like" codes. If `n > 2` is prime
|
|
553
|
+
then (Theorem 6.6.2 in [HP2003]_) a QR code exists over `\GF{q}` iff q is a
|
|
554
|
+
quadratic residue mod `n`.
|
|
555
|
+
|
|
556
|
+
They are constructed as "even-like" duadic codes associated the
|
|
557
|
+
splitting `(Q,N)` mod `n`, where `Q` is the set of nonzero quadratic
|
|
558
|
+
residues and `N` is the non-residues.
|
|
559
|
+
|
|
560
|
+
EXAMPLES::
|
|
561
|
+
|
|
562
|
+
sage: codes.QuadraticResidueCodeEvenPair(17, GF(13)) # known bug (#25896)
|
|
563
|
+
([17, 8] Cyclic Code over GF(13),
|
|
564
|
+
[17, 8] Cyclic Code over GF(13))
|
|
565
|
+
sage: codes.QuadraticResidueCodeEvenPair(17, GF(2))
|
|
566
|
+
([17, 8] Cyclic Code over GF(2),
|
|
567
|
+
[17, 8] Cyclic Code over GF(2))
|
|
568
|
+
sage: codes.QuadraticResidueCodeEvenPair(13, GF(9,"z")) # known bug (#25896)
|
|
569
|
+
([13, 6] Cyclic Code over GF(9),
|
|
570
|
+
[13, 6] Cyclic Code over GF(9))
|
|
571
|
+
sage: C1,C2 = codes.QuadraticResidueCodeEvenPair(7, GF(2))
|
|
572
|
+
sage: C1.is_self_orthogonal()
|
|
573
|
+
True
|
|
574
|
+
sage: C2.is_self_orthogonal()
|
|
575
|
+
True
|
|
576
|
+
sage: C3 = codes.QuadraticResidueCodeOddPair(17, GF(2))[0]
|
|
577
|
+
sage: C4 = codes.QuadraticResidueCodeEvenPair(17, GF(2))[1]
|
|
578
|
+
sage: C3.systematic_generator_matrix() == C4.dual_code().systematic_generator_matrix()
|
|
579
|
+
True
|
|
580
|
+
|
|
581
|
+
This is consistent with Theorem 6.6.9 and Exercise 365 in [HP2003]_.
|
|
582
|
+
|
|
583
|
+
TESTS::
|
|
584
|
+
|
|
585
|
+
sage: codes.QuadraticResidueCodeEvenPair(14,Zmod(4))
|
|
586
|
+
Traceback (most recent call last):
|
|
587
|
+
...
|
|
588
|
+
ValueError: the argument F must be a finite field
|
|
589
|
+
sage: codes.QuadraticResidueCodeEvenPair(14, GF(2))
|
|
590
|
+
Traceback (most recent call last):
|
|
591
|
+
...
|
|
592
|
+
ValueError: the argument n must be an odd prime
|
|
593
|
+
sage: codes.QuadraticResidueCodeEvenPair(5, GF(2))
|
|
594
|
+
Traceback (most recent call last):
|
|
595
|
+
...
|
|
596
|
+
ValueError: the order of the finite field must be a quadratic residue modulo n
|
|
597
|
+
"""
|
|
598
|
+
from sage.arith.srange import srange
|
|
599
|
+
from sage.categories.finite_fields import FiniteFields
|
|
600
|
+
if F not in FiniteFields():
|
|
601
|
+
raise ValueError("the argument F must be a finite field")
|
|
602
|
+
q = F.order()
|
|
603
|
+
n = Integer(n)
|
|
604
|
+
if n <= 2 or not n.is_prime():
|
|
605
|
+
raise ValueError("the argument n must be an odd prime")
|
|
606
|
+
Q = quadratic_residues(n)
|
|
607
|
+
Q.remove(0) # nonzero quad residues
|
|
608
|
+
N = [x for x in srange(1, n) if x not in Q] # nonzero quad non-residues
|
|
609
|
+
if q not in Q:
|
|
610
|
+
raise ValueError("the order of the finite field must be a quadratic residue modulo n")
|
|
611
|
+
return DuadicCodeEvenPair(F,Q,N)
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
def QuadraticResidueCodeOddPair(n, F):
|
|
615
|
+
r"""
|
|
616
|
+
Quadratic residue codes of a given odd prime length and base ring
|
|
617
|
+
either don't exist at all or occur as 4-tuples - a pair of
|
|
618
|
+
"odd-like" codes and a pair of "even-like" codes. If n 2 is prime
|
|
619
|
+
then (Theorem 6.6.2 in [HP2003]_) a QR code exists over `\GF{q} iff `q` is a
|
|
620
|
+
quadratic residue mod `n`.
|
|
621
|
+
|
|
622
|
+
They are constructed as "odd-like" duadic codes associated the
|
|
623
|
+
splitting `(Q,N)` mod `n`, where `Q` is the set of nonzero quadratic
|
|
624
|
+
residues and `N` is the non-residues.
|
|
625
|
+
|
|
626
|
+
EXAMPLES::
|
|
627
|
+
|
|
628
|
+
sage: codes.QuadraticResidueCodeOddPair(17, GF(13)) # known bug (#25896)
|
|
629
|
+
([17, 9] Cyclic Code over GF(13),
|
|
630
|
+
[17, 9] Cyclic Code over GF(13))
|
|
631
|
+
sage: codes.QuadraticResidueCodeOddPair(17, GF(2))
|
|
632
|
+
([17, 9] Cyclic Code over GF(2),
|
|
633
|
+
[17, 9] Cyclic Code over GF(2))
|
|
634
|
+
sage: codes.QuadraticResidueCodeOddPair(13, GF(9,"z")) # known bug (#25896)
|
|
635
|
+
([13, 7] Cyclic Code over GF(9),
|
|
636
|
+
[13, 7] Cyclic Code over GF(9))
|
|
637
|
+
sage: C1 = codes.QuadraticResidueCodeOddPair(17, GF(2))[1]
|
|
638
|
+
sage: C1x = C1.extended_code()
|
|
639
|
+
sage: C2 = codes.QuadraticResidueCodeOddPair(17, GF(2))[0]
|
|
640
|
+
sage: C2x = C2.extended_code()
|
|
641
|
+
sage: C2x.spectrum(); C1x.spectrum()
|
|
642
|
+
[1, 0, 0, 0, 0, 0, 102, 0, 153, 0, 153, 0, 102, 0, 0, 0, 0, 0, 1]
|
|
643
|
+
[1, 0, 0, 0, 0, 0, 102, 0, 153, 0, 153, 0, 102, 0, 0, 0, 0, 0, 1]
|
|
644
|
+
sage: C3 = codes.QuadraticResidueCodeOddPair(7, GF(2))[0]
|
|
645
|
+
sage: C3x = C3.extended_code()
|
|
646
|
+
sage: C3x.spectrum()
|
|
647
|
+
[1, 0, 0, 0, 14, 0, 0, 0, 1]
|
|
648
|
+
|
|
649
|
+
This is consistent with Theorem 6.6.14 in [HP2003]_.
|
|
650
|
+
|
|
651
|
+
TESTS::
|
|
652
|
+
|
|
653
|
+
sage: codes.QuadraticResidueCodeOddPair(9, GF(2))
|
|
654
|
+
Traceback (most recent call last):
|
|
655
|
+
...
|
|
656
|
+
ValueError: the argument n must be an odd prime
|
|
657
|
+
"""
|
|
658
|
+
from sage.arith.srange import srange
|
|
659
|
+
from sage.categories.finite_fields import FiniteFields
|
|
660
|
+
if F not in FiniteFields():
|
|
661
|
+
raise ValueError("the argument F must be a finite field")
|
|
662
|
+
q = F.order()
|
|
663
|
+
n = Integer(n)
|
|
664
|
+
if n <= 2 or not n.is_prime():
|
|
665
|
+
raise ValueError("the argument n must be an odd prime")
|
|
666
|
+
Q = quadratic_residues(n)
|
|
667
|
+
Q.remove(0) # nonzero quad residues
|
|
668
|
+
N = [x for x in srange(1, n) if x not in Q] # nonzero quad non-residues
|
|
669
|
+
if q not in Q:
|
|
670
|
+
raise ValueError("the order of the finite field must be a quadratic residue modulo n")
|
|
671
|
+
return DuadicCodeOddPair(F,Q,N)
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
def random_linear_code(F, length, dimension):
|
|
675
|
+
r"""
|
|
676
|
+
Generate a random linear code of length ``length``, dimension ``dimension``
|
|
677
|
+
and over the field ``F``.
|
|
678
|
+
|
|
679
|
+
This function is Las Vegas probabilistic: always correct, usually fast.
|
|
680
|
+
Random matrices over the ``F`` are drawn until one with full rank is hit.
|
|
681
|
+
|
|
682
|
+
If ``F`` is infinite, the distribution of the elements in the random
|
|
683
|
+
generator matrix will be random according to the distribution of
|
|
684
|
+
``F.random_element()``.
|
|
685
|
+
|
|
686
|
+
EXAMPLES::
|
|
687
|
+
|
|
688
|
+
sage: C = codes.random_linear_code(GF(2), 10, 3)
|
|
689
|
+
sage: C
|
|
690
|
+
[10, 3] linear code over GF(2)
|
|
691
|
+
sage: C.generator_matrix().rank()
|
|
692
|
+
3
|
|
693
|
+
"""
|
|
694
|
+
while True:
|
|
695
|
+
G = random_matrix(F, dimension, length)
|
|
696
|
+
if G.rank() == dimension:
|
|
697
|
+
return LinearCode(G)
|
|
698
|
+
|
|
699
|
+
|
|
700
|
+
def ToricCode(P, F):
|
|
701
|
+
r"""
|
|
702
|
+
Let `P` denote a list of lattice points in
|
|
703
|
+
`\ZZ^d` and let `T` denote the set of all
|
|
704
|
+
points in `(F^x)^d` (ordered in some fixed way). Put
|
|
705
|
+
`n=|T|` and let `k` denote the dimension of the
|
|
706
|
+
vector space of functions `V = \mathrm{Span}\{x^e \ |\ e \in P\}`.
|
|
707
|
+
The associated toric code `C` is the evaluation code which
|
|
708
|
+
is the image of the evaluation map
|
|
709
|
+
|
|
710
|
+
.. MATH::
|
|
711
|
+
|
|
712
|
+
\operatorname{eval}_T : V \rightarrow F^n,
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
where `x^e` is the multi-index notation
|
|
716
|
+
(`x=(x_1,...,x_d)`, `e=(e_1,...,e_d)`, and
|
|
717
|
+
`x^e = x_1^{e_1}...x_d^{e_d}`), where
|
|
718
|
+
`\operatorname{eval}_T (f(x)) = (f(t_1),...,f(t_n))`, and where
|
|
719
|
+
`T=\{t_1,...,t_n\}`. This function returns the toric
|
|
720
|
+
codes discussed in [Joy2004]_.
|
|
721
|
+
|
|
722
|
+
INPUT:
|
|
723
|
+
|
|
724
|
+
- ``P`` -- all the integer lattice points in a polytope
|
|
725
|
+
defining the toric variety
|
|
726
|
+
|
|
727
|
+
- ``F`` -- a finite field
|
|
728
|
+
|
|
729
|
+
OUTPUT: toric code with length `n`, dimension `k` over field `F`
|
|
730
|
+
|
|
731
|
+
EXAMPLES::
|
|
732
|
+
|
|
733
|
+
sage: C = codes.ToricCode([[0,0],[1,0],[2,0],[0,1],[1,1]], GF(7))
|
|
734
|
+
sage: C
|
|
735
|
+
[36, 5] linear code over GF(7)
|
|
736
|
+
sage: C.minimum_distance() # needs sage.groups
|
|
737
|
+
24
|
|
738
|
+
sage: C.minimum_distance(algorithm='guava') # optional - gap_package_guava
|
|
739
|
+
...24
|
|
740
|
+
sage: C = codes.ToricCode([[-2,-2],[-1,-2],[-1,-1],[-1,0],
|
|
741
|
+
....: [0,-1],[0,0],[0,1],[1,-1],[1,0]], GF(5))
|
|
742
|
+
sage: C
|
|
743
|
+
[16, 9] linear code over GF(5)
|
|
744
|
+
sage: C.minimum_distance() # needs sage.groups
|
|
745
|
+
6
|
|
746
|
+
sage: C.minimum_distance(algorithm='guava') # optional - gap_package_guava
|
|
747
|
+
6
|
|
748
|
+
sage: C = codes.ToricCode([[0,0],[1,1],[1,2],[1,3],[1,4],[2,1],
|
|
749
|
+
....: [2,2],[2,3],[3,1],[3,2],[4,1]], GF(8,"a"))
|
|
750
|
+
sage: C
|
|
751
|
+
[49, 11] linear code over GF(8)
|
|
752
|
+
|
|
753
|
+
This is in fact a [49,11,28] code over `\GF{8}`. If you type next
|
|
754
|
+
``C.minimum_distance()`` and wait overnight (!), you
|
|
755
|
+
should get 28.
|
|
756
|
+
|
|
757
|
+
AUTHOR:
|
|
758
|
+
|
|
759
|
+
- David Joyner (07-2006)
|
|
760
|
+
"""
|
|
761
|
+
from sage.combinat.tuple import Tuples
|
|
762
|
+
mset = [x for x in F if x != 0]
|
|
763
|
+
d = len(P[0])
|
|
764
|
+
pts = Tuples(mset, d).list()
|
|
765
|
+
n = len(pts) # (q-1)^d
|
|
766
|
+
k = len(P)
|
|
767
|
+
e = P[0]
|
|
768
|
+
B = []
|
|
769
|
+
for e in P:
|
|
770
|
+
tmpvar = [prod([t[i]**e[i] for i in range(d)]) for t in pts]
|
|
771
|
+
B.append(tmpvar)
|
|
772
|
+
# now B0 *should* be a full rank matrix
|
|
773
|
+
MS = MatrixSpace(F, k, n)
|
|
774
|
+
return LinearCode(MS(B))
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
def WalshCode(m):
|
|
778
|
+
r"""
|
|
779
|
+
Return the binary Walsh code of length `2^m`.
|
|
780
|
+
|
|
781
|
+
The matrix
|
|
782
|
+
of codewords correspond to a Hadamard matrix. This is a (constant
|
|
783
|
+
rate) binary linear `[2^m,m,2^{m-1}]` code.
|
|
784
|
+
|
|
785
|
+
EXAMPLES::
|
|
786
|
+
|
|
787
|
+
sage: C = codes.WalshCode(4); C
|
|
788
|
+
[16, 4] linear code over GF(2)
|
|
789
|
+
sage: C = codes.WalshCode(3); C
|
|
790
|
+
[8, 3] linear code over GF(2)
|
|
791
|
+
sage: C.spectrum()
|
|
792
|
+
[1, 0, 0, 0, 7, 0, 0, 0, 0]
|
|
793
|
+
sage: C.minimum_distance() # needs sage.libs.gap
|
|
794
|
+
4
|
|
795
|
+
sage: C.minimum_distance(algorithm='gap') # check d=2^(m-1) # needs sage.libs.gap
|
|
796
|
+
4
|
|
797
|
+
|
|
798
|
+
REFERENCES:
|
|
799
|
+
|
|
800
|
+
- :wikipedia:`Hadamard_matrix`
|
|
801
|
+
|
|
802
|
+
- :wikipedia:`Walsh_code`
|
|
803
|
+
"""
|
|
804
|
+
return LinearCode(walsh_matrix(m), d=2**(m - 1))
|