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,743 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Iterators over the partitions of an integer
|
|
4
|
+
|
|
5
|
+
The iterators generate partitions in either increasing or decreasing
|
|
6
|
+
lexicographic orders and a partition `P` is represented either in ascending
|
|
7
|
+
(`P_i \leq P_{i+1}`) or descending (`P_i \geq P_{i+1}`) orders::
|
|
8
|
+
|
|
9
|
+
sage: from sage.combinat.partitions import ZS1_iterator
|
|
10
|
+
sage: for p in ZS1_iterator(4):
|
|
11
|
+
....: print(p)
|
|
12
|
+
[4]
|
|
13
|
+
[3, 1]
|
|
14
|
+
[2, 2]
|
|
15
|
+
[2, 1, 1]
|
|
16
|
+
[1, 1, 1, 1]
|
|
17
|
+
sage: from sage.combinat.partitions import AccelDesc_iterator
|
|
18
|
+
sage: for p in AccelDesc_iterator(4):
|
|
19
|
+
....: print(p)
|
|
20
|
+
[4]
|
|
21
|
+
[3, 1]
|
|
22
|
+
[2, 2]
|
|
23
|
+
[2, 1, 1]
|
|
24
|
+
[1, 1, 1, 1]
|
|
25
|
+
sage: from sage.combinat.partitions import ZS2_iterator
|
|
26
|
+
sage: for p in ZS2_iterator(4):
|
|
27
|
+
....: print(p)
|
|
28
|
+
[1, 1, 1, 1]
|
|
29
|
+
[2, 1, 1]
|
|
30
|
+
[2, 2]
|
|
31
|
+
[3, 1]
|
|
32
|
+
[4]
|
|
33
|
+
sage: from sage.combinat.partitions import AccelAsc_iterator
|
|
34
|
+
sage: for p in AccelAsc_iterator(4):
|
|
35
|
+
....: print(p)
|
|
36
|
+
[1, 1, 1, 1]
|
|
37
|
+
[1, 1, 2]
|
|
38
|
+
[1, 3]
|
|
39
|
+
[2, 2]
|
|
40
|
+
[4]
|
|
41
|
+
|
|
42
|
+
For each of these iterators, this module also provides a ``next`` method that
|
|
43
|
+
takes a partition as input and return the next partition in the corresponding
|
|
44
|
+
ordering::
|
|
45
|
+
|
|
46
|
+
sage: from sage.combinat.partitions import ZS1_next
|
|
47
|
+
sage: ZS1_next([2, 2])
|
|
48
|
+
[2, 1, 1]
|
|
49
|
+
sage: from sage.combinat.partitions import AccelDesc_next
|
|
50
|
+
sage: AccelDesc_next([2, 2])
|
|
51
|
+
[2, 1, 1]
|
|
52
|
+
sage: from sage.combinat.partitions import ZS2_next
|
|
53
|
+
sage: ZS2_next([2, 2])
|
|
54
|
+
[3, 1]
|
|
55
|
+
sage: from sage.combinat.partitions import AccelAsc_next
|
|
56
|
+
sage: AccelAsc_next([2, 2])
|
|
57
|
+
[4]
|
|
58
|
+
|
|
59
|
+
It is also possible to iterate over the partitions of bounded length::
|
|
60
|
+
|
|
61
|
+
sage: from sage.combinat.partitions import ZS1_iterator_nk
|
|
62
|
+
sage: for p in ZS1_iterator_nk(6, 3):
|
|
63
|
+
....: print(p)
|
|
64
|
+
[6]
|
|
65
|
+
[5, 1]
|
|
66
|
+
[4, 2]
|
|
67
|
+
[4, 1, 1]
|
|
68
|
+
[3, 3]
|
|
69
|
+
[3, 2, 1]
|
|
70
|
+
[2, 2, 2]
|
|
71
|
+
|
|
72
|
+
AUTHOR:
|
|
73
|
+
|
|
74
|
+
- William Stein (2007-07-28): initial version
|
|
75
|
+
- Jonathan Bober (2007-07-28): wrote the program ``partitions_c.cc``
|
|
76
|
+
that does all the actual heavy lifting.
|
|
77
|
+
- David Coudert (2024-06-01): reshape method :meth:`ZS1_iterator` to ease the
|
|
78
|
+
implementation of :meth:`ZS1_next` and add iterators and next methods based on
|
|
79
|
+
``ZS2``, ``AccelAsc`` and ``AccelDesc`` from [ZS1998]_ and [KS2012]_.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
# ****************************************************************************
|
|
83
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com>
|
|
84
|
+
# 2007 Jonathan Bober <jwbober@gmail.com>
|
|
85
|
+
# 2024 David Coudert <david.coudert@inria.fr>
|
|
86
|
+
#
|
|
87
|
+
# This program is free software: you can redistribute it and/or modify
|
|
88
|
+
# it under the terms of the GNU General Public License as published by
|
|
89
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
90
|
+
# (at your option) any later version.
|
|
91
|
+
# https://www.gnu.org/licenses/
|
|
92
|
+
# ****************************************************************************
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
cdef inline ZS1_step(list P, int n, int *m, int *h):
|
|
96
|
+
r"""
|
|
97
|
+
Compute the partition following ``P`` in the ordering of the ZS1 algorithm.
|
|
98
|
+
|
|
99
|
+
This is a helper method for methods :meth:`ZS1_iterator` and :meth:`ZS1_next`.
|
|
100
|
+
Partition ``P`` is modified in place.
|
|
101
|
+
|
|
102
|
+
INPUT:
|
|
103
|
+
|
|
104
|
+
- ``P`` -- list of size `n` storing a partition of `n`
|
|
105
|
+
|
|
106
|
+
- ``n`` -- integer; the sum of the elements of the partition stored in ``P``
|
|
107
|
+
|
|
108
|
+
- ``m`` -- pointer to the index of the last element of the partition
|
|
109
|
+
|
|
110
|
+
- ``h`` -- pointer to the last value larger than 1 in ``P``
|
|
111
|
+
|
|
112
|
+
.. WARNING::
|
|
113
|
+
|
|
114
|
+
The method assumes that input parameters are valid and consistent with
|
|
115
|
+
the ZS1 algorithm as proposed in [ZS1998]_. It modifies the content of
|
|
116
|
+
``P`` and the values pointed by ``m`` and ``h``.
|
|
117
|
+
|
|
118
|
+
EXAMPLES::
|
|
119
|
+
|
|
120
|
+
sage: from sage.combinat.partitions import ZS1_iterator
|
|
121
|
+
sage: it = ZS1_iterator(4)
|
|
122
|
+
sage: next(it)
|
|
123
|
+
[4]
|
|
124
|
+
sage: type(_)
|
|
125
|
+
<class 'list'>
|
|
126
|
+
"""
|
|
127
|
+
# Invariants
|
|
128
|
+
# (A) P[:m+1] is a partition of n.
|
|
129
|
+
# (B) P[h+1:] is an array of n-(h+1) ones.
|
|
130
|
+
# (C) P[i] > 1 for each i <= h.
|
|
131
|
+
# (D) 0 <= h <= m.
|
|
132
|
+
cdef int r, t
|
|
133
|
+
cdef int mm = m[0]
|
|
134
|
+
cdef int hh = h[0]
|
|
135
|
+
if P[hh] == 2:
|
|
136
|
+
mm += 1
|
|
137
|
+
P[hh] = 1
|
|
138
|
+
hh -= 1
|
|
139
|
+
else:
|
|
140
|
+
t = mm - hh + 1
|
|
141
|
+
r = P[hh] - 1
|
|
142
|
+
P[hh] = r
|
|
143
|
+
while t >= r:
|
|
144
|
+
hh += 1
|
|
145
|
+
P[hh] = r
|
|
146
|
+
t -= r
|
|
147
|
+
if t == 0:
|
|
148
|
+
mm = hh
|
|
149
|
+
else:
|
|
150
|
+
mm = hh + 1
|
|
151
|
+
if t > 1:
|
|
152
|
+
hh += 1
|
|
153
|
+
P[hh] = t
|
|
154
|
+
m[0] = mm
|
|
155
|
+
h[0] = hh
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def ZS1_iterator(int n):
|
|
159
|
+
r"""
|
|
160
|
+
Return an iterator over the partitions of ``n``.
|
|
161
|
+
|
|
162
|
+
The partitions are generated in the decreasing lexicographic order and each
|
|
163
|
+
partition is represented as a list ``P`` in descending order (i.e.,
|
|
164
|
+
`P_i \geq P_{i+1}`). The method yields lists and not objects of type
|
|
165
|
+
:class:`~sage.combinat.partition.Partition`.
|
|
166
|
+
|
|
167
|
+
This is an implementation of the ZS1 algorithm found in [ZS1998]_.
|
|
168
|
+
|
|
169
|
+
.. SEEALSO::
|
|
170
|
+
|
|
171
|
+
- :meth:`sage.combinat.partitions.ZS2_iterator`
|
|
172
|
+
- :meth:`sage.combinat.partitions.AccelDesc_iterator`
|
|
173
|
+
|
|
174
|
+
EXAMPLES::
|
|
175
|
+
|
|
176
|
+
sage: from sage.combinat.partitions import ZS1_iterator
|
|
177
|
+
sage: for p in ZS1_iterator(4):
|
|
178
|
+
....: print(p)
|
|
179
|
+
[4]
|
|
180
|
+
[3, 1]
|
|
181
|
+
[2, 2]
|
|
182
|
+
[2, 1, 1]
|
|
183
|
+
[1, 1, 1, 1]
|
|
184
|
+
sage: next(ZS1_iterator(4))
|
|
185
|
+
[4]
|
|
186
|
+
sage: type(_)
|
|
187
|
+
<class 'list'>
|
|
188
|
+
"""
|
|
189
|
+
# Easy cases.
|
|
190
|
+
if n < 0:
|
|
191
|
+
return
|
|
192
|
+
if not n:
|
|
193
|
+
yield []
|
|
194
|
+
return
|
|
195
|
+
cdef list P = [1] * n
|
|
196
|
+
P[0] = n
|
|
197
|
+
cdef int m = 0
|
|
198
|
+
cdef int h = 0
|
|
199
|
+
yield [n]
|
|
200
|
+
while P[0] != 1:
|
|
201
|
+
ZS1_step(P, n, &m, &h)
|
|
202
|
+
yield P[:m+1]
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def ZS1_next(list P):
|
|
206
|
+
r"""
|
|
207
|
+
Return the partition after ``P`` in the ordering of the ZS1 algorithm.
|
|
208
|
+
|
|
209
|
+
INPUT:
|
|
210
|
+
|
|
211
|
+
- ``P`` -- list encoding a partition of an integer `n` in descending order
|
|
212
|
+
(i.e., `P_i \geq P_{i+1}`)
|
|
213
|
+
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: from sage.combinat.partitions import ZS1_iterator, ZS1_next
|
|
217
|
+
sage: P = [4]
|
|
218
|
+
sage: while P:
|
|
219
|
+
....: print(P)
|
|
220
|
+
....: P = ZS1_next(P)
|
|
221
|
+
[4]
|
|
222
|
+
[3, 1]
|
|
223
|
+
[2, 2]
|
|
224
|
+
[2, 1, 1]
|
|
225
|
+
[1, 1, 1, 1]
|
|
226
|
+
sage: A = [list(p) for p in Partitions(7)]
|
|
227
|
+
sage: all(ZS1_next(p) == q for p, q in zip(A, A[1:]))
|
|
228
|
+
True
|
|
229
|
+
"""
|
|
230
|
+
if P[0] == 1:
|
|
231
|
+
return
|
|
232
|
+
if P[-1] != 1:
|
|
233
|
+
return P[:-1] + [P[-1] - 1, 1]
|
|
234
|
+
|
|
235
|
+
cdef int n = sum(P)
|
|
236
|
+
cdef int m = len(P) - 1 # index of the last element in P
|
|
237
|
+
# Search for the index h of the last value > 1 in P
|
|
238
|
+
cdef int h = m
|
|
239
|
+
while P[h] == 1:
|
|
240
|
+
h -= 1
|
|
241
|
+
# Let Q be such that Q[:m+1] == P and Q[h+1:] is an array of n-(h+1) ones
|
|
242
|
+
cdef list Q = P + [1] * (n - m - 1)
|
|
243
|
+
ZS1_step(Q, n, &m, &h)
|
|
244
|
+
return Q[:m+1]
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def ZS1_iterator_nk(int n, int k):
|
|
248
|
+
r"""
|
|
249
|
+
An iterator for the partitions of `n` of length at most `k` (in the
|
|
250
|
+
decreasing lexicographic order) which returns lists and not objects of type
|
|
251
|
+
:class:`~sage.combinat.partition.Partition`.
|
|
252
|
+
|
|
253
|
+
The algorithm is a mild variation on :func:`ZS1_iterator`;
|
|
254
|
+
I would not vow for its speed.
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: from sage.combinat.partitions import ZS1_iterator_nk
|
|
259
|
+
sage: it = ZS1_iterator_nk(4, 3)
|
|
260
|
+
sage: next(it)
|
|
261
|
+
[4]
|
|
262
|
+
sage: type(_)
|
|
263
|
+
<class 'list'>
|
|
264
|
+
"""
|
|
265
|
+
# Easy cases.
|
|
266
|
+
if n <= 0:
|
|
267
|
+
if n == 0 and k >= 0:
|
|
268
|
+
yield []
|
|
269
|
+
return
|
|
270
|
+
if k <= 1:
|
|
271
|
+
if k == 1:
|
|
272
|
+
yield [n]
|
|
273
|
+
return
|
|
274
|
+
x = [1]*k
|
|
275
|
+
x[0] = n
|
|
276
|
+
|
|
277
|
+
cdef int m = 0
|
|
278
|
+
cdef int h = 0
|
|
279
|
+
cdef int r, t
|
|
280
|
+
yield [n]
|
|
281
|
+
while x[0] != 1:
|
|
282
|
+
# Loop invariants at this point:
|
|
283
|
+
# (A) x[:m+1] is a partition of n.
|
|
284
|
+
# (B) x[h+1:m+1] is an array of m-h ones.
|
|
285
|
+
# (C) x[i] > 1 for each i <= h.
|
|
286
|
+
# (D) 0 <= h <= m < k.
|
|
287
|
+
# Note that x[m+1:] might contain leftover from
|
|
288
|
+
# previous steps; we don't clean up after ourselves.
|
|
289
|
+
if x[h] == 2 and m + 1 < k:
|
|
290
|
+
# We have a 2 in the partition, and the space to
|
|
291
|
+
# spread it into two 1s.
|
|
292
|
+
m += 1
|
|
293
|
+
x[h] = 1
|
|
294
|
+
x[m] = 1
|
|
295
|
+
h -= 1
|
|
296
|
+
yield x[:m+1]
|
|
297
|
+
else:
|
|
298
|
+
t = m - h + 1 # 1 + "the number of 1s to the right of x[h] that belong to the partition"
|
|
299
|
+
r = x[h] - 1
|
|
300
|
+
|
|
301
|
+
# This loop finds the largest h such that x[:h] can be completed
|
|
302
|
+
# with integers smaller-or-equal to r=x[h]-1 into a partition of n.
|
|
303
|
+
#
|
|
304
|
+
# We decrement h until it becomes possible.
|
|
305
|
+
while t > (k-h-1) * r:
|
|
306
|
+
# Loop invariants:
|
|
307
|
+
# t = n - sum(x[:h+1]) + 1;
|
|
308
|
+
# r = x[h] - 1; x[h] > 1.
|
|
309
|
+
if h == 0:
|
|
310
|
+
# No way to make the current partition
|
|
311
|
+
# lexicographically smaller.
|
|
312
|
+
return
|
|
313
|
+
h -= 1
|
|
314
|
+
t += r + 1
|
|
315
|
+
r = x[h] - 1
|
|
316
|
+
# Decrement x[h] from r + 1 to r, and replace
|
|
317
|
+
# x[h+1:] by the lexicographically highest array
|
|
318
|
+
# it could possibly be. This means replacing
|
|
319
|
+
# x[h+1:] by the array [r, r, r, ..., r, s],
|
|
320
|
+
# where s is the residue of t modulo r (or
|
|
321
|
+
# nothing if that residue is 0).
|
|
322
|
+
x[h] = r
|
|
323
|
+
while t >= r:
|
|
324
|
+
# Loop invariants: t = n - sum(x[:h+1]) + 1;
|
|
325
|
+
# r = x[h] > 1.
|
|
326
|
+
h += 1
|
|
327
|
+
x[h] = r
|
|
328
|
+
t -= r
|
|
329
|
+
if t == 0:
|
|
330
|
+
m = h
|
|
331
|
+
else:
|
|
332
|
+
m = h + 1
|
|
333
|
+
if t > 1:
|
|
334
|
+
h += 1
|
|
335
|
+
x[m] = t
|
|
336
|
+
yield x[:m+1]
|
|
337
|
+
# free(x)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
cdef inline ZS2_step(list P, int n, int *m, int *h):
|
|
341
|
+
r"""
|
|
342
|
+
Compute the partition following ``P`` in the ordering of the ZS2 algorithm.
|
|
343
|
+
|
|
344
|
+
This is a helper method for methods :meth:`ZS2_iterator` and :meth:`ZS2_next`.
|
|
345
|
+
Partition ``P`` is modified in place.
|
|
346
|
+
|
|
347
|
+
INPUT:
|
|
348
|
+
|
|
349
|
+
- ``P`` -- list of size `n` storing a partition of `n`
|
|
350
|
+
|
|
351
|
+
- ``n`` -- integer; the sum of the elements of the partition stored in ``P``
|
|
352
|
+
|
|
353
|
+
- ``m`` -- pointer to the index of the last element of the partition
|
|
354
|
+
|
|
355
|
+
- ``h`` -- pointer to the last value larger than 1 in ``P``
|
|
356
|
+
|
|
357
|
+
.. WARNING::
|
|
358
|
+
|
|
359
|
+
The method assumes that input parameters are valid and consistent with
|
|
360
|
+
the ZS2 algorithm as proposed in [ZS1998]_. It modifies the content of
|
|
361
|
+
``P`` and the values pointed by ``m`` and ``h``.
|
|
362
|
+
|
|
363
|
+
EXAMPLES::
|
|
364
|
+
|
|
365
|
+
sage: from sage.combinat.partitions import ZS2_iterator
|
|
366
|
+
sage: it = ZS2_iterator(4)
|
|
367
|
+
sage: next(it)
|
|
368
|
+
[1, 1, 1, 1]
|
|
369
|
+
sage: type(_)
|
|
370
|
+
<class 'list'>
|
|
371
|
+
"""
|
|
372
|
+
# Invariants
|
|
373
|
+
# (A) P[:m+1] is a partition of n.
|
|
374
|
+
# (B) P[h+1:] is an array of n-(h+1) ones.
|
|
375
|
+
# (C) P[i] > 1 for each i <= h.
|
|
376
|
+
# (D) 0 <= h <= m.
|
|
377
|
+
cdef int mm = m[0]
|
|
378
|
+
cdef int hh = h[0]
|
|
379
|
+
cdef int t, r
|
|
380
|
+
if mm - hh > 1:
|
|
381
|
+
hh += 1
|
|
382
|
+
P[hh] = 2
|
|
383
|
+
mm -= 1
|
|
384
|
+
else:
|
|
385
|
+
t = mm - 2
|
|
386
|
+
while P[t] == P[mm - 1]:
|
|
387
|
+
P[t] = 1
|
|
388
|
+
t -= 1
|
|
389
|
+
hh = t + 1
|
|
390
|
+
P[hh] = P[mm - 1] + 1
|
|
391
|
+
r = P[mm] + P[mm - 1] * (mm - hh - 1)
|
|
392
|
+
P[mm] = 1
|
|
393
|
+
if mm - hh > 1:
|
|
394
|
+
P[mm - 1] = 1
|
|
395
|
+
mm = hh + r - 1
|
|
396
|
+
m[0] = mm
|
|
397
|
+
h[0] = hh
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def ZS2_iterator(int n):
|
|
401
|
+
r"""
|
|
402
|
+
Return an iterator over the partitions of ``n``.
|
|
403
|
+
|
|
404
|
+
The partitions are generated in the increasing lexicographic order and each
|
|
405
|
+
partition is represented as a list in descending order (i.e., `p_i \geq
|
|
406
|
+
p_{i+1}`).
|
|
407
|
+
|
|
408
|
+
This is an implementation of the ZS2 algorithm found in [ZS1998]_.
|
|
409
|
+
|
|
410
|
+
.. SEEALSO::
|
|
411
|
+
|
|
412
|
+
:meth:`sage.combinat.partitions.ZS1_iterator`
|
|
413
|
+
|
|
414
|
+
EXAMPLES::
|
|
415
|
+
|
|
416
|
+
sage: from sage.combinat.partitions import ZS2_iterator
|
|
417
|
+
sage: for p in ZS2_iterator(4):
|
|
418
|
+
....: print(p)
|
|
419
|
+
[1, 1, 1, 1]
|
|
420
|
+
[2, 1, 1]
|
|
421
|
+
[2, 2]
|
|
422
|
+
[3, 1]
|
|
423
|
+
[4]
|
|
424
|
+
sage: next(ZS2_iterator(4))
|
|
425
|
+
[1, 1, 1, 1]
|
|
426
|
+
sage: type(_)
|
|
427
|
+
<class 'list'>
|
|
428
|
+
"""
|
|
429
|
+
# Easy cases.
|
|
430
|
+
if n < 0:
|
|
431
|
+
return
|
|
432
|
+
yield [1] * n
|
|
433
|
+
if n <= 1:
|
|
434
|
+
return
|
|
435
|
+
cdef list P = [1]*n
|
|
436
|
+
P[0] = 2
|
|
437
|
+
cdef int h = 0
|
|
438
|
+
cdef int m = n - 2 # index of the last element of the partition
|
|
439
|
+
yield P[:m+1]
|
|
440
|
+
while P[0] != n:
|
|
441
|
+
ZS2_step(P, n, &m, &h)
|
|
442
|
+
yield P[:m+1]
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def ZS2_next(list P):
|
|
446
|
+
r"""
|
|
447
|
+
Return the partition after ``P`` in the ordering of the ZS2 algorithm.
|
|
448
|
+
|
|
449
|
+
INPUT:
|
|
450
|
+
|
|
451
|
+
- ``P`` -- list encoding a partition of an integer `n` in descending order
|
|
452
|
+
(i.e., `P_i \geq P_{i+1}`)
|
|
453
|
+
|
|
454
|
+
EXAMPLES::
|
|
455
|
+
|
|
456
|
+
sage: from sage.combinat.partitions import ZS2_iterator, ZS2_next
|
|
457
|
+
sage: P = [1, 1, 1, 1]
|
|
458
|
+
sage: while P:
|
|
459
|
+
....: print(P)
|
|
460
|
+
....: P = ZS2_next(P)
|
|
461
|
+
[1, 1, 1, 1]
|
|
462
|
+
[2, 1, 1]
|
|
463
|
+
[2, 2]
|
|
464
|
+
[3, 1]
|
|
465
|
+
[4]
|
|
466
|
+
"""
|
|
467
|
+
if len(P) <= 1:
|
|
468
|
+
return
|
|
469
|
+
if P[0] == 1:
|
|
470
|
+
return [2] + P[:-2]
|
|
471
|
+
cdef int n = sum(P)
|
|
472
|
+
cdef int m = len(P) - 1 # index of the last element in P
|
|
473
|
+
# Search for the index h of the last value > 1 in P
|
|
474
|
+
cdef int h = m
|
|
475
|
+
while P[h] == 1:
|
|
476
|
+
h -= 1
|
|
477
|
+
# Let Q be such that Q[:m+1] == P and Q[h+1:] is an array of n-(h+1) ones
|
|
478
|
+
cdef list Q = P + [1] * (n - m - 1)
|
|
479
|
+
ZS2_step(Q, n, &m, &h)
|
|
480
|
+
return Q[:m+1]
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
cdef inline AccelDesc_step(list P, int n, int* m, int* h):
|
|
484
|
+
r"""
|
|
485
|
+
Compute the partition following ``P`` in the ordering of the AccelDesc algorithm.
|
|
486
|
+
|
|
487
|
+
This is a helper method for methods :meth:`AccelDesc_iterator` and
|
|
488
|
+
:meth:`AccelDesc_next`. Partition ``P`` is modified in place.
|
|
489
|
+
|
|
490
|
+
INPUT:
|
|
491
|
+
|
|
492
|
+
- ``P`` -- list of size `n` storing a partition of `n`
|
|
493
|
+
|
|
494
|
+
- ``n`` -- integer; the sum of the elements of the partition stored in ``P``
|
|
495
|
+
|
|
496
|
+
- ``m`` -- pointer to the index of the last element of the partition
|
|
497
|
+
|
|
498
|
+
- ``h`` -- pointer to the last value larger than 1 in ``P``
|
|
499
|
+
|
|
500
|
+
.. WARNING::
|
|
501
|
+
|
|
502
|
+
The method assumes that input parameters are valid and consistent with
|
|
503
|
+
the AccelDesc algorithm as proposed in [ZS2012]_. It modifies the
|
|
504
|
+
content of ``P`` and the values pointed by ``m`` and ``h``.
|
|
505
|
+
|
|
506
|
+
EXAMPLES::
|
|
507
|
+
|
|
508
|
+
sage: from sage.combinat.partitions import AccelDesc_iterator
|
|
509
|
+
sage: it = AccelDesc_iterator(4)
|
|
510
|
+
sage: next(it)
|
|
511
|
+
[4]
|
|
512
|
+
sage: type(_)
|
|
513
|
+
<class 'list'>
|
|
514
|
+
"""
|
|
515
|
+
# Invariants
|
|
516
|
+
# (A) P[:m+1] is a partition of n.
|
|
517
|
+
# (B) P[h+1:] is an array of n-(h+1) ones.
|
|
518
|
+
# (C) P[i] > 1 for each i <= h.
|
|
519
|
+
# (D) 0 <= h <= m.
|
|
520
|
+
cdef int mm = m[0]
|
|
521
|
+
cdef int hh = h[0]
|
|
522
|
+
cdef int r, t
|
|
523
|
+
if P[hh] == 2:
|
|
524
|
+
mm += 1
|
|
525
|
+
P[hh] = 1
|
|
526
|
+
hh -= 1
|
|
527
|
+
else:
|
|
528
|
+
r = P[hh] - 1
|
|
529
|
+
t = mm - hh + 1
|
|
530
|
+
P[hh] = r
|
|
531
|
+
while t >= r:
|
|
532
|
+
hh += 1
|
|
533
|
+
P[hh] = r
|
|
534
|
+
t -= r
|
|
535
|
+
if not t:
|
|
536
|
+
mm = hh
|
|
537
|
+
else:
|
|
538
|
+
mm = hh + 1
|
|
539
|
+
if t > 1:
|
|
540
|
+
hh += 1
|
|
541
|
+
P[hh] = t
|
|
542
|
+
m[0] = mm
|
|
543
|
+
h[0] = hh
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
def AccelDesc_iterator(int n):
|
|
547
|
+
r"""
|
|
548
|
+
Return an iterator over the partitions of ``n``.
|
|
549
|
+
|
|
550
|
+
The partitions are generated in the increasing lexicographic order and each
|
|
551
|
+
partition is represented as a list in descending order (i.e., `p_i \geq
|
|
552
|
+
p_{i+1}`).
|
|
553
|
+
|
|
554
|
+
This is an implementation of the AccelDesc algorithm found in [KS2012]_.
|
|
555
|
+
|
|
556
|
+
.. SEEALSO::
|
|
557
|
+
|
|
558
|
+
:meth:`sage.combinat.partitions.ZS1_iterator`
|
|
559
|
+
|
|
560
|
+
EXAMPLES::
|
|
561
|
+
|
|
562
|
+
sage: from sage.combinat.partitions import AccelDesc_iterator
|
|
563
|
+
sage: for p in AccelDesc_iterator(4):
|
|
564
|
+
....: print(p)
|
|
565
|
+
[4]
|
|
566
|
+
[3, 1]
|
|
567
|
+
[2, 2]
|
|
568
|
+
[2, 1, 1]
|
|
569
|
+
[1, 1, 1, 1]
|
|
570
|
+
sage: next(AccelDesc_iterator(4))
|
|
571
|
+
[4]
|
|
572
|
+
sage: type(_)
|
|
573
|
+
<class 'list'>
|
|
574
|
+
|
|
575
|
+
Check that :meth:`ZS1_iterator` and :meth:`AccelDesc_iterator` generate
|
|
576
|
+
partitions in the same order::
|
|
577
|
+
|
|
578
|
+
sage: from sage.combinat.partitions import ZS1_iterator
|
|
579
|
+
sage: from sage.misc.prandom import randint
|
|
580
|
+
sage: n = randint(1, 50)
|
|
581
|
+
sage: all(p == q for p, q in zip(ZS1_iterator(n), AccelDesc_iterator(n))) # long time
|
|
582
|
+
True
|
|
583
|
+
"""
|
|
584
|
+
# Easy cases.
|
|
585
|
+
if n < 0:
|
|
586
|
+
return
|
|
587
|
+
if n <= 1:
|
|
588
|
+
yield [1] * n
|
|
589
|
+
return
|
|
590
|
+
cdef list P = [1] * n
|
|
591
|
+
P[0] = n
|
|
592
|
+
yield [n]
|
|
593
|
+
cdef int m = 0
|
|
594
|
+
cdef int h = 0
|
|
595
|
+
while h >= 0:
|
|
596
|
+
AccelDesc_step(P, n, &m, &h)
|
|
597
|
+
yield P[:m+1]
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
def AccelDesc_next(list P):
|
|
601
|
+
r"""
|
|
602
|
+
Return the partition after ``P`` in the ordering of the AccelDesc algorithm.
|
|
603
|
+
|
|
604
|
+
INPUT:
|
|
605
|
+
|
|
606
|
+
- ``P`` -- list encoding a partition of an integer `n` in descending order
|
|
607
|
+
(i.e., `P_i \geq P_{i+1}`)
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: from sage.combinat.partitions import AccelDesc_iterator, AccelDesc_next
|
|
612
|
+
sage: P = [4]
|
|
613
|
+
sage: while P:
|
|
614
|
+
....: print(P)
|
|
615
|
+
....: P = AccelDesc_next(P)
|
|
616
|
+
[4]
|
|
617
|
+
[3, 1]
|
|
618
|
+
[2, 2]
|
|
619
|
+
[2, 1, 1]
|
|
620
|
+
[1, 1, 1, 1]
|
|
621
|
+
sage: A = [list(p) for p in Partitions(7)]
|
|
622
|
+
sage: all(AccelDesc_next(p) == q for p, q in zip(A, A[1:]))
|
|
623
|
+
True
|
|
624
|
+
"""
|
|
625
|
+
if P[0] == 1:
|
|
626
|
+
return
|
|
627
|
+
if P[-1] != 1:
|
|
628
|
+
return P[:-1] + [P[-1] - 1, 1]
|
|
629
|
+
|
|
630
|
+
cdef int n = sum(P)
|
|
631
|
+
cdef int m = len(P) - 1 # index of the last element in P
|
|
632
|
+
# Search for the index h of the last value > 1 in P
|
|
633
|
+
cdef int h = m
|
|
634
|
+
while P[h] == 1:
|
|
635
|
+
h -= 1
|
|
636
|
+
# Let Q be such that Q[:m+1] == P and Q[h+1:] is an array of n-(h+1) ones
|
|
637
|
+
cdef list Q = P + [1]*(n - m - 1)
|
|
638
|
+
AccelDesc_step(Q, n, &m, &h)
|
|
639
|
+
return Q[:m+1]
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
def AccelAsc_iterator(int n):
|
|
643
|
+
r"""
|
|
644
|
+
Return an iterator over the partitions of ``n``.
|
|
645
|
+
|
|
646
|
+
The partitions are generated in the increasing lexicographic order and each
|
|
647
|
+
partition is represented as a list in ascending order (i.e., `p_i \leq
|
|
648
|
+
p_{i+1}`).
|
|
649
|
+
|
|
650
|
+
This is an implementation of the ``AccelAsc`` algorithm found in [KS2012]_.
|
|
651
|
+
|
|
652
|
+
.. SEEALSO::
|
|
653
|
+
|
|
654
|
+
:meth:`sage.combinat.partitions.ZS1_iterator`
|
|
655
|
+
|
|
656
|
+
EXAMPLES::
|
|
657
|
+
|
|
658
|
+
sage: from sage.combinat.partitions import AccelAsc_iterator
|
|
659
|
+
sage: for p in AccelAsc_iterator(4):
|
|
660
|
+
....: print(p)
|
|
661
|
+
[1, 1, 1, 1]
|
|
662
|
+
[1, 1, 2]
|
|
663
|
+
[1, 3]
|
|
664
|
+
[2, 2]
|
|
665
|
+
[4]
|
|
666
|
+
sage: next(AccelAsc_iterator(4))
|
|
667
|
+
[1, 1, 1, 1]
|
|
668
|
+
sage: type(_)
|
|
669
|
+
<class 'list'>
|
|
670
|
+
"""
|
|
671
|
+
# Easy cases.
|
|
672
|
+
if n < 0:
|
|
673
|
+
return
|
|
674
|
+
if n <= 1:
|
|
675
|
+
yield [1] * n
|
|
676
|
+
return
|
|
677
|
+
cdef list P = [0] * n
|
|
678
|
+
cdef int k = 1
|
|
679
|
+
cdef int y = n - 1
|
|
680
|
+
cdef int x, ell
|
|
681
|
+
while k:
|
|
682
|
+
k -= 1
|
|
683
|
+
x = P[k] + 1
|
|
684
|
+
while 2 * x <= y:
|
|
685
|
+
P[k] = x
|
|
686
|
+
y -= x
|
|
687
|
+
k += 1
|
|
688
|
+
ell = k + 1
|
|
689
|
+
while x <= y:
|
|
690
|
+
P[k] = x
|
|
691
|
+
P[ell] = y
|
|
692
|
+
yield P[:ell + 1]
|
|
693
|
+
x += 1
|
|
694
|
+
y -= 1
|
|
695
|
+
y += x - 1
|
|
696
|
+
P[k] = y + 1
|
|
697
|
+
yield P[:k + 1]
|
|
698
|
+
|
|
699
|
+
|
|
700
|
+
def AccelAsc_next(list P):
|
|
701
|
+
r"""
|
|
702
|
+
Return the partition after ``P`` in the ordering of the ``AccelAsc`` algorithm.
|
|
703
|
+
|
|
704
|
+
INPUT:
|
|
705
|
+
|
|
706
|
+
- ``P`` -- list encoding a partition of an integer `n` in ascending order
|
|
707
|
+
(i.e., `P_i \leq P_{i+1}`)
|
|
708
|
+
|
|
709
|
+
EXAMPLES::
|
|
710
|
+
|
|
711
|
+
sage: from sage.combinat.partitions import AccelAsc_next
|
|
712
|
+
sage: P = [1, 1, 1, 1]
|
|
713
|
+
sage: while P:
|
|
714
|
+
....: print(P)
|
|
715
|
+
....: P = AccelAsc_next(P)
|
|
716
|
+
[1, 1, 1, 1]
|
|
717
|
+
[1, 1, 2]
|
|
718
|
+
[1, 3]
|
|
719
|
+
[2, 2]
|
|
720
|
+
[4]
|
|
721
|
+
"""
|
|
722
|
+
if len(P) <= 1:
|
|
723
|
+
return
|
|
724
|
+
|
|
725
|
+
cdef int n = sum(P)
|
|
726
|
+
cdef int m = len(P) - 1 # index of the last element in P
|
|
727
|
+
# Let Q be such that Q[:m+1] == P and Q[m+1:] is an array of n-(m+1) ones
|
|
728
|
+
cdef list Q = P + [0]*(n - m - 1)
|
|
729
|
+
cdef int x, y
|
|
730
|
+
cdef int k = m - 1
|
|
731
|
+
x = Q[k] + 1
|
|
732
|
+
y = P[m] - 1
|
|
733
|
+
while 2 * x <= y:
|
|
734
|
+
Q[k] = x
|
|
735
|
+
y -= x
|
|
736
|
+
k += 1
|
|
737
|
+
if x <= y:
|
|
738
|
+
Q[k] = x
|
|
739
|
+
Q[k + 1] = y
|
|
740
|
+
return Q[:k + 2]
|
|
741
|
+
y += x - 1
|
|
742
|
+
Q[k] = y + 1
|
|
743
|
+
return Q[:k + 1]
|