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,1090 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
`q`-analogues
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
from sage.combinat.partition import _Partitions
|
|
16
|
+
from sage.misc.cachefunc import cached_function
|
|
17
|
+
from sage.misc.lazy_import import lazy_import
|
|
18
|
+
from sage.misc.misc_c import prod
|
|
19
|
+
from sage.rings.integer_ring import ZZ
|
|
20
|
+
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
|
|
21
|
+
from sage.rings.polynomial.polynomial_ring import polygen
|
|
22
|
+
from sage.structure.element import parent
|
|
23
|
+
|
|
24
|
+
lazy_import('sage.combinat.dyck_word', 'DyckWords')
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def q_int(n, q=None):
|
|
28
|
+
r"""
|
|
29
|
+
Return the `q`-analogue of the integer `n`.
|
|
30
|
+
|
|
31
|
+
The `q`-analogue of the integer `n` is given by
|
|
32
|
+
|
|
33
|
+
.. MATH::
|
|
34
|
+
|
|
35
|
+
[n]_q = \begin{cases}
|
|
36
|
+
1 + q + \cdots + q^{n-1}, & \text{if } n \geq 0, \\
|
|
37
|
+
-q^{-n} [-n]_q, & \text{if } n \leq 0.
|
|
38
|
+
\end{cases}
|
|
39
|
+
|
|
40
|
+
Consequently, if `q = 1` then `[n]_1 = n` and if `q \neq 1` then
|
|
41
|
+
`[n]_q = (q^n-1)/(q-1)`.
|
|
42
|
+
|
|
43
|
+
If the argument `q` is not specified then it defaults to the generator `q`
|
|
44
|
+
of the univariate polynomial ring over the integers.
|
|
45
|
+
|
|
46
|
+
EXAMPLES::
|
|
47
|
+
|
|
48
|
+
sage: from sage.combinat.q_analogues import q_int
|
|
49
|
+
sage: q_int(3)
|
|
50
|
+
q^2 + q + 1
|
|
51
|
+
sage: q_int(-3)
|
|
52
|
+
-q^-3 - q^-2 - q^-1
|
|
53
|
+
sage: p = ZZ['p'].0
|
|
54
|
+
sage: q_int(3,p)
|
|
55
|
+
p^2 + p + 1
|
|
56
|
+
sage: q_int(3/2)
|
|
57
|
+
Traceback (most recent call last):
|
|
58
|
+
...
|
|
59
|
+
ValueError: 3/2 must be an integer
|
|
60
|
+
|
|
61
|
+
TESTS:
|
|
62
|
+
|
|
63
|
+
We check that :issue:`15805` is fixed::
|
|
64
|
+
|
|
65
|
+
sage: q_int(0).parent()
|
|
66
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
67
|
+
|
|
68
|
+
We check that :issue:`25715` is fixed::
|
|
69
|
+
|
|
70
|
+
sage: q_int(0, 3r)
|
|
71
|
+
0
|
|
72
|
+
"""
|
|
73
|
+
if n not in ZZ:
|
|
74
|
+
raise ValueError(f'{n} must be an integer')
|
|
75
|
+
if q is None:
|
|
76
|
+
if n >= 0:
|
|
77
|
+
q = polygen(ZZ, 'q')
|
|
78
|
+
else:
|
|
79
|
+
q = LaurentPolynomialRing(ZZ, 'q').gen()
|
|
80
|
+
if n == 0:
|
|
81
|
+
return parent(q)(0)
|
|
82
|
+
if n > 0:
|
|
83
|
+
return sum(q**i for i in range(n))
|
|
84
|
+
return -q**n * sum(q**i for i in range(-n))
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def q_factorial(n, q=None):
|
|
88
|
+
r"""
|
|
89
|
+
Return the `q`-analogue of the factorial `n!`.
|
|
90
|
+
|
|
91
|
+
This is the product
|
|
92
|
+
|
|
93
|
+
.. MATH::
|
|
94
|
+
|
|
95
|
+
[1]_q [2]_q \cdots [n]_q
|
|
96
|
+
= 1 \cdot (1+q) \cdot (1+q+q^2) \cdots (1+q+q^2+\cdots+q^{n-1}) .
|
|
97
|
+
|
|
98
|
+
If `q` is unspecified, then this function defaults to
|
|
99
|
+
using the generator `q` for a univariate polynomial
|
|
100
|
+
ring over the integers.
|
|
101
|
+
|
|
102
|
+
EXAMPLES::
|
|
103
|
+
|
|
104
|
+
sage: from sage.combinat.q_analogues import q_factorial
|
|
105
|
+
sage: q_factorial(3)
|
|
106
|
+
q^3 + 2*q^2 + 2*q + 1
|
|
107
|
+
sage: p = ZZ['p'].0
|
|
108
|
+
sage: q_factorial(3, p)
|
|
109
|
+
p^3 + 2*p^2 + 2*p + 1
|
|
110
|
+
|
|
111
|
+
The `q`-analogue of `n!` is only defined for `n` a nonnegative
|
|
112
|
+
integer (:issue:`11411`)::
|
|
113
|
+
|
|
114
|
+
sage: q_factorial(-2)
|
|
115
|
+
Traceback (most recent call last):
|
|
116
|
+
...
|
|
117
|
+
ValueError: argument (-2) must be a nonnegative integer
|
|
118
|
+
|
|
119
|
+
TESTS::
|
|
120
|
+
|
|
121
|
+
sage: q_factorial(0).parent()
|
|
122
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
123
|
+
"""
|
|
124
|
+
if n in ZZ:
|
|
125
|
+
if n == 0:
|
|
126
|
+
return q_int(1, q)
|
|
127
|
+
elif n >= 1:
|
|
128
|
+
return prod(q_int(i, q) for i in range(1, n + 1))
|
|
129
|
+
raise ValueError("argument (%s) must be a nonnegative integer" % n)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def q_binomial(n, k, q=None, algorithm='auto'):
|
|
133
|
+
r"""
|
|
134
|
+
Return the `q`-binomial coefficient.
|
|
135
|
+
|
|
136
|
+
This is also known as the Gaussian binomial coefficient, and is defined by
|
|
137
|
+
|
|
138
|
+
.. MATH::
|
|
139
|
+
|
|
140
|
+
\binom{n}{k}_q = \frac{(1-q^n)(1-q^{n-1}) \cdots (1-q^{n-k+1})}
|
|
141
|
+
{(1-q)(1-q^2)\cdots (1-q^k)}.
|
|
142
|
+
|
|
143
|
+
See :wikipedia:`Gaussian_binomial_coefficient`.
|
|
144
|
+
|
|
145
|
+
If `q` is unspecified, then the variable is the generator `q` for
|
|
146
|
+
a univariate polynomial ring over the integers.
|
|
147
|
+
|
|
148
|
+
INPUT:
|
|
149
|
+
|
|
150
|
+
- ``n``, ``k`` -- the values `n` and `k` defined above
|
|
151
|
+
|
|
152
|
+
- ``q`` -- (default: ``None``) the variable `q`; if ``None``, then use a
|
|
153
|
+
default variable in `\ZZ[q]`
|
|
154
|
+
|
|
155
|
+
- ``algorithm`` -- (default: ``'auto'``) the algorithm to use and can be
|
|
156
|
+
one of the following:
|
|
157
|
+
|
|
158
|
+
- ``'auto'`` -- automatically choose the algorithm; see the algorithm
|
|
159
|
+
section below
|
|
160
|
+
- ``'naive'`` -- use the naive algorithm
|
|
161
|
+
- ``'cyclotomic'`` -- use cyclotomic algorithm
|
|
162
|
+
|
|
163
|
+
ALGORITHM:
|
|
164
|
+
|
|
165
|
+
The naive algorithm uses the product formula. The cyclotomic
|
|
166
|
+
algorithm uses a product of cyclotomic polynomials
|
|
167
|
+
(cf. [CH2006]_).
|
|
168
|
+
|
|
169
|
+
When the algorithm is set to ``'auto'``, we choose according to
|
|
170
|
+
the following rules:
|
|
171
|
+
|
|
172
|
+
- If ``q`` is a polynomial:
|
|
173
|
+
|
|
174
|
+
When ``n`` is small or ``k`` is small with respect to ``n``, one
|
|
175
|
+
uses the naive algorithm. When both ``n`` and ``k`` are big, one
|
|
176
|
+
uses the cyclotomic algorithm.
|
|
177
|
+
|
|
178
|
+
- If ``q`` is in the symbolic ring (or a symbolic subring), one uses
|
|
179
|
+
the cyclotomic algorithm.
|
|
180
|
+
|
|
181
|
+
- Otherwise one uses the naive algorithm, unless ``q`` is a root of
|
|
182
|
+
unity, then one uses the cyclotomic algorithm.
|
|
183
|
+
|
|
184
|
+
EXAMPLES:
|
|
185
|
+
|
|
186
|
+
By default, the variable is the generator of `\ZZ[q]`::
|
|
187
|
+
|
|
188
|
+
sage: from sage.combinat.q_analogues import q_binomial
|
|
189
|
+
sage: g = q_binomial(5,1) ; g
|
|
190
|
+
q^4 + q^3 + q^2 + q + 1
|
|
191
|
+
sage: g.parent()
|
|
192
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
193
|
+
|
|
194
|
+
For `n \geq 0`, the `q`-binomial coefficient vanishes unless `0 \leq k \leq n`::
|
|
195
|
+
|
|
196
|
+
sage: q_binomial(4,5)
|
|
197
|
+
0
|
|
198
|
+
sage: q_binomial(5,-1)
|
|
199
|
+
0
|
|
200
|
+
|
|
201
|
+
For `k \geq 0`, the `q`-binomial coefficient is extended as a polynomial in `n`::
|
|
202
|
+
|
|
203
|
+
sage: q_binomial(-4,1)
|
|
204
|
+
-q^-4 - q^-3 - q^-2 - q^-1
|
|
205
|
+
sage: q_binomial(-2,3)
|
|
206
|
+
-q^-9 - q^-8 - q^-7 - q^-6
|
|
207
|
+
|
|
208
|
+
Other variables can be used, given as third parameter::
|
|
209
|
+
|
|
210
|
+
sage: p = ZZ['p'].gen()
|
|
211
|
+
sage: q_binomial(4,2,p)
|
|
212
|
+
p^4 + p^3 + 2*p^2 + p + 1
|
|
213
|
+
|
|
214
|
+
The third parameter can also be arbitrary values::
|
|
215
|
+
|
|
216
|
+
sage: q_binomial(5,1,2) == g.subs(q=2)
|
|
217
|
+
True
|
|
218
|
+
sage: q_binomial(5,1,1)
|
|
219
|
+
5
|
|
220
|
+
sage: q_binomial(4,2,-1)
|
|
221
|
+
2
|
|
222
|
+
sage: q_binomial(4,2,3.14) # needs sage.rings.real_mpfr
|
|
223
|
+
152.030056160000
|
|
224
|
+
|
|
225
|
+
sage: # needs sage.rings.finite_rings
|
|
226
|
+
sage: R = GF((5, 2), 't')
|
|
227
|
+
sage: t = R.gen(0)
|
|
228
|
+
sage: q_binomial(6, 3, t)
|
|
229
|
+
2*t + 3
|
|
230
|
+
|
|
231
|
+
We can also do this for more complicated objects such as matrices or
|
|
232
|
+
symmetric functions::
|
|
233
|
+
|
|
234
|
+
sage: q_binomial(4, 2, matrix([[2,1],[-1,3]])) # needs sage.modules
|
|
235
|
+
[ -6 84]
|
|
236
|
+
[-84 78]
|
|
237
|
+
|
|
238
|
+
sage: # needs sage.combinat sage.modules
|
|
239
|
+
sage: Sym = SymmetricFunctions(QQ)
|
|
240
|
+
sage: s = Sym.schur()
|
|
241
|
+
sage: q_binomial(4,1, s[2]+s[1]) # needs lrcalc_python
|
|
242
|
+
s[] + s[1] + s[1, 1] + s[1, 1, 1] + 2*s[2] + 4*s[2, 1] + 3*s[2, 1, 1]
|
|
243
|
+
+ 4*s[2, 2] + 3*s[2, 2, 1] + s[2, 2, 2] + 3*s[3] + 7*s[3, 1] + 3*s[3, 1, 1]
|
|
244
|
+
+ 6*s[3, 2] + 2*s[3, 2, 1] + s[3, 3] + 4*s[4] + 6*s[4, 1] + s[4, 1, 1]
|
|
245
|
+
+ 3*s[4, 2] + 3*s[5] + 2*s[5, 1] + s[6]
|
|
246
|
+
|
|
247
|
+
TESTS:
|
|
248
|
+
|
|
249
|
+
One checks that the first two arguments are integers::
|
|
250
|
+
|
|
251
|
+
sage: q_binomial(1/2,1)
|
|
252
|
+
Traceback (most recent call last):
|
|
253
|
+
...
|
|
254
|
+
TypeError: no conversion of this rational to integer
|
|
255
|
+
|
|
256
|
+
One checks that either `k` or `n` is nonnegative::
|
|
257
|
+
|
|
258
|
+
sage: q_binomial(-4,-1)
|
|
259
|
+
Traceback (most recent call last):
|
|
260
|
+
...
|
|
261
|
+
ValueError: either k or n must be nonnegative
|
|
262
|
+
|
|
263
|
+
This also works for variables in the symbolic ring::
|
|
264
|
+
|
|
265
|
+
sage: z = var('z') # needs sage.symbolic
|
|
266
|
+
sage: factor(q_binomial(4, 2, z)) # needs sage.symbolic
|
|
267
|
+
(z^2 + z + 1)*(z^2 + 1)
|
|
268
|
+
|
|
269
|
+
This also works for complex roots of unity::
|
|
270
|
+
|
|
271
|
+
sage: q_binomial(10, 4, QQbar(I)) # needs sage.rings.number_field
|
|
272
|
+
2
|
|
273
|
+
|
|
274
|
+
Note that the symbolic computation works (see :issue:`14982`)::
|
|
275
|
+
|
|
276
|
+
sage: q_binomial(10, 4, I) # needs sage.rings.number_field
|
|
277
|
+
2
|
|
278
|
+
|
|
279
|
+
Check that the algorithm does not matter::
|
|
280
|
+
|
|
281
|
+
sage: q_binomial(6, 3, algorithm='naive') == q_binomial(6, 3, algorithm='cyclotomic')
|
|
282
|
+
True
|
|
283
|
+
|
|
284
|
+
One more test::
|
|
285
|
+
|
|
286
|
+
sage: q_binomial(4, 2, Zmod(6)(2), algorithm='naive')
|
|
287
|
+
5
|
|
288
|
+
|
|
289
|
+
Check that it works with Python integers::
|
|
290
|
+
|
|
291
|
+
sage: r = q_binomial(3r, 2r, 1r); r
|
|
292
|
+
3
|
|
293
|
+
sage: type(r)
|
|
294
|
+
<class 'int'>
|
|
295
|
+
|
|
296
|
+
Check that arbitrary polynomials work::
|
|
297
|
+
|
|
298
|
+
sage: R.<x> = ZZ[]
|
|
299
|
+
sage: q_binomial(2, 1, x^2 - 1, algorithm='naive')
|
|
300
|
+
x^2
|
|
301
|
+
sage: q_binomial(2, 1, x^2 - 1, algorithm='cyclotomic')
|
|
302
|
+
x^2
|
|
303
|
+
|
|
304
|
+
Check that the parent is always the parent of ``q``::
|
|
305
|
+
|
|
306
|
+
sage: # needs sage.rings.number_field
|
|
307
|
+
sage: R.<q> = CyclotomicField(3)
|
|
308
|
+
sage: for algo in ["naive", "cyclotomic"]:
|
|
309
|
+
....: for n in range(4):
|
|
310
|
+
....: for k in range(4):
|
|
311
|
+
....: a = q_binomial(n, k, q, algorithm=algo)
|
|
312
|
+
....: assert a.parent() is R
|
|
313
|
+
|
|
314
|
+
::
|
|
315
|
+
|
|
316
|
+
sage: q_binomial(2, 1, x^2 - 1, algorithm='quantum')
|
|
317
|
+
Traceback (most recent call last):
|
|
318
|
+
...
|
|
319
|
+
ValueError: unknown algorithm 'quantum'
|
|
320
|
+
|
|
321
|
+
REFERENCES:
|
|
322
|
+
|
|
323
|
+
.. [CH2006] William Y.C. Chen and Qing-Hu Hou, *Factors of the Gaussian
|
|
324
|
+
coefficients*, Discrete Mathematics 306 (2006), 1446-1449.
|
|
325
|
+
:doi:`10.1016/j.disc.2006.03.031`
|
|
326
|
+
|
|
327
|
+
AUTHORS:
|
|
328
|
+
|
|
329
|
+
- Frédéric Chapoton, David Joyner and William Stein
|
|
330
|
+
"""
|
|
331
|
+
# sanity checks
|
|
332
|
+
n = ZZ(n)
|
|
333
|
+
k = ZZ(k)
|
|
334
|
+
if k < 0 and n < 0:
|
|
335
|
+
raise ValueError('either k or n must be nonnegative')
|
|
336
|
+
|
|
337
|
+
# polynomiality test
|
|
338
|
+
if q is None:
|
|
339
|
+
is_polynomial = True
|
|
340
|
+
if n >= 0:
|
|
341
|
+
q = polygen(ZZ, 'q')
|
|
342
|
+
else:
|
|
343
|
+
q = LaurentPolynomialRing(ZZ, 'q').gen()
|
|
344
|
+
else:
|
|
345
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
346
|
+
is_polynomial = isinstance(q, Polynomial)
|
|
347
|
+
|
|
348
|
+
if n < 0:
|
|
349
|
+
return (-1)**k * q**(k * n - (k * k - k) // 2) * q_binomial(-n + k - 1, k, q=q)
|
|
350
|
+
|
|
351
|
+
k = min(n - k, k) # Pick the smallest k
|
|
352
|
+
|
|
353
|
+
# We support non-Sage Elements too, where parent(q) is really
|
|
354
|
+
# type(q). The calls R(0) and R(1) should work in all cases to
|
|
355
|
+
# generate the correct 0 and 1 elements.
|
|
356
|
+
R = parent(q)
|
|
357
|
+
zero = R(0)
|
|
358
|
+
one = R(1)
|
|
359
|
+
|
|
360
|
+
if k <= 0:
|
|
361
|
+
return one if k == 0 else zero
|
|
362
|
+
|
|
363
|
+
# heuristic choice of the fastest algorithm
|
|
364
|
+
if algorithm == 'auto':
|
|
365
|
+
if n <= 70 or k <= n // 4:
|
|
366
|
+
algorithm = 'naive'
|
|
367
|
+
elif is_polynomial:
|
|
368
|
+
algorithm = 'cyclotomic'
|
|
369
|
+
else:
|
|
370
|
+
import sage.rings.abc
|
|
371
|
+
if isinstance(R, sage.rings.abc.SymbolicRing):
|
|
372
|
+
algorithm = 'cyclotomic'
|
|
373
|
+
else:
|
|
374
|
+
algorithm = 'naive'
|
|
375
|
+
|
|
376
|
+
# the algorithms
|
|
377
|
+
while algorithm == 'naive':
|
|
378
|
+
denom = prod(one - q**i for i in range(1, k + 1))
|
|
379
|
+
if not denom: # q is a root of unity, use the cyclotomic algorithm
|
|
380
|
+
algorithm = 'cyclotomic'
|
|
381
|
+
break
|
|
382
|
+
else:
|
|
383
|
+
num = prod(one - q**i for i in range(n - k + 1, n + 1))
|
|
384
|
+
try:
|
|
385
|
+
try:
|
|
386
|
+
return num // denom
|
|
387
|
+
except TypeError:
|
|
388
|
+
return num / denom
|
|
389
|
+
except (TypeError, ZeroDivisionError):
|
|
390
|
+
# use substitution instead
|
|
391
|
+
return q_binomial(n, k)(q)
|
|
392
|
+
if algorithm == 'cyclotomic':
|
|
393
|
+
from sage.rings.polynomial.cyclotomic import cyclotomic_value
|
|
394
|
+
return prod(cyclotomic_value(d, q)
|
|
395
|
+
for d in range(2, n + 1)
|
|
396
|
+
if (n//d) != (k//d) + ((n-k)//d))
|
|
397
|
+
else:
|
|
398
|
+
raise ValueError("unknown algorithm {!r}".format(algorithm))
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def gaussian_binomial(n, k, q=None, algorithm='auto'):
|
|
402
|
+
r"""
|
|
403
|
+
This is an alias of :func:`q_binomial`.
|
|
404
|
+
|
|
405
|
+
See :func:`q_binomial` for the full documentation.
|
|
406
|
+
|
|
407
|
+
EXAMPLES::
|
|
408
|
+
|
|
409
|
+
sage: gaussian_binomial(4,2)
|
|
410
|
+
q^4 + q^3 + 2*q^2 + q + 1
|
|
411
|
+
"""
|
|
412
|
+
return q_binomial(n, k, q, algorithm)
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def q_multinomial(seq, q=None, binomial_algorithm='auto'):
|
|
416
|
+
r"""
|
|
417
|
+
Return the `q`-multinomial coefficient.
|
|
418
|
+
|
|
419
|
+
This is also known as the Gaussian multinomial coefficient, and is
|
|
420
|
+
defined by
|
|
421
|
+
|
|
422
|
+
.. MATH::
|
|
423
|
+
|
|
424
|
+
\binom{n}{k_1, k_2, \ldots, k_m}_q = \frac{[n]_q!}
|
|
425
|
+
{[k_1]_q! [k_2]_q! \cdots [k_m]_q!}
|
|
426
|
+
|
|
427
|
+
where `n = k_1 + k_2 + \cdots + k_m`.
|
|
428
|
+
|
|
429
|
+
If `q` is unspecified, then the variable is the generator `q` for
|
|
430
|
+
a univariate polynomial ring over the integers.
|
|
431
|
+
|
|
432
|
+
INPUT:
|
|
433
|
+
|
|
434
|
+
- ``seq`` -- an iterable of the values `k_1` to `k_m` defined above
|
|
435
|
+
|
|
436
|
+
- ``q`` -- (default: ``None``) the variable `q`; if ``None``, then use a
|
|
437
|
+
default variable in `\ZZ[q]`
|
|
438
|
+
|
|
439
|
+
- ``binomial_algorithm`` -- (default: ``'auto'``) the algorithm to use
|
|
440
|
+
in :meth:`~sage.combinat.q_analogues.q_binomial`; see possible values
|
|
441
|
+
there
|
|
442
|
+
|
|
443
|
+
ALGORITHM:
|
|
444
|
+
|
|
445
|
+
We use the equivalent formula
|
|
446
|
+
|
|
447
|
+
.. MATH::
|
|
448
|
+
|
|
449
|
+
\binom{k_1 + \cdots + k_m}{k_1, \ldots, k_m}_q
|
|
450
|
+
= \prod_{i=1}^m \binom{\sum_{j=1}^i k_j}{k_i}_q.
|
|
451
|
+
|
|
452
|
+
EXAMPLES::
|
|
453
|
+
|
|
454
|
+
sage: from sage.combinat.q_analogues import q_multinomial
|
|
455
|
+
sage: q_multinomial([1,2,1])
|
|
456
|
+
q^5 + 2*q^4 + 3*q^3 + 3*q^2 + 2*q + 1
|
|
457
|
+
sage: q_multinomial([1,2,1], q=1) == multinomial([1,2,1])
|
|
458
|
+
True
|
|
459
|
+
sage: q_multinomial((3,2)) == q_binomial(5,3)
|
|
460
|
+
True
|
|
461
|
+
sage: q_multinomial([])
|
|
462
|
+
1
|
|
463
|
+
"""
|
|
464
|
+
binomials = []
|
|
465
|
+
partial_sum = 0
|
|
466
|
+
for elem in seq:
|
|
467
|
+
partial_sum += elem
|
|
468
|
+
binomials.append(q_binomial(partial_sum, elem, q=q, algorithm=binomial_algorithm))
|
|
469
|
+
return prod(binomials)
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
gaussian_multinomial = q_multinomial
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
def q_catalan_number(n, q=None, m=1):
|
|
476
|
+
"""
|
|
477
|
+
Return the `q`-Catalan number of index `n`.
|
|
478
|
+
|
|
479
|
+
INPUT:
|
|
480
|
+
|
|
481
|
+
- ``q`` -- (optional) variable
|
|
482
|
+
|
|
483
|
+
- ``m`` -- (optional) integer; to get instead the ``m``-Fuss-Catalan numbers
|
|
484
|
+
|
|
485
|
+
If `q` is unspecified, then it defaults to using the generator `q` for
|
|
486
|
+
a univariate polynomial ring over the integers.
|
|
487
|
+
|
|
488
|
+
There are several `q`-Catalan numbers. This procedure
|
|
489
|
+
returns the one which can be written using the `q`-binomial coefficients.
|
|
490
|
+
|
|
491
|
+
EXAMPLES::
|
|
492
|
+
|
|
493
|
+
sage: from sage.combinat.q_analogues import q_catalan_number
|
|
494
|
+
sage: q_catalan_number(4)
|
|
495
|
+
q^12 + q^10 + q^9 + 2*q^8 + q^7 + 2*q^6 + q^5 + 2*q^4 + q^3 + q^2 + 1
|
|
496
|
+
|
|
497
|
+
sage: p = ZZ['p'].0
|
|
498
|
+
sage: q_catalan_number(4, p)
|
|
499
|
+
p^12 + p^10 + p^9 + 2*p^8 + p^7 + 2*p^6 + p^5 + 2*p^4 + p^3 + p^2 + 1
|
|
500
|
+
|
|
501
|
+
sage: q_catalan_number(3, m=2)
|
|
502
|
+
q^12 + q^10 + q^9 + q^8 + q^7 + 2*q^6 + q^5 + q^4 + q^3 + q^2 + 1
|
|
503
|
+
|
|
504
|
+
TESTS:
|
|
505
|
+
|
|
506
|
+
The `q`-Catalan number of index `n` is only defined for `n` a
|
|
507
|
+
nonnegative integer (:issue:`11411`)::
|
|
508
|
+
|
|
509
|
+
sage: q_catalan_number(-2)
|
|
510
|
+
Traceback (most recent call last):
|
|
511
|
+
...
|
|
512
|
+
ValueError: argument (-2) must be a nonnegative integer
|
|
513
|
+
|
|
514
|
+
sage: q_catalan_number(3).parent()
|
|
515
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
516
|
+
sage: q_catalan_number(0).parent()
|
|
517
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
518
|
+
"""
|
|
519
|
+
if n in ZZ:
|
|
520
|
+
if n in {0, 1}:
|
|
521
|
+
return q_int(1, q)
|
|
522
|
+
if n >= 2:
|
|
523
|
+
return (prod(q_int(j, q)
|
|
524
|
+
for j in range(m * n + 2, (m + 1) * n + 1)) //
|
|
525
|
+
prod(q_int(j, q)
|
|
526
|
+
for j in range(2, n + 1)))
|
|
527
|
+
raise ValueError(f"argument ({n}) must be a nonnegative integer")
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
def qt_catalan_number(n):
|
|
531
|
+
"""
|
|
532
|
+
Return the `q,t`-Catalan number of index `n`.
|
|
533
|
+
|
|
534
|
+
EXAMPLES::
|
|
535
|
+
|
|
536
|
+
sage: # needs sage.combinat
|
|
537
|
+
sage: from sage.combinat.q_analogues import qt_catalan_number
|
|
538
|
+
sage: qt_catalan_number(1)
|
|
539
|
+
1
|
|
540
|
+
sage: qt_catalan_number(2)
|
|
541
|
+
q + t
|
|
542
|
+
sage: qt_catalan_number(3)
|
|
543
|
+
q^3 + q^2*t + q*t^2 + t^3 + q*t
|
|
544
|
+
sage: qt_catalan_number(4)
|
|
545
|
+
q^6 + q^5*t + q^4*t^2 + q^3*t^3 + q^2*t^4 + q*t^5 + t^6 + q^4*t + q^3*t^2 + q^2*t^3 + q*t^4 + q^3*t + q^2*t^2 + q*t^3
|
|
546
|
+
|
|
547
|
+
The `q,t`-Catalan number of index `n` is only defined for `n` a
|
|
548
|
+
nonnegative integer (:issue:`11411`)::
|
|
549
|
+
|
|
550
|
+
sage: qt_catalan_number(-2) # needs sage.combinat
|
|
551
|
+
Traceback (most recent call last):
|
|
552
|
+
...
|
|
553
|
+
ValueError: argument (-2) must be a nonnegative integer
|
|
554
|
+
"""
|
|
555
|
+
if n in ZZ and n >= 0:
|
|
556
|
+
ZZqt = ZZ['q', 't']
|
|
557
|
+
d = {}
|
|
558
|
+
for dw in DyckWords(n):
|
|
559
|
+
tup = (dw.area(), dw.bounce())
|
|
560
|
+
d[tup] = d.get(tup, 0) + 1
|
|
561
|
+
return ZZqt(d)
|
|
562
|
+
else:
|
|
563
|
+
raise ValueError("argument (%s) must be a nonnegative integer" % n)
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
def q_pochhammer(n, a, q=None):
|
|
567
|
+
r"""
|
|
568
|
+
Return the `q`-Pochhammer `(a; q)_n`.
|
|
569
|
+
|
|
570
|
+
The `q`-Pochhammer symbol is defined by
|
|
571
|
+
|
|
572
|
+
.. MATH::
|
|
573
|
+
|
|
574
|
+
(a; q)_n = \prod_{k=0}^{n-1} (1 - aq^k)
|
|
575
|
+
|
|
576
|
+
with `(a; q)_0 = 1` for all `a, q` and `n \in \NN`.
|
|
577
|
+
By using the identity
|
|
578
|
+
|
|
579
|
+
.. MATH::
|
|
580
|
+
|
|
581
|
+
(a; q)_n = \frac{(a; q)_{\infty}}{(aq^n; q)_{\infty}},
|
|
582
|
+
|
|
583
|
+
we can extend the definition to `n < 0` by
|
|
584
|
+
|
|
585
|
+
.. MATH::
|
|
586
|
+
|
|
587
|
+
(a; q)_n = \frac{1}{(aq^n; q)_{-n}}
|
|
588
|
+
= \prod_{k=1}^{-n} \frac{1}{1 - a/q^k}.
|
|
589
|
+
|
|
590
|
+
EXAMPLES::
|
|
591
|
+
|
|
592
|
+
sage: from sage.combinat.q_analogues import q_pochhammer
|
|
593
|
+
sage: q_pochhammer(3, 1/7)
|
|
594
|
+
6/343*q^3 - 6/49*q^2 - 6/49*q + 6/7
|
|
595
|
+
sage: q_pochhammer(3, 3)
|
|
596
|
+
-18*q^3 + 6*q^2 + 6*q - 2
|
|
597
|
+
sage: q_pochhammer(3, 1)
|
|
598
|
+
0
|
|
599
|
+
|
|
600
|
+
sage: R.<q> = ZZ[]
|
|
601
|
+
sage: q_pochhammer(4, q)
|
|
602
|
+
q^10 - q^9 - q^8 + 2*q^5 - q^2 - q + 1
|
|
603
|
+
sage: q_pochhammer(4, q^2)
|
|
604
|
+
q^14 - q^12 - q^11 - q^10 + q^8 + 2*q^7 + q^6 - q^4 - q^3 - q^2 + 1
|
|
605
|
+
sage: q_pochhammer(-3, q)
|
|
606
|
+
1/(-q^9 + q^7 + q^6 + q^5 - q^4 - q^3 - q^2 + 1)
|
|
607
|
+
|
|
608
|
+
TESTS::
|
|
609
|
+
|
|
610
|
+
sage: q_pochhammer(0, 2)
|
|
611
|
+
1
|
|
612
|
+
sage: q_pochhammer(0, 1)
|
|
613
|
+
1
|
|
614
|
+
sage: q_pochhammer(0, var('a')) # needs sage.symbolic
|
|
615
|
+
1
|
|
616
|
+
|
|
617
|
+
We check that :issue:`25715` is fixed::
|
|
618
|
+
|
|
619
|
+
sage: q_pochhammer(0, 3r)
|
|
620
|
+
1
|
|
621
|
+
|
|
622
|
+
REFERENCES:
|
|
623
|
+
|
|
624
|
+
- :wikipedia:`Q-Pochhammer_symbol`
|
|
625
|
+
"""
|
|
626
|
+
if q is None:
|
|
627
|
+
q = polygen(ZZ, 'q')
|
|
628
|
+
if n not in ZZ:
|
|
629
|
+
raise ValueError("{} must be an integer".format(n))
|
|
630
|
+
R = parent(q)
|
|
631
|
+
one = R(1)
|
|
632
|
+
if n < 0:
|
|
633
|
+
return R.prod(one / (one - a/q**-k) for k in range(1, -n+1))
|
|
634
|
+
return R.prod((one - a*q**k) for k in range(n))
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
@cached_function(key=lambda t, q: (_Partitions(t), q))
|
|
638
|
+
def q_jordan(t, q=None):
|
|
639
|
+
r"""
|
|
640
|
+
Return the `q`-Jordan number of `t`.
|
|
641
|
+
|
|
642
|
+
If `q` is the power of a prime number, the output is the number of
|
|
643
|
+
complete flags in `\GF{q}^N` (where `N` is the size of `t`) stable
|
|
644
|
+
under a linear nilpotent endomorphism `f_t` whose Jordan type is
|
|
645
|
+
given by `t`, i.e. such that for all `i`:
|
|
646
|
+
|
|
647
|
+
.. MATH::
|
|
648
|
+
|
|
649
|
+
\dim (\ker f_t^i) = t[0] + \cdots + t[i-1]
|
|
650
|
+
|
|
651
|
+
If `q` is unspecified, then it defaults to using the generator `q` for
|
|
652
|
+
a univariate polynomial ring over the integers.
|
|
653
|
+
|
|
654
|
+
The result is cached.
|
|
655
|
+
|
|
656
|
+
INPUT:
|
|
657
|
+
|
|
658
|
+
- ``t`` -- integer partition, or an argument accepted by :class:`Partition`
|
|
659
|
+
|
|
660
|
+
- ``q`` -- (default: ``None``) the variable `q`; if ``None``, then use a
|
|
661
|
+
default variable in `\ZZ[q]`
|
|
662
|
+
|
|
663
|
+
EXAMPLES::
|
|
664
|
+
|
|
665
|
+
sage: from sage.combinat.q_analogues import q_jordan
|
|
666
|
+
sage: [q_jordan(mu, 2) for mu in Partitions(5)]
|
|
667
|
+
[9765, 1029, 213, 93, 29, 9, 1]
|
|
668
|
+
sage: [q_jordan(mu, 2) for mu in Partitions(6)]
|
|
669
|
+
[615195, 40635, 5643, 2331, 1491, 515, 147, 87, 47, 11, 1]
|
|
670
|
+
sage: q_jordan([3,2,1])
|
|
671
|
+
16*q^4 + 24*q^3 + 14*q^2 + 5*q + 1
|
|
672
|
+
sage: q_jordan([2,1], x) # needs sage.symbolic
|
|
673
|
+
2*x + 1
|
|
674
|
+
|
|
675
|
+
If the partition is trivial (i.e. has only one part), we get
|
|
676
|
+
the `q`-factorial (in this case, the nilpotent endomorphism is
|
|
677
|
+
necessarily `0`)::
|
|
678
|
+
|
|
679
|
+
sage: from sage.combinat.q_analogues import q_factorial
|
|
680
|
+
sage: q_jordan([5]) == q_factorial(5)
|
|
681
|
+
True
|
|
682
|
+
sage: q_jordan([11], 5) == q_factorial(11, 5)
|
|
683
|
+
True
|
|
684
|
+
|
|
685
|
+
TESTS::
|
|
686
|
+
|
|
687
|
+
sage: all(multinomial(mu.conjugate()) == q_jordan(mu, 1) for mu in Partitions(6))
|
|
688
|
+
True
|
|
689
|
+
|
|
690
|
+
AUTHOR:
|
|
691
|
+
|
|
692
|
+
- Xavier Caruso (2012-06-29)
|
|
693
|
+
"""
|
|
694
|
+
if q is None:
|
|
695
|
+
q = polygen(ZZ, 'q')
|
|
696
|
+
|
|
697
|
+
if all(part == 0 for part in t):
|
|
698
|
+
return parent(q)(1)
|
|
699
|
+
tj = 0
|
|
700
|
+
res = parent(q)(0)
|
|
701
|
+
for i in range(len(t) - 1, -1, -1):
|
|
702
|
+
ti = t[i]
|
|
703
|
+
if ti > tj:
|
|
704
|
+
tp = list(t)
|
|
705
|
+
tp[i] -= 1
|
|
706
|
+
res += q_jordan(tp, q) * q**tj * q_int(ti - tj, q)
|
|
707
|
+
tj = ti
|
|
708
|
+
return res
|
|
709
|
+
|
|
710
|
+
|
|
711
|
+
def q_subgroups_of_abelian_group(la, mu, q=None, algorithm='birkhoff'):
|
|
712
|
+
r"""
|
|
713
|
+
Return the `q`-number of subgroups of type ``mu`` in a finite abelian
|
|
714
|
+
group of type ``la``.
|
|
715
|
+
|
|
716
|
+
INPUT:
|
|
717
|
+
|
|
718
|
+
- ``la`` -- type of the ambient group as a :class:`Partition`
|
|
719
|
+
- ``mu`` -- type of the subgroup as a :class:`Partition`
|
|
720
|
+
- ``q`` -- (default: ``None``) an indeterminate or a prime number; if
|
|
721
|
+
``None``, this defaults to `q \in \ZZ[q]`
|
|
722
|
+
- ``algorithm`` -- (default: ``'birkhoff'``) the algorithm to use can be
|
|
723
|
+
one of the following:
|
|
724
|
+
|
|
725
|
+
- ``'birkhoff`` -- use the Birkhoff formula from [Bu87]_
|
|
726
|
+
- ``'delsarte'`` -- use the formula from [Delsarte48]_
|
|
727
|
+
|
|
728
|
+
OUTPUT:
|
|
729
|
+
|
|
730
|
+
The number of subgroups of type ``mu`` in a group of type ``la`` as a
|
|
731
|
+
polynomial in ``q``.
|
|
732
|
+
|
|
733
|
+
ALGORITHM:
|
|
734
|
+
|
|
735
|
+
Let `q` be a prime number and `\lambda = (\lambda_1, \ldots, \lambda_l)`
|
|
736
|
+
be a partition. A finite abelian `q`-group is of type `\lambda` if it
|
|
737
|
+
is isomorphic to
|
|
738
|
+
|
|
739
|
+
.. MATH::
|
|
740
|
+
|
|
741
|
+
\ZZ / q^{\lambda_1} \ZZ \times \cdots \times \ZZ / q^{\lambda_l} \ZZ.
|
|
742
|
+
|
|
743
|
+
The formula from [Bu87]_ works as follows:
|
|
744
|
+
Let `\lambda` and `\mu` be partitions. Let `\lambda^{\prime}` and
|
|
745
|
+
`\mu^{\prime}` denote the conjugate partitions to `\lambda` and `\mu`,
|
|
746
|
+
respectively. The number of subgroups of type `\mu` in a group of type
|
|
747
|
+
`\lambda` is given by
|
|
748
|
+
|
|
749
|
+
.. MATH::
|
|
750
|
+
|
|
751
|
+
\prod_{i=1}^{\mu_1} q^{\mu^{\prime}_{i+1}
|
|
752
|
+
(\lambda^{\prime}_i - \mu^{\prime}_i)}
|
|
753
|
+
\binom{\lambda^{\prime}_i - \mu^{\prime}_{i+1}}
|
|
754
|
+
{\mu^{\prime}_i - \mu^{\prime}_{i+1}}_q
|
|
755
|
+
|
|
756
|
+
The formula from [Delsarte48]_ works as follows:
|
|
757
|
+
Let `\lambda` and `\mu` be partitions. Let `(s_1, s_2, \ldots, s_l)`
|
|
758
|
+
and `(r_1, r_2, \ldots, r_k)` denote the parts of the partitions
|
|
759
|
+
conjugate to `\lambda` and `\mu` respectively. Let
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
.. MATH::
|
|
763
|
+
|
|
764
|
+
\mathfrak{F}(\xi_1, \ldots, \xi_k) = \xi_1^{r_2} \xi_2^{r_3} \cdots
|
|
765
|
+
\xi_{k-1}^{r_k} \prod_{i_1=r_2}^{r_1-1} (\xi_1-q^{i_1})
|
|
766
|
+
\prod_{i_2=r_3}^{r_2-1} (\xi_2-q^{i_2}) \cdots
|
|
767
|
+
\prod_{i_k=0}^{r_k-1} (\xi_k-q^{-i_k}).
|
|
768
|
+
|
|
769
|
+
Then the number of subgroups of type `\mu` in a group of type `\lambda`
|
|
770
|
+
is given by
|
|
771
|
+
|
|
772
|
+
.. MATH::
|
|
773
|
+
|
|
774
|
+
\frac{\mathfrak{F}(q^{s_1}, q^{s_2}, \ldots, q^{s_k})}{\mathfrak{F}
|
|
775
|
+
(q^{r_1}, q^{r_2}, \ldots, q^{r_k})}.
|
|
776
|
+
|
|
777
|
+
EXAMPLES::
|
|
778
|
+
|
|
779
|
+
sage: from sage.combinat.q_analogues import q_subgroups_of_abelian_group
|
|
780
|
+
sage: q_subgroups_of_abelian_group([1,1], [1])
|
|
781
|
+
q + 1
|
|
782
|
+
sage: q_subgroups_of_abelian_group([3,3,2,1], [2,1])
|
|
783
|
+
q^6 + 2*q^5 + 3*q^4 + 2*q^3 + q^2
|
|
784
|
+
sage: R.<t> = QQ[]
|
|
785
|
+
sage: q_subgroups_of_abelian_group([5,3,1], [3,1], t)
|
|
786
|
+
t^4 + 2*t^3 + t^2
|
|
787
|
+
sage: q_subgroups_of_abelian_group([5,3,1], [3,1], 3)
|
|
788
|
+
144
|
|
789
|
+
sage: q_subgroups_of_abelian_group([1,1,1], [1]) == q_subgroups_of_abelian_group([1,1,1], [1,1])
|
|
790
|
+
True
|
|
791
|
+
sage: q_subgroups_of_abelian_group([5], [3])
|
|
792
|
+
1
|
|
793
|
+
sage: q_subgroups_of_abelian_group([1], [2])
|
|
794
|
+
0
|
|
795
|
+
sage: q_subgroups_of_abelian_group([2], [1,1])
|
|
796
|
+
0
|
|
797
|
+
|
|
798
|
+
TESTS:
|
|
799
|
+
|
|
800
|
+
Check the same examples with ``algorithm='delsarte'``::
|
|
801
|
+
|
|
802
|
+
sage: q_subgroups_of_abelian_group([1,1], [1], algorithm='delsarte')
|
|
803
|
+
q + 1
|
|
804
|
+
sage: q_subgroups_of_abelian_group([3,3,2,1], [2,1], algorithm='delsarte')
|
|
805
|
+
q^6 + 2*q^5 + 3*q^4 + 2*q^3 + q^2
|
|
806
|
+
sage: q_subgroups_of_abelian_group([5,3,1], [3,1], t, algorithm='delsarte')
|
|
807
|
+
t^4 + 2*t^3 + t^2
|
|
808
|
+
sage: q_subgroups_of_abelian_group([5,3,1], [3,1], 3, algorithm='delsarte')
|
|
809
|
+
144
|
|
810
|
+
sage: q_subgroups_of_abelian_group([1,1,1], [1], algorithm='delsarte') == q_subgroups_of_abelian_group([1,1,1], [1,1])
|
|
811
|
+
True
|
|
812
|
+
sage: q_subgroups_of_abelian_group([5], [3], algorithm='delsarte')
|
|
813
|
+
1
|
|
814
|
+
sage: q_subgroups_of_abelian_group([1], [2], algorithm='delsarte')
|
|
815
|
+
0
|
|
816
|
+
sage: q_subgroups_of_abelian_group([2], [1,1], algorithm='delsarte')
|
|
817
|
+
0
|
|
818
|
+
|
|
819
|
+
Check that :issue:`25715` is fixed::
|
|
820
|
+
|
|
821
|
+
sage: parent(q_subgroups_of_abelian_group([2], [1], algorithm='delsarte'))
|
|
822
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
823
|
+
sage: q_subgroups_of_abelian_group([7,7,1], [])
|
|
824
|
+
1
|
|
825
|
+
sage: q_subgroups_of_abelian_group([7,7,1], [0,0])
|
|
826
|
+
1
|
|
827
|
+
|
|
828
|
+
REFERENCES:
|
|
829
|
+
|
|
830
|
+
.. [Bu87] Butler, Lynne M. *A unimodality result in the enumeration
|
|
831
|
+
of subgroups of a finite abelian group.* Proceedings of the American
|
|
832
|
+
Mathematical Society 101, no. 4 (1987): 771-775.
|
|
833
|
+
:doi:`10.1090/S0002-9939-1987-0911049-8`
|
|
834
|
+
|
|
835
|
+
.. [Delsarte48] \S. Delsarte, *Fonctions de Möbius Sur Les Groupes Abéliens
|
|
836
|
+
Finis*, Annals of Mathematics, second series, Vol. 45, No. 3, (Jul 1948),
|
|
837
|
+
pp. 600-609. http://www.jstor.org/stable/1969047
|
|
838
|
+
|
|
839
|
+
AUTHORS:
|
|
840
|
+
|
|
841
|
+
- Amritanshu Prasad (2013-06-07): Implemented the Delsarte algorithm
|
|
842
|
+
- Tomer Bauer (2013, 2018): Implemented the Birkhoff algorithm and refactoring
|
|
843
|
+
"""
|
|
844
|
+
if q is None:
|
|
845
|
+
q = polygen(ZZ, 'q')
|
|
846
|
+
la_c = _Partitions(la).conjugate()
|
|
847
|
+
mu_c = _Partitions(mu).conjugate()
|
|
848
|
+
k = mu_c.length()
|
|
849
|
+
if not mu_c:
|
|
850
|
+
# There is only one trivial subgroup
|
|
851
|
+
return parent(q)(1)
|
|
852
|
+
if not la_c.contains(mu_c):
|
|
853
|
+
return parent(q)(0)
|
|
854
|
+
|
|
855
|
+
if algorithm == 'delsarte':
|
|
856
|
+
def F(args):
|
|
857
|
+
prd = lambda j: prod(args[j]-q**i for i in range(mu_c[j+1], mu_c[j]))
|
|
858
|
+
F1 = prod(args[i]**mu_c[i+1] * prd(i) for i in range(k-1))
|
|
859
|
+
return F1 * prod(args[k-1]-q**i for i in range(mu_c[k-1]))
|
|
860
|
+
|
|
861
|
+
return F([q**ss for ss in la_c[:k]])//F([q**rr for rr in mu_c])
|
|
862
|
+
|
|
863
|
+
if algorithm == 'birkhoff':
|
|
864
|
+
fac1 = q**(sum(mu_c[i+1] * (la_c[i]-mu_c[i]) for i in range(k-1)))
|
|
865
|
+
fac2 = prod(q_binomial(la_c[i]-mu_c[i+1], mu_c[i]-mu_c[i+1], q=q) for i in range(k-1))
|
|
866
|
+
fac3 = q_binomial(la_c[k-1], mu_c[k-1], q=q)
|
|
867
|
+
|
|
868
|
+
return prod([fac1, fac2, fac3])
|
|
869
|
+
|
|
870
|
+
raise ValueError("invalid algorithm choice")
|
|
871
|
+
|
|
872
|
+
|
|
873
|
+
@cached_function
|
|
874
|
+
def q_stirling_number1(n, k, q=None):
|
|
875
|
+
r"""
|
|
876
|
+
Return the (unsigned) `q`-Stirling number of the first kind.
|
|
877
|
+
|
|
878
|
+
This is a `q`-analogue of :func:`sage.combinat.combinat.stirling_number1` .
|
|
879
|
+
|
|
880
|
+
INPUT:
|
|
881
|
+
|
|
882
|
+
- ``n``, ``k`` -- integers with `1 \leq k \leq n`
|
|
883
|
+
|
|
884
|
+
- ``q`` -- variable (default: `q`)
|
|
885
|
+
|
|
886
|
+
OUTPUT: a polynomial in the variable `q`
|
|
887
|
+
|
|
888
|
+
These polynomials satisfy the recurrence
|
|
889
|
+
|
|
890
|
+
.. MATH::
|
|
891
|
+
|
|
892
|
+
s_{n,k} = s_{n-1,k-1} + [n-1]_q s_{n-1, k}.
|
|
893
|
+
|
|
894
|
+
EXAMPLES::
|
|
895
|
+
|
|
896
|
+
sage: from sage.combinat.q_analogues import q_stirling_number1
|
|
897
|
+
sage: q_stirling_number1(4,2)
|
|
898
|
+
q^3 + 3*q^2 + 4*q + 3
|
|
899
|
+
|
|
900
|
+
sage: all(stirling_number1(6,k) == q_stirling_number1(6,k)(1) # needs sage.libs.gap
|
|
901
|
+
....: for k in range(1,6))
|
|
902
|
+
True
|
|
903
|
+
|
|
904
|
+
sage: x = polygen(QQ['q'],'x')
|
|
905
|
+
sage: S = sum(q_stirling_number1(5,k)*x**k for k in range(1, 6))
|
|
906
|
+
sage: factor(S) # needs sage.libs.singular
|
|
907
|
+
x * (x + 1) * (x + q + 1) * (x + q^2 + q + 1) * (x + q^3 + q^2 + q + 1)
|
|
908
|
+
|
|
909
|
+
TESTS::
|
|
910
|
+
|
|
911
|
+
sage: q_stirling_number1(-1,2)
|
|
912
|
+
Traceback (most recent call last):
|
|
913
|
+
...
|
|
914
|
+
ValueError: q-Stirling numbers are not defined for n < 0
|
|
915
|
+
|
|
916
|
+
We check that :issue:`25715` is fixed::
|
|
917
|
+
|
|
918
|
+
sage: q_stirling_number1(2,1,1r)
|
|
919
|
+
1
|
|
920
|
+
|
|
921
|
+
REFERENCES:
|
|
922
|
+
|
|
923
|
+
- [Ca1948]_
|
|
924
|
+
|
|
925
|
+
- [Ca1954]_
|
|
926
|
+
"""
|
|
927
|
+
if q is None:
|
|
928
|
+
q = polygen(ZZ, 'q')
|
|
929
|
+
if n < 0:
|
|
930
|
+
raise ValueError('q-Stirling numbers are not defined for n < 0')
|
|
931
|
+
if n == 0 == k:
|
|
932
|
+
return parent(q)(1)
|
|
933
|
+
if k > n or k < 1:
|
|
934
|
+
return parent(q)(0)
|
|
935
|
+
return (q_stirling_number1(n - 1, k - 1, q=q) +
|
|
936
|
+
q_int(n - 1, q=q) * q_stirling_number1(n - 1, k, q=q))
|
|
937
|
+
|
|
938
|
+
|
|
939
|
+
@cached_function
|
|
940
|
+
def q_stirling_number2(n, k, q=None):
|
|
941
|
+
r"""
|
|
942
|
+
Return the (unsigned) `q`-Stirling number of the second kind.
|
|
943
|
+
|
|
944
|
+
This is a `q`-analogue of :func:`sage.combinat.combinat.stirling_number2`.
|
|
945
|
+
|
|
946
|
+
INPUT:
|
|
947
|
+
|
|
948
|
+
- ``n``, ``k`` -- integers with `1 \leq k \leq n`
|
|
949
|
+
|
|
950
|
+
- ``q`` -- variable (default: `q`)
|
|
951
|
+
|
|
952
|
+
OUTPUT: a polynomial in the variable `q`
|
|
953
|
+
|
|
954
|
+
These polynomials satisfy the recurrence
|
|
955
|
+
|
|
956
|
+
.. MATH::
|
|
957
|
+
|
|
958
|
+
S_{n,k} = q^{k-1} S_{n-1,k-1} + [k]_q s_{n-1, k}.
|
|
959
|
+
|
|
960
|
+
EXAMPLES::
|
|
961
|
+
|
|
962
|
+
sage: from sage.combinat.q_analogues import q_stirling_number2
|
|
963
|
+
sage: q_stirling_number2(4,2)
|
|
964
|
+
q^3 + 3*q^2 + 3*q
|
|
965
|
+
|
|
966
|
+
sage: all(stirling_number2(6,k) == q_stirling_number2(6,k)(1)
|
|
967
|
+
....: for k in range(7))
|
|
968
|
+
True
|
|
969
|
+
|
|
970
|
+
|
|
971
|
+
TESTS::
|
|
972
|
+
|
|
973
|
+
sage: q_stirling_number2(-1,2)
|
|
974
|
+
Traceback (most recent call last):
|
|
975
|
+
...
|
|
976
|
+
ValueError: q-Stirling numbers are not defined for n < 0
|
|
977
|
+
|
|
978
|
+
We check that :issue:`25715` is fixed::
|
|
979
|
+
|
|
980
|
+
sage: q_stirling_number2(1,0).parent()
|
|
981
|
+
Univariate Polynomial Ring in q over Integer Ring
|
|
982
|
+
sage: q_stirling_number2(2,1,3r)
|
|
983
|
+
1
|
|
984
|
+
|
|
985
|
+
REFERENCES:
|
|
986
|
+
|
|
987
|
+
- [Mil1978]_
|
|
988
|
+
"""
|
|
989
|
+
if q is None:
|
|
990
|
+
q = polygen(ZZ, 'q')
|
|
991
|
+
if n < 0:
|
|
992
|
+
raise ValueError('q-Stirling numbers are not defined for n < 0')
|
|
993
|
+
if n == 0 == k:
|
|
994
|
+
return parent(q)(1)
|
|
995
|
+
if k > n or k <= 0:
|
|
996
|
+
return parent(q)(0)
|
|
997
|
+
return (q**(k-1)*q_stirling_number2(n - 1, k - 1, q=q) +
|
|
998
|
+
q_int(k, q=q) * q_stirling_number2(n - 1, k, q=q))
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
def number_of_irreducible_polynomials(n, q=None, m=1):
|
|
1002
|
+
r"""
|
|
1003
|
+
Return the number of monic irreducible polynomials of degree ``n``
|
|
1004
|
+
in ``m`` variables over the finite field with ``q`` elements.
|
|
1005
|
+
|
|
1006
|
+
If ``q`` is not given, the result is returned as an integer-valued
|
|
1007
|
+
polynomial in `\QQ[q]`.
|
|
1008
|
+
|
|
1009
|
+
INPUT:
|
|
1010
|
+
|
|
1011
|
+
- ``n`` -- positive integer
|
|
1012
|
+
- ``q`` -- ``None`` (default) or a prime power
|
|
1013
|
+
- ``m`` -- positive integer (default: `1`)
|
|
1014
|
+
|
|
1015
|
+
OUTPUT: integer or integer-valued polynomial over `\QQ`
|
|
1016
|
+
|
|
1017
|
+
EXAMPLES::
|
|
1018
|
+
|
|
1019
|
+
sage: # needs sage.libs.pari
|
|
1020
|
+
sage: number_of_irreducible_polynomials(8, q=2)
|
|
1021
|
+
30
|
|
1022
|
+
sage: number_of_irreducible_polynomials(9, q=9)
|
|
1023
|
+
43046640
|
|
1024
|
+
sage: number_of_irreducible_polynomials(5, q=11, m=3)
|
|
1025
|
+
2079650567184059145647246367401741345157369643207055703168
|
|
1026
|
+
|
|
1027
|
+
::
|
|
1028
|
+
|
|
1029
|
+
sage: # needs sage.libs.pari
|
|
1030
|
+
sage: poly = number_of_irreducible_polynomials(12); poly
|
|
1031
|
+
1/12*q^12 - 1/12*q^6 - 1/12*q^4 + 1/12*q^2
|
|
1032
|
+
sage: poly(5) == number_of_irreducible_polynomials(12, q=5)
|
|
1033
|
+
True
|
|
1034
|
+
sage: poly = number_of_irreducible_polynomials(5, m=3); poly
|
|
1035
|
+
q^55 + q^54 + q^53 + q^52 + q^51 + q^50 + ... + 1/5*q^5 - 1/5*q^3 - 1/5*q^2 - 1/5*q
|
|
1036
|
+
sage: poly(11) == number_of_irreducible_polynomials(5, q=11, m=3)
|
|
1037
|
+
True
|
|
1038
|
+
|
|
1039
|
+
This function is *much* faster than enumerating the polynomials::
|
|
1040
|
+
|
|
1041
|
+
sage: # needs sage.libs.pari
|
|
1042
|
+
sage: num = number_of_irreducible_polynomials(99, q=101)
|
|
1043
|
+
sage: num.bit_length()
|
|
1044
|
+
653
|
|
1045
|
+
|
|
1046
|
+
ALGORITHM:
|
|
1047
|
+
|
|
1048
|
+
In the univariate case, classical formula
|
|
1049
|
+
`\frac1n \sum_{d\mid n} \mu(n/d) q^d`
|
|
1050
|
+
using the Möbius function `\mu`;
|
|
1051
|
+
see :func:`moebius`.
|
|
1052
|
+
|
|
1053
|
+
In the multivariate case, formula from [Bodin2007]_,
|
|
1054
|
+
independently [Alekseyev2006]_.
|
|
1055
|
+
"""
|
|
1056
|
+
n = ZZ(n)
|
|
1057
|
+
if n <= 0:
|
|
1058
|
+
raise ValueError('n must be positive')
|
|
1059
|
+
if m <= 0:
|
|
1060
|
+
raise ValueError('m must be positive')
|
|
1061
|
+
|
|
1062
|
+
if q is None:
|
|
1063
|
+
from sage.rings.rational_field import QQ
|
|
1064
|
+
q = QQ['q'].gen() # we produce an integer-valued polynomial in q, but it does not necessarily have integer coefficients
|
|
1065
|
+
|
|
1066
|
+
if m == 1:
|
|
1067
|
+
from sage.arith.misc import moebius
|
|
1068
|
+
r = sum((moebius(n//d) * q**d for d in n.divisors()), parent(q).zero())
|
|
1069
|
+
return r // n
|
|
1070
|
+
|
|
1071
|
+
from sage.functions.other import binomial
|
|
1072
|
+
from sage.combinat.partition import Partitions
|
|
1073
|
+
|
|
1074
|
+
def monic_reducible(irreducible, d):
|
|
1075
|
+
"""
|
|
1076
|
+
Compute the number of monic reducible polynomials of degree `d`
|
|
1077
|
+
given the numbers of irreducible polynomials up to degree `d-1`.
|
|
1078
|
+
"""
|
|
1079
|
+
res = 0
|
|
1080
|
+
for p in Partitions(d+1, max_part=d):
|
|
1081
|
+
res += prod(binomial(r+t-1, t) for r, t in zip(irreducible, p.to_exp(d)))
|
|
1082
|
+
return res
|
|
1083
|
+
|
|
1084
|
+
r = []
|
|
1085
|
+
for d in range(n):
|
|
1086
|
+
monic = (q**binomial(d + m, m - 1) - 1) * q**binomial(d + m, m) // (q - 1)
|
|
1087
|
+
reducible = monic_reducible(r, d)
|
|
1088
|
+
r.append(monic - reducible)
|
|
1089
|
+
|
|
1090
|
+
return r[-1]
|