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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. 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]