passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.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 (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -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-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1306 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ C-finite sequences
4
+
5
+ C-finite infinite sequences satisfy homogeneous linear recurrences with constant coefficients:
6
+
7
+ .. MATH::
8
+
9
+ a_{n+d} = c_0a_n + c_1a_{n+1} + \cdots + c_{d-1}a_{n+d-1}, \quad d>0.
10
+
11
+ They are completely defined by their ordinary generating function (o.g.f., which
12
+ is always a :mod:`fraction <sage.rings.fraction_field_element>` of
13
+ :mod:`polynomials <sage.rings.polynomial.polynomial_element>` over `\ZZ` or `\QQ` ).
14
+
15
+ EXAMPLES::
16
+
17
+ sage: # needs sage.symbolic
18
+ sage: fibo = CFiniteSequence(x/(1-x-x^2)) # the Fibonacci sequence
19
+ sage: fibo
20
+ C-finite sequence, generated by -x/(x^2 + x - 1)
21
+ sage: fibo.parent()
22
+ The ring of C-Finite sequences in x over Rational Field
23
+ sage: fibo.parent().category()
24
+ Category of commutative rings
25
+ sage: C.<x> = CFiniteSequences(QQ)
26
+ sage: fibo.parent() == C
27
+ True
28
+ sage: C
29
+ The ring of C-Finite sequences in x over Rational Field
30
+ sage: C(x/(1-x-x^2))
31
+ C-finite sequence, generated by -x/(x^2 + x - 1)
32
+ sage: C(x/(1-x-x^2)) == fibo
33
+ True
34
+ sage: var('y')
35
+ y
36
+ sage: CFiniteSequence(y/(1-y-y^2))
37
+ C-finite sequence, generated by -y/(y^2 + y - 1)
38
+ sage: CFiniteSequence(y/(1-y-y^2)) == fibo
39
+ False
40
+
41
+ Finite subsets of the sequence are accessible via python slices::
42
+
43
+ sage: # needs sage.symbolic
44
+ sage: fibo[137] #the 137th term of the Fibonacci sequence
45
+ 19134702400093278081449423917
46
+ sage: fibo[137] == fibonacci(137)
47
+ True
48
+ sage: fibo[0:12]
49
+ [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
50
+ sage: fibo[14:4:-2]
51
+ [377, 144, 55, 21, 8]
52
+
53
+ They can be created also from the coefficients and start values of a recurrence::
54
+
55
+ sage: # needs sage.symbolic
56
+ sage: r = C.from_recurrence([1,1],[0,1])
57
+ sage: r == fibo
58
+ True
59
+
60
+ Given enough values, the o.g.f. of a C-finite sequence
61
+ can be guessed::
62
+
63
+ sage: # needs sage.symbolic
64
+ sage: r = C.guess([0,1,1,2,3,5,8])
65
+ sage: r == fibo
66
+ True
67
+
68
+ .. SEEALSO::
69
+
70
+ :func:`fibonacci`, :class:`BinaryRecurrenceSequence`
71
+
72
+ .. TODO::
73
+
74
+ Implement a feature enabling::
75
+
76
+ sage: # not implemented
77
+ sage: CFiniteSequence(x+x^2+x^3+x^4+x^5+O(x^6))
78
+ sage: latex(r)
79
+ \big\{a_{n\ge0}\big|a_{n+2}=\sum_{i=0}^{1}c_ia_{n+i}, c=\{1,1\}, a_{n<2}=\{0,0,0,1\}\big\}
80
+ sage: r.egf()
81
+ exp(2*x)
82
+ sage: r = CFiniteSequence(1/(1-y-x*y), x)
83
+
84
+ REFERENCES:
85
+
86
+ - [GK1982]_
87
+ - [KP2011]_
88
+ - [SZ1994]_
89
+ - [Zei2011]_
90
+
91
+ AUTHORS:
92
+
93
+ - Ralf Stephan (2014): initial version
94
+ """
95
+
96
+ # ****************************************************************************
97
+ # Copyright (C) 2014 Ralf Stephan <gtrwst9@gmail.com>
98
+ #
99
+ # This program is free software: you can redistribute it and/or modify
100
+ # it under the terms of the GNU General Public License as published by
101
+ # the Free Software Foundation, either version 2 of the License, or
102
+ # (at your option) any later version.
103
+ # https://www.gnu.org/licenses/
104
+ # ****************************************************************************
105
+
106
+ from numbers import Integral
107
+
108
+ from sage.categories.rings import Rings
109
+ from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
110
+ from sage.misc.lazy_import import lazy_import
111
+ from sage.rings.integer_ring import ZZ
112
+ from sage.rings.rational_field import QQ
113
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
114
+ from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic
115
+ from sage.rings.laurent_series_ring import LaurentSeriesRing
116
+ from sage.rings.power_series_ring import PowerSeriesRing
117
+ from sage.rings.fraction_field import FractionField
118
+ from sage.structure.element import FieldElement, parent
119
+ from sage.structure.parent import Parent
120
+ from sage.structure.unique_representation import UniqueRepresentation
121
+
122
+ lazy_import('sage.libs.pari', 'pari')
123
+
124
+
125
+ def CFiniteSequences(base_ring, names=None, category=None):
126
+ r"""
127
+ Return the commutative ring of C-Finite sequences.
128
+
129
+ The ring is defined over a base ring (`\ZZ` or `\QQ` )
130
+ and each element is represented by its ordinary generating function (ogf)
131
+ which is a rational function over the base ring.
132
+
133
+ INPUT:
134
+
135
+ - ``base_ring`` -- the base ring to construct the fraction field
136
+ representing the C-Finite sequences
137
+ - ``names`` -- (optional) the list of variables
138
+
139
+ EXAMPLES::
140
+
141
+ sage: C.<x> = CFiniteSequences(QQ)
142
+ sage: C
143
+ The ring of C-Finite sequences in x over Rational Field
144
+ sage: C.an_element()
145
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
146
+ sage: C.category()
147
+ Category of commutative rings
148
+ sage: C.one()
149
+ Finite sequence [1], offset = 0
150
+ sage: C.zero()
151
+ Constant infinite sequence 0.
152
+ sage: C(x)
153
+ Finite sequence [1], offset = 1
154
+ sage: C(1/x)
155
+ Finite sequence [1], offset = -1
156
+ sage: C((-x + 2)/(-x^2 - x + 1))
157
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
158
+
159
+ TESTS::
160
+
161
+ sage: TestSuite(C).run()
162
+ """
163
+ if isinstance(base_ring, PolynomialRing_generic):
164
+ polynomial_ring = base_ring
165
+ base_ring = polynomial_ring.base_ring()
166
+ if names is None:
167
+ names = ['x']
168
+ elif len(names) > 1:
169
+ raise NotImplementedError("Multidimensional o.g.f. not implemented.")
170
+ if category is None:
171
+ category = Rings().Commutative()
172
+ if base_ring not in [QQ, ZZ]:
173
+ raise ValueError("O.g.f. base not rational.")
174
+ polynomial_ring = PolynomialRing(base_ring, names)
175
+ return CFiniteSequences_generic(polynomial_ring, category)
176
+
177
+
178
+ class CFiniteSequence(FieldElement,
179
+ metaclass=InheritComparisonClasscallMetaclass):
180
+ r"""
181
+ Create a C-finite sequence given its ordinary generating function.
182
+
183
+ INPUT:
184
+
185
+ - ``ogf`` -- a rational function, the ordinary generating function
186
+ (can be an element from the symbolic ring, fraction field or polynomial
187
+ ring)
188
+
189
+ OUTPUT: a CFiniteSequence object
190
+
191
+ EXAMPLES::
192
+
193
+ sage: # needs sage.symbolic
194
+ sage: CFiniteSequence((2-x)/(1-x-x^2)) # the Lucas sequence
195
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
196
+ sage: CFiniteSequence(x/(1-x)^3) # triangular numbers
197
+ C-finite sequence, generated by -x/(x^3 - 3*x^2 + 3*x - 1)
198
+
199
+ Polynomials are interpreted as finite sequences, or recurrences of degree 0::
200
+
201
+ sage: # needs sage.symbolic
202
+ sage: CFiniteSequence(x^2-4*x^5)
203
+ Finite sequence [1, 0, 0, -4], offset = 2
204
+ sage: CFiniteSequence(1)
205
+ Finite sequence [1], offset = 0
206
+
207
+ This implementation allows any polynomial fraction as o.g.f. by interpreting
208
+ any power of `x` dividing the o.g.f. numerator or denominator as a right or left shift
209
+ of the sequence offset::
210
+
211
+ sage: # needs sage.symbolic
212
+ sage: CFiniteSequence(x^2+3/x)
213
+ Finite sequence [3, 0, 0, 1], offset = -1
214
+ sage: CFiniteSequence(1/x+4/x^3)
215
+ Finite sequence [4, 0, 1], offset = -3
216
+ sage: P = LaurentPolynomialRing(QQ.fraction_field(), 'X')
217
+ sage: X=P.gen()
218
+ sage: CFiniteSequence(1/(1-X))
219
+ C-finite sequence, generated by -1/(X - 1)
220
+
221
+ The o.g.f. is always normalized to get a denominator constant coefficient of `+1`::
222
+
223
+ sage: CFiniteSequence(1/(x-2)) # needs sage.symbolic
224
+ C-finite sequence, generated by 1/(x - 2)
225
+
226
+ The given ``ogf`` is used to create an appropriate parent: it can
227
+ be a symbolic expression, a polynomial , or a fraction field element
228
+ as long as it can be coerced into a proper fraction field over the
229
+ rationals::
230
+
231
+ sage: # needs sage.symbolic
232
+ sage: var('x')
233
+ x
234
+ sage: f1 = CFiniteSequence((2-x)/(1-x-x^2))
235
+ sage: P.<x> = QQ[]
236
+ sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
237
+ sage: f1 == f2
238
+ True
239
+ sage: f1.parent()
240
+ The ring of C-Finite sequences in x over Rational Field
241
+ sage: f1.ogf().parent()
242
+ Fraction Field of Univariate Polynomial Ring in x over Rational Field
243
+ sage: CFiniteSequence(log(x))
244
+ Traceback (most recent call last):
245
+ ...
246
+ TypeError: unable to convert log(x) to a rational
247
+
248
+ TESTS::
249
+
250
+ sage: # needs sage.rings.real_interval_field sage.symbolic
251
+ sage: P.<x> = QQ[]
252
+ sage: CFiniteSequence(0.1/(1-x))
253
+ C-finite sequence, generated by -1/10/(x - 1)
254
+ sage: CFiniteSequence(pi/(1-x))
255
+ Traceback (most recent call last):
256
+ ...
257
+ TypeError: unable to convert -pi to a rational
258
+
259
+ sage: P.<x,y> = QQ[]
260
+ sage: CFiniteSequence(x*y)
261
+ Traceback (most recent call last):
262
+ ...
263
+ NotImplementedError: Multidimensional o.g.f. not implemented.
264
+ """
265
+ @staticmethod
266
+ def __classcall_private__(cls, ogf):
267
+ r"""
268
+ Ensure that elements created by :class:`CFiniteSequence` have the same
269
+ parent than the ones created by the parent itself and follow the category
270
+ framework (they should be instance of :class:`CFiniteSequences` automatic
271
+ element class).
272
+
273
+ This method is called before the ``__init__`` method, it checks the
274
+ o.g.f to create the appropriate parent.
275
+
276
+ INPUT:
277
+
278
+ - ``ogf`` -- a rational function
279
+
280
+ TESTS::
281
+
282
+ sage: # needs sage.symbolic
283
+ sage: f1 = CFiniteSequence((2-x)/(1-x-x^2))
284
+ sage: f1
285
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
286
+ sage: C.<x> = CFiniteSequences(QQ)
287
+ sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
288
+ sage: f2
289
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
290
+ sage: f3 = C((2-x)/(1-x-x^2))
291
+ sage: f3
292
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
293
+ sage: f1 == f2 and f2 == f3
294
+ True
295
+ sage: f1.parent() == f2.parent() and f2.parent() == f3.parent()
296
+ True
297
+ sage: type(f1)
298
+ <class 'sage.rings.cfinite_sequence.CFiniteSequences_generic_with_category.element_class'>
299
+ sage: type(f1) == type(f2) and type(f2) == type(f3)
300
+ True
301
+ sage: CFiniteSequence(log(x))
302
+ Traceback (most recent call last):
303
+ ...
304
+ TypeError: unable to convert log(x) to a rational
305
+ sage: CFiniteSequence(pi)
306
+ Traceback (most recent call last):
307
+ ...
308
+ TypeError: unable to convert pi to a rational
309
+ sage: var('y')
310
+ y
311
+ sage: f4 = CFiniteSequence((2-y)/(1-y-y^2))
312
+ sage: f4
313
+ C-finite sequence, generated by (y - 2)/(y^2 + y - 1)
314
+ sage: f4 == f1
315
+ False
316
+ sage: f4.parent() == f1.parent()
317
+ False
318
+ sage: f4.parent()
319
+ The ring of C-Finite sequences in y over Rational Field
320
+ """
321
+ br = ogf.base_ring()
322
+ if br not in [QQ, ZZ]:
323
+ br = QQ # if the base ring of the o.g.f is not QQ, we force it to QQ and see if the o.g.f converts nicely
324
+
325
+ # trying to figure out the ogf variables
326
+ variables = []
327
+ if ogf not in br:
328
+ if hasattr(ogf, 'variables'):
329
+ variables = ogf.variables()
330
+ elif hasattr(ogf.parent(), 'gens'):
331
+ variables = ogf.parent().gens()
332
+ # for some reason, fraction field elements don't have the variables
333
+ # method, but symbolic elements don't have the gens method so we check both
334
+
335
+ if not variables:
336
+ parent = CFiniteSequences(QQ) # if we cannot find variables, we create the default parent (with x)
337
+ else:
338
+ parent = CFiniteSequences(QQ, variables)
339
+ return parent(ogf) # if ogf cannot be converted to a fraction field, this will break and raise the proper error
340
+
341
+ def __init__(self, parent, ogf):
342
+ r"""
343
+ Initialize the C-Finite sequence.
344
+
345
+ The ``__init__`` method can only be called by the :class:`CFiniteSequences`
346
+ class. By Default, a class call reaches the ``__classcall_private__``
347
+ which first creates a proper parent and then call the ``__init__``.
348
+
349
+ INPUT:
350
+
351
+ - ``ogf`` -- the ordinary generating function, a fraction of
352
+ polynomials over the rationals
353
+ - ``parent`` -- the parent of the C-Finite sequence, an occurrence of
354
+ :class:`CFiniteSequences`
355
+
356
+ OUTPUT: a CFiniteSequence object
357
+
358
+ TESTS::
359
+
360
+ sage: C.<x> = CFiniteSequences(QQ)
361
+ sage: C((2-x)/(1-x-x^2)) # indirect doctest
362
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
363
+ """
364
+
365
+ br = parent.base_ring()
366
+ ogf = parent.fraction_field()(ogf)
367
+ P = parent.polynomial_ring()
368
+ num = ogf.numerator()
369
+ den = ogf.denominator()
370
+
371
+ FieldElement.__init__(self, parent)
372
+
373
+ if den == 1:
374
+ self._c = []
375
+ self._off = num.valuation()
376
+ self._deg = 0
377
+ if ogf == 0:
378
+ self._a = [0]
379
+ else:
380
+ self._a = num.shift(-self._off).list()
381
+ else:
382
+ # Transform the ogf numerator and denominator to canonical form
383
+ # to get the correct offset, degree, and recurrence coeffs and
384
+ # start values.
385
+ self._off = 0
386
+ self._deg = 0
387
+ if num.constant_coefficient() == 0:
388
+ self._off = num.valuation()
389
+ num = num.shift(-self._off)
390
+ elif den.constant_coefficient() == 0:
391
+ self._off = -den.valuation()
392
+ den = den.shift(self._off)
393
+ f = den.constant_coefficient()
394
+ num = P(num / f)
395
+ den = P(den / f)
396
+ f = num.gcd(den)
397
+ num = P(num / f)
398
+ den = P(den / f)
399
+ self._deg = den.degree()
400
+ self._c = [-den[i] for i in range(1, self._deg + 1)]
401
+ if self._off >= 0:
402
+ num = num.shift(self._off)
403
+ else:
404
+ den = den.shift(-self._off)
405
+
406
+ # determine start values (may be different from _get_item_ values)
407
+ alen = max(self._deg, num.degree() + 1)
408
+ R = LaurentSeriesRing(br, parent.variable_name(), default_prec=alen)
409
+ if den != 1:
410
+ self._a = R(num / den).list()
411
+ else:
412
+ self._a = num.list()
413
+ if len(self._a) < alen:
414
+ self._a.extend([0] * (alen - len(self._a)))
415
+
416
+ ogf = num / den
417
+
418
+ self._ogf = ogf
419
+
420
+ def _repr_(self) -> str:
421
+ """
422
+ Return textual definition of sequence.
423
+
424
+ TESTS::
425
+
426
+ sage: # needs sage.symbolic
427
+ sage: CFiniteSequence(1/x^5)
428
+ Finite sequence [1], offset = -5
429
+ sage: CFiniteSequence(x^3)
430
+ Finite sequence [1], offset = 3
431
+ """
432
+ if self._deg == 0:
433
+ if self.ogf() == 0:
434
+ return 'Constant infinite sequence 0.'
435
+ return 'Finite sequence ' + str(self._a) + ', offset = ' + str(self._off)
436
+ return 'C-finite sequence, generated by ' + str(self.ogf())
437
+
438
+ def __hash__(self):
439
+ r"""
440
+ Hash value for C finite sequence.
441
+
442
+ EXAMPLES::
443
+
444
+ sage: C.<x> = CFiniteSequences(QQ)
445
+ sage: hash(C((2-x)/(1-x-x^2))) # random
446
+ 42
447
+ """
448
+ return hash(self.parent()) ^ hash(self._ogf)
449
+
450
+ def _add_(self, other):
451
+ """
452
+ Addition of C-finite sequences.
453
+
454
+ TESTS::
455
+
456
+ sage: C.<x> = CFiniteSequences(QQ)
457
+ sage: r = C(1/(1-2*x))
458
+ sage: r[0:5] # a(n) = 2^n
459
+ [1, 2, 4, 8, 16]
460
+ sage: s = C.from_recurrence([1],[1])
461
+ sage: (r + s)[0:5] # a(n) = 2^n + 1
462
+ [2, 3, 5, 9, 17]
463
+ sage: r + 0 == r
464
+ True
465
+ sage: (r + x^2)[0:5]
466
+ [1, 2, 5, 8, 16]
467
+ sage: (r + 3/x)[-1]
468
+ 3
469
+ sage: r = CFiniteSequence(x)
470
+ sage: r + 0 == r
471
+ True
472
+ sage: CFiniteSequence(0) + CFiniteSequence(0)
473
+ Constant infinite sequence 0.
474
+ """
475
+ return CFiniteSequence(self.ogf() + other.numerator() / other.denominator())
476
+
477
+ def _sub_(self, other):
478
+ """
479
+ Subtraction of C-finite sequences.
480
+
481
+ TESTS::
482
+
483
+ sage: C.<x> = CFiniteSequences(QQ)
484
+ sage: r = C(1/(1-2*x))
485
+ sage: r[0:5] # a(n) = 2^n
486
+ [1, 2, 4, 8, 16]
487
+ sage: s = C.from_recurrence([1],[1])
488
+ sage: (r - s)[0:5] # a(n) = 2^n + 1
489
+ [0, 1, 3, 7, 15]
490
+ """
491
+ return CFiniteSequence(self.ogf() - other.numerator() / other.denominator())
492
+
493
+ def _mul_(self, other):
494
+ """
495
+ Multiplication of C-finite sequences.
496
+
497
+ TESTS::
498
+
499
+ sage: # needs numpy
500
+ sage: C.<x> = CFiniteSequences(QQ)
501
+ sage: r = C.guess([1,2,3,4,5,6])
502
+ sage: (r*r)[0:6] # self-convolution
503
+ [1, 4, 10, 20, 35, 56]
504
+ sage: r = C(x)
505
+ sage: r*1 == r
506
+ True
507
+ sage: r*-1
508
+ Finite sequence [-1], offset = 1
509
+ sage: C(0) * C(1)
510
+ Constant infinite sequence 0.
511
+ """
512
+ return CFiniteSequence(self.ogf() * other.numerator() / other.denominator())
513
+
514
+ def _div_(self, other):
515
+ """
516
+ Division of C-finite sequences.
517
+
518
+ TESTS::
519
+
520
+ sage: # needs numpy
521
+ sage: C.<x> = CFiniteSequences(QQ)
522
+ sage: r = C.guess([1,2,3,4,5,6])
523
+ sage: (r/2)[0:6]
524
+ [1/2, 1, 3/2, 2, 5/2, 3]
525
+ sage: s = C(x)
526
+ sage: s/(s*-1 + 1)
527
+ C-finite sequence, generated by -x/(x - 1)
528
+ """
529
+ return CFiniteSequence(self.ogf() / (other.numerator() / other.denominator()))
530
+
531
+ def coefficients(self):
532
+ """
533
+ Return the coefficients of the recurrence representation of the
534
+ C-finite sequence.
535
+
536
+ OUTPUT: list of values
537
+
538
+ EXAMPLES::
539
+
540
+ sage: C.<x> = CFiniteSequences(QQ)
541
+ sage: lucas = C((2-x)/(1-x-x^2)) # the Lucas sequence
542
+ sage: lucas.coefficients()
543
+ [1, 1]
544
+ """
545
+ return self._c
546
+
547
+ def __eq__(self, other):
548
+ """
549
+ Compare two CFiniteSequences.
550
+
551
+ EXAMPLES::
552
+
553
+ sage: # needs sage.symbolic
554
+ sage: f = CFiniteSequence((2-x)/(1-x-x^2))
555
+ sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
556
+ sage: f == f2
557
+ True
558
+ sage: f == (2-x)/(1-x-x^2)
559
+ False
560
+ sage: (2-x)/(1-x-x^2) == f
561
+ False
562
+ sage: C.<x> = CFiniteSequences(QQ)
563
+ sage: r = C.from_recurrence([1,1],[2,1])
564
+ sage: s = C.from_recurrence([-1],[1])
565
+ sage: r == s
566
+ False
567
+ sage: r = C.from_recurrence([-1],[1])
568
+ sage: s = C(1/(1+x))
569
+ sage: r == s
570
+ True
571
+ """
572
+ if not isinstance(other, CFiniteSequence):
573
+ return False
574
+ return self.ogf() == other.ogf()
575
+
576
+ def __ne__(self, other):
577
+ """
578
+ Compare two CFiniteSequences.
579
+
580
+ EXAMPLES::
581
+
582
+ sage: # needs sage.symbolic
583
+ sage: f = CFiniteSequence((2-x)/(1-x-x^2))
584
+ sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
585
+ sage: f != f2
586
+ False
587
+ sage: f != (2-x)/(1-x-x^2)
588
+ True
589
+ sage: (2-x)/(1-x-x^2) != f
590
+ True
591
+ sage: C.<x> = CFiniteSequences(QQ)
592
+ sage: r = C.from_recurrence([1,1],[2,1])
593
+ sage: s = C.from_recurrence([-1],[1])
594
+ sage: r != s
595
+ True
596
+ sage: r = C.from_recurrence([-1],[1])
597
+ sage: s = C(1/(1+x))
598
+ sage: r != s
599
+ False
600
+ """
601
+ return not self.__eq__(other)
602
+
603
+ def __getitem__(self, key):
604
+ r"""
605
+ Return a slice of the sequence.
606
+
607
+ EXAMPLES::
608
+
609
+ sage: C.<x> = CFiniteSequences(QQ)
610
+ sage: r = C.from_recurrence([3,3],[2,1])
611
+ sage: r[2]
612
+ 9
613
+ sage: r[101]
614
+ 16158686318788579168659644539538474790082623100896663971001
615
+ sage: r = C(1/(1-x))
616
+ sage: r[5]
617
+ 1
618
+ sage: r = C(x)
619
+ sage: r[0]
620
+ 0
621
+ sage: r[1]
622
+ 1
623
+ sage: r = C(0)
624
+ sage: r[66]
625
+ 0
626
+ sage: lucas = C.from_recurrence([1,1],[2,1])
627
+ sage: lucas[5:10]
628
+ [11, 18, 29, 47, 76]
629
+ sage: r = C((2-x)/x/(1-x-x*x))
630
+ sage: r[0:4]
631
+ [1, 3, 4, 7]
632
+ sage: r = C(1-2*x^2)
633
+ sage: r[0:4]
634
+ [1, 0, -2, 0]
635
+ sage: r[-1:4] # not tested, python will not allow this!
636
+ [0, 1, 0 -2, 0]
637
+ sage: r = C((-2*x^3 + x^2 + 1)/(-2*x + 1))
638
+ sage: r[0:5] # handle ogf > 1
639
+ [1, 2, 5, 8, 16]
640
+ sage: r[-2]
641
+ 0
642
+ sage: r = C((-2*x^3 + x^2 - x + 1)/(2*x^2 - 3*x + 1))
643
+ sage: r[0:5]
644
+ [1, 2, 5, 9, 17]
645
+ sage: s=C((1-x)/(-x^2 - x + 1))
646
+ sage: s[0:5]
647
+ [1, 0, 1, 1, 2]
648
+ sage: s=C((1+x^20+x^40)/(1-x^12)/(1-x^30))
649
+ sage: s[0:20]
650
+ [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
651
+ sage: s=C(1/((1-x^2)*(1-x^6)*(1-x^8)*(1-x^12)))
652
+ sage: s[999998]
653
+ 289362268629630
654
+ sage: s = C.from_recurrence([1,1],[1,1,1])
655
+ sage: s[0:5]
656
+ [1, 1, 1, 2, 3]
657
+ sage: s = C((1 - x)^-2); s[0:10]
658
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
659
+ sage: s = C(x * (1 - x)^-2); s[0:10]
660
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
661
+ sage: s = C(x^2 * (1 - x)^-2); s[0:10]
662
+ [0, 0, 1, 2, 3, 4, 5, 6, 7, 8]
663
+ sage: s = C(x^3 * (1 - x)^-2); s[0:10]
664
+ [0, 0, 0, 1, 2, 3, 4, 5, 6, 7]
665
+ sage: s = C(1/(1-x^1000)); s[10^18]
666
+ 1
667
+ sage: s = C(1/(1-x^1000)); s[10^20]
668
+ 1
669
+
670
+ REFERENCES:
671
+
672
+ - [BM2021]_
673
+ """
674
+ if isinstance(key, slice):
675
+ m = max(key.start, key.stop)
676
+ return [self[ii] for ii in range(*key.indices(m + 1))]
677
+
678
+ if isinstance(key, Integral):
679
+ n = key - self._off
680
+ if n < 0:
681
+ return 0
682
+ den = self.denominator()
683
+ num = self.numerator()
684
+ if self._off >= 0:
685
+ num = num.shift(-self._off)
686
+ else:
687
+ den = den.shift(self._off)
688
+ (quo, num) = num.quo_rem(den)
689
+ if quo.degree() < n:
690
+ wp = 0
691
+ else:
692
+ wp = quo[n]
693
+ P = self.parent().polynomial_ring()
694
+ x = P.gen()
695
+ while n:
696
+ nden = den(-x)
697
+ num = P((num * nden).list()[n % 2::2])
698
+ den = P((den * nden).list()[::2])
699
+ n //= 2
700
+ return wp + num[0] / den[0]
701
+
702
+ raise TypeError("invalid argument type")
703
+
704
+ def ogf(self):
705
+ """
706
+ Return the ordinary generating function associated with
707
+ the CFiniteSequence.
708
+
709
+ This is always a fraction of polynomials in the base ring.
710
+
711
+ EXAMPLES::
712
+
713
+ sage: C.<x> = CFiniteSequences(QQ)
714
+ sage: r = C.from_recurrence([2],[1])
715
+ sage: r.ogf()
716
+ -1/2/(x - 1/2)
717
+ sage: C(0).ogf()
718
+ 0
719
+ """
720
+ return self._ogf
721
+
722
+ def numerator(self):
723
+ r"""
724
+ Return the numerator of the o.g.f of ``self``.
725
+
726
+ EXAMPLES::
727
+
728
+ sage: # needs sage.symbolic
729
+ sage: f = CFiniteSequence((2-x)/(1-x-x^2)); f
730
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
731
+ sage: f.numerator()
732
+ x - 2
733
+ """
734
+ return self.ogf().numerator()
735
+
736
+ def denominator(self):
737
+ r"""
738
+ Return the numerator of the o.g.f of ``self``.
739
+
740
+ EXAMPLES::
741
+
742
+ sage: # needs sage.symbolic
743
+ sage: f = CFiniteSequence((2-x)/(1-x-x^2)); f
744
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
745
+ sage: f.denominator()
746
+ x^2 + x - 1
747
+ """
748
+ return self.ogf().denominator()
749
+
750
+ def recurrence_repr(self) -> str:
751
+ """
752
+ Return a string with the recurrence representation of
753
+ the C-finite sequence.
754
+
755
+ OUTPUT: string
756
+
757
+ EXAMPLES::
758
+
759
+ sage: C.<x> = CFiniteSequences(QQ)
760
+ sage: C((2-x)/(1-x-x^2)).recurrence_repr()
761
+ 'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = a(n+1) + a(n), starting a(0...) = [2, 1]'
762
+ sage: C(x/(1-x)^3).recurrence_repr()
763
+ 'homogeneous linear recurrence with constant coefficients of degree 3: a(n+3) = 3*a(n+2) - 3*a(n+1) + a(n), starting a(1...) = [1, 3, 6]'
764
+ sage: C(1).recurrence_repr()
765
+ 'Finite sequence [1], offset 0'
766
+ sage: r = C((-2*x^3 + x^2 - x + 1)/(2*x^2 - 3*x + 1))
767
+ sage: r.recurrence_repr()
768
+ 'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = 3*a(n+1) - 2*a(n), starting a(0...) = [1, 2, 5, 9]'
769
+ sage: r = CFiniteSequence(x^3/(1-x-x^2))
770
+ sage: r.recurrence_repr()
771
+ 'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = a(n+1) + a(n), starting a(3...) = [1, 1, 2, 3]'
772
+ """
773
+ if self._deg == 0:
774
+ return 'Finite sequence %s, offset %d' % (str(self._a), self._off)
775
+ else:
776
+ if self._c[0] == 1:
777
+ cstr = 'a(n+%d) = a(n+%d)' % (self._deg, self._deg - 1)
778
+ elif self._c[0] == -1:
779
+ cstr = 'a(n+%d) = -a(n+%d)' % (self._deg, self._deg - 1)
780
+ else:
781
+ cstr = 'a(n+%d) = %s*a(n+%d)' % (self._deg, str(self._c[0]), self._deg - 1)
782
+ for i in range(1, self._deg):
783
+ j = self._deg - i - 1
784
+ if self._c[i] < 0:
785
+ if self._c[i] == -1:
786
+ cstr = cstr + ' - a(n+%d)' % (j,)
787
+ else:
788
+ cstr = cstr + ' - %d*a(n+%d)' % (-(self._c[i]), j)
789
+ elif self._c[i] > 0:
790
+ if self._c[i] == 1:
791
+ cstr = cstr + ' + a(n+%d)' % (j,)
792
+ else:
793
+ cstr = cstr + ' + %d*a(n+%d)' % (self._c[i], j)
794
+ cstr = cstr.replace('+0', '')
795
+ astr = ', starting a(%s...) = [' % str(self._off)
796
+ maxwexp = self.numerator().quo_rem(self.denominator())[0].degree() + 1
797
+ for i in range(maxwexp + self._deg):
798
+ astr = astr + str(self[self._off + i]) + ', '
799
+ astr = astr[:-2] + ']'
800
+ return 'homogeneous linear recurrence with constant coefficients of degree ' + str(self._deg) + ': ' + cstr + astr
801
+
802
+ def series(self, n):
803
+ """
804
+ Return the Laurent power series associated with the
805
+ CFiniteSequence, with precision `n`.
806
+
807
+ INPUT:
808
+
809
+ - ``n`` -- nonnegative integer
810
+
811
+ EXAMPLES::
812
+
813
+ sage: C.<x> = CFiniteSequences(QQ)
814
+ sage: r = C.from_recurrence([-1,2],[0,1])
815
+ sage: s = r.series(4); s
816
+ x + 2*x^2 + 3*x^3 + 4*x^4 + O(x^5)
817
+ sage: type(s)
818
+ <class 'sage.rings.laurent_series_ring_element.LaurentSeries'>
819
+ """
820
+ R = LaurentSeriesRing(QQ, 'x', default_prec=n)
821
+ return R(self.ogf())
822
+
823
+ def closed_form(self, n='n'):
824
+ r"""
825
+ Return a symbolic expression in ``n``, which equals the n-th term of
826
+ the sequence.
827
+
828
+ It is a well-known property of C-finite sequences ``a_n`` that they
829
+ have a closed form of the type:
830
+
831
+ .. MATH::
832
+
833
+ a_n = \sum_{i=1}^d c_i(n) \cdot r_i^n,
834
+
835
+ where ``r_i`` are the roots of the characteristic equation and
836
+ ``c_i(n)`` is a polynomial (whose degree equals the multiplicity of
837
+ ``r_i`` minus one). This is a natural generalization of Binet's
838
+ formula for Fibonacci numbers. See, for instance, [KP2011, Theorem 4.1].
839
+
840
+ Note that if the o.g.f. has a polynomial part, that is, if the
841
+ numerator degree is not strictly less than the denominator degree,
842
+ then this closed form holds only when ``n`` exceeds the degree of that
843
+ polynomial part. In that case, the returned expression will differ
844
+ from the sequence for small ``n``.
845
+
846
+ EXAMPLES::
847
+
848
+ sage: # needs sage.symbolic
849
+ sage: CFiniteSequence(1/(1-x)).closed_form()
850
+ 1
851
+ sage: CFiniteSequence(x^2/(1-x)).closed_form()
852
+ 1
853
+ sage: CFiniteSequence(1/(1-x^2)).closed_form()
854
+ 1/2*(-1)^n + 1/2
855
+ sage: CFiniteSequence(1/(1+x^3)).closed_form()
856
+ 1/3*(-1)^n + 1/3*(1/2*I*sqrt(3) + 1/2)^n + 1/3*(-1/2*I*sqrt(3) + 1/2)^n
857
+ sage: CFiniteSequence(1/(1-x)/(1-2*x)/(1-3*x)).closed_form()
858
+ 9/2*3^n - 4*2^n + 1/2
859
+
860
+ Binet's formula for the Fibonacci numbers::
861
+
862
+ sage: # needs sage.symbolic
863
+ sage: CFiniteSequence(x/(1-x-x^2)).closed_form()
864
+ sqrt(1/5)*(1/2*sqrt(5) + 1/2)^n - sqrt(1/5)*(-1/2*sqrt(5) + 1/2)^n
865
+ sage: [_.subs(n=k).full_simplify() for k in range(6)]
866
+ [0, 1, 1, 2, 3, 5]
867
+ sage: CFiniteSequence((4*x+3)/(1-2*x-5*x^2)).closed_form()
868
+ 1/2*(sqrt(6) + 1)^n*(7*sqrt(1/6) + 3) - 1/2*(-sqrt(6) + 1)^n*(7*sqrt(1/6) - 3)
869
+
870
+ Examples with multiple roots::
871
+
872
+ sage: # needs sage.symbolic
873
+ sage: CFiniteSequence(x*(x^2+4*x+1)/(1-x)^5).closed_form()
874
+ 1/4*n^4 + 1/2*n^3 + 1/4*n^2
875
+ sage: CFiniteSequence((1+2*x-x^2)/(1-x)^4/(1+x)^2).closed_form()
876
+ 1/12*n^3 - 1/8*(-1)^n*(n + 1) + 3/4*n^2 + 43/24*n + 9/8
877
+ sage: CFiniteSequence(1/(1-x)^3/(1-2*x)^4).closed_form()
878
+ 4/3*(n^3 - 3*n^2 + 20*n - 36)*2^n + 1/2*n^2 + 19/2*n + 49
879
+ sage: CFiniteSequence((x/(1-x-x^2))^2).closed_form()
880
+ 1/5*(n - sqrt(1/5))*(1/2*sqrt(5) + 1/2)^n + 1/5*(n + sqrt(1/5))*(-1/2*sqrt(5) + 1/2)^n
881
+ """
882
+ from sage.arith.misc import binomial
883
+ from sage.rings.qqbar import QQbar
884
+
885
+ from sage.symbolic.ring import SR
886
+ n = SR(n)
887
+ expr = SR.zero()
888
+
889
+ R = FractionField(PolynomialRing(QQbar, self.parent().variable_name()))
890
+ ogf = R(self.ogf())
891
+
892
+ __, parts = ogf.partial_fraction_decomposition(decompose_powers=False)
893
+ for part in parts:
894
+ denom = part.denominator().factor()
895
+ denom_base, denom_exp = denom[0]
896
+
897
+ # denominator is of the form (x+b)^{m+1}
898
+ m = denom_exp - 1
899
+ b = denom_base.constant_coefficient()
900
+ # check that the partial fraction decomposition was indeed done correctly
901
+ # (that is, there is only one factor, of degree 1, and monic)
902
+ assert len(denom) == 1 and len(denom_base.list()) == 2 and denom_base[1] == 1 and denom.unit() == 1
903
+
904
+ r = SR((-1 / b).radical_expression())
905
+ c = SR.zero()
906
+ for k, a in enumerate(part.numerator()):
907
+ a = -QQbar(a) if k % 2 else QQbar(a)
908
+ bino = binomial(n + m - k, m)
909
+ c += bino * SR((a * b**(k - m - 1)).radical_expression())
910
+
911
+ expr += c.expand() * r**n
912
+
913
+ return expr
914
+
915
+
916
+ class CFiniteSequences_generic(Parent, UniqueRepresentation):
917
+ r"""
918
+ The class representing the ring of C-Finite Sequences.
919
+
920
+ TESTS::
921
+
922
+ sage: C.<x> = CFiniteSequences(QQ)
923
+ sage: from sage.rings.cfinite_sequence import CFiniteSequences_generic
924
+ sage: isinstance(C,CFiniteSequences_generic)
925
+ True
926
+ sage: type(C)
927
+ <class 'sage.rings.cfinite_sequence.CFiniteSequences_generic_with_category'>
928
+ sage: C
929
+ The ring of C-Finite sequences in x over Rational Field
930
+ """
931
+
932
+ Element = CFiniteSequence
933
+
934
+ def __init__(self, polynomial_ring, category):
935
+ r"""
936
+ Create the ring of CFiniteSequences over ``base_ring``.
937
+
938
+ INPUT:
939
+
940
+ - ``base_ring`` -- the base ring for the o.g.f (either ``QQ`` or ``ZZ``)
941
+ - ``names`` -- an iterable of variables (should contain only one variable)
942
+ - ``category`` -- the category of the ring (default: ``Rings().Commutative()``)
943
+
944
+ TESTS::
945
+
946
+ sage: C.<y> = CFiniteSequences(QQ); C
947
+ The ring of C-Finite sequences in y over Rational Field
948
+ sage: C.<x> = CFiniteSequences(QQ); C
949
+ The ring of C-Finite sequences in x over Rational Field
950
+ sage: C.<x> = CFiniteSequences(ZZ); C
951
+ The ring of C-Finite sequences in x over Integer Ring
952
+ sage: C.<x,y> = CFiniteSequences(ZZ)
953
+ Traceback (most recent call last):
954
+ ...
955
+ NotImplementedError: Multidimensional o.g.f. not implemented.
956
+ sage: C.<x> = CFiniteSequences(CC)
957
+ Traceback (most recent call last):
958
+ ...
959
+ ValueError: O.g.f. base not rational.
960
+ """
961
+ base_ring = polynomial_ring.base_ring()
962
+ self._polynomial_ring = polynomial_ring
963
+ self._fraction_field = FractionField(self._polynomial_ring)
964
+ if category is None:
965
+ category = Rings().Commutative()
966
+ Parent.__init__(self, base_ring, names=self._polynomial_ring.gens(),
967
+ category=category)
968
+
969
+ def _repr_(self):
970
+ r"""
971
+ Return the string representation of ``self``.
972
+
973
+ EXAMPLES::
974
+
975
+ sage: C.<x> = CFiniteSequences(QQ)
976
+ sage: C
977
+ The ring of C-Finite sequences in x over Rational Field
978
+ """
979
+ return "The ring of C-Finite sequences in {} over {}".format(self.gen(), self.base_ring())
980
+
981
+ def _element_constructor_(self, ogf):
982
+ r"""
983
+ Construct a C-Finite Sequence.
984
+
985
+ INPUT:
986
+
987
+ - ``ogf`` -- the ordinary generating function, a fraction of
988
+ polynomials over the rationals
989
+
990
+ TESTS::
991
+
992
+ sage: C.<x> = CFiniteSequences(QQ)
993
+ sage: C((2-x)/(1-x-x^2))
994
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
995
+ sage: C(x/(1-x)^3)
996
+ C-finite sequence, generated by -x/(x^3 - 3*x^2 + 3*x - 1)
997
+ sage: C(x^2-4*x^5)
998
+ Finite sequence [1, 0, 0, -4], offset = 2
999
+ sage: C(x^2+3/x)
1000
+ Finite sequence [3, 0, 0, 1], offset = -1
1001
+ sage: C(1/x + 4/x^3)
1002
+ Finite sequence [4, 0, 1], offset = -3
1003
+ sage: P = LaurentPolynomialRing(QQ.fraction_field(), 'X')
1004
+ sage: X = P.gen()
1005
+ sage: C(1/(1-X))
1006
+ C-finite sequence, generated by -1/(x - 1)
1007
+ sage: C = CFiniteSequences(QQ)
1008
+ sage: C(x)
1009
+ Finite sequence [1], offset = 1
1010
+ """
1011
+ ogf = self.fraction_field()(ogf)
1012
+ return self.element_class(self, ogf)
1013
+
1014
+ def ngens(self) -> int:
1015
+ r"""
1016
+ Return the number of generators of ``self``.
1017
+
1018
+ EXAMPLES::
1019
+
1020
+ sage: from sage.rings.cfinite_sequence import CFiniteSequences
1021
+ sage: C.<x> = CFiniteSequences(QQ)
1022
+ sage: C.ngens()
1023
+ 1
1024
+ """
1025
+ return 1
1026
+
1027
+ def gen(self, i=0):
1028
+ r"""
1029
+ Return the i-th generator of ``self``.
1030
+
1031
+ INPUT:
1032
+
1033
+ - ``i`` -- integer (default: 0)
1034
+
1035
+ EXAMPLES::
1036
+
1037
+ sage: C.<x> = CFiniteSequences(QQ)
1038
+ sage: C.gen()
1039
+ x
1040
+ sage: x == C.gen()
1041
+ True
1042
+
1043
+ TESTS::
1044
+
1045
+ sage: C.gen(2)
1046
+ Traceback (most recent call last):
1047
+ ...
1048
+ ValueError: The ring of C-Finite sequences in x over Rational Field has only one generator (i=0)
1049
+ """
1050
+ if i:
1051
+ raise ValueError("{} has only one generator (i=0)".format(self))
1052
+ return self.polynomial_ring().gen()
1053
+
1054
+ def gens(self) -> tuple:
1055
+ """
1056
+ Return the generators of ``self``.
1057
+
1058
+ EXAMPLES::
1059
+
1060
+ sage: C.<x> = CFiniteSequences(QQ)
1061
+ sage: C.gens()
1062
+ (x,)
1063
+ """
1064
+ return (self.gen(0),)
1065
+
1066
+ def an_element(self):
1067
+ r"""
1068
+ Return an element of C-Finite Sequences.
1069
+
1070
+ OUTPUT: the Lucas sequence
1071
+
1072
+ EXAMPLES::
1073
+
1074
+ sage: C.<x> = CFiniteSequences(QQ)
1075
+ sage: C.an_element()
1076
+ C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
1077
+ """
1078
+ x = self.gen()
1079
+ return self((2 - x) / (1 - x - x**2))
1080
+
1081
+ def __contains__(self, x) -> bool:
1082
+ """
1083
+ Return ``True`` if x is an element of ``CFiniteSequences`` or
1084
+ canonically coerces to this ring.
1085
+
1086
+ EXAMPLES::
1087
+
1088
+ sage: C.<x> = CFiniteSequences(QQ)
1089
+ sage: x in C
1090
+ True
1091
+ sage: 1/x in C
1092
+ True
1093
+ sage: 5 in C
1094
+ True
1095
+ sage: pi in C # needs sage.symbolic
1096
+ False
1097
+ sage: Cy.<y> = CFiniteSequences(QQ)
1098
+ sage: y in C
1099
+ False
1100
+ sage: y in Cy
1101
+ True
1102
+ """
1103
+ return self.has_coerce_map_from(parent(x))
1104
+
1105
+ def fraction_field(self):
1106
+ r"""
1107
+ Return the fraction field used to represent the elements of ``self``.
1108
+
1109
+ EXAMPLES::
1110
+
1111
+ sage: C.<x> = CFiniteSequences(QQ)
1112
+ sage: C.fraction_field()
1113
+ Fraction Field of Univariate Polynomial Ring in x over Rational Field
1114
+ """
1115
+ return self._fraction_field
1116
+
1117
+ def polynomial_ring(self):
1118
+ r"""
1119
+ Return the polynomial ring used to represent the elements of ``self``.
1120
+
1121
+ EXAMPLES::
1122
+
1123
+ sage: C.<x> = CFiniteSequences(QQ)
1124
+ sage: C.polynomial_ring()
1125
+ Univariate Polynomial Ring in x over Rational Field
1126
+ """
1127
+ return self._polynomial_ring
1128
+
1129
+ def _coerce_map_from_(self, S):
1130
+ """
1131
+ A coercion from `S` exists, if `S` coerces into ``self``'s fraction
1132
+ field.
1133
+
1134
+ EXAMPLES::
1135
+
1136
+ sage: C.<x> = CFiniteSequences(QQ)
1137
+ sage: C.has_coerce_map_from(C.fraction_field())
1138
+ True
1139
+ sage: C.has_coerce_map_from(QQ)
1140
+ True
1141
+ sage: C.has_coerce_map_from(QQ[x])
1142
+ True
1143
+ sage: C.has_coerce_map_from(ZZ)
1144
+ True
1145
+ """
1146
+ if self.fraction_field().has_coerce_map_from(S):
1147
+ return True
1148
+
1149
+ def from_recurrence(self, coefficients, values):
1150
+ r"""
1151
+ Create a C-finite sequence given the coefficients `c` and
1152
+ starting values `a` of a homogeneous linear recurrence.
1153
+
1154
+ .. MATH::
1155
+
1156
+ a_{n+d} = c_0a_n + c_1a_{n+1} + \cdots + c_{d-1}a_{n+d-1}, \quad d\ge0.
1157
+
1158
+ INPUT:
1159
+
1160
+ - ``coefficients`` -- list of rationals
1161
+ - ``values`` -- start values, a list of rationals
1162
+
1163
+ OUTPUT: a CFiniteSequence object
1164
+
1165
+ EXAMPLES::
1166
+
1167
+ sage: C.<x> = CFiniteSequences(QQ)
1168
+ sage: C.from_recurrence([1,1],[0,1]) # Fibonacci numbers
1169
+ C-finite sequence, generated by -x/(x^2 + x - 1)
1170
+ sage: C.from_recurrence([-1,2],[0,1]) # natural numbers
1171
+ C-finite sequence, generated by x/(x^2 - 2*x + 1)
1172
+ sage: r = C.from_recurrence([-1],[1])
1173
+ sage: s = C.from_recurrence([-1],[1,-1])
1174
+ sage: r == s
1175
+ True
1176
+ sage: r = C(x^3/(1-x-x^2))
1177
+ sage: s = C.from_recurrence([1,1],[0,0,0,1,1])
1178
+ sage: r == s
1179
+ True
1180
+ sage: C.from_recurrence(1,1)
1181
+ Traceback (most recent call last):
1182
+ ...
1183
+ ValueError: Wrong type for recurrence coefficient list.
1184
+ """
1185
+ if not isinstance(coefficients, list):
1186
+ raise ValueError("Wrong type for recurrence coefficient list.")
1187
+ if not isinstance(values, list):
1188
+ raise ValueError("Wrong type for recurrence start value list.")
1189
+ deg = len(coefficients)
1190
+
1191
+ co = coefficients[::-1] + [0] * (len(values) - deg)
1192
+ R = self.polynomial_ring()
1193
+ den = R([-1] + co[:deg])
1194
+ num = R([-values[0]] +
1195
+ [-values[n] + sum(values[k] * co[n - 1 - k]
1196
+ for k in range(n))
1197
+ for n in range(1, len(values))])
1198
+ return self(num / den)
1199
+
1200
+ def guess(self, sequence, algorithm='sage'):
1201
+ """
1202
+ Return the minimal CFiniteSequence that generates the sequence.
1203
+
1204
+ Assume the first value has index 0.
1205
+
1206
+ INPUT:
1207
+
1208
+ - ``sequence`` -- list of integers
1209
+ - ``algorithm`` -- string; one of
1210
+ - ``'sage'`` -- the default is to use Sage's matrix kernel function
1211
+ - ``'pari'`` -- use Pari's implementation of LLL
1212
+ - ``'bm'`` -- use Sage's Berlekamp-Massey algorithm
1213
+
1214
+ OUTPUT: a CFiniteSequence, or 0 if none could be found
1215
+
1216
+ With the default kernel method, trailing zeroes are chopped
1217
+ off before a guessing attempt. This may reduce the data
1218
+ below the accepted length of six values.
1219
+
1220
+ EXAMPLES::
1221
+
1222
+ sage: # needs numpy
1223
+ sage: C.<x> = CFiniteSequences(QQ)
1224
+ sage: C.guess([1,2,4,8,16,32])
1225
+ C-finite sequence, generated by -1/2/(x - 1/2)
1226
+ sage: r = C.guess([1,2,3,4,5])
1227
+ Traceback (most recent call last):
1228
+ ...
1229
+ ValueError: sequence too short for guessing
1230
+
1231
+ With Berlekamp-Massey, if an odd number of values is given, the last one is dropped.
1232
+ So with an odd number of values the result may not generate the last value::
1233
+
1234
+ sage: # needs numpy
1235
+ sage: r = C.guess([1,2,4,8,9], algorithm='bm'); r
1236
+ C-finite sequence, generated by -1/2/(x - 1/2)
1237
+ sage: r[0:5]
1238
+ [1, 2, 4, 8, 16]
1239
+
1240
+ Using pari::
1241
+
1242
+ sage: # needs numpy sage.libs.pari
1243
+ sage: r = C.guess([1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28], algorithm='pari'); r
1244
+ C-finite sequence, generated by (-x - 1)/(x^3 + x^2 - 1)
1245
+ sage: r[0:5]
1246
+ [1, 1, 1, 2, 2]
1247
+ """
1248
+ S = self.polynomial_ring()
1249
+
1250
+ if algorithm == 'bm':
1251
+ from sage.matrix.berlekamp_massey import berlekamp_massey
1252
+ if len(sequence) < 2:
1253
+ raise ValueError('sequence too short for guessing')
1254
+ R = PowerSeriesRing(QQ, 'x')
1255
+ if len(sequence) % 2:
1256
+ sequence.pop()
1257
+ l = len(sequence) - 1
1258
+ denominator = S(berlekamp_massey(sequence).reverse())
1259
+ numerator = R(S(sequence) * denominator, prec=l).truncate()
1260
+
1261
+ return CFiniteSequence(numerator / denominator)
1262
+
1263
+ if algorithm == 'pari':
1264
+ if len(sequence) < 6:
1265
+ raise ValueError('sequence too short for guessing')
1266
+ pari("ggf(v)=local(l,m,p,q,B);l=length(v);B=l\\2;\
1267
+ if(B<3,return(0));m=matrix(B,B,x,y,v[x-y+B+1]);\
1268
+ q=qflll(m,4)[1];if(length(q)==0,return(0));\
1269
+ p=sum(k=1,B,x^(k-1)*q[k,1]);\
1270
+ q=Pol(Pol(vector(l,n,v[l-n+1]))*p+O(x^(B+1)));\
1271
+ if(polcoeff(p,0)<0,q=-q;p=-p);q=q/p;p=Ser(q+O(x^(l+1)));\
1272
+ for(m=1,l,if(polcoeff(p,m-1)!=v[m],return(0)));q")
1273
+ pari_guess = pari("ggf")(sequence)
1274
+ num = S(pari_guess.numerator().Vec().sage()[::-1])
1275
+ den = S(pari_guess.denominator().Vec().sage()[::-1])
1276
+ if num == 0:
1277
+ return 0
1278
+ return CFiniteSequence(num / den)
1279
+
1280
+ from sage.matrix.constructor import matrix
1281
+ from sage.arith.misc import integer_ceil as ceil
1282
+ from numpy import trim_zeros
1283
+ seq = sequence[:]
1284
+ while seq and sequence[-1] == 0:
1285
+ seq.pop()
1286
+ l = len(seq)
1287
+ if l == 0:
1288
+ return 0
1289
+ if l < 6:
1290
+ raise ValueError('sequence too short for guessing')
1291
+
1292
+ hl = ceil(ZZ(l) / 2)
1293
+ A = matrix([sequence[k: k + hl] for k in range(hl)])
1294
+ K = A.kernel()
1295
+ if K.dimension() == 0:
1296
+ return 0
1297
+ R = PolynomialRing(QQ, 'x')
1298
+ den = R(trim_zeros(K.basis()[-1].list()[::-1]))
1299
+ if den == 1:
1300
+ return 0
1301
+ offset = next((i for i, x in enumerate(sequence) if x), None)
1302
+ S = PowerSeriesRing(QQ, 'x', default_prec=l - offset)
1303
+ num = S(R(sequence) * den).truncate(ZZ(l) // 2 + 1)
1304
+ if num == 0 or sequence != S(num / den).list():
1305
+ return 0
1306
+ return CFiniteSequence(num / den)