passagemath-modules 10.6.31rc3__cp314-cp314-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.

Potentially problematic release.


This version of passagemath-modules might be problematic. Click here for more details.

Files changed (807) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1179 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ """
3
+ Steenrod algebra bases
4
+
5
+ AUTHORS:
6
+
7
+ - John H. Palmieri (2008-07-30): version 0.9
8
+ - John H. Palmieri (2010-06-30): version 1.0
9
+ - Simon King (2011-10-25): Fix the use of cached functions
10
+
11
+ This package defines functions for computing various bases of the
12
+ Steenrod algebra, and for converting between the Milnor basis and
13
+ any other basis.
14
+
15
+ This packages implements a number of different bases, at least at
16
+ the prime 2. The Milnor and Serre-Cartan bases are the most
17
+ familiar and most standard ones, and all of the others are defined
18
+ in terms of one of these. The bases are described in the
19
+ documentation for the function
20
+ :func:`steenrod_algebra_basis`; also see the papers by
21
+ Monks [Mon1998]_ and Wood [Woo1998]_ for more information about them. For
22
+ commutator bases, see the preprint by Palmieri and Zhang [PZ2008]_.
23
+
24
+ - ``'milnor'`` -- Milnor basis
25
+
26
+ - ``'serre-cartan'`` or ``'adem'`` or ``'admissible'`` -- Serre-Cartan basis
27
+
28
+ Most of the rest of the bases are only defined when `p=2`. The only
29
+ exceptions are the `P^s_t`-bases and the commutator bases, which are
30
+ defined at all primes.
31
+
32
+ - ``'wood_y'`` -- Wood's Y basis
33
+
34
+ - ``'wood_z'`` -- Wood's Z basis
35
+
36
+ - ``'wall'``, ``'wall_long'`` -- Wall's basis
37
+
38
+ - ``'arnon_a'``, ``'arnon_a_long'`` -- Arnon's A basis
39
+
40
+ - ``'arnon_c'`` -- Arnon's C basis
41
+
42
+ - ``'pst'``, ``'pst_rlex'``, ``'pst_llex'``, ``'pst_deg'``, ``'pst_revz'`` --
43
+ various `P^s_t`-bases
44
+
45
+ - ``'comm'``, ``'comm_rlex'``, ``'comm_llex'``, ``'comm_deg'``, ``'comm_revz'``,
46
+ or these with ``'_long'`` appended -- various commutator bases
47
+
48
+ The main functions provided here are
49
+
50
+ - :func:`steenrod_algebra_basis`. This computes a tuple representing
51
+ basis elements for the Steenrod algebra in a given degree, at a
52
+ given prime, with respect to a given basis. It is a cached function.
53
+
54
+ - :func:`convert_to_milnor_matrix`. This returns the change-of-basis
55
+ matrix, in a given degree, from any basis to the Milnor basis. It is
56
+ a cached function.
57
+
58
+ - :func:`convert_from_milnor_matrix`. This returns the inverse of the
59
+ previous matrix.
60
+
61
+ INTERNAL DOCUMENTATION:
62
+
63
+ If you want to implement a new basis for the Steenrod algebra:
64
+
65
+ In the file :file:`steenrod_algebra.py`:
66
+
67
+ For the class :class:`SteenrodAlgebra_generic
68
+ <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic>`, add functionality to the
69
+ methods:
70
+
71
+ - :meth:`_repr_term <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic._repr_term>`
72
+
73
+ - :meth:`degree_on_basis <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.degree_on_basis>`
74
+
75
+ - :meth:`_milnor_on_basis <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic._milnor_on_basis>`
76
+
77
+ - :meth:`an_element <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.an_element>`
78
+
79
+ In the file :file:`steenrod_algebra_misc.py`:
80
+
81
+ - add functionality to :func:`get_basis_name
82
+ <sage.algebras.steenrod.steenrod_algebra_misc.get_basis_name>`: this
83
+ should accept as input various synonyms for the basis, and its
84
+ output should be a canonical name for the basis.
85
+
86
+ - add a function ``BASIS_mono_to_string`` like
87
+ :func:`milnor_mono_to_string
88
+ <sage.algebras.steenrod.steenrod_algebra_misc.milnor_mono_to_string>`
89
+ or one of the other similar functions.
90
+
91
+ In this file :file:`steenrod_algebra_bases.py`:
92
+
93
+ - add appropriate lines to :func:`steenrod_algebra_basis`.
94
+
95
+ - add a function to compute the basis in a given dimension (to be
96
+ called by :func:`steenrod_algebra_basis`).
97
+
98
+ - modify :func:`steenrod_basis_error_check` so it checks the new
99
+ basis.
100
+
101
+ If the basis has an intrinsic way of defining a product, implement it
102
+ in the file :file:`steenrod_algebra_mult.py` and also in the
103
+ :meth:`product_on_basis
104
+ <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic.product_on_basis>`
105
+ method for :class:`SteenrodAlgebra_generic
106
+ <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra_generic>` in
107
+ :file:`steenrod_algebra.py`.
108
+ """
109
+
110
+ # ****************************************************************************
111
+ # Copyright (C) 2008-2010 John H. Palmieri <palmieri@math.washington.edu>
112
+ # Distributed under the terms of the GNU General Public License (GPL)
113
+ # ****************************************************************************
114
+
115
+ from sage.misc.cachefunc import cached_function
116
+
117
+
118
+ @cached_function
119
+ def convert_to_milnor_matrix(n, basis, p=2, generic='auto'):
120
+ r"""
121
+ Change-of-basis matrix, 'basis' to Milnor, in dimension
122
+ `n`, at the prime `p`.
123
+
124
+ INPUT:
125
+
126
+ - ``n`` -- nonnegative integer, the dimension
127
+ - ``basis`` -- string, the basis from which to convert
128
+ - ``p`` -- positive prime number (default: 2)
129
+
130
+ OUTPUT:
131
+
132
+ ``matrix`` -- change-of-basis matrix, a square matrix over `\GF{p}`
133
+
134
+ EXAMPLES::
135
+
136
+ sage: # needs sage.combinat sage.modules
137
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
138
+ sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
139
+ [0 1]
140
+ [1 1]
141
+ sage: convert_to_milnor_matrix(45, 'milnor')
142
+ 111 x 111 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
143
+ sage: convert_to_milnor_matrix(12, 'wall')
144
+ [1 0 0 1 0 0 0]
145
+ [1 1 0 0 0 1 0]
146
+ [0 1 0 1 0 0 0]
147
+ [0 0 0 1 0 0 0]
148
+ [1 1 0 0 1 0 0]
149
+ [0 0 1 1 1 0 1]
150
+ [0 0 0 0 1 0 1]
151
+
152
+ The function takes an optional argument, the prime `p` over
153
+ which to work::
154
+
155
+ sage: # needs sage.combinat sage.modules
156
+ sage: convert_to_milnor_matrix(17, 'adem', 3)
157
+ [0 0 1 1]
158
+ [0 0 0 1]
159
+ [1 1 1 1]
160
+ [0 1 0 1]
161
+ sage: convert_to_milnor_matrix(48, 'adem', 5)
162
+ [0 1]
163
+ [1 1]
164
+ sage: convert_to_milnor_matrix(36, 'adem', 3)
165
+ [0 0 1]
166
+ [0 1 0]
167
+ [1 2 0]
168
+ """
169
+ from sage.matrix.constructor import matrix
170
+ from sage.rings.finite_rings.finite_field_constructor import GF
171
+ from .steenrod_algebra import SteenrodAlgebra
172
+ if generic == 'auto':
173
+ generic = p != 2
174
+ if n == 0:
175
+ return matrix(GF(p), 1, 1, [[1]])
176
+ milnor_base = steenrod_algebra_basis(n, 'milnor', p, generic=generic)
177
+ rows = []
178
+ A = SteenrodAlgebra(basis=basis, p=p, generic=generic)
179
+ for poly in A.basis(n):
180
+ d = poly.milnor().monomial_coefficients()
181
+ for v in milnor_base:
182
+ entry = d.get(v, 0)
183
+ rows = rows + [entry]
184
+ d = len(milnor_base)
185
+ return matrix(GF(p), d, d, rows)
186
+
187
+
188
+ def convert_from_milnor_matrix(n, basis, p=2, generic='auto'):
189
+ r"""
190
+ Change-of-basis matrix, Milnor to ``basis``, in dimension `n`.
191
+
192
+ INPUT:
193
+
194
+ - ``n`` -- nonnegative integer, the dimension
195
+
196
+ - ``basis`` -- string, the basis to which to convert
197
+
198
+ - ``p`` -- positive prime number (default: 2)
199
+
200
+ OUTPUT:
201
+
202
+ ``matrix`` -- change-of-basis matrix, a square matrix over `\GF{p}`
203
+
204
+ .. NOTE::
205
+
206
+ This is called internally. It is not intended for casual
207
+ users, so no error checking is made on the integer `n`, the
208
+ basis name, or the prime.
209
+
210
+ EXAMPLES::
211
+
212
+ sage: # needs sage.combinat sage.modules
213
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_from_milnor_matrix, convert_to_milnor_matrix
214
+ sage: convert_from_milnor_matrix(12, 'wall')
215
+ [1 0 0 1 0 0 0]
216
+ [0 0 1 1 0 0 0]
217
+ [0 0 0 1 0 1 1]
218
+ [0 0 0 1 0 0 0]
219
+ [1 0 1 0 1 0 0]
220
+ [1 1 1 0 0 0 0]
221
+ [1 0 1 0 1 0 1]
222
+ sage: convert_from_milnor_matrix(38, 'serre_cartan')
223
+ 72 x 72 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
224
+ sage: x = convert_to_milnor_matrix(20, 'wood_y')
225
+ sage: y = convert_from_milnor_matrix(20, 'wood_y')
226
+ sage: x*y
227
+ [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
228
+ [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
229
+ [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
230
+ [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
231
+ [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
232
+ [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
233
+ [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
234
+ [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
235
+ [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
236
+ [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
237
+ [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
238
+ [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
239
+ [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
240
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]
241
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
242
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]
243
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
244
+
245
+ The function takes an optional argument, the prime `p` over
246
+ which to work::
247
+
248
+ sage: convert_from_milnor_matrix(17, 'adem', 3) # needs sage.combinat sage.modules
249
+ [2 1 1 2]
250
+ [0 2 0 1]
251
+ [1 2 0 0]
252
+ [0 1 0 0]
253
+ """
254
+ mat = convert_to_milnor_matrix(n, basis, p, generic)
255
+ if mat.nrows():
256
+ return convert_to_milnor_matrix(n, basis, p, generic).inverse()
257
+ return mat
258
+
259
+
260
+ @cached_function
261
+ def steenrod_algebra_basis(n, basis='milnor', p=2, **kwds):
262
+ r"""
263
+ Basis for the Steenrod algebra in degree `n`.
264
+
265
+ INPUT:
266
+
267
+ - ``n`` -- nonnegative integer
268
+ - ``basis`` -- string, which basis to use (default: ``'milnor'``)
269
+ - ``p`` -- positive prime number (default: 2)
270
+ - ``profile`` -- profile function (default: ``None``); this
271
+ is just passed on to the functions :func:`milnor_basis` and
272
+ :func:`pst_basis`
273
+ - ``truncation_type`` -- truncation type, either 0 or ``Infinity``
274
+ (default: ``Infinity`` if no profile function is specified,
275
+ 0 otherwise). This is just passed on to the function
276
+ :func:`milnor_basis`.
277
+ - ``generic`` -- boolean (default: ``None``)
278
+
279
+ OUTPUT:
280
+
281
+ Tuple of objects representing basis elements for the Steenrod algebra
282
+ in dimension n.
283
+
284
+ The choices for the string ``basis`` are as follows; see the
285
+ documentation for :mod:`sage.algebras.steenrod.steenrod_algebra`
286
+ for details on each basis:
287
+
288
+ - ``'milnor'`` -- Milnor basis
289
+ - ``'serre-cartan'`` or ``'adem'`` or ``'admissible'`` -- Serre-Cartan basis
290
+ - ``'pst'``, ``'pst_rlex'``, ``'pst_llex'``, ``'pst_deg'``, ``'pst_revz'`` --
291
+ various `P^s_t`-bases
292
+ - ``'comm'``, ``'comm_rlex'``, ``'comm_llex'``, ``'comm_deg'``, ``'comm_revz'``, or
293
+ any of these with ``'_long'`` appended -- various commutator bases
294
+
295
+ The rest of these bases are only defined when `p=2`.
296
+
297
+ - ``'wood_y'`` -- Wood's Y basis
298
+ - ``'wood_z'`` -- Wood's Z basis
299
+ - ``'wall'`` or ``'wall_long'`` -- Wall's basis
300
+ - ``'arnon_a'`` or ``'arnon_a_long'`` -- Arnon's A basis
301
+ - ``'arnon_c'`` -- Arnon's C basis
302
+
303
+ EXAMPLES::
304
+
305
+ sage: # needs sage.combinat
306
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import steenrod_algebra_basis
307
+ sage: steenrod_algebra_basis(7, 'milnor') # indirect doctest
308
+ ((0, 0, 1), (1, 2), (4, 1), (7,))
309
+ sage: steenrod_algebra_basis(5) # milnor basis is the default
310
+ ((2, 1), (5,))
311
+
312
+ Bases in negative dimensions are empty::
313
+
314
+ sage: steenrod_algebra_basis(-2, 'wall') # needs sage.combinat
315
+ ()
316
+
317
+ The third (optional) argument to 'steenrod_algebra_basis' is the
318
+ prime p::
319
+
320
+ sage: # needs sage.combinat
321
+ sage: steenrod_algebra_basis(9, 'milnor', p=3)
322
+ (((1,), (1,)), ((0,), (2,)))
323
+ sage: steenrod_algebra_basis(9, 'milnor', 3)
324
+ (((1,), (1,)), ((0,), (2,)))
325
+ sage: steenrod_algebra_basis(17, 'milnor', 3)
326
+ (((2,), ()), ((1,), (3,)), ((0,), (0, 1)), ((0,), (4,)))
327
+
328
+ Other bases::
329
+
330
+ sage: # needs sage.combinat
331
+ sage: steenrod_algebra_basis(7, 'admissible')
332
+ ((7,), (6, 1), (4, 2, 1), (5, 2))
333
+ sage: steenrod_algebra_basis(13, 'admissible', p=3)
334
+ ((1, 3, 0), (0, 3, 1))
335
+ sage: steenrod_algebra_basis(5, 'wall')
336
+ (((2, 2), (0, 0)), ((1, 1), (1, 0)))
337
+ sage: steenrod_algebra_basis(5, 'wall_long')
338
+ (((2, 2), (0, 0)), ((1, 1), (1, 0)))
339
+ sage: steenrod_algebra_basis(5, 'pst-rlex')
340
+ (((0, 1), (2, 1)), ((1, 1), (0, 2)))
341
+ """
342
+ from .steenrod_algebra_misc import get_basis_name
343
+ try:
344
+ if n < 0 or int(n) != n:
345
+ return ()
346
+ except TypeError:
347
+ return ()
348
+
349
+ generic = kwds.get("generic", p != 2)
350
+
351
+ basis_name = get_basis_name(basis, p, generic=generic)
352
+ if basis_name.find('long') >= 0:
353
+ basis_name = basis_name.rsplit('_', 1)[0]
354
+
355
+ profile = kwds.get("profile", None)
356
+ if (profile is not None and profile != () and profile != ((), ())
357
+ and basis != 'milnor' and basis.find('pst') == -1):
358
+ raise ValueError("profile functions may only be used with the Milnor or pst bases")
359
+
360
+ # Milnor basis
361
+ if basis_name == 'milnor':
362
+ return milnor_basis(n, p, **kwds)
363
+ # Serre-Cartan basis
364
+ elif basis_name == 'serre-cartan':
365
+ return serre_cartan_basis(n, p, **kwds)
366
+ # Atomic bases, p odd:
367
+ elif generic and (basis_name.find('pst') >= 0
368
+ or basis_name.find('comm') >= 0):
369
+ return atomic_basis_odd(n, basis_name, p, **kwds)
370
+ # Atomic bases, p=2
371
+ elif not generic and (basis_name == 'woody' or basis_name == 'woodz'
372
+ or basis_name == 'wall' or basis_name == 'arnona'
373
+ or basis_name.find('pst') >= 0
374
+ or basis_name.find('comm') >= 0):
375
+ return atomic_basis(n, basis_name, **kwds)
376
+ # Arnon 'C' basis
377
+ elif not generic and basis == 'arnonc':
378
+ return arnonC_basis(n)
379
+ else:
380
+ raise ValueError("unknown basis: %s at the prime %s" % (basis, p))
381
+
382
+
383
+ # helper functions for producing bases
384
+
385
+ def restricted_partitions(n, l, no_repeats=False):
386
+ """
387
+ Iterator over 'restricted' partitions of `n`: partitions with parts taken
388
+ from list `l`.
389
+
390
+ INPUT:
391
+
392
+ - ``n`` -- nonnegative integer
393
+ - ``l`` -- list of positive integers
394
+ - ``no_repeats`` -- boolean (default: ``False``); if ``True``,
395
+ only return partitions with no repeated parts
396
+
397
+ OUTPUT: iterator of lists
398
+
399
+ One could also use ``Partitions(n, parts_in=l)``, but this
400
+ function may be faster. Also, while ``Partitions(n, parts_in=l,
401
+ max_slope=-1)`` should in theory return the partitions of `n` with
402
+ parts in ``l`` with no repetitions, the ``max_slope=-1`` argument
403
+ is ignored, so it does not work. (At the moment, the
404
+ ``no_repeats=True`` case is the only one used in the code.)
405
+
406
+ .. TODO::
407
+
408
+ This should be re-implemented in a non-recursive way.
409
+
410
+ EXAMPLES::
411
+
412
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import restricted_partitions
413
+ sage: list(restricted_partitions(10, [7,5,1]))
414
+ [[7, 1, 1, 1], [5, 5], [5, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
415
+ sage: list(restricted_partitions(10, [6,5,4,3,2,1], no_repeats=True))
416
+ [[6, 4], [6, 3, 1], [5, 4, 1], [5, 3, 2], [4, 3, 2, 1]]
417
+ sage: list(restricted_partitions(10, [6,4,2]))
418
+ [[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
419
+ sage: list(restricted_partitions(10, [6,4,2], no_repeats=True))
420
+ [[6, 4]]
421
+
422
+ ``l`` may have repeated elements. If ``no_repeats`` is ``False``, this
423
+ has no effect. If ``no_repeats`` is ``True``, and if the repeated
424
+ elements appear consecutively in ``l``, then each element may be
425
+ used only as many times as it appears in ``l``::
426
+
427
+ sage: list(restricted_partitions(10, [6,4,2,2], no_repeats=True))
428
+ [[6, 4], [6, 2, 2]]
429
+ sage: list(restricted_partitions(10, [6,4,2,2,2], no_repeats=True))
430
+ [[6, 4], [6, 2, 2], [4, 2, 2, 2]]
431
+
432
+ (If the repeated elements don't appear consecutively, the results
433
+ are likely meaningless, containing several partitions more than
434
+ once, for example.)
435
+
436
+ In the following examples, ``no_repeats`` is ``False``::
437
+
438
+ sage: list(restricted_partitions(10, [6,4,2]))
439
+ [[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
440
+ sage: list(restricted_partitions(10, [6,4,2,2,2]))
441
+ [[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
442
+ sage: list(restricted_partitions(10, [6,4,4,4,2,2,2,2,2,2]))
443
+ [[6, 4], [6, 2, 2], [4, 4, 2], [4, 2, 2, 2], [2, 2, 2, 2, 2]]
444
+ """
445
+ if n < 0:
446
+ return
447
+
448
+ if n == 0:
449
+ yield []
450
+ return
451
+
452
+ index = 1 if no_repeats else 0
453
+ old_i = 0
454
+ for i in l:
455
+ if old_i != i:
456
+ for sigma in restricted_partitions(n - i, l[index:], no_repeats):
457
+ yield [i] + sigma
458
+ index += 1
459
+ old_i = i
460
+
461
+
462
+ def xi_degrees(n, p=2, reverse=True):
463
+ r"""
464
+ Decreasing list of degrees of the `\xi_i`'s, starting in degree `n`.
465
+
466
+ INPUT:
467
+
468
+ - ``n`` -- integer
469
+ - ``p`` -- prime number (default: 2)
470
+ - ``reverse`` -- boolean (default: ``True``)
471
+
472
+ OUTPUT: list of integers
473
+
474
+ When `p=2`: decreasing list of the degrees of the `\xi_i`'s with
475
+ degree at most `n`.
476
+
477
+ At odd primes: decreasing list of these degrees, each divided by
478
+ `2(p-1)`.
479
+
480
+ If ``reverse`` is ``False``, then return an increasing list rather
481
+ than a decreasing one.
482
+
483
+ EXAMPLES::
484
+
485
+ sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17)
486
+ [15, 7, 3, 1]
487
+ sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17, reverse=False)
488
+ [1, 3, 7, 15]
489
+ sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(17, p=3)
490
+ [13, 4, 1]
491
+ sage: sage.algebras.steenrod.steenrod_algebra_bases.xi_degrees(400, p=17)
492
+ [307, 18, 1]
493
+ """
494
+ from sage.rings.integer import Integer
495
+ if n <= 0:
496
+ return []
497
+ N = Integer(n*(p-1) + 1)
498
+ l = [(p**d-1)//(p-1) for d in range(1, N.exact_log(p)+1)]
499
+ if reverse:
500
+ l.reverse()
501
+ return l
502
+
503
+
504
+ ########################################################
505
+ # Functions for defining bases.
506
+
507
+ # These should each return a tuple of tuples of the appropriate form
508
+ # for the basis. For example, at the prime 2, the Milnor basis
509
+ # element Sq(a,b,c,...) corresponds to the tuple (a, b, c, ...), while
510
+ # at odd primes, the element Q_i Q_j ... P(a, b, ...) corresponds to
511
+ # the pair ((i, j, ...), (a, b, ...)). See each function for more
512
+ # information.
513
+
514
+ def milnor_basis(n, p=2, **kwds):
515
+ r"""
516
+ Milnor basis in dimension `n` with profile function ``profile``.
517
+
518
+ INPUT:
519
+
520
+ - ``n`` -- nonnegative integer
521
+
522
+ - ``p`` -- positive prime number (default: 2)
523
+
524
+ - ``profile`` -- profile function (default: ``None``).
525
+ Together with ``truncation_type``, specify the profile function
526
+ to be used; ``None`` means the profile function for the entire
527
+ Steenrod algebra. See
528
+ :mod:`sage.algebras.steenrod.steenrod_algebra` and
529
+ :func:`SteenrodAlgebra <sage.algebras.steenrod.steenrod_algebra.SteenrodAlgebra>`
530
+ for information on profile functions.
531
+
532
+ - ``truncation_type`` -- truncation type, either 0 or ``Infinity``
533
+ (default: ``Infinity`` if no profile function is specified,
534
+ 0 otherwise)
535
+
536
+ OUTPUT: tuple of mod `p` Milnor basis elements in dimension `n`
537
+
538
+ At the prime 2, the Milnor basis consists of symbols of the form
539
+ `\text{Sq}(m_1, m_2, ..., m_t)`, where each
540
+ `m_i` is a nonnegative integer and if `t>1`, then
541
+ `m_t \neq 0`. At odd primes, it consists of symbols of the
542
+ form `Q_{e_1} Q_{e_2} ... P(m_1, m_2, ..., m_t)`,
543
+ where `0 \leq e_1 < e_2 < ...`, each `m_i` is a
544
+ nonnegative integer, and if `t>1`, then
545
+ `m_t \neq 0`.
546
+
547
+ EXAMPLES::
548
+
549
+ sage: # needs sage.combinat
550
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import milnor_basis
551
+ sage: milnor_basis(7)
552
+ ((0, 0, 1), (1, 2), (4, 1), (7,))
553
+ sage: milnor_basis(7, 2)
554
+ ((0, 0, 1), (1, 2), (4, 1), (7,))
555
+ sage: milnor_basis(4, 2)
556
+ ((1, 1), (4,))
557
+ sage: milnor_basis(4, 2, profile=[2,1])
558
+ ((1, 1),)
559
+ sage: milnor_basis(4, 2, profile=(), truncation_type=0)
560
+ ()
561
+ sage: milnor_basis(4, 2, profile=(), truncation_type=Infinity)
562
+ ((1, 1), (4,))
563
+ sage: milnor_basis(9, 3)
564
+ (((1,), (1,)), ((0,), (2,)))
565
+ sage: milnor_basis(17, 3)
566
+ (((2,), ()), ((1,), (3,)), ((0,), (0, 1)), ((0,), (4,)))
567
+ sage: milnor_basis(48, p=5)
568
+ (((), (0, 1)), ((), (6,)))
569
+ sage: len(milnor_basis(100,3))
570
+ 13
571
+ sage: len(milnor_basis(200,7))
572
+ 0
573
+ sage: len(milnor_basis(240,7))
574
+ 3
575
+ sage: len(milnor_basis(240,7, profile=((),()), truncation_type=Infinity))
576
+ 3
577
+ sage: len(milnor_basis(240,7, profile=((),()), truncation_type=0))
578
+ 0
579
+ """
580
+ generic = kwds.get('generic', p != 2)
581
+
582
+ if n == 0:
583
+ if not generic:
584
+ return ((),)
585
+ else:
586
+ return (((), ()),)
587
+
588
+ from sage.rings.infinity import Infinity
589
+ from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
590
+ profile = kwds.get("profile", None)
591
+ trunc = kwds.get("truncation_type", None)
592
+ if trunc is None:
593
+ if profile is not None:
594
+ trunc = 0
595
+ else:
596
+ trunc = Infinity
597
+
598
+ result = []
599
+ if not generic:
600
+ for mono in WeightedIntegerVectors(n, xi_degrees(n, reverse=False)):
601
+ exponents = list(mono)
602
+ while exponents and exponents[-1] == 0:
603
+ exponents.pop(-1)
604
+ # check profile:
605
+ okay = True
606
+ if profile is not None and len(profile) > 0:
607
+ for i in range(len(exponents)):
608
+ if ((len(profile) > i and exponents[i] >= 2**profile[i])
609
+ or (len(profile) <= i and trunc < Infinity
610
+ and exponents[i] >= 2**trunc)):
611
+ okay = False
612
+ break
613
+ else:
614
+ # profile is empty
615
+ okay = (trunc == Infinity)
616
+ if okay:
617
+ result.append(tuple(exponents))
618
+ else: # p odd
619
+ # first find the P part of each basis element.
620
+ # in this part of the code (the P part), all dimensions are
621
+ # divided by 2(p-1).
622
+ for dim in range(n//(2*(p-1)) + 1):
623
+ if dim == 0:
624
+ P_result = [[0]]
625
+ else:
626
+ P_result = []
627
+ for mono in WeightedIntegerVectors(dim, xi_degrees(dim, p=p, reverse=False)):
628
+ p_mono = list(mono)
629
+ while p_mono and p_mono[-1] == 0:
630
+ p_mono.pop(-1)
631
+ if p_mono:
632
+ P_result.append(p_mono)
633
+ # now find the Q part of the basis element.
634
+ # dimensions here are back to normal.
635
+ for p_mono in P_result:
636
+ deg = n - 2*dim*(p-1)
637
+ q_degrees = [1+2*(p-1)*d for d in
638
+ xi_degrees(int((deg - 1)//(2*(p-1))), p)] + [1]
639
+ q_degrees_decrease = q_degrees
640
+ q_degrees.reverse()
641
+ if deg % (2*(p-1)) <= len(q_degrees):
642
+ # if this inequality fails, no way to have a partition
643
+ # with distinct parts.
644
+ for sigma in restricted_partitions(deg,
645
+ q_degrees_decrease,
646
+ no_repeats=True):
647
+ index = 0
648
+ q_mono = []
649
+ for q in q_degrees:
650
+ if q in sigma:
651
+ q_mono.append(index)
652
+ index += 1
653
+ # check profile:
654
+ okay = True
655
+ if profile is not None and (len(profile[0]) > 0
656
+ or len(profile[1]) > 0):
657
+ # check profile function for q_mono
658
+ for i in q_mono:
659
+ if ((len(profile[1]) > i and profile[1][i] == 1)
660
+ or (len(profile[1]) <= i and trunc == 0)):
661
+ okay = False
662
+ break
663
+ # check profile function for p_mono
664
+ for i in range(len(p_mono)):
665
+ if okay and ((len(profile[0]) > i and p_mono[i] >= p**profile[0][i])
666
+ or (len(profile[0]) <= i and trunc < Infinity
667
+ and p_mono[i] >= p**trunc)):
668
+ okay = False
669
+ break
670
+ else:
671
+ # profile is empty
672
+ okay = (trunc == Infinity)
673
+ if okay:
674
+ if list(p_mono) == [0]:
675
+ p_mono = []
676
+ result.append((tuple(q_mono), tuple(p_mono)))
677
+ return tuple(result)
678
+
679
+
680
+ def serre_cartan_basis(n, p=2, bound=1, **kwds):
681
+ r"""
682
+ Serre-Cartan basis in dimension `n`.
683
+
684
+ INPUT:
685
+
686
+ - ``n`` -- nonnegative integer
687
+ - ``bound`` -- positive integer (optional)
688
+ - ``prime`` -- positive prime number (default: 2)
689
+
690
+ OUTPUT: tuple of mod `p` Serre-Cartan basis elements in dimension `n`
691
+
692
+ The Serre-Cartan basis consists of 'admissible monomials in the
693
+ Steenrod squares'. Thus at the prime 2, it consists of monomials
694
+ `\text{Sq}^{m_1} \text{Sq}^{m_2} ... \text{Sq}^{m_t}` with `m_i
695
+ \geq 2m_{i+1}` for each `i`. At odd primes, it consists of
696
+ monomials `\beta^{e_0} P^{s_1} \beta^{e_1} P^{s_2} ... P^{s_k}
697
+ \beta^{e_k}` with each `e_i` either 0 or 1, `s_i \geq p s_{i+1} +
698
+ e_i` for all `i`, and `s_k \geq 1`.
699
+
700
+ EXAMPLES::
701
+
702
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import serre_cartan_basis
703
+ sage: serre_cartan_basis(7)
704
+ ((7,), (6, 1), (4, 2, 1), (5, 2))
705
+ sage: serre_cartan_basis(13,3)
706
+ ((1, 3, 0), (0, 3, 1))
707
+ sage: serre_cartan_basis(50,5)
708
+ ((1, 5, 0, 1, 1), (1, 6, 1))
709
+
710
+ If optional argument ``bound`` is present, include only those monomials
711
+ whose last term is at least ``bound`` (when `p=2`), or those for which
712
+ `s_k - e_k \geq bound` (when `p` is odd). ::
713
+
714
+ sage: serre_cartan_basis(7, bound=2)
715
+ ((7,), (5, 2))
716
+ sage: serre_cartan_basis(13, 3, bound=3)
717
+ ((1, 3, 0),)
718
+ """
719
+ generic = kwds.get('generic', p != 2)
720
+
721
+ if n == 0:
722
+ return ((),)
723
+ else:
724
+ if not generic:
725
+ # Build basis recursively. last = last term.
726
+ # last is >= bound, and we will append (last,) to the end of
727
+ # elements from serre_cartan_basis (n - last, bound=2 * last).
728
+ # This means that 2 last <= n - last, or 3 last <= n.
729
+ result = [(n,)]
730
+ for last in range(bound, 1+n//3):
731
+ for vec in serre_cartan_basis(n - last, bound=2 * last):
732
+ new = vec + (last,)
733
+ result.append(new)
734
+ else: # p odd
735
+ if n % (2 * (p-1)) == 0 and n//(2 * (p-1)) >= bound:
736
+ result = [(0, int(n//(2 * (p-1))), 0)]
737
+ elif n == 1:
738
+ result = [(1,)]
739
+ else:
740
+ result = []
741
+ # 2 cases: append P^{last}, or append P^{last} beta
742
+ # case 1: append P^{last}
743
+ for last in range(bound, 1+n//(2*(p - 1))):
744
+ if n - 2*(p-1)*last > 0:
745
+ for vec in serre_cartan_basis(n - 2*(p-1)*last,
746
+ p, p*last, generic=generic):
747
+ result.append(vec + (last,0))
748
+ # case 2: append P^{last} beta
749
+ if bound == 1:
750
+ bound = 0
751
+ for last in range(bound+1, 1+n//(2*(p - 1))):
752
+ basis = serre_cartan_basis(n - 2*(p-1)*last - 1,
753
+ p, p*last, generic=generic)
754
+ for vec in basis:
755
+ if vec == ():
756
+ vec = (0,)
757
+ new = vec + (last, 1)
758
+ result.append(new)
759
+ return tuple(result)
760
+
761
+
762
+ def atomic_basis(n, basis, **kwds):
763
+ r"""
764
+ Basis for dimension `n` made of elements in 'atomic' degrees:
765
+ degrees of the form `2^i (2^j - 1)`.
766
+
767
+ This works at the prime 2 only.
768
+
769
+ INPUT:
770
+
771
+ - ``n`` -- nonnegative integer
772
+
773
+ - ``basis`` -- string, the name of the basis
774
+
775
+ - ``profile`` -- profile function (default: ``None``).
776
+ Together with ``truncation_type``, specify the profile function
777
+ to be used; ``None`` means the profile function for the entire
778
+ Steenrod algebra. See
779
+ :mod:`sage.algebras.steenrod.steenrod_algebra` and
780
+ :func:`SteenrodAlgebra` for information on profile functions.
781
+
782
+ - ``truncation_type`` -- truncation type, either 0 or ``Infinity``
783
+ (default: ``Infinity`` if no profile function is specified,
784
+ 0 otherwise).
785
+
786
+ OUTPUT: tuple of basis elements in dimension `n`
787
+
788
+ The atomic bases include Wood's Y and Z bases, Wall's basis,
789
+ Arnon's A basis, the `P^s_t`-bases, and the commutator
790
+ bases. (All of these bases are constructed similarly, hence their
791
+ constructions have been consolidated into a single function. Also,
792
+ see the documentation for :func:`steenrod_algebra_basis` for
793
+ descriptions of them.) For `P^s_t`-bases, you may also specify a
794
+ profile function and truncation type; profile functions are ignored
795
+ for the other bases.
796
+
797
+ EXAMPLES::
798
+
799
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import atomic_basis
800
+ sage: atomic_basis(6,'woody')
801
+ (((1, 0), (0, 1), (0, 0)), ((2, 0), (1, 0)), ((1, 1),))
802
+ sage: atomic_basis(8,'woodz')
803
+ (((2, 0), (0, 1), (0, 0)), ((0, 2), (0, 0)), ((1, 1), (1, 0)), ((3, 0),))
804
+ sage: atomic_basis(6,'woodz') == atomic_basis(6, 'woody')
805
+ True
806
+ sage: atomic_basis(9,'woodz') == atomic_basis(9, 'woody')
807
+ False
808
+
809
+ Wall's basis::
810
+
811
+ sage: atomic_basis(8,'wall')
812
+ (((2, 2), (1, 0), (0, 0)), ((2, 0), (0, 0)), ((2, 1), (1, 1)), ((3, 3),))
813
+
814
+ Arnon's A basis::
815
+
816
+ sage: atomic_basis(7,'arnona')
817
+ (((0, 0), (1, 1), (2, 2)), ((0, 0), (2, 1)), ((1, 0), (2, 2)), ((2, 0),))
818
+
819
+ `P^s_t`-bases::
820
+
821
+ sage: atomic_basis(7,'pst_rlex')
822
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((2, 1), (0, 2)), ((0, 3),))
823
+ sage: atomic_basis(7,'pst_llex')
824
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
825
+ sage: atomic_basis(7,'pst_deg')
826
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
827
+ sage: atomic_basis(7,'pst_revz')
828
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
829
+
830
+ Commutator bases::
831
+
832
+ sage: atomic_basis(7,'comm_rlex')
833
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((2, 1), (0, 2)), ((0, 3),))
834
+ sage: atomic_basis(7,'comm_llex')
835
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
836
+ sage: atomic_basis(7,'comm_deg')
837
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
838
+ sage: atomic_basis(7,'comm_revz')
839
+ (((0, 1), (1, 1), (2, 1)), ((0, 1), (1, 2)), ((0, 2), (2, 1)), ((0, 3),))
840
+ """
841
+ def degree_dictionary(n, basis):
842
+ """
843
+ Dictionary of atomic degrees for basis up to degree `n`.
844
+
845
+ The keys for the dictionary are the atomic degrees -- the numbers of
846
+ the form `2^i (2^j - 1)` -- which are less than or equal to `n`. The value
847
+ associated to such a degree depends on basis; it has the form
848
+ `(s,t)`, where `(s,t)` is a pair of integers which indexes the
849
+ corresponding element.
850
+ """
851
+ dict = {}
852
+ if basis.find('wood') >= 0:
853
+ k = 0
854
+ m = 0
855
+ deg = 2**m * (2**(k+1) - 1)
856
+ while deg <= n:
857
+ dict[deg] = (m,k)
858
+ if m > 0:
859
+ m = m - 1
860
+ k = k + 1
861
+ else:
862
+ m = k + 1
863
+ k = 0
864
+ deg = 2**m * (2**(k+1) - 1)
865
+ elif basis.find('wall') >= 0 or basis.find('arnon') >= 0:
866
+ k = 0
867
+ m = 0
868
+ deg = 2**k * (2**(m-k+1) - 1)
869
+ while deg <= n:
870
+ dict[deg] = (m,k)
871
+ if k == 0:
872
+ m = m + 1
873
+ k = m
874
+ else:
875
+ k = k - 1
876
+ deg = 2**k * (2**(m-k+1) - 1)
877
+ elif basis.find('pst') >= 0 or basis.find('comm') >= 0:
878
+ s = 0
879
+ t = 1
880
+ deg = 2**s * (2**t - 1)
881
+ while deg <= n:
882
+ if basis.find('pst') >= 0:
883
+ dict[deg] = (s,t)
884
+ else: # comm
885
+ dict[deg] = (s,t)
886
+ if s == 0:
887
+ s = t
888
+ t = 1
889
+ else:
890
+ s = s - 1
891
+ t = t + 1
892
+ deg = 2**s * (2**t - 1)
893
+ return dict
894
+
895
+ def sorting_pair(s, t, basis): # pair used for sorting the basis
896
+ if basis.find('wood') >= 0 and basis.find('z') >= 0:
897
+ return (-s-t,-s)
898
+ elif basis.find('wood') >= 0 or basis.find('wall') >= 0 or \
899
+ basis.find('arnon') >= 0:
900
+ return (-s,-t)
901
+ elif basis.find('rlex') >= 0:
902
+ return (t,s)
903
+ elif basis.find('llex') >= 0:
904
+ return (s,t)
905
+ elif basis.find('deg') >= 0:
906
+ return (s+t,t)
907
+ elif basis.find('revz') >= 0:
908
+ return (s+t,s)
909
+
910
+ from sage.rings.infinity import Infinity
911
+ profile = kwds.get("profile", None)
912
+ trunc = kwds.get("truncation_type", None)
913
+ if profile is not None and trunc is None:
914
+ trunc = 0
915
+
916
+ if n == 0:
917
+ return ((),)
918
+ else:
919
+ result = []
920
+ degrees_etc = degree_dictionary(n, basis)
921
+ degrees = list(degrees_etc)
922
+ for sigma in restricted_partitions(n, degrees, no_repeats=True):
923
+ big_list = [degrees_etc[part] for part in sigma]
924
+ big_list.sort(key=lambda x: sorting_pair(x[0], x[1], basis))
925
+ # reverse = True)
926
+ # arnon: sort like wall, then reverse end result
927
+ if basis.find('arnon') >= 0:
928
+ big_list.reverse()
929
+
930
+ # check profile:
931
+ okay = True
932
+ if basis.find('pst') >= 0:
933
+ if profile is not None and len(profile) > 0:
934
+ for (s,t) in big_list:
935
+ if ((len(profile) > t-1 and profile[t-1] <= s)
936
+ or (len(profile) <= t-1 and trunc < Infinity)):
937
+ okay = False
938
+ break
939
+ if okay:
940
+ result.append(tuple(big_list))
941
+ return tuple(result)
942
+
943
+
944
+ @cached_function
945
+ def arnonC_basis(n, bound=1):
946
+ r"""
947
+ Arnon's C basis in dimension `n`.
948
+
949
+ INPUT:
950
+
951
+ - ``n`` -- nonnegative integer
952
+
953
+ - ``bound`` -- positive integer (optional)
954
+
955
+ OUTPUT: tuple of basis elements in dimension `n`
956
+
957
+ The elements of Arnon's C basis are monomials of the form
958
+ `\text{Sq}^{t_1} ... \text{Sq}^{t_m}` where for each
959
+ `i`, we have `t_i \leq 2t_{i+1}` and
960
+ `2^i | t_{m-i}`.
961
+
962
+ EXAMPLES::
963
+
964
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import arnonC_basis
965
+ sage: arnonC_basis(7)
966
+ ((7,), (2, 5), (4, 3), (4, 2, 1))
967
+
968
+ If optional argument ``bound`` is present, include only those monomials
969
+ whose first term is at least as large as ``bound``::
970
+
971
+ sage: arnonC_basis(7,3)
972
+ ((7,), (4, 3), (4, 2, 1))
973
+ """
974
+ if n == 0:
975
+ return ((),)
976
+
977
+ # Build basis recursively. first = first term.
978
+ # first is >= bound, and we will prepend (first,) to the
979
+ # elements from arnonC_basis (n - first, first / 2).
980
+ # first also must be divisible by 2**(len(old-basis-elt))
981
+ # This means that 3 first <= 2 n.
982
+ result = [(n,)]
983
+ for first in range(bound, 1 + 2 * n // 3):
984
+ tup = (first,)
985
+ result.extend(tup + vec
986
+ for vec in arnonC_basis(n - first, max(first // 2, 1))
987
+ if not first % 2**len(vec))
988
+ return tuple(result)
989
+
990
+
991
+ def atomic_basis_odd(n, basis, p, **kwds):
992
+ r"""
993
+ `P^s_t`-bases and commutator basis in dimension `n` at odd primes.
994
+
995
+ This function is called ``atomic_basis_odd`` in analogy with
996
+ :func:`atomic_basis`.
997
+
998
+ INPUT:
999
+
1000
+ - ``n`` -- nonnegative integer
1001
+
1002
+ - ``basis`` -- string, the name of the basis
1003
+
1004
+ - ``p`` -- positive prime number
1005
+
1006
+ - ``profile`` -- profile function (default: ``None``).
1007
+ Together with ``truncation_type``, specify the profile function
1008
+ to be used; ``None`` means the profile function for the entire
1009
+ Steenrod algebra. See
1010
+ :mod:`sage.algebras.steenrod.steenrod_algebra` and
1011
+ :func:`SteenrodAlgebra` for information on profile functions.
1012
+
1013
+ - ``truncation_type`` -- truncation type, either 0 or ``Infinity``
1014
+ (default: ``Infinity`` if no profile function is specified,
1015
+ 0 otherwise).
1016
+
1017
+ OUTPUT: tuple of basis elements in dimension `n`
1018
+
1019
+ The only possible difference in the implementations for `P^s_t`
1020
+ bases and commutator bases is that the former make sense, and
1021
+ require filtering, if there is a nontrivial profile function.
1022
+ This function is called by :func:`steenrod_algebra_basis`, and it
1023
+ will not be called for commutator bases if there is a profile
1024
+ function, so we treat the two bases exactly the same.
1025
+
1026
+ EXAMPLES::
1027
+
1028
+ sage: # needs sage.combinat
1029
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import atomic_basis_odd
1030
+ sage: atomic_basis_odd(8, 'pst_rlex', 3)
1031
+ (((), (((0, 1), 2),)),)
1032
+ sage: atomic_basis_odd(18, 'pst_rlex', 3)
1033
+ (((0, 2), ()), ((0, 1), (((1, 1), 1),)))
1034
+ sage: atomic_basis_odd(18, 'pst_rlex', 3, profile=((), (2,2,2)))
1035
+ (((0, 2), ()),)
1036
+ """
1037
+ def sorting_pair(s, t, basis): # pair used for sorting the basis
1038
+ if basis.find('rlex') >= 0:
1039
+ return (t, s)
1040
+ elif basis.find('llex') >= 0:
1041
+ return (s, t)
1042
+ elif basis.find('deg') >= 0:
1043
+ return (s + t, t)
1044
+ elif basis.find('revz') >= 0:
1045
+ return (s + t, s)
1046
+
1047
+ generic = kwds.get('generic', p != 2)
1048
+ if n == 0:
1049
+ if not generic:
1050
+ return ((),)
1051
+ else:
1052
+ return (((), ()),)
1053
+
1054
+ from sage.rings.integer import Integer
1055
+ from sage.rings.infinity import Infinity
1056
+ from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
1057
+ profile = kwds.get("profile", None)
1058
+ trunc = kwds.get("truncation_type", 0)
1059
+
1060
+ result = []
1061
+ for dim in range(n//(2*p-2) + 1):
1062
+ P_result = []
1063
+ for v in WeightedIntegerVectors(dim, xi_degrees(dim, p=p, reverse=False)):
1064
+ mono = []
1065
+ for t, a in enumerate(v):
1066
+ for s, pow in enumerate(Integer(a).digits(p)):
1067
+ if pow > 0:
1068
+ mono.append(((s, t+1), pow))
1069
+ P_result.append(mono)
1070
+ for p_mono in P_result:
1071
+ p_mono.sort(key=lambda x: sorting_pair(x[0][0], x[0][1], basis))
1072
+ deg = n - 2*dim*(p-1)
1073
+ q_degrees = [1+2*(p-1)*d for d in
1074
+ xi_degrees((deg - 1)//(2*(p-1)), p)] + [1]
1075
+ q_degrees_decrease = q_degrees
1076
+ q_degrees.reverse()
1077
+ if deg % (2*(p-1)) <= len(q_degrees):
1078
+ # if this inequality fails, no way to have a partition
1079
+ # with distinct parts.
1080
+ for sigma in restricted_partitions(deg,
1081
+ q_degrees_decrease,
1082
+ no_repeats=True):
1083
+ q_mono = [index for index, q in enumerate(q_degrees)
1084
+ if q in sigma]
1085
+ # check profile:
1086
+ okay = True
1087
+ if profile is not None and profile != ((), ()):
1088
+ # check profile function for q_mono
1089
+ for i in q_mono:
1090
+ if ((len(profile[1]) > i and profile[1][i] == 1)
1091
+ or (len(profile[1]) <= i and trunc == 0)):
1092
+ okay = False
1093
+ break
1094
+
1095
+ for ((s, t), _) in p_mono:
1096
+ if ((len(profile[0]) > t-1 and profile[0][t-1] <= s)
1097
+ or (len(profile[0]) <= t-1 and trunc < Infinity)):
1098
+ okay = False
1099
+ break
1100
+
1101
+ if okay:
1102
+ if list(p_mono) == [0]:
1103
+ p_mono = []
1104
+ result.append((tuple(q_mono), tuple(p_mono)))
1105
+ return tuple(result)
1106
+
1107
+
1108
+ #############################################################################
1109
+ def steenrod_basis_error_check(dim, p, **kwds):
1110
+ """
1111
+ This performs crude error checking.
1112
+
1113
+ INPUT:
1114
+
1115
+ - ``dim`` -- nonnegative integer
1116
+ - ``p`` -- positive prime number
1117
+
1118
+ OUTPUT: none
1119
+
1120
+ This checks to see if the different bases have the same length, and
1121
+ if the change-of-basis matrices are invertible. If something goes
1122
+ wrong, an error message is printed.
1123
+
1124
+ This function checks at the prime `p` as the dimension goes up
1125
+ from 0 to ``dim``.
1126
+
1127
+ If you set the Sage verbosity level to a positive integer (using
1128
+ ``set_verbose(n)``), then some extra messages will be printed.
1129
+
1130
+ EXAMPLES::
1131
+
1132
+ sage: # long time
1133
+ sage: from sage.algebras.steenrod.steenrod_algebra_bases import steenrod_basis_error_check
1134
+ sage: steenrod_basis_error_check(15, 2)
1135
+ sage: steenrod_basis_error_check(15, 2, generic=True)
1136
+ sage: steenrod_basis_error_check(40, 3)
1137
+ sage: steenrod_basis_error_check(80, 5)
1138
+ """
1139
+ from sage.misc.verbose import verbose
1140
+ generic = kwds.get('generic', p != 2)
1141
+
1142
+ if not generic:
1143
+ bases = ('adem','woody', 'woodz', 'wall', 'arnona', 'arnonc',
1144
+ 'pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz',
1145
+ 'comm_rlex', 'comm_llex', 'comm_deg', 'comm_revz')
1146
+ else:
1147
+ bases = ('adem',
1148
+ 'pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz',
1149
+ 'comm_rlex', 'comm_llex', 'comm_deg', 'comm_revz')
1150
+
1151
+ for i in range(dim):
1152
+ if i % 5 == 0:
1153
+ verbose("up to dimension %s" % i)
1154
+ milnor_dim = len(steenrod_algebra_basis.f(i,'milnor',p=p,generic=generic))
1155
+ for B in bases:
1156
+ if milnor_dim != len(steenrod_algebra_basis.f(i,B,p,generic=generic)):
1157
+ print("problem with milnor/{} in dimension {}".format(B, i))
1158
+ mat = convert_to_milnor_matrix.f(i,B,p,generic=generic)
1159
+ if mat.nrows() != 0 and not mat.is_invertible():
1160
+ print("%s invertibility problem in dim %s at p=%s" % (B, i, p))
1161
+
1162
+ verbose("done checking, no profiles")
1163
+
1164
+ bases = ('pst_rlex', 'pst_llex', 'pst_deg', 'pst_revz')
1165
+ if not generic:
1166
+ profiles = [(4,3,2,1), (2,2,3,1,1), (0,0,0,2)]
1167
+ else:
1168
+ profiles = [((3,2,1), ()), ((), (2,1,2)), ((3,2,1), (2,2,2,2))]
1169
+
1170
+ for i in range(dim):
1171
+ if i % 5 == 0:
1172
+ verbose("up to dimension %s" % i)
1173
+ for pro in profiles:
1174
+ milnor_dim = len(steenrod_algebra_basis.f(i,'milnor',p=p,profile=pro,generic=generic))
1175
+ for B in bases:
1176
+ if milnor_dim != len(steenrod_algebra_basis.f(i,B,p,profile=pro,generic=generic)):
1177
+ print("problem with milnor/%s in dimension %s with profile %s" % (B, i, pro))
1178
+
1179
+ verbose("done checking with profiles")