passagemath-modules 10.5.32__cp310-cp310-macosx_14_0_arm64.whl → 10.6.20__cp310-cp310-macosx_14_0_arm64.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.5.32.dist-info → passagemath_modules-10.6.20.dist-info}/METADATA +51 -46
- {passagemath_modules-10.5.32.dist-info → passagemath_modules-10.6.20.dist-info}/RECORD +333 -323
- {passagemath_modules-10.5.32.dist-info → passagemath_modules-10.6.20.dist-info}/WHEEL +1 -1
- passagemath_modules.dylibs/libgcc_s.1.1.dylib +0 -0
- passagemath_modules.dylibs/libgfortran.5.dylib +0 -0
- passagemath_modules.dylibs/libgsl.28.dylib +0 -0
- passagemath_modules.dylibs/libmpc.3.dylib +0 -0
- passagemath_modules.dylibs/libopenblasp-r0.3.29.dylib +0 -0
- passagemath_modules.dylibs/libquadmath.0.dylib +0 -0
- sage/algebras/clifford_algebra.py +2 -2
- sage/algebras/clifford_algebra_element.cpython-310-darwin.so +0 -0
- sage/algebras/clifford_algebra_element.pyx +4 -2
- sage/algebras/exterior_algebra_groebner.cpython-310-darwin.so +0 -0
- sage/algebras/exterior_algebra_groebner.pyx +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +83 -5
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-310-darwin.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +28 -3
- sage/algebras/finite_gca.py +1 -1
- sage/algebras/lie_algebras/bgg_dual_module.py +18 -11
- sage/algebras/lie_algebras/classical_lie_algebra.py +3 -3
- sage/algebras/lie_algebras/examples.py +2 -2
- sage/algebras/lie_algebras/free_lie_algebra.py +1 -1
- sage/algebras/lie_algebras/heisenberg.py +4 -4
- sage/algebras/lie_algebras/lie_algebra.py +1 -1
- sage/algebras/lie_algebras/lie_algebra_element.cpython-310-darwin.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +65 -28
- sage/algebras/lie_algebras/quotient.py +40 -29
- sage/algebras/lie_algebras/subalgebra.py +76 -53
- sage/algebras/lie_algebras/verma_module.py +1 -3
- sage/algebras/octonion_algebra.cpython-310-darwin.so +0 -0
- sage/algebras/octonion_algebra.pyx +1 -1
- sage/algebras/orlik_solomon.py +4 -4
- sage/algebras/orlik_terao.py +4 -4
- sage/algebras/steenrod/steenrod_algebra.py +37 -30
- sage/algebras/steenrod/steenrod_algebra_bases.py +2 -2
- sage/algebras/steenrod/steenrod_algebra_misc.py +4 -4
- sage/algebras/steenrod/steenrod_algebra_mult.py +2 -2
- sage/all__sagemath_modules.py +1 -0
- sage/calculus/integration.cpython-310-darwin.so +0 -0
- sage/calculus/integration.pyx +6 -5
- sage/calculus/interpolation.cpython-310-darwin.so +0 -0
- sage/calculus/interpolators.cpython-310-darwin.so +0 -0
- sage/calculus/ode.cpython-310-darwin.so +0 -0
- sage/calculus/ode.pxd +2 -2
- sage/calculus/ode.pyx +6 -4
- sage/calculus/riemann.cpython-310-darwin.so +0 -0
- sage/calculus/riemann.pyx +68 -48
- sage/calculus/transforms/dwt.cpython-310-darwin.so +0 -0
- sage/calculus/transforms/fft.cpython-310-darwin.so +0 -0
- sage/coding/ag_code_decoders.cpython-310-darwin.so +0 -0
- sage/coding/ag_code_decoders.pyx +31 -31
- sage/coding/binary_code.cpython-310-darwin.so +0 -0
- sage/coding/binary_code.pxd +6 -6
- sage/coding/binary_code.pyx +212 -173
- sage/coding/guruswami_sudan/utils.py +3 -5
- sage/coding/kasami_codes.cpython-310-darwin.so +0 -0
- sage/coding/kasami_codes.pyx +20 -24
- sage/coding/linear_code.py +2 -2
- sage/coding/linear_code_no_metric.py +5 -5
- sage/coding/linear_rank_metric.py +81 -19
- sage/combinat/cartesian_product.py +1 -1
- sage/combinat/free_module.py +22 -2
- sage/combinat/root_system/all.py +1 -1
- sage/combinat/root_system/ambient_space.py +1 -1
- sage/combinat/root_system/associahedron.py +4 -4
- sage/combinat/root_system/braid_move_calculator.py +2 -2
- sage/combinat/root_system/braid_orbit.cpython-310-darwin.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +1 -1
- sage/combinat/root_system/branching_rules.py +3 -3
- sage/combinat/root_system/cartan_type.py +14 -14
- sage/combinat/root_system/coxeter_group.py +3 -3
- sage/combinat/root_system/coxeter_matrix.py +1 -1
- sage/combinat/root_system/coxeter_type.py +12 -1
- sage/combinat/root_system/extended_affine_weyl_group.py +9 -9
- sage/combinat/root_system/fundamental_group.py +3 -5
- sage/combinat/root_system/hecke_algebra_representation.py +1 -1
- sage/combinat/root_system/integrable_representations.py +1 -1
- sage/combinat/root_system/pieri_factors.py +3 -3
- sage/combinat/root_system/root_lattice_realization_algebras.py +1 -1
- sage/combinat/root_system/root_lattice_realizations.py +1 -1
- sage/combinat/root_system/type_folded.py +3 -3
- sage/combinat/root_system/type_reducible.py +8 -7
- sage/combinat/root_system/type_super_A.py +2 -2
- sage/combinat/root_system/weight_lattice_realizations.py +9 -8
- sage/combinat/root_system/weyl_characters.py +2 -2
- sage/crypto/__init__.py +1 -0
- sage/crypto/block_cipher/des.py +1 -1
- sage/crypto/block_cipher/miniaes.py +3 -3
- sage/crypto/block_cipher/present.py +3 -3
- sage/crypto/block_cipher/sdes.py +3 -3
- sage/crypto/boolean_function.cpython-310-darwin.so +0 -0
- sage/crypto/boolean_function.pyx +22 -23
- sage/crypto/key_exchange/diffie_hellman.py +4 -9
- sage/crypto/mq/sr.py +1 -1
- sage/crypto/public_key/blum_goldwasser.py +3 -3
- sage/crypto/sbox.cpython-310-darwin.so +0 -0
- sage/crypto/sbox.pyx +1 -1
- sage/crypto/sboxes.py +22 -0
- sage/crypto/util.py +4 -6
- sage/ext/interpreters/__init__.py +1 -1
- sage/ext/interpreters/all__sagemath_modules.py +1 -1
- sage/ext/interpreters/wrapper_cc.cpython-310-darwin.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +5 -5
- sage/ext/interpreters/wrapper_cc.pyx +1 -1
- sage/ext/interpreters/wrapper_cdf.cpython-310-darwin.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +5 -7
- sage/ext/interpreters/wrapper_cdf.pyx +4 -10
- sage/ext/interpreters/wrapper_rdf.cpython-310-darwin.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +1 -1
- sage/ext/interpreters/wrapper_rdf.pyx +1 -1
- sage/ext/interpreters/wrapper_rr.cpython-310-darwin.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +5 -5
- sage/ext/interpreters/wrapper_rr.pyx +1 -2
- sage/geometry/toric_lattice.py +3 -3
- sage/geometry/toric_lattice_element.cpython-310-darwin.so +0 -0
- sage/groups/additive_abelian/additive_abelian_group.py +1 -1
- sage/groups/additive_abelian/qmodnz.py +4 -4
- sage/groups/matrix_gps/coxeter_group.py +17 -4
- sage/groups/matrix_gps/group_element.cpython-310-darwin.so +0 -0
- sage/groups/misc_gps/argument_groups.py +2 -2
- sage/groups/misc_gps/imaginary_groups.py +4 -4
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-310-darwin.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-310-darwin.so +0 -0
- sage/homology/chain_complex.py +0 -2
- sage/homology/hochschild_complex.py +3 -3
- sage/homology/homology_morphism.py +6 -6
- sage/homology/homology_vector_space_with_basis.py +1 -1
- sage/libs/gsl/array.cpython-310-darwin.so +0 -0
- sage/libs/mpmath/utils.cpython-310-darwin.so +0 -0
- sage/matrix/action.cpython-310-darwin.so +0 -0
- sage/matrix/args.cpython-310-darwin.so +0 -0
- sage/matrix/args.pyx +25 -10
- sage/matrix/benchmark.py +8 -4
- sage/matrix/compute_J_ideal.py +2 -2
- sage/matrix/constructor.cpython-310-darwin.so +0 -0
- sage/matrix/echelon_matrix.cpython-310-darwin.so +0 -0
- sage/matrix/echelon_matrix.pyx +1 -1
- sage/matrix/matrix0.cpython-310-darwin.so +0 -0
- sage/matrix/matrix0.pxd +3 -3
- sage/matrix/matrix0.pyx +7 -5
- sage/matrix/matrix1.cpython-310-darwin.so +0 -0
- sage/matrix/matrix1.pyx +87 -48
- sage/matrix/matrix2.cpython-310-darwin.so +0 -0
- sage/matrix/matrix2.pxd +3 -3
- sage/matrix/matrix2.pyx +1261 -63
- sage/matrix/matrix_cdv.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_complex_double_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_complex_double_dense.pyx +1 -1
- sage/matrix/matrix_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_dense.pyx +2 -3
- sage/matrix/matrix_double_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_double_dense.pyx +11 -5
- sage/matrix/matrix_double_sparse.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_generic_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_generic_sparse.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_generic_sparse.pyx +1 -1
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_numpy_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_polynomial_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_polynomial_dense.pyx +952 -261
- sage/matrix/matrix_real_double_dense.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_sparse.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_sparse.pyx +6 -7
- sage/matrix/matrix_window.cpython-310-darwin.so +0 -0
- sage/matrix/matrix_window.pyx +2 -2
- sage/matrix/misc_mpfr.cpython-310-darwin.so +0 -0
- sage/matrix/operation_table.py +0 -2
- sage/matrix/special.py +5 -1
- sage/matrix/strassen.cpython-310-darwin.so +0 -0
- sage/matrix/strassen.pyx +1 -1
- sage/matroids/basis_exchange_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/basis_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/chow_ring.py +68 -65
- sage/matroids/chow_ring_ideal.py +41 -38
- sage/matroids/circuit_closures_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/circuits_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/database_matroids.py +16 -5
- sage/matroids/dual_matroid.py +2 -2
- sage/matroids/extension.cpython-310-darwin.so +0 -0
- sage/matroids/flats_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/gammoid.py +1 -1
- sage/matroids/graphic_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/graphic_matroid.pyx +3 -3
- sage/matroids/lean_matrix.cpython-310-darwin.so +0 -0
- sage/matroids/lean_matrix.pyx +22 -22
- sage/matroids/linear_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/linear_matroid.pyx +13 -13
- sage/matroids/matroid.cpython-310-darwin.so +0 -0
- sage/matroids/matroid.pyx +15 -15
- sage/matroids/matroids_plot_helpers.py +48 -46
- sage/matroids/minor_matroid.py +2 -2
- sage/matroids/set_system.cpython-310-darwin.so +0 -0
- sage/matroids/transversal_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/transversal_matroid.pyx +3 -3
- sage/matroids/union_matroid.cpython-310-darwin.so +0 -0
- sage/matroids/union_matroid.pyx +3 -0
- sage/matroids/unpickling.cpython-310-darwin.so +0 -0
- sage/matroids/utilities.py +2 -2
- sage/misc/c3.cpython-310-darwin.so +0 -0
- sage/misc/compat.py +1 -2
- sage/misc/pickle_old.cpython-310-darwin.so +0 -0
- sage/modules/diamond_cutting.py +117 -30
- sage/modules/fg_pid/fgp_module.py +3 -3
- sage/modules/filtered_vector_space.py +4 -4
- sage/modules/finite_submodule_iter.cpython-310-darwin.so +0 -0
- sage/modules/fp_graded/free_module.py +2 -2
- sage/modules/fp_graded/module.py +2 -2
- sage/modules/fp_graded/morphism.py +4 -4
- sage/modules/fp_graded/steenrod/morphism.py +1 -1
- sage/modules/free_module.py +162 -26
- sage/modules/free_module_element.cpython-310-darwin.so +0 -0
- sage/modules/free_module_element.pyx +4 -4
- sage/modules/free_module_integer.py +2 -2
- sage/modules/free_module_morphism.py +3 -3
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +24 -13
- sage/modules/matrix_morphism.py +9 -9
- sage/modules/multi_filtered_vector_space.py +4 -4
- 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 +11 -1
- sage/modules/submodule.py +1 -1
- sage/modules/torsion_quadratic_module.py +1 -1
- sage/modules/vector_complex_double_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_double_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_integer_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_integer_sparse.cpython-310-darwin.so +0 -0
- sage/modules/vector_integer_sparse.pyx +4 -4
- sage/modules/vector_modn_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_modn_sparse.cpython-310-darwin.so +0 -0
- sage/modules/vector_numpy_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_numpy_integer_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_rational_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_rational_dense.pyx +1 -1
- sage/modules/vector_rational_sparse.cpython-310-darwin.so +0 -0
- sage/modules/vector_rational_sparse.pyx +5 -5
- sage/modules/vector_real_double_dense.cpython-310-darwin.so +0 -0
- sage/modules/vector_space_morphism.py +2 -2
- sage/modules/with_basis/cell_module.py +17 -0
- sage/modules/with_basis/indexed_element.cpython-310-darwin.so +0 -0
- sage/modules/with_basis/indexed_element.pyx +1 -1
- sage/modules/with_basis/invariant.py +1 -1
- sage/modules/with_basis/representation.py +0 -1
- sage/modules/with_basis/subquotient.py +2 -2
- sage/numerical/gauss_legendre.cpython-310-darwin.so +0 -0
- sage/probability/probability_distribution.cpython-310-darwin.so +0 -0
- sage/quadratic_forms/binary_qf.py +11 -11
- sage/quadratic_forms/bqf_class_group.py +26 -92
- sage/quadratic_forms/count_local_2.cpython-310-darwin.so +0 -0
- sage/quadratic_forms/extras.py +1 -1
- sage/quadratic_forms/quadratic_form.py +5 -4
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +7 -4
- sage/quadratic_forms/quadratic_form__evaluate.cpython-310-darwin.so +0 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +10 -10
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +2 -2
- sage/quadratic_forms/ternary.cpython-310-darwin.so +0 -0
- sage/quadratic_forms/ternary_qf.py +50 -83
- sage/rings/cfinite_sequence.py +16 -17
- sage/rings/complex_conversion.cpython-310-darwin.so +0 -0
- sage/rings/complex_double.cpython-310-darwin.so +0 -0
- sage/rings/complex_double.pxd +1 -0
- sage/rings/complex_double.pyx +37 -32
- sage/rings/complex_mpc.cpython-310-darwin.so +0 -0
- sage/rings/complex_mpc.pyx +27 -23
- sage/rings/complex_mpfr.cpython-310-darwin.so +0 -0
- sage/rings/complex_mpfr.pyx +11 -11
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +277 -21
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +10 -1
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1 -1
- sage/rings/function_field/drinfeld_modules/homset.py +1 -2
- sage/rings/function_field/drinfeld_modules/morphism.py +2 -2
- sage/rings/function_field/hermite_form_polynomial.cpython-310-darwin.so +0 -0
- sage/rings/function_field/khuri_makdisi.cpython-310-darwin.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +27 -25
- sage/rings/invariants/invariant_theory.py +61 -60
- sage/rings/invariants/reconstruction.py +8 -8
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/ore_function_element.py +1 -1
- sage/rings/polynomial/ore_polynomial_element.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +8 -8
- sage/rings/polynomial/ore_polynomial_ring.py +134 -17
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +3 -4
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-310-darwin.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +2 -5
- sage/rings/real_double_element_gsl.cpython-310-darwin.so +0 -0
- sage/rings/real_mpfr.cpython-310-darwin.so +0 -0
- sage/rings/real_mpfr.pyx +25 -7
- sage/rings/ring_extension.cpython-310-darwin.so +0 -0
- sage/rings/ring_extension.pyx +4 -2
- sage/rings/ring_extension_conversion.cpython-310-darwin.so +0 -0
- sage/rings/ring_extension_element.cpython-310-darwin.so +0 -0
- sage/rings/ring_extension_element.pyx +42 -0
- sage/rings/ring_extension_morphism.cpython-310-darwin.so +0 -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/basic_stats.py +17 -15
- sage/stats/distributions/dgs_misc.h +11 -4
- sage/stats/distributions/discrete_gaussian_integer.cpython-310-darwin.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +9 -7
- sage/stats/hmm/chmm.cpython-310-darwin.so +0 -0
- sage/stats/hmm/chmm.pyx +13 -13
- sage/stats/hmm/distributions.cpython-310-darwin.so +0 -0
- sage/stats/hmm/distributions.pxd +3 -3
- sage/stats/hmm/distributions.pyx +3 -3
- sage/stats/hmm/hmm.cpython-310-darwin.so +0 -0
- sage/stats/hmm/hmm.pxd +3 -3
- sage/stats/hmm/hmm.pyx +6 -6
- sage/stats/hmm/util.cpython-310-darwin.so +0 -0
- sage/stats/hmm/util.pyx +6 -6
- sage/stats/intlist.cpython-310-darwin.so +0 -0
- sage/stats/intlist.pxd +3 -3
- sage/stats/time_series.cpython-310-darwin.so +0 -0
- sage/tensor/modules/alternating_contr_tensor.py +3 -3
- sage/tensor/modules/comp.py +3 -3
- sage/tensor/modules/ext_pow_free_module.py +3 -3
- sage/tensor/modules/format_utilities.py +3 -3
- sage/tensor/modules/free_module_linear_group.py +3 -3
- sage/tensor/modules/free_module_morphism.py +0 -1
- sage/tensor/modules/tensor_free_module.py +3 -3
- sage/tensor/modules/tensor_free_submodule.py +1 -1
- sage/tensor/modules/tensor_free_submodule_basis.py +1 -1
- sage/tensor/modules/tensor_with_indices.py +5 -5
- passagemath_modules.dylibs/libopenblas_armv8p-r0.3.28.dylib +0 -0
- {passagemath_modules-10.5.32.dist-info → passagemath_modules-10.6.20.dist-info}/top_level.txt +0 -0
|
@@ -43,19 +43,19 @@ REFERENCES:
|
|
|
43
43
|
# Distributed under the terms of the GNU General Public License (GPL)
|
|
44
44
|
# as published by the Free Software Foundation; either version 2 of
|
|
45
45
|
# the License, or (at your option) any later version.
|
|
46
|
-
#
|
|
46
|
+
# https://www.gnu.org/licenses/
|
|
47
47
|
# *****************************************************************************
|
|
48
48
|
|
|
49
49
|
from collections import Counter
|
|
50
50
|
from copy import copy
|
|
51
51
|
from cpython.object cimport Py_EQ, Py_NE
|
|
52
|
-
|
|
52
|
+
import networkx as nx
|
|
53
|
+
|
|
53
54
|
from sage.graphs.digraph import DiGraph
|
|
54
55
|
from sage.graphs.bipartite_graph import BipartiteGraph
|
|
55
56
|
from sage.matroids.basis_exchange_matroid cimport BasisExchangeMatroid
|
|
56
57
|
from sage.matroids.minor_matroid import MinorMatroid
|
|
57
58
|
from sage.matroids.utilities import newlabel
|
|
58
|
-
import networkx as nx
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
cdef class TransversalMatroid(BasisExchangeMatroid):
|
|
Binary file
|
sage/matroids/union_matroid.pyx
CHANGED
|
Binary file
|
sage/matroids/utilities.py
CHANGED
|
@@ -430,7 +430,7 @@ def spanning_stars(M):
|
|
|
430
430
|
# remove low degree vertices
|
|
431
431
|
H = []
|
|
432
432
|
# candidate vertices
|
|
433
|
-
V_0 = set(
|
|
433
|
+
V_0 = set()
|
|
434
434
|
d = 0
|
|
435
435
|
while G.order():
|
|
436
436
|
x, d = min(G.degree_iterator(labels=True), key=itemgetter(1))
|
|
@@ -445,7 +445,7 @@ def spanning_stars(M):
|
|
|
445
445
|
# greedily remove vertices
|
|
446
446
|
G2 = G.copy()
|
|
447
447
|
# set of picked vertices
|
|
448
|
-
V_1 = set(
|
|
448
|
+
V_1 = set()
|
|
449
449
|
while G2.order():
|
|
450
450
|
# choose vertex with maximum degree in G2
|
|
451
451
|
x, d = max(G2.degree_iterator(labels=True), key=itemgetter(1))
|
|
Binary file
|
sage/misc/compat.py
CHANGED
|
@@ -8,11 +8,10 @@
|
|
|
8
8
|
# it under the terms of the GNU General Public License as published by
|
|
9
9
|
# the Free Software Foundation, either version 2 of the License, or
|
|
10
10
|
# (at your option) any later version.
|
|
11
|
-
#
|
|
11
|
+
# https://www.gnu.org/licenses/
|
|
12
12
|
# *****************************************************************************
|
|
13
13
|
|
|
14
14
|
import os
|
|
15
|
-
import subprocess
|
|
16
15
|
import sys
|
|
17
16
|
|
|
18
17
|
from sage.env import SAGE_LOCAL
|
|
Binary file
|
sage/modules/diamond_cutting.py
CHANGED
|
@@ -17,13 +17,13 @@ AUTHORS:
|
|
|
17
17
|
# ****************************************************************************
|
|
18
18
|
|
|
19
19
|
from sage.geometry.polyhedron.constructor import Polyhedron
|
|
20
|
-
from sage.matrix.constructor import matrix
|
|
20
|
+
from sage.matrix.constructor import matrix
|
|
21
21
|
from sage.modules.free_module_element import vector
|
|
22
22
|
|
|
23
23
|
from math import sqrt, floor, ceil
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def plane_inequality(v):
|
|
26
|
+
def plane_inequality(v) -> list:
|
|
27
27
|
"""
|
|
28
28
|
Return the inequality for points on the same side as the origin
|
|
29
29
|
with respect to the plane through ``v`` normal to ``v``.
|
|
@@ -60,15 +60,15 @@ def jacobi(M):
|
|
|
60
60
|
q_{i,j} =
|
|
61
61
|
\begin{cases}
|
|
62
62
|
\frac{1}{q_{i,i}} \left( m_{i,j} - \sum_{r<i} q_{r,r} q_{r,i} q_{r,j} \right) & i < j, \\
|
|
63
|
-
|
|
63
|
+
m_{i,j} - \sum_{r<i} q_{r,r} q_{r,i}^2 & i = j, \\
|
|
64
64
|
0 & i > j,
|
|
65
65
|
\end{cases}
|
|
66
66
|
|
|
67
67
|
for all `1 \leq i \leq n` and `1 \leq j \leq n`. (These
|
|
68
68
|
equalities determine the entries of `Q` uniquely by
|
|
69
|
-
recursion.) This matrix `Q` is defined for
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
recursion.) This matrix `Q` is defined for every invertible
|
|
70
|
+
`n \times n`-matrix `M`. Its definition is taken from (2.3)
|
|
71
|
+
of [FP1985]_.
|
|
72
72
|
|
|
73
73
|
.. NOTE::
|
|
74
74
|
|
|
@@ -125,10 +125,10 @@ def jacobi(M):
|
|
|
125
125
|
return matrix(q)
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
def diamond_cut(V, GM, C, verbose=False):
|
|
128
|
+
def diamond_cut(V, GM, C, verbose=False) -> Polyhedron:
|
|
129
129
|
r"""
|
|
130
130
|
Perform diamond cutting on polyhedron ``V`` with basis matrix ``GM``
|
|
131
|
-
and radius ``C``.
|
|
131
|
+
and squared radius ``C``.
|
|
132
132
|
|
|
133
133
|
INPUT:
|
|
134
134
|
|
|
@@ -136,12 +136,22 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
136
136
|
|
|
137
137
|
- ``GM`` -- half of the basis matrix of the lattice
|
|
138
138
|
|
|
139
|
-
- ``C`` -- radius to use in cutting algorithm
|
|
139
|
+
- ``C`` -- square of the radius to use in cutting algorithm
|
|
140
140
|
|
|
141
|
-
- ``verbose`` -- boolean (default: ``False``); whether to print
|
|
141
|
+
- ``verbose`` -- boolean (default: ``False``); whether to print
|
|
142
|
+
debug information
|
|
142
143
|
|
|
143
144
|
OUTPUT: a :class:`Polyhedron` instance
|
|
144
145
|
|
|
146
|
+
ALGORITHM:
|
|
147
|
+
|
|
148
|
+
Use the algorithm in (2.8) of [FP1985]_ to iterate through the nonzero
|
|
149
|
+
vectors ``hv`` of length at most `\sqrt{C}` in the lattice spanned by
|
|
150
|
+
``GM``. (Actually, the algorithm only constructs one vector from each pair
|
|
151
|
+
``{hv, -hv}``.) For each such vector ``hv``, intersect ``V`` with the
|
|
152
|
+
half-spaces defined by ``plane_inequality(hv)`` and
|
|
153
|
+
``plane_inequality(-hv)``.
|
|
154
|
+
|
|
145
155
|
EXAMPLES::
|
|
146
156
|
|
|
147
157
|
sage: from sage.modules.diamond_cutting import diamond_cut
|
|
@@ -150,9 +160,18 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
150
160
|
sage: V = diamond_cut(V, GM, 4)
|
|
151
161
|
sage: V.vertices()
|
|
152
162
|
(A vertex at (2), A vertex at (0))
|
|
163
|
+
|
|
164
|
+
TESTS:
|
|
165
|
+
|
|
166
|
+
Verify that code works when no cuts are performed::
|
|
167
|
+
|
|
168
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
169
|
+
sage: v = vector(ZZ, [1,1,-1])
|
|
170
|
+
sage: L = IntegerLattice([v])
|
|
171
|
+
sage: C = L.voronoi_cell(radius=0.1)
|
|
153
172
|
"""
|
|
154
173
|
if verbose:
|
|
155
|
-
print("Cut\n{}\nwith radius {}".format(GM, C))
|
|
174
|
+
print("Cut\n{}\nwith squared radius {}".format(GM, C))
|
|
156
175
|
|
|
157
176
|
dim = GM.dimensions()
|
|
158
177
|
if dim[0] != dim[1]:
|
|
@@ -182,7 +201,7 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
182
201
|
inequalities = []
|
|
183
202
|
while True:
|
|
184
203
|
if verbose:
|
|
185
|
-
print("Dimension: {}"
|
|
204
|
+
print(f"Dimension: {i}")
|
|
186
205
|
if new_dimension:
|
|
187
206
|
Z = sqrt(T[i] / q[i][i])
|
|
188
207
|
if verbose:
|
|
@@ -195,7 +214,7 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
195
214
|
|
|
196
215
|
x[i] += 1
|
|
197
216
|
if verbose:
|
|
198
|
-
print("x: {}"
|
|
217
|
+
print(f"x: {x}")
|
|
199
218
|
if x[i] > L[i]:
|
|
200
219
|
i += 1
|
|
201
220
|
elif i > 0:
|
|
@@ -222,8 +241,9 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
222
241
|
|
|
223
242
|
if verbose:
|
|
224
243
|
print("Final cut")
|
|
225
|
-
|
|
226
|
-
|
|
244
|
+
if inequalities:
|
|
245
|
+
cut = Polyhedron(ieqs=inequalities)
|
|
246
|
+
V = V.intersection(cut)
|
|
227
247
|
|
|
228
248
|
if verbose:
|
|
229
249
|
print("End")
|
|
@@ -231,7 +251,7 @@ def diamond_cut(V, GM, C, verbose=False):
|
|
|
231
251
|
return V
|
|
232
252
|
|
|
233
253
|
|
|
234
|
-
def calculate_voronoi_cell(basis, radius=None, verbose=False):
|
|
254
|
+
def calculate_voronoi_cell(basis, radius=None, verbose=False) -> Polyhedron:
|
|
235
255
|
"""
|
|
236
256
|
Calculate the Voronoi cell of the lattice defined by basis.
|
|
237
257
|
|
|
@@ -239,7 +259,7 @@ def calculate_voronoi_cell(basis, radius=None, verbose=False):
|
|
|
239
259
|
|
|
240
260
|
- ``basis`` -- embedded basis matrix of the lattice
|
|
241
261
|
|
|
242
|
-
- ``radius`` -- radius of basis vectors to consider
|
|
262
|
+
- ``radius`` -- square of radius of basis vectors to consider
|
|
243
263
|
|
|
244
264
|
- ``verbose`` -- whether to print debug information
|
|
245
265
|
|
|
@@ -251,19 +271,90 @@ def calculate_voronoi_cell(basis, radius=None, verbose=False):
|
|
|
251
271
|
sage: V = calculate_voronoi_cell(matrix([[1, 0], [0, 1]]))
|
|
252
272
|
sage: V.volume()
|
|
253
273
|
1
|
|
274
|
+
|
|
275
|
+
TESTS:
|
|
276
|
+
|
|
277
|
+
Verify that :issue:`39507` is fixed::
|
|
278
|
+
|
|
279
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
280
|
+
sage: v = vector(ZZ, [1,1,1,-1])
|
|
281
|
+
sage: L = IntegerLattice([v])
|
|
282
|
+
sage: print(v in L)
|
|
283
|
+
True
|
|
284
|
+
sage: print(L.closest_vector(v))
|
|
285
|
+
(1, 1, 1, -1)
|
|
286
|
+
sage: C = L.voronoi_cell()
|
|
287
|
+
sage: C.Hrepresentation()
|
|
288
|
+
(An inequality (-1, -1, -1, 1) x + 2 >= 0,
|
|
289
|
+
An inequality (1, 1, 1, -1) x + 2 >= 0)
|
|
290
|
+
sage: v = vector(ZZ, [1,1,-1])
|
|
291
|
+
sage: L = IntegerLattice([v])
|
|
292
|
+
sage: C = L.voronoi_cell()
|
|
293
|
+
sage: C.Hrepresentation()
|
|
294
|
+
(An inequality (-2, -2, 2) x + 3 >= 0,
|
|
295
|
+
An inequality (2, 2, -2) x + 3 >= 0)
|
|
296
|
+
sage: C.Vrepresentation()
|
|
297
|
+
(A line in the direction (0, 1, 1),
|
|
298
|
+
A line in the direction (1, 0, 1),
|
|
299
|
+
A vertex at (0, 0, -3/2),
|
|
300
|
+
A vertex at (0, 0, 3/2))
|
|
301
|
+
|
|
302
|
+
Verify that :issue:`37086` is fixed::
|
|
303
|
+
|
|
304
|
+
sage: from sage.modules.free_module_integer import IntegerLattice
|
|
305
|
+
sage: l = [7, 0, -1, -2, -1, -2, 7, -2, 0, 0, -2,
|
|
306
|
+
....: 0, 7, -2, 0, -1, -2, -1, 7, 0 , -1, -1, 0, -2, 7]
|
|
307
|
+
sage: M = matrix(5, 5, l)
|
|
308
|
+
sage: C = IntegerLattice(M).voronoi_cell()
|
|
309
|
+
sage: C
|
|
310
|
+
A 5-dimensional polyhedron in QQ^5 defined as the
|
|
311
|
+
convex hull of 720 vertices
|
|
254
312
|
"""
|
|
255
313
|
dim = basis.dimensions()
|
|
314
|
+
# LLL-reduce for efficiency.
|
|
315
|
+
basis = basis.LLL()
|
|
316
|
+
if radius is None:
|
|
317
|
+
# Convert the basis matrix to use RDF numbers for efficiency when we
|
|
318
|
+
# calculate the triangular matrix of the QR decomposition.
|
|
319
|
+
from sage.rings.real_double import RDF
|
|
320
|
+
transposed_RDF_matrix = (basis.transpose()).change_ring(RDF)
|
|
321
|
+
R = transposed_RDF_matrix.QR()[1]
|
|
322
|
+
# The length of the vector formed by the diagonal entries of R is an
|
|
323
|
+
# upper bound for twice the covering radius, so it is an upper bound
|
|
324
|
+
# on the length of the lattice vectors that need to be considered for
|
|
325
|
+
# diamond cutting. However, the value of the `radius` keyword is
|
|
326
|
+
# actually a squared length, so there is no square root in the
|
|
327
|
+
# following formula.
|
|
328
|
+
radius = sum(R[i, i]**2 for i in range(dim[0]))
|
|
329
|
+
# We then divide by 4 as we will divide the basis by 2 later on.
|
|
330
|
+
radius = ceil(radius / 4)
|
|
256
331
|
artificial_length = None
|
|
257
332
|
if dim[0] < dim[1]:
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
additional_vectors =
|
|
333
|
+
F = basis.base_ring().fraction_field()
|
|
334
|
+
# Introduce "artificial" basis points (representing infinity).
|
|
335
|
+
additional_vectors = (F**dim[1]).subspace(basis).complement().basis()
|
|
336
|
+
additional_vectors = matrix(additional_vectors)
|
|
337
|
+
# LLL-reduce for efficiency.
|
|
338
|
+
additional_vectors = additional_vectors.LLL()
|
|
339
|
+
|
|
340
|
+
from sage.rings.real_double import RDF
|
|
341
|
+
# Convert the basis matrix to use RDF numbers for efficiency when we
|
|
342
|
+
# perform the QR decomposition.
|
|
343
|
+
transposed_RDF_matrix = additional_vectors.transpose().change_ring(RDF)
|
|
344
|
+
R = transposed_RDF_matrix.QR()[1]
|
|
345
|
+
# Since R is triangular, its smallest diagonal entry provides a
|
|
346
|
+
# lower bound on the length of the shortest nonzero vector in the
|
|
347
|
+
# lattice spanned by the artificial points. We square it because
|
|
348
|
+
# value of `radius` is a squared length.
|
|
349
|
+
shortest_vector_lower_bound = min(R[i, i]**2
|
|
350
|
+
for i in range(dim[1] - dim[0]))
|
|
351
|
+
# We will multiply our artificial points by the following scalar in
|
|
352
|
+
# order to make sure the squared length of the shortest
|
|
353
|
+
# nonzero vector is greater than radius, even after the vectors
|
|
354
|
+
# are divided by 2.
|
|
355
|
+
artificial_length = ceil(2.001 * sqrt(radius / shortest_vector_lower_bound))
|
|
356
|
+
additional_vectors *= artificial_length
|
|
264
357
|
basis = basis.stack(additional_vectors)
|
|
265
|
-
# LLL-reduce to get quadratic matrix
|
|
266
|
-
basis = basis.LLL()
|
|
267
358
|
basis = matrix([v for v in basis if v])
|
|
268
359
|
dim = basis.dimensions()
|
|
269
360
|
if dim[0] != dim[1]:
|
|
@@ -276,14 +367,10 @@ def calculate_voronoi_cell(basis, radius=None, verbose=False):
|
|
|
276
367
|
ieqs.append(plane_inequality(-v))
|
|
277
368
|
Q = Polyhedron(ieqs=ieqs)
|
|
278
369
|
|
|
279
|
-
# twice the length of longest vertex in Q is a safe choice
|
|
280
|
-
if radius is None:
|
|
281
|
-
radius = 2 * max(v.inner_product(v) for v in basis)
|
|
282
|
-
|
|
283
370
|
V = diamond_cut(Q, basis, radius, verbose=verbose)
|
|
284
371
|
|
|
285
372
|
if artificial_length is not None:
|
|
286
|
-
#
|
|
373
|
+
# Remove inequalities introduced by artificial basis points.
|
|
287
374
|
H = V.Hrepresentation()
|
|
288
375
|
H = [v for v in H if all(not V._is_zero(v.A() * w / 2 - v.b()) and
|
|
289
376
|
not V._is_zero(v.A() * (-w) / 2 - v.b())
|
|
@@ -766,7 +766,7 @@ class FGP_Module_class(Module):
|
|
|
766
766
|
V = self._V.submodule(x) + self._W
|
|
767
767
|
return self._module_constructor(V, self._W)
|
|
768
768
|
|
|
769
|
-
def has_canonical_map_to(self, A):
|
|
769
|
+
def has_canonical_map_to(self, A) -> bool:
|
|
770
770
|
"""
|
|
771
771
|
Return ``True`` if ``self`` has a canonical map to ``A``, relative to the
|
|
772
772
|
given presentation of ``A``.
|
|
@@ -797,7 +797,7 @@ class FGP_Module_class(Module):
|
|
|
797
797
|
return True
|
|
798
798
|
return self.V().is_submodule(A.V()) and self.W().is_submodule(A.W())
|
|
799
799
|
|
|
800
|
-
def is_submodule(self, A):
|
|
800
|
+
def is_submodule(self, A) -> bool:
|
|
801
801
|
"""
|
|
802
802
|
Return ``True`` if ``self`` is a submodule of ``A``.
|
|
803
803
|
|
|
@@ -1875,7 +1875,7 @@ class FGP_Module_class(Module):
|
|
|
1875
1875
|
from sage.modules.module_functors import QuotientModuleFunctor
|
|
1876
1876
|
return (QuotientModuleFunctor(self._W), self._V)
|
|
1877
1877
|
|
|
1878
|
-
def is_finite(self):
|
|
1878
|
+
def is_finite(self) -> bool:
|
|
1879
1879
|
"""
|
|
1880
1880
|
Return ``True`` if ``self`` is finite and ``False`` otherwise.
|
|
1881
1881
|
|
|
@@ -518,7 +518,7 @@ class FilteredVectorSpace_class(FreeModule_ambient_field):
|
|
|
518
518
|
return VectorSpace(self.base_ring(), self.dimension())
|
|
519
519
|
|
|
520
520
|
@cached_method
|
|
521
|
-
def is_constant(self):
|
|
521
|
+
def is_constant(self) -> bool:
|
|
522
522
|
"""
|
|
523
523
|
Return whether the filtration is constant.
|
|
524
524
|
|
|
@@ -545,7 +545,7 @@ class FilteredVectorSpace_class(FreeModule_ambient_field):
|
|
|
545
545
|
f = self._filt
|
|
546
546
|
return (len(f) == 1) or (len(f) == 2 and f[1][0] == infinity)
|
|
547
547
|
|
|
548
|
-
def is_exhaustive(self):
|
|
548
|
+
def is_exhaustive(self) -> bool:
|
|
549
549
|
r"""
|
|
550
550
|
Return whether the filtration is exhaustive.
|
|
551
551
|
|
|
@@ -568,7 +568,7 @@ class FilteredVectorSpace_class(FreeModule_ambient_field):
|
|
|
568
568
|
return self.get_degree(minus_infinity).dimension() == \
|
|
569
569
|
self.ambient_vector_space().dimension()
|
|
570
570
|
|
|
571
|
-
def is_separating(self):
|
|
571
|
+
def is_separating(self) -> bool:
|
|
572
572
|
r"""
|
|
573
573
|
Return whether the filtration is separating.
|
|
574
574
|
|
|
@@ -911,7 +911,7 @@ class FilteredVectorSpace_class(FreeModule_ambient_field):
|
|
|
911
911
|
|
|
912
912
|
TESTS::
|
|
913
913
|
|
|
914
|
-
sage: # needs sage.geometry.polyhedron sage.graphs sage.schemes
|
|
914
|
+
sage: # needs palp sage.geometry.polyhedron sage.graphs sage.schemes
|
|
915
915
|
sage: P = toric_varieties.P2()
|
|
916
916
|
sage: T_P = P.sheaves.tangent_bundle()
|
|
917
917
|
sage: O_P = P.sheaves.trivial_bundle(1)
|
|
Binary file
|
|
@@ -502,7 +502,7 @@ class FreeGradedModule(CombinatorialFreeModule):
|
|
|
502
502
|
"""
|
|
503
503
|
return self._generator_degrees
|
|
504
504
|
|
|
505
|
-
def is_trivial(self):
|
|
505
|
+
def is_trivial(self) -> bool:
|
|
506
506
|
r"""
|
|
507
507
|
Return ``True`` if this module is trivial and ``False`` otherwise.
|
|
508
508
|
|
|
@@ -941,7 +941,7 @@ class FreeGradedModule(CombinatorialFreeModule):
|
|
|
941
941
|
return FreeGradedModule(algebra=self.base_ring(),
|
|
942
942
|
generator_degrees=degs)
|
|
943
943
|
|
|
944
|
-
def has_relations(self):
|
|
944
|
+
def has_relations(self) -> bool:
|
|
945
945
|
r"""
|
|
946
946
|
Return ``False`` as this has no relations.
|
|
947
947
|
|
sage/modules/fp_graded/module.py
CHANGED
|
@@ -565,7 +565,7 @@ class FPModule(UniqueRepresentation, IndexedGenerators, Module):
|
|
|
565
565
|
|
|
566
566
|
return infinity
|
|
567
567
|
|
|
568
|
-
def is_trivial(self):
|
|
568
|
+
def is_trivial(self) -> bool:
|
|
569
569
|
r"""
|
|
570
570
|
Return ``True`` if ``self`` is isomorphic to the trivial module
|
|
571
571
|
and ``False`` otherwise.
|
|
@@ -600,7 +600,7 @@ class FPModule(UniqueRepresentation, IndexedGenerators, Module):
|
|
|
600
600
|
"""
|
|
601
601
|
return self.connectivity() == infinity
|
|
602
602
|
|
|
603
|
-
def has_relations(self):
|
|
603
|
+
def has_relations(self) -> bool:
|
|
604
604
|
r"""
|
|
605
605
|
Return ``True`` if no relations are defined, and ``False``
|
|
606
606
|
otherwise.
|
|
@@ -612,7 +612,7 @@ class FPModuleMorphism(Morphism):
|
|
|
612
612
|
return homset([self(g(x)) for x in g.domain().generators()])
|
|
613
613
|
|
|
614
614
|
@cached_method
|
|
615
|
-
def is_zero(self):
|
|
615
|
+
def is_zero(self) -> bool:
|
|
616
616
|
r"""
|
|
617
617
|
Decide if ``self`` is the zero homomorphism.
|
|
618
618
|
|
|
@@ -648,7 +648,7 @@ class FPModuleMorphism(Morphism):
|
|
|
648
648
|
__bool__ = is_zero
|
|
649
649
|
|
|
650
650
|
@cached_method
|
|
651
|
-
def is_identity(self):
|
|
651
|
+
def is_identity(self) -> bool:
|
|
652
652
|
r"""
|
|
653
653
|
Decide if ``self`` is the identity endomorphism.
|
|
654
654
|
|
|
@@ -1584,7 +1584,7 @@ class FPModuleMorphism(Morphism):
|
|
|
1584
1584
|
# its image equals im(self)
|
|
1585
1585
|
return Hom(I, j0.codomain())(j0._values)
|
|
1586
1586
|
|
|
1587
|
-
def is_injective(self, top_dim=None, verbose=False):
|
|
1587
|
+
def is_injective(self, top_dim=None, verbose=False) -> bool:
|
|
1588
1588
|
r"""
|
|
1589
1589
|
Return ``True`` if and only if ``self`` has a trivial kernel.
|
|
1590
1590
|
|
|
@@ -1615,7 +1615,7 @@ class FPModuleMorphism(Morphism):
|
|
|
1615
1615
|
j0 = self._resolve_kernel(top_dim, verbose)
|
|
1616
1616
|
return j0.domain().is_trivial()
|
|
1617
1617
|
|
|
1618
|
-
def is_surjective(self):
|
|
1618
|
+
def is_surjective(self) -> bool:
|
|
1619
1619
|
r"""
|
|
1620
1620
|
Return ``True`` if and only if ``self`` has a trivial cokernel.
|
|
1621
1621
|
|
|
@@ -92,7 +92,7 @@ class SteenrodFPModuleMorphism(FPModuleMorphism):
|
|
|
92
92
|
return enveloping_profile_elements(elements,
|
|
93
93
|
char=self.base_ring().characteristic())
|
|
94
94
|
|
|
95
|
-
def is_injective(self, top_dim=None, verbose=False):
|
|
95
|
+
def is_injective(self, top_dim=None, verbose=False) -> bool:
|
|
96
96
|
r"""
|
|
97
97
|
Return ``True`` if ``self`` is injective.
|
|
98
98
|
|