passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_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 +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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,1217 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
"""
|
|
3
|
+
Basis matroids
|
|
4
|
+
|
|
5
|
+
In a matroid, a basis is an inclusionwise maximal independent set.
|
|
6
|
+
The common cardinality of all bases is the rank of the matroid.
|
|
7
|
+
Matroids are uniquely determined by their set of bases.
|
|
8
|
+
|
|
9
|
+
This module defines the class
|
|
10
|
+
:class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`, which
|
|
11
|
+
internally represents a matroid as a set of bases. It is a subclass of
|
|
12
|
+
:mod:`BasisExchangeMatroid <sage.matroids.basis_exchange_matroid>`, and as
|
|
13
|
+
such it inherits all method from that class and from the class
|
|
14
|
+
:mod:`Matroid <sage.matroids.matroid>`. Additionally, it provides the
|
|
15
|
+
following methods:
|
|
16
|
+
|
|
17
|
+
- :meth:`is_distinguished() <sage.matroids.basis_matroid.BasisMatroid.is_distinguished>`
|
|
18
|
+
- :meth:`relabel() <sage.matroids.basis_matroid.BasisMatroid.relabel>`
|
|
19
|
+
|
|
20
|
+
Construction
|
|
21
|
+
============
|
|
22
|
+
|
|
23
|
+
A ``BasisMatroid`` can be created from another matroid, from a list of bases,
|
|
24
|
+
or from a list of nonbases. For a full description of allowed inputs, see
|
|
25
|
+
:class:`below <sage.matroids.basis_matroid.BasisMatroid>`. It is recommended
|
|
26
|
+
to use the :func:`Matroid() <sage.matroids.constructor.Matroid>` function for
|
|
27
|
+
easy construction of a ``BasisMatroid``. For direct access to the
|
|
28
|
+
``BasisMatroid`` constructor, run::
|
|
29
|
+
|
|
30
|
+
sage: from sage.matroids.advanced import *
|
|
31
|
+
|
|
32
|
+
See also :mod:`sage.matroids.advanced`.
|
|
33
|
+
|
|
34
|
+
EXAMPLES::
|
|
35
|
+
|
|
36
|
+
sage: from sage.matroids.advanced import *
|
|
37
|
+
sage: M1 = BasisMatroid(groundset='abcd', bases=['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
38
|
+
sage: M2 = Matroid(['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
39
|
+
sage: M1 == M2
|
|
40
|
+
True
|
|
41
|
+
|
|
42
|
+
Implementation
|
|
43
|
+
==============
|
|
44
|
+
|
|
45
|
+
The set of bases is compactly stored in a bitset which takes
|
|
46
|
+
`O(binomial(N, R))` bits of space, where `N` is the cardinality of the
|
|
47
|
+
groundset and `R` is the rank. ``BasisMatroid`` inherits the matroid oracle
|
|
48
|
+
from its parent class ``BasisExchangeMatroid``, by providing the elementary
|
|
49
|
+
functions for exploring the base exchange graph. In addition, ``BasisMatroid``
|
|
50
|
+
has methods for constructing minors, duals, single-element extensions, for
|
|
51
|
+
testing matroid isomorphism and minor inclusion.
|
|
52
|
+
|
|
53
|
+
AUTHORS:
|
|
54
|
+
|
|
55
|
+
- Rudi Pendavingh, Stefan van Zwam (2013-04-01): initial version
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
# ****************************************************************************
|
|
59
|
+
# Copyright (C) 2013 Rudi Pendavingh <rudi.pendavingh@gmail.com>
|
|
60
|
+
# Copyright (C) 2013 Stefan van Zwam <stefanvanzwam@gmail.com>
|
|
61
|
+
#
|
|
62
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
63
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
64
|
+
# the License, or (at your option) any later version.
|
|
65
|
+
# https://www.gnu.org/licenses/
|
|
66
|
+
# ****************************************************************************
|
|
67
|
+
|
|
68
|
+
from cpython.object cimport Py_EQ, Py_NE
|
|
69
|
+
from itertools import combinations
|
|
70
|
+
from sage.data_structures.bitset_base cimport *
|
|
71
|
+
from sage.misc.decorators import rename_keyword
|
|
72
|
+
from sage.structure.richcmp cimport rich_to_bool
|
|
73
|
+
from sage.matroids.matroid cimport Matroid
|
|
74
|
+
from sage.matroids.basis_exchange_matroid cimport BasisExchangeMatroid
|
|
75
|
+
from sage.matroids.set_system cimport SetSystem
|
|
76
|
+
from sage.matroids.utilities import cmp_elements_key
|
|
77
|
+
|
|
78
|
+
# class of general matroids, represented by their list of bases
|
|
79
|
+
|
|
80
|
+
cdef class BasisMatroid(BasisExchangeMatroid):
|
|
81
|
+
"""
|
|
82
|
+
Create general matroid, stored as a set of bases.
|
|
83
|
+
|
|
84
|
+
INPUT:
|
|
85
|
+
|
|
86
|
+
- ``M`` -- matroid (optional)
|
|
87
|
+
- ``groundset`` -- any iterable set (optional)
|
|
88
|
+
- ``bases`` -- set of subsets of the ``groundset`` (optional)
|
|
89
|
+
- ``nonbases`` -- set of subsets of the ``groundset`` (optional)
|
|
90
|
+
- ``rank`` -- natural number (optional)
|
|
91
|
+
|
|
92
|
+
EXAMPLES:
|
|
93
|
+
|
|
94
|
+
The empty matroid::
|
|
95
|
+
|
|
96
|
+
sage: from sage.matroids.advanced import *
|
|
97
|
+
sage: M = BasisMatroid()
|
|
98
|
+
sage: M.groundset()
|
|
99
|
+
frozenset()
|
|
100
|
+
sage: M.full_rank()
|
|
101
|
+
0
|
|
102
|
+
|
|
103
|
+
Create a BasisMatroid instance out of any other matroid::
|
|
104
|
+
|
|
105
|
+
sage: from sage.matroids.advanced import *
|
|
106
|
+
sage: F = matroids.catalog.Fano()
|
|
107
|
+
sage: M = BasisMatroid(F)
|
|
108
|
+
sage: F.groundset() == M.groundset()
|
|
109
|
+
True
|
|
110
|
+
sage: len(set(F.bases()).difference(M.bases()))
|
|
111
|
+
0
|
|
112
|
+
|
|
113
|
+
It is possible to provide either bases or nonbases::
|
|
114
|
+
|
|
115
|
+
sage: from sage.matroids.advanced import *
|
|
116
|
+
sage: M1 = BasisMatroid(groundset='abc', bases=['ab', 'ac'] )
|
|
117
|
+
sage: M2 = BasisMatroid(groundset='abc', nonbases=['bc'])
|
|
118
|
+
sage: M1 == M2
|
|
119
|
+
True
|
|
120
|
+
|
|
121
|
+
Providing only groundset and rank creates a uniform matroid::
|
|
122
|
+
|
|
123
|
+
sage: from sage.matroids.advanced import *
|
|
124
|
+
sage: M1 = BasisMatroid(matroids.Uniform(2, 5))
|
|
125
|
+
sage: M2 = BasisMatroid(groundset=range(5), rank=2)
|
|
126
|
+
sage: M1 == M2
|
|
127
|
+
True
|
|
128
|
+
|
|
129
|
+
We do not check if the provided input forms an actual matroid::
|
|
130
|
+
|
|
131
|
+
sage: from sage.matroids.advanced import *
|
|
132
|
+
sage: M1 = BasisMatroid(groundset='abcd', bases=['ab', 'cd'])
|
|
133
|
+
sage: M1.full_rank()
|
|
134
|
+
2
|
|
135
|
+
sage: M1.is_valid()
|
|
136
|
+
False
|
|
137
|
+
"""
|
|
138
|
+
def __init__(self, M=None, groundset=None, bases=None, nonbases=None, rank=None):
|
|
139
|
+
"""
|
|
140
|
+
See the class definition for full documentation.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: from sage.matroids.advanced import *
|
|
145
|
+
sage: F = matroids.catalog.Fano()
|
|
146
|
+
sage: M = BasisMatroid(F)
|
|
147
|
+
sage: F.groundset() == M.groundset()
|
|
148
|
+
True
|
|
149
|
+
sage: len(set(F.bases()).difference(M.bases()))
|
|
150
|
+
0
|
|
151
|
+
|
|
152
|
+
TESTS::
|
|
153
|
+
|
|
154
|
+
sage: F = matroids.catalog.Fano()
|
|
155
|
+
sage: M = Matroid(bases=F.bases())
|
|
156
|
+
sage: TestSuite(M).run()
|
|
157
|
+
"""
|
|
158
|
+
cdef SetSystem NB
|
|
159
|
+
cdef long i
|
|
160
|
+
cdef mp_bitcnt_t bc
|
|
161
|
+
|
|
162
|
+
if isinstance(M, BasisMatroid):
|
|
163
|
+
BasisExchangeMatroid.__init__(self, groundset=(<BasisMatroid>M)._E, rank=(<BasisMatroid>M)._matroid_rank)
|
|
164
|
+
bitset_init(self._bb, binom[(<BasisMatroid>M)._groundset_size][(<BasisMatroid>M)._matroid_rank])
|
|
165
|
+
bitset_copy(self._bb, (<BasisMatroid>M)._bb)
|
|
166
|
+
bitset_init(self._b, (<BasisMatroid>M)._bitset_size)
|
|
167
|
+
bitset_copy(self._b, (<BasisMatroid>M)._b)
|
|
168
|
+
bitset_copy(self._current_basis, (<BasisMatroid>M)._current_basis)
|
|
169
|
+
self._bcount = (<BasisMatroid>M)._bcount
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
if isinstance(M, BasisExchangeMatroid):
|
|
173
|
+
BasisExchangeMatroid.__init__(self, groundset=(<BasisExchangeMatroid>M)._E, rank=(<BasisExchangeMatroid>M)._matroid_rank)
|
|
174
|
+
binom_init(len(M), M.full_rank())
|
|
175
|
+
bc = binom[(<BasisExchangeMatroid>M)._groundset_size][(<BasisExchangeMatroid>M)._matroid_rank]
|
|
176
|
+
bitset_init(self._bb, bc)
|
|
177
|
+
bitset_set_first_n(self._bb, bc)
|
|
178
|
+
NB = M.nonbases()
|
|
179
|
+
for i in range(len(NB)):
|
|
180
|
+
bitset_discard(self._bb, set_to_index(NB._subsets[i]))
|
|
181
|
+
|
|
182
|
+
bitset_init(self._b, (<BasisExchangeMatroid>M)._bitset_size)
|
|
183
|
+
self.reset_current_basis()
|
|
184
|
+
self._bcount = bc - len(NB)
|
|
185
|
+
return
|
|
186
|
+
|
|
187
|
+
if M is not None:
|
|
188
|
+
rank = M.full_rank()
|
|
189
|
+
nonbases = M.nonbases()
|
|
190
|
+
groundset = sorted(M.groundset(), key=cmp_elements_key)
|
|
191
|
+
|
|
192
|
+
if groundset is None:
|
|
193
|
+
groundset = frozenset()
|
|
194
|
+
if rank is None:
|
|
195
|
+
if bases is not None:
|
|
196
|
+
for B in bases:
|
|
197
|
+
rank = len(B)
|
|
198
|
+
break
|
|
199
|
+
elif nonbases is not None:
|
|
200
|
+
for N in nonbases:
|
|
201
|
+
rank = len(N)
|
|
202
|
+
break
|
|
203
|
+
else:
|
|
204
|
+
rank = 0
|
|
205
|
+
|
|
206
|
+
BasisExchangeMatroid.__init__(self, groundset=groundset, rank=rank)
|
|
207
|
+
|
|
208
|
+
size = len(groundset)
|
|
209
|
+
binom_init(size, rank)
|
|
210
|
+
bitset_init(self._bb, binom[size][rank])
|
|
211
|
+
bitset_init(self._b, max(size, 1))
|
|
212
|
+
bitset_clear(self._bb)
|
|
213
|
+
|
|
214
|
+
if bases is not None:
|
|
215
|
+
if len(bases) == 0:
|
|
216
|
+
raise ValueError("set of bases must be nonempty")
|
|
217
|
+
self._bcount = 0
|
|
218
|
+
for B in bases:
|
|
219
|
+
b = frozenset(B)
|
|
220
|
+
if len(b) != self._matroid_rank:
|
|
221
|
+
raise ValueError("basis has wrong cardinality")
|
|
222
|
+
if not b.issubset(self._groundset):
|
|
223
|
+
raise ValueError("basis is not a subset of the groundset")
|
|
224
|
+
self._pack(self._b, b)
|
|
225
|
+
i = set_to_index(self._b)
|
|
226
|
+
if not bitset_in(self._bb, i):
|
|
227
|
+
self._bcount += 1
|
|
228
|
+
bitset_add(self._bb, i)
|
|
229
|
+
else:
|
|
230
|
+
bitset_complement(self._bb, self._bb)
|
|
231
|
+
self._bcount = binom[size][rank]
|
|
232
|
+
if nonbases is not None:
|
|
233
|
+
for B in nonbases:
|
|
234
|
+
b = frozenset(B)
|
|
235
|
+
if len(b) != self._matroid_rank:
|
|
236
|
+
raise ValueError("nonbasis has wrong cardinality")
|
|
237
|
+
if not b.issubset(self._groundset):
|
|
238
|
+
raise ValueError("nonbasis is not a subset of the groundset")
|
|
239
|
+
self._pack(self._b, b)
|
|
240
|
+
i = set_to_index(self._b)
|
|
241
|
+
if bitset_in(self._bb, i):
|
|
242
|
+
self._bcount -= 1
|
|
243
|
+
bitset_discard(self._bb, i)
|
|
244
|
+
|
|
245
|
+
self.reset_current_basis()
|
|
246
|
+
|
|
247
|
+
def __dealloc__(self):
|
|
248
|
+
bitset_free(self._b)
|
|
249
|
+
bitset_free(self._bb)
|
|
250
|
+
|
|
251
|
+
# Sage special functions
|
|
252
|
+
def _repr_(self):
|
|
253
|
+
"""
|
|
254
|
+
Return a string representation of ``self``.
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: from sage.matroids.advanced import *
|
|
259
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
260
|
+
sage: repr(M) # indirect doctest
|
|
261
|
+
'Matroid of rank 3 on 7 elements with 28 bases'
|
|
262
|
+
"""
|
|
263
|
+
return f'{Matroid._repr_(self)} with {self.bases_count()} bases'
|
|
264
|
+
|
|
265
|
+
# support for parent BasisExchangeMatroid
|
|
266
|
+
|
|
267
|
+
cdef bint _is_exchange_pair(self, long x, long y) except -1: # test if current_basis-x + y is a basis
|
|
268
|
+
"""
|
|
269
|
+
Test if `B-e + f` is a basis of the current matroid.
|
|
270
|
+
|
|
271
|
+
Here ``B`` is the 'current' basis, i.e. the one returned by
|
|
272
|
+
``self.basis()``, and ``e=self._E[x]``, ``f=self._E[y]``.
|
|
273
|
+
|
|
274
|
+
INPUT:
|
|
275
|
+
|
|
276
|
+
- ``x`` -- integer
|
|
277
|
+
- ``y`` -- integer
|
|
278
|
+
|
|
279
|
+
OUTPUT:
|
|
280
|
+
|
|
281
|
+
``True`` if `B-e + f` is a basis, ``False`` otherwise. Here `e`, `f`
|
|
282
|
+
are the groundset elements which are internally named by the integers
|
|
283
|
+
``x``, ``y``.
|
|
284
|
+
|
|
285
|
+
NOTE: this is an internal function, supporting the parent class
|
|
286
|
+
BasisExchangeMatroid of BasisMatroid.
|
|
287
|
+
"""
|
|
288
|
+
bitset_copy(self._b, self._current_basis)
|
|
289
|
+
bitset_discard(self._b, x)
|
|
290
|
+
bitset_add(self._b, y)
|
|
291
|
+
return bitset_in(self._bb, set_to_index(self._b))
|
|
292
|
+
|
|
293
|
+
cdef reset_current_basis(self):
|
|
294
|
+
"""
|
|
295
|
+
Set the current basis to the (lexicographically) first basis of the
|
|
296
|
+
matroid.
|
|
297
|
+
"""
|
|
298
|
+
index_to_set(self._current_basis, bitset_first(self._bb), self._matroid_rank, self._groundset_size) # set current basis of parent BasisExchangeMatroid
|
|
299
|
+
|
|
300
|
+
# a function that is very efficient for this class
|
|
301
|
+
|
|
302
|
+
cpdef bint _is_basis(self, frozenset X) noexcept:
|
|
303
|
+
"""
|
|
304
|
+
Test if input is a basis.
|
|
305
|
+
|
|
306
|
+
INPUT:
|
|
307
|
+
|
|
308
|
+
- ``X`` -- an object with Python's ``frozenset`` interface containing
|
|
309
|
+
a subset of ``self.groundset()``
|
|
310
|
+
|
|
311
|
+
.. WARNING::
|
|
312
|
+
|
|
313
|
+
This method assumes that ``X`` has the right size to be a basis,
|
|
314
|
+
i.e. ``len(X) == self.full_rank()``. Otherwise its behavior is
|
|
315
|
+
undefined.
|
|
316
|
+
|
|
317
|
+
OUTPUT: boolean
|
|
318
|
+
|
|
319
|
+
EXAMPLES::
|
|
320
|
+
|
|
321
|
+
sage: M = Matroid(bases=matroids.catalog.Vamos().bases())
|
|
322
|
+
sage: M._is_basis(frozenset(['a', 'b', 'c', 'e']))
|
|
323
|
+
True
|
|
324
|
+
sage: M._is_basis(frozenset(['a', 'b', 'c', 'd']))
|
|
325
|
+
False
|
|
326
|
+
"""
|
|
327
|
+
self._pack(self._b, X)
|
|
328
|
+
return bitset_in(self._bb, set_to_index(self._b))
|
|
329
|
+
|
|
330
|
+
# dual and minors
|
|
331
|
+
|
|
332
|
+
cpdef dual(self):
|
|
333
|
+
r"""
|
|
334
|
+
Return the dual of the matroid.
|
|
335
|
+
|
|
336
|
+
Let `M` be a matroid with groundset `E`. If `B` is the set of bases
|
|
337
|
+
of `M`, then the set `\{E - b : b \in B\}` is the set of bases of
|
|
338
|
+
another matroid, the *dual* of `M`.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: M = Matroid(bases=matroids.catalog.Pappus().bases())
|
|
343
|
+
sage: M.dual()
|
|
344
|
+
Matroid of rank 6 on 9 elements with 75 bases
|
|
345
|
+
|
|
346
|
+
ALGORITHM:
|
|
347
|
+
|
|
348
|
+
A BasisMatroid on `n` elements and of rank `r` is stored as a
|
|
349
|
+
bitvector of length `\binom{n}{r}`. The `i`-th bit in this vector
|
|
350
|
+
indicates that the `i`-th `r`-set in the lexicographic enumeration of
|
|
351
|
+
`r`-subsets of the groundset is a basis. Reversing this bitvector
|
|
352
|
+
yields a bitvector that indicates whether the complement of an
|
|
353
|
+
`(n - r)`-set is a basis, i.e. gives the bitvector of the bases of the
|
|
354
|
+
dual.
|
|
355
|
+
"""
|
|
356
|
+
cdef long i, N
|
|
357
|
+
cdef BasisMatroid D
|
|
358
|
+
D = BasisMatroid(groundset=self._E, rank=self.full_corank())
|
|
359
|
+
N = binom[self._groundset_size][self._matroid_rank]
|
|
360
|
+
for i in range(N):
|
|
361
|
+
if not bitset_in(self._bb, i):
|
|
362
|
+
bitset_discard(D._bb, N - i - 1)
|
|
363
|
+
D.reset_current_basis()
|
|
364
|
+
D._reset_invariants()
|
|
365
|
+
D._bcount = self._bcount
|
|
366
|
+
return D
|
|
367
|
+
|
|
368
|
+
cpdef _minor(self, contractions, deletions):
|
|
369
|
+
"""
|
|
370
|
+
Return a minor.
|
|
371
|
+
|
|
372
|
+
INPUT:
|
|
373
|
+
|
|
374
|
+
- ``contractions`` -- an object with Python's ``frozenset`` interface
|
|
375
|
+
containing a subset of ``self.groundset()``
|
|
376
|
+
- ``deletions`` -- an object with Python's ``frozenset`` interface
|
|
377
|
+
containing a subset of ``self.groundset()``
|
|
378
|
+
|
|
379
|
+
.. NOTE::
|
|
380
|
+
|
|
381
|
+
This method does NOT do any checks. Besides the assumptions above,
|
|
382
|
+
we assume the following:
|
|
383
|
+
|
|
384
|
+
- ``contractions`` is independent
|
|
385
|
+
- ``deletions`` is coindependent
|
|
386
|
+
- ``contractions`` and ``deletions`` are disjoint.
|
|
387
|
+
|
|
388
|
+
OUTPUT: matroid
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: from sage.matroids.advanced import *
|
|
393
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
394
|
+
sage: M._minor(contractions=frozenset(['a']), deletions=frozenset(['b', 'c']))
|
|
395
|
+
Matroid of rank 3 on 5 elements with 10 bases
|
|
396
|
+
"""
|
|
397
|
+
E = self.groundset() - (contractions | deletions)
|
|
398
|
+
mr = self.full_rank() - len(contractions)
|
|
399
|
+
NB = [frozenset(B) for B in combinations(E, mr) if not self._is_basis(contractions | frozenset(B))]
|
|
400
|
+
return BasisMatroid(groundset=E, nonbases=NB, rank=mr)
|
|
401
|
+
|
|
402
|
+
cpdef truncation(self):
|
|
403
|
+
r"""
|
|
404
|
+
Return a rank-1 truncation of the matroid.
|
|
405
|
+
|
|
406
|
+
Let `M` be a matroid of rank `r`. The *truncation* of `M` is the
|
|
407
|
+
matroid obtained by declaring all subsets of size `r` dependent. It
|
|
408
|
+
can be obtained by adding an element freely to the span of the matroid
|
|
409
|
+
and then contracting that element.
|
|
410
|
+
|
|
411
|
+
OUTPUT: matroid
|
|
412
|
+
|
|
413
|
+
.. SEEALSO::
|
|
414
|
+
|
|
415
|
+
:meth:`M.extension() <sage.matroids.matroid.Matroid.extension>`,
|
|
416
|
+
:meth:`M.contract() <sage.matroids.matroid.Matroid.contract>`
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: M = Matroid(bases=matroids.catalog.N2().bases())
|
|
421
|
+
sage: M.truncation()
|
|
422
|
+
Matroid of rank 5 on 12 elements with 702 bases
|
|
423
|
+
sage: M.whitney_numbers2()
|
|
424
|
+
[1, 12, 66, 190, 258, 99, 1]
|
|
425
|
+
sage: M.truncation().whitney_numbers2()
|
|
426
|
+
[1, 12, 66, 190, 258, 1]
|
|
427
|
+
"""
|
|
428
|
+
if self.full_rank() == 0:
|
|
429
|
+
return None
|
|
430
|
+
return BasisMatroid(groundset=self._E, nonbases=self.dependent_sets(self.full_rank() - 1), rank=self.full_rank() - 1)
|
|
431
|
+
|
|
432
|
+
cpdef _extension(self, e, H):
|
|
433
|
+
r"""
|
|
434
|
+
Extend the matroid by a new element.
|
|
435
|
+
|
|
436
|
+
The result is a matroid on ``self.groundset() + {element}``, where
|
|
437
|
+
``element`` is contained in exactly the hyperplanes of ``self``
|
|
438
|
+
specified by ``hyperplanes``.
|
|
439
|
+
|
|
440
|
+
INPUT:
|
|
441
|
+
|
|
442
|
+
- ``element`` -- a hashable object not in ``self.groundset()``
|
|
443
|
+
- ``hyperplanes`` -- the set of hyperplanes of a linear subclass of ``self``
|
|
444
|
+
|
|
445
|
+
OUTPUT: matroid
|
|
446
|
+
|
|
447
|
+
EXAMPLES::
|
|
448
|
+
|
|
449
|
+
sage: from sage.matroids.advanced import *
|
|
450
|
+
sage: M = BasisMatroid(matroids.Uniform(3, 5))
|
|
451
|
+
sage: H = M.hyperplanes()
|
|
452
|
+
sage: M._extension('x', [H[0]])
|
|
453
|
+
Matroid of rank 3 on 6 elements with 19 bases
|
|
454
|
+
sage: M._extension('x', [H[0], H[1]])
|
|
455
|
+
Matroid of rank 3 on 6 elements with 18 bases
|
|
456
|
+
sage: M._extension('x', H)
|
|
457
|
+
Matroid of rank 3 on 6 elements with 10 bases
|
|
458
|
+
sage: len([M._extension('x', mc) for mc in M.linear_subclasses()])
|
|
459
|
+
32
|
|
460
|
+
"""
|
|
461
|
+
cdef bint found
|
|
462
|
+
cdef frozenset B
|
|
463
|
+
if self.full_rank() == 0:
|
|
464
|
+
return BasisMatroid(groundset=self._E + (e,), bases=[set()])
|
|
465
|
+
|
|
466
|
+
BB = self.bases()
|
|
467
|
+
BT = self.independent_sets(self.full_rank() - 1)
|
|
468
|
+
se = set([e])
|
|
469
|
+
BE = []
|
|
470
|
+
for B in BT:
|
|
471
|
+
found = False
|
|
472
|
+
for hyp in H:
|
|
473
|
+
if B.issubset(hyp):
|
|
474
|
+
found = True
|
|
475
|
+
break
|
|
476
|
+
if not found:
|
|
477
|
+
BE.append(B | se)
|
|
478
|
+
BE += BB
|
|
479
|
+
return BasisMatroid(groundset=self._E + (e,), bases=BE)
|
|
480
|
+
|
|
481
|
+
cpdef _with_coloop(self, e):
|
|
482
|
+
r"""
|
|
483
|
+
Return the matroid that arises by adding an element `e` to the
|
|
484
|
+
groundset, that is a coloop of the resulting matroid.
|
|
485
|
+
|
|
486
|
+
INPUT:
|
|
487
|
+
|
|
488
|
+
- ``e`` -- the label of the new element; assumed to be outside the
|
|
489
|
+
current groundset
|
|
490
|
+
|
|
491
|
+
OUTPUT: the extension of this matroid by a coloop
|
|
492
|
+
|
|
493
|
+
EXAMPLES::
|
|
494
|
+
|
|
495
|
+
sage: from sage.matroids.advanced import *
|
|
496
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
497
|
+
sage: M
|
|
498
|
+
Matroid of rank 3 on 7 elements with 28 bases
|
|
499
|
+
sage: M._with_coloop('x')
|
|
500
|
+
Matroid of rank 4 on 8 elements with 28 bases
|
|
501
|
+
"""
|
|
502
|
+
cdef frozenset se = frozenset([e])
|
|
503
|
+
return BasisMatroid(groundset=self._E + (e,), bases=[B | se for B in self.bases()])
|
|
504
|
+
|
|
505
|
+
@rename_keyword(deprecation=37775, l='mapping')
|
|
506
|
+
def relabel(self, mapping):
|
|
507
|
+
r"""
|
|
508
|
+
Return an isomorphic matroid with relabeled groundset.
|
|
509
|
+
|
|
510
|
+
The output is obtained by relabeling each element `e` by
|
|
511
|
+
``mapping[e]``, where ``mapping`` is a given injective map. If
|
|
512
|
+
``mapping[e]`` is not defined, then the identity map is assumed.
|
|
513
|
+
|
|
514
|
+
INPUT:
|
|
515
|
+
|
|
516
|
+
- ``mapping`` -- a Python object such that ``mapping[e]`` is the new
|
|
517
|
+
label of `e`
|
|
518
|
+
|
|
519
|
+
OUTPUT: matroid
|
|
520
|
+
|
|
521
|
+
EXAMPLES::
|
|
522
|
+
|
|
523
|
+
sage: from sage.matroids.advanced import BasisMatroid
|
|
524
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
525
|
+
sage: sorted(M.groundset())
|
|
526
|
+
['a', 'b', 'c', 'd', 'e', 'f', 'g']
|
|
527
|
+
sage: N = M.relabel({'a': 0, 'g': 'x'})
|
|
528
|
+
sage: from sage.matroids.utilities import cmp_elements_key
|
|
529
|
+
sage: sorted(N.groundset(), key=cmp_elements_key)
|
|
530
|
+
[0, 'b', 'c', 'd', 'e', 'f', 'x']
|
|
531
|
+
sage: N.is_isomorphic(M)
|
|
532
|
+
True
|
|
533
|
+
|
|
534
|
+
TESTS::
|
|
535
|
+
|
|
536
|
+
sage: from sage.matroids.advanced import BasisMatroid
|
|
537
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
538
|
+
sage: f = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}
|
|
539
|
+
sage: N = M.relabel(f)
|
|
540
|
+
sage: for S in powerset(M.groundset()):
|
|
541
|
+
....: assert M.rank(S) == N.rank([f[x] for x in S])
|
|
542
|
+
"""
|
|
543
|
+
d = self._relabel_map(mapping)
|
|
544
|
+
E = [d[x] for x in self.groundset()]
|
|
545
|
+
B = [[d[y] for y in x] for x in self.bases()]
|
|
546
|
+
M = BasisMatroid(groundset=E, bases=B)
|
|
547
|
+
return M
|
|
548
|
+
|
|
549
|
+
# enumeration
|
|
550
|
+
|
|
551
|
+
cpdef bases_count(self):
|
|
552
|
+
r"""
|
|
553
|
+
Return the number of bases of the matroid.
|
|
554
|
+
|
|
555
|
+
OUTPUT: integer
|
|
556
|
+
|
|
557
|
+
EXAMPLES::
|
|
558
|
+
|
|
559
|
+
sage: M = Matroid(bases=matroids.catalog.Fano().bases())
|
|
560
|
+
sage: M
|
|
561
|
+
Matroid of rank 3 on 7 elements with 28 bases
|
|
562
|
+
sage: M.bases_count()
|
|
563
|
+
28
|
|
564
|
+
"""
|
|
565
|
+
if self._bcount is None:
|
|
566
|
+
self._bcount = bitset_len(self._bb)
|
|
567
|
+
return self._bcount
|
|
568
|
+
|
|
569
|
+
cpdef SetSystem bases(self):
|
|
570
|
+
r"""
|
|
571
|
+
Return the bases of the matroid.
|
|
572
|
+
|
|
573
|
+
A *basis* is a maximal independent set.
|
|
574
|
+
|
|
575
|
+
OUTPUT: iterable containing all bases of the matroid
|
|
576
|
+
|
|
577
|
+
EXAMPLES::
|
|
578
|
+
|
|
579
|
+
sage: M = Matroid(bases=matroids.catalog.Fano().bases())
|
|
580
|
+
sage: M
|
|
581
|
+
Matroid of rank 3 on 7 elements with 28 bases
|
|
582
|
+
sage: len(M.bases())
|
|
583
|
+
28
|
|
584
|
+
"""
|
|
585
|
+
cdef long r, n
|
|
586
|
+
r = self.full_rank()
|
|
587
|
+
n = len(self)
|
|
588
|
+
cdef SetSystem BB
|
|
589
|
+
BB = SetSystem(self._E, capacity=bitset_len(self._bb))
|
|
590
|
+
cdef long b
|
|
591
|
+
b = bitset_first(self._bb)
|
|
592
|
+
while b >= 0:
|
|
593
|
+
index_to_set(self._b, b, r, n)
|
|
594
|
+
BB._append(self._b)
|
|
595
|
+
b = bitset_next(self._bb, b + 1)
|
|
596
|
+
return BB
|
|
597
|
+
|
|
598
|
+
cpdef SetSystem nonbases(self):
|
|
599
|
+
r"""
|
|
600
|
+
Return the nonbases of the matroid.
|
|
601
|
+
|
|
602
|
+
A *nonbasis* is a set with cardinality ``self.full_rank()`` that is
|
|
603
|
+
not a basis.
|
|
604
|
+
|
|
605
|
+
OUTPUT: iterable containing the nonbases of the matroid
|
|
606
|
+
|
|
607
|
+
.. SEEALSO::
|
|
608
|
+
|
|
609
|
+
:meth:`Matroid.basis() <sage.matroids.matroid.Matroid.basis>`
|
|
610
|
+
|
|
611
|
+
EXAMPLES::
|
|
612
|
+
|
|
613
|
+
sage: M = Matroid(bases=matroids.catalog.Fano().bases())
|
|
614
|
+
sage: M
|
|
615
|
+
Matroid of rank 3 on 7 elements with 28 bases
|
|
616
|
+
sage: len(M.nonbases())
|
|
617
|
+
7
|
|
618
|
+
"""
|
|
619
|
+
if self._nonbases is not None:
|
|
620
|
+
return self._nonbases
|
|
621
|
+
cdef long r, n
|
|
622
|
+
r = self.full_rank()
|
|
623
|
+
n = len(self)
|
|
624
|
+
cdef bitset_t bb_comp
|
|
625
|
+
bitset_init(bb_comp, binom[self._groundset_size][self._matroid_rank])
|
|
626
|
+
bitset_complement(bb_comp, self._bb)
|
|
627
|
+
cdef SetSystem NB
|
|
628
|
+
NB = SetSystem(self._E, capacity=bitset_len(bb_comp))
|
|
629
|
+
cdef long b
|
|
630
|
+
b = bitset_first(bb_comp)
|
|
631
|
+
while b >= 0:
|
|
632
|
+
index_to_set(self._b, b, r, n)
|
|
633
|
+
NB._append(self._b)
|
|
634
|
+
b = bitset_next(bb_comp, b + 1)
|
|
635
|
+
bitset_free(bb_comp)
|
|
636
|
+
self._nonbases = NB
|
|
637
|
+
return NB
|
|
638
|
+
|
|
639
|
+
# isomorphism test
|
|
640
|
+
|
|
641
|
+
cpdef _bases_invariant(self):
|
|
642
|
+
"""
|
|
643
|
+
Return an isomorphism invariant based on the incidences of groundset
|
|
644
|
+
elements with bases.
|
|
645
|
+
|
|
646
|
+
OUTPUT: integer
|
|
647
|
+
|
|
648
|
+
EXAMPLES::
|
|
649
|
+
|
|
650
|
+
sage: from sage.matroids.advanced import *
|
|
651
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
652
|
+
sage: N = BasisMatroid(matroids.catalog.Fano())
|
|
653
|
+
sage: M._bases_invariant() == N._bases_invariant()
|
|
654
|
+
True
|
|
655
|
+
"""
|
|
656
|
+
if self._bases_invariant_var is not None:
|
|
657
|
+
return self._bases_invariant_var
|
|
658
|
+
cdef long i, j
|
|
659
|
+
cdef list bc
|
|
660
|
+
cdef dict bi
|
|
661
|
+
bc = [0 for i in range(len(self))]
|
|
662
|
+
for i in range(binom[self._groundset_size][self._matroid_rank]):
|
|
663
|
+
if not bitset_in(self._bb, i):
|
|
664
|
+
index_to_set(self._b, i, self._matroid_rank, self._groundset_size)
|
|
665
|
+
j = bitset_first(self._b)
|
|
666
|
+
while j >= 0:
|
|
667
|
+
bc[j] += 1
|
|
668
|
+
j = bitset_next(self._b, j + 1)
|
|
669
|
+
bi = {}
|
|
670
|
+
for e in range(len(self)):
|
|
671
|
+
if bc[e] in bi:
|
|
672
|
+
bi[bc[e]].append(e)
|
|
673
|
+
else:
|
|
674
|
+
bi[bc[e]] = [e]
|
|
675
|
+
self._bases_invariant_var = hash(tuple([(c, len(bi[c])) for c in sorted(bi, key=cmp_elements_key)]))
|
|
676
|
+
self._bases_partition_var = SetSystem(self._E, [[self._E[e] for e in bi[c]] for c in sorted(bi, key=cmp_elements_key)])
|
|
677
|
+
return self._bases_invariant_var
|
|
678
|
+
|
|
679
|
+
cpdef _bases_partition(self):
|
|
680
|
+
"""
|
|
681
|
+
Return an ordered partition based on the incidences of groundset
|
|
682
|
+
elements with bases.
|
|
683
|
+
|
|
684
|
+
EXAMPLES::
|
|
685
|
+
|
|
686
|
+
sage: from sage.matroids.advanced import *
|
|
687
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
688
|
+
sage: [sorted(p) for p in M._bases_partition()]
|
|
689
|
+
[['c', 'd', 'g', 'h'], ['a', 'b', 'e', 'f']]
|
|
690
|
+
"""
|
|
691
|
+
self._bases_invariant()
|
|
692
|
+
return self._bases_partition_var
|
|
693
|
+
|
|
694
|
+
cpdef _bases_invariant2(self):
|
|
695
|
+
"""
|
|
696
|
+
Return an isomorphism invariant of the matroid.
|
|
697
|
+
|
|
698
|
+
Compared to ``BasisMatroid._bases_invariant()`` this invariant
|
|
699
|
+
distinguishes more frequently between nonisomorphic matroids but
|
|
700
|
+
takes more time to compute.
|
|
701
|
+
See also :meth:`<BasisMatroid.basis_partition2>`.
|
|
702
|
+
|
|
703
|
+
OUTPUT: integer isomorphism invariant
|
|
704
|
+
|
|
705
|
+
EXAMPLES::
|
|
706
|
+
|
|
707
|
+
sage: from sage.matroids.advanced import *
|
|
708
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
709
|
+
sage: N = BasisMatroid(matroids.catalog.NonFano())
|
|
710
|
+
sage: M._bases_invariant2() == N._bases_invariant2()
|
|
711
|
+
False
|
|
712
|
+
"""
|
|
713
|
+
if self._bases_invariant2_var is None:
|
|
714
|
+
CP = self.nonbases()._equitable_partition(self._bases_partition())
|
|
715
|
+
self._bases_partition2_var = CP[0]
|
|
716
|
+
self._bases_invariant2_var = CP[2]
|
|
717
|
+
return self._bases_invariant2_var
|
|
718
|
+
|
|
719
|
+
cpdef _bases_partition2(self):
|
|
720
|
+
"""
|
|
721
|
+
Return an equitable partition which refines
|
|
722
|
+
:meth:`<BasisMatroid._bases_partition2>`.
|
|
723
|
+
|
|
724
|
+
EXAMPLES::
|
|
725
|
+
|
|
726
|
+
sage: from sage.matroids.advanced import *
|
|
727
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
728
|
+
sage: [sorted(p) for p in M._bases_partition2()]
|
|
729
|
+
[['c', 'd', 'g', 'h'], ['a', 'b', 'e', 'f']]
|
|
730
|
+
"""
|
|
731
|
+
self._bases_invariant2()
|
|
732
|
+
return self._bases_partition2_var
|
|
733
|
+
|
|
734
|
+
cpdef _bases_invariant3(self):
|
|
735
|
+
"""
|
|
736
|
+
Return a number characteristic for the construction of
|
|
737
|
+
:meth:`<BasisMatroid._bases_partition3>`.
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: from sage.matroids.advanced import *
|
|
742
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
743
|
+
sage: N = BasisMatroid(matroids.catalog.Vamos())
|
|
744
|
+
sage: M._bases_invariant3() == N._bases_invariant3()
|
|
745
|
+
True
|
|
746
|
+
"""
|
|
747
|
+
if self._bases_invariant3_var is None:
|
|
748
|
+
CP = self.nonbases()._heuristic_partition(self._bases_partition2())
|
|
749
|
+
self._bases_partition3_var = CP[0]
|
|
750
|
+
self._bases_invariant3_var = CP[2]
|
|
751
|
+
return self._bases_invariant3_var
|
|
752
|
+
|
|
753
|
+
cpdef _bases_partition3(self):
|
|
754
|
+
"""
|
|
755
|
+
Return an ordered partition into singletons which refines an equitable
|
|
756
|
+
partition of the matroid.
|
|
757
|
+
|
|
758
|
+
The purpose of this partition is to heuristically find an isomorphism
|
|
759
|
+
between two matroids, by lining up their respective
|
|
760
|
+
heuristic_partitions.
|
|
761
|
+
|
|
762
|
+
EXAMPLES::
|
|
763
|
+
|
|
764
|
+
sage: from sage.matroids.advanced import *
|
|
765
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
766
|
+
sage: N = BasisMatroid(matroids.catalog.Vamos())
|
|
767
|
+
sage: PM = M._bases_partition3()
|
|
768
|
+
sage: PN = N._bases_partition3()
|
|
769
|
+
sage: morphism = {}
|
|
770
|
+
sage: for i in range(len(M)): morphism[min(PM[i])] = min(PN[i])
|
|
771
|
+
sage: M._is_isomorphism(N, morphism)
|
|
772
|
+
True
|
|
773
|
+
"""
|
|
774
|
+
self._bases_invariant3()
|
|
775
|
+
return self._bases_partition3_var
|
|
776
|
+
|
|
777
|
+
cdef _reset_invariants(self):
|
|
778
|
+
"""
|
|
779
|
+
Remove all precomputed invariants.
|
|
780
|
+
"""
|
|
781
|
+
self._bcount = None
|
|
782
|
+
self._nonbases = None
|
|
783
|
+
self._bases_invariant_var = None
|
|
784
|
+
self._bases_partition_var = None
|
|
785
|
+
self._bases_invariant2_var = None
|
|
786
|
+
self._bases_partition2_var = None
|
|
787
|
+
self._bases_invariant3_var = None
|
|
788
|
+
self._bases_partition3_var = None
|
|
789
|
+
self._flush()
|
|
790
|
+
|
|
791
|
+
cpdef bint is_distinguished(self, e) noexcept:
|
|
792
|
+
"""
|
|
793
|
+
Return whether ``e`` is a 'distinguished' element of the groundset.
|
|
794
|
+
|
|
795
|
+
The set of distinguished elements is an isomorphism invariant. Each
|
|
796
|
+
matroid has at least one distinguished element. The typical
|
|
797
|
+
application of this method is the execution of an orderly algorithm
|
|
798
|
+
for generating all matroids up to isomorphism in a minor-closed class,
|
|
799
|
+
by successively enumerating the single-element extensions and
|
|
800
|
+
coextensions of the matroids generated so far.
|
|
801
|
+
|
|
802
|
+
INPUT:
|
|
803
|
+
|
|
804
|
+
- ``e`` -- element of the groundset
|
|
805
|
+
|
|
806
|
+
OUTPUT: boolean
|
|
807
|
+
|
|
808
|
+
.. SEEALSO::
|
|
809
|
+
|
|
810
|
+
:meth:`M.extensions() <sage.matroids.matroid.Matroid.extensions>`,
|
|
811
|
+
:meth:`M.linear_subclasses() <sage.matroids.matroid.Matroid.linear_subclasses>`,
|
|
812
|
+
:mod:`sage.matroids.extension <sage.matroids.extension>`
|
|
813
|
+
|
|
814
|
+
EXAMPLES::
|
|
815
|
+
|
|
816
|
+
sage: from sage.matroids.advanced import *
|
|
817
|
+
sage: M = BasisMatroid(matroids.catalog.N1())
|
|
818
|
+
sage: sorted([e for e in M.groundset() if M.is_distinguished(e)])
|
|
819
|
+
['c', 'g', 'h', 'j']
|
|
820
|
+
"""
|
|
821
|
+
P = self._bases_partition()
|
|
822
|
+
p = P[0]
|
|
823
|
+
if e not in p:
|
|
824
|
+
return False
|
|
825
|
+
if len(p) == 1:
|
|
826
|
+
return True
|
|
827
|
+
|
|
828
|
+
SP = self._bases_partition2()
|
|
829
|
+
q = p
|
|
830
|
+
for q2 in SP:
|
|
831
|
+
if q2.issubset(p) and len(q2) < len(q):
|
|
832
|
+
q = q2
|
|
833
|
+
return e in q
|
|
834
|
+
|
|
835
|
+
cpdef _is_relaxation(self, other, morphism):
|
|
836
|
+
"""
|
|
837
|
+
Return if the application of a groundset morphism to this matroid
|
|
838
|
+
yields a relaxation of the given matroid.
|
|
839
|
+
|
|
840
|
+
`M` is a relaxation of `N` if the set of bases of `M` is a superset of the
|
|
841
|
+
bases of `N`.
|
|
842
|
+
|
|
843
|
+
This method assumes that ``self`` and ``other`` have the same rank
|
|
844
|
+
and does not check this condition.
|
|
845
|
+
|
|
846
|
+
INPUT:
|
|
847
|
+
|
|
848
|
+
- ``other`` -- basisMatroid
|
|
849
|
+
- ``morphism`` -- dictionary with sends each element of the
|
|
850
|
+
groundset of this matroid to a distinct element of the groundset
|
|
851
|
+
of ``other``
|
|
852
|
+
|
|
853
|
+
OUTPUT: ``True`` if ``morphism[self]`` is a relaxation of ``other``;
|
|
854
|
+
``False`` otherwise
|
|
855
|
+
|
|
856
|
+
EXAMPLES::
|
|
857
|
+
|
|
858
|
+
sage: from sage.matroids.advanced import *
|
|
859
|
+
sage: M = BasisMatroid(matroids.catalog.NonFano())
|
|
860
|
+
sage: N = BasisMatroid(matroids.catalog.Fano())
|
|
861
|
+
sage: m = {e:e for e in M.groundset()}
|
|
862
|
+
sage: M._is_relaxation(N, m)
|
|
863
|
+
True
|
|
864
|
+
sage: N._is_relaxation(M, m)
|
|
865
|
+
False
|
|
866
|
+
"""
|
|
867
|
+
cdef long i, j
|
|
868
|
+
cdef bitset_t b2
|
|
869
|
+
cdef bitset_t bb_comp
|
|
870
|
+
|
|
871
|
+
bitset_init(bb_comp, binom[self._groundset_size][self._matroid_rank])
|
|
872
|
+
bitset_complement(bb_comp, self._bb)
|
|
873
|
+
|
|
874
|
+
bitset_init(b2, max(len(self), 1))
|
|
875
|
+
morph = [(<BasisMatroid>other)._idx[morphism[self._E[i]]] for i in range(len(self))]
|
|
876
|
+
i = bitset_first(bb_comp)
|
|
877
|
+
while i != -1:
|
|
878
|
+
index_to_set(self._b, i, self._matroid_rank, self._groundset_size)
|
|
879
|
+
bitset_clear(b2)
|
|
880
|
+
j = bitset_first(self._b)
|
|
881
|
+
while j != -1:
|
|
882
|
+
bitset_add(b2, <mp_bitcnt_t> morph[j])
|
|
883
|
+
j = bitset_next(self._b, j + 1)
|
|
884
|
+
if bitset_in((<BasisMatroid>other)._bb, set_to_index(b2)):
|
|
885
|
+
bitset_free(b2)
|
|
886
|
+
bitset_free(bb_comp)
|
|
887
|
+
return False
|
|
888
|
+
i = bitset_next(bb_comp, i + 1)
|
|
889
|
+
bitset_free(b2)
|
|
890
|
+
bitset_free(bb_comp)
|
|
891
|
+
return True
|
|
892
|
+
|
|
893
|
+
cpdef _is_isomorphism(self, other, morphism):
|
|
894
|
+
"""
|
|
895
|
+
Version of :meth:`is_isomorphism` that does no type checking.
|
|
896
|
+
|
|
897
|
+
This method assumes that ``self`` and ``other`` have the same rank
|
|
898
|
+
and does not check this condition.
|
|
899
|
+
|
|
900
|
+
INPUT:
|
|
901
|
+
|
|
902
|
+
- ``other`` -- matroid
|
|
903
|
+
- ``morphism`` -- dictionary mapping the groundset of ``self`` to
|
|
904
|
+
the groundset of ``other``
|
|
905
|
+
|
|
906
|
+
OUTPUT: boolean
|
|
907
|
+
|
|
908
|
+
.. SEEALSO::
|
|
909
|
+
|
|
910
|
+
:meth:`<sage.matroids.matroid.Matroid.is_isomorphism>`.
|
|
911
|
+
|
|
912
|
+
EXAMPLES::
|
|
913
|
+
|
|
914
|
+
sage: from sage.matroids.advanced import *
|
|
915
|
+
sage: M = BasisMatroid(matroids.catalog.NonFano())
|
|
916
|
+
sage: N = BasisMatroid(matroids.catalog.Fano())
|
|
917
|
+
sage: m = {e:e for e in M.groundset()}
|
|
918
|
+
sage: M._is_relaxation(N, m)
|
|
919
|
+
True
|
|
920
|
+
sage: M._is_isomorphism(N, m)
|
|
921
|
+
False
|
|
922
|
+
"""
|
|
923
|
+
if not isinstance(other, BasisMatroid):
|
|
924
|
+
ot = BasisMatroid(other)
|
|
925
|
+
else:
|
|
926
|
+
ot = other
|
|
927
|
+
return self.bases_count() == (<BasisMatroid>ot).bases_count() and self._is_relaxation(ot, morphism)
|
|
928
|
+
|
|
929
|
+
cpdef _isomorphism(self, other):
|
|
930
|
+
"""
|
|
931
|
+
Return isomorphism from ``self`` to ``other``, if one exists.
|
|
932
|
+
|
|
933
|
+
INPUT:
|
|
934
|
+
|
|
935
|
+
- ``other`` -- matroid
|
|
936
|
+
|
|
937
|
+
OUTPUT: dictionary or ``None``
|
|
938
|
+
|
|
939
|
+
.. NOTE::
|
|
940
|
+
|
|
941
|
+
Internal version that does no input checking.
|
|
942
|
+
|
|
943
|
+
EXAMPLES::
|
|
944
|
+
|
|
945
|
+
sage: from sage.matroids.advanced import *
|
|
946
|
+
sage: M = BasisMatroid(matroids.Wheel(3))
|
|
947
|
+
sage: N = BasisMatroid(matroids.CompleteGraphic(4)) # needs sage.graphs
|
|
948
|
+
sage: morphism = M._isomorphism(N) # needs sage.graphs
|
|
949
|
+
sage: M._is_isomorphism(N, morphism) # needs sage.graphs
|
|
950
|
+
True
|
|
951
|
+
sage: M = BasisMatroid(matroids.catalog.NonFano())
|
|
952
|
+
sage: N = BasisMatroid(matroids.catalog.Fano())
|
|
953
|
+
sage: M._isomorphism(N) is not None
|
|
954
|
+
False
|
|
955
|
+
"""
|
|
956
|
+
if not isinstance(other, BasisMatroid):
|
|
957
|
+
return self.isomorphism(BasisMatroid(other))
|
|
958
|
+
if self is other:
|
|
959
|
+
return {e: e for e in self.groundset()}
|
|
960
|
+
if len(self) != len(other):
|
|
961
|
+
return None
|
|
962
|
+
if self.full_rank() != other.full_rank():
|
|
963
|
+
return None
|
|
964
|
+
if self.full_rank() == 0:
|
|
965
|
+
return {self.groundset_list()[i]: other.groundset_list()[i] for i in range(len(self))}
|
|
966
|
+
if self.bases_count() != other.bases_count():
|
|
967
|
+
return None
|
|
968
|
+
|
|
969
|
+
if self._bases_invariant() != other._bases_invariant():
|
|
970
|
+
return None
|
|
971
|
+
PS = self._bases_partition()
|
|
972
|
+
PO = other._bases_partition()
|
|
973
|
+
if len(PS) == len(self) and len(PO) == len(other):
|
|
974
|
+
morphism = {}
|
|
975
|
+
for i in range(len(self)):
|
|
976
|
+
morphism[min(PS[i])] = min(PO[i])
|
|
977
|
+
if self._is_relaxation(other, morphism):
|
|
978
|
+
return morphism
|
|
979
|
+
else:
|
|
980
|
+
return None
|
|
981
|
+
|
|
982
|
+
if self._bases_invariant2() != other._bases_invariant2():
|
|
983
|
+
return None
|
|
984
|
+
PS = self._bases_partition2()
|
|
985
|
+
PO = other._bases_partition2()
|
|
986
|
+
if len(PS) == len(self) and len(PO) == len(other):
|
|
987
|
+
morphism = {}
|
|
988
|
+
for i in range(len(self)):
|
|
989
|
+
morphism[min(PS[i])] = min(PO[i])
|
|
990
|
+
if self._is_relaxation(other, morphism):
|
|
991
|
+
return morphism
|
|
992
|
+
else:
|
|
993
|
+
return None
|
|
994
|
+
|
|
995
|
+
if self._bases_invariant3() == other._bases_invariant3():
|
|
996
|
+
PHS = self._bases_partition3()
|
|
997
|
+
PHO = other._bases_partition3()
|
|
998
|
+
morphism = {}
|
|
999
|
+
for i in range(len(self)):
|
|
1000
|
+
morphism[min(PHS[i])] = min(PHO[i])
|
|
1001
|
+
if self._is_relaxation(other, morphism):
|
|
1002
|
+
return morphism
|
|
1003
|
+
|
|
1004
|
+
return self.nonbases()._isomorphism(other.nonbases(), PS, PO)
|
|
1005
|
+
|
|
1006
|
+
cpdef _is_isomorphic(self, other, certificate=False):
|
|
1007
|
+
"""
|
|
1008
|
+
Return if this matroid is isomorphic to the given matroid.
|
|
1009
|
+
|
|
1010
|
+
INPUT:
|
|
1011
|
+
|
|
1012
|
+
- ``other`` -- matroid
|
|
1013
|
+
- ``certificate`` -- boolean (default: ``False``)
|
|
1014
|
+
|
|
1015
|
+
OUTPUT: boolean, and, if ``certificate = True``, a dictionary giving
|
|
1016
|
+
the isomorphism or ``None``
|
|
1017
|
+
|
|
1018
|
+
.. NOTE::
|
|
1019
|
+
|
|
1020
|
+
Internal version that does no input checking.
|
|
1021
|
+
|
|
1022
|
+
EXAMPLES::
|
|
1023
|
+
|
|
1024
|
+
sage: from sage.matroids.advanced import *
|
|
1025
|
+
sage: M = BasisMatroid(matroids.catalog.NonFano())
|
|
1026
|
+
sage: N = BasisMatroid(matroids.catalog.Fano())
|
|
1027
|
+
sage: M._is_isomorphic(N)
|
|
1028
|
+
False
|
|
1029
|
+
sage: M._is_isomorphic(N, certificate=True)
|
|
1030
|
+
(False, None)
|
|
1031
|
+
"""
|
|
1032
|
+
if certificate:
|
|
1033
|
+
return self._is_isomorphic(other), self._isomorphism(other)
|
|
1034
|
+
if not isinstance(other, BasisMatroid):
|
|
1035
|
+
return BasisExchangeMatroid._is_isomorphic(self, other)
|
|
1036
|
+
if self is other:
|
|
1037
|
+
return True
|
|
1038
|
+
if len(self) != len(other):
|
|
1039
|
+
return False
|
|
1040
|
+
if self.full_rank() != other.full_rank():
|
|
1041
|
+
return False
|
|
1042
|
+
if self.full_rank() == 0:
|
|
1043
|
+
return True
|
|
1044
|
+
if self.bases_count() != other.bases_count():
|
|
1045
|
+
return False
|
|
1046
|
+
if self.full_rank() < 2 or self.full_corank() < 2:
|
|
1047
|
+
return True # number of bases then determines matroid up to isomorphism
|
|
1048
|
+
|
|
1049
|
+
if self._bases_invariant() != other._bases_invariant():
|
|
1050
|
+
return False
|
|
1051
|
+
PS = self._bases_partition()
|
|
1052
|
+
PO = other._bases_partition()
|
|
1053
|
+
if len(PS) == len(self) and len(PO) == len(other):
|
|
1054
|
+
morphism = {}
|
|
1055
|
+
for i in range(len(self)):
|
|
1056
|
+
morphism[min(PS[i])] = min(PO[i])
|
|
1057
|
+
return self._is_relaxation(other, morphism)
|
|
1058
|
+
|
|
1059
|
+
if self._bases_invariant2() != other._bases_invariant2():
|
|
1060
|
+
return False
|
|
1061
|
+
PS = self._bases_partition2()
|
|
1062
|
+
PO = other._bases_partition2()
|
|
1063
|
+
if len(PS) == len(self) and len(PO) == len(other):
|
|
1064
|
+
morphism = {}
|
|
1065
|
+
for i in range(len(self)):
|
|
1066
|
+
morphism[min(PS[i])] = min(PO[i])
|
|
1067
|
+
return self._is_relaxation(other, morphism)
|
|
1068
|
+
|
|
1069
|
+
if self._bases_invariant3() == other._bases_invariant3():
|
|
1070
|
+
PHS = self._bases_partition3()
|
|
1071
|
+
PHO = other._bases_partition3()
|
|
1072
|
+
morphism = {}
|
|
1073
|
+
for i in range(len(self)):
|
|
1074
|
+
morphism[min(PHS[i])] = min(PHO[i])
|
|
1075
|
+
if self._is_relaxation(other, morphism):
|
|
1076
|
+
return True
|
|
1077
|
+
|
|
1078
|
+
return self.nonbases()._isomorphism(other.nonbases(), PS, PO) is not None
|
|
1079
|
+
|
|
1080
|
+
def __hash__(self):
|
|
1081
|
+
r"""
|
|
1082
|
+
Return an invariant of the matroid.
|
|
1083
|
+
|
|
1084
|
+
This function is called when matroids are added to a set. It is very
|
|
1085
|
+
desirable to override it so it can distinguish matroids on the same
|
|
1086
|
+
groundset, which is a very typical use case!
|
|
1087
|
+
|
|
1088
|
+
.. WARNING::
|
|
1089
|
+
|
|
1090
|
+
This method is linked to ``__richcmp__`` (in Cython) and ``__cmp__``
|
|
1091
|
+
or ``__eq__``/``__ne__`` (in Python). If you override one, you
|
|
1092
|
+
should (and, in Cython, \emph{must}) override the other!
|
|
1093
|
+
|
|
1094
|
+
EXAMPLES::
|
|
1095
|
+
|
|
1096
|
+
sage: from sage.matroids.advanced import *
|
|
1097
|
+
sage: M = BasisMatroid(matroids.catalog.Fano())
|
|
1098
|
+
sage: N = BasisMatroid(matroids.catalog.Fano().dual()).dual()
|
|
1099
|
+
sage: O = BasisMatroid(matroids.catalog.NonFano())
|
|
1100
|
+
sage: hash(M) == hash(N)
|
|
1101
|
+
True
|
|
1102
|
+
sage: hash(M) == hash(O)
|
|
1103
|
+
False
|
|
1104
|
+
"""
|
|
1105
|
+
return hash((self.groundset(), self.bases_count(), self._weak_invariant()))
|
|
1106
|
+
|
|
1107
|
+
def __richcmp__(left, right, int op):
|
|
1108
|
+
r"""
|
|
1109
|
+
Compare two matroids.
|
|
1110
|
+
|
|
1111
|
+
We take a very restricted view on equality: the objects need to be of
|
|
1112
|
+
the exact same type (so no subclassing) and the internal data need to
|
|
1113
|
+
be the same. For BasisMatroids, this means that the groundsets and the
|
|
1114
|
+
sets of bases of the two matroids are equal.
|
|
1115
|
+
|
|
1116
|
+
EXAMPLES::
|
|
1117
|
+
|
|
1118
|
+
sage: from sage.matroids.advanced import *
|
|
1119
|
+
sage: M = BasisMatroid(matroids.catalog.Pappus())
|
|
1120
|
+
sage: N = BasisMatroid(matroids.catalog.NonPappus())
|
|
1121
|
+
sage: M == N
|
|
1122
|
+
False
|
|
1123
|
+
"""
|
|
1124
|
+
if op not in [Py_EQ, Py_NE]:
|
|
1125
|
+
return NotImplemented
|
|
1126
|
+
if type(left) is not type(right):
|
|
1127
|
+
return NotImplemented
|
|
1128
|
+
if left.equals(right):
|
|
1129
|
+
return rich_to_bool(op, 0)
|
|
1130
|
+
else:
|
|
1131
|
+
return rich_to_bool(op, 1)
|
|
1132
|
+
|
|
1133
|
+
def __reduce__(self):
|
|
1134
|
+
"""
|
|
1135
|
+
Save the matroid for later reloading.
|
|
1136
|
+
|
|
1137
|
+
OUTPUT:
|
|
1138
|
+
|
|
1139
|
+
A tuple ``(unpickle, (version, data))``, where ``unpickle`` is the
|
|
1140
|
+
name of a function that, when called with ``(version, data)``,
|
|
1141
|
+
produces a matroid isomorphic to ``self``. ``version`` is an integer
|
|
1142
|
+
(currently 0) and ``data`` is a tuple ``(E, R, name, BB)`` where
|
|
1143
|
+
``E`` is the groundset of the matroid, ``R`` is the rank, ``name`` is a
|
|
1144
|
+
custom name, and ``BB`` is the bitpacked list of bases, as pickled by
|
|
1145
|
+
Sage's ``bitset_pickle``.
|
|
1146
|
+
|
|
1147
|
+
EXAMPLES::
|
|
1148
|
+
|
|
1149
|
+
sage: from sage.matroids.advanced import *
|
|
1150
|
+
sage: M = BasisMatroid(matroids.catalog.Vamos())
|
|
1151
|
+
sage: M == loads(dumps(M)) # indirect doctest
|
|
1152
|
+
True
|
|
1153
|
+
sage: M.rename('Vamos')
|
|
1154
|
+
sage: loads(dumps(M))
|
|
1155
|
+
Vamos
|
|
1156
|
+
"""
|
|
1157
|
+
import sage.matroids.unpickling
|
|
1158
|
+
BB = bitset_pickle(self._bb)
|
|
1159
|
+
data = (self._E, self._matroid_rank, self.get_custom_name(), BB)
|
|
1160
|
+
version = 0
|
|
1161
|
+
return sage.matroids.unpickling.unpickle_basis_matroid, (version, data)
|
|
1162
|
+
|
|
1163
|
+
cdef long binom[2956][33] # Cached binomial table
|
|
1164
|
+
|
|
1165
|
+
cdef binom_init(long N, long K):
|
|
1166
|
+
"""
|
|
1167
|
+
Fill up the cached binomial table.
|
|
1168
|
+
"""
|
|
1169
|
+
cdef long bin
|
|
1170
|
+
if binom[0][0] != 1:
|
|
1171
|
+
binom[0][0] = 1
|
|
1172
|
+
binom[0][1] = 0
|
|
1173
|
+
for n in range(1, 2955):
|
|
1174
|
+
bin = 1
|
|
1175
|
+
k = 0
|
|
1176
|
+
while bin < 2 ** 32 and k <= 32 and k <= n:
|
|
1177
|
+
binom[n][k] = bin
|
|
1178
|
+
k += 1
|
|
1179
|
+
bin = binom[n - 1][k - 1] + binom[n - 1][k]
|
|
1180
|
+
while k < 33:
|
|
1181
|
+
binom[n][k] = 0
|
|
1182
|
+
k += 1
|
|
1183
|
+
|
|
1184
|
+
if N > 2954:
|
|
1185
|
+
raise ValueError("BasisMatroid: size of groundset exceeds 2954") # if n > 2954 and k > 2, then binomial(n, k) > 2^32
|
|
1186
|
+
if K > 32:
|
|
1187
|
+
raise ValueError("BasisMatroid: rank exceeds 32") # if n > 2954 and k > 2, then binomial(n, k) > 2^32
|
|
1188
|
+
if binom[N][K] == 0:
|
|
1189
|
+
raise ValueError("BasisMatroid: number of potential bases would exceed 2^32")
|
|
1190
|
+
|
|
1191
|
+
cdef long set_to_index(bitset_t S) noexcept:
|
|
1192
|
+
"""
|
|
1193
|
+
Compute the rank of a set of integers amongst the sets of integers
|
|
1194
|
+
of the same cardinality.
|
|
1195
|
+
"""
|
|
1196
|
+
cdef long index = 0
|
|
1197
|
+
cdef long count = 1
|
|
1198
|
+
cdef long s
|
|
1199
|
+
s = bitset_first(S)
|
|
1200
|
+
while s >= 0:
|
|
1201
|
+
index += binom[s][count]
|
|
1202
|
+
count += 1
|
|
1203
|
+
s = bitset_next(S, s + 1)
|
|
1204
|
+
return index
|
|
1205
|
+
|
|
1206
|
+
cdef index_to_set(bitset_t S, long index, long k, long n):
|
|
1207
|
+
r"""
|
|
1208
|
+
Compute the k-subset of `\{0, ..., n-1\}` of rank index.
|
|
1209
|
+
"""
|
|
1210
|
+
bitset_clear(S)
|
|
1211
|
+
cdef long s = n
|
|
1212
|
+
while s > 0:
|
|
1213
|
+
s -= 1
|
|
1214
|
+
if binom[s][k] <= index:
|
|
1215
|
+
index = index - binom[s][k]
|
|
1216
|
+
k = k - 1
|
|
1217
|
+
bitset_add(S, s)
|