passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.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 +808 -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-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-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-x86_64-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,947 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Circuits matroids
|
|
4
|
+
|
|
5
|
+
Matroids are characterized by a list of circuits, which are minimal dependent
|
|
6
|
+
sets. The ``CircuitsMatroid`` class implements matroids using this information
|
|
7
|
+
as data.
|
|
8
|
+
|
|
9
|
+
A ``CircuitsMatroid`` can be created from another matroid or from a list of
|
|
10
|
+
circuits. For a full description of allowed inputs, see
|
|
11
|
+
:class:`below <sage.matroids.circuits_matroid.CircuitsMatroid>`. It is
|
|
12
|
+
recommended to use the :func:`Matroid() <sage.matroids.constructor.Matroid>`
|
|
13
|
+
function for a more flexible way of constructing a ``CircuitsMatroid`` and
|
|
14
|
+
other classes of matroids. For direct access to the ``CircuitsMatroid``
|
|
15
|
+
constructor, run::
|
|
16
|
+
|
|
17
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
18
|
+
|
|
19
|
+
AUTHORS:
|
|
20
|
+
|
|
21
|
+
- Giorgos Mousa (2023-12-23): initial version
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
# ****************************************************************************
|
|
25
|
+
# Copyright (C) 2023 Giorgos Mousa <gmousa@proton.me>
|
|
26
|
+
#
|
|
27
|
+
# This program is free software: you can redistribute it and/or modify
|
|
28
|
+
# it under the terms of the GNU General Public License as published by
|
|
29
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
30
|
+
# (at your option) any later version.
|
|
31
|
+
# https://www.gnu.org/licenses/
|
|
32
|
+
# ****************************************************************************
|
|
33
|
+
|
|
34
|
+
from cpython.object cimport Py_EQ, Py_NE
|
|
35
|
+
from sage.structure.richcmp cimport rich_to_bool, richcmp
|
|
36
|
+
from sage.matroids.matroid cimport Matroid
|
|
37
|
+
from sage.matroids.set_system cimport SetSystem
|
|
38
|
+
|
|
39
|
+
cdef class CircuitsMatroid(Matroid):
|
|
40
|
+
r"""
|
|
41
|
+
A matroid defined by its circuits.
|
|
42
|
+
|
|
43
|
+
INPUT:
|
|
44
|
+
|
|
45
|
+
- ``M`` -- matroid (default: ``None``)
|
|
46
|
+
- ``groundset`` -- list (default: ``None``); the groundset of the matroid
|
|
47
|
+
- ``circuits`` -- list (default: ``None``); the collection of circuits of
|
|
48
|
+
the matroid
|
|
49
|
+
- ``nsc_defined`` -- boolean (default: ``False``); whether the matroid was
|
|
50
|
+
defined by its nonspanning circuits
|
|
51
|
+
|
|
52
|
+
.. NOTE::
|
|
53
|
+
|
|
54
|
+
For a more flexible means of input, use the ``Matroid()`` function.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
# necessary (__init__, groundset, _rank)
|
|
58
|
+
|
|
59
|
+
def __init__(self, M=None, groundset=None, circuits=None, nsc_defined=False):
|
|
60
|
+
"""
|
|
61
|
+
Initialization of the matroid. See the class docstring for full
|
|
62
|
+
documentation.
|
|
63
|
+
|
|
64
|
+
TESTS::
|
|
65
|
+
|
|
66
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
67
|
+
sage: M = CircuitsMatroid(matroids.catalog.Fano())
|
|
68
|
+
sage: TestSuite(M).run()
|
|
69
|
+
"""
|
|
70
|
+
if M is not None:
|
|
71
|
+
self._groundset = M.groundset()
|
|
72
|
+
self._C = set(M.circuits())
|
|
73
|
+
else:
|
|
74
|
+
self._groundset = frozenset(groundset)
|
|
75
|
+
self._C = set([frozenset(C) for C in circuits])
|
|
76
|
+
# k-circuits
|
|
77
|
+
self._k_C = {}
|
|
78
|
+
for C in self._C:
|
|
79
|
+
try:
|
|
80
|
+
self._k_C[len(C)].add(C)
|
|
81
|
+
except KeyError:
|
|
82
|
+
self._k_C[len(C)] = set()
|
|
83
|
+
self._k_C[len(C)].add(C)
|
|
84
|
+
self._sorted_C_lens = sorted(self._k_C)
|
|
85
|
+
self._matroid_rank = self.rank(self._groundset)
|
|
86
|
+
self._nsc_defined = nsc_defined
|
|
87
|
+
|
|
88
|
+
cpdef frozenset groundset(self):
|
|
89
|
+
"""
|
|
90
|
+
Return the groundset of the matroid.
|
|
91
|
+
|
|
92
|
+
The groundset is the set of elements that comprise the matroid.
|
|
93
|
+
|
|
94
|
+
OUTPUT: set
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: M = matroids.Theta(2)
|
|
99
|
+
sage: sorted(M.groundset())
|
|
100
|
+
['x0', 'x1', 'y0', 'y1']
|
|
101
|
+
"""
|
|
102
|
+
return self._groundset
|
|
103
|
+
|
|
104
|
+
cpdef int _rank(self, frozenset X) except? -1:
|
|
105
|
+
"""
|
|
106
|
+
Return the rank of a set ``X``.
|
|
107
|
+
|
|
108
|
+
This method does no checking on ``X``, and ``X`` may be assumed to have
|
|
109
|
+
the same interface as ``frozenset``.
|
|
110
|
+
|
|
111
|
+
INPUT:
|
|
112
|
+
|
|
113
|
+
- ``X`` -- an object with Python's ``frozenset`` interface
|
|
114
|
+
|
|
115
|
+
OUTPUT: integer
|
|
116
|
+
|
|
117
|
+
EXAMPLES::
|
|
118
|
+
|
|
119
|
+
sage: M = matroids.Theta(3)
|
|
120
|
+
sage: M._rank(frozenset(['x1', 'y0', 'y2']))
|
|
121
|
+
2
|
|
122
|
+
"""
|
|
123
|
+
return len(self._max_independent(X))
|
|
124
|
+
|
|
125
|
+
# optional
|
|
126
|
+
|
|
127
|
+
cpdef full_rank(self):
|
|
128
|
+
r"""
|
|
129
|
+
Return the rank of the matroid.
|
|
130
|
+
|
|
131
|
+
The *rank* of the matroid is the size of the largest independent
|
|
132
|
+
subset of the groundset.
|
|
133
|
+
|
|
134
|
+
OUTPUT: integer
|
|
135
|
+
|
|
136
|
+
EXAMPLES::
|
|
137
|
+
|
|
138
|
+
sage: M = matroids.Theta(20)
|
|
139
|
+
sage: M.full_rank()
|
|
140
|
+
20
|
|
141
|
+
"""
|
|
142
|
+
return self._matroid_rank
|
|
143
|
+
|
|
144
|
+
cpdef bint _is_independent(self, frozenset X) noexcept:
|
|
145
|
+
"""
|
|
146
|
+
Test if input is independent.
|
|
147
|
+
|
|
148
|
+
INPUT:
|
|
149
|
+
|
|
150
|
+
- ``X`` -- an object with Python's ``frozenset`` interface containing
|
|
151
|
+
a subset of ``self.groundset()``
|
|
152
|
+
|
|
153
|
+
OUTPUT: boolean
|
|
154
|
+
|
|
155
|
+
EXAMPLES::
|
|
156
|
+
|
|
157
|
+
sage: M = matroids.Theta(4)
|
|
158
|
+
sage: M._is_independent(frozenset(['y0', 'y1', 'y3', 'x2']))
|
|
159
|
+
False
|
|
160
|
+
sage: M._is_independent(frozenset(['y0', 'y2', 'y3', 'x2']))
|
|
161
|
+
True
|
|
162
|
+
"""
|
|
163
|
+
cdef int i, l = len(X)
|
|
164
|
+
for i in self._sorted_C_lens:
|
|
165
|
+
if i > l:
|
|
166
|
+
break
|
|
167
|
+
for C in self._k_C[i]:
|
|
168
|
+
if C <= X:
|
|
169
|
+
return False
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
cpdef frozenset _max_independent(self, frozenset X):
|
|
173
|
+
"""
|
|
174
|
+
Compute a maximal independent subset.
|
|
175
|
+
|
|
176
|
+
INPUT:
|
|
177
|
+
|
|
178
|
+
- ``X`` -- an object with Python's ``frozenset`` interface containing
|
|
179
|
+
a subset of ``self.groundset()``
|
|
180
|
+
|
|
181
|
+
OUTPUT: frozenset; a maximal independent subset of ``X``
|
|
182
|
+
|
|
183
|
+
EXAMPLES::
|
|
184
|
+
|
|
185
|
+
sage: M = matroids.Theta(6)
|
|
186
|
+
sage: len(M._max_independent(M.groundset()))
|
|
187
|
+
6
|
|
188
|
+
"""
|
|
189
|
+
cdef set XX = set(X)
|
|
190
|
+
cdef frozenset C
|
|
191
|
+
while True:
|
|
192
|
+
try:
|
|
193
|
+
C = self._circuit(frozenset(XX))
|
|
194
|
+
e = next(iter(C))
|
|
195
|
+
XX.remove(e)
|
|
196
|
+
except (ValueError, StopIteration):
|
|
197
|
+
return frozenset(XX)
|
|
198
|
+
|
|
199
|
+
cpdef frozenset _circuit(self, frozenset X):
|
|
200
|
+
"""
|
|
201
|
+
Return a minimal dependent subset.
|
|
202
|
+
|
|
203
|
+
INPUT:
|
|
204
|
+
|
|
205
|
+
- ``X`` -- an object with Python's ``frozenset`` interface containing
|
|
206
|
+
a subset of ``self.groundset()``
|
|
207
|
+
|
|
208
|
+
OUTPUT: frozenset; a circuit contained in ``X``, if it exists.
|
|
209
|
+
Otherwise an error is raised.
|
|
210
|
+
|
|
211
|
+
EXAMPLES::
|
|
212
|
+
|
|
213
|
+
sage: M = matroids.Theta(4)
|
|
214
|
+
sage: sorted(M._circuit(frozenset(['y0', 'y1', 'y3', 'x2'])))
|
|
215
|
+
['x2', 'y0', 'y1', 'y3']
|
|
216
|
+
sage: M._circuit(frozenset(['y0', 'y2', 'y3', 'x2']))
|
|
217
|
+
Traceback (most recent call last):
|
|
218
|
+
...
|
|
219
|
+
ValueError: no circuit in independent set
|
|
220
|
+
"""
|
|
221
|
+
cdef int i, l = len(X)
|
|
222
|
+
for i in self._sorted_C_lens:
|
|
223
|
+
if i > l:
|
|
224
|
+
break
|
|
225
|
+
for C in self._k_C[i]:
|
|
226
|
+
if C <= X:
|
|
227
|
+
return C
|
|
228
|
+
raise ValueError("no circuit in independent set")
|
|
229
|
+
|
|
230
|
+
cpdef frozenset _closure(self, frozenset X):
|
|
231
|
+
"""
|
|
232
|
+
Return the closure of a set.
|
|
233
|
+
|
|
234
|
+
INPUT:
|
|
235
|
+
|
|
236
|
+
- ``X`` -- an object with Python's ``frozenset`` interface containing
|
|
237
|
+
a subset of ``self.groundset()``
|
|
238
|
+
|
|
239
|
+
OUTPUT: :class:`frozenset`
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
244
|
+
sage: M = CircuitsMatroid(matroids.catalog.Vamos())
|
|
245
|
+
sage: sorted(M._closure(frozenset(['a', 'b', 'c'])))
|
|
246
|
+
['a', 'b', 'c', 'd']
|
|
247
|
+
"""
|
|
248
|
+
cdef set XX = set(X)
|
|
249
|
+
cdef frozenset S
|
|
250
|
+
cdef int i
|
|
251
|
+
for i in self._sorted_C_lens:
|
|
252
|
+
if i > len(XX) + 1:
|
|
253
|
+
break
|
|
254
|
+
for C in self._k_C[i]:
|
|
255
|
+
S = C - XX
|
|
256
|
+
if len(S) == 1:
|
|
257
|
+
XX.add(next(iter(S)))
|
|
258
|
+
return frozenset(XX)
|
|
259
|
+
|
|
260
|
+
cpdef _is_isomorphic(self, other, certificate=False):
|
|
261
|
+
"""
|
|
262
|
+
Test if ``self`` is isomorphic to ``other``.
|
|
263
|
+
|
|
264
|
+
INPUT:
|
|
265
|
+
|
|
266
|
+
- ``other`` -- matroid
|
|
267
|
+
- ``certificate`` -- boolean (default: ``False``)
|
|
268
|
+
|
|
269
|
+
OUTPUT: boolean, and, if ``certificate=True``, a dictionary giving the
|
|
270
|
+
isomorphism or ``None``
|
|
271
|
+
|
|
272
|
+
EXAMPLES::
|
|
273
|
+
|
|
274
|
+
sage: M = matroids.Spike(3)
|
|
275
|
+
sage: from sage.matroids.basis_matroid import BasisMatroid
|
|
276
|
+
sage: N = BasisMatroid(M)
|
|
277
|
+
sage: M.is_isomorphic(N)
|
|
278
|
+
True
|
|
279
|
+
sage: N = matroids.catalog.Vamos()
|
|
280
|
+
sage: M.is_isomorphic(N)
|
|
281
|
+
False
|
|
282
|
+
|
|
283
|
+
.. NOTE::
|
|
284
|
+
|
|
285
|
+
Internal version that does no input checking.
|
|
286
|
+
"""
|
|
287
|
+
if certificate:
|
|
288
|
+
return self._is_isomorphic(other), self._isomorphism(other)
|
|
289
|
+
N = CircuitsMatroid(other)
|
|
290
|
+
S = SetSystem(self._groundset, self._C)
|
|
291
|
+
O = SetSystem(N._groundset, N._C)
|
|
292
|
+
return S._isomorphism(O) is not None
|
|
293
|
+
|
|
294
|
+
# representation
|
|
295
|
+
|
|
296
|
+
def _repr_(self):
|
|
297
|
+
"""
|
|
298
|
+
Return a string representation of the matroid.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: matroids.Theta(10)
|
|
303
|
+
Theta_10: Matroid of rank 10 on 20 elements with 490 circuits
|
|
304
|
+
sage: matroids.catalog.NonDesargues()
|
|
305
|
+
NonDesargues: Matroid of rank 3 on 10 elements with 9 nonspanning circuits
|
|
306
|
+
"""
|
|
307
|
+
if self._nsc_defined:
|
|
308
|
+
return f'{Matroid._repr_(self)} with {len(self.nonspanning_circuits())} nonspanning circuits'
|
|
309
|
+
else:
|
|
310
|
+
return f'{Matroid._repr_(self)} with {len(self._C)} circuits'
|
|
311
|
+
|
|
312
|
+
# comparison
|
|
313
|
+
|
|
314
|
+
def __hash__(self):
|
|
315
|
+
r"""
|
|
316
|
+
Return an invariant of the matroid.
|
|
317
|
+
|
|
318
|
+
This function is called when matroids are added to a set. It is very
|
|
319
|
+
desirable to override it so it can distinguish matroids on the same
|
|
320
|
+
groundset, which is a very typical use case!
|
|
321
|
+
|
|
322
|
+
.. WARNING::
|
|
323
|
+
|
|
324
|
+
This method is linked to ``__richcmp__`` (in Cython) and ``__cmp__``
|
|
325
|
+
or ``__eq__``/``__ne__`` (in Python). If you override one, you
|
|
326
|
+
should (and, in Cython, \emph{must}) override the other!
|
|
327
|
+
|
|
328
|
+
EXAMPLES::
|
|
329
|
+
|
|
330
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
331
|
+
sage: M = CircuitsMatroid(matroids.catalog.Vamos())
|
|
332
|
+
sage: N = CircuitsMatroid(matroids.catalog.Vamos())
|
|
333
|
+
sage: hash(M) == hash(N)
|
|
334
|
+
True
|
|
335
|
+
sage: O = CircuitsMatroid(matroids.catalog.NonVamos())
|
|
336
|
+
sage: hash(M) == hash(O)
|
|
337
|
+
False
|
|
338
|
+
"""
|
|
339
|
+
return hash(tuple([self._groundset, frozenset(self._C)]))
|
|
340
|
+
|
|
341
|
+
def __richcmp__(left, right, int op):
|
|
342
|
+
r"""
|
|
343
|
+
Compare two matroids.
|
|
344
|
+
|
|
345
|
+
We take a very restricted view on equality: the objects need to be of
|
|
346
|
+
the exact same type (so no subclassing) and the internal data need to
|
|
347
|
+
be the same. For CircuitsMatroids, this means that the groundsets and
|
|
348
|
+
the sets of circuits of the two matroids are equal.
|
|
349
|
+
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
353
|
+
sage: M = CircuitsMatroid(matroids.catalog.Pappus())
|
|
354
|
+
sage: N = CircuitsMatroid(matroids.catalog.NonPappus())
|
|
355
|
+
sage: M == N
|
|
356
|
+
False
|
|
357
|
+
sage: N = Matroid(circuits=M.circuits())
|
|
358
|
+
sage: M == N
|
|
359
|
+
True
|
|
360
|
+
"""
|
|
361
|
+
cdef CircuitsMatroid lt, rt
|
|
362
|
+
if op not in [Py_EQ, Py_NE]:
|
|
363
|
+
return NotImplemented
|
|
364
|
+
if type(left) is not type(right):
|
|
365
|
+
return NotImplemented
|
|
366
|
+
lt = <CircuitsMatroid> left
|
|
367
|
+
rt = <CircuitsMatroid> right
|
|
368
|
+
if lt.groundset() != rt.groundset():
|
|
369
|
+
return rich_to_bool(op, 1)
|
|
370
|
+
if lt.full_rank() != rt.full_rank():
|
|
371
|
+
return rich_to_bool(op, 1)
|
|
372
|
+
return richcmp(frozenset(lt._C), frozenset(rt._C), op)
|
|
373
|
+
|
|
374
|
+
# copying, loading, saving
|
|
375
|
+
|
|
376
|
+
def __reduce__(self):
|
|
377
|
+
"""
|
|
378
|
+
Save the matroid for later reloading.
|
|
379
|
+
|
|
380
|
+
OUTPUT:
|
|
381
|
+
|
|
382
|
+
A tuple ``(unpickle, (version, data))``, where ``unpickle`` is the
|
|
383
|
+
name of a function that, when called with ``(version, data)``,
|
|
384
|
+
produces a matroid isomorphic to ``self``. ``version`` is an integer
|
|
385
|
+
(currently 0) and ``data`` is a tuple ``(E, C, name)`` where ``E`` is
|
|
386
|
+
the groundset, ``C`` is the list of circuits, and ``name`` is a custom
|
|
387
|
+
name.
|
|
388
|
+
|
|
389
|
+
EXAMPLES::
|
|
390
|
+
|
|
391
|
+
sage: M = matroids.Theta(5)
|
|
392
|
+
sage: M == loads(dumps(M)) # indirect doctest
|
|
393
|
+
True
|
|
394
|
+
sage: M.reset_name()
|
|
395
|
+
sage: loads(dumps(M))
|
|
396
|
+
Matroid of rank 5 on 10 elements with 45 circuits
|
|
397
|
+
"""
|
|
398
|
+
import sage.matroids.unpickling
|
|
399
|
+
data = (self._groundset, frozenset(self._C), self.get_custom_name())
|
|
400
|
+
version = 0
|
|
401
|
+
return sage.matroids.unpickling.unpickle_circuits_matroid, (version, data)
|
|
402
|
+
|
|
403
|
+
cpdef relabel(self, mapping):
|
|
404
|
+
r"""
|
|
405
|
+
Return an isomorphic matroid with relabeled groundset.
|
|
406
|
+
|
|
407
|
+
The output is obtained by relabeling each element `e` by
|
|
408
|
+
``mapping[e]``, where ``mapping`` is a given injective map. If
|
|
409
|
+
``mapping[e]`` is not defined, then the identity map is assumed.
|
|
410
|
+
|
|
411
|
+
INPUT:
|
|
412
|
+
|
|
413
|
+
- ``mapping`` -- a Python object such that ``mapping[e]`` is the new
|
|
414
|
+
label of `e`
|
|
415
|
+
|
|
416
|
+
OUTPUT: matroid
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: # needs sage.rings.finite_rings
|
|
421
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
422
|
+
sage: M = CircuitsMatroid(matroids.catalog.RelaxedNonFano())
|
|
423
|
+
sage: sorted(M.groundset())
|
|
424
|
+
[0, 1, 2, 3, 4, 5, 6]
|
|
425
|
+
sage: N = M.relabel({'g': 'x', 0: 'z'}) # 'g': 'x' is ignored
|
|
426
|
+
sage: from sage.matroids.utilities import cmp_elements_key
|
|
427
|
+
sage: sorted(N.groundset(), key=cmp_elements_key)
|
|
428
|
+
[1, 2, 3, 4, 5, 6, 'z']
|
|
429
|
+
sage: M.is_isomorphic(N)
|
|
430
|
+
True
|
|
431
|
+
|
|
432
|
+
TESTS::
|
|
433
|
+
|
|
434
|
+
sage: # needs sage.rings.finite_rings
|
|
435
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
436
|
+
sage: M = CircuitsMatroid(matroids.catalog.RelaxedNonFano())
|
|
437
|
+
sage: f = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g'}
|
|
438
|
+
sage: N = M.relabel(f)
|
|
439
|
+
sage: for S in powerset(M.groundset()):
|
|
440
|
+
....: assert M.rank(S) == N.rank([f[x] for x in S])
|
|
441
|
+
"""
|
|
442
|
+
d = self._relabel_map(mapping)
|
|
443
|
+
E = [d[x] for x in self._groundset]
|
|
444
|
+
C = []
|
|
445
|
+
for i in self._k_C:
|
|
446
|
+
C += [[d[y] for y in x] for x in self._k_C[i]]
|
|
447
|
+
M = CircuitsMatroid(groundset=E, circuits=C)
|
|
448
|
+
return M
|
|
449
|
+
|
|
450
|
+
# enumeration
|
|
451
|
+
|
|
452
|
+
def bases_iterator(self):
|
|
453
|
+
r"""
|
|
454
|
+
Return an iterator over the bases of the matroid.
|
|
455
|
+
|
|
456
|
+
EXAMPLES::
|
|
457
|
+
|
|
458
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
459
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
460
|
+
sage: it = M.bases_iterator()
|
|
461
|
+
sage: it.__next__()
|
|
462
|
+
frozenset({0, 1})
|
|
463
|
+
sage: sorted(M.bases_iterator(), key=str)
|
|
464
|
+
[frozenset({0, 1}),
|
|
465
|
+
frozenset({0, 2}),
|
|
466
|
+
frozenset({0, 3}),
|
|
467
|
+
frozenset({1, 2}),
|
|
468
|
+
frozenset({1, 3}),
|
|
469
|
+
frozenset({2, 3})]
|
|
470
|
+
"""
|
|
471
|
+
from itertools import combinations
|
|
472
|
+
cdef set NB = set(self.nonbases())
|
|
473
|
+
cdef frozenset S
|
|
474
|
+
for St in combinations(self._groundset, self._matroid_rank):
|
|
475
|
+
S = frozenset(St)
|
|
476
|
+
if S not in NB:
|
|
477
|
+
yield S
|
|
478
|
+
|
|
479
|
+
cpdef SetSystem independent_sets(self, long k=-1):
|
|
480
|
+
r"""
|
|
481
|
+
Return the independent sets of the matroid.
|
|
482
|
+
|
|
483
|
+
INPUT:
|
|
484
|
+
|
|
485
|
+
- ``k`` -- integer (optional); if specified, return the size-`k`
|
|
486
|
+
independent sets of the matroid
|
|
487
|
+
|
|
488
|
+
OUTPUT: :class:`SetSystem`
|
|
489
|
+
|
|
490
|
+
EXAMPLES::
|
|
491
|
+
|
|
492
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
493
|
+
sage: M = CircuitsMatroid(matroids.catalog.Pappus())
|
|
494
|
+
sage: M.independent_sets(4)
|
|
495
|
+
SetSystem of 0 sets over 9 elements
|
|
496
|
+
sage: M.independent_sets(3)
|
|
497
|
+
SetSystem of 75 sets over 9 elements
|
|
498
|
+
sage: frozenset({'a', 'c', 'e'}) in _
|
|
499
|
+
True
|
|
500
|
+
|
|
501
|
+
TESTS::
|
|
502
|
+
|
|
503
|
+
sage: # needs sage.graphs
|
|
504
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
505
|
+
sage: M = CircuitsMatroid(matroids.CompleteGraphic(4))
|
|
506
|
+
sage: len(M.bases())
|
|
507
|
+
16
|
|
508
|
+
|
|
509
|
+
.. SEEALSO::
|
|
510
|
+
|
|
511
|
+
:meth:`M.bases() <sage.matroids.circuits_matroid.bases>`
|
|
512
|
+
"""
|
|
513
|
+
if k == -1: # all independent sets
|
|
514
|
+
return self._independent_sets()
|
|
515
|
+
|
|
516
|
+
# independent k-sets
|
|
517
|
+
from itertools import combinations
|
|
518
|
+
cdef SetSystem I_k = SetSystem(self._groundset)
|
|
519
|
+
cdef set D_k = set(self.dependent_sets(k))
|
|
520
|
+
cdef frozenset S
|
|
521
|
+
for St in combinations(self._groundset, k):
|
|
522
|
+
S = frozenset(St)
|
|
523
|
+
if S not in D_k:
|
|
524
|
+
I_k.append(S)
|
|
525
|
+
return I_k
|
|
526
|
+
|
|
527
|
+
cpdef SetSystem dependent_sets(self, long k):
|
|
528
|
+
r"""
|
|
529
|
+
Return the dependent sets of fixed size.
|
|
530
|
+
|
|
531
|
+
INPUT:
|
|
532
|
+
|
|
533
|
+
- ``k`` -- integer
|
|
534
|
+
|
|
535
|
+
OUTPUT: :class:`SetSystem`
|
|
536
|
+
|
|
537
|
+
EXAMPLES::
|
|
538
|
+
|
|
539
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
540
|
+
sage: M = CircuitsMatroid(matroids.catalog.Vamos())
|
|
541
|
+
sage: M.dependent_sets(3)
|
|
542
|
+
SetSystem of 0 sets over 8 elements
|
|
543
|
+
sage: sorted([sorted(X) for X in M.dependent_sets(4)])
|
|
544
|
+
[['a', 'b', 'c', 'd'], ['a', 'b', 'e', 'f'], ['a', 'b', 'g', 'h'],
|
|
545
|
+
['c', 'd', 'e', 'f'], ['e', 'f', 'g', 'h']]
|
|
546
|
+
|
|
547
|
+
TESTS::
|
|
548
|
+
|
|
549
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
550
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
551
|
+
sage: len(M.nonbases())
|
|
552
|
+
0
|
|
553
|
+
|
|
554
|
+
sage: # needs sage.graphs
|
|
555
|
+
sage: M = CircuitsMatroid(matroids.CompleteGraphic(6))
|
|
556
|
+
sage: len(M.nonbases())
|
|
557
|
+
1707
|
|
558
|
+
"""
|
|
559
|
+
cdef int i
|
|
560
|
+
cdef set D_k = set()
|
|
561
|
+
cdef frozenset S
|
|
562
|
+
for i in range(min(self._k_C), k + 1):
|
|
563
|
+
if i in self._k_C:
|
|
564
|
+
for S in self._k_C[i]:
|
|
565
|
+
D_k.add(S)
|
|
566
|
+
if i == k:
|
|
567
|
+
break
|
|
568
|
+
for S in D_k.copy():
|
|
569
|
+
D_k.remove(S)
|
|
570
|
+
for e in S ^ self._groundset:
|
|
571
|
+
D_k.add(S | set([e]))
|
|
572
|
+
return SetSystem(self._groundset, D_k)
|
|
573
|
+
|
|
574
|
+
cpdef SetSystem circuits(self, k=None):
|
|
575
|
+
"""
|
|
576
|
+
Return the circuits of the matroid.
|
|
577
|
+
|
|
578
|
+
INPUT:
|
|
579
|
+
|
|
580
|
+
- ``k`` -- integer (optional); the length of the circuits
|
|
581
|
+
|
|
582
|
+
OUTPUT: :class:`SetSystem`
|
|
583
|
+
|
|
584
|
+
EXAMPLES::
|
|
585
|
+
|
|
586
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
587
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
588
|
+
sage: M.circuits()
|
|
589
|
+
SetSystem of 4 sets over 4 elements
|
|
590
|
+
sage: list(M.circuits(0))
|
|
591
|
+
[]
|
|
592
|
+
sage: sorted(M.circuits(3), key=str)
|
|
593
|
+
[frozenset({0, 1, 2}),
|
|
594
|
+
frozenset({0, 1, 3}),
|
|
595
|
+
frozenset({0, 2, 3}),
|
|
596
|
+
frozenset({1, 2, 3})]
|
|
597
|
+
"""
|
|
598
|
+
cdef SetSystem C = SetSystem(self._groundset)
|
|
599
|
+
if k is not None:
|
|
600
|
+
if k in self._k_C:
|
|
601
|
+
for c in self._k_C[k]:
|
|
602
|
+
C.append(c)
|
|
603
|
+
else:
|
|
604
|
+
for i in self._k_C:
|
|
605
|
+
for c in self._k_C[i]:
|
|
606
|
+
C.append(c)
|
|
607
|
+
return C
|
|
608
|
+
|
|
609
|
+
def circuits_iterator(self, k=None):
|
|
610
|
+
"""
|
|
611
|
+
Return an iterator over the circuits of the matroid.
|
|
612
|
+
|
|
613
|
+
INPUT:
|
|
614
|
+
|
|
615
|
+
- ``k`` -- integer (optional); the length of the circuits
|
|
616
|
+
|
|
617
|
+
EXAMPLES::
|
|
618
|
+
|
|
619
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
620
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
621
|
+
sage: sum(1 for C in M.circuits_iterator())
|
|
622
|
+
4
|
|
623
|
+
sage: list(M.circuits_iterator(0))
|
|
624
|
+
[]
|
|
625
|
+
sage: sorted(M.circuits_iterator(3), key=str)
|
|
626
|
+
[frozenset({0, 1, 2}),
|
|
627
|
+
frozenset({0, 1, 3}),
|
|
628
|
+
frozenset({0, 2, 3}),
|
|
629
|
+
frozenset({1, 2, 3})]
|
|
630
|
+
"""
|
|
631
|
+
if k is not None:
|
|
632
|
+
if k in self._k_C:
|
|
633
|
+
for C in self._k_C[k]:
|
|
634
|
+
yield C
|
|
635
|
+
else:
|
|
636
|
+
for i in self._k_C:
|
|
637
|
+
for C in self._k_C[i]:
|
|
638
|
+
yield C
|
|
639
|
+
|
|
640
|
+
cpdef SetSystem nonspanning_circuits(self):
|
|
641
|
+
"""
|
|
642
|
+
Return the nonspanning circuits of the matroid.
|
|
643
|
+
|
|
644
|
+
OUTPUT: :class:`SetSystem`
|
|
645
|
+
|
|
646
|
+
EXAMPLES::
|
|
647
|
+
|
|
648
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
649
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
650
|
+
sage: M.nonspanning_circuits()
|
|
651
|
+
SetSystem of 0 sets over 4 elements
|
|
652
|
+
sage: M = matroids.Theta(5)
|
|
653
|
+
sage: M.nonspanning_circuits()
|
|
654
|
+
SetSystem of 15 sets over 10 elements
|
|
655
|
+
"""
|
|
656
|
+
cdef SetSystem NSC = SetSystem(self._groundset)
|
|
657
|
+
cdef int i
|
|
658
|
+
cdef frozenset S
|
|
659
|
+
for i in self._sorted_C_lens:
|
|
660
|
+
if i > self._matroid_rank:
|
|
661
|
+
break
|
|
662
|
+
for S in self._k_C[i]:
|
|
663
|
+
NSC.append(S)
|
|
664
|
+
return NSC
|
|
665
|
+
|
|
666
|
+
def nonspanning_circuits_iterator(self):
|
|
667
|
+
"""
|
|
668
|
+
Return an iterator over the nonspanning circuits of the matroid.
|
|
669
|
+
|
|
670
|
+
EXAMPLES::
|
|
671
|
+
|
|
672
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
673
|
+
sage: M = CircuitsMatroid(matroids.Uniform(2, 4))
|
|
674
|
+
sage: list(M.nonspanning_circuits_iterator())
|
|
675
|
+
[]
|
|
676
|
+
"""
|
|
677
|
+
cdef int i
|
|
678
|
+
for i in self._k_C:
|
|
679
|
+
if i <= self._matroid_rank:
|
|
680
|
+
for C in self._k_C[i]:
|
|
681
|
+
yield C
|
|
682
|
+
|
|
683
|
+
cpdef SetSystem no_broken_circuits_facets(self, ordering=None, reduced=False):
|
|
684
|
+
r"""
|
|
685
|
+
Return the no broken circuits (NBC) facets of ``self``.
|
|
686
|
+
|
|
687
|
+
INPUT:
|
|
688
|
+
|
|
689
|
+
- ``ordering`` -- list (optional); a total ordering of the groundset
|
|
690
|
+
- ``reduced`` -- boolean (default: ``False``)
|
|
691
|
+
|
|
692
|
+
OUTPUT: :class:`SetSystem`
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: M = Matroid(circuits=[[0, 1, 2]])
|
|
697
|
+
sage: M.no_broken_circuits_facets(ordering=[1, 0, 2])
|
|
698
|
+
SetSystem of 2 sets over 3 elements
|
|
699
|
+
sage: sorted([sorted(X) for X in _])
|
|
700
|
+
[[0, 1], [1, 2]]
|
|
701
|
+
sage: M.no_broken_circuits_facets(ordering=[1, 0, 2], reduced=True)
|
|
702
|
+
SetSystem of 2 sets over 3 elements
|
|
703
|
+
sage: sorted([sorted(X) for X in _])
|
|
704
|
+
[[0], [2]]
|
|
705
|
+
"""
|
|
706
|
+
from itertools import combinations
|
|
707
|
+
from sage.matroids.utilities import cmp_elements_key
|
|
708
|
+
if ordering is None:
|
|
709
|
+
ordering = sorted(self._groundset, key=cmp_elements_key)
|
|
710
|
+
else:
|
|
711
|
+
if frozenset(ordering) != self._groundset:
|
|
712
|
+
raise ValueError("not an ordering of the groundset")
|
|
713
|
+
|
|
714
|
+
cdef int i, r = self._matroid_rank
|
|
715
|
+
cdef frozenset min_e = frozenset([ordering[0]])
|
|
716
|
+
cdef frozenset S
|
|
717
|
+
# compute broken circuits (with minimal element added)
|
|
718
|
+
cdef dict BC = {}
|
|
719
|
+
for i in range(r + 1):
|
|
720
|
+
BC[i] = set()
|
|
721
|
+
for C in self._C:
|
|
722
|
+
for e in ordering:
|
|
723
|
+
if e in C:
|
|
724
|
+
S = C - frozenset([e]) | min_e
|
|
725
|
+
if len(S) <= r:
|
|
726
|
+
BC[len(S)].add(S)
|
|
727
|
+
break
|
|
728
|
+
|
|
729
|
+
for i in range(r):
|
|
730
|
+
for S in BC[i].copy():
|
|
731
|
+
BC[i].remove(S)
|
|
732
|
+
for e in self._groundset ^ S:
|
|
733
|
+
BC[i+1].add(S | set([e]))
|
|
734
|
+
|
|
735
|
+
cdef SetSystem B = SetSystem(self._groundset)
|
|
736
|
+
for St in combinations(ordering[1:], self._matroid_rank - 1):
|
|
737
|
+
S = frozenset(St)
|
|
738
|
+
if S | min_e not in BC[r]:
|
|
739
|
+
if not reduced:
|
|
740
|
+
B.append(S | min_e)
|
|
741
|
+
else:
|
|
742
|
+
B.append(S)
|
|
743
|
+
|
|
744
|
+
return B
|
|
745
|
+
|
|
746
|
+
cpdef SetSystem no_broken_circuits_sets(self, ordering=None, reduced=False):
|
|
747
|
+
r"""
|
|
748
|
+
Return the no broken circuits (NBC) sets of ``self``.
|
|
749
|
+
|
|
750
|
+
An NBC set is a subset `A` of the groundset under some total
|
|
751
|
+
ordering `<` such that `A` contains no broken circuit.
|
|
752
|
+
|
|
753
|
+
INPUT:
|
|
754
|
+
|
|
755
|
+
- ``ordering`` -- list (optional); a total ordering of the groundset
|
|
756
|
+
- ``reduced`` -- boolean (default: ``False``)
|
|
757
|
+
|
|
758
|
+
OUTPUT: :class:`SetSystem`
|
|
759
|
+
|
|
760
|
+
EXAMPLES::
|
|
761
|
+
|
|
762
|
+
sage: # needs sage.graphs
|
|
763
|
+
sage: M = Matroid(circuits=[[1, 2, 3], [3, 4, 5], [1, 2, 4, 5]])
|
|
764
|
+
sage: SimplicialComplex(M.no_broken_circuits_sets())
|
|
765
|
+
Simplicial complex with vertex set (1, 2, 3, 4, 5)
|
|
766
|
+
and facets {(1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5)}
|
|
767
|
+
sage: SimplicialComplex(M.no_broken_circuits_sets([5, 4, 3, 2, 1]))
|
|
768
|
+
Simplicial complex with vertex set (1, 2, 3, 4, 5)
|
|
769
|
+
and facets {(1, 3, 5), (1, 4, 5), (2, 3, 5), (2, 4, 5)}
|
|
770
|
+
|
|
771
|
+
::
|
|
772
|
+
|
|
773
|
+
sage: # needs sage.graphs
|
|
774
|
+
sage: M = Matroid(circuits=[[1, 2, 3], [1, 4, 5], [2, 3, 4, 5]])
|
|
775
|
+
sage: SimplicialComplex(M.no_broken_circuits_sets([5, 4, 3, 2, 1]))
|
|
776
|
+
Simplicial complex with vertex set (1, 2, 3, 4, 5)
|
|
777
|
+
and facets {(1, 3, 5), (2, 3, 5), (2, 4, 5), (3, 4, 5)}
|
|
778
|
+
|
|
779
|
+
TESTS::
|
|
780
|
+
|
|
781
|
+
sage: # needs sage.graphs
|
|
782
|
+
sage: M = Matroid(circuits=[[1, 2, 3], [3, 4, 5], [1, 2, 4, 5]])
|
|
783
|
+
sage: C1 = SimplicialComplex(M.no_broken_circuits_sets())
|
|
784
|
+
sage: from sage.matroids.basis_matroid import BasisMatroid
|
|
785
|
+
sage: M = BasisMatroid(Matroid(circuits=[[1, 2, 3], [3, 4, 5], [1, 2, 4, 5]]))
|
|
786
|
+
sage: C2 = SimplicialComplex(M.no_broken_circuits_sets())
|
|
787
|
+
sage: C1 == C2
|
|
788
|
+
True
|
|
789
|
+
"""
|
|
790
|
+
from sage.topology.simplicial_complex import SimplicialComplex
|
|
791
|
+
cdef SetSystem NBC = SetSystem(self._groundset)
|
|
792
|
+
for f in SimplicialComplex(self.no_broken_circuits_facets(ordering, reduced),
|
|
793
|
+
maximality_check=False).face_iterator():
|
|
794
|
+
NBC.append(frozenset(f))
|
|
795
|
+
return NBC
|
|
796
|
+
|
|
797
|
+
cpdef broken_circuit_complex(self, ordering=None, reduced=False):
|
|
798
|
+
r"""
|
|
799
|
+
Return the broken circuit complex of ``self``.
|
|
800
|
+
|
|
801
|
+
The broken circuit complex of a matroid with a total ordering `<`
|
|
802
|
+
on the groundset is obtained from the
|
|
803
|
+
:meth:`NBC sets <no_broken_circuits_sets>` under subset inclusion.
|
|
804
|
+
|
|
805
|
+
INPUT:
|
|
806
|
+
|
|
807
|
+
- ``ordering`` -- list (optional); a total ordering of the groundset
|
|
808
|
+
- ``reduced`` -- boolean (default: ``False``); whether to return the
|
|
809
|
+
reduced broken circuit complex (the link at the smallest element)
|
|
810
|
+
|
|
811
|
+
OUTPUT: a simplicial complex of the NBC sets under inclusion
|
|
812
|
+
|
|
813
|
+
EXAMPLES::
|
|
814
|
+
|
|
815
|
+
sage: # needs sage.graphs
|
|
816
|
+
sage: M = Matroid(circuits=[[1, 2, 3], [3, 4, 5], [1, 2, 4, 5]])
|
|
817
|
+
sage: M.broken_circuit_complex()
|
|
818
|
+
Simplicial complex with vertex set (1, 2, 3, 4, 5)
|
|
819
|
+
and facets {(1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5)}
|
|
820
|
+
sage: M.broken_circuit_complex([5, 4, 3, 2, 1])
|
|
821
|
+
Simplicial complex with vertex set (1, 2, 3, 4, 5)
|
|
822
|
+
and facets {(1, 3, 5), (1, 4, 5), (2, 3, 5), (2, 4, 5)}
|
|
823
|
+
sage: M.broken_circuit_complex([5, 4, 3, 2, 1], reduced=True)
|
|
824
|
+
Simplicial complex with vertex set (1, 2, 3, 4)
|
|
825
|
+
and facets {(1, 3), (1, 4), (2, 3), (2, 4)}
|
|
826
|
+
|
|
827
|
+
For a matroid with loops, the broken circuit complex is not defined,
|
|
828
|
+
and the method yields an error::
|
|
829
|
+
|
|
830
|
+
sage: # needs sage.graphs
|
|
831
|
+
sage: M = Matroid(groundset=[0, 1, 2], circuits=[[0]])
|
|
832
|
+
sage: M.broken_circuit_complex()
|
|
833
|
+
Traceback (most recent call last):
|
|
834
|
+
...
|
|
835
|
+
ValueError: broken circuit complex of matroid with loops is not defined
|
|
836
|
+
"""
|
|
837
|
+
from sage.topology.simplicial_complex import SimplicialComplex
|
|
838
|
+
if self.loops():
|
|
839
|
+
raise ValueError("broken circuit complex of matroid with loops is not defined")
|
|
840
|
+
return SimplicialComplex(self.no_broken_circuits_facets(ordering, reduced), maximality_check=False)
|
|
841
|
+
|
|
842
|
+
# properties
|
|
843
|
+
|
|
844
|
+
cpdef girth(self):
|
|
845
|
+
r"""
|
|
846
|
+
Return the girth of the matroid.
|
|
847
|
+
|
|
848
|
+
The girth is the size of the smallest circuit. In case the matroid has
|
|
849
|
+
no circuits the girth is `\infty`.
|
|
850
|
+
|
|
851
|
+
EXAMPLES::
|
|
852
|
+
|
|
853
|
+
sage: matroids.Theta(10).girth()
|
|
854
|
+
3
|
|
855
|
+
|
|
856
|
+
REFERENCES:
|
|
857
|
+
|
|
858
|
+
[Oxl2011]_, p. 327.
|
|
859
|
+
"""
|
|
860
|
+
from sage.rings.infinity import infinity
|
|
861
|
+
return min(self._k_C, default=infinity)
|
|
862
|
+
|
|
863
|
+
cpdef bint is_paving(self) noexcept:
|
|
864
|
+
"""
|
|
865
|
+
Return if ``self`` is paving.
|
|
866
|
+
|
|
867
|
+
A matroid is paving if each of its circuits has size `r` or `r+1`.
|
|
868
|
+
|
|
869
|
+
OUTPUT: boolean
|
|
870
|
+
|
|
871
|
+
EXAMPLES::
|
|
872
|
+
|
|
873
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
874
|
+
sage: M = CircuitsMatroid(matroids.catalog.Vamos())
|
|
875
|
+
sage: M.is_paving()
|
|
876
|
+
True
|
|
877
|
+
"""
|
|
878
|
+
return self.girth() >= self._matroid_rank
|
|
879
|
+
|
|
880
|
+
# verification
|
|
881
|
+
|
|
882
|
+
cpdef is_valid(self, certificate=False):
|
|
883
|
+
r"""
|
|
884
|
+
Test if ``self`` obeys the matroid axioms.
|
|
885
|
+
|
|
886
|
+
For a matroid defined by its circuits, we check the circuit axioms.
|
|
887
|
+
|
|
888
|
+
INPUT:
|
|
889
|
+
|
|
890
|
+
- ``certificate`` -- boolean (default: ``False``)
|
|
891
|
+
|
|
892
|
+
OUTPUT: boolean, or (boolean, dictionary)
|
|
893
|
+
|
|
894
|
+
EXAMPLES::
|
|
895
|
+
|
|
896
|
+
sage: C = [[1, 2, 3], [3, 4, 5], [1, 2, 4, 5]]
|
|
897
|
+
sage: M = Matroid(circuits=C)
|
|
898
|
+
sage: M.is_valid()
|
|
899
|
+
True
|
|
900
|
+
sage: C = [[1, 2], [1, 2, 3], [3, 4, 5], [1, 2, 4, 5]]
|
|
901
|
+
sage: M = Matroid(circuits=C)
|
|
902
|
+
sage: M.is_valid()
|
|
903
|
+
False
|
|
904
|
+
sage: C = [[3, 6], [1, 2, 3], [3, 4, 5], [1, 2, 4, 5]]
|
|
905
|
+
sage: M = Matroid(circuits=C)
|
|
906
|
+
sage: M.is_valid()
|
|
907
|
+
False
|
|
908
|
+
sage: C = [[3, 6], [1, 2, 3], [3, 4, 5], [1, 2, 6], [6, 4, 5], [1, 2, 4, 5]]
|
|
909
|
+
sage: M = Matroid(circuits=C)
|
|
910
|
+
sage: M.is_valid()
|
|
911
|
+
True
|
|
912
|
+
sage: C = [[], [1, 2, 3], [3, 4, 5], [1, 2, 4, 5]]
|
|
913
|
+
sage: M = Matroid(circuits=C)
|
|
914
|
+
sage: M.is_valid()
|
|
915
|
+
False
|
|
916
|
+
sage: C = [[1, 2, 3], [3, 4, 5]]
|
|
917
|
+
sage: M = Matroid(circuits=C)
|
|
918
|
+
sage: M.is_valid(certificate=True)
|
|
919
|
+
(False,
|
|
920
|
+
{'circuit 1': frozenset({...}),
|
|
921
|
+
'circuit 2': frozenset({...}),
|
|
922
|
+
'element': 3,
|
|
923
|
+
'error': 'elimination axiom failed'})
|
|
924
|
+
"""
|
|
925
|
+
from itertools import combinations_with_replacement
|
|
926
|
+
cdef int i, j
|
|
927
|
+
cdef frozenset C1, C2, I12, U12
|
|
928
|
+
for (i, j) in combinations_with_replacement(self._sorted_C_lens, 2):
|
|
929
|
+
# loop through all circuit length pairs (i, j) with i <= j
|
|
930
|
+
for C1 in self._k_C[i]:
|
|
931
|
+
if not C1: # the empty set can't be a circuit
|
|
932
|
+
return False if not certificate else (False, {"error": "the empty set can't be a circuit"})
|
|
933
|
+
for C2 in self._k_C[j]:
|
|
934
|
+
I12 = C1 & C2
|
|
935
|
+
if not I12: # C1 and C2 are disjoint; nothing to test
|
|
936
|
+
continue
|
|
937
|
+
if len(I12) == len(C1):
|
|
938
|
+
if len(C1) == len(C2): # they are the same circuit
|
|
939
|
+
break
|
|
940
|
+
# C1 < C2; a circuit can't be a subset of another circuit
|
|
941
|
+
return False if not certificate else (False, {"error": "a circuit can't be a subset of another circuit", "circuit 1": C1, "circuit 2": C2})
|
|
942
|
+
# check circuit elimination axiom
|
|
943
|
+
U12 = C1 | C2
|
|
944
|
+
for e in I12:
|
|
945
|
+
if self._is_independent(U12 - {e}):
|
|
946
|
+
return False if not certificate else (False, {"error": "elimination axiom failed", "circuit 1": C1, "circuit 2": C2, "element": e})
|
|
947
|
+
return True if not certificate else (True, {})
|