passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Enumerated set of lists of integers with constraints: base classes
|
|
4
|
+
|
|
5
|
+
- :class:`IntegerListsBackend`: base class for the Cython back-end of
|
|
6
|
+
an enumerated set of lists of integers with specified constraints.
|
|
7
|
+
|
|
8
|
+
- :class:`Envelope`: a utility class for upper (lower) envelope of a
|
|
9
|
+
function under constraints.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2015 Bryan Gillespie <Brg008@gmail.com>
|
|
14
|
+
# Nicolas M. Thiery <nthiery at users.sf.net>
|
|
15
|
+
# Anne Schilling <anne@math.ucdavis.edu>
|
|
16
|
+
# Jeroen Demeyer <jdemeyer@cage.ugent.be>
|
|
17
|
+
#
|
|
18
|
+
# This program is free software: you can redistribute it and/or modify
|
|
19
|
+
# it under the terms of the GNU General Public License as published by
|
|
20
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
21
|
+
# (at your option) any later version.
|
|
22
|
+
# https://www.gnu.org/licenses/
|
|
23
|
+
# ****************************************************************************
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
from cpython.object cimport Py_LE, Py_EQ, Py_NE, Py_GE
|
|
27
|
+
from sage.misc.constant_function import ConstantFunction
|
|
28
|
+
from sage.structure.element cimport RingElement
|
|
29
|
+
from sage.rings.integer cimport Integer
|
|
30
|
+
from sage.rings.integer_ring import ZZ
|
|
31
|
+
|
|
32
|
+
Infinity = float('+inf')
|
|
33
|
+
MInfinity = float('-inf')
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
cdef class IntegerListsBackend():
|
|
37
|
+
"""
|
|
38
|
+
Base class for the Cython back-end of an enumerated set of lists of
|
|
39
|
+
integers with specified constraints.
|
|
40
|
+
|
|
41
|
+
This base implements the basic operations, including checking for
|
|
42
|
+
containment using :meth:`_contains`, but not iteration. For
|
|
43
|
+
iteration, subclass this class and implement an ``_iter()`` method.
|
|
44
|
+
|
|
45
|
+
EXAMPLES::
|
|
46
|
+
|
|
47
|
+
sage: from sage.combinat.integer_lists.base import IntegerListsBackend
|
|
48
|
+
sage: L = IntegerListsBackend(6, max_slope=-1)
|
|
49
|
+
sage: L._contains([3,2,1])
|
|
50
|
+
True
|
|
51
|
+
"""
|
|
52
|
+
def __init__(self,
|
|
53
|
+
n=None, length=None, *,
|
|
54
|
+
min_length=0, max_length=Infinity,
|
|
55
|
+
floor=None, ceiling=None,
|
|
56
|
+
min_part=0, max_part=Infinity,
|
|
57
|
+
min_slope=MInfinity, max_slope=Infinity,
|
|
58
|
+
min_sum=0, max_sum=Infinity):
|
|
59
|
+
"""
|
|
60
|
+
Initialize ``self``.
|
|
61
|
+
|
|
62
|
+
TESTS::
|
|
63
|
+
|
|
64
|
+
sage: from sage.combinat.integer_lists.base import IntegerListsBackend
|
|
65
|
+
sage: C = IntegerListsBackend(2, length=3)
|
|
66
|
+
sage: C = IntegerListsBackend(min_sum=1.4) # needs sage.rings.real_mpfr
|
|
67
|
+
Traceback (most recent call last):
|
|
68
|
+
...
|
|
69
|
+
TypeError: Attempt to coerce non-integral RealNumber to Integer
|
|
70
|
+
sage: C = IntegerListsBackend(min_sum=Infinity)
|
|
71
|
+
Traceback (most recent call last):
|
|
72
|
+
...
|
|
73
|
+
TypeError: unable to coerce <class 'sage.rings.infinity.PlusInfinity'> to an integer
|
|
74
|
+
"""
|
|
75
|
+
if n is not None:
|
|
76
|
+
min_sum = n
|
|
77
|
+
max_sum = n
|
|
78
|
+
self.min_sum = Integer(min_sum) if min_sum != -Infinity else -Infinity
|
|
79
|
+
self.max_sum = Integer(max_sum) if max_sum != Infinity else Infinity
|
|
80
|
+
|
|
81
|
+
if length is not None:
|
|
82
|
+
min_length = length
|
|
83
|
+
max_length = length
|
|
84
|
+
self.min_length = Integer(max(min_length, 0))
|
|
85
|
+
self.max_length = Integer(max_length) if max_length != Infinity else Infinity
|
|
86
|
+
|
|
87
|
+
self.min_slope = Integer(min_slope) if min_slope != -Infinity else -Infinity
|
|
88
|
+
self.max_slope = Integer(max_slope) if max_slope != Infinity else Infinity
|
|
89
|
+
|
|
90
|
+
self.min_part = Integer(min_part) if min_part != -Infinity else -Infinity
|
|
91
|
+
self.max_part = Integer(max_part) if max_part != Infinity else Infinity
|
|
92
|
+
|
|
93
|
+
if isinstance(floor, Envelope):
|
|
94
|
+
self.floor = floor
|
|
95
|
+
else:
|
|
96
|
+
if floor is None:
|
|
97
|
+
floor = -Infinity
|
|
98
|
+
elif isinstance(floor, (list, tuple)):
|
|
99
|
+
floor = tuple(Integer(i) for i in floor)
|
|
100
|
+
elif callable(floor):
|
|
101
|
+
pass
|
|
102
|
+
else:
|
|
103
|
+
raise TypeError("floor should be a list, tuple, or function")
|
|
104
|
+
self.floor = Envelope(floor, sign=-1,
|
|
105
|
+
min_part=self.min_part, max_part=self.max_part,
|
|
106
|
+
min_slope=self.min_slope, max_slope=self.max_slope,
|
|
107
|
+
min_length=self.min_length)
|
|
108
|
+
|
|
109
|
+
if isinstance(ceiling, Envelope):
|
|
110
|
+
self.ceiling = ceiling
|
|
111
|
+
else:
|
|
112
|
+
if ceiling is None:
|
|
113
|
+
ceiling = Infinity
|
|
114
|
+
elif isinstance(ceiling, (list, tuple)):
|
|
115
|
+
ceiling = tuple(Integer(i) if i != Infinity else Infinity
|
|
116
|
+
for i in ceiling)
|
|
117
|
+
elif callable(ceiling):
|
|
118
|
+
pass
|
|
119
|
+
else:
|
|
120
|
+
raise ValueError("Unable to parse value of parameter ceiling")
|
|
121
|
+
self.ceiling = Envelope(ceiling, sign=1,
|
|
122
|
+
min_part=self.min_part, max_part=self.max_part,
|
|
123
|
+
min_slope=self.min_slope, max_slope=self.max_slope,
|
|
124
|
+
min_length=self.min_length)
|
|
125
|
+
|
|
126
|
+
def __richcmp__(self, other, int op):
|
|
127
|
+
r"""
|
|
128
|
+
Basic comparison function, supporting only checking for
|
|
129
|
+
equality.
|
|
130
|
+
|
|
131
|
+
EXAMPLES::
|
|
132
|
+
|
|
133
|
+
sage: C = IntegerListsLex(2, length=3).backend
|
|
134
|
+
sage: D = IntegerListsLex(2, length=3).backend; L = list(D._iter())
|
|
135
|
+
sage: E = IntegerListsLex(2, min_length=3).backend
|
|
136
|
+
sage: G = IntegerListsLex(4, length=3).backend
|
|
137
|
+
sage: C >= C
|
|
138
|
+
True
|
|
139
|
+
sage: C == D
|
|
140
|
+
True
|
|
141
|
+
sage: C != D
|
|
142
|
+
False
|
|
143
|
+
sage: C == E
|
|
144
|
+
False
|
|
145
|
+
sage: C != E
|
|
146
|
+
True
|
|
147
|
+
sage: C == None
|
|
148
|
+
False
|
|
149
|
+
sage: C == G
|
|
150
|
+
False
|
|
151
|
+
sage: C <= G
|
|
152
|
+
Traceback (most recent call last):
|
|
153
|
+
...
|
|
154
|
+
TypeError: IntegerListsBackend can only be compared for equality
|
|
155
|
+
"""
|
|
156
|
+
cdef IntegerListsBackend left = <IntegerListsBackend>self
|
|
157
|
+
cdef IntegerListsBackend right = <IntegerListsBackend>other
|
|
158
|
+
equal = (type(left) is type(other) and
|
|
159
|
+
left.min_length == right.min_length and
|
|
160
|
+
left.max_length == right.max_length and
|
|
161
|
+
left.min_sum == right.min_sum and
|
|
162
|
+
left.max_sum == right.max_sum and
|
|
163
|
+
left.min_slope == right.min_slope and
|
|
164
|
+
left.max_slope == right.max_slope and
|
|
165
|
+
left.floor == right.floor and
|
|
166
|
+
left.ceiling == right.ceiling)
|
|
167
|
+
if equal:
|
|
168
|
+
return op == Py_EQ or op == Py_LE or op == Py_GE
|
|
169
|
+
if op == Py_EQ:
|
|
170
|
+
return False
|
|
171
|
+
if op == Py_NE:
|
|
172
|
+
return True
|
|
173
|
+
else:
|
|
174
|
+
raise TypeError("IntegerListsBackend can only be compared for equality")
|
|
175
|
+
|
|
176
|
+
def _repr_(self):
|
|
177
|
+
"""
|
|
178
|
+
Return the name of this enumerated set.
|
|
179
|
+
|
|
180
|
+
EXAMPLES::
|
|
181
|
+
|
|
182
|
+
sage: from sage.combinat.integer_lists.base import IntegerListsBackend
|
|
183
|
+
sage: C = IntegerListsBackend(2, length=3)
|
|
184
|
+
sage: C._repr_()
|
|
185
|
+
'Integer lists of sum 2 satisfying certain constraints'
|
|
186
|
+
"""
|
|
187
|
+
if self.min_sum == self.max_sum:
|
|
188
|
+
return "Integer lists of sum {} satisfying certain constraints".format(self.min_sum)
|
|
189
|
+
elif self.max_sum == Infinity:
|
|
190
|
+
if self.min_sum == 0:
|
|
191
|
+
return "Integer lists with arbitrary sum satisfying certain constraints"
|
|
192
|
+
else:
|
|
193
|
+
return "Integer lists of sum at least {} satisfying certain constraints".format(self.min_sum)
|
|
194
|
+
else:
|
|
195
|
+
return "Integer lists of sum between {} and {} satisfying certain constraints".format(self.min_sum, self.max_sum)
|
|
196
|
+
|
|
197
|
+
def _contains(self, comp):
|
|
198
|
+
"""
|
|
199
|
+
Return ``True`` if ``comp`` meets the constraints imposed
|
|
200
|
+
by the arguments.
|
|
201
|
+
|
|
202
|
+
EXAMPLES::
|
|
203
|
+
|
|
204
|
+
sage: C = IntegerListsLex(n=2, max_length=3, min_slope=0)
|
|
205
|
+
sage: all(l in C for l in C) # indirect doctest
|
|
206
|
+
True
|
|
207
|
+
|
|
208
|
+
TESTS::
|
|
209
|
+
|
|
210
|
+
sage: [None, 2] in C
|
|
211
|
+
False
|
|
212
|
+
|
|
213
|
+
sage: [1/2, 3/2] in C
|
|
214
|
+
False
|
|
215
|
+
"""
|
|
216
|
+
if len(comp) < self.min_length or len(comp) > self.max_length:
|
|
217
|
+
return False
|
|
218
|
+
if not all(e in ZZ for e in comp):
|
|
219
|
+
return False
|
|
220
|
+
n = sum(comp)
|
|
221
|
+
if n < self.min_sum or n > self.max_sum:
|
|
222
|
+
return False
|
|
223
|
+
for i in range(len(comp)):
|
|
224
|
+
if comp[i] < self.floor(i):
|
|
225
|
+
return False
|
|
226
|
+
if comp[i] > self.ceiling(i):
|
|
227
|
+
return False
|
|
228
|
+
for i in range(len(comp)-1):
|
|
229
|
+
slope = comp[i+1] - comp[i]
|
|
230
|
+
if slope < self.min_slope or slope > self.max_slope:
|
|
231
|
+
return False
|
|
232
|
+
return True
|
|
233
|
+
|
|
234
|
+
def __getstate__(self):
|
|
235
|
+
"""
|
|
236
|
+
Pickle ``self``.
|
|
237
|
+
|
|
238
|
+
EXAMPLES::
|
|
239
|
+
|
|
240
|
+
sage: from sage.combinat.integer_lists.base import IntegerListsBackend
|
|
241
|
+
sage: C = IntegerListsBackend(2, length=3)
|
|
242
|
+
sage: C.__getstate__()
|
|
243
|
+
{'ceiling': <sage.combinat.integer_lists.base.Envelope object at ...>,
|
|
244
|
+
'floor': <sage.combinat.integer_lists.base.Envelope object at ...>,
|
|
245
|
+
'max_length': 3,
|
|
246
|
+
'max_part': inf,
|
|
247
|
+
'max_slope': inf,
|
|
248
|
+
'max_sum': 2,
|
|
249
|
+
'min_length': 3,
|
|
250
|
+
'min_part': 0,
|
|
251
|
+
'min_slope': -inf,
|
|
252
|
+
'min_sum': 2}
|
|
253
|
+
"""
|
|
254
|
+
return {"min_sum": self.min_sum,
|
|
255
|
+
"max_sum": self.max_sum,
|
|
256
|
+
"min_length": self.min_length,
|
|
257
|
+
"max_length": self.max_length,
|
|
258
|
+
"min_part": self.min_part,
|
|
259
|
+
"max_part": self.max_part,
|
|
260
|
+
"min_slope": self.min_slope,
|
|
261
|
+
"max_slope": self.max_slope,
|
|
262
|
+
"floor": self.floor,
|
|
263
|
+
"ceiling": self.ceiling}
|
|
264
|
+
|
|
265
|
+
def __setstate__(self, state):
|
|
266
|
+
"""
|
|
267
|
+
Unpickle ``self`` from the state ``state``.
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: from sage.combinat.integer_lists.base import IntegerListsBackend
|
|
272
|
+
sage: C = IntegerListsBackend(2, length=3)
|
|
273
|
+
sage: C == loads(dumps(C))
|
|
274
|
+
True
|
|
275
|
+
sage: C == loads(dumps(C)) # this did fail at some point, really!
|
|
276
|
+
True
|
|
277
|
+
sage: C is loads(dumps(C)) # todo: not implemented
|
|
278
|
+
True
|
|
279
|
+
"""
|
|
280
|
+
self.__init__(**state)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
cdef class Envelope():
|
|
284
|
+
r"""
|
|
285
|
+
The (currently approximated) upper (lower) envelope of a function
|
|
286
|
+
under the specified constraints.
|
|
287
|
+
|
|
288
|
+
INPUT:
|
|
289
|
+
|
|
290
|
+
- ``f`` -- a function, list, or tuple; if ``f`` is a list, it is
|
|
291
|
+
considered as the function ``f(i)=f[i]``, completed for larger
|
|
292
|
+
`i` with ``f(i)=max_part``.
|
|
293
|
+
|
|
294
|
+
- ``min_part``, ``max_part``, ``min_slope``, ``max_slope``, ...
|
|
295
|
+
as for :class:`IntegerListsLex` (please consult for details).
|
|
296
|
+
|
|
297
|
+
- ``sign`` -- (+1 or -1) multiply the input values with ``sign``
|
|
298
|
+
and multiply the output with ``sign``. Setting this to `-1` can
|
|
299
|
+
be used to implement a lower envelope.
|
|
300
|
+
|
|
301
|
+
The *upper envelope* `U(f)` of `f` is the (pointwise) largest
|
|
302
|
+
function which is bounded above by `f` and satisfies the
|
|
303
|
+
``max_part`` and ``max_slope`` conditions. Furthermore, for
|
|
304
|
+
``i,i+1<min_length``, the upper envelope also satisfies the
|
|
305
|
+
``min_slope`` condition.
|
|
306
|
+
|
|
307
|
+
Upon computing `U(f)(i)`, all the previous values
|
|
308
|
+
for `j\leq i` are computed and cached; in particular `f(i)` will
|
|
309
|
+
be computed at most once for each `i`.
|
|
310
|
+
|
|
311
|
+
.. TODO::
|
|
312
|
+
|
|
313
|
+
- This class is a good candidate for Cythonization, especially
|
|
314
|
+
to get the critical path in ``__call__`` super fast.
|
|
315
|
+
|
|
316
|
+
- To get full envelopes, we would want both the ``min_slope``
|
|
317
|
+
and ``max_slope`` conditions to always be satisfied. This is
|
|
318
|
+
only properly defined for the restriction of `f` to a finite
|
|
319
|
+
interval `0,..,k`, and depends on `k`.
|
|
320
|
+
|
|
321
|
+
- This is the core "data structure" of
|
|
322
|
+
``IntegerListsLex``. Improving the lookahead there
|
|
323
|
+
essentially depends on having functions with a good
|
|
324
|
+
complexity to compute the area below an envelope; and in
|
|
325
|
+
particular how it evolves when increasing the length.
|
|
326
|
+
|
|
327
|
+
EXAMPLES::
|
|
328
|
+
|
|
329
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
330
|
+
|
|
331
|
+
Trivial upper and lower envelopes::
|
|
332
|
+
|
|
333
|
+
sage: f = Envelope([3,2,2])
|
|
334
|
+
sage: [f(i) for i in range(10)]
|
|
335
|
+
[3, 2, 2, inf, inf, inf, inf, inf, inf, inf]
|
|
336
|
+
sage: f = Envelope([3,2,2], sign=-1)
|
|
337
|
+
sage: [f(i) for i in range(10)]
|
|
338
|
+
[3, 2, 2, 0, 0, 0, 0, 0, 0, 0]
|
|
339
|
+
|
|
340
|
+
A more interesting lower envelope::
|
|
341
|
+
|
|
342
|
+
sage: f = Envelope([4,1,5,3,5], sign=-1, min_part=2, min_slope=-1)
|
|
343
|
+
sage: [f(i) for i in range(10)]
|
|
344
|
+
[4, 3, 5, 4, 5, 4, 3, 2, 2, 2]
|
|
345
|
+
|
|
346
|
+
Currently, adding ``max_slope`` has no effect::
|
|
347
|
+
|
|
348
|
+
sage: f = Envelope([4,1,5,3,5], sign=-1, min_part=2, min_slope=-1, max_slope=0)
|
|
349
|
+
sage: [f(i) for i in range(10)]
|
|
350
|
+
[4, 3, 5, 4, 5, 4, 3, 2, 2, 2]
|
|
351
|
+
|
|
352
|
+
unless ``min_length`` is large enough::
|
|
353
|
+
|
|
354
|
+
sage: f = Envelope([4,1,5,3,5], sign=-1, min_part=2, min_slope=-1, max_slope=0, min_length=2)
|
|
355
|
+
sage: [f(i) for i in range(10)]
|
|
356
|
+
[4, 3, 5, 4, 5, 4, 3, 2, 2, 2]
|
|
357
|
+
|
|
358
|
+
sage: f = Envelope([4,1,5,3,5], sign=-1, min_part=2, min_slope=-1, max_slope=0, min_length=4)
|
|
359
|
+
sage: [f(i) for i in range(10)]
|
|
360
|
+
[5, 5, 5, 4, 5, 4, 3, 2, 2, 2]
|
|
361
|
+
|
|
362
|
+
sage: f = Envelope([4,1,5,3,5], sign=-1, min_part=2, min_slope=-1, max_slope=0, min_length=5)
|
|
363
|
+
sage: [f(i) for i in range(10)]
|
|
364
|
+
[5, 5, 5, 5, 5, 4, 3, 2, 2, 2]
|
|
365
|
+
|
|
366
|
+
A non trivial upper envelope::
|
|
367
|
+
|
|
368
|
+
sage: f = Envelope([9,1,5,4], max_part=7, max_slope=2)
|
|
369
|
+
sage: [f(i) for i in range(10)]
|
|
370
|
+
[7, 1, 3, 4, 6, 7, 7, 7, 7, 7]
|
|
371
|
+
|
|
372
|
+
TESTS::
|
|
373
|
+
|
|
374
|
+
sage: f = Envelope(3, min_slope=1)
|
|
375
|
+
sage: [f(i) for i in range(10)]
|
|
376
|
+
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
|
|
377
|
+
|
|
378
|
+
sage: f = Envelope(3, min_slope=1, min_length=5)
|
|
379
|
+
sage: [f(i) for i in range(10)]
|
|
380
|
+
[-1, 0, 1, 2, 3, 3, 3, 3, 3, 3]
|
|
381
|
+
|
|
382
|
+
sage: f = Envelope(3, sign=-1, min_slope=1)
|
|
383
|
+
sage: [f(i) for i in range(10)]
|
|
384
|
+
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
|
|
385
|
+
|
|
386
|
+
sage: f = Envelope(3, sign=-1, max_slope=-1, min_length=4)
|
|
387
|
+
sage: [f(i) for i in range(10)]
|
|
388
|
+
[6, 5, 4, 3, 3, 3, 3, 3, 3, 3]
|
|
389
|
+
"""
|
|
390
|
+
def __init__(self, f, *,
|
|
391
|
+
min_part=0, max_part=Infinity,
|
|
392
|
+
min_slope=MInfinity, max_slope=Infinity,
|
|
393
|
+
min_length=0, max_length=Infinity, sign=1):
|
|
394
|
+
r"""
|
|
395
|
+
Initialize this envelope.
|
|
396
|
+
|
|
397
|
+
TESTS::
|
|
398
|
+
|
|
399
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
400
|
+
sage: f = Envelope(3, sign=-1, max_slope=-1, min_length=4)
|
|
401
|
+
sage: f.sign
|
|
402
|
+
-1
|
|
403
|
+
sage: f.max_part
|
|
404
|
+
-3
|
|
405
|
+
sage: f.max_slope
|
|
406
|
+
inf
|
|
407
|
+
sage: f.min_slope
|
|
408
|
+
1
|
|
409
|
+
sage: TestSuite(f).run(skip='_test_pickling')
|
|
410
|
+
sage: Envelope(3, sign=1/3, max_slope=-1, min_length=4)
|
|
411
|
+
Traceback (most recent call last):
|
|
412
|
+
...
|
|
413
|
+
TypeError: no conversion of this rational to integer
|
|
414
|
+
sage: Envelope(3, sign=-2, max_slope=-1, min_length=4)
|
|
415
|
+
Traceback (most recent call last):
|
|
416
|
+
...
|
|
417
|
+
ValueError: sign should be +1 or -1
|
|
418
|
+
"""
|
|
419
|
+
# self.sign = sign for the output values (the sign change for
|
|
420
|
+
# f is handled here in __init__)
|
|
421
|
+
self.sign = Integer(sign)
|
|
422
|
+
if self.sign == 1:
|
|
423
|
+
self.max_part = max_part
|
|
424
|
+
self.min_slope = min_slope
|
|
425
|
+
self.max_slope = max_slope
|
|
426
|
+
if max_part == 0:
|
|
427
|
+
# This uses that all entries are nonnegative.
|
|
428
|
+
# This is not for speed optimization but for
|
|
429
|
+
# setting the limit start and avoid hangs.
|
|
430
|
+
# See #17979: comment 389
|
|
431
|
+
f = Integer(0)
|
|
432
|
+
elif self.sign == -1:
|
|
433
|
+
self.max_part = -min_part
|
|
434
|
+
self.min_slope = -max_slope
|
|
435
|
+
self.max_slope = -min_slope
|
|
436
|
+
else:
|
|
437
|
+
raise ValueError("sign should be +1 or -1")
|
|
438
|
+
|
|
439
|
+
# Handle different types of f and multiply f with sign
|
|
440
|
+
if isinstance(f, RingElement) or f == Infinity or f == -Infinity:
|
|
441
|
+
limit_start = 0
|
|
442
|
+
self.max_part = min(self.sign * f, self.max_part)
|
|
443
|
+
f = ConstantFunction(Infinity)
|
|
444
|
+
elif isinstance(f, (list, tuple)):
|
|
445
|
+
limit_start = len(f)
|
|
446
|
+
f_tab = [self.sign * i for i in f]
|
|
447
|
+
f = lambda k: f_tab[k] if k < len(f_tab) else Infinity
|
|
448
|
+
else:
|
|
449
|
+
g = f
|
|
450
|
+
f = lambda k: self.sign * g(k)
|
|
451
|
+
# At this point, this is not really used
|
|
452
|
+
limit_start = Infinity
|
|
453
|
+
|
|
454
|
+
self.f = f
|
|
455
|
+
# For i >= limit_start, f is constant
|
|
456
|
+
# This does not necessarily means that self is constant!
|
|
457
|
+
self.f_limit_start = limit_start
|
|
458
|
+
self.precomputed = []
|
|
459
|
+
|
|
460
|
+
if min_length > 0:
|
|
461
|
+
self(min_length-1)
|
|
462
|
+
for i in range(min_length-1,0,-1):
|
|
463
|
+
self.precomputed[i-1] = min(self.precomputed[i-1], self.precomputed[i] - self.min_slope)
|
|
464
|
+
|
|
465
|
+
def __richcmp__(self, other, int op):
|
|
466
|
+
r"""
|
|
467
|
+
Basic comparison function, supporting only checking for
|
|
468
|
+
equality.
|
|
469
|
+
|
|
470
|
+
EXAMPLES::
|
|
471
|
+
|
|
472
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
473
|
+
sage: f = Envelope([3,2,2])
|
|
474
|
+
sage: g = Envelope([3,2,2])
|
|
475
|
+
sage: h = Envelope([3,2,2], min_part=2)
|
|
476
|
+
sage: f == f, f == h, f == None
|
|
477
|
+
(True, False, False)
|
|
478
|
+
sage: f < f, f != h, f != None
|
|
479
|
+
(False, True, True)
|
|
480
|
+
|
|
481
|
+
This would be desirable::
|
|
482
|
+
|
|
483
|
+
sage: f == g # todo: not implemented
|
|
484
|
+
True
|
|
485
|
+
"""
|
|
486
|
+
cdef Envelope left = <Envelope>self
|
|
487
|
+
cdef Envelope right = <Envelope>other
|
|
488
|
+
equal = (type(left) is type(other) and
|
|
489
|
+
left.sign == right.sign and
|
|
490
|
+
left.f == right.f and
|
|
491
|
+
left.f_limit_start == right.f_limit_start and
|
|
492
|
+
left.max_part == right.max_part and
|
|
493
|
+
left.min_slope == right.min_slope and
|
|
494
|
+
left.max_slope == right.max_slope)
|
|
495
|
+
if equal:
|
|
496
|
+
return op == Py_EQ or op == Py_LE or op == Py_GE
|
|
497
|
+
if op == Py_EQ:
|
|
498
|
+
return False
|
|
499
|
+
if op == Py_NE:
|
|
500
|
+
return True
|
|
501
|
+
else:
|
|
502
|
+
raise TypeError("Envelopes can only be compared for equality")
|
|
503
|
+
|
|
504
|
+
def limit_start(self):
|
|
505
|
+
"""
|
|
506
|
+
Return from which `i` on the bound returned by ``limit`` holds.
|
|
507
|
+
|
|
508
|
+
.. SEEALSO:: :meth:`limit` for the precise specifications.
|
|
509
|
+
|
|
510
|
+
EXAMPLES::
|
|
511
|
+
|
|
512
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
513
|
+
sage: Envelope([4,1,5]).limit_start()
|
|
514
|
+
3
|
|
515
|
+
sage: Envelope([4,1,5], sign=-1).limit_start()
|
|
516
|
+
3
|
|
517
|
+
|
|
518
|
+
sage: Envelope([4,1,5], max_part=2).limit_start()
|
|
519
|
+
3
|
|
520
|
+
|
|
521
|
+
sage: Envelope(4).limit_start()
|
|
522
|
+
0
|
|
523
|
+
sage: Envelope(4, sign=-1).limit_start()
|
|
524
|
+
0
|
|
525
|
+
|
|
526
|
+
sage: Envelope(lambda x: 3).limit_start() == Infinity
|
|
527
|
+
True
|
|
528
|
+
sage: Envelope(lambda x: 3, max_part=2).limit_start() == Infinity
|
|
529
|
+
True
|
|
530
|
+
|
|
531
|
+
sage: Envelope(lambda x: 3, sign=-1, min_part=2).limit_start() == Infinity
|
|
532
|
+
True
|
|
533
|
+
"""
|
|
534
|
+
return self.f_limit_start
|
|
535
|
+
|
|
536
|
+
def limit(self):
|
|
537
|
+
r"""
|
|
538
|
+
Return a bound on the limit of ``self``.
|
|
539
|
+
|
|
540
|
+
OUTPUT: nonnegative integer or `\infty`
|
|
541
|
+
|
|
542
|
+
This returns some upper bound for the accumulation points of
|
|
543
|
+
this upper envelope. For a lower envelope, a lower bound is
|
|
544
|
+
returned instead.
|
|
545
|
+
|
|
546
|
+
In particular this gives a bound for the value of ``self`` at
|
|
547
|
+
`i` for `i` large enough. Special case: for a lower envelop,
|
|
548
|
+
and when the limit is `\infty`, the envelope is guaranteed to
|
|
549
|
+
tend to `\infty` instead.
|
|
550
|
+
|
|
551
|
+
When ``s=self.limit_start()`` is finite, this bound is
|
|
552
|
+
guaranteed to be valid for `i>=s`.
|
|
553
|
+
|
|
554
|
+
Sometimes it's better to have a loose bound that starts early;
|
|
555
|
+
sometimes the converse holds. At this point which specific
|
|
556
|
+
bound and starting point is returned is not set in stone, in
|
|
557
|
+
order to leave room for later optimizations.
|
|
558
|
+
|
|
559
|
+
EXAMPLES::
|
|
560
|
+
|
|
561
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
562
|
+
sage: Envelope([4,1,5]).limit()
|
|
563
|
+
inf
|
|
564
|
+
sage: Envelope([4,1,5], max_part=2).limit()
|
|
565
|
+
2
|
|
566
|
+
sage: Envelope([4,1,5], max_slope=0).limit()
|
|
567
|
+
1
|
|
568
|
+
sage: Envelope(lambda x: 3, max_part=2).limit()
|
|
569
|
+
2
|
|
570
|
+
|
|
571
|
+
Lower envelopes::
|
|
572
|
+
|
|
573
|
+
sage: Envelope(lambda x: 3, min_part=2, sign=-1).limit()
|
|
574
|
+
2
|
|
575
|
+
sage: Envelope([4,1,5], min_slope=0, sign=-1).limit()
|
|
576
|
+
5
|
|
577
|
+
sage: Envelope([4,1,5], sign=-1).limit()
|
|
578
|
+
0
|
|
579
|
+
|
|
580
|
+
.. SEEALSO:: :meth:`limit_start`
|
|
581
|
+
"""
|
|
582
|
+
if self.limit_start() < Infinity and self.max_slope <= 0:
|
|
583
|
+
return self(self.limit_start())
|
|
584
|
+
else:
|
|
585
|
+
return self.max_part * self.sign
|
|
586
|
+
|
|
587
|
+
def __call__(self, Py_ssize_t k):
|
|
588
|
+
"""
|
|
589
|
+
Return the value of this envelope at `k`.
|
|
590
|
+
|
|
591
|
+
EXAMPLES::
|
|
592
|
+
|
|
593
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
594
|
+
sage: f = Envelope([4,1,5,3,5])
|
|
595
|
+
sage: f.__call__(2)
|
|
596
|
+
5
|
|
597
|
+
sage: [f(i) for i in range(10)]
|
|
598
|
+
[4, 1, 5, 3, 5, inf, inf, inf, inf, inf]
|
|
599
|
+
|
|
600
|
+
.. NOTE::
|
|
601
|
+
|
|
602
|
+
See the documentation of :class:`Envelope` for tests and
|
|
603
|
+
examples.
|
|
604
|
+
"""
|
|
605
|
+
if k >= len(self.precomputed):
|
|
606
|
+
for i in range(len(self.precomputed), k+1):
|
|
607
|
+
value = min(self.f(i), self.max_part)
|
|
608
|
+
if i > 0:
|
|
609
|
+
value = min(value, self.precomputed[i-1] + self.max_slope)
|
|
610
|
+
self.precomputed.append(value)
|
|
611
|
+
return self.precomputed[k] * self.sign
|
|
612
|
+
|
|
613
|
+
def adapt(self, m, j):
|
|
614
|
+
"""
|
|
615
|
+
Return this envelope adapted to an additional local constraint.
|
|
616
|
+
|
|
617
|
+
INPUT:
|
|
618
|
+
|
|
619
|
+
- ``m`` -- nonnegative integer (starting value)
|
|
620
|
+
|
|
621
|
+
- ``j`` -- nonnegative integer (position)
|
|
622
|
+
|
|
623
|
+
This method adapts this envelope to the additional local
|
|
624
|
+
constraint imposed by having a part `m` at position `j`.
|
|
625
|
+
Namely, this returns a function which computes, for any `i>j`,
|
|
626
|
+
the minimum of the ceiling function and the value restriction
|
|
627
|
+
given by the slope conditions.
|
|
628
|
+
|
|
629
|
+
EXAMPLES::
|
|
630
|
+
|
|
631
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
632
|
+
sage: f = Envelope(3)
|
|
633
|
+
sage: g = f.adapt(1,1)
|
|
634
|
+
sage: g is f
|
|
635
|
+
True
|
|
636
|
+
sage: [g(i) for i in range(10)]
|
|
637
|
+
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
|
|
638
|
+
|
|
639
|
+
sage: f = Envelope(3, max_slope=1)
|
|
640
|
+
sage: g = f.adapt(1,1)
|
|
641
|
+
sage: [g(i) for i in range(10)]
|
|
642
|
+
[0, 1, 2, 3, 3, 3, 3, 3, 3, 3]
|
|
643
|
+
|
|
644
|
+
Note that, in both cases above, the adapted envelope is only
|
|
645
|
+
guaranteed to be valid for `i>j`! This is to leave potential
|
|
646
|
+
room in the future for sharing similar adapted envelopes::
|
|
647
|
+
|
|
648
|
+
sage: g = f.adapt(0,0)
|
|
649
|
+
sage: [g(i) for i in range(10)]
|
|
650
|
+
[0, 1, 2, 3, 3, 3, 3, 3, 3, 3]
|
|
651
|
+
|
|
652
|
+
sage: g = f.adapt(2,2)
|
|
653
|
+
sage: [g(i) for i in range(10)]
|
|
654
|
+
[0, 1, 2, 3, 3, 3, 3, 3, 3, 3]
|
|
655
|
+
|
|
656
|
+
sage: g = f.adapt(3,3)
|
|
657
|
+
sage: [g(i) for i in range(10)]
|
|
658
|
+
[0, 1, 2, 3, 3, 3, 3, 3, 3, 3]
|
|
659
|
+
|
|
660
|
+
Now with a lower envelope::
|
|
661
|
+
|
|
662
|
+
sage: f = Envelope(1, sign=-1, min_slope=-1)
|
|
663
|
+
sage: g = f.adapt(2,2)
|
|
664
|
+
sage: [g(i) for i in range(10)]
|
|
665
|
+
[4, 3, 2, 1, 1, 1, 1, 1, 1, 1]
|
|
666
|
+
sage: g = f.adapt(1,3)
|
|
667
|
+
sage: [g(i) for i in range(10)]
|
|
668
|
+
[4, 3, 2, 1, 1, 1, 1, 1, 1, 1]
|
|
669
|
+
"""
|
|
670
|
+
if self.max_slope == Infinity:
|
|
671
|
+
return self
|
|
672
|
+
m *= self.sign
|
|
673
|
+
m = m - j * self.max_slope
|
|
674
|
+
return lambda i: self.sign * min(m + i*self.max_slope, self.sign*self(i) )
|
|
675
|
+
|
|
676
|
+
def __reduce__(self):
|
|
677
|
+
"""
|
|
678
|
+
Pickle ``self``.
|
|
679
|
+
|
|
680
|
+
EXAMPLES::
|
|
681
|
+
|
|
682
|
+
sage: from sage.combinat.integer_lists import Envelope
|
|
683
|
+
sage: h = Envelope(3, min_part=2)
|
|
684
|
+
sage: loads(dumps(h)) == h
|
|
685
|
+
True
|
|
686
|
+
"""
|
|
687
|
+
args = (type(self),
|
|
688
|
+
self.sign, self.f, self.f_limit_start, self.precomputed,
|
|
689
|
+
self.max_part, self.min_slope, self.max_slope)
|
|
690
|
+
return _unpickle_Envelope, args
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
def _unpickle_Envelope(type t, _sign, _f, _f_limit_start, _precomputed,
|
|
694
|
+
_max_part, _min_slope, _max_slope):
|
|
695
|
+
"""
|
|
696
|
+
Internal function to support pickling for :class:`Envelope`.
|
|
697
|
+
|
|
698
|
+
EXAMPLES::
|
|
699
|
+
|
|
700
|
+
sage: from sage.combinat.integer_lists.base import Envelope, _unpickle_Envelope
|
|
701
|
+
sage: _unpickle_Envelope(Envelope,
|
|
702
|
+
....: 1, lambda i:i, Infinity, [], 4, -1, 3)
|
|
703
|
+
<sage.combinat.integer_lists.base.Envelope object at ...>
|
|
704
|
+
"""
|
|
705
|
+
cdef Envelope self = t.__new__(t)
|
|
706
|
+
self.sign = _sign
|
|
707
|
+
self.f = _f
|
|
708
|
+
self.f_limit_start = _f_limit_start
|
|
709
|
+
self.precomputed = _precomputed
|
|
710
|
+
self.max_part = _max_part
|
|
711
|
+
self.min_slope = _min_slope
|
|
712
|
+
self.max_slope = _max_slope
|
|
713
|
+
return self
|