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
sage/misc/mrange.py
ADDED
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Multidimensional enumeration
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Joel B. Mohler (2006-10-12)
|
|
8
|
+
|
|
9
|
+
- William Stein (2006-07-19)
|
|
10
|
+
|
|
11
|
+
- Jon Hanke
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# *****************************************************************************
|
|
15
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
16
|
+
#
|
|
17
|
+
# This program is free software: you can redistribute it and/or modify
|
|
18
|
+
# it under the terms of the GNU General Public License as published by
|
|
19
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
20
|
+
# (at your option) any later version.
|
|
21
|
+
# http://www.gnu.org/licenses/
|
|
22
|
+
# *****************************************************************************
|
|
23
|
+
from sage.misc.misc_c import prod
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _len(L):
|
|
27
|
+
"""
|
|
28
|
+
Determines the length of ``L``.
|
|
29
|
+
|
|
30
|
+
Uses either ``cardinality`` or ``__len__`` as appropriate.
|
|
31
|
+
|
|
32
|
+
EXAMPLES::
|
|
33
|
+
|
|
34
|
+
sage: from sage.misc.mrange import _len
|
|
35
|
+
sage: _len(ZZ)
|
|
36
|
+
+Infinity
|
|
37
|
+
sage: _len(range(4))
|
|
38
|
+
4
|
|
39
|
+
sage: _len(4)
|
|
40
|
+
Traceback (most recent call last):
|
|
41
|
+
...
|
|
42
|
+
TypeError: object of type 'sage.rings.integer.Integer' has no len()
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
return L.cardinality()
|
|
46
|
+
except AttributeError:
|
|
47
|
+
return len(L)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _is_finite(L, fallback=True):
|
|
51
|
+
"""
|
|
52
|
+
Determines whether ``L`` is finite.
|
|
53
|
+
|
|
54
|
+
If ``L`` implements none of ``is_finite``, ``cardinality`` or
|
|
55
|
+
``__len__``, we assume by default that it is finite for speed
|
|
56
|
+
reasons. This choice can be overridden by passing in
|
|
57
|
+
``fallback``.
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: from sage.misc.mrange import _is_finite
|
|
62
|
+
sage: _is_finite(ZZ)
|
|
63
|
+
False
|
|
64
|
+
sage: _is_finite(range(4))
|
|
65
|
+
True
|
|
66
|
+
sage: _is_finite([])
|
|
67
|
+
True
|
|
68
|
+
sage: _is_finite(range(10^8))
|
|
69
|
+
True
|
|
70
|
+
sage: from itertools import product
|
|
71
|
+
sage: _is_finite(product([1],[1])) # does not provide is_finite() or __len__()
|
|
72
|
+
True
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
return L.is_finite()
|
|
76
|
+
except AttributeError:
|
|
77
|
+
pass
|
|
78
|
+
except ValueError:
|
|
79
|
+
# L doesn't know how to determine whether it's finite
|
|
80
|
+
return fallback
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
n = _len(L)
|
|
84
|
+
except (TypeError, AttributeError, NotImplementedError):
|
|
85
|
+
# We usually assume L is finite for speed reasons
|
|
86
|
+
return fallback
|
|
87
|
+
|
|
88
|
+
from sage.rings.infinity import infinity
|
|
89
|
+
if n is infinity:
|
|
90
|
+
return False
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _xmrange_iter(iter_list, typ=list):
|
|
95
|
+
"""
|
|
96
|
+
This implements the logic for :func:`mrange_iter` and :class:`xmrange_iter`.
|
|
97
|
+
|
|
98
|
+
Note that with typ==list, we will be returning a new copy each
|
|
99
|
+
iteration. This makes it OK to modified the returned list. This
|
|
100
|
+
functionality is relied on in the polynomial iterators. Here's a
|
|
101
|
+
doc-test to prove this::
|
|
102
|
+
|
|
103
|
+
sage: iter = sage.misc.mrange._xmrange_iter( [[1,2],[1,3]] )
|
|
104
|
+
sage: l1 = next(iter)
|
|
105
|
+
sage: l2 = next(iter)
|
|
106
|
+
sage: l1 is l2
|
|
107
|
+
False
|
|
108
|
+
|
|
109
|
+
However, if you would like to reuse the list object::
|
|
110
|
+
|
|
111
|
+
sage: iter = sage.misc.mrange._xmrange_iter( [[1,2],[1,3]], lambda x: x )
|
|
112
|
+
sage: l1 = next(iter)
|
|
113
|
+
sage: l2 = next(iter)
|
|
114
|
+
sage: l1 is l2 # eeek, this is freaky!
|
|
115
|
+
True
|
|
116
|
+
|
|
117
|
+
We check that :issue:`14285` has been resolved::
|
|
118
|
+
|
|
119
|
+
sage: iter = sage.misc.mrange._xmrange_iter([ZZ,[]])
|
|
120
|
+
sage: next(iter)
|
|
121
|
+
Traceback (most recent call last):
|
|
122
|
+
...
|
|
123
|
+
StopIteration
|
|
124
|
+
|
|
125
|
+
We check that :issue:`28521` is fixed::
|
|
126
|
+
|
|
127
|
+
sage: next(sage.misc.mrange._xmrange_iter([[], [1]]))
|
|
128
|
+
Traceback (most recent call last):
|
|
129
|
+
...
|
|
130
|
+
StopIteration
|
|
131
|
+
sage: next(sage.misc.mrange._xmrange_iter([[1], []]))
|
|
132
|
+
Traceback (most recent call last):
|
|
133
|
+
...
|
|
134
|
+
StopIteration
|
|
135
|
+
sage: next(sage.misc.mrange._xmrange_iter([[1], [], [2]]))
|
|
136
|
+
Traceback (most recent call last):
|
|
137
|
+
...
|
|
138
|
+
StopIteration
|
|
139
|
+
"""
|
|
140
|
+
if len(iter_list) == 0:
|
|
141
|
+
yield typ()
|
|
142
|
+
return
|
|
143
|
+
# If any iterator in the list is infinite we need to be more careful
|
|
144
|
+
if any(not _is_finite(L) for L in iter_list):
|
|
145
|
+
for L in iter_list:
|
|
146
|
+
try:
|
|
147
|
+
n = _len(L)
|
|
148
|
+
except TypeError:
|
|
149
|
+
continue
|
|
150
|
+
if n == 0:
|
|
151
|
+
return
|
|
152
|
+
curr_iters = [iter(i) for i in iter_list]
|
|
153
|
+
try:
|
|
154
|
+
curr_elt = [next(i) for i in curr_iters[:-1]]
|
|
155
|
+
except StopIteration:
|
|
156
|
+
return
|
|
157
|
+
curr_elt.append(None)
|
|
158
|
+
place = len(iter_list) - 1
|
|
159
|
+
while True:
|
|
160
|
+
try:
|
|
161
|
+
while True:
|
|
162
|
+
curr_elt[place] = next(curr_iters[place])
|
|
163
|
+
if place < len(iter_list) - 1:
|
|
164
|
+
place += 1
|
|
165
|
+
curr_iters[place] = iter(iter_list[place])
|
|
166
|
+
continue
|
|
167
|
+
else:
|
|
168
|
+
yield typ(curr_elt)
|
|
169
|
+
except StopIteration:
|
|
170
|
+
place -= 1
|
|
171
|
+
if place == -1:
|
|
172
|
+
return
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def mrange_iter(iter_list, typ=list):
|
|
176
|
+
"""
|
|
177
|
+
Return the multirange list derived from the given list of iterators.
|
|
178
|
+
|
|
179
|
+
This is the list version of :func:`xmrange_iter`. Use :class:`xmrange_iter`
|
|
180
|
+
for the iterator.
|
|
181
|
+
|
|
182
|
+
More precisely, return the iterator over all objects of type ``typ`` of
|
|
183
|
+
n-tuples of Python ints with entries between 0 and the integers in
|
|
184
|
+
the sizes list. The iterator is empty if sizes is empty or contains
|
|
185
|
+
any nonpositive integer.
|
|
186
|
+
|
|
187
|
+
INPUT:
|
|
188
|
+
|
|
189
|
+
- ``iter_list`` -- a finite iterable of finite iterables
|
|
190
|
+
|
|
191
|
+
- ``typ`` -- (default: list) a type or class; more
|
|
192
|
+
generally, something that can be called with a list as input
|
|
193
|
+
|
|
194
|
+
OUTPUT: list
|
|
195
|
+
|
|
196
|
+
EXAMPLES::
|
|
197
|
+
|
|
198
|
+
sage: mrange_iter([range(3),[0,2]])
|
|
199
|
+
[[0, 0], [0, 2], [1, 0], [1, 2], [2, 0], [2, 2]]
|
|
200
|
+
sage: mrange_iter([['Monty','Flying'],['Python','Circus']], tuple)
|
|
201
|
+
[('Monty', 'Python'), ('Monty', 'Circus'), ('Flying', 'Python'), ('Flying', 'Circus')]
|
|
202
|
+
sage: mrange_iter([[2,3,5,7],[1,2]], sum)
|
|
203
|
+
[3, 4, 4, 5, 6, 7, 8, 9]
|
|
204
|
+
|
|
205
|
+
Examples that illustrate empty multi-ranges::
|
|
206
|
+
|
|
207
|
+
sage: mrange_iter([range(5),range(3),range(0)])
|
|
208
|
+
[]
|
|
209
|
+
sage: mrange_iter([range(5), range(3), range(-2)])
|
|
210
|
+
[]
|
|
211
|
+
|
|
212
|
+
This example is not empty, and should not be. See :issue:`6561`.
|
|
213
|
+
|
|
214
|
+
::
|
|
215
|
+
|
|
216
|
+
sage: mrange_iter([])
|
|
217
|
+
[[]]
|
|
218
|
+
|
|
219
|
+
AUTHORS:
|
|
220
|
+
|
|
221
|
+
- Joel B. Mohler
|
|
222
|
+
"""
|
|
223
|
+
return list(_xmrange_iter(iter_list, typ))
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class xmrange_iter:
|
|
227
|
+
"""
|
|
228
|
+
Return the multirange iterate derived from the given iterators and
|
|
229
|
+
type.
|
|
230
|
+
|
|
231
|
+
.. NOTE::
|
|
232
|
+
|
|
233
|
+
This basically gives you the Cartesian product of sets.
|
|
234
|
+
|
|
235
|
+
More precisely, return the iterator over all objects of type typ of
|
|
236
|
+
n-tuples of Python ints with entries between 0 and the integers in
|
|
237
|
+
the sizes list. The iterator is empty if sizes is empty or contains
|
|
238
|
+
any nonpositive integer.
|
|
239
|
+
|
|
240
|
+
Use :func:`mrange_iter` for the non-iterator form.
|
|
241
|
+
|
|
242
|
+
INPUT:
|
|
243
|
+
|
|
244
|
+
- ``iter_list`` -- list of objects usable as iterators (possibly
|
|
245
|
+
lists)
|
|
246
|
+
|
|
247
|
+
- ``typ`` -- (default: list) a type or class; more generally,
|
|
248
|
+
something that can be called with a list as input
|
|
249
|
+
|
|
250
|
+
OUTPUT: a generator
|
|
251
|
+
|
|
252
|
+
EXAMPLES: We create multi-range iterators, print them and also
|
|
253
|
+
iterate through a tuple version. ::
|
|
254
|
+
|
|
255
|
+
sage: z = xmrange_iter([list(range(3)),list(range(2))], tuple);z
|
|
256
|
+
xmrange_iter([[0, 1, 2], [0, 1]], <... 'tuple'>)
|
|
257
|
+
sage: for a in z:
|
|
258
|
+
....: print(a)
|
|
259
|
+
(0, 0)
|
|
260
|
+
(0, 1)
|
|
261
|
+
(1, 0)
|
|
262
|
+
(1, 1)
|
|
263
|
+
(2, 0)
|
|
264
|
+
(2, 1)
|
|
265
|
+
|
|
266
|
+
We illustrate a few more iterations.
|
|
267
|
+
|
|
268
|
+
::
|
|
269
|
+
|
|
270
|
+
sage: list(xmrange_iter([range(3),range(2)]))
|
|
271
|
+
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
|
|
272
|
+
sage: list(xmrange_iter([range(3),range(2)], tuple))
|
|
273
|
+
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
|
|
274
|
+
|
|
275
|
+
Here we compute the sum of each element of the multi-range
|
|
276
|
+
iterator::
|
|
277
|
+
|
|
278
|
+
sage: list(xmrange_iter([range(3),range(2)], sum))
|
|
279
|
+
[0, 1, 1, 2, 2, 3]
|
|
280
|
+
|
|
281
|
+
Next we compute the product::
|
|
282
|
+
|
|
283
|
+
sage: list(xmrange_iter([range(3),range(2)], prod))
|
|
284
|
+
[0, 0, 0, 1, 0, 2]
|
|
285
|
+
|
|
286
|
+
Examples that illustrate empty multi-ranges.
|
|
287
|
+
|
|
288
|
+
::
|
|
289
|
+
|
|
290
|
+
sage: list(xmrange_iter([range(5),range(3),range(-2)]))
|
|
291
|
+
[]
|
|
292
|
+
sage: list(xmrange_iter([range(5),range(3),range(0)]))
|
|
293
|
+
[]
|
|
294
|
+
|
|
295
|
+
This example is not empty, and should not be. See :issue:`6561`.
|
|
296
|
+
|
|
297
|
+
::
|
|
298
|
+
|
|
299
|
+
sage: list(xmrange_iter([]))
|
|
300
|
+
[[]]
|
|
301
|
+
|
|
302
|
+
We use a multi-range iterator to iterate through the Cartesian
|
|
303
|
+
product of sets.
|
|
304
|
+
|
|
305
|
+
::
|
|
306
|
+
|
|
307
|
+
sage: X = ['red', 'apple', 389]
|
|
308
|
+
sage: Y = ['orange', 'horse']
|
|
309
|
+
sage: for i,j in xmrange_iter([X, Y], tuple):
|
|
310
|
+
....: print((i, j))
|
|
311
|
+
('red', 'orange')
|
|
312
|
+
('red', 'horse')
|
|
313
|
+
('apple', 'orange')
|
|
314
|
+
('apple', 'horse')
|
|
315
|
+
(389, 'orange')
|
|
316
|
+
(389, 'horse')
|
|
317
|
+
|
|
318
|
+
AUTHORS:
|
|
319
|
+
|
|
320
|
+
- Joel B. Mohler
|
|
321
|
+
"""
|
|
322
|
+
def __init__(self, iter_list, typ=list):
|
|
323
|
+
self.iter_list = iter_list
|
|
324
|
+
self.typ = typ
|
|
325
|
+
|
|
326
|
+
def __repr__(self):
|
|
327
|
+
if self.typ == list:
|
|
328
|
+
return 'xmrange_iter(%s)' % self.iter_list
|
|
329
|
+
else:
|
|
330
|
+
return 'xmrange_iter(%s, %s)' % (self.iter_list, self.typ)
|
|
331
|
+
|
|
332
|
+
def __iter__(self):
|
|
333
|
+
return _xmrange_iter(self.iter_list, self.typ)
|
|
334
|
+
|
|
335
|
+
def __len__(self):
|
|
336
|
+
"""
|
|
337
|
+
Return the cardinality of this iterator as an int.
|
|
338
|
+
|
|
339
|
+
This raises a :exc:`TypeError` if the cardinality does not fit
|
|
340
|
+
into a Python int.
|
|
341
|
+
|
|
342
|
+
EXAMPLES::
|
|
343
|
+
|
|
344
|
+
sage: C = cartesian_product_iterator([range(3),range(4)])
|
|
345
|
+
sage: len(C)
|
|
346
|
+
12
|
|
347
|
+
sage: len(cartesian_product_iterator([]))
|
|
348
|
+
1
|
|
349
|
+
sage: len(cartesian_product_iterator([ZZ,[]]))
|
|
350
|
+
0
|
|
351
|
+
sage: len(cartesian_product_iterator([ZZ,ZZ]))
|
|
352
|
+
Traceback (most recent call last):
|
|
353
|
+
...
|
|
354
|
+
TypeError: cardinality does not fit into a Python int
|
|
355
|
+
"""
|
|
356
|
+
n = self.cardinality()
|
|
357
|
+
try:
|
|
358
|
+
n = int(n)
|
|
359
|
+
except TypeError:
|
|
360
|
+
raise TypeError("cardinality does not fit into a Python int")
|
|
361
|
+
return n
|
|
362
|
+
|
|
363
|
+
def cardinality(self):
|
|
364
|
+
"""
|
|
365
|
+
Return the cardinality of this iterator.
|
|
366
|
+
|
|
367
|
+
EXAMPLES::
|
|
368
|
+
|
|
369
|
+
sage: C = cartesian_product_iterator([range(3),range(4)])
|
|
370
|
+
sage: C.cardinality()
|
|
371
|
+
12
|
|
372
|
+
sage: C = cartesian_product_iterator([ZZ,QQ])
|
|
373
|
+
sage: C.cardinality()
|
|
374
|
+
+Infinity
|
|
375
|
+
sage: C = cartesian_product_iterator([ZZ,[]])
|
|
376
|
+
sage: C.cardinality()
|
|
377
|
+
0
|
|
378
|
+
"""
|
|
379
|
+
from sage.rings.integer import Integer
|
|
380
|
+
from sage.rings.infinity import infinity
|
|
381
|
+
ans = Integer(1)
|
|
382
|
+
found_infinity = False
|
|
383
|
+
for L in self.iter_list:
|
|
384
|
+
try:
|
|
385
|
+
n = L.cardinality()
|
|
386
|
+
except AttributeError:
|
|
387
|
+
n = Integer(len(L))
|
|
388
|
+
if n == 0:
|
|
389
|
+
return Integer(0)
|
|
390
|
+
elif n is infinity:
|
|
391
|
+
found_infinity = True
|
|
392
|
+
elif not found_infinity:
|
|
393
|
+
ans *= n
|
|
394
|
+
if found_infinity:
|
|
395
|
+
return infinity
|
|
396
|
+
else:
|
|
397
|
+
return ans
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def _xmrange(sizes, typ=list):
|
|
401
|
+
n = len(sizes)
|
|
402
|
+
if n == 0:
|
|
403
|
+
yield typ([])
|
|
404
|
+
return
|
|
405
|
+
for i in sizes:
|
|
406
|
+
if i <= 0:
|
|
407
|
+
return
|
|
408
|
+
v = [0] * n # make a list of n 0's.
|
|
409
|
+
v[-1] = -1
|
|
410
|
+
ptr_max = n - 1
|
|
411
|
+
ptr = ptr_max
|
|
412
|
+
while True:
|
|
413
|
+
while True:
|
|
414
|
+
if ptr != -1 and v[ptr] + 1 < sizes[ptr]:
|
|
415
|
+
v[ptr] += 1
|
|
416
|
+
ptr = ptr_max
|
|
417
|
+
break
|
|
418
|
+
elif ptr != -1:
|
|
419
|
+
v[ptr] = 0
|
|
420
|
+
ptr -= 1
|
|
421
|
+
else:
|
|
422
|
+
return
|
|
423
|
+
yield typ(v) # make a copy of v!
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def mrange(sizes, typ=list):
|
|
427
|
+
"""
|
|
428
|
+
Return the multirange list with given sizes and type.
|
|
429
|
+
|
|
430
|
+
This is the list version of :class:`xmrange`.
|
|
431
|
+
Use :class:`xmrange` for the iterator.
|
|
432
|
+
|
|
433
|
+
More precisely, return the iterator over all objects of type typ of
|
|
434
|
+
n-tuples of Python ints with entries between 0 and the integers in
|
|
435
|
+
the sizes list. The iterator is empty if sizes is empty or contains
|
|
436
|
+
any nonpositive integer.
|
|
437
|
+
|
|
438
|
+
INPUT:
|
|
439
|
+
|
|
440
|
+
- ``sizes`` -- list of nonnegative integers
|
|
441
|
+
|
|
442
|
+
- ``typ`` -- (default: list) a type or class; more
|
|
443
|
+
generally, something that can be called with a list as input
|
|
444
|
+
|
|
445
|
+
OUTPUT: list
|
|
446
|
+
|
|
447
|
+
EXAMPLES::
|
|
448
|
+
|
|
449
|
+
sage: mrange([3,2])
|
|
450
|
+
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
|
|
451
|
+
sage: mrange([3,2], tuple)
|
|
452
|
+
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
|
|
453
|
+
sage: mrange([3,2], sum)
|
|
454
|
+
[0, 1, 1, 2, 2, 3]
|
|
455
|
+
|
|
456
|
+
Examples that illustrate empty multi-ranges::
|
|
457
|
+
|
|
458
|
+
sage: mrange([5,3,-2])
|
|
459
|
+
[]
|
|
460
|
+
sage: mrange([5,3,0])
|
|
461
|
+
[]
|
|
462
|
+
|
|
463
|
+
This example is not empty, and should not be. See :issue:`6561`.
|
|
464
|
+
|
|
465
|
+
::
|
|
466
|
+
|
|
467
|
+
sage: mrange([])
|
|
468
|
+
[[]]
|
|
469
|
+
|
|
470
|
+
AUTHORS:
|
|
471
|
+
|
|
472
|
+
- Jon Hanke
|
|
473
|
+
|
|
474
|
+
- William Stein
|
|
475
|
+
"""
|
|
476
|
+
return list(_xmrange(sizes, typ))
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
class xmrange:
|
|
480
|
+
"""
|
|
481
|
+
Return the multirange iterate with given sizes and type.
|
|
482
|
+
|
|
483
|
+
More precisely, return the iterator over all objects of type typ of
|
|
484
|
+
n-tuples of Python ints with entries between 0 and the integers in
|
|
485
|
+
the sizes list. The iterator is empty if sizes is empty or contains
|
|
486
|
+
any nonpositive integer.
|
|
487
|
+
|
|
488
|
+
Use mrange for the non-iterator form.
|
|
489
|
+
|
|
490
|
+
INPUT:
|
|
491
|
+
|
|
492
|
+
- ``sizes`` -- list of nonnegative integers
|
|
493
|
+
|
|
494
|
+
- ``typ`` -- (default: list) a type or class; more
|
|
495
|
+
generally, something that can be called with a list as input
|
|
496
|
+
|
|
497
|
+
OUTPUT: a generator
|
|
498
|
+
|
|
499
|
+
EXAMPLES: We create multi-range iterators, print them and also
|
|
500
|
+
iterate through a tuple version.
|
|
501
|
+
|
|
502
|
+
::
|
|
503
|
+
|
|
504
|
+
sage: z = xmrange([3,2]);z
|
|
505
|
+
xmrange([3, 2])
|
|
506
|
+
sage: z = xmrange([3,2], tuple);z
|
|
507
|
+
xmrange([3, 2], <... 'tuple'>)
|
|
508
|
+
sage: for a in z:
|
|
509
|
+
....: print(a)
|
|
510
|
+
(0, 0)
|
|
511
|
+
(0, 1)
|
|
512
|
+
(1, 0)
|
|
513
|
+
(1, 1)
|
|
514
|
+
(2, 0)
|
|
515
|
+
(2, 1)
|
|
516
|
+
|
|
517
|
+
We illustrate a few more iterations.
|
|
518
|
+
|
|
519
|
+
::
|
|
520
|
+
|
|
521
|
+
sage: list(xmrange([3,2]))
|
|
522
|
+
[[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
|
|
523
|
+
sage: list(xmrange([3,2], tuple))
|
|
524
|
+
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
|
|
525
|
+
|
|
526
|
+
Here we compute the sum of each element of the multi-range
|
|
527
|
+
iterator::
|
|
528
|
+
|
|
529
|
+
sage: list(xmrange([3,2], sum))
|
|
530
|
+
[0, 1, 1, 2, 2, 3]
|
|
531
|
+
|
|
532
|
+
Next we compute the product::
|
|
533
|
+
|
|
534
|
+
sage: list(xmrange([3,2], prod))
|
|
535
|
+
[0, 0, 0, 1, 0, 2]
|
|
536
|
+
|
|
537
|
+
Examples that illustrate empty multi-ranges.
|
|
538
|
+
|
|
539
|
+
::
|
|
540
|
+
|
|
541
|
+
sage: list(xmrange([5,3,-2]))
|
|
542
|
+
[]
|
|
543
|
+
sage: list(xmrange([5,3,0]))
|
|
544
|
+
[]
|
|
545
|
+
|
|
546
|
+
This example is not empty, and should not be. See :issue:`6561`.
|
|
547
|
+
|
|
548
|
+
::
|
|
549
|
+
|
|
550
|
+
sage: list(xmrange([]))
|
|
551
|
+
[[]]
|
|
552
|
+
|
|
553
|
+
We use a multi-range iterator to iterate through the Cartesian
|
|
554
|
+
product of sets.
|
|
555
|
+
|
|
556
|
+
::
|
|
557
|
+
|
|
558
|
+
sage: X = ['red', 'apple', 389]
|
|
559
|
+
sage: Y = ['orange', 'horse']
|
|
560
|
+
sage: for i,j in xmrange([len(X), len(Y)]):
|
|
561
|
+
....: print((X[i], Y[j]))
|
|
562
|
+
('red', 'orange')
|
|
563
|
+
('red', 'horse')
|
|
564
|
+
('apple', 'orange')
|
|
565
|
+
('apple', 'horse')
|
|
566
|
+
(389, 'orange')
|
|
567
|
+
(389, 'horse')
|
|
568
|
+
|
|
569
|
+
AUTHORS:
|
|
570
|
+
|
|
571
|
+
- Jon Hanke
|
|
572
|
+
|
|
573
|
+
- William Stein
|
|
574
|
+
"""
|
|
575
|
+
def __init__(self, sizes, typ=list):
|
|
576
|
+
self.sizes = [int(x) for x in sizes]
|
|
577
|
+
self.typ = typ
|
|
578
|
+
|
|
579
|
+
def __repr__(self):
|
|
580
|
+
if self.typ == list:
|
|
581
|
+
return 'xmrange(%s)' % self.sizes
|
|
582
|
+
else:
|
|
583
|
+
return 'xmrange(%s, %s)' % (self.sizes, self.typ)
|
|
584
|
+
|
|
585
|
+
def __len__(self):
|
|
586
|
+
sizes = self.sizes
|
|
587
|
+
n = len(sizes)
|
|
588
|
+
if n == 0:
|
|
589
|
+
return 0
|
|
590
|
+
for i in sizes:
|
|
591
|
+
if i <= 0:
|
|
592
|
+
return 0
|
|
593
|
+
return prod(sizes, 1)
|
|
594
|
+
|
|
595
|
+
def __iter__(self):
|
|
596
|
+
return _xmrange(self.sizes, self.typ)
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
def cartesian_product_iterator(X):
|
|
600
|
+
"""
|
|
601
|
+
Iterate over the Cartesian product.
|
|
602
|
+
|
|
603
|
+
INPUT:
|
|
604
|
+
|
|
605
|
+
- ``X`` -- list or tuple of lists
|
|
606
|
+
|
|
607
|
+
OUTPUT: iterator over the Cartesian product of the elements of X
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: list(cartesian_product_iterator([[1,2], ['a','b']]))
|
|
612
|
+
[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
|
|
613
|
+
sage: list(cartesian_product_iterator([]))
|
|
614
|
+
[()]
|
|
615
|
+
|
|
616
|
+
TESTS:
|
|
617
|
+
|
|
618
|
+
Check that :issue:`28521` is fixed::
|
|
619
|
+
|
|
620
|
+
sage: list(cartesian_product_iterator([[], [1]]))
|
|
621
|
+
[]
|
|
622
|
+
sage: list(cartesian_product_iterator([[1], []]))
|
|
623
|
+
[]
|
|
624
|
+
sage: list(cartesian_product_iterator([[1], [], [2]]))
|
|
625
|
+
[]
|
|
626
|
+
"""
|
|
627
|
+
return xmrange_iter(X, tuple)
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
def cantor_product(*args, **kwds):
|
|
631
|
+
r"""
|
|
632
|
+
Return an iterator over the product of the inputs along the diagonals a la
|
|
633
|
+
:wikipedia:`Cantor pairing <Pairing_function#Cantor_pairing_function>`.
|
|
634
|
+
|
|
635
|
+
INPUT:
|
|
636
|
+
|
|
637
|
+
- a certain number of iterables
|
|
638
|
+
|
|
639
|
+
- ``repeat`` -- an optional integer. If it is provided, the input is
|
|
640
|
+
repeated ``repeat`` times
|
|
641
|
+
|
|
642
|
+
Other keyword arguments are passed to
|
|
643
|
+
:class:`sage.combinat.integer_lists.invlex.IntegerListsLex`.
|
|
644
|
+
|
|
645
|
+
EXAMPLES::
|
|
646
|
+
|
|
647
|
+
sage: from sage.misc.mrange import cantor_product
|
|
648
|
+
sage: list(cantor_product([0, 1], repeat=3))
|
|
649
|
+
[(0, 0, 0),
|
|
650
|
+
(1, 0, 0),
|
|
651
|
+
(0, 1, 0),
|
|
652
|
+
(0, 0, 1),
|
|
653
|
+
(1, 1, 0),
|
|
654
|
+
(1, 0, 1),
|
|
655
|
+
(0, 1, 1),
|
|
656
|
+
(1, 1, 1)]
|
|
657
|
+
sage: list(cantor_product([0, 1], [0, 1, 2, 3]))
|
|
658
|
+
[(0, 0), (1, 0), (0, 1), (1, 1), (0, 2), (1, 2), (0, 3), (1, 3)]
|
|
659
|
+
|
|
660
|
+
Infinite iterators are valid input as well::
|
|
661
|
+
|
|
662
|
+
sage: from itertools import islice
|
|
663
|
+
sage: list(islice(cantor_product(ZZ, QQ), 14r))
|
|
664
|
+
[(0, 0),
|
|
665
|
+
(1, 0),
|
|
666
|
+
(0, 1),
|
|
667
|
+
(-1, 0),
|
|
668
|
+
(1, 1),
|
|
669
|
+
(0, -1),
|
|
670
|
+
(2, 0),
|
|
671
|
+
(-1, 1),
|
|
672
|
+
(1, -1),
|
|
673
|
+
(0, 1/2),
|
|
674
|
+
(-2, 0),
|
|
675
|
+
(2, 1),
|
|
676
|
+
(-1, -1),
|
|
677
|
+
(1, 1/2)]
|
|
678
|
+
|
|
679
|
+
TESTS::
|
|
680
|
+
|
|
681
|
+
sage: C = cantor_product([0, 1], [0, 1, 2, 3], [0, 1, 2])
|
|
682
|
+
sage: sum(1 for _ in C) == 2*4*3
|
|
683
|
+
True
|
|
684
|
+
|
|
685
|
+
sage: from itertools import count
|
|
686
|
+
sage: list(cantor_product([], count()))
|
|
687
|
+
[]
|
|
688
|
+
sage: list(cantor_product(count(), [], count()))
|
|
689
|
+
[]
|
|
690
|
+
|
|
691
|
+
sage: list(cantor_product(count(), repeat=0))
|
|
692
|
+
[()]
|
|
693
|
+
|
|
694
|
+
sage: next(cantor_product(count(), repeat=-1))
|
|
695
|
+
Traceback (most recent call last):
|
|
696
|
+
...
|
|
697
|
+
ValueError: repeat argument cannot be negative
|
|
698
|
+
sage: next(cantor_product(count(), toto='hey'))
|
|
699
|
+
Traceback (most recent call last):
|
|
700
|
+
...
|
|
701
|
+
TypeError: ...__init__() got an unexpected keyword argument 'toto'
|
|
702
|
+
|
|
703
|
+
::
|
|
704
|
+
|
|
705
|
+
sage: list(cantor_product(srange(5), repeat=2, min_slope=1))
|
|
706
|
+
[(0, 1), (0, 2), (1, 2), (0, 3), (1, 3),
|
|
707
|
+
(0, 4), (2, 3), (1, 4), (2, 4), (3, 4)]
|
|
708
|
+
|
|
709
|
+
Check that :issue:`24897` is fixed::
|
|
710
|
+
|
|
711
|
+
sage: from sage.misc.mrange import cantor_product
|
|
712
|
+
sage: list(cantor_product([1]))
|
|
713
|
+
[(1,)]
|
|
714
|
+
sage: list(cantor_product([1], repeat=2))
|
|
715
|
+
[(1, 1)]
|
|
716
|
+
sage: list(cantor_product([1], [1,2]))
|
|
717
|
+
[(1, 1), (1, 2)]
|
|
718
|
+
sage: list(cantor_product([1,2], [1]))
|
|
719
|
+
[(1, 1), (2, 1)]
|
|
720
|
+
"""
|
|
721
|
+
from itertools import count
|
|
722
|
+
from sage.combinat.integer_lists import IntegerListsLex
|
|
723
|
+
|
|
724
|
+
m = len(args) # numer of factors
|
|
725
|
+
lengths = [None] * m # None or length of factors
|
|
726
|
+
data = [[] for _ in range(m)] # the initial slice of each factor
|
|
727
|
+
iterators = [iter(a) for a in args] # the iterators
|
|
728
|
+
repeat = int(kwds.pop('repeat', 1))
|
|
729
|
+
if repeat == 0:
|
|
730
|
+
yield ()
|
|
731
|
+
return
|
|
732
|
+
elif repeat < 0:
|
|
733
|
+
raise ValueError("repeat argument cannot be negative")
|
|
734
|
+
mm = m * repeat
|
|
735
|
+
|
|
736
|
+
for n in count(0):
|
|
737
|
+
# try to add one more term to each bin
|
|
738
|
+
for i, a in enumerate(iterators):
|
|
739
|
+
if lengths[i] is None:
|
|
740
|
+
try:
|
|
741
|
+
data[i].append(next(a))
|
|
742
|
+
except StopIteration:
|
|
743
|
+
assert len(data[i]) == n
|
|
744
|
+
if n == 0:
|
|
745
|
+
return
|
|
746
|
+
lengths[i] = n
|
|
747
|
+
|
|
748
|
+
# iterate through what we have
|
|
749
|
+
ceiling = [n if lengths[i] is None else lengths[i] - 1
|
|
750
|
+
for i in range(m)] * repeat
|
|
751
|
+
for v in IntegerListsLex(n, length=mm, ceiling=ceiling, **kwds):
|
|
752
|
+
yield tuple(data[i % m][v[i]] for i in range(mm))
|
|
753
|
+
|
|
754
|
+
if all(l is not None for l in lengths) and repeat * sum(l - 1 for l in lengths) <= n:
|
|
755
|
+
return
|