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,829 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Integer Range
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Nicolas Borie (2010-03): First release.
|
|
8
|
+
- Florent Hivert (2010-03): Added a class factory + cardinality method.
|
|
9
|
+
- Vincent Delecroix (2012-02): add methods rank/unrank, make it compliant with
|
|
10
|
+
Python int.
|
|
11
|
+
"""
|
|
12
|
+
# ****************************************************************************
|
|
13
|
+
# Copyright (C) 2010 Nicolas Borie <nicolas.borie@math.u-psud.fr>
|
|
14
|
+
#
|
|
15
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
16
|
+
# https://www.gnu.org/licenses/
|
|
17
|
+
# ****************************************************************************
|
|
18
|
+
|
|
19
|
+
from sage.structure.parent import Parent
|
|
20
|
+
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
|
|
21
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
22
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
23
|
+
from sage.sets.finite_enumerated_set import FiniteEnumeratedSet
|
|
24
|
+
from sage.rings.integer import Integer
|
|
25
|
+
from sage.rings.integer_ring import IntegerRing
|
|
26
|
+
from sage.rings.infinity import Infinity, MinusInfinity, PlusInfinity
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class IntegerRange(UniqueRepresentation, Parent):
|
|
30
|
+
r"""
|
|
31
|
+
The class of :class:`Integer <sage.rings.integer.Integer>` ranges.
|
|
32
|
+
|
|
33
|
+
Returns an enumerated set containing an arithmetic progression of integers.
|
|
34
|
+
|
|
35
|
+
INPUT:
|
|
36
|
+
|
|
37
|
+
- ``begin`` -- integer, Infinity or -Infinity
|
|
38
|
+
- ``end`` -- integer, Infinity or -Infinity
|
|
39
|
+
- ``step`` -- a nonzero integer (default: 1)
|
|
40
|
+
- ``middle_point`` -- integer inside the set (default: ``None``)
|
|
41
|
+
|
|
42
|
+
OUTPUT:
|
|
43
|
+
|
|
44
|
+
A parent in the category :class:`FiniteEnumeratedSets()
|
|
45
|
+
<sage.categories.finite_enumerated_sets.FiniteEnumeratedSets>` or
|
|
46
|
+
:class:`InfiniteEnumeratedSets()
|
|
47
|
+
<sage.categories.infinite_enumerated_sets.InfiniteEnumeratedSets>`
|
|
48
|
+
depending on the arguments defining ``self``.
|
|
49
|
+
|
|
50
|
+
``IntegerRange(i, j)`` returns the set of `\{i, i+1, i+2, \dots , j-1\}`.
|
|
51
|
+
``start`` (!) defaults to 0. When ``step`` is given, it specifies the
|
|
52
|
+
increment. The default increment is `1`. IntegerRange allows ``begin`` and
|
|
53
|
+
``end`` to be infinite.
|
|
54
|
+
|
|
55
|
+
``IntegerRange`` is designed to have similar interface Python
|
|
56
|
+
range. However, whereas ``range`` accept and returns Python ``int``,
|
|
57
|
+
``IntegerRange`` deals with :class:`Integer <sage.rings.integer.Integer>`.
|
|
58
|
+
|
|
59
|
+
If ``middle_point`` is given, then the elements are generated starting
|
|
60
|
+
from it, in a alternating way: `\{m, m+1, m-2, m+2, m-2 \dots \}`.
|
|
61
|
+
|
|
62
|
+
EXAMPLES::
|
|
63
|
+
|
|
64
|
+
sage: list(IntegerRange(5))
|
|
65
|
+
[0, 1, 2, 3, 4]
|
|
66
|
+
sage: list(IntegerRange(2,5))
|
|
67
|
+
[2, 3, 4]
|
|
68
|
+
sage: I = IntegerRange(2,100,5); I
|
|
69
|
+
{2, 7, ..., 97}
|
|
70
|
+
sage: list(I)
|
|
71
|
+
[2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97]
|
|
72
|
+
sage: I.category()
|
|
73
|
+
Category of facade finite enumerated sets
|
|
74
|
+
sage: I[1].parent()
|
|
75
|
+
Integer Ring
|
|
76
|
+
|
|
77
|
+
When ``begin`` and ``end`` are both finite, ``IntegerRange(begin, end,
|
|
78
|
+
step)`` is the set whose list of elements is equivalent to the python
|
|
79
|
+
construction ``range(begin, end, step)``::
|
|
80
|
+
|
|
81
|
+
sage: list(IntegerRange(4,105,3)) == list(range(4,105,3))
|
|
82
|
+
True
|
|
83
|
+
sage: list(IntegerRange(-54,13,12)) == list(range(-54,13,12))
|
|
84
|
+
True
|
|
85
|
+
|
|
86
|
+
Except for the type of the numbers::
|
|
87
|
+
|
|
88
|
+
sage: type(IntegerRange(-54,13,12)[0]), type(list(range(-54,13,12))[0])
|
|
89
|
+
(<... 'sage.rings.integer.Integer'>, <... 'int'>)
|
|
90
|
+
|
|
91
|
+
When ``begin`` is finite and ``end`` is +Infinity, ``self`` is the infinite
|
|
92
|
+
arithmetic progression starting from the ``begin`` by step ``step``::
|
|
93
|
+
|
|
94
|
+
sage: I = IntegerRange(54,Infinity,3); I
|
|
95
|
+
{54, 57, ...}
|
|
96
|
+
sage: I.category()
|
|
97
|
+
Category of facade infinite enumerated sets
|
|
98
|
+
sage: p = iter(I)
|
|
99
|
+
sage: (next(p), next(p), next(p), next(p), next(p), next(p))
|
|
100
|
+
(54, 57, 60, 63, 66, 69)
|
|
101
|
+
|
|
102
|
+
sage: I = IntegerRange(54,-Infinity,-3); I
|
|
103
|
+
{54, 51, ...}
|
|
104
|
+
sage: I.category()
|
|
105
|
+
Category of facade infinite enumerated sets
|
|
106
|
+
sage: p = iter(I)
|
|
107
|
+
sage: (next(p), next(p), next(p), next(p), next(p), next(p))
|
|
108
|
+
(54, 51, 48, 45, 42, 39)
|
|
109
|
+
|
|
110
|
+
When ``begin`` and ``end`` are both infinite, you will have to specify the
|
|
111
|
+
extra argument ``middle_point``. ``self`` is then defined by a point
|
|
112
|
+
and a progression/regression setting by ``step``. The enumeration
|
|
113
|
+
is done this way: (let us call `m` the ``middle_point``)
|
|
114
|
+
`\{m, m+step, m-step, m+2step, m-2step, m+3step, \dots \}`::
|
|
115
|
+
|
|
116
|
+
sage: I = IntegerRange(-Infinity,Infinity,37,-12); I
|
|
117
|
+
Integer progression containing -12 with increment 37 and bounded with -Infinity and +Infinity
|
|
118
|
+
sage: I.category()
|
|
119
|
+
Category of facade infinite enumerated sets
|
|
120
|
+
sage: -12 in I
|
|
121
|
+
True
|
|
122
|
+
sage: -15 in I
|
|
123
|
+
False
|
|
124
|
+
sage: p = iter(I)
|
|
125
|
+
sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
|
|
126
|
+
(-12, 25, -49, 62, -86, 99, -123, 136)
|
|
127
|
+
|
|
128
|
+
It is also possible to use the argument ``middle_point`` for other cases, finite
|
|
129
|
+
or infinite. The set will be the same as if you didn't give this extra argument
|
|
130
|
+
but the enumeration will begin with this ``middle_point``::
|
|
131
|
+
|
|
132
|
+
sage: I = IntegerRange(123,-12,-14); I
|
|
133
|
+
{123, 109, ..., -3}
|
|
134
|
+
sage: list(I)
|
|
135
|
+
[123, 109, 95, 81, 67, 53, 39, 25, 11, -3]
|
|
136
|
+
sage: J = IntegerRange(123,-12,-14,25); J
|
|
137
|
+
Integer progression containing 25 with increment -14 and bounded with 123 and -12
|
|
138
|
+
sage: list(J)
|
|
139
|
+
[25, 11, 39, -3, 53, 67, 81, 95, 109, 123]
|
|
140
|
+
|
|
141
|
+
Remember that, like for range, if you define a non empty set, ``begin`` is
|
|
142
|
+
supposed to be included and ``end`` is supposed to be excluded. In the same
|
|
143
|
+
way, when you define a set with a ``middle_point``, the ``begin`` bound will
|
|
144
|
+
be supposed to be included and the ``end`` bound supposed to be excluded::
|
|
145
|
+
|
|
146
|
+
sage: I = IntegerRange(-100,100,10,0)
|
|
147
|
+
sage: J = list(range(-100,100,10))
|
|
148
|
+
sage: 100 in I
|
|
149
|
+
False
|
|
150
|
+
sage: 100 in J
|
|
151
|
+
False
|
|
152
|
+
sage: -100 in I
|
|
153
|
+
True
|
|
154
|
+
sage: -100 in J
|
|
155
|
+
True
|
|
156
|
+
sage: list(I)
|
|
157
|
+
[0, 10, -10, 20, -20, 30, -30, 40, -40, 50, -50, 60, -60, 70, -70, 80, -80, 90, -90, -100]
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
.. NOTE::
|
|
161
|
+
|
|
162
|
+
The input is normalized so that::
|
|
163
|
+
|
|
164
|
+
sage: IntegerRange(1, 6, 2) is IntegerRange(1, 7, 2)
|
|
165
|
+
True
|
|
166
|
+
sage: IntegerRange(1, 8, 3) is IntegerRange(1, 10, 3)
|
|
167
|
+
True
|
|
168
|
+
|
|
169
|
+
TESTS::
|
|
170
|
+
|
|
171
|
+
sage: # Some category automatic tests
|
|
172
|
+
sage: TestSuite(IntegerRange(2,100,3)).run()
|
|
173
|
+
sage: TestSuite(IntegerRange(564,-12,-46)).run()
|
|
174
|
+
sage: TestSuite(IntegerRange(2,Infinity,3)).run()
|
|
175
|
+
sage: TestSuite(IntegerRange(732,-Infinity,-13)).run()
|
|
176
|
+
sage: TestSuite(IntegerRange(-Infinity,Infinity,3,2)).run()
|
|
177
|
+
sage: TestSuite(IntegerRange(56,Infinity,12,80)).run()
|
|
178
|
+
sage: TestSuite(IntegerRange(732,-12,-2743,732)).run()
|
|
179
|
+
sage: # 20 random tests: range and IntegerRange give the same set for finite cases
|
|
180
|
+
sage: for i in range(20):
|
|
181
|
+
....: begin = Integer(randint(-300,300))
|
|
182
|
+
....: end = Integer(randint(-300,300))
|
|
183
|
+
....: step = Integer(randint(-20,20))
|
|
184
|
+
....: if step == 0:
|
|
185
|
+
....: step = Integer(1)
|
|
186
|
+
....: assert list(IntegerRange(begin, end, step)) == list(range(begin, end, step))
|
|
187
|
+
sage: # 20 random tests: range and IntegerRange with middle point for finite cases
|
|
188
|
+
sage: for i in range(20):
|
|
189
|
+
....: begin = Integer(randint(-300,300))
|
|
190
|
+
....: end = Integer(randint(-300,300))
|
|
191
|
+
....: step = Integer(randint(-15,15))
|
|
192
|
+
....: if step == 0:
|
|
193
|
+
....: step = Integer(-3)
|
|
194
|
+
....: I = IntegerRange(begin, end, step)
|
|
195
|
+
....: if I.cardinality() == 0:
|
|
196
|
+
....: assert len(range(begin, end, step)) == 0
|
|
197
|
+
....: else:
|
|
198
|
+
....: TestSuite(I).run()
|
|
199
|
+
....: L1 = list(IntegerRange(begin, end, step, I.an_element()))
|
|
200
|
+
....: L2 = list(range(begin, end, step))
|
|
201
|
+
....: L1.sort()
|
|
202
|
+
....: L2.sort()
|
|
203
|
+
....: assert L1 == L2
|
|
204
|
+
|
|
205
|
+
Thanks to :issue:`8543` empty integer range are allowed::
|
|
206
|
+
|
|
207
|
+
sage: TestSuite(IntegerRange(0, 5, -1)).run()
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
@staticmethod
|
|
211
|
+
def __classcall_private__(cls, begin, end=None, step=Integer(1), middle_point=None):
|
|
212
|
+
"""
|
|
213
|
+
TESTS::
|
|
214
|
+
|
|
215
|
+
sage: IntegerRange(2,5,0)
|
|
216
|
+
Traceback (most recent call last):
|
|
217
|
+
...
|
|
218
|
+
ValueError: IntegerRange() step argument must not be zero
|
|
219
|
+
sage: IntegerRange(2) is IntegerRange(0, 2)
|
|
220
|
+
True
|
|
221
|
+
sage: IntegerRange(1.0) # needs sage.rings.real_mpfr
|
|
222
|
+
Traceback (most recent call last):
|
|
223
|
+
...
|
|
224
|
+
TypeError: end must be Integer or Infinity, not <... 'sage.rings.real_mpfr.RealLiteral'>
|
|
225
|
+
"""
|
|
226
|
+
if isinstance(begin, int):
|
|
227
|
+
begin = Integer(begin)
|
|
228
|
+
if isinstance(end, int):
|
|
229
|
+
end = Integer(end)
|
|
230
|
+
if isinstance(step, int):
|
|
231
|
+
step = Integer(step)
|
|
232
|
+
|
|
233
|
+
if end is None:
|
|
234
|
+
end = begin
|
|
235
|
+
begin = Integer(0)
|
|
236
|
+
# check of the arguments
|
|
237
|
+
if not isinstance(begin, (Integer, MinusInfinity, PlusInfinity)):
|
|
238
|
+
raise TypeError("begin must be Integer or Infinity, not %r" % type(begin))
|
|
239
|
+
if not isinstance(end, (Integer, MinusInfinity, PlusInfinity)):
|
|
240
|
+
raise TypeError("end must be Integer or Infinity, not %r" % type(end))
|
|
241
|
+
if not isinstance(step, Integer):
|
|
242
|
+
raise TypeError("step must be Integer, not %r" % type(step))
|
|
243
|
+
if step.is_zero():
|
|
244
|
+
raise ValueError("IntegerRange() step argument must not be zero")
|
|
245
|
+
|
|
246
|
+
# If begin and end are infinite, middle_point and step will defined the set.
|
|
247
|
+
if begin == -Infinity and end == Infinity:
|
|
248
|
+
if middle_point is None:
|
|
249
|
+
raise ValueError("Can't iterate over this set, please provide middle_point")
|
|
250
|
+
|
|
251
|
+
# If we have a middle point, we go on the special enumeration way...
|
|
252
|
+
if middle_point is not None:
|
|
253
|
+
return IntegerRangeFromMiddle(begin, end, step, middle_point)
|
|
254
|
+
|
|
255
|
+
if begin == -Infinity or begin == Infinity:
|
|
256
|
+
raise ValueError("Can't iterate over this set: It is impossible to begin an enumeration with plus/minus Infinity")
|
|
257
|
+
|
|
258
|
+
# Check for empty sets
|
|
259
|
+
if step > 0 and begin >= end or step < 0 and begin <= end:
|
|
260
|
+
return IntegerRangeEmpty()
|
|
261
|
+
|
|
262
|
+
if end != Infinity and end != -Infinity:
|
|
263
|
+
# Normalize the input
|
|
264
|
+
sgn = 1 if step > 0 else -1
|
|
265
|
+
end = begin + ((end - begin - sgn) // (step) + 1) * step
|
|
266
|
+
return IntegerRangeFinite(begin, end, step)
|
|
267
|
+
else:
|
|
268
|
+
return IntegerRangeInfinite(begin, step)
|
|
269
|
+
|
|
270
|
+
def _element_constructor_(self, el):
|
|
271
|
+
"""
|
|
272
|
+
TESTS::
|
|
273
|
+
|
|
274
|
+
sage: S = IntegerRange(1, 10, 2)
|
|
275
|
+
sage: S(1) #indirect doctest
|
|
276
|
+
1
|
|
277
|
+
sage: S(0) #indirect doctest
|
|
278
|
+
Traceback (most recent call last):
|
|
279
|
+
...
|
|
280
|
+
ValueError: 0 not in {1, 3, 5, 7, 9}
|
|
281
|
+
"""
|
|
282
|
+
if el in self:
|
|
283
|
+
if not isinstance(el, Integer):
|
|
284
|
+
return Integer(el)
|
|
285
|
+
return el
|
|
286
|
+
else:
|
|
287
|
+
raise ValueError("%s not in %s" % (el, self))
|
|
288
|
+
|
|
289
|
+
element_class = Integer
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
class IntegerRangeEmpty(IntegerRange, FiniteEnumeratedSet):
|
|
293
|
+
r"""
|
|
294
|
+
A singleton class for empty integer ranges.
|
|
295
|
+
|
|
296
|
+
See :class:`IntegerRange` for more details.
|
|
297
|
+
"""
|
|
298
|
+
|
|
299
|
+
# Needed because FiniteEnumeratedSet.__classcall__ takes an argument.
|
|
300
|
+
@staticmethod
|
|
301
|
+
def __classcall__(cls, *args):
|
|
302
|
+
"""
|
|
303
|
+
TESTS::
|
|
304
|
+
|
|
305
|
+
sage: from sage.sets.integer_range import IntegerRangeEmpty
|
|
306
|
+
sage: I = IntegerRangeEmpty(); I
|
|
307
|
+
{}
|
|
308
|
+
sage: I.category()
|
|
309
|
+
Category of facade finite enumerated sets
|
|
310
|
+
sage: TestSuite(I).run()
|
|
311
|
+
sage: I(0)
|
|
312
|
+
Traceback (most recent call last):
|
|
313
|
+
...
|
|
314
|
+
ValueError: 0 not in {}
|
|
315
|
+
"""
|
|
316
|
+
return FiniteEnumeratedSet.__classcall__(cls, ())
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
class IntegerRangeFinite(IntegerRange):
|
|
320
|
+
r"""
|
|
321
|
+
The class of finite enumerated sets of integers defined by finite
|
|
322
|
+
arithmetic progressions
|
|
323
|
+
|
|
324
|
+
See :class:`IntegerRange` for more details.
|
|
325
|
+
"""
|
|
326
|
+
def __init__(self, begin, end, step=Integer(1)):
|
|
327
|
+
r"""
|
|
328
|
+
TESTS::
|
|
329
|
+
|
|
330
|
+
sage: I = IntegerRange(123,12,-4)
|
|
331
|
+
sage: I.category()
|
|
332
|
+
Category of facade finite enumerated sets
|
|
333
|
+
sage: TestSuite(I).run()
|
|
334
|
+
"""
|
|
335
|
+
self._begin = begin
|
|
336
|
+
self._end = end
|
|
337
|
+
self._step = step
|
|
338
|
+
Parent.__init__(self, facade=IntegerRing(), category=FiniteEnumeratedSets())
|
|
339
|
+
|
|
340
|
+
def __contains__(self, elt):
|
|
341
|
+
r"""
|
|
342
|
+
Return ``True`` if ``elt`` is in ``self``.
|
|
343
|
+
|
|
344
|
+
EXAMPLES::
|
|
345
|
+
|
|
346
|
+
sage: I = IntegerRange(123,12,-4)
|
|
347
|
+
sage: 123 in I
|
|
348
|
+
True
|
|
349
|
+
sage: 127 in I
|
|
350
|
+
False
|
|
351
|
+
sage: 12 in I
|
|
352
|
+
False
|
|
353
|
+
sage: 13 in I
|
|
354
|
+
False
|
|
355
|
+
sage: 14 in I
|
|
356
|
+
False
|
|
357
|
+
sage: 15 in I
|
|
358
|
+
True
|
|
359
|
+
sage: 11 in I
|
|
360
|
+
False
|
|
361
|
+
"""
|
|
362
|
+
if not isinstance(elt, Integer):
|
|
363
|
+
try:
|
|
364
|
+
x = Integer(elt)
|
|
365
|
+
if x != elt:
|
|
366
|
+
return False
|
|
367
|
+
elt = x
|
|
368
|
+
except (ValueError, TypeError):
|
|
369
|
+
return False
|
|
370
|
+
if abs(self._step).divides(Integer(elt)-self._begin):
|
|
371
|
+
return (self._begin <= elt < self._end and self._step > 0) or \
|
|
372
|
+
(self._begin >= elt > self._end and self._step < 0)
|
|
373
|
+
return False
|
|
374
|
+
|
|
375
|
+
def cardinality(self):
|
|
376
|
+
"""
|
|
377
|
+
Return the cardinality of ``self``.
|
|
378
|
+
|
|
379
|
+
EXAMPLES::
|
|
380
|
+
|
|
381
|
+
sage: IntegerRange(123,12,-4).cardinality()
|
|
382
|
+
28
|
|
383
|
+
sage: IntegerRange(-57,12,8).cardinality()
|
|
384
|
+
9
|
|
385
|
+
sage: IntegerRange(123,12,4).cardinality()
|
|
386
|
+
0
|
|
387
|
+
"""
|
|
388
|
+
return (abs(self._end+self._step-self._begin)-1) // abs(self._step)
|
|
389
|
+
|
|
390
|
+
def _repr_(self):
|
|
391
|
+
"""
|
|
392
|
+
EXAMPLES::
|
|
393
|
+
|
|
394
|
+
sage: IntegerRange(1,2) #indirect doctest
|
|
395
|
+
{1}
|
|
396
|
+
sage: IntegerRange(1,3) #indirect doctest
|
|
397
|
+
{1, 2}
|
|
398
|
+
sage: IntegerRange(1,5) #indirect doctest
|
|
399
|
+
{1, 2, 3, 4}
|
|
400
|
+
sage: IntegerRange(1,6) #indirect doctest
|
|
401
|
+
{1, ..., 5}
|
|
402
|
+
sage: IntegerRange(123,12,-4) #indirect doctest
|
|
403
|
+
{123, 119, ..., 15}
|
|
404
|
+
sage: IntegerRange(-57,1,3) #indirect doctest
|
|
405
|
+
{-57, -54, ..., 0}
|
|
406
|
+
"""
|
|
407
|
+
if self.cardinality() < 6:
|
|
408
|
+
return "{" + ", ".join(str(x) for x in self) + "}"
|
|
409
|
+
if self._step == 1:
|
|
410
|
+
return "{%s, ..., %s}" % (self._begin, self._end - self._step)
|
|
411
|
+
return "{%s, %s, ..., %s}" % (self._begin, self._begin + self._step,
|
|
412
|
+
self._end - self._step)
|
|
413
|
+
|
|
414
|
+
def rank(self, x):
|
|
415
|
+
r"""
|
|
416
|
+
EXAMPLES::
|
|
417
|
+
|
|
418
|
+
sage: I = IntegerRange(-57,36,8)
|
|
419
|
+
sage: I.rank(23)
|
|
420
|
+
10
|
|
421
|
+
sage: I.unrank(10)
|
|
422
|
+
23
|
|
423
|
+
sage: I.rank(22)
|
|
424
|
+
Traceback (most recent call last):
|
|
425
|
+
...
|
|
426
|
+
IndexError: 22 not in self
|
|
427
|
+
sage: I.rank(87)
|
|
428
|
+
Traceback (most recent call last):
|
|
429
|
+
...
|
|
430
|
+
IndexError: 87 not in self
|
|
431
|
+
"""
|
|
432
|
+
if x not in self:
|
|
433
|
+
raise IndexError("%s not in self" % x)
|
|
434
|
+
return Integer((x - self._begin)/self._step)
|
|
435
|
+
|
|
436
|
+
def __getitem__(self, i):
|
|
437
|
+
r"""
|
|
438
|
+
Return the i-th element of this integer range.
|
|
439
|
+
|
|
440
|
+
EXAMPLES::
|
|
441
|
+
|
|
442
|
+
sage: I = IntegerRange(1,13,5)
|
|
443
|
+
sage: I[0], I[1], I[2]
|
|
444
|
+
(1, 6, 11)
|
|
445
|
+
sage: I[3]
|
|
446
|
+
Traceback (most recent call last):
|
|
447
|
+
...
|
|
448
|
+
IndexError: out of range
|
|
449
|
+
sage: I[-1]
|
|
450
|
+
11
|
|
451
|
+
sage: I[-4]
|
|
452
|
+
Traceback (most recent call last):
|
|
453
|
+
...
|
|
454
|
+
IndexError: out of range
|
|
455
|
+
|
|
456
|
+
sage: I = IntegerRange(13,1,-1)
|
|
457
|
+
sage: l = I.list()
|
|
458
|
+
sage: [I[i] for i in range(I.cardinality())] == l
|
|
459
|
+
True
|
|
460
|
+
sage: l.reverse()
|
|
461
|
+
sage: [I[i] for i in range(-1,-I.cardinality()-1,-1)] == l
|
|
462
|
+
True
|
|
463
|
+
"""
|
|
464
|
+
if isinstance(i, slice):
|
|
465
|
+
raise NotImplementedError("not yet")
|
|
466
|
+
|
|
467
|
+
if isinstance(i, int):
|
|
468
|
+
i = Integer(i)
|
|
469
|
+
elif not isinstance(i, Integer):
|
|
470
|
+
raise ValueError("argument should be an integer")
|
|
471
|
+
|
|
472
|
+
if i < 0:
|
|
473
|
+
if i < -self.cardinality():
|
|
474
|
+
raise IndexError("out of range")
|
|
475
|
+
n = (self._end - self._begin)//(self._step)
|
|
476
|
+
return self._begin + (n+i)*self._step
|
|
477
|
+
else:
|
|
478
|
+
if i >= self.cardinality():
|
|
479
|
+
raise IndexError("out of range")
|
|
480
|
+
return self._begin + i * self._step
|
|
481
|
+
|
|
482
|
+
unrank = __getitem__
|
|
483
|
+
|
|
484
|
+
def __iter__(self):
|
|
485
|
+
r"""
|
|
486
|
+
Return an iterator over the elements of ``self``.
|
|
487
|
+
|
|
488
|
+
EXAMPLES::
|
|
489
|
+
|
|
490
|
+
sage: I = IntegerRange(123,12,-4)
|
|
491
|
+
sage: p = iter(I)
|
|
492
|
+
sage: [next(p) for i in range(8)]
|
|
493
|
+
[123, 119, 115, 111, 107, 103, 99, 95]
|
|
494
|
+
sage: I = IntegerRange(-57,12,8)
|
|
495
|
+
sage: p = iter(I)
|
|
496
|
+
sage: [next(p) for i in range(8)]
|
|
497
|
+
[-57, -49, -41, -33, -25, -17, -9, -1]
|
|
498
|
+
"""
|
|
499
|
+
n = self._begin
|
|
500
|
+
if self._step > 0:
|
|
501
|
+
while n < self._end:
|
|
502
|
+
yield n
|
|
503
|
+
n += self._step
|
|
504
|
+
else:
|
|
505
|
+
while n > self._end:
|
|
506
|
+
yield n
|
|
507
|
+
n += self._step
|
|
508
|
+
|
|
509
|
+
def _an_element_(self):
|
|
510
|
+
r"""
|
|
511
|
+
Return an element of ``self``.
|
|
512
|
+
|
|
513
|
+
EXAMPLES::
|
|
514
|
+
|
|
515
|
+
sage: I = IntegerRange(123,12,-4)
|
|
516
|
+
sage: I.an_element() #indirect doctest
|
|
517
|
+
115
|
|
518
|
+
sage: I = IntegerRange(-57,12,8)
|
|
519
|
+
sage: I.an_element() #indirect doctest
|
|
520
|
+
-41
|
|
521
|
+
"""
|
|
522
|
+
p = (self._begin + 2*self._step)
|
|
523
|
+
if p in self:
|
|
524
|
+
return p
|
|
525
|
+
else:
|
|
526
|
+
return self._begin
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
class IntegerRangeInfinite(IntegerRange):
|
|
530
|
+
r""" The class of infinite enumerated sets of integers defined by infinite
|
|
531
|
+
arithmetic progressions.
|
|
532
|
+
|
|
533
|
+
See :class:`IntegerRange` for more details.
|
|
534
|
+
"""
|
|
535
|
+
def __init__(self, begin, step=Integer(1)):
|
|
536
|
+
r"""
|
|
537
|
+
TESTS::
|
|
538
|
+
|
|
539
|
+
sage: I = IntegerRange(-57,Infinity,8)
|
|
540
|
+
sage: I.category()
|
|
541
|
+
Category of facade infinite enumerated sets
|
|
542
|
+
sage: TestSuite(I).run()
|
|
543
|
+
"""
|
|
544
|
+
if not isinstance(begin, Integer):
|
|
545
|
+
raise TypeError("begin should be Integer, not %r" % type(begin))
|
|
546
|
+
self._begin = begin
|
|
547
|
+
self._step = step
|
|
548
|
+
Parent.__init__(self, facade=IntegerRing(), category=InfiniteEnumeratedSets())
|
|
549
|
+
|
|
550
|
+
def _repr_(self):
|
|
551
|
+
r"""
|
|
552
|
+
TESTS::
|
|
553
|
+
|
|
554
|
+
sage: IntegerRange(123,12,-4) #indirect doctest
|
|
555
|
+
{123, 119, ..., 15}
|
|
556
|
+
sage: IntegerRange(-57,1,3) #indirect doctest
|
|
557
|
+
{-57, -54, ..., 0}
|
|
558
|
+
|
|
559
|
+
sage: IntegerRange(-57,Infinity,8) #indirect doctest
|
|
560
|
+
{-57, -49, ...}
|
|
561
|
+
sage: IntegerRange(-112,-Infinity,-13) #indirect doctest
|
|
562
|
+
{-112, -125, ...}
|
|
563
|
+
"""
|
|
564
|
+
return "{%s, %s, ...}" % (self._begin, self._begin+self._step)
|
|
565
|
+
|
|
566
|
+
def __contains__(self, elt):
|
|
567
|
+
r"""
|
|
568
|
+
Return ``True`` if ``elt`` is in ``self``.
|
|
569
|
+
|
|
570
|
+
EXAMPLES::
|
|
571
|
+
|
|
572
|
+
sage: I = IntegerRange(-57,Infinity,8)
|
|
573
|
+
sage: -57 in I
|
|
574
|
+
True
|
|
575
|
+
sage: -65 in I
|
|
576
|
+
False
|
|
577
|
+
sage: -49 in I
|
|
578
|
+
True
|
|
579
|
+
sage: 743 in I
|
|
580
|
+
True
|
|
581
|
+
"""
|
|
582
|
+
if not isinstance(elt, Integer):
|
|
583
|
+
try:
|
|
584
|
+
elt = Integer(elt)
|
|
585
|
+
except (TypeError, ValueError):
|
|
586
|
+
return False
|
|
587
|
+
if abs(self._step).divides(Integer(elt)-self._begin):
|
|
588
|
+
return (self._step > 0 and elt >= self._begin) or \
|
|
589
|
+
(self._step < 0 and elt <= self._begin)
|
|
590
|
+
return False
|
|
591
|
+
|
|
592
|
+
def rank(self, x):
|
|
593
|
+
r"""
|
|
594
|
+
EXAMPLES::
|
|
595
|
+
|
|
596
|
+
sage: I = IntegerRange(-57,Infinity,8)
|
|
597
|
+
sage: I.rank(23)
|
|
598
|
+
10
|
|
599
|
+
sage: I.unrank(10)
|
|
600
|
+
23
|
|
601
|
+
sage: I.rank(22)
|
|
602
|
+
Traceback (most recent call last):
|
|
603
|
+
...
|
|
604
|
+
IndexError: 22 not in self
|
|
605
|
+
"""
|
|
606
|
+
if x not in self:
|
|
607
|
+
raise IndexError("%s not in self" % x)
|
|
608
|
+
return Integer((x - self._begin)/self._step)
|
|
609
|
+
|
|
610
|
+
def __getitem__(self, i):
|
|
611
|
+
r"""
|
|
612
|
+
Return the ``i``-th element of ``self``.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: I = IntegerRange(-8,Infinity,3)
|
|
617
|
+
sage: I.unrank(1)
|
|
618
|
+
-5
|
|
619
|
+
"""
|
|
620
|
+
if isinstance(i, slice):
|
|
621
|
+
raise NotImplementedError("not yet")
|
|
622
|
+
|
|
623
|
+
if isinstance(i, int):
|
|
624
|
+
i = Integer(i)
|
|
625
|
+
elif not isinstance(i, Integer):
|
|
626
|
+
raise ValueError
|
|
627
|
+
|
|
628
|
+
if i < 0:
|
|
629
|
+
raise IndexError("out of range")
|
|
630
|
+
else:
|
|
631
|
+
return self._begin + i * self._step
|
|
632
|
+
|
|
633
|
+
unrank = __getitem__
|
|
634
|
+
|
|
635
|
+
def __iter__(self):
|
|
636
|
+
r"""
|
|
637
|
+
Return an iterator over the elements of ``self``.
|
|
638
|
+
|
|
639
|
+
EXAMPLES::
|
|
640
|
+
|
|
641
|
+
sage: I = IntegerRange(-57,Infinity,8)
|
|
642
|
+
sage: p = iter(I)
|
|
643
|
+
sage: [next(p) for i in range(8)]
|
|
644
|
+
[-57, -49, -41, -33, -25, -17, -9, -1]
|
|
645
|
+
|
|
646
|
+
sage: I = IntegerRange(-112,-Infinity,-13)
|
|
647
|
+
sage: p = iter(I)
|
|
648
|
+
sage: [next(p) for i in range(8)]
|
|
649
|
+
[-112, -125, -138, -151, -164, -177, -190, -203]
|
|
650
|
+
"""
|
|
651
|
+
n = self._begin
|
|
652
|
+
while True:
|
|
653
|
+
yield n
|
|
654
|
+
n += self._step
|
|
655
|
+
|
|
656
|
+
def _an_element_(self):
|
|
657
|
+
r"""
|
|
658
|
+
Return an element of ``self``.
|
|
659
|
+
|
|
660
|
+
EXAMPLES::
|
|
661
|
+
|
|
662
|
+
sage: I = IntegerRange(-57,Infinity,8)
|
|
663
|
+
sage: I.an_element() #indirect doctest
|
|
664
|
+
191
|
|
665
|
+
|
|
666
|
+
sage: I = IntegerRange(-112,-Infinity,-13)
|
|
667
|
+
sage: I.an_element() #indirect doctest
|
|
668
|
+
-515
|
|
669
|
+
"""
|
|
670
|
+
return self._begin + 31*self._step
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
class IntegerRangeFromMiddle(IntegerRange):
|
|
674
|
+
r"""
|
|
675
|
+
The class of finite or infinite enumerated sets defined with
|
|
676
|
+
an inside point, a progression and two limits.
|
|
677
|
+
|
|
678
|
+
See :class:`IntegerRange` for more details.
|
|
679
|
+
"""
|
|
680
|
+
def __init__(self, begin, end, step=Integer(1), middle_point=Integer(1)):
|
|
681
|
+
r"""
|
|
682
|
+
TESTS::
|
|
683
|
+
|
|
684
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
685
|
+
sage: I = IntegerRangeFromMiddle(-100,100,10,0)
|
|
686
|
+
sage: I.category()
|
|
687
|
+
Category of facade finite enumerated sets
|
|
688
|
+
sage: TestSuite(I).run()
|
|
689
|
+
sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
|
|
690
|
+
sage: I.category()
|
|
691
|
+
Category of facade infinite enumerated sets
|
|
692
|
+
sage: TestSuite(I).run()
|
|
693
|
+
|
|
694
|
+
sage: IntegerRange(0, 5, 1, -3)
|
|
695
|
+
Traceback (most recent call last):
|
|
696
|
+
...
|
|
697
|
+
ValueError: middle_point is not in the interval
|
|
698
|
+
"""
|
|
699
|
+
self._begin = begin
|
|
700
|
+
self._end = end
|
|
701
|
+
self._step = step
|
|
702
|
+
self._middle_point = middle_point
|
|
703
|
+
if middle_point not in self:
|
|
704
|
+
raise ValueError("middle_point is not in the interval")
|
|
705
|
+
|
|
706
|
+
if (begin != Infinity and begin != -Infinity and
|
|
707
|
+
end != Infinity and end != -Infinity):
|
|
708
|
+
cat = FiniteEnumeratedSets()
|
|
709
|
+
else:
|
|
710
|
+
cat = InfiniteEnumeratedSets()
|
|
711
|
+
|
|
712
|
+
Parent.__init__(self, facade=IntegerRing(), category=cat)
|
|
713
|
+
|
|
714
|
+
def _repr_(self):
|
|
715
|
+
r"""
|
|
716
|
+
TESTS::
|
|
717
|
+
|
|
718
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
719
|
+
sage: IntegerRangeFromMiddle(Infinity,-Infinity,-37,0) #indirect doctest
|
|
720
|
+
Integer progression containing 0 with increment -37 and bounded with +Infinity and -Infinity
|
|
721
|
+
sage: IntegerRangeFromMiddle(-100,100,10,0) #indirect doctest
|
|
722
|
+
Integer progression containing 0 with increment 10 and bounded with -100 and 100
|
|
723
|
+
"""
|
|
724
|
+
return "Integer progression containing %s with increment %s and bounded with %s and %s" % (
|
|
725
|
+
self._middle_point, self._step, self._begin, self._end)
|
|
726
|
+
|
|
727
|
+
def __contains__(self, elt):
|
|
728
|
+
r"""
|
|
729
|
+
Return ``True`` if ``elt`` is in ``self``.
|
|
730
|
+
|
|
731
|
+
EXAMPLES::
|
|
732
|
+
|
|
733
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
734
|
+
sage: I = IntegerRangeFromMiddle(-100,100,10,0)
|
|
735
|
+
sage: -110 in I
|
|
736
|
+
False
|
|
737
|
+
sage: -100 in I
|
|
738
|
+
True
|
|
739
|
+
sage: 30 in I
|
|
740
|
+
True
|
|
741
|
+
sage: 90 in I
|
|
742
|
+
True
|
|
743
|
+
sage: 100 in I
|
|
744
|
+
False
|
|
745
|
+
"""
|
|
746
|
+
if not isinstance(elt, Integer):
|
|
747
|
+
try:
|
|
748
|
+
elt = Integer(elt)
|
|
749
|
+
except (TypeError, ValueError):
|
|
750
|
+
return False
|
|
751
|
+
if abs(self._step).divides(Integer(elt)-self._middle_point):
|
|
752
|
+
return (self._begin <= elt < self._end) or \
|
|
753
|
+
(self._begin >= elt > self._end)
|
|
754
|
+
return False
|
|
755
|
+
|
|
756
|
+
def next(self, elt):
|
|
757
|
+
r"""
|
|
758
|
+
Return the next element of ``elt`` in ``self``.
|
|
759
|
+
|
|
760
|
+
EXAMPLES::
|
|
761
|
+
|
|
762
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
763
|
+
sage: I = IntegerRangeFromMiddle(-100,100,10,0)
|
|
764
|
+
sage: (I.next(0), I.next(10), I.next(-10), I.next(20), I.next(-100))
|
|
765
|
+
(10, -10, 20, -20, None)
|
|
766
|
+
sage: I = IntegerRangeFromMiddle(-Infinity,Infinity,10,0)
|
|
767
|
+
sage: (I.next(0), I.next(10), I.next(-10), I.next(20), I.next(-100))
|
|
768
|
+
(10, -10, 20, -20, 110)
|
|
769
|
+
sage: I.next(1)
|
|
770
|
+
Traceback (most recent call last):
|
|
771
|
+
...
|
|
772
|
+
LookupError: 1 not in Integer progression containing 0 with increment 10 and bounded with -Infinity and +Infinity
|
|
773
|
+
"""
|
|
774
|
+
if elt not in self:
|
|
775
|
+
raise LookupError('%r not in %r' % (elt, self))
|
|
776
|
+
n = self._middle_point
|
|
777
|
+
if (elt <= n and self._step > 0) or (elt >= n and self._step < 0):
|
|
778
|
+
right = 2*n-elt+self._step
|
|
779
|
+
if right in self:
|
|
780
|
+
return right
|
|
781
|
+
else:
|
|
782
|
+
left = elt-self._step
|
|
783
|
+
if left in self:
|
|
784
|
+
return left
|
|
785
|
+
else:
|
|
786
|
+
left = 2*n-elt
|
|
787
|
+
if left in self:
|
|
788
|
+
return left
|
|
789
|
+
else:
|
|
790
|
+
right = elt+self._step
|
|
791
|
+
if right in self:
|
|
792
|
+
return right
|
|
793
|
+
|
|
794
|
+
def __iter__(self):
|
|
795
|
+
r"""
|
|
796
|
+
Return an iterator over the elements of ``self``.
|
|
797
|
+
|
|
798
|
+
EXAMPLES::
|
|
799
|
+
|
|
800
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
801
|
+
sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
|
|
802
|
+
sage: p = iter(I)
|
|
803
|
+
sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
|
|
804
|
+
(0, -37, 37, -74, 74, -111, 111, -148)
|
|
805
|
+
sage: I = IntegerRangeFromMiddle(-12,214,10,0)
|
|
806
|
+
sage: p = iter(I)
|
|
807
|
+
sage: (next(p), next(p), next(p), next(p), next(p), next(p), next(p), next(p))
|
|
808
|
+
(0, 10, -10, 20, 30, 40, 50, 60)
|
|
809
|
+
"""
|
|
810
|
+
n = self._middle_point
|
|
811
|
+
while n is not None:
|
|
812
|
+
yield n
|
|
813
|
+
n = self.next(n)
|
|
814
|
+
|
|
815
|
+
def _an_element_(self):
|
|
816
|
+
r"""
|
|
817
|
+
Return an element of ``self``.
|
|
818
|
+
|
|
819
|
+
EXAMPLES::
|
|
820
|
+
|
|
821
|
+
sage: from sage.sets.integer_range import IntegerRangeFromMiddle
|
|
822
|
+
sage: I = IntegerRangeFromMiddle(Infinity,-Infinity,-37,0)
|
|
823
|
+
sage: I.an_element() #indirect doctest
|
|
824
|
+
0
|
|
825
|
+
sage: I = IntegerRangeFromMiddle(-12,214,10,0)
|
|
826
|
+
sage: I.an_element() #indirect doctest
|
|
827
|
+
0
|
|
828
|
+
"""
|
|
829
|
+
return self._middle_point
|