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,1167 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: optional - sage.modules sage.rings.finite_rings
|
|
3
|
+
"""
|
|
4
|
+
Partition backtrack functions for binary codes
|
|
5
|
+
|
|
6
|
+
EXAMPLES::
|
|
7
|
+
|
|
8
|
+
sage: import sage.groups.perm_gps.partn_ref.refinement_binary
|
|
9
|
+
|
|
10
|
+
REFERENCE:
|
|
11
|
+
|
|
12
|
+
- [1] McKay, Brendan D. Practical Graph Isomorphism. Congressus Numerantium,
|
|
13
|
+
Vol. 30 (1981), pp. 45-87.
|
|
14
|
+
|
|
15
|
+
- [2] Leon, Jeffrey. Permutation Group Algorithms Based on Partitions, I:
|
|
16
|
+
Theory and Algorithms. J. Symbolic Computation, Vol. 12 (1991), pp.
|
|
17
|
+
533-583.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
#*****************************************************************************
|
|
21
|
+
# Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
|
|
22
|
+
#
|
|
23
|
+
# This program is free software: you can redistribute it and/or modify
|
|
24
|
+
# it under the terms of the GNU General Public License as published by
|
|
25
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
26
|
+
# (at your option) any later version.
|
|
27
|
+
# https://www.gnu.org/licenses/
|
|
28
|
+
#*****************************************************************************
|
|
29
|
+
|
|
30
|
+
from sage.data_structures.bitset_base cimport *
|
|
31
|
+
from sage.groups.perm_gps.partn_ref.data_structures cimport *
|
|
32
|
+
from sage.rings.integer cimport Integer
|
|
33
|
+
from sage.structure.element import Matrix
|
|
34
|
+
from sage.groups.perm_gps.partn_ref.double_coset cimport double_coset
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
cdef class LinearBinaryCodeStruct(BinaryCodeStruct):
|
|
38
|
+
|
|
39
|
+
def __cinit__(self, matrix):
|
|
40
|
+
cdef int i,j
|
|
41
|
+
self.degree = matrix.ncols()
|
|
42
|
+
self.dimension = matrix.nrows()
|
|
43
|
+
if self.dimension >= <int>(sizeof(int) << 3):
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
# By the time the dimension gets this big, the computation is infeasible anyway...
|
|
46
|
+
self.nwords = 1<<self.dimension
|
|
47
|
+
|
|
48
|
+
self.basis = <bitset_s *> sig_malloc(self.dimension * sizeof(bitset_s))
|
|
49
|
+
self.scratch_bitsets = <bitset_s *> sig_malloc((2*self.dimension+2) * sizeof(bitset_s))
|
|
50
|
+
self.alpha_is_wd = <bitset_s *> sig_malloc(sizeof(bitset_s))
|
|
51
|
+
self.word_ps = PS_new(self.nwords, 1)
|
|
52
|
+
self.alpha = <int *> sig_malloc((self.nwords+self.degree) * sizeof(int))
|
|
53
|
+
self.scratch = <int *> sig_malloc((3*self.nwords+3*self.degree+2) * sizeof(int))
|
|
54
|
+
|
|
55
|
+
if self.basis is NULL or self.scratch_bitsets is NULL \
|
|
56
|
+
or self.alpha_is_wd is NULL or self.word_ps is NULL \
|
|
57
|
+
or self.alpha is NULL or self.scratch is NULL:
|
|
58
|
+
sig_free(self.basis)
|
|
59
|
+
sig_free(self.scratch_bitsets)
|
|
60
|
+
sig_free(self.alpha_is_wd)
|
|
61
|
+
PS_dealloc(self.word_ps)
|
|
62
|
+
sig_free(self.alpha)
|
|
63
|
+
sig_free(self.scratch)
|
|
64
|
+
raise MemoryError
|
|
65
|
+
|
|
66
|
+
cdef bint memerr = 0
|
|
67
|
+
for i in range(self.dimension):
|
|
68
|
+
try:
|
|
69
|
+
bitset_init(&self.basis[i], self.degree)
|
|
70
|
+
except MemoryError:
|
|
71
|
+
for j from 0 <= j < i:
|
|
72
|
+
bitset_free(&self.basis[j])
|
|
73
|
+
memerr = 1
|
|
74
|
+
break
|
|
75
|
+
if not memerr:
|
|
76
|
+
for i in range(2*self.dimension+2):
|
|
77
|
+
try:
|
|
78
|
+
bitset_init(&self.scratch_bitsets[i], self.degree)
|
|
79
|
+
except MemoryError:
|
|
80
|
+
for j from 0 <= j < i:
|
|
81
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
82
|
+
for j from 0 <= j < self.dimension:
|
|
83
|
+
bitset_free(&self.basis[j])
|
|
84
|
+
memerr = 1
|
|
85
|
+
break
|
|
86
|
+
if not memerr:
|
|
87
|
+
try:
|
|
88
|
+
bitset_init(self.alpha_is_wd, self.nwords + self.degree)
|
|
89
|
+
except MemoryError:
|
|
90
|
+
for j from 0 <= j < 2*self.dimension+2:
|
|
91
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
92
|
+
for j from 0 <= j < self.dimension:
|
|
93
|
+
bitset_free(&self.basis[j])
|
|
94
|
+
memerr = 1
|
|
95
|
+
if memerr:
|
|
96
|
+
sig_free(self.basis)
|
|
97
|
+
sig_free(self.scratch_bitsets)
|
|
98
|
+
sig_free(self.alpha_is_wd)
|
|
99
|
+
PS_dealloc(self.word_ps)
|
|
100
|
+
sig_free(self.alpha)
|
|
101
|
+
sig_free(self.scratch)
|
|
102
|
+
raise MemoryError
|
|
103
|
+
else:
|
|
104
|
+
bitset_zero(self.alpha_is_wd)
|
|
105
|
+
for j from 0 <= j < self.dimension:
|
|
106
|
+
bitset_zero(&self.basis[j])
|
|
107
|
+
|
|
108
|
+
for i, j in matrix.nonzero_positions():
|
|
109
|
+
bitset_set(&self.basis[i], j)
|
|
110
|
+
|
|
111
|
+
self.output = NULL
|
|
112
|
+
self.ith_word = &ith_word_linear
|
|
113
|
+
|
|
114
|
+
def run(self, partition=None):
|
|
115
|
+
"""
|
|
116
|
+
Perform the canonical labeling and automorphism group computation,
|
|
117
|
+
storing results to ``self``.
|
|
118
|
+
|
|
119
|
+
INPUT:
|
|
120
|
+
|
|
121
|
+
- ``partition`` -- an optional list of lists partition of the columns;
|
|
122
|
+
default is the unit partition
|
|
123
|
+
|
|
124
|
+
EXAMPLES::
|
|
125
|
+
|
|
126
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import LinearBinaryCodeStruct
|
|
127
|
+
|
|
128
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2),[[1,0,1],[0,1,1]]))
|
|
129
|
+
sage: B.run()
|
|
130
|
+
sage: B.automorphism_group()
|
|
131
|
+
([[0, 2, 1], [1, 0, 2]], 6, [0, 1])
|
|
132
|
+
sage: B.canonical_relabeling()
|
|
133
|
+
[0, 1, 2]
|
|
134
|
+
|
|
135
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2),[[1,1,1,1]]))
|
|
136
|
+
sage: B.automorphism_group()
|
|
137
|
+
([[0, 1, 3, 2], [0, 2, 1, 3], [1, 0, 2, 3]], 24, [0, 1, 2])
|
|
138
|
+
sage: B.canonical_relabeling()
|
|
139
|
+
[0, 1, 2, 3]
|
|
140
|
+
|
|
141
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2),[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]]))
|
|
142
|
+
sage: B.automorphism_group()[1] == factorial(14)
|
|
143
|
+
True
|
|
144
|
+
|
|
145
|
+
sage: M = Matrix(GF(2),[\
|
|
146
|
+
....: [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0],\
|
|
147
|
+
....: [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],\
|
|
148
|
+
....: [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],\
|
|
149
|
+
....: [0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1],\
|
|
150
|
+
....: [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]])
|
|
151
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
152
|
+
sage: B.automorphism_group()[1]
|
|
153
|
+
322560
|
|
154
|
+
|
|
155
|
+
sage: M = Matrix(GF(2),[\
|
|
156
|
+
....: [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0],\
|
|
157
|
+
....: [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0],\
|
|
158
|
+
....: [0,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1],\
|
|
159
|
+
....: [0,0,0,1,1,0,0,0,0,1,1,0,1,1,0,1,1]])
|
|
160
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
161
|
+
sage: B.automorphism_group()[1]
|
|
162
|
+
2304
|
|
163
|
+
|
|
164
|
+
sage: M = Matrix(GF(2),[\
|
|
165
|
+
....: [1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0],\
|
|
166
|
+
....: [0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0],\
|
|
167
|
+
....: [0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0],\
|
|
168
|
+
....: [0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0],\
|
|
169
|
+
....: [0,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0],\
|
|
170
|
+
....: [0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0],\
|
|
171
|
+
....: [0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,0],\
|
|
172
|
+
....: [0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1]])
|
|
173
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
174
|
+
sage: B.automorphism_group()[1]
|
|
175
|
+
136
|
|
176
|
+
|
|
177
|
+
sage: M = Matrix(GF(2),[\
|
|
178
|
+
....: [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0],
|
|
179
|
+
....: [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0],
|
|
180
|
+
....: [0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1],
|
|
181
|
+
....: [0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1],
|
|
182
|
+
....: [0,0,0,1,0,0,0,1,0,1,0,1,0,1,1,1,0,1],
|
|
183
|
+
....: [0,1,0,0,0,1,0,0,0,1,1,1,0,1,0,1,1,0]])
|
|
184
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
185
|
+
sage: B.automorphism_group()[1]
|
|
186
|
+
2160
|
|
187
|
+
|
|
188
|
+
sage: M = Matrix(GF(2),[\
|
|
189
|
+
....: [0,1,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1],\
|
|
190
|
+
....: [1,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,0],\
|
|
191
|
+
....: [0,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,0],\
|
|
192
|
+
....: [1,1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,1],\
|
|
193
|
+
....: [1,1,0,0,0,1,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0],\
|
|
194
|
+
....: [1,0,0,0,1,0,0,1,0,1,1,0,1,1,1,0,1,0,0,1,0,0],\
|
|
195
|
+
....: [0,0,0,1,0,0,1,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0],\
|
|
196
|
+
....: [0,0,1,0,0,1,0,1,1,1,0,1,1,0,1,0,0,1,0,0,0,1],\
|
|
197
|
+
....: [0,1,0,0,1,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1],\
|
|
198
|
+
....: [1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,1,0,0,0,1,1,1],\
|
|
199
|
+
....: [0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,0]])
|
|
200
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
201
|
+
sage: B.automorphism_group()[1]
|
|
202
|
+
887040
|
|
203
|
+
|
|
204
|
+
sage: M = Matrix(GF(2),[\
|
|
205
|
+
....: [1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
206
|
+
....: [0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
207
|
+
....: [0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
208
|
+
....: [0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],
|
|
209
|
+
....: [0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],
|
|
210
|
+
....: [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0],
|
|
211
|
+
....: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],
|
|
212
|
+
....: [1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0,1,1,0,0],
|
|
213
|
+
....: [1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,0,0],
|
|
214
|
+
....: [1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,0]])
|
|
215
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
216
|
+
sage: B.automorphism_group()[1]
|
|
217
|
+
294912
|
|
218
|
+
|
|
219
|
+
sage: M = Matrix(GF(2), [\
|
|
220
|
+
....: [1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
221
|
+
....: [0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
222
|
+
....: [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0],
|
|
223
|
+
....: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0],
|
|
224
|
+
....: [0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0],
|
|
225
|
+
....: [0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0],
|
|
226
|
+
....: [0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1],
|
|
227
|
+
....: [0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1],
|
|
228
|
+
....: [0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0,1]])
|
|
229
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
230
|
+
sage: B.automorphism_group()[1]
|
|
231
|
+
442368
|
|
232
|
+
|
|
233
|
+
sage: M = Matrix(GF(2), [\
|
|
234
|
+
....: [1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0],\
|
|
235
|
+
....: [1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1]])
|
|
236
|
+
sage: B = LinearBinaryCodeStruct(M)
|
|
237
|
+
sage: B.automorphism_group()[1]
|
|
238
|
+
17868913969917295853568000000
|
|
239
|
+
"""
|
|
240
|
+
cdef int n = self.degree
|
|
241
|
+
cdef PartitionStack *part
|
|
242
|
+
if partition is None:
|
|
243
|
+
part = PS_new(n, 1)
|
|
244
|
+
else:
|
|
245
|
+
part = PS_from_list(partition)
|
|
246
|
+
if part is NULL:
|
|
247
|
+
raise MemoryError
|
|
248
|
+
|
|
249
|
+
self.first_time = 1
|
|
250
|
+
|
|
251
|
+
self.output = get_aut_gp_and_can_lab(<void *>self, part, n, &all_children_are_equivalent, &refine_by_bip_degree, &compare_linear_codes, 1, NULL, NULL, NULL)
|
|
252
|
+
|
|
253
|
+
PS_dealloc(part)
|
|
254
|
+
|
|
255
|
+
def automorphism_group(self):
|
|
256
|
+
"""
|
|
257
|
+
Return a list of generators of the automorphism group, along with its
|
|
258
|
+
order and a base for which the list of generators is a strong generating
|
|
259
|
+
set.
|
|
260
|
+
|
|
261
|
+
EXAMPLES: (For more examples, see self.run())::
|
|
262
|
+
|
|
263
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import LinearBinaryCodeStruct
|
|
264
|
+
|
|
265
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2),[[1,1,1,1]]))
|
|
266
|
+
sage: B.automorphism_group()
|
|
267
|
+
([[0, 1, 3, 2], [0, 2, 1, 3], [1, 0, 2, 3]], 24, [0, 1, 2])
|
|
268
|
+
"""
|
|
269
|
+
cdef int i, j
|
|
270
|
+
cdef list generators, base
|
|
271
|
+
cdef Integer order
|
|
272
|
+
if self.output is NULL:
|
|
273
|
+
self.run()
|
|
274
|
+
generators = []
|
|
275
|
+
for i in range(self.output.num_gens):
|
|
276
|
+
generators.append([self.output.generators[i*self.degree + j] for j from 0 <= j < self.degree])
|
|
277
|
+
order = Integer()
|
|
278
|
+
SC_order(self.output.group, 0, order.value)
|
|
279
|
+
base = [self.output.group.base_orbits[i][0] for i in range(self.output.group.base_size)]
|
|
280
|
+
return generators, order, base
|
|
281
|
+
|
|
282
|
+
def canonical_relabeling(self):
|
|
283
|
+
"""
|
|
284
|
+
Return a canonical relabeling (in list permutation format).
|
|
285
|
+
|
|
286
|
+
EXAMPLES: (For more examples, see self.run())::
|
|
287
|
+
|
|
288
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import LinearBinaryCodeStruct
|
|
289
|
+
|
|
290
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2), [[1,1,0]]))
|
|
291
|
+
sage: B.automorphism_group()
|
|
292
|
+
([[1, 0, 2]], 2, [0])
|
|
293
|
+
sage: B.canonical_relabeling()
|
|
294
|
+
[1, 2, 0]
|
|
295
|
+
sage: B = LinearBinaryCodeStruct(matrix(GF(2), [[1,0,1]]))
|
|
296
|
+
sage: B.automorphism_group()
|
|
297
|
+
([[2, 1, 0]], 2, [0])
|
|
298
|
+
sage: B.canonical_relabeling()
|
|
299
|
+
[1, 0, 2]
|
|
300
|
+
"""
|
|
301
|
+
cdef int i
|
|
302
|
+
if self.output is NULL:
|
|
303
|
+
self.run()
|
|
304
|
+
return [self.output.relabeling[i] for i in range(self.degree)]
|
|
305
|
+
|
|
306
|
+
def is_isomorphic(self, LinearBinaryCodeStruct other):
|
|
307
|
+
"""
|
|
308
|
+
Calculate whether ``self`` is isomorphic to ``other``.
|
|
309
|
+
|
|
310
|
+
EXAMPLES::
|
|
311
|
+
|
|
312
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import LinearBinaryCodeStruct
|
|
313
|
+
|
|
314
|
+
sage: B = LinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,1,0,0],[0,0,1,1,1,1]]))
|
|
315
|
+
sage: C = LinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,0,0,1],[1,1,0,1,1,0]]))
|
|
316
|
+
sage: B.is_isomorphic(C)
|
|
317
|
+
[0, 1, 2, 5, 3, 4]
|
|
318
|
+
"""
|
|
319
|
+
cdef int i, n = self.degree
|
|
320
|
+
cdef int *output
|
|
321
|
+
cdef int *ordering
|
|
322
|
+
cdef PartitionStack *part
|
|
323
|
+
part = PS_new(n, 1)
|
|
324
|
+
ordering = <int *> sig_malloc(self.degree * sizeof(int))
|
|
325
|
+
output = <int *> sig_malloc(self.degree * sizeof(int))
|
|
326
|
+
if part is NULL or ordering is NULL or output is NULL:
|
|
327
|
+
PS_dealloc(part)
|
|
328
|
+
sig_free(ordering)
|
|
329
|
+
sig_free(output)
|
|
330
|
+
raise MemoryError
|
|
331
|
+
for i in range(n):
|
|
332
|
+
ordering[i] = i
|
|
333
|
+
self.first_time = 1
|
|
334
|
+
other.first_time = 1
|
|
335
|
+
|
|
336
|
+
cdef bint isomorphic = double_coset(<void *> self, <void *> other, part, ordering, n, &all_children_are_equivalent, &refine_by_bip_degree, &compare_linear_codes, NULL, NULL, output)
|
|
337
|
+
|
|
338
|
+
PS_dealloc(part)
|
|
339
|
+
sig_free(ordering)
|
|
340
|
+
if isomorphic:
|
|
341
|
+
output_py = [output[i] for i in range(n)]
|
|
342
|
+
else:
|
|
343
|
+
output_py = False
|
|
344
|
+
sig_free(output)
|
|
345
|
+
return output_py
|
|
346
|
+
|
|
347
|
+
def __dealloc__(self):
|
|
348
|
+
cdef int j
|
|
349
|
+
bitset_free(self.alpha_is_wd)
|
|
350
|
+
for j from 0 <= j < 2*self.dimension+2:
|
|
351
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
352
|
+
for j from 0 <= j < self.dimension:
|
|
353
|
+
bitset_free(&self.basis[j])
|
|
354
|
+
sig_free(self.basis)
|
|
355
|
+
sig_free(self.scratch_bitsets)
|
|
356
|
+
sig_free(self.alpha_is_wd)
|
|
357
|
+
PS_dealloc(self.word_ps)
|
|
358
|
+
sig_free(self.alpha)
|
|
359
|
+
sig_free(self.scratch)
|
|
360
|
+
if self.output is not NULL:
|
|
361
|
+
deallocate_agcl_output(self.output)
|
|
362
|
+
|
|
363
|
+
cdef int ith_word_linear(BinaryCodeStruct self, int i, bitset_s *word) noexcept:
|
|
364
|
+
cdef LinearBinaryCodeStruct LBCS = <LinearBinaryCodeStruct> self
|
|
365
|
+
cdef int j
|
|
366
|
+
bitset_zero(word)
|
|
367
|
+
for j from 0 <= j < LBCS.dimension:
|
|
368
|
+
if (1<<j)&i:
|
|
369
|
+
bitset_xor(word, word, &LBCS.basis[j])
|
|
370
|
+
return 0
|
|
371
|
+
|
|
372
|
+
cdef class NonlinearBinaryCodeStruct(BinaryCodeStruct):
|
|
373
|
+
|
|
374
|
+
def __cinit__(self, arg):
|
|
375
|
+
cdef int i,j
|
|
376
|
+
if isinstance(arg, Matrix):
|
|
377
|
+
self.degree = arg.ncols()
|
|
378
|
+
self.nwords = arg.nrows()
|
|
379
|
+
elif isinstance(arg, tuple):
|
|
380
|
+
assert len(arg) == 2
|
|
381
|
+
self.degree, self.nwords = arg
|
|
382
|
+
else:
|
|
383
|
+
raise NotImplementedError
|
|
384
|
+
|
|
385
|
+
self.words = <bitset_s *> sig_malloc(self.nwords * sizeof(bitset_s))
|
|
386
|
+
self.scratch_bitsets = <bitset_s *> sig_malloc((4*self.nwords+1) * sizeof(bitset_s))
|
|
387
|
+
self.alpha_is_wd = <bitset_s *> sig_malloc(sizeof(bitset_s))
|
|
388
|
+
self.word_ps = PS_new(self.nwords, 1)
|
|
389
|
+
self.alpha = <int *> sig_malloc((self.nwords+self.degree) * sizeof(int))
|
|
390
|
+
self.scratch = <int *> sig_malloc((3*self.nwords+3*self.degree+2) * sizeof(int))
|
|
391
|
+
if self.words is NULL or self.scratch_bitsets is NULL \
|
|
392
|
+
or self.alpha_is_wd is NULL or self.word_ps is NULL \
|
|
393
|
+
or self.alpha is NULL or self.scratch is NULL:
|
|
394
|
+
sig_free(self.words)
|
|
395
|
+
sig_free(self.scratch_bitsets)
|
|
396
|
+
sig_free(self.alpha_is_wd)
|
|
397
|
+
PS_dealloc(self.word_ps)
|
|
398
|
+
sig_free(self.alpha)
|
|
399
|
+
sig_free(self.scratch)
|
|
400
|
+
raise MemoryError
|
|
401
|
+
|
|
402
|
+
cdef bint memerr = 0
|
|
403
|
+
for i in range(self.nwords):
|
|
404
|
+
try:
|
|
405
|
+
bitset_init(&self.words[i], self.degree)
|
|
406
|
+
except MemoryError:
|
|
407
|
+
for j from 0 <= j < i:
|
|
408
|
+
bitset_free(&self.words[j])
|
|
409
|
+
memerr = 1
|
|
410
|
+
break
|
|
411
|
+
if not memerr:
|
|
412
|
+
for i in range(4*self.nwords):
|
|
413
|
+
try:
|
|
414
|
+
bitset_init(&self.scratch_bitsets[i], self.degree)
|
|
415
|
+
except MemoryError:
|
|
416
|
+
for j from 0 <= j < i:
|
|
417
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
418
|
+
for j from 0 <= j < self.nwords:
|
|
419
|
+
bitset_free(&self.words[j])
|
|
420
|
+
memerr = 1
|
|
421
|
+
break
|
|
422
|
+
if not memerr:
|
|
423
|
+
try:
|
|
424
|
+
bitset_init(&self.scratch_bitsets[4*self.nwords], self.nwords)
|
|
425
|
+
except MemoryError:
|
|
426
|
+
for j from 0 <= j < 4*self.nwords:
|
|
427
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
428
|
+
for j from 0 <= j < self.nwords:
|
|
429
|
+
bitset_free(&self.words[j])
|
|
430
|
+
memerr = 1
|
|
431
|
+
if not memerr:
|
|
432
|
+
try:
|
|
433
|
+
bitset_init(self.alpha_is_wd, self.nwords + self.degree)
|
|
434
|
+
except MemoryError:
|
|
435
|
+
for j from 0 <= j < 4*self.nwords + 1:
|
|
436
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
437
|
+
for j from 0 <= j < self.nwords:
|
|
438
|
+
bitset_free(&self.words[j])
|
|
439
|
+
memerr = 1
|
|
440
|
+
if memerr:
|
|
441
|
+
sig_free(self.words)
|
|
442
|
+
sig_free(self.scratch_bitsets)
|
|
443
|
+
sig_free(self.alpha_is_wd)
|
|
444
|
+
PS_dealloc(self.word_ps)
|
|
445
|
+
sig_free(self.alpha)
|
|
446
|
+
sig_free(self.scratch)
|
|
447
|
+
raise MemoryError
|
|
448
|
+
else:
|
|
449
|
+
bitset_zero(self.alpha_is_wd)
|
|
450
|
+
for j from 0 <= j < self.nwords:
|
|
451
|
+
bitset_zero(&self.words[j])
|
|
452
|
+
|
|
453
|
+
if isinstance(arg, Matrix):
|
|
454
|
+
for i, j in arg.nonzero_positions():
|
|
455
|
+
bitset_set(&self.words[i], j)
|
|
456
|
+
|
|
457
|
+
self.output = NULL
|
|
458
|
+
self.ith_word = &ith_word_nonlinear
|
|
459
|
+
|
|
460
|
+
def __dealloc__(self):
|
|
461
|
+
cdef int j
|
|
462
|
+
bitset_free(self.alpha_is_wd)
|
|
463
|
+
for j from 0 <= j < 4*self.nwords + 1:
|
|
464
|
+
bitset_free(&self.scratch_bitsets[j])
|
|
465
|
+
for j from 0 <= j < self.nwords:
|
|
466
|
+
bitset_free(&self.words[j])
|
|
467
|
+
sig_free(self.words)
|
|
468
|
+
sig_free(self.scratch_bitsets)
|
|
469
|
+
sig_free(self.alpha_is_wd)
|
|
470
|
+
PS_dealloc(self.word_ps)
|
|
471
|
+
sig_free(self.alpha)
|
|
472
|
+
sig_free(self.scratch)
|
|
473
|
+
if self.output is not NULL:
|
|
474
|
+
deallocate_agcl_output(self.output)
|
|
475
|
+
|
|
476
|
+
def run(self, partition=None):
|
|
477
|
+
"""
|
|
478
|
+
Perform the canonical labeling and automorphism group computation,
|
|
479
|
+
storing results to ``self``.
|
|
480
|
+
|
|
481
|
+
INPUT:
|
|
482
|
+
|
|
483
|
+
- ``partition`` -- an optional list of lists partition of the columns
|
|
484
|
+
default is the unit partition
|
|
485
|
+
|
|
486
|
+
EXAMPLES::
|
|
487
|
+
|
|
488
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import NonlinearBinaryCodeStruct
|
|
489
|
+
|
|
490
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,0,0,0],[0,0,1,0]]))
|
|
491
|
+
sage: B.run()
|
|
492
|
+
sage: B.automorphism_group()
|
|
493
|
+
([[2, 1, 0, 3], [0, 3, 2, 1]], 4, [1, 0])
|
|
494
|
+
sage: B.canonical_relabeling()
|
|
495
|
+
[2, 0, 3, 1]
|
|
496
|
+
|
|
497
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,0],[1,1,0,1],[1,0,1,1],[0,1,1,1]]))
|
|
498
|
+
sage: B.run()
|
|
499
|
+
sage: B.automorphism_group()
|
|
500
|
+
([[0, 1, 3, 2], [0, 2, 1, 3], [1, 0, 2, 3]], 24, [0, 1, 2])
|
|
501
|
+
sage: B.canonical_relabeling()
|
|
502
|
+
[0, 1, 2, 3]
|
|
503
|
+
|
|
504
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,0,0,0],[1,1,0,1,0,0],[1,0,1,1,0,0],[0,1,1,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]))
|
|
505
|
+
sage: B.run()
|
|
506
|
+
sage: B.automorphism_group()
|
|
507
|
+
([[0, 1, 3, 2, 4, 5],
|
|
508
|
+
[0, 2, 1, 3, 4, 5],
|
|
509
|
+
[1, 0, 2, 3, 4, 5],
|
|
510
|
+
[0, 1, 2, 3, 5, 4]],
|
|
511
|
+
48,
|
|
512
|
+
[4, 0, 1, 2])
|
|
513
|
+
sage: B.canonical_relabeling()
|
|
514
|
+
[2, 3, 4, 5, 0, 1]
|
|
515
|
+
"""
|
|
516
|
+
cdef int n = self.degree
|
|
517
|
+
cdef PartitionStack *part
|
|
518
|
+
if partition is None:
|
|
519
|
+
part = PS_new(n, 1)
|
|
520
|
+
else:
|
|
521
|
+
part = PS_from_list(partition)
|
|
522
|
+
if part is NULL:
|
|
523
|
+
raise MemoryError
|
|
524
|
+
self.first_time = 1
|
|
525
|
+
|
|
526
|
+
self.output = get_aut_gp_and_can_lab(<void *> self, part, self.degree, &all_children_are_equivalent, &refine_by_bip_degree, &compare_nonlinear_codes, 1, NULL, NULL, NULL)
|
|
527
|
+
|
|
528
|
+
PS_dealloc(part)
|
|
529
|
+
|
|
530
|
+
def automorphism_group(self):
|
|
531
|
+
"""
|
|
532
|
+
Return a list of generators of the automorphism group, along with its
|
|
533
|
+
order and a base for which the list of generators is a strong generating
|
|
534
|
+
set.
|
|
535
|
+
|
|
536
|
+
EXAMPLES: (For more examples, see self.run())::
|
|
537
|
+
|
|
538
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import NonlinearBinaryCodeStruct
|
|
539
|
+
|
|
540
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,0,0,0],[1,1,0,1,0,0],[1,0,1,1,0,0],[0,1,1,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]))
|
|
541
|
+
sage: B.run()
|
|
542
|
+
sage: B.automorphism_group()
|
|
543
|
+
([[0, 1, 3, 2, 4, 5],
|
|
544
|
+
[0, 2, 1, 3, 4, 5],
|
|
545
|
+
[1, 0, 2, 3, 4, 5],
|
|
546
|
+
[0, 1, 2, 3, 5, 4]],
|
|
547
|
+
48,
|
|
548
|
+
[4, 0, 1, 2])
|
|
549
|
+
"""
|
|
550
|
+
cdef int i, j
|
|
551
|
+
cdef list generators, base
|
|
552
|
+
cdef Integer order
|
|
553
|
+
if self.output is NULL:
|
|
554
|
+
self.run()
|
|
555
|
+
generators = []
|
|
556
|
+
for i in range(self.output.num_gens):
|
|
557
|
+
generators.append([self.output.generators[i*self.degree + j] for j from 0 <= j < self.degree])
|
|
558
|
+
order = Integer()
|
|
559
|
+
SC_order(self.output.group, 0, order.value)
|
|
560
|
+
base = [self.output.group.base_orbits[i][0] for i in range(self.output.group.base_size)]
|
|
561
|
+
return generators, order, base
|
|
562
|
+
|
|
563
|
+
def canonical_relabeling(self):
|
|
564
|
+
"""
|
|
565
|
+
Return a canonical relabeling (in list permutation format).
|
|
566
|
+
|
|
567
|
+
EXAMPLES: (For more examples, see self.run())::
|
|
568
|
+
|
|
569
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import NonlinearBinaryCodeStruct
|
|
570
|
+
|
|
571
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,0,0,0],[1,1,0,1,0,0],[1,0,1,1,0,0],[0,1,1,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]))
|
|
572
|
+
sage: B.run()
|
|
573
|
+
sage: B.canonical_relabeling()
|
|
574
|
+
[2, 3, 4, 5, 0, 1]
|
|
575
|
+
"""
|
|
576
|
+
cdef int i
|
|
577
|
+
if self.output is NULL:
|
|
578
|
+
self.run()
|
|
579
|
+
return [self.output.relabeling[i] for i in range(self.degree)]
|
|
580
|
+
|
|
581
|
+
def is_isomorphic(self, NonlinearBinaryCodeStruct other):
|
|
582
|
+
"""
|
|
583
|
+
Calculate whether ``self`` is isomorphic to ``other``.
|
|
584
|
+
|
|
585
|
+
EXAMPLES::
|
|
586
|
+
|
|
587
|
+
sage: from sage.groups.perm_gps.partn_ref.refinement_binary import NonlinearBinaryCodeStruct
|
|
588
|
+
|
|
589
|
+
sage: B = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,1,1,0,0],[0,0,1,1,1,1]]))
|
|
590
|
+
sage: C = NonlinearBinaryCodeStruct(Matrix(GF(2), [[1,1,0,0,1,1],[1,1,1,1,0,0]]))
|
|
591
|
+
sage: B.is_isomorphic(C)
|
|
592
|
+
[2, 3, 0, 1, 4, 5]
|
|
593
|
+
"""
|
|
594
|
+
cdef int i, n = self.degree
|
|
595
|
+
cdef int *output
|
|
596
|
+
cdef int *ordering
|
|
597
|
+
cdef PartitionStack *part
|
|
598
|
+
part = PS_new(n, 1)
|
|
599
|
+
ordering = <int *> sig_malloc(n * sizeof(int))
|
|
600
|
+
output = <int *> sig_malloc(n * sizeof(int))
|
|
601
|
+
if part is NULL or ordering is NULL or output is NULL:
|
|
602
|
+
PS_dealloc(part)
|
|
603
|
+
sig_free(ordering)
|
|
604
|
+
sig_free(output)
|
|
605
|
+
raise MemoryError
|
|
606
|
+
for i in range(n):
|
|
607
|
+
ordering[i] = i
|
|
608
|
+
self.first_time = 1
|
|
609
|
+
other.first_time = 1
|
|
610
|
+
|
|
611
|
+
cdef bint isomorphic = double_coset(<void *> self, <void *> other, part, ordering, n, &all_children_are_equivalent, &refine_by_bip_degree, &compare_nonlinear_codes, NULL, NULL, output)
|
|
612
|
+
|
|
613
|
+
PS_dealloc(part)
|
|
614
|
+
sig_free(ordering)
|
|
615
|
+
if isomorphic:
|
|
616
|
+
output_py = [output[i] for i in range(n)]
|
|
617
|
+
else:
|
|
618
|
+
output_py = False
|
|
619
|
+
sig_free(output)
|
|
620
|
+
return output_py
|
|
621
|
+
|
|
622
|
+
cdef int ith_word_nonlinear(BinaryCodeStruct self, int i, bitset_s *word) noexcept:
|
|
623
|
+
cdef NonlinearBinaryCodeStruct NBCS = <NonlinearBinaryCodeStruct> self
|
|
624
|
+
bitset_copy(word, &NBCS.words[i])
|
|
625
|
+
return 0
|
|
626
|
+
|
|
627
|
+
cdef int refine_by_bip_degree(PartitionStack *col_ps, void *S, int *cells_to_refine_by, int ctrb_len) noexcept:
|
|
628
|
+
r"""
|
|
629
|
+
Refine the input partition by checking degrees of vertices to the given
|
|
630
|
+
cells in the associated bipartite graph (vertices split into columns and
|
|
631
|
+
words).
|
|
632
|
+
|
|
633
|
+
INPUT:
|
|
634
|
+
|
|
635
|
+
- ``col_ps`` -- a partition stack, whose finest partition is the partition to be refined
|
|
636
|
+
- ``S`` -- a binary code struct object
|
|
637
|
+
- ``cells_to_refine_by`` -- list of pointers to cells to check degrees against
|
|
638
|
+
in refining the other cells (updated in place)
|
|
639
|
+
- ``ctrb_len`` -- how many cells in cells_to_refine_by
|
|
640
|
+
|
|
641
|
+
OUTPUT:
|
|
642
|
+
|
|
643
|
+
An integer $I$ invariant under the orbits of $S_n$. That is, if $\gamma$ is a
|
|
644
|
+
permutation of the columns, then
|
|
645
|
+
$$ I(G, PS, cells_to_refine_by) = I( \gamma(G), \gamma(PS), \gamma(cells_to_refine_by) ) .$$
|
|
646
|
+
"""
|
|
647
|
+
cdef BinaryCodeStruct BCS = <BinaryCodeStruct> S
|
|
648
|
+
cdef int current_cell_against = 0
|
|
649
|
+
cdef int current_cell, i, r
|
|
650
|
+
cdef int first_largest_subcell
|
|
651
|
+
cdef int invariant = 0
|
|
652
|
+
cdef PartitionStack *word_ps = BCS.word_ps
|
|
653
|
+
cdef int *ctrb = BCS.alpha
|
|
654
|
+
cdef bitset_s *ctrb_is_wd = BCS.alpha_is_wd
|
|
655
|
+
|
|
656
|
+
word_ps.depth = col_ps.depth
|
|
657
|
+
PS_clear(word_ps)
|
|
658
|
+
bitset_zero(ctrb_is_wd)
|
|
659
|
+
memcpy(ctrb, cells_to_refine_by, ctrb_len * sizeof(int))
|
|
660
|
+
if BCS.first_time:
|
|
661
|
+
BCS.first_time = 0
|
|
662
|
+
ctrb[ctrb_len] = 0
|
|
663
|
+
bitset_set(ctrb_is_wd, ctrb_len)
|
|
664
|
+
ctrb_len += 1
|
|
665
|
+
cdef int *col_degrees = BCS.scratch # len degree
|
|
666
|
+
cdef int *col_counts = &BCS.scratch[BCS.degree] # len nwords+1
|
|
667
|
+
cdef int *col_output = &BCS.scratch[BCS.degree + BCS.nwords + 1] # len degree
|
|
668
|
+
cdef int *word_degrees = &BCS.scratch[2*BCS.degree + BCS.nwords + 1] # len nwords
|
|
669
|
+
cdef int *word_counts = &BCS.scratch[2*BCS.degree + 2*BCS.nwords + 1] # len degree+1
|
|
670
|
+
cdef int *word_output = &BCS.scratch[3*BCS.degree + 2*BCS.nwords + 2] # len nwords
|
|
671
|
+
cdef bint necessary_to_split_cell
|
|
672
|
+
cdef int against_index
|
|
673
|
+
while not (PS_is_discrete(col_ps) and PS_is_discrete(word_ps)) and current_cell_against < ctrb_len:
|
|
674
|
+
invariant += 1
|
|
675
|
+
current_cell = 0
|
|
676
|
+
if bitset_check(ctrb_is_wd, current_cell_against):
|
|
677
|
+
while current_cell < col_ps.degree:
|
|
678
|
+
invariant += 8
|
|
679
|
+
i = current_cell
|
|
680
|
+
necessary_to_split_cell = 0
|
|
681
|
+
while True:
|
|
682
|
+
col_degrees[i-current_cell] = col_degree(col_ps, BCS, i, ctrb[current_cell_against], word_ps)
|
|
683
|
+
if col_degrees[i-current_cell] != col_degrees[0]:
|
|
684
|
+
necessary_to_split_cell = 1
|
|
685
|
+
i += 1
|
|
686
|
+
if col_ps.levels[i-1] <= col_ps.depth:
|
|
687
|
+
break
|
|
688
|
+
# now, i points to the next cell (before refinement)
|
|
689
|
+
if necessary_to_split_cell:
|
|
690
|
+
invariant += 8
|
|
691
|
+
first_largest_subcell = sort_by_function_codes(col_ps, current_cell, col_degrees, col_counts, col_output, BCS.nwords+1)
|
|
692
|
+
invariant += col_degree(col_ps, BCS, i-1, ctrb[current_cell_against], word_ps)
|
|
693
|
+
invariant += first_largest_subcell
|
|
694
|
+
against_index = current_cell_against
|
|
695
|
+
while against_index < ctrb_len:
|
|
696
|
+
if ctrb[against_index] == current_cell and not bitset_check(ctrb_is_wd, against_index):
|
|
697
|
+
ctrb[against_index] = first_largest_subcell
|
|
698
|
+
break
|
|
699
|
+
against_index += 1
|
|
700
|
+
r = current_cell
|
|
701
|
+
while True:
|
|
702
|
+
if r == current_cell or col_ps.levels[r-1] == col_ps.depth:
|
|
703
|
+
if r != first_largest_subcell:
|
|
704
|
+
ctrb[ctrb_len] = r
|
|
705
|
+
ctrb_len += 1
|
|
706
|
+
r += 1
|
|
707
|
+
if r >= i:
|
|
708
|
+
break
|
|
709
|
+
invariant += (i - current_cell)
|
|
710
|
+
current_cell = i
|
|
711
|
+
else:
|
|
712
|
+
while current_cell < word_ps.degree:
|
|
713
|
+
invariant += 64
|
|
714
|
+
i = current_cell
|
|
715
|
+
necessary_to_split_cell = 0
|
|
716
|
+
while True:
|
|
717
|
+
word_degrees[i-current_cell] = word_degree(word_ps, BCS, i, ctrb[current_cell_against], col_ps)
|
|
718
|
+
if word_degrees[i-current_cell] != word_degrees[0]:
|
|
719
|
+
necessary_to_split_cell = 1
|
|
720
|
+
i += 1
|
|
721
|
+
if word_ps.levels[i-1] <= col_ps.depth:
|
|
722
|
+
break
|
|
723
|
+
# now, i points to the next cell (before refinement)
|
|
724
|
+
if necessary_to_split_cell:
|
|
725
|
+
invariant += 64
|
|
726
|
+
first_largest_subcell = sort_by_function_codes(word_ps, current_cell, word_degrees, word_counts, word_output, BCS.degree+1)
|
|
727
|
+
invariant += word_degree(word_ps, BCS, i-1, ctrb[current_cell_against], col_ps)
|
|
728
|
+
invariant += first_largest_subcell
|
|
729
|
+
against_index = current_cell_against
|
|
730
|
+
while against_index < ctrb_len:
|
|
731
|
+
if ctrb[against_index] == current_cell and bitset_check(ctrb_is_wd, against_index):
|
|
732
|
+
ctrb[against_index] = first_largest_subcell
|
|
733
|
+
break
|
|
734
|
+
against_index += 1
|
|
735
|
+
r = current_cell
|
|
736
|
+
while True:
|
|
737
|
+
if r == current_cell or word_ps.levels[r-1] == col_ps.depth:
|
|
738
|
+
if r != first_largest_subcell:
|
|
739
|
+
ctrb[ctrb_len] = r
|
|
740
|
+
bitset_set(ctrb_is_wd, ctrb_len)
|
|
741
|
+
ctrb_len += 1
|
|
742
|
+
r += 1
|
|
743
|
+
if r >= i:
|
|
744
|
+
break
|
|
745
|
+
invariant += (i - current_cell)
|
|
746
|
+
current_cell = i
|
|
747
|
+
current_cell_against += 1
|
|
748
|
+
return invariant
|
|
749
|
+
|
|
750
|
+
cdef int compare_linear_codes(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
|
|
751
|
+
r"""
|
|
752
|
+
Compare gamma_1(S1) and gamma_2(S2).
|
|
753
|
+
|
|
754
|
+
This returns:
|
|
755
|
+
|
|
756
|
+
- -1 if gamma_1(S1) < gamma_2(S2),
|
|
757
|
+
- 0 if gamma_1(S1) == gamma_2(S2),
|
|
758
|
+
- 1 if gamma_1(S1) > gamma_2(S2).
|
|
759
|
+
|
|
760
|
+
Abstractly, what this function does is relabel the basis of B by gamma_1 and
|
|
761
|
+
gamma_2, run a row reduction on each, and verify that the matrices are the
|
|
762
|
+
same, which holds if and only if the rowspan is the same. In practice, if
|
|
763
|
+
the codes are not equal, the reductions (which are carried out in an
|
|
764
|
+
interleaved way) will terminate as soon as this is discovered, and whichever
|
|
765
|
+
code has a 1 in the entry in which they differ is reported as larger.
|
|
766
|
+
|
|
767
|
+
INPUT:
|
|
768
|
+
|
|
769
|
+
- gamma_1, gamma_2 -- list permutations (inverse)
|
|
770
|
+
- S1, S2 -- binary code struct objects
|
|
771
|
+
"""
|
|
772
|
+
cdef int i, piv_loc_1, piv_loc_2, cur_col, cur_row=0
|
|
773
|
+
cdef bint is_pivot_1, is_pivot_2
|
|
774
|
+
cdef LinearBinaryCodeStruct BCS1 = <LinearBinaryCodeStruct> S1
|
|
775
|
+
cdef LinearBinaryCodeStruct BCS2 = <LinearBinaryCodeStruct> S2
|
|
776
|
+
cdef bitset_s *basis_1 = BCS1.scratch_bitsets # len = dim
|
|
777
|
+
cdef bitset_s *basis_2 = &BCS1.scratch_bitsets[BCS1.dimension] # len = dim
|
|
778
|
+
cdef bitset_s *pivots = &BCS1.scratch_bitsets[2*BCS1.dimension] # len 1
|
|
779
|
+
cdef bitset_s *temp = &BCS1.scratch_bitsets[2*BCS1.dimension+1] # len 1
|
|
780
|
+
for i from 0 <= i < BCS1.dimension:
|
|
781
|
+
bitset_copy(&basis_1[i], &BCS1.basis[i])
|
|
782
|
+
bitset_copy(&basis_2[i], &BCS2.basis[i])
|
|
783
|
+
bitset_zero(pivots)
|
|
784
|
+
for cur_col from 0 <= cur_col < BCS1.degree:
|
|
785
|
+
is_pivot_1 = 0
|
|
786
|
+
is_pivot_2 = 0
|
|
787
|
+
for i from cur_row <= i < BCS1.dimension:
|
|
788
|
+
if bitset_check(&basis_1[i], gamma_1[cur_col]):
|
|
789
|
+
is_pivot_1 = 1
|
|
790
|
+
piv_loc_1 = i
|
|
791
|
+
break
|
|
792
|
+
for i from cur_row <= i < BCS1.dimension:
|
|
793
|
+
if bitset_check(&basis_2[i], gamma_2[cur_col]):
|
|
794
|
+
is_pivot_2 = 1
|
|
795
|
+
piv_loc_2 = i
|
|
796
|
+
break
|
|
797
|
+
if is_pivot_1 != is_pivot_2:
|
|
798
|
+
return <int>is_pivot_2 - <int>is_pivot_1
|
|
799
|
+
if is_pivot_1:
|
|
800
|
+
bitset_set(pivots, cur_col)
|
|
801
|
+
if piv_loc_1 != cur_row:
|
|
802
|
+
bitset_copy(temp, &basis_1[piv_loc_1])
|
|
803
|
+
bitset_copy(&basis_1[piv_loc_1], &basis_1[cur_row])
|
|
804
|
+
bitset_copy(&basis_1[cur_row], temp)
|
|
805
|
+
if piv_loc_2 != cur_row:
|
|
806
|
+
bitset_copy(temp, &basis_2[piv_loc_2])
|
|
807
|
+
bitset_copy(&basis_2[piv_loc_2], &basis_2[cur_row])
|
|
808
|
+
bitset_copy(&basis_2[cur_row], temp)
|
|
809
|
+
for i from 0 <= i < cur_row:
|
|
810
|
+
if bitset_check(&basis_1[i], gamma_1[cur_col]):
|
|
811
|
+
bitset_xor(&basis_1[i], &basis_1[i], &basis_1[cur_row])
|
|
812
|
+
if bitset_check(&basis_2[i], gamma_2[cur_col]):
|
|
813
|
+
bitset_xor(&basis_2[i], &basis_2[i], &basis_2[cur_row])
|
|
814
|
+
for i from cur_row < i < BCS1.dimension:
|
|
815
|
+
if bitset_check(&basis_1[i], gamma_1[cur_col]):
|
|
816
|
+
bitset_xor(&basis_1[i], &basis_1[i], &basis_1[cur_row])
|
|
817
|
+
if bitset_check(&basis_2[i], gamma_2[cur_col]):
|
|
818
|
+
bitset_xor(&basis_2[i], &basis_2[i], &basis_2[cur_row])
|
|
819
|
+
cur_row += 1
|
|
820
|
+
else:
|
|
821
|
+
for i from 0 <= i < cur_row:
|
|
822
|
+
if bitset_check(&basis_1[i], gamma_1[cur_col]) != bitset_check(&basis_2[i], gamma_2[cur_col]):
|
|
823
|
+
return <int>bitset_check(&basis_2[i], gamma_2[cur_col]) - <int>bitset_check(&basis_1[i], gamma_1[cur_col])
|
|
824
|
+
return 0
|
|
825
|
+
|
|
826
|
+
cdef int compare_nonlinear_codes(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
|
|
827
|
+
r"""
|
|
828
|
+
Compare gamma_1(S1) and gamma_2(S2).
|
|
829
|
+
|
|
830
|
+
This returns:
|
|
831
|
+
|
|
832
|
+
- -1 if gamma_1(S1) < gamma_2(S2),
|
|
833
|
+
- 0 if gamma_1(S1) == gamma_2(S2),
|
|
834
|
+
- 1 if gamma_1(S1) > gamma_2(S2).
|
|
835
|
+
|
|
836
|
+
INPUT:
|
|
837
|
+
|
|
838
|
+
- gamma_1, gamma_2 -- list permutations (inverse)
|
|
839
|
+
- S1, S2 -- a binary code struct object
|
|
840
|
+
"""
|
|
841
|
+
cdef int side=0, i, start, end, n_one_1, n_one_2, cur_col
|
|
842
|
+
cdef int where_0, where_1
|
|
843
|
+
cdef NonlinearBinaryCodeStruct BCS1 = <NonlinearBinaryCodeStruct> S1
|
|
844
|
+
cdef NonlinearBinaryCodeStruct BCS2 = <NonlinearBinaryCodeStruct> S2
|
|
845
|
+
cdef bitset_s *B_1_0 = BCS1.scratch_bitsets # nwords of len degree
|
|
846
|
+
cdef bitset_s *B_1_1 = &BCS1.scratch_bitsets[BCS1.nwords] # nwords of len degree
|
|
847
|
+
cdef bitset_s *B_2_0 = &BCS1.scratch_bitsets[2*BCS1.nwords] # nwords of len degree
|
|
848
|
+
cdef bitset_s *B_2_1 = &BCS1.scratch_bitsets[3*BCS1.nwords] # nwords of len degree
|
|
849
|
+
cdef bitset_s *dividers = &BCS1.scratch_bitsets[4*BCS1.nwords] # 1 of len nwords
|
|
850
|
+
cdef bitset_s *B_1_this
|
|
851
|
+
cdef bitset_s *B_1_other
|
|
852
|
+
cdef bitset_s *B_2_this
|
|
853
|
+
cdef bitset_s *B_2_other
|
|
854
|
+
for i from 0 <= i < BCS1.nwords:
|
|
855
|
+
bitset_copy(&B_1_0[i], &BCS1.words[i])
|
|
856
|
+
bitset_copy(&B_2_0[i], &BCS2.words[i])
|
|
857
|
+
bitset_zero(dividers)
|
|
858
|
+
bitset_set(dividers, BCS1.nwords-1)
|
|
859
|
+
|
|
860
|
+
for cur_col from 0 <= cur_col < BCS1.degree:
|
|
861
|
+
if side == 0:
|
|
862
|
+
B_1_this = B_1_0
|
|
863
|
+
B_1_other = B_1_1
|
|
864
|
+
B_2_this = B_2_0
|
|
865
|
+
B_2_other = B_2_1
|
|
866
|
+
else:
|
|
867
|
+
B_1_this = B_1_1
|
|
868
|
+
B_1_other = B_1_0
|
|
869
|
+
B_2_this = B_2_1
|
|
870
|
+
B_2_other = B_2_0
|
|
871
|
+
side ^= 1
|
|
872
|
+
start = 0
|
|
873
|
+
while start < BCS1.nwords:
|
|
874
|
+
end = start
|
|
875
|
+
while not bitset_check(dividers, end):
|
|
876
|
+
end += 1
|
|
877
|
+
end += 1
|
|
878
|
+
n_one_1 = 0
|
|
879
|
+
n_one_2 = 0
|
|
880
|
+
for i from start <= i < end:
|
|
881
|
+
n_one_1 += bitset_check(&B_1_this[i], gamma_1[cur_col])
|
|
882
|
+
n_one_2 += bitset_check(&B_2_this[i], gamma_2[cur_col])
|
|
883
|
+
if n_one_1 != n_one_2:
|
|
884
|
+
if n_one_1 > n_one_2:
|
|
885
|
+
return 1
|
|
886
|
+
else:
|
|
887
|
+
return -1
|
|
888
|
+
where_0 = start
|
|
889
|
+
where_1 = end - n_one_1
|
|
890
|
+
if start < where_1 and where_1 < end:
|
|
891
|
+
bitset_set(dividers, where_1 - 1)
|
|
892
|
+
for i from start <= i < end:
|
|
893
|
+
if bitset_check(&B_1_this[i], gamma_1[cur_col]):
|
|
894
|
+
bitset_copy(&B_1_other[where_1], &B_1_this[i])
|
|
895
|
+
where_1 += 1
|
|
896
|
+
else:
|
|
897
|
+
bitset_copy(&B_1_other[where_0], &B_1_this[i])
|
|
898
|
+
where_0 += 1
|
|
899
|
+
where_0 = start
|
|
900
|
+
where_1 = end - n_one_2
|
|
901
|
+
for i from start <= i < end:
|
|
902
|
+
if bitset_check(&B_2_this[i], gamma_2[cur_col]):
|
|
903
|
+
bitset_copy(&B_2_other[where_1], &B_2_this[i])
|
|
904
|
+
where_1 += 1
|
|
905
|
+
else:
|
|
906
|
+
bitset_copy(&B_2_other[where_0], &B_2_this[i])
|
|
907
|
+
where_0 += 1
|
|
908
|
+
start = end
|
|
909
|
+
|
|
910
|
+
return 0
|
|
911
|
+
|
|
912
|
+
cdef bint all_children_are_equivalent(PartitionStack *col_ps, void *S) noexcept:
|
|
913
|
+
"""
|
|
914
|
+
Return ``True`` if any refinement of the current partition results in the
|
|
915
|
+
same structure.
|
|
916
|
+
|
|
917
|
+
INPUT:
|
|
918
|
+
|
|
919
|
+
- ``col_ps`` -- the partition stack to be checked
|
|
920
|
+
- ``S`` -- a binary code struct object
|
|
921
|
+
|
|
922
|
+
.. WARNING::
|
|
923
|
+
|
|
924
|
+
Converse does not hold in general! See Lemma 2.25 of [1] for details, noting
|
|
925
|
+
that the binary code is interpreted as a bipartite graph (see module docs
|
|
926
|
+
for details).
|
|
927
|
+
"""
|
|
928
|
+
cdef BinaryCodeStruct BCS = <BinaryCodeStruct> S
|
|
929
|
+
cdef PartitionStack *word_ps = BCS.word_ps
|
|
930
|
+
cdef int i, n = col_ps.degree + BCS.nwords
|
|
931
|
+
cdef bint in_cell = 0
|
|
932
|
+
cdef int nontrivial_cells = 0
|
|
933
|
+
cdef int total_cells = PS_num_cells(col_ps) + PS_num_cells(word_ps)
|
|
934
|
+
if n <= total_cells + 4:
|
|
935
|
+
return 1
|
|
936
|
+
for i from 0 <= i < BCS.nwords:
|
|
937
|
+
if word_ps.levels[i] <= col_ps.depth:
|
|
938
|
+
if in_cell:
|
|
939
|
+
nontrivial_cells += 1
|
|
940
|
+
in_cell = 0
|
|
941
|
+
else:
|
|
942
|
+
in_cell = 1
|
|
943
|
+
in_cell = 0
|
|
944
|
+
for i from 0 <= i < BCS.degree:
|
|
945
|
+
if col_ps.levels[i] <= col_ps.depth:
|
|
946
|
+
if in_cell:
|
|
947
|
+
nontrivial_cells += 1
|
|
948
|
+
in_cell = 0
|
|
949
|
+
else:
|
|
950
|
+
in_cell = 1
|
|
951
|
+
if n == total_cells + nontrivial_cells:
|
|
952
|
+
return 1
|
|
953
|
+
if n == total_cells + nontrivial_cells + 1:
|
|
954
|
+
return 1
|
|
955
|
+
return 0
|
|
956
|
+
|
|
957
|
+
cdef inline int word_degree(PartitionStack *word_ps, BinaryCodeStruct BCS, int entry, int cell_index, PartitionStack *col_ps) noexcept:
|
|
958
|
+
"""
|
|
959
|
+
Return the number of edges from the vertex corresponding to entry to
|
|
960
|
+
vertices in the cell corresponding to cell_index.
|
|
961
|
+
|
|
962
|
+
INPUT:
|
|
963
|
+
|
|
964
|
+
- ``word_ps`` -- the partition stack to be checked
|
|
965
|
+
- ``col_ps`` -- corresponding partition stack on columns
|
|
966
|
+
- ``BCS`` -- a binary code struct object
|
|
967
|
+
- ``entry`` -- the position of the vertex in question in the entries of word_ps
|
|
968
|
+
- ``cell_index`` -- the starting position of the cell in question in the entries of PS
|
|
969
|
+
"""
|
|
970
|
+
cdef bitset_t cell, word
|
|
971
|
+
cdef int h
|
|
972
|
+
bitset_init(cell, BCS.degree)
|
|
973
|
+
bitset_zero(cell)
|
|
974
|
+
bitset_init(word, BCS.degree)
|
|
975
|
+
entry = word_ps.entries[entry]
|
|
976
|
+
bitset_set(cell, col_ps.entries[cell_index])
|
|
977
|
+
while col_ps.levels[cell_index] > col_ps.depth:
|
|
978
|
+
cell_index += 1
|
|
979
|
+
bitset_set(cell, col_ps.entries[cell_index])
|
|
980
|
+
BCS.ith_word(BCS, entry, word)
|
|
981
|
+
bitset_and(cell, word, cell)
|
|
982
|
+
h = bitset_hamming_weight(cell)
|
|
983
|
+
bitset_free(cell)
|
|
984
|
+
bitset_free(word)
|
|
985
|
+
return h
|
|
986
|
+
|
|
987
|
+
cdef inline int col_degree(PartitionStack *col_ps, BinaryCodeStruct BCS, int entry, int cell_index, PartitionStack *word_ps) noexcept:
|
|
988
|
+
"""
|
|
989
|
+
Return the number of edges from the vertex corresponding to entry to
|
|
990
|
+
vertices in the cell corresponding to cell_index.
|
|
991
|
+
|
|
992
|
+
INPUT:
|
|
993
|
+
|
|
994
|
+
- ``col_ps`` -- the partition stack to be checked
|
|
995
|
+
- ``word_ps`` -- corresponding partition stack on words
|
|
996
|
+
- ``BCS`` -- a binary code struct object
|
|
997
|
+
- ``entry`` -- the position of the vertex in question in the entries of word_ps
|
|
998
|
+
- ``cell_index`` -- the starting position of the cell in question in the entries of PS
|
|
999
|
+
"""
|
|
1000
|
+
cdef bitset_t word
|
|
1001
|
+
bitset_init(word, BCS.degree)
|
|
1002
|
+
cdef int degree = 0
|
|
1003
|
+
entry = col_ps.entries[entry]
|
|
1004
|
+
while True:
|
|
1005
|
+
BCS.ith_word(BCS, word_ps.entries[cell_index], word)
|
|
1006
|
+
degree += bitset_check(word, entry)
|
|
1007
|
+
if not word_ps.levels[cell_index] > col_ps.depth:
|
|
1008
|
+
break
|
|
1009
|
+
cell_index += 1
|
|
1010
|
+
bitset_free(word)
|
|
1011
|
+
return degree
|
|
1012
|
+
|
|
1013
|
+
cdef inline int sort_by_function_codes(PartitionStack *PS, int start, int *degrees, int *counts, int *output, int count_max) noexcept:
|
|
1014
|
+
"""
|
|
1015
|
+
A simple counting sort, given the degrees of vertices to a certain cell.
|
|
1016
|
+
|
|
1017
|
+
INPUT:
|
|
1018
|
+
|
|
1019
|
+
- ``PS`` -- the partition stack to be checked
|
|
1020
|
+
- ``start`` -- beginning index of the cell to be sorted
|
|
1021
|
+
- ``degrees`` -- the values to be sorted by
|
|
1022
|
+
- count, count_max, output -- scratch space
|
|
1023
|
+
"""
|
|
1024
|
+
cdef int i, j, max, max_location
|
|
1025
|
+
for j in range(count_max):
|
|
1026
|
+
counts[j] = 0
|
|
1027
|
+
i = 0
|
|
1028
|
+
while PS.levels[i+start] > PS.depth:
|
|
1029
|
+
counts[degrees[i]] += 1
|
|
1030
|
+
i += 1
|
|
1031
|
+
counts[degrees[i]] += 1
|
|
1032
|
+
# i+start is the right endpoint of the cell now
|
|
1033
|
+
max = counts[0]
|
|
1034
|
+
max_location = 0
|
|
1035
|
+
for j from 0 < j < count_max:
|
|
1036
|
+
if counts[j] > max:
|
|
1037
|
+
max = counts[j]
|
|
1038
|
+
max_location = j
|
|
1039
|
+
counts[j] += counts[j - 1]
|
|
1040
|
+
for j from i >= j >= 0:
|
|
1041
|
+
counts[degrees[j]] -= 1
|
|
1042
|
+
output[counts[degrees[j]]] = PS.entries[start+j]
|
|
1043
|
+
max_location = counts[max_location]+start
|
|
1044
|
+
for j from 0 <= j <= i:
|
|
1045
|
+
PS.entries[start+j] = output[j]
|
|
1046
|
+
j = 1
|
|
1047
|
+
while j < count_max and counts[j] <= i:
|
|
1048
|
+
if counts[j] > 0:
|
|
1049
|
+
PS.levels[start + counts[j] - 1] = PS.depth
|
|
1050
|
+
PS_move_min_to_front(PS, start + counts[j-1], start + counts[j] - 1)
|
|
1051
|
+
j += 1
|
|
1052
|
+
return max_location
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
def random_tests(num=50, n_max=50, k_max=6, nwords_max=200, perms_per_code=10, density_range=(.1,.9)):
|
|
1056
|
+
"""
|
|
1057
|
+
Test to make sure that ``C(gamma(B)) == C(B)`` for random permutations ``gamma``
|
|
1058
|
+
and random codes ``B``, and that :meth:`is_isomorphic` returns an isomorphism.
|
|
1059
|
+
|
|
1060
|
+
INPUT:
|
|
1061
|
+
|
|
1062
|
+
- ``num`` -- run tests for this many codes
|
|
1063
|
+
- ``n_max`` -- test codes with at most this many columns
|
|
1064
|
+
- ``k_max`` -- test codes with at most this for dimension
|
|
1065
|
+
- ``perms_per_code`` -- test each code with this many random permutations
|
|
1066
|
+
|
|
1067
|
+
DISCUSSION:
|
|
1068
|
+
|
|
1069
|
+
This code generates num random linear codes B on at most n_max columns with
|
|
1070
|
+
dimension at most k_max, and a random nonlinear code B2 on at most n_max
|
|
1071
|
+
columns with number of words at most nwords_max. The density of entries in
|
|
1072
|
+
the basis is chosen randomly between 0 and 1.
|
|
1073
|
+
|
|
1074
|
+
For each code B (B2) generated, we uniformly generate perms_per_code random
|
|
1075
|
+
permutations and verify that the canonical labels of B and the image of B
|
|
1076
|
+
under the generated permutation are equal, and check that the double coset
|
|
1077
|
+
function returns an isomorphism.
|
|
1078
|
+
|
|
1079
|
+
TESTS::
|
|
1080
|
+
|
|
1081
|
+
sage: import sage.groups.perm_gps.partn_ref.refinement_binary
|
|
1082
|
+
sage: sage.groups.perm_gps.partn_ref.refinement_binary.random_tests() # long time (up to 5s on sage.math, 2012)
|
|
1083
|
+
All passed: ... random tests on ... codes.
|
|
1084
|
+
"""
|
|
1085
|
+
from sage.misc.prandom import random, randint
|
|
1086
|
+
from sage.combinat.permutation import Permutations
|
|
1087
|
+
from sage.matrix.constructor import random_matrix, matrix
|
|
1088
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
1089
|
+
cdef int h, i, j, n, k, num_tests = 0, num_codes = 0
|
|
1090
|
+
cdef LinearBinaryCodeStruct B, C
|
|
1091
|
+
cdef NonlinearBinaryCodeStruct B_n, C_n
|
|
1092
|
+
for mmm in range(num):
|
|
1093
|
+
p = random()*(density_range[1]-density_range[0]) + density_range[0]
|
|
1094
|
+
n = randint(2, n_max)
|
|
1095
|
+
k = randint(1, min(n-1,k_max) )
|
|
1096
|
+
nwords = randint(1, min(n-1,nwords_max) )
|
|
1097
|
+
S = Permutations(n)
|
|
1098
|
+
|
|
1099
|
+
M = random_matrix(GF(2), k, n, sparse=False, density=p).row_space().basis_matrix()
|
|
1100
|
+
M_n = random_matrix(GF(2), nwords, n, sparse=False, density=p)
|
|
1101
|
+
B = LinearBinaryCodeStruct( M )
|
|
1102
|
+
B_n = NonlinearBinaryCodeStruct( M_n )
|
|
1103
|
+
B.run()
|
|
1104
|
+
B_n.run()
|
|
1105
|
+
|
|
1106
|
+
for i from 0 <= i < perms_per_code:
|
|
1107
|
+
perm = [a-1 for a in list(S.random_element())]
|
|
1108
|
+
C = LinearBinaryCodeStruct( matrix(GF(2), B.dimension, B.degree) )
|
|
1109
|
+
C_n = NonlinearBinaryCodeStruct( matrix(GF(2), B_n.nwords, B_n.degree) )
|
|
1110
|
+
for j from 0 <= j < B.dimension:
|
|
1111
|
+
for h from 0 <= h < B.degree:
|
|
1112
|
+
bitset_set_to(&C.basis[j], <mp_bitcnt_t> perm[h], bitset_check(&B.basis[j], h))
|
|
1113
|
+
for j from 0 <= j < B_n.nwords:
|
|
1114
|
+
for h from 0 <= h < B_n.degree:
|
|
1115
|
+
bitset_set_to(&C_n.words[j], <mp_bitcnt_t> perm[h], bitset_check(&B_n.words[j], h))
|
|
1116
|
+
# now C is a random permutation of B, and C_n of B_n
|
|
1117
|
+
C.run()
|
|
1118
|
+
C_n.run()
|
|
1119
|
+
B_relab = B.canonical_relabeling()
|
|
1120
|
+
C_relab = C.canonical_relabeling()
|
|
1121
|
+
B_n_relab = B_n.canonical_relabeling()
|
|
1122
|
+
C_n_relab = C_n.canonical_relabeling()
|
|
1123
|
+
B_M = matrix(GF(2), B.dimension, B.degree)
|
|
1124
|
+
C_M = matrix(GF(2), B.dimension, B.degree)
|
|
1125
|
+
B_n_M = matrix(GF(2), B_n.nwords, B_n.degree)
|
|
1126
|
+
C_n_M = matrix(GF(2), B_n.nwords, B_n.degree)
|
|
1127
|
+
for j from 0 <= j < B.dimension:
|
|
1128
|
+
for h from 0 <= h < B.degree:
|
|
1129
|
+
B_M[j,B_relab[h]] = bitset_check(&B.basis[j], h)
|
|
1130
|
+
C_M[j,C_relab[h]] = bitset_check(&C.basis[j], h)
|
|
1131
|
+
for j from 0 <= j < B_n.nwords:
|
|
1132
|
+
for h from 0 <= h < B_n.degree:
|
|
1133
|
+
B_n_M[j,B_n_relab[h]] = bitset_check(&B_n.words[j], h)
|
|
1134
|
+
C_n_M[j,C_n_relab[h]] = bitset_check(&C_n.words[j], h)
|
|
1135
|
+
if B_M.row_space() != C_M.row_space():
|
|
1136
|
+
print("can_lab error -- B:")
|
|
1137
|
+
for j from 0 <= j < B.dimension:
|
|
1138
|
+
print(bitset_string(&B.basis[j]))
|
|
1139
|
+
print(perm)
|
|
1140
|
+
return
|
|
1141
|
+
if sorted(B_n_M.rows()) != sorted(C_n_M.rows()):
|
|
1142
|
+
print("can_lab error -- B_n:")
|
|
1143
|
+
for j from 0 <= j < B_n.nwords:
|
|
1144
|
+
print(bitset_string(&B_n.words[j]))
|
|
1145
|
+
print(perm)
|
|
1146
|
+
return
|
|
1147
|
+
isom = B.is_isomorphic(C)
|
|
1148
|
+
if not isom:
|
|
1149
|
+
print("isom -- B:")
|
|
1150
|
+
for j from 0 <= j < B.dimension:
|
|
1151
|
+
print(bitset_string(&B.basis[j]))
|
|
1152
|
+
print(perm)
|
|
1153
|
+
print(isom)
|
|
1154
|
+
return
|
|
1155
|
+
isom = B_n.is_isomorphic(C_n)
|
|
1156
|
+
if not isom:
|
|
1157
|
+
print("isom -- B_n:")
|
|
1158
|
+
for j from 0 <= j < B_n.nwords:
|
|
1159
|
+
print(bitset_string(&B_n.words[j]))
|
|
1160
|
+
print(perm)
|
|
1161
|
+
print(isom)
|
|
1162
|
+
return
|
|
1163
|
+
|
|
1164
|
+
num_tests += 4*perms_per_code
|
|
1165
|
+
num_codes += 2
|
|
1166
|
+
|
|
1167
|
+
print("All passed: %d random tests on %d codes." % (num_tests, num_codes))
|