passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_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 (806) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +806 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  11. sage/algebras/all__sagemath_modules.py +20 -0
  12. sage/algebras/catalog.py +148 -0
  13. sage/algebras/clifford_algebra.py +3107 -0
  14. sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  15. sage/algebras/clifford_algebra_element.pxd +16 -0
  16. sage/algebras/clifford_algebra_element.pyx +997 -0
  17. sage/algebras/commutative_dga.py +4252 -0
  18. sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-gnu.so +0 -0
  19. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  20. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  21. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  22. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  28. sage/algebras/finite_gca.py +528 -0
  29. sage/algebras/group_algebra.py +232 -0
  30. sage/algebras/lie_algebras/abelian.py +197 -0
  31. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  32. sage/algebras/lie_algebras/all.py +25 -0
  33. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  34. sage/algebras/lie_algebras/bch.py +177 -0
  35. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  36. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  37. sage/algebras/lie_algebras/center_uea.py +767 -0
  38. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  39. sage/algebras/lie_algebras/examples.py +683 -0
  40. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  41. sage/algebras/lie_algebras/heisenberg.py +820 -0
  42. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  43. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  46. sage/algebras/lie_algebras/morphism.py +661 -0
  47. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  48. sage/algebras/lie_algebras/onsager.py +1324 -0
  49. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  50. sage/algebras/lie_algebras/quotient.py +462 -0
  51. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  52. sage/algebras/lie_algebras/representation.py +1040 -0
  53. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  54. sage/algebras/lie_algebras/subalgebra.py +967 -0
  55. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  56. sage/algebras/lie_algebras/verma_module.py +1630 -0
  57. sage/algebras/lie_algebras/virasoro.py +1186 -0
  58. sage/algebras/octonion_algebra.cpython-314-aarch64-linux-gnu.so +0 -0
  59. sage/algebras/octonion_algebra.pxd +20 -0
  60. sage/algebras/octonion_algebra.pyx +987 -0
  61. sage/algebras/orlik_solomon.py +907 -0
  62. sage/algebras/orlik_terao.py +779 -0
  63. sage/algebras/steenrod/all.py +7 -0
  64. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  65. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  66. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  67. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  68. sage/algebras/weyl_algebra.py +1126 -0
  69. sage/all__sagemath_modules.py +62 -0
  70. sage/calculus/all__sagemath_modules.py +19 -0
  71. sage/calculus/expr.py +205 -0
  72. sage/calculus/integration.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/calculus/integration.pyx +698 -0
  74. sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
  75. sage/calculus/interpolation.pxd +13 -0
  76. sage/calculus/interpolation.pyx +387 -0
  77. sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
  78. sage/calculus/interpolators.pyx +326 -0
  79. sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
  80. sage/calculus/ode.pxd +5 -0
  81. sage/calculus/ode.pyx +610 -0
  82. sage/calculus/riemann.cpython-314-aarch64-linux-gnu.so +0 -0
  83. sage/calculus/riemann.pyx +1521 -0
  84. sage/calculus/test_sympy.py +201 -0
  85. sage/calculus/transforms/all.py +7 -0
  86. sage/calculus/transforms/dft.py +844 -0
  87. sage/calculus/transforms/dwt.cpython-314-aarch64-linux-gnu.so +0 -0
  88. sage/calculus/transforms/dwt.pxd +7 -0
  89. sage/calculus/transforms/dwt.pyx +160 -0
  90. sage/calculus/transforms/fft.cpython-314-aarch64-linux-gnu.so +0 -0
  91. sage/calculus/transforms/fft.pxd +12 -0
  92. sage/calculus/transforms/fft.pyx +487 -0
  93. sage/calculus/wester.py +662 -0
  94. sage/coding/abstract_code.py +1108 -0
  95. sage/coding/ag_code.py +868 -0
  96. sage/coding/ag_code_decoders.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/coding/ag_code_decoders.pyx +2639 -0
  98. sage/coding/all.py +15 -0
  99. sage/coding/bch_code.py +494 -0
  100. sage/coding/binary_code.cpython-314-aarch64-linux-gnu.so +0 -0
  101. sage/coding/binary_code.pxd +124 -0
  102. sage/coding/binary_code.pyx +4139 -0
  103. sage/coding/bounds_catalog.py +43 -0
  104. sage/coding/channel.py +819 -0
  105. sage/coding/channels_catalog.py +29 -0
  106. sage/coding/code_bounds.py +755 -0
  107. sage/coding/code_constructions.py +804 -0
  108. sage/coding/codes_catalog.py +111 -0
  109. sage/coding/cyclic_code.py +1329 -0
  110. sage/coding/databases.py +316 -0
  111. sage/coding/decoder.py +373 -0
  112. sage/coding/decoders_catalog.py +88 -0
  113. sage/coding/delsarte_bounds.py +709 -0
  114. sage/coding/encoder.py +390 -0
  115. sage/coding/encoders_catalog.py +64 -0
  116. sage/coding/extended_code.py +468 -0
  117. sage/coding/gabidulin_code.py +1058 -0
  118. sage/coding/golay_code.py +404 -0
  119. sage/coding/goppa_code.py +441 -0
  120. sage/coding/grs_code.py +2371 -0
  121. sage/coding/guava.py +107 -0
  122. sage/coding/guruswami_sudan/all.py +1 -0
  123. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  124. sage/coding/guruswami_sudan/interpolation.py +409 -0
  125. sage/coding/guruswami_sudan/utils.py +176 -0
  126. sage/coding/hamming_code.py +176 -0
  127. sage/coding/information_set_decoder.py +1032 -0
  128. sage/coding/kasami_codes.cpython-314-aarch64-linux-gnu.so +0 -0
  129. sage/coding/kasami_codes.pyx +351 -0
  130. sage/coding/linear_code.py +3067 -0
  131. sage/coding/linear_code_no_metric.py +1354 -0
  132. sage/coding/linear_rank_metric.py +961 -0
  133. sage/coding/parity_check_code.py +353 -0
  134. sage/coding/punctured_code.py +719 -0
  135. sage/coding/reed_muller_code.py +999 -0
  136. sage/coding/self_dual_codes.py +942 -0
  137. sage/coding/source_coding/all.py +2 -0
  138. sage/coding/source_coding/huffman.py +553 -0
  139. sage/coding/subfield_subcode.py +423 -0
  140. sage/coding/two_weight_db.py +399 -0
  141. sage/combinat/all__sagemath_modules.py +7 -0
  142. sage/combinat/cartesian_product.py +347 -0
  143. sage/combinat/family.py +11 -0
  144. sage/combinat/free_module.py +1977 -0
  145. sage/combinat/root_system/all.py +147 -0
  146. sage/combinat/root_system/ambient_space.py +527 -0
  147. sage/combinat/root_system/associahedron.py +471 -0
  148. sage/combinat/root_system/braid_move_calculator.py +143 -0
  149. sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-gnu.so +0 -0
  150. sage/combinat/root_system/braid_orbit.pyx +144 -0
  151. sage/combinat/root_system/branching_rules.py +2301 -0
  152. sage/combinat/root_system/cartan_matrix.py +1245 -0
  153. sage/combinat/root_system/cartan_type.py +3069 -0
  154. sage/combinat/root_system/coxeter_group.py +162 -0
  155. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  156. sage/combinat/root_system/coxeter_type.py +681 -0
  157. sage/combinat/root_system/dynkin_diagram.py +900 -0
  158. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  159. sage/combinat/root_system/fundamental_group.py +795 -0
  160. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  161. sage/combinat/root_system/integrable_representations.py +1227 -0
  162. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  163. sage/combinat/root_system/pieri_factors.py +1147 -0
  164. sage/combinat/root_system/plot.py +1615 -0
  165. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  166. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  167. sage/combinat/root_system/root_space.py +487 -0
  168. sage/combinat/root_system/root_system.py +882 -0
  169. sage/combinat/root_system/type_A.py +348 -0
  170. sage/combinat/root_system/type_A_affine.py +227 -0
  171. sage/combinat/root_system/type_A_infinity.py +241 -0
  172. sage/combinat/root_system/type_B.py +347 -0
  173. sage/combinat/root_system/type_BC_affine.py +287 -0
  174. sage/combinat/root_system/type_B_affine.py +216 -0
  175. sage/combinat/root_system/type_C.py +317 -0
  176. sage/combinat/root_system/type_C_affine.py +188 -0
  177. sage/combinat/root_system/type_D.py +357 -0
  178. sage/combinat/root_system/type_D_affine.py +208 -0
  179. sage/combinat/root_system/type_E.py +641 -0
  180. sage/combinat/root_system/type_E_affine.py +231 -0
  181. sage/combinat/root_system/type_F.py +387 -0
  182. sage/combinat/root_system/type_F_affine.py +137 -0
  183. sage/combinat/root_system/type_G.py +293 -0
  184. sage/combinat/root_system/type_G_affine.py +132 -0
  185. sage/combinat/root_system/type_H.py +105 -0
  186. sage/combinat/root_system/type_I.py +110 -0
  187. sage/combinat/root_system/type_Q.py +150 -0
  188. sage/combinat/root_system/type_affine.py +509 -0
  189. sage/combinat/root_system/type_dual.py +704 -0
  190. sage/combinat/root_system/type_folded.py +301 -0
  191. sage/combinat/root_system/type_marked.py +748 -0
  192. sage/combinat/root_system/type_reducible.py +601 -0
  193. sage/combinat/root_system/type_relabel.py +730 -0
  194. sage/combinat/root_system/type_super_A.py +837 -0
  195. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  196. sage/combinat/root_system/weight_space.py +639 -0
  197. sage/combinat/root_system/weyl_characters.py +2238 -0
  198. sage/crypto/__init__.py +4 -0
  199. sage/crypto/all.py +28 -0
  200. sage/crypto/block_cipher/all.py +7 -0
  201. sage/crypto/block_cipher/des.py +1065 -0
  202. sage/crypto/block_cipher/miniaes.py +2171 -0
  203. sage/crypto/block_cipher/present.py +909 -0
  204. sage/crypto/block_cipher/sdes.py +1527 -0
  205. sage/crypto/boolean_function.cpython-314-aarch64-linux-gnu.so +0 -0
  206. sage/crypto/boolean_function.pxd +10 -0
  207. sage/crypto/boolean_function.pyx +1487 -0
  208. sage/crypto/cipher.py +78 -0
  209. sage/crypto/classical.py +3668 -0
  210. sage/crypto/classical_cipher.py +569 -0
  211. sage/crypto/cryptosystem.py +387 -0
  212. sage/crypto/key_exchange/all.py +7 -0
  213. sage/crypto/key_exchange/catalog.py +24 -0
  214. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  215. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  216. sage/crypto/lattice.py +312 -0
  217. sage/crypto/lfsr.py +295 -0
  218. sage/crypto/lwe.py +840 -0
  219. sage/crypto/mq/__init__.py +4 -0
  220. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  221. sage/crypto/mq/rijndael_gf.py +2345 -0
  222. sage/crypto/mq/sbox.py +7 -0
  223. sage/crypto/mq/sr.py +3344 -0
  224. sage/crypto/public_key/all.py +5 -0
  225. sage/crypto/public_key/blum_goldwasser.py +776 -0
  226. sage/crypto/sbox.cpython-314-aarch64-linux-gnu.so +0 -0
  227. sage/crypto/sbox.pyx +2090 -0
  228. sage/crypto/sboxes.py +2090 -0
  229. sage/crypto/stream.py +390 -0
  230. sage/crypto/stream_cipher.py +297 -0
  231. sage/crypto/util.py +519 -0
  232. sage/ext/all__sagemath_modules.py +1 -0
  233. sage/ext/interpreters/__init__.py +1 -0
  234. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  235. sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-gnu.so +0 -0
  236. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  237. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  238. sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-gnu.so +0 -0
  239. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  240. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  241. sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-gnu.so +0 -0
  242. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  243. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  244. sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-gnu.so +0 -0
  245. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  246. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  247. sage/geometry/all__sagemath_modules.py +5 -0
  248. sage/geometry/toric_lattice.py +1745 -0
  249. sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-gnu.so +0 -0
  250. sage/geometry/toric_lattice_element.pyx +432 -0
  251. sage/groups/abelian_gps/abelian_group.py +1925 -0
  252. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  253. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  254. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  255. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  256. sage/groups/abelian_gps/element_base.py +341 -0
  257. sage/groups/abelian_gps/values.py +488 -0
  258. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  259. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  260. sage/groups/additive_abelian/all.py +4 -0
  261. sage/groups/additive_abelian/qmodnz.py +231 -0
  262. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  263. sage/groups/affine_gps/affine_group.py +535 -0
  264. sage/groups/affine_gps/all.py +1 -0
  265. sage/groups/affine_gps/catalog.py +17 -0
  266. sage/groups/affine_gps/euclidean_group.py +246 -0
  267. sage/groups/affine_gps/group_element.py +562 -0
  268. sage/groups/all__sagemath_modules.py +12 -0
  269. sage/groups/galois_group.py +479 -0
  270. sage/groups/matrix_gps/all.py +4 -0
  271. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  272. sage/groups/matrix_gps/catalog.py +26 -0
  273. sage/groups/matrix_gps/coxeter_group.py +927 -0
  274. sage/groups/matrix_gps/finitely_generated.py +487 -0
  275. sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-gnu.so +0 -0
  276. sage/groups/matrix_gps/group_element.pxd +11 -0
  277. sage/groups/matrix_gps/group_element.pyx +431 -0
  278. sage/groups/matrix_gps/linear.py +440 -0
  279. sage/groups/matrix_gps/matrix_group.py +617 -0
  280. sage/groups/matrix_gps/named_group.py +296 -0
  281. sage/groups/matrix_gps/orthogonal.py +544 -0
  282. sage/groups/matrix_gps/symplectic.py +251 -0
  283. sage/groups/matrix_gps/unitary.py +436 -0
  284. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  285. sage/groups/misc_gps/argument_groups.py +1905 -0
  286. sage/groups/misc_gps/imaginary_groups.py +479 -0
  287. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  288. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-gnu.so +0 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  292. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-gnu.so +0 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  295. sage/homology/algebraic_topological_model.py +595 -0
  296. sage/homology/all.py +2 -0
  297. sage/homology/all__sagemath_modules.py +8 -0
  298. sage/homology/chain_complex.py +2148 -0
  299. sage/homology/chain_complex_homspace.py +165 -0
  300. sage/homology/chain_complex_morphism.py +629 -0
  301. sage/homology/chain_homotopy.py +604 -0
  302. sage/homology/chains.py +653 -0
  303. sage/homology/free_resolution.py +923 -0
  304. sage/homology/graded_resolution.py +567 -0
  305. sage/homology/hochschild_complex.py +756 -0
  306. sage/homology/homology_group.py +188 -0
  307. sage/homology/homology_morphism.py +422 -0
  308. sage/homology/homology_vector_space_with_basis.py +1454 -0
  309. sage/homology/koszul_complex.py +169 -0
  310. sage/homology/matrix_utils.py +205 -0
  311. sage/libs/all__sagemath_modules.py +1 -0
  312. sage/libs/gsl/__init__.py +1 -0
  313. sage/libs/gsl/airy.pxd +56 -0
  314. sage/libs/gsl/all.pxd +66 -0
  315. sage/libs/gsl/array.cpython-314-aarch64-linux-gnu.so +0 -0
  316. sage/libs/gsl/array.pxd +5 -0
  317. sage/libs/gsl/array.pyx +102 -0
  318. sage/libs/gsl/bessel.pxd +208 -0
  319. sage/libs/gsl/blas.pxd +116 -0
  320. sage/libs/gsl/blas_types.pxd +34 -0
  321. sage/libs/gsl/block.pxd +52 -0
  322. sage/libs/gsl/chebyshev.pxd +37 -0
  323. sage/libs/gsl/clausen.pxd +12 -0
  324. sage/libs/gsl/combination.pxd +47 -0
  325. sage/libs/gsl/complex.pxd +151 -0
  326. sage/libs/gsl/coulomb.pxd +30 -0
  327. sage/libs/gsl/coupling.pxd +21 -0
  328. sage/libs/gsl/dawson.pxd +12 -0
  329. sage/libs/gsl/debye.pxd +24 -0
  330. sage/libs/gsl/dilog.pxd +14 -0
  331. sage/libs/gsl/eigen.pxd +46 -0
  332. sage/libs/gsl/elementary.pxd +12 -0
  333. sage/libs/gsl/ellint.pxd +48 -0
  334. sage/libs/gsl/elljac.pxd +8 -0
  335. sage/libs/gsl/erf.pxd +32 -0
  336. sage/libs/gsl/errno.pxd +26 -0
  337. sage/libs/gsl/exp.pxd +44 -0
  338. sage/libs/gsl/expint.pxd +44 -0
  339. sage/libs/gsl/fermi_dirac.pxd +44 -0
  340. sage/libs/gsl/fft.pxd +121 -0
  341. sage/libs/gsl/fit.pxd +50 -0
  342. sage/libs/gsl/gamma.pxd +94 -0
  343. sage/libs/gsl/gegenbauer.pxd +26 -0
  344. sage/libs/gsl/histogram.pxd +176 -0
  345. sage/libs/gsl/hyperg.pxd +52 -0
  346. sage/libs/gsl/integration.pxd +69 -0
  347. sage/libs/gsl/interp.pxd +109 -0
  348. sage/libs/gsl/laguerre.pxd +24 -0
  349. sage/libs/gsl/lambert.pxd +16 -0
  350. sage/libs/gsl/legendre.pxd +90 -0
  351. sage/libs/gsl/linalg.pxd +185 -0
  352. sage/libs/gsl/log.pxd +26 -0
  353. sage/libs/gsl/math.pxd +43 -0
  354. sage/libs/gsl/matrix.pxd +143 -0
  355. sage/libs/gsl/matrix_complex.pxd +130 -0
  356. sage/libs/gsl/min.pxd +67 -0
  357. sage/libs/gsl/monte.pxd +56 -0
  358. sage/libs/gsl/ntuple.pxd +32 -0
  359. sage/libs/gsl/odeiv.pxd +70 -0
  360. sage/libs/gsl/permutation.pxd +78 -0
  361. sage/libs/gsl/poly.pxd +40 -0
  362. sage/libs/gsl/pow_int.pxd +12 -0
  363. sage/libs/gsl/psi.pxd +28 -0
  364. sage/libs/gsl/qrng.pxd +29 -0
  365. sage/libs/gsl/random.pxd +257 -0
  366. sage/libs/gsl/rng.pxd +100 -0
  367. sage/libs/gsl/roots.pxd +72 -0
  368. sage/libs/gsl/sort.pxd +36 -0
  369. sage/libs/gsl/statistics.pxd +59 -0
  370. sage/libs/gsl/sum.pxd +55 -0
  371. sage/libs/gsl/synchrotron.pxd +16 -0
  372. sage/libs/gsl/transport.pxd +24 -0
  373. sage/libs/gsl/trig.pxd +58 -0
  374. sage/libs/gsl/types.pxd +137 -0
  375. sage/libs/gsl/vector.pxd +101 -0
  376. sage/libs/gsl/vector_complex.pxd +83 -0
  377. sage/libs/gsl/wavelet.pxd +49 -0
  378. sage/libs/gsl/zeta.pxd +28 -0
  379. sage/libs/mpc/__init__.pxd +114 -0
  380. sage/libs/mpc/types.pxd +28 -0
  381. sage/libs/mpfr/__init__.pxd +299 -0
  382. sage/libs/mpfr/types.pxd +26 -0
  383. sage/libs/mpmath/__init__.py +1 -0
  384. sage/libs/mpmath/all.py +27 -0
  385. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  386. sage/libs/mpmath/utils.cpython-314-aarch64-linux-gnu.so +0 -0
  387. sage/libs/mpmath/utils.pxd +4 -0
  388. sage/libs/mpmath/utils.pyx +319 -0
  389. sage/matrix/action.cpython-314-aarch64-linux-gnu.so +0 -0
  390. sage/matrix/action.pxd +26 -0
  391. sage/matrix/action.pyx +596 -0
  392. sage/matrix/all.py +9 -0
  393. sage/matrix/args.cpython-314-aarch64-linux-gnu.so +0 -0
  394. sage/matrix/args.pxd +144 -0
  395. sage/matrix/args.pyx +1668 -0
  396. sage/matrix/benchmark.py +1258 -0
  397. sage/matrix/berlekamp_massey.py +95 -0
  398. sage/matrix/compute_J_ideal.py +926 -0
  399. sage/matrix/constructor.cpython-314-aarch64-linux-gnu.so +0 -0
  400. sage/matrix/constructor.pyx +750 -0
  401. sage/matrix/docs.py +430 -0
  402. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  403. sage/matrix/echelon_matrix.pyx +155 -0
  404. sage/matrix/matrix.pxd +2 -0
  405. sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
  406. sage/matrix/matrix0.pxd +68 -0
  407. sage/matrix/matrix0.pyx +6324 -0
  408. sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
  409. sage/matrix/matrix1.pxd +8 -0
  410. sage/matrix/matrix1.pyx +2851 -0
  411. sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
  412. sage/matrix/matrix2.pxd +25 -0
  413. sage/matrix/matrix2.pyx +20181 -0
  414. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.so +0 -0
  415. sage/matrix/matrix_cdv.pxd +4 -0
  416. sage/matrix/matrix_cdv.pyx +93 -0
  417. sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  418. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  419. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  420. sage/matrix/matrix_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  421. sage/matrix/matrix_dense.pxd +5 -0
  422. sage/matrix/matrix_dense.pyx +343 -0
  423. sage/matrix/matrix_domain_dense.pxd +5 -0
  424. sage/matrix/matrix_domain_sparse.pxd +5 -0
  425. sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  426. sage/matrix/matrix_double_dense.pxd +7 -0
  427. sage/matrix/matrix_double_dense.pyx +3906 -0
  428. sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  429. sage/matrix/matrix_double_sparse.pxd +6 -0
  430. sage/matrix/matrix_double_sparse.pyx +248 -0
  431. sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  432. sage/matrix/matrix_generic_dense.pxd +7 -0
  433. sage/matrix/matrix_generic_dense.pyx +354 -0
  434. sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  435. sage/matrix/matrix_generic_sparse.pxd +7 -0
  436. sage/matrix/matrix_generic_sparse.pyx +461 -0
  437. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  440. sage/matrix/matrix_misc.py +313 -0
  441. sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  442. sage/matrix/matrix_numpy_dense.pxd +14 -0
  443. sage/matrix/matrix_numpy_dense.pyx +450 -0
  444. sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  445. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  446. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  447. sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  448. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  449. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  450. sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  451. sage/matrix/matrix_real_double_dense.pxd +7 -0
  452. sage/matrix/matrix_real_double_dense.pyx +122 -0
  453. sage/matrix/matrix_space.py +2848 -0
  454. sage/matrix/matrix_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  455. sage/matrix/matrix_sparse.pxd +5 -0
  456. sage/matrix/matrix_sparse.pyx +1222 -0
  457. sage/matrix/matrix_window.cpython-314-aarch64-linux-gnu.so +0 -0
  458. sage/matrix/matrix_window.pxd +37 -0
  459. sage/matrix/matrix_window.pyx +242 -0
  460. sage/matrix/misc_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  461. sage/matrix/misc_mpfr.pyx +80 -0
  462. sage/matrix/operation_table.py +1182 -0
  463. sage/matrix/special.py +3666 -0
  464. sage/matrix/strassen.cpython-314-aarch64-linux-gnu.so +0 -0
  465. sage/matrix/strassen.pyx +851 -0
  466. sage/matrix/symplectic_basis.py +541 -0
  467. sage/matrix/template.pxd +6 -0
  468. sage/matrix/tests.py +71 -0
  469. sage/matroids/advanced.py +77 -0
  470. sage/matroids/all.py +13 -0
  471. sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  472. sage/matroids/basis_exchange_matroid.pxd +96 -0
  473. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  474. sage/matroids/basis_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  475. sage/matroids/basis_matroid.pxd +45 -0
  476. sage/matroids/basis_matroid.pyx +1217 -0
  477. sage/matroids/catalog.py +44 -0
  478. sage/matroids/chow_ring.py +473 -0
  479. sage/matroids/chow_ring_ideal.py +849 -0
  480. sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  481. sage/matroids/circuit_closures_matroid.pxd +16 -0
  482. sage/matroids/circuit_closures_matroid.pyx +559 -0
  483. sage/matroids/circuits_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  484. sage/matroids/circuits_matroid.pxd +38 -0
  485. sage/matroids/circuits_matroid.pyx +947 -0
  486. sage/matroids/constructor.py +1086 -0
  487. sage/matroids/database_collections.py +365 -0
  488. sage/matroids/database_matroids.py +5338 -0
  489. sage/matroids/dual_matroid.py +583 -0
  490. sage/matroids/extension.cpython-314-aarch64-linux-gnu.so +0 -0
  491. sage/matroids/extension.pxd +34 -0
  492. sage/matroids/extension.pyx +519 -0
  493. sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  494. sage/matroids/flats_matroid.pxd +28 -0
  495. sage/matroids/flats_matroid.pyx +715 -0
  496. sage/matroids/gammoid.py +600 -0
  497. sage/matroids/graphic_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  498. sage/matroids/graphic_matroid.pxd +39 -0
  499. sage/matroids/graphic_matroid.pyx +2024 -0
  500. sage/matroids/lean_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
  501. sage/matroids/lean_matrix.pxd +126 -0
  502. sage/matroids/lean_matrix.pyx +3667 -0
  503. sage/matroids/linear_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  504. sage/matroids/linear_matroid.pxd +180 -0
  505. sage/matroids/linear_matroid.pyx +6649 -0
  506. sage/matroids/matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  507. sage/matroids/matroid.pxd +243 -0
  508. sage/matroids/matroid.pyx +8759 -0
  509. sage/matroids/matroids_catalog.py +190 -0
  510. sage/matroids/matroids_plot_helpers.py +890 -0
  511. sage/matroids/minor_matroid.py +480 -0
  512. sage/matroids/minorfix.h +9 -0
  513. sage/matroids/named_matroids.py +5 -0
  514. sage/matroids/rank_matroid.py +268 -0
  515. sage/matroids/set_system.cpython-314-aarch64-linux-gnu.so +0 -0
  516. sage/matroids/set_system.pxd +38 -0
  517. sage/matroids/set_system.pyx +800 -0
  518. sage/matroids/transversal_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  519. sage/matroids/transversal_matroid.pxd +14 -0
  520. sage/matroids/transversal_matroid.pyx +893 -0
  521. sage/matroids/union_matroid.cpython-314-aarch64-linux-gnu.so +0 -0
  522. sage/matroids/union_matroid.pxd +20 -0
  523. sage/matroids/union_matroid.pyx +331 -0
  524. sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.so +0 -0
  525. sage/matroids/unpickling.pyx +843 -0
  526. sage/matroids/utilities.py +809 -0
  527. sage/misc/all__sagemath_modules.py +20 -0
  528. sage/misc/c3.cpython-314-aarch64-linux-gnu.so +0 -0
  529. sage/misc/c3.pyx +238 -0
  530. sage/misc/compat.py +87 -0
  531. sage/misc/element_with_label.py +173 -0
  532. sage/misc/func_persist.py +79 -0
  533. sage/misc/pickle_old.cpython-314-aarch64-linux-gnu.so +0 -0
  534. sage/misc/pickle_old.pyx +19 -0
  535. sage/misc/proof.py +7 -0
  536. sage/misc/replace_dot_all.py +472 -0
  537. sage/misc/sagedoc_conf.py +168 -0
  538. sage/misc/sphinxify.py +167 -0
  539. sage/misc/test_class_pickling.py +85 -0
  540. sage/modules/all.py +42 -0
  541. sage/modules/complex_double_vector.py +25 -0
  542. sage/modules/diamond_cutting.py +380 -0
  543. sage/modules/fg_pid/all.py +1 -0
  544. sage/modules/fg_pid/fgp_element.py +456 -0
  545. sage/modules/fg_pid/fgp_module.py +2091 -0
  546. sage/modules/fg_pid/fgp_morphism.py +550 -0
  547. sage/modules/filtered_vector_space.py +1271 -0
  548. sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-gnu.so +0 -0
  549. sage/modules/finite_submodule_iter.pxd +27 -0
  550. sage/modules/finite_submodule_iter.pyx +452 -0
  551. sage/modules/fp_graded/all.py +1 -0
  552. sage/modules/fp_graded/element.py +346 -0
  553. sage/modules/fp_graded/free_element.py +298 -0
  554. sage/modules/fp_graded/free_homspace.py +53 -0
  555. sage/modules/fp_graded/free_module.py +1060 -0
  556. sage/modules/fp_graded/free_morphism.py +217 -0
  557. sage/modules/fp_graded/homspace.py +563 -0
  558. sage/modules/fp_graded/module.py +1340 -0
  559. sage/modules/fp_graded/morphism.py +1990 -0
  560. sage/modules/fp_graded/steenrod/all.py +1 -0
  561. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  562. sage/modules/fp_graded/steenrod/module.py +477 -0
  563. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  564. sage/modules/fp_graded/steenrod/profile.py +241 -0
  565. sage/modules/free_module.py +8447 -0
  566. sage/modules/free_module_element.cpython-314-aarch64-linux-gnu.so +0 -0
  567. sage/modules/free_module_element.pxd +22 -0
  568. sage/modules/free_module_element.pyx +5445 -0
  569. sage/modules/free_module_homspace.py +369 -0
  570. sage/modules/free_module_integer.py +896 -0
  571. sage/modules/free_module_morphism.py +823 -0
  572. sage/modules/free_module_pseudohomspace.py +352 -0
  573. sage/modules/free_module_pseudomorphism.py +578 -0
  574. sage/modules/free_quadratic_module.py +1706 -0
  575. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  576. sage/modules/matrix_morphism.py +1745 -0
  577. sage/modules/misc.py +103 -0
  578. sage/modules/module_functors.py +192 -0
  579. sage/modules/multi_filtered_vector_space.py +719 -0
  580. sage/modules/ore_module.py +2208 -0
  581. sage/modules/ore_module_element.py +178 -0
  582. sage/modules/ore_module_homspace.py +147 -0
  583. sage/modules/ore_module_morphism.py +968 -0
  584. sage/modules/quotient_module.py +699 -0
  585. sage/modules/real_double_vector.py +22 -0
  586. sage/modules/submodule.py +255 -0
  587. sage/modules/tensor_operations.py +567 -0
  588. sage/modules/torsion_quadratic_module.py +1352 -0
  589. sage/modules/tutorial_free_modules.py +248 -0
  590. sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  591. sage/modules/vector_complex_double_dense.pxd +6 -0
  592. sage/modules/vector_complex_double_dense.pyx +117 -0
  593. sage/modules/vector_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  594. sage/modules/vector_double_dense.pxd +6 -0
  595. sage/modules/vector_double_dense.pyx +604 -0
  596. sage/modules/vector_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  597. sage/modules/vector_integer_dense.pxd +15 -0
  598. sage/modules/vector_integer_dense.pyx +361 -0
  599. sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  600. sage/modules/vector_integer_sparse.pxd +29 -0
  601. sage/modules/vector_integer_sparse.pyx +406 -0
  602. sage/modules/vector_modn_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  603. sage/modules/vector_modn_dense.pxd +12 -0
  604. sage/modules/vector_modn_dense.pyx +394 -0
  605. sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  606. sage/modules/vector_modn_sparse.pxd +21 -0
  607. sage/modules/vector_modn_sparse.pyx +298 -0
  608. sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  609. sage/modules/vector_numpy_dense.pxd +15 -0
  610. sage/modules/vector_numpy_dense.pyx +304 -0
  611. sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  612. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  613. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  614. sage/modules/vector_rational_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  615. sage/modules/vector_rational_dense.pxd +15 -0
  616. sage/modules/vector_rational_dense.pyx +387 -0
  617. sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-gnu.so +0 -0
  618. sage/modules/vector_rational_sparse.pxd +30 -0
  619. sage/modules/vector_rational_sparse.pyx +413 -0
  620. sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  621. sage/modules/vector_real_double_dense.pxd +6 -0
  622. sage/modules/vector_real_double_dense.pyx +126 -0
  623. sage/modules/vector_space_homspace.py +430 -0
  624. sage/modules/vector_space_morphism.py +989 -0
  625. sage/modules/with_basis/all.py +15 -0
  626. sage/modules/with_basis/cell_module.py +494 -0
  627. sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-gnu.so +0 -0
  628. sage/modules/with_basis/indexed_element.pxd +13 -0
  629. sage/modules/with_basis/indexed_element.pyx +1058 -0
  630. sage/modules/with_basis/invariant.py +1075 -0
  631. sage/modules/with_basis/morphism.py +1636 -0
  632. sage/modules/with_basis/representation.py +2939 -0
  633. sage/modules/with_basis/subquotient.py +685 -0
  634. sage/numerical/all__sagemath_modules.py +6 -0
  635. sage/numerical/gauss_legendre.cpython-314-aarch64-linux-gnu.so +0 -0
  636. sage/numerical/gauss_legendre.pyx +381 -0
  637. sage/numerical/optimize.py +910 -0
  638. sage/probability/all.py +10 -0
  639. sage/probability/probability_distribution.cpython-314-aarch64-linux-gnu.so +0 -0
  640. sage/probability/probability_distribution.pyx +1242 -0
  641. sage/probability/random_variable.py +411 -0
  642. sage/quadratic_forms/all.py +4 -0
  643. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  644. sage/quadratic_forms/binary_qf.py +2042 -0
  645. sage/quadratic_forms/bqf_class_group.py +748 -0
  646. sage/quadratic_forms/constructions.py +93 -0
  647. sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-gnu.so +0 -0
  648. sage/quadratic_forms/count_local_2.pyx +365 -0
  649. sage/quadratic_forms/extras.py +195 -0
  650. sage/quadratic_forms/quadratic_form.py +1753 -0
  651. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  652. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  653. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-gnu.so +0 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  655. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  656. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  657. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  658. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  659. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  660. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  661. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  662. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  663. sage/quadratic_forms/random_quadraticform.py +209 -0
  664. sage/quadratic_forms/ternary.cpython-314-aarch64-linux-gnu.so +0 -0
  665. sage/quadratic_forms/ternary.pyx +1154 -0
  666. sage/quadratic_forms/ternary_qf.py +2027 -0
  667. sage/rings/all__sagemath_modules.py +28 -0
  668. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  669. sage/rings/asymptotic/misc.py +1252 -0
  670. sage/rings/cc.py +4 -0
  671. sage/rings/cfinite_sequence.py +1306 -0
  672. sage/rings/complex_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  673. sage/rings/complex_conversion.pxd +8 -0
  674. sage/rings/complex_conversion.pyx +23 -0
  675. sage/rings/complex_double.cpython-314-aarch64-linux-gnu.so +0 -0
  676. sage/rings/complex_double.pxd +21 -0
  677. sage/rings/complex_double.pyx +2654 -0
  678. sage/rings/complex_mpc.cpython-314-aarch64-linux-gnu.so +0 -0
  679. sage/rings/complex_mpc.pxd +21 -0
  680. sage/rings/complex_mpc.pyx +2576 -0
  681. sage/rings/complex_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  682. sage/rings/complex_mpfr.pxd +18 -0
  683. sage/rings/complex_mpfr.pyx +3602 -0
  684. sage/rings/derivation.py +2334 -0
  685. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  686. sage/rings/finite_rings/maps_finite_field.py +191 -0
  687. sage/rings/function_field/all__sagemath_modules.py +8 -0
  688. sage/rings/function_field/derivations.py +102 -0
  689. sage/rings/function_field/derivations_rational.py +132 -0
  690. sage/rings/function_field/differential.py +853 -0
  691. sage/rings/function_field/divisor.py +1107 -0
  692. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  693. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  694. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  695. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  696. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  697. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  698. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  699. sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  700. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  701. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.so +0 -0
  702. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  703. sage/rings/invariants/all.py +4 -0
  704. sage/rings/invariants/invariant_theory.py +4597 -0
  705. sage/rings/invariants/reconstruction.py +395 -0
  706. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  707. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  708. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-gnu.so +0 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  711. sage/rings/polynomial/ore_function_element.py +952 -0
  712. sage/rings/polynomial/ore_function_field.py +1028 -0
  713. sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  714. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  715. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  716. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  717. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  719. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  720. sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-gnu.so +0 -0
  721. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  722. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  723. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-gnu.so +0 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  726. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-gnu.so +0 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  729. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  730. sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-gnu.so +0 -0
  731. sage/rings/real_double_element_gsl.pxd +8 -0
  732. sage/rings/real_double_element_gsl.pyx +794 -0
  733. sage/rings/real_field.py +58 -0
  734. sage/rings/real_mpfr.cpython-314-aarch64-linux-gnu.so +0 -0
  735. sage/rings/real_mpfr.pxd +29 -0
  736. sage/rings/real_mpfr.pyx +6122 -0
  737. sage/rings/ring_extension.cpython-314-aarch64-linux-gnu.so +0 -0
  738. sage/rings/ring_extension.pxd +42 -0
  739. sage/rings/ring_extension.pyx +2779 -0
  740. sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-gnu.so +0 -0
  741. sage/rings/ring_extension_conversion.pxd +16 -0
  742. sage/rings/ring_extension_conversion.pyx +462 -0
  743. sage/rings/ring_extension_element.cpython-314-aarch64-linux-gnu.so +0 -0
  744. sage/rings/ring_extension_element.pxd +21 -0
  745. sage/rings/ring_extension_element.pyx +1635 -0
  746. sage/rings/ring_extension_homset.py +64 -0
  747. sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-gnu.so +0 -0
  748. sage/rings/ring_extension_morphism.pxd +35 -0
  749. sage/rings/ring_extension_morphism.pyx +920 -0
  750. sage/schemes/all__sagemath_modules.py +1 -0
  751. sage/schemes/projective/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/coherent_sheaf.py +300 -0
  753. sage/schemes/projective/cohomology.py +510 -0
  754. sage/stats/all.py +15 -0
  755. sage/stats/basic_stats.py +489 -0
  756. sage/stats/distributions/all.py +7 -0
  757. sage/stats/distributions/catalog.py +34 -0
  758. sage/stats/distributions/dgs.h +50 -0
  759. sage/stats/distributions/dgs.pxd +111 -0
  760. sage/stats/distributions/dgs_bern.h +400 -0
  761. sage/stats/distributions/dgs_gauss.h +614 -0
  762. sage/stats/distributions/dgs_misc.h +104 -0
  763. sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-gnu.so +0 -0
  764. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  766. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  767. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  768. sage/stats/hmm/all.py +15 -0
  769. sage/stats/hmm/chmm.cpython-314-aarch64-linux-gnu.so +0 -0
  770. sage/stats/hmm/chmm.pyx +1595 -0
  771. sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.so +0 -0
  772. sage/stats/hmm/distributions.pxd +29 -0
  773. sage/stats/hmm/distributions.pyx +531 -0
  774. sage/stats/hmm/hmm.cpython-314-aarch64-linux-gnu.so +0 -0
  775. sage/stats/hmm/hmm.pxd +17 -0
  776. sage/stats/hmm/hmm.pyx +1388 -0
  777. sage/stats/hmm/util.cpython-314-aarch64-linux-gnu.so +0 -0
  778. sage/stats/hmm/util.pxd +7 -0
  779. sage/stats/hmm/util.pyx +165 -0
  780. sage/stats/intlist.cpython-314-aarch64-linux-gnu.so +0 -0
  781. sage/stats/intlist.pxd +14 -0
  782. sage/stats/intlist.pyx +588 -0
  783. sage/stats/r.py +49 -0
  784. sage/stats/time_series.cpython-314-aarch64-linux-gnu.so +0 -0
  785. sage/stats/time_series.pxd +6 -0
  786. sage/stats/time_series.pyx +2546 -0
  787. sage/tensor/all.py +2 -0
  788. sage/tensor/modules/all.py +8 -0
  789. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  790. sage/tensor/modules/comp.py +5598 -0
  791. sage/tensor/modules/ext_pow_free_module.py +824 -0
  792. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  793. sage/tensor/modules/format_utilities.py +333 -0
  794. sage/tensor/modules/free_module_alt_form.py +858 -0
  795. sage/tensor/modules/free_module_automorphism.py +1207 -0
  796. sage/tensor/modules/free_module_basis.py +1074 -0
  797. sage/tensor/modules/free_module_element.py +284 -0
  798. sage/tensor/modules/free_module_homset.py +652 -0
  799. sage/tensor/modules/free_module_linear_group.py +564 -0
  800. sage/tensor/modules/free_module_morphism.py +1581 -0
  801. sage/tensor/modules/free_module_tensor.py +3289 -0
  802. sage/tensor/modules/reflexive_module.py +386 -0
  803. sage/tensor/modules/tensor_free_module.py +780 -0
  804. sage/tensor/modules/tensor_free_submodule.py +538 -0
  805. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  806. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1242 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Probability Distributions
4
+
5
+ This module provides three types of probability distributions:
6
+
7
+ - :class:`RealDistribution`: various real-valued probability distributions.
8
+
9
+ - :class:`SphericalDistribution`: uniformly distributed points on the
10
+ surface of an `n-1` sphere in `n` dimensional euclidean space.
11
+
12
+ - :class:`GeneralDiscreteDistribution`: user-defined discrete distributions.
13
+
14
+ AUTHORS:
15
+
16
+ - Josh Kantor (2007-02): first version
17
+
18
+ - William Stein (2007-02): rewrite of docs, conventions, etc.
19
+
20
+ - Carlo Hamalainen (2008-08): full doctest coverage, more documentation,
21
+ GeneralDiscreteDistribution, misc fixes.
22
+
23
+ - Kwankyu Lee (2010-05-29): F-distribution support.
24
+
25
+ REFERENCES:
26
+
27
+ GNU gsl library, General discrete distributions
28
+ http://www.gnu.org/software/gsl/manual/html_node/General-Discrete-Distributions.html
29
+
30
+ GNU gsl library, Random number distributions
31
+ http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html
32
+ """
33
+ # ****************************************************************************
34
+ # Copyright (C) 2004, 2005, 2006 Joshua Kantor <kantor.jm@gmail.com>
35
+ #
36
+ # This program is free software: you can redistribute it and/or modify
37
+ # it under the terms of the GNU General Public License as published by
38
+ # the Free Software Foundation, either version 2 of the License, or
39
+ # (at your option) any later version.
40
+ # https://www.gnu.org/licenses/
41
+ # ****************************************************************************
42
+ from cysignals.memory cimport sig_malloc, sig_free
43
+
44
+ from sage.libs.gsl.rng cimport *
45
+ from sage.libs.gsl.random cimport *
46
+ import sage.misc.prandom as random
47
+ import sage.rings.real_double
48
+ from sage.modules.free_module_element import vector
49
+
50
+ # TODO: Add more distributions available in gsl
51
+ # available but not currently wrapped are laplace, cauchy, landau, logistic.
52
+
53
+ cdef enum:
54
+ uniform
55
+ gaussian
56
+ rayleigh
57
+ lognormal
58
+ pareto
59
+ t
60
+ F
61
+ chisquared
62
+ exppow
63
+ weibull
64
+ beta
65
+ exponential
66
+ gamma
67
+
68
+ cdef class ProbabilityDistribution:
69
+ r"""
70
+ Concrete probability distributions should be derived from this
71
+ abstract class.
72
+ """
73
+
74
+ def __init__(self):
75
+ r"""
76
+ To be implemented by a derived class::
77
+
78
+ sage: P = sage.probability.probability_distribution.ProbabilityDistribution()
79
+ """
80
+
81
+ pass
82
+
83
+ def get_random_element(self):
84
+ r"""
85
+ To be implemented by a derived class::
86
+
87
+ sage: P = sage.probability.probability_distribution.ProbabilityDistribution()
88
+ sage: P.get_random_element()
89
+ Traceback (most recent call last):
90
+ ...
91
+ NotImplementedError: implement in derived class
92
+ """
93
+
94
+ raise NotImplementedError("implement in derived class")
95
+
96
+ def generate_histogram_data(self, num_samples=1000, bins=50):
97
+ r"""
98
+ Compute a histogram of the probability distribution.
99
+
100
+ INPUT:
101
+
102
+ - ``num_samples`` -- (optional) number of times to sample from
103
+ the probability distribution
104
+
105
+ - ``bins`` -- (optional) number of bins to divide the samples
106
+ into
107
+
108
+ OUTPUT:
109
+
110
+ - a tuple. The first element of the tuple is a list of length
111
+ ``bins``, consisting of the normalised histogram of the random
112
+ samples. The second list is the bins.
113
+
114
+ EXAMPLES::
115
+
116
+ sage: set_random_seed(0)
117
+ sage: from sage.probability.probability_distribution import GeneralDiscreteDistribution
118
+ sage: P = [0.3, 0.4, 0.3]
119
+ sage: X = GeneralDiscreteDistribution(P)
120
+ sage: h, b = X.generate_histogram_data(bins=10) # needs sage.plot
121
+ sage: h # rel tol 1e-08 # needs sage.plot
122
+ [1.6299999999999999,
123
+ 0.0,
124
+ 0.0,
125
+ 0.0,
126
+ 0.0,
127
+ 1.9049999999999985,
128
+ 0.0,
129
+ 0.0,
130
+ 0.0,
131
+ 1.4650000000000003]
132
+ sage: b # needs sage.plot
133
+ [0.0,
134
+ 0.2,
135
+ 0.4,
136
+ 0.6000000000000001,
137
+ 0.8,
138
+ 1.0,
139
+ 1.2000000000000002,
140
+ 1.4000000000000001,
141
+ 1.6,
142
+ 1.8,
143
+ 2.0]
144
+ """
145
+ import numpy as np
146
+ if int(np.version.short_version[0]) > 1:
147
+ np.set_printoptions(legacy="1.25")
148
+ import pylab
149
+ ell = [float(self.get_random_element()) for _ in range(num_samples)]
150
+ S = pylab.hist(ell, bins, density=True)
151
+ return [list(S[0]), list(S[1])]
152
+
153
+ def generate_histogram_plot(self, name, num_samples=1000, bins=50):
154
+ r"""
155
+ Save the histogram from :func:`generate_histogram_data() <sage.libs.gsl.ProbabilityDistribution.generate_histogram_data>`
156
+ to a file.
157
+
158
+ INPUT:
159
+
160
+ - ``name`` -- file to save the histogram plot (as a PNG)
161
+
162
+ - ``num_samples`` -- (optional) number of times to sample from
163
+ the probability distribution
164
+
165
+ - ``bins`` -- (optional) number of bins to divide the samples
166
+ into
167
+
168
+ EXAMPLES:
169
+
170
+ This saves the histogram plot to a temporary file::
171
+
172
+ sage: from sage.probability.probability_distribution import GeneralDiscreteDistribution
173
+ sage: import tempfile
174
+ sage: P = [0.3, 0.4, 0.3]
175
+ sage: X = GeneralDiscreteDistribution(P)
176
+ sage: with tempfile.NamedTemporaryFile() as f: # needs sage.plot
177
+ ....: X.generate_histogram_plot(f.name)
178
+ """
179
+ import pylab
180
+ ell = [float(self.get_random_element()) for _ in range(num_samples)]
181
+ pylab.hist(ell, bins, density=True)
182
+ pylab.savefig(name)
183
+
184
+
185
+ cdef class SphericalDistribution(ProbabilityDistribution):
186
+ r"""
187
+ This class is capable of producing random points uniformly distributed
188
+ on the surface of an `(n-1)`-sphere in `n`-dimensional euclidean space. The
189
+ dimension `n` is selected via the keyword ``dimension``. The random
190
+ number generator which drives it can be selected using the keyword
191
+ ``rng``. Valid choices are ``'default'`` which uses the Mersenne-Twister,
192
+ ``'luxury'`` which uses RANDLXS, and ``'taus'`` which uses the tausworth
193
+ generator. The default dimension is ``3``.
194
+
195
+ EXAMPLES::
196
+
197
+ sage: T = SphericalDistribution()
198
+ sage: s = T.get_random_element()
199
+ sage: s.norm() # rel tol 1e-14
200
+ 1.0
201
+ sage: len(s)
202
+ 3
203
+ sage: T = SphericalDistribution(dimension=4, rng='luxury')
204
+ sage: s = T.get_random_element()
205
+ sage: s.norm() # rel tol 1e-14
206
+ 1.0
207
+ sage: len(s)
208
+ 4
209
+
210
+ TESTS:
211
+
212
+ Make sure that repeated initializations are randomly seeded
213
+ (:issue:`9770`)::
214
+
215
+ sage: Xs = [tuple(SphericalDistribution(2).get_random_element()) for _ in range(1000)]
216
+ sage: len(set(Xs)) > 2^^32
217
+ True
218
+ """
219
+
220
+ cdef gsl_rng *r
221
+ cdef gsl_rng_type *T
222
+ cdef long int seed
223
+ cdef Py_ssize_t dimension
224
+ cdef double* vec
225
+
226
+ def __init__(self, dimension=3, rng='default', seed=None):
227
+ r"""
228
+ EXAMPLES::
229
+
230
+ sage: T = SphericalDistribution()
231
+ sage: T.get_random_element().norm() # rel tol 1e-14
232
+ 1.0
233
+
234
+ TESTS:
235
+
236
+ Until :issue:`15089` a value of the ``seed`` keyword
237
+ besides ``None`` was ignored. We check here that setting
238
+ a seed is effective. ::
239
+
240
+ sage: T = SphericalDistribution(seed=876)
241
+ sage: one = [T.get_random_element() for _ in range(10)]
242
+ sage: T = SphericalDistribution(seed=876)
243
+ sage: two = [T.get_random_element() for _ in range(10)]
244
+ sage: T = SphericalDistribution(seed=123)
245
+ sage: three = [T.get_random_element() for _ in range(10)]
246
+ sage: one == two
247
+ True
248
+ sage: one == three
249
+ False
250
+ """
251
+ gsl_rng_env_setup()
252
+ self.set_random_number_generator(rng)
253
+ self.r = gsl_rng_alloc(self.T)
254
+ if seed is None:
255
+ seed = random.randint(1, 2**31)
256
+ self.set_seed(seed)
257
+ self.dimension = dimension
258
+ self.vec = <double *>sig_malloc(self.dimension*(sizeof(double)))
259
+
260
+ def set_seed(self, seed):
261
+ r"""
262
+ Set the seed for the underlying random number generator.
263
+
264
+ EXAMPLES::
265
+
266
+ sage: T = SphericalDistribution(seed=0)
267
+ sage: T.set_seed(100)
268
+ """
269
+ gsl_rng_set(self.r, seed)
270
+ self.seed = seed
271
+
272
+ def set_random_number_generator(self, rng='default'):
273
+ r"""
274
+ Set the gsl random number generator to be one of ``default``,
275
+ ``luxury``, or ``taus``.
276
+
277
+ EXAMPLES::
278
+
279
+ sage: T = SphericalDistribution()
280
+ sage: T.set_random_number_generator('default')
281
+ sage: T.set_seed(0)
282
+ sage: T.get_random_element() # rel tol 4e-16
283
+ (0.07961564104639995, -0.05237671627581255, 0.9954486572862178)
284
+ sage: T.set_random_number_generator('luxury')
285
+ sage: T.set_seed(0)
286
+ sage: T.get_random_element() # rel tol 4e-16
287
+ (0.07961564104639995, -0.05237671627581255, 0.9954486572862178)
288
+ """
289
+ if rng == 'default':
290
+ self.T = gsl_rng_default
291
+ elif rng == 'luxury':
292
+ self.T = gsl_rng_ranlxd2
293
+ elif rng == 'taus':
294
+ self.T = gsl_rng_taus2
295
+ else:
296
+ raise TypeError("Not a valid random number generator")
297
+
298
+ def __dealloc__(self):
299
+ if self.r != NULL:
300
+ gsl_rng_free(self.r)
301
+ sig_free(self.vec)
302
+
303
+ def get_random_element(self):
304
+ r"""
305
+ Get a random sample from the probability distribution.
306
+
307
+ EXAMPLES::
308
+
309
+ sage: T = SphericalDistribution(seed=0)
310
+ sage: T.get_random_element() # rel tol 4e-16
311
+ (0.07961564104639995, -0.05237671627581255, 0.9954486572862178)
312
+ """
313
+ cdef int i
314
+ v = [0]*self.dimension
315
+ gsl_ran_dir_nd(self.r, self.dimension, self.vec)
316
+ for i in range(self.dimension):
317
+ v[i] = self.vec[i]
318
+ return vector(sage.rings.real_double.RDF, v) # This could be made more efficient by directly constructing the vector, TODO.
319
+
320
+ def reset_distribution(self):
321
+ r"""
322
+ This method resets the distribution.
323
+
324
+ EXAMPLES::
325
+
326
+ sage: T = SphericalDistribution(seed=0)
327
+ sage: [T.get_random_element() for _ in range(4)] # rel tol 4e-16
328
+ [(0.07961564104639995, -0.05237671627581255, 0.9954486572862178),
329
+ (0.4123599490593727, 0.5606817859360097, -0.7180495855658982),
330
+ (-0.9619860891623148, -0.2726473494040498, -0.015690351211529927),
331
+ (0.5674297579435619, -0.011206783800420301, -0.8233455397322326)]
332
+ sage: T.reset_distribution()
333
+ sage: [T.get_random_element() for _ in range(4)] # rel tol 4e-16
334
+ [(0.07961564104639995, -0.05237671627581255, 0.9954486572862178),
335
+ (0.4123599490593727, 0.5606817859360097, -0.7180495855658982),
336
+ (-0.9619860891623148, -0.2726473494040498, -0.015690351211529927),
337
+ (0.5674297579435619, -0.011206783800420301, -0.8233455397322326)]
338
+ """
339
+ if self.r != NULL:
340
+ gsl_rng_free(self.r)
341
+ self.r = gsl_rng_alloc(self.T)
342
+ self.set_seed(self.seed)
343
+ # gsl_rng_env_setup()
344
+
345
+ cdef class RealDistribution(ProbabilityDistribution):
346
+ r"""
347
+ The :class:`RealDistribution` class provides a number of routines for sampling
348
+ from and analyzing and visualizing probability distributions.
349
+ For precise definitions of the distributions and their parameters
350
+ see the gsl reference manuals chapter on random number generators
351
+ and probability distributions.
352
+
353
+ EXAMPLES:
354
+
355
+ Uniform distribution on the interval ``[a, b]``::
356
+
357
+ sage: a = 0
358
+ sage: b = 2
359
+ sage: T = RealDistribution('uniform', [a, b])
360
+ sage: a <= T.get_random_element() <= b
361
+ True
362
+ sage: T.distribution_function(0)
363
+ 0.5
364
+ sage: T.cum_distribution_function(1)
365
+ 0.5
366
+ sage: T.cum_distribution_function_inv(.5)
367
+ 1.0
368
+
369
+ The gaussian distribution takes 1 parameter ``sigma``. The standard
370
+ gaussian distribution has ``sigma = 1``::
371
+
372
+ sage: sigma = 1
373
+ sage: T = RealDistribution('gaussian', sigma)
374
+ sage: s = T.get_random_element()
375
+ sage: s.parent()
376
+ Real Double Field
377
+ sage: T.distribution_function(0)
378
+ 0.3989422804014327
379
+ sage: T.cum_distribution_function(1)
380
+ 0.8413447460685429
381
+ sage: T.cum_distribution_function_inv(.5)
382
+ 0.0
383
+
384
+ The rayleigh distribution has 1 parameter ``sigma``::
385
+
386
+ sage: sigma = 3
387
+ sage: T = RealDistribution('rayleigh', sigma)
388
+ sage: s = T.get_random_element()
389
+ sage: s >= 0
390
+ True
391
+ sage: s.parent()
392
+ Real Double Field
393
+ sage: T.distribution_function(0)
394
+ 0.0
395
+ sage: T.cum_distribution_function(1)
396
+ 0.054040531093234534
397
+ sage: T.cum_distribution_function_inv(.5)
398
+ 3.532230067546424...
399
+
400
+ The lognormal distribution has two parameters ``sigma``
401
+ and ``zeta``::
402
+
403
+ sage: zeta = 0
404
+ sage: sigma = 1
405
+ sage: T = RealDistribution('lognormal', [zeta, sigma])
406
+ sage: s = T.get_random_element()
407
+ sage: s >= 0
408
+ True
409
+ sage: s.parent()
410
+ Real Double Field
411
+ sage: T.distribution_function(0)
412
+ 0.0
413
+ sage: T.cum_distribution_function(1)
414
+ 0.5
415
+ sage: T.cum_distribution_function_inv(.5)
416
+ 1.0
417
+
418
+ The pareto distribution has two parameters ``a``, and ``b``::
419
+
420
+ sage: a = 1
421
+ sage: b = 1
422
+ sage: T = RealDistribution('pareto', [a, b])
423
+ sage: s = T.get_random_element()
424
+ sage: s >= b
425
+ True
426
+ sage: s.parent()
427
+ Real Double Field
428
+ sage: T.distribution_function(0)
429
+ 0.0
430
+ sage: T.cum_distribution_function(1)
431
+ 0.0
432
+ sage: T.cum_distribution_function_inv(.5)
433
+ 2.0
434
+
435
+ The t-distribution has one parameter ``nu``::
436
+
437
+ sage: nu = 1
438
+ sage: T = RealDistribution('t', nu)
439
+ sage: s = T.get_random_element()
440
+ sage: s.parent()
441
+ Real Double Field
442
+ sage: T.distribution_function(0) # rel tol 1e-15
443
+ 0.3183098861837906
444
+ sage: T.cum_distribution_function(1) # rel tol 1e-15
445
+ 0.75
446
+ sage: T.cum_distribution_function_inv(.5)
447
+ 0.0
448
+
449
+ The F-distribution has two parameters ``nu1`` and ``nu2``::
450
+
451
+ sage: nu1 = 9; nu2 = 17
452
+ sage: F = RealDistribution('F', [nu1,nu2])
453
+ sage: s = F.get_random_element()
454
+ sage: s >= 0
455
+ True
456
+ sage: s.parent()
457
+ Real Double Field
458
+ sage: F.distribution_function(1) # rel tol 1e-14
459
+ 0.6695025505192798
460
+ sage: F.cum_distribution_function(3.68) # rel tol 1e-14
461
+ 0.9899717772300652
462
+ sage: F.cum_distribution_function_inv(0.99) # rel tol 1e-14
463
+ 3.682241524045864
464
+
465
+ The chi-squared distribution has one parameter ``nu``::
466
+
467
+ sage: nu = 1
468
+ sage: T = RealDistribution('chisquared', nu)
469
+ sage: s = T.get_random_element()
470
+ sage: s >= 0
471
+ True
472
+ sage: s.parent()
473
+ Real Double Field
474
+ sage: T.distribution_function(0)
475
+ +infinity
476
+ sage: T.cum_distribution_function(1) # rel tol 1e-14
477
+ 0.6826894921370856
478
+ sage: T.cum_distribution_function_inv(.5) # rel tol 1e-14
479
+ 0.45493642311957305
480
+
481
+ The exponential power distribution has two parameters ``a`` and
482
+ ``b``::
483
+
484
+ sage: a = 1
485
+ sage: b = 2.5
486
+ sage: T = RealDistribution('exppow', [a, b])
487
+ sage: s = T.get_random_element()
488
+ sage: s.parent()
489
+ Real Double Field
490
+ sage: T.distribution_function(0) # rel tol 1e-14
491
+ 0.5635302489930136
492
+ sage: T.cum_distribution_function(1) # rel tol 1e-14
493
+ 0.940263052542855
494
+
495
+ The beta distribution has two parameters ``a`` and ``b``::
496
+
497
+ sage: a = 2
498
+ sage: b = 2
499
+ sage: T = RealDistribution('beta', [a, b])
500
+ sage: s = T.get_random_element()
501
+ sage: 0 <= s <= 1
502
+ True
503
+ sage: s.parent()
504
+ Real Double Field
505
+ sage: T.distribution_function(0)
506
+ 0.0
507
+ sage: T.cum_distribution_function(1)
508
+ 1.0
509
+
510
+ The exponential distribution has one parameter ``mu``::
511
+
512
+ sage: mu = 2
513
+ sage: T = RealDistribution('exponential', mu)
514
+ sage: s = T.get_random_element()
515
+ sage: 0 <= s
516
+ True
517
+ sage: s.parent()
518
+ Real Double Field
519
+ sage: T.distribution_function(0)
520
+ 0.5
521
+
522
+ The gamma distribution has two parameters ``a`` and ``b``::
523
+
524
+ sage: a = 2
525
+ sage: b = 2
526
+ sage: T = RealDistribution('gamma', [a, b])
527
+ sage: s = T.get_random_element()
528
+ sage: 0 <= s
529
+ True
530
+ sage: s.parent()
531
+ Real Double Field
532
+ sage: T.distribution_function(0)
533
+ 0.0
534
+
535
+ The weibull distribution has two parameters ``a`` and ``b``::
536
+
537
+ sage: a = 1
538
+ sage: b = 1
539
+ sage: T = RealDistribution('weibull', [a, b])
540
+ sage: s = T.get_random_element()
541
+ sage: s >= 0
542
+ True
543
+ sage: s.parent()
544
+ Real Double Field
545
+ sage: T.distribution_function(0)
546
+ 1.0
547
+ sage: T.cum_distribution_function(1)
548
+ 0.6321205588285577
549
+ sage: T.cum_distribution_function_inv(.5)
550
+ 0.6931471805599453
551
+
552
+ It is possible to select which random number generator drives the
553
+ sampling as well as the seed. The default is the Mersenne
554
+ twister. Also available are the RANDLXS algorithm and the
555
+ Tausworthe generator (see the gsl reference manual for more
556
+ details). These are all supposed to be simulation quality
557
+ generators. For RANDLXS use ``rng='luxury'`` and for
558
+ tausworth use ``rng='taus'``::
559
+
560
+ sage: T = RealDistribution('gaussian', 1, rng='luxury', seed=10)
561
+
562
+ To change the seed at a later time use ``set_seed``::
563
+
564
+ sage: T.set_seed(100)
565
+
566
+ TESTS:
567
+
568
+ Make sure that repeated initializations are randomly seeded
569
+ (:issue:`9770`)::
570
+
571
+ sage: Xs = [RealDistribution('gaussian', 1).get_random_element() for _ in range(1000)]
572
+ sage: len(set(Xs)) > 2^^32
573
+ True
574
+ """
575
+ cdef gsl_rng_type *T
576
+ cdef gsl_rng *r
577
+ cdef int distribution_type
578
+ cdef double* parameters
579
+ cdef long int seed
580
+ cdef object name
581
+ # cdef double (*generator_1)(gsl_rng*)
582
+ # cdef double (*generator_2)(gsl_rng*, double)
583
+ # cdef _get_random_element_c(self)
584
+
585
+ def __init__(self, type='uniform', parameters=None,
586
+ rng='default', seed=None):
587
+ r"""
588
+ EXAMPLES::
589
+
590
+ sage: T = RealDistribution('gaussian', 1, seed=0)
591
+ sage: T.get_random_element() # rel tol 4e-16
592
+ 0.13391860811867587
593
+
594
+ TESTS:
595
+
596
+ Until :issue:`15089` a value of the ``seed`` keyword
597
+ besides ``None`` was ignored. We check here that setting
598
+ a seed is effective. ::
599
+
600
+ sage: T = RealDistribution("beta",[1.6,4.3], seed=876)
601
+ sage: one = [T.get_random_element() for _ in range(10)]
602
+ sage: T = RealDistribution("beta",[1.6,4.3], seed=876)
603
+ sage: two = [T.get_random_element() for _ in range(10)]
604
+ sage: T = RealDistribution("beta",[1.6,4.3], seed=123)
605
+ sage: three = [T.get_random_element() for _ in range(10)]
606
+ sage: one == two
607
+ True
608
+ sage: one == three
609
+ False
610
+ """
611
+ gsl_rng_env_setup()
612
+ self.parameters = NULL
613
+ self.set_random_number_generator(rng)
614
+ self.r = gsl_rng_alloc(self.T)
615
+ if seed is None:
616
+ seed = random.randint(1, 2**31)
617
+ self.set_seed(seed)
618
+ self.name = " "
619
+ self.set_distribution(type, parameters)
620
+
621
+ def set_seed(self, seed):
622
+ r"""
623
+ Set the seed for the underlying random number generator.
624
+
625
+ EXAMPLES::
626
+
627
+ sage: T = RealDistribution('gaussian', 1, rng='luxury', seed=10)
628
+ sage: T.set_seed(100)
629
+ """
630
+
631
+ gsl_rng_set(self.r, seed)
632
+ self.seed = seed
633
+
634
+ def set_random_number_generator(self, rng='default'):
635
+ r"""
636
+ Set the gsl random number generator to be one of ``'default'``,
637
+ ``'luxury'``, or ``'taus'``.
638
+
639
+ EXAMPLES::
640
+
641
+ sage: T = SphericalDistribution()
642
+ sage: T.set_random_number_generator('default')
643
+ sage: T.set_seed(0)
644
+ sage: T.get_random_element() # rel tol 4e-16
645
+ (0.07961564104639995, -0.05237671627581255, 0.9954486572862178)
646
+ sage: T.set_random_number_generator('luxury')
647
+ sage: T.set_seed(0)
648
+ sage: T.get_random_element() # rel tol 4e-16
649
+ (0.07961564104639995, -0.05237671627581255, 0.9954486572862178)
650
+ """
651
+ if rng == 'default':
652
+ self.T = gsl_rng_default
653
+ elif rng == 'luxury':
654
+ self.T = gsl_rng_ranlxd2
655
+ elif rng == 'taus':
656
+ self.T = gsl_rng_taus2
657
+ else:
658
+ raise TypeError("Not a valid random number generator")
659
+
660
+ def __dealloc__(self):
661
+ if self.r != NULL:
662
+ gsl_rng_free(self.r)
663
+ sig_free(self.parameters)
664
+
665
+ def __str__(self):
666
+ r"""
667
+ Return the name of the current distribution.
668
+
669
+ EXAMPLES::
670
+
671
+ sage: T = RealDistribution('gaussian', 1)
672
+ sage: str(T)
673
+ 'gaussian'
674
+ sage: T = RealDistribution('beta', [2, 2])
675
+ sage: str(T)
676
+ 'beta'
677
+ """
678
+ return self.name
679
+
680
+ def get_random_element(self):
681
+ r"""
682
+ Get a random sample from the probability distribution.
683
+
684
+ EXAMPLES::
685
+
686
+ sage: T = RealDistribution('gaussian', 1, seed=0)
687
+ sage: T.get_random_element() # rel tol 4e-16
688
+ 0.13391860811867587
689
+ """
690
+ cdef double result
691
+ if self.distribution_type == uniform:
692
+ result = gsl_ran_flat(self.r, self.parameters[0], self.parameters[1])
693
+ # result = gsl_rng_uniform(self.r)
694
+ elif self.distribution_type == gaussian:
695
+ result = gsl_ran_gaussian(self.r, self.parameters[0])
696
+ elif self.distribution_type == rayleigh:
697
+ result = gsl_ran_rayleigh(self.r, self.parameters[0])
698
+ elif self.distribution_type == lognormal:
699
+ result = gsl_ran_lognormal(self.r, self.parameters[0], self.parameters[1])
700
+ elif self.distribution_type == pareto:
701
+ result = gsl_ran_pareto(self.r, self.parameters[0], self.parameters[1])
702
+ elif self.distribution_type == t:
703
+ result = gsl_ran_tdist(self.r, self.parameters[0])
704
+ elif self.distribution_type == F:
705
+ result = gsl_ran_fdist(self.r, self.parameters[0], self.parameters[1])
706
+ elif self.distribution_type == chisquared:
707
+ result = gsl_ran_chisq(self.r, self.parameters[0])
708
+ elif self.distribution_type == exppow:
709
+ result = gsl_ran_exppow(self.r, self.parameters[0], self.parameters[1])
710
+ elif self.distribution_type == weibull:
711
+ result = gsl_ran_weibull(self.r, self.parameters[0], self.parameters[1])
712
+ elif self.distribution_type == beta:
713
+ result = gsl_ran_beta(self.r, self.parameters[0], self.parameters[1])
714
+ elif self.distribution_type == exponential:
715
+ result = gsl_ran_exponential(self.r, self.parameters[0])
716
+ elif self.distribution_type == gamma:
717
+ result = gsl_ran_gamma(self.r, self.parameters[0], self.parameters[1])
718
+ else:
719
+ raise TypeError("Not a supported probability distribution")
720
+
721
+ return sage.rings.real_double.RDF(result)
722
+
723
+ def set_distribution(self, name='uniform', parameters=None):
724
+ r"""
725
+ This method can be called to change the current probability distribution.
726
+
727
+ EXAMPLES::
728
+
729
+ sage: T = RealDistribution('gaussian', 1)
730
+ sage: T.set_distribution('gaussian', 1)
731
+ sage: T.set_distribution('pareto', [0, 1])
732
+ """
733
+ sig_free(self.parameters)
734
+
735
+ if parameters is None:
736
+ parameters = []
737
+
738
+ if name == 'uniform':
739
+ self.distribution_type = uniform
740
+ for x in parameters:
741
+ try:
742
+ float(x)
743
+ except Exception:
744
+ raise TypeError("Uniform distribution requires parameters coercible to float")
745
+ self.parameters = <double*>sig_malloc(sizeof(double)*2)
746
+ self.parameters[0] = parameters[0]
747
+ self.parameters[1] = parameters[1]
748
+ elif name == 'gaussian':
749
+ try:
750
+ float(parameters)
751
+ except Exception:
752
+ raise TypeError("gaussian distribution requires parameter sigma coercible to float")
753
+ self.parameters = <double*>sig_malloc(sizeof(double))
754
+ self.parameters[0] = float(parameters)
755
+ self.distribution_type = gaussian
756
+ elif name == 'pareto':
757
+ if len(parameters) != 2:
758
+ raise TypeError("pareto distribution has two parameters")
759
+ try:
760
+ map(float, parameters)
761
+ except Exception:
762
+ raise TypeError("parameters must be coercible to float")
763
+ self.parameters = <double*>sig_malloc(sizeof(double)*2)
764
+ self.parameters[0] = float(parameters[0])
765
+ self.parameters[1] = float(parameters[1])
766
+ self.distribution_type = pareto
767
+ elif name == 'rayleigh':
768
+ try:
769
+ float(parameters)
770
+ except Exception:
771
+ raise TypeError("rayleigh distribution requires parameter sigma coercible to float")
772
+ self.parameters = <double*>sig_malloc(sizeof(double))
773
+ self.parameters[0] = float(parameters)
774
+ self.distribution_type = rayleigh
775
+ elif name == 'lognormal':
776
+ if len(parameters) != 2:
777
+ raise TypeError("Lognormal distribution requires two parameters")
778
+ for x in parameters:
779
+ try:
780
+ float(x)
781
+ except Exception:
782
+ raise TypeError("Lognormal distribution requires real parameters")
783
+ self.parameters = <double*>sig_malloc(sizeof(double)*2)
784
+ self.parameters[0] = float(parameters[0])
785
+ self.parameters[1] = float(parameters[1])
786
+ self.distribution_type = lognormal
787
+ elif name == 't':
788
+ try:
789
+ float(parameters)
790
+ except Exception:
791
+ raise TypeError("parameter to t distribution must be coercible to float")
792
+ self.parameters = <double*>sig_malloc(sizeof(double))
793
+ self.parameters[0] = float(parameters)
794
+ self.distribution_type = t
795
+ elif name == 'F':
796
+ if len(parameters) != 2:
797
+ raise TypeError("F-distribution requires two real parameters")
798
+ try:
799
+ map(float, parameters)
800
+ except Exception:
801
+ raise TypeError("F-distribution requires real parameters")
802
+ self.parameters = <double *>sig_malloc(sizeof(double)*2)
803
+ self.parameters[0] = float(parameters[0])
804
+ self.parameters[1] = float(parameters[1])
805
+ self.distribution_type = F
806
+ elif name == 'chisquared':
807
+ try:
808
+ float(parameters)
809
+ except Exception:
810
+ raise TypeError("parameters to t distribution must be coercible to float")
811
+ self.parameters = <double *>sig_malloc(sizeof(double))
812
+ self.parameters[0] = float(parameters)
813
+ self.distribution_type = chisquared
814
+ elif name == 'exppow':
815
+ if len(parameters) != 2:
816
+ raise TypeError("exponential power distribution requires two parameters")
817
+ for x in parameters:
818
+ try:
819
+ float(x)
820
+ except Exception:
821
+ raise TypeError("exponential power distribution requires real parameters")
822
+ self.parameters = <double*>sig_malloc(sizeof(double)*2)
823
+ self.parameters[0] = float(parameters[0])
824
+ self.parameters[1] = float(parameters[1])
825
+ self.distribution_type = exppow
826
+ elif name == 'weibull':
827
+ if len(parameters) != 2:
828
+ raise TypeError("weibull distribution requires two real parameters")
829
+ try:
830
+ map(float, parameters)
831
+ except Exception:
832
+ raise TypeError("weibull distribution requires real parameters")
833
+ self.parameters = <double *>sig_malloc(sizeof(double)*2)
834
+ self.parameters[0] = float(parameters[0])
835
+ self.parameters[1] = float(parameters[1])
836
+ self.distribution_type = weibull
837
+ elif name == 'beta':
838
+ if len(parameters) != 2:
839
+ raise TypeError("beta distribution requires two real parameters")
840
+ try:
841
+ map(float, parameters)
842
+ except Exception:
843
+ raise TypeError("beta distribution requires real parameters")
844
+ self.parameters = <double *>sig_malloc(sizeof(double)*2)
845
+ self.parameters[0] = float(parameters[0])
846
+ self.parameters[1] = float(parameters[1])
847
+ self.distribution_type = beta
848
+ elif name == 'exponential':
849
+ try:
850
+ float(parameters)
851
+ except Exception:
852
+ raise TypeError("exponential distribution requires parameter mu coercible to float")
853
+ self.parameters = <double*>sig_malloc(sizeof(double))
854
+ self.parameters[0] = float(parameters)
855
+ self.distribution_type = exponential
856
+ elif name == 'gamma':
857
+ if len(parameters) != 2:
858
+ raise TypeError("gamma distribution requires two real parameters")
859
+ try:
860
+ map(float, parameters)
861
+ except Exception:
862
+ raise TypeError("gamma distribution requires real parameters")
863
+ self.parameters = <double *>sig_malloc(sizeof(double)*2)
864
+ self.parameters[0] = float(parameters[0])
865
+ self.parameters[1] = float(parameters[1])
866
+ self.distribution_type = gamma
867
+ else:
868
+ raise TypeError("Not a supported probability distribution")
869
+
870
+ self.name = name
871
+
872
+ # def _get_random_element_c():
873
+
874
+ def reset_distribution(self):
875
+ r"""
876
+ Reset the distribution.
877
+
878
+ EXAMPLES::
879
+
880
+ sage: T = RealDistribution('gaussian', 1, seed=10)
881
+ sage: [T.get_random_element() for _ in range(10)] # rel tol 4e-16
882
+ [-0.7460999595745819, -0.004644606626413462, -0.8720538317207641, 0.6916259921666037, 2.67668674666043, 0.6325002813661014, -0.7974263521959355, -0.5284976893366636, 1.1353119849528792, 0.9912505673230749]
883
+ sage: T.reset_distribution()
884
+ sage: [T.get_random_element() for _ in range(10)] # rel tol 4e-16
885
+ [-0.7460999595745819, -0.004644606626413462, -0.8720538317207641, 0.6916259921666037, 2.67668674666043, 0.6325002813661014, -0.7974263521959355, -0.5284976893366636, 1.1353119849528792, 0.9912505673230749]
886
+ """
887
+ if self.r != NULL:
888
+ gsl_rng_free(self.r)
889
+ self.r = gsl_rng_alloc(self.T)
890
+ self.set_seed(self.seed)
891
+ # gsl_rng_env_setup()
892
+
893
+ def distribution_function(self, x):
894
+ r"""
895
+ Evaluate the distribution function of the
896
+ probability distribution at ``x``.
897
+
898
+ EXAMPLES::
899
+
900
+ sage: T = RealDistribution('uniform', [0, 2])
901
+ sage: T.distribution_function(0)
902
+ 0.5
903
+ sage: T.distribution_function(1)
904
+ 0.5
905
+ sage: T.distribution_function(1.5)
906
+ 0.5
907
+ sage: T.distribution_function(2)
908
+ 0.0
909
+ """
910
+ if self.distribution_type == uniform:
911
+ return sage.rings.real_double.RDF(gsl_ran_flat_pdf(x, self.parameters[0], self.parameters[1]))
912
+ elif self.distribution_type == gaussian:
913
+ return sage.rings.real_double.RDF(gsl_ran_gaussian_pdf(x, self.parameters[0]))
914
+ elif self.distribution_type == rayleigh:
915
+ return sage.rings.real_double.RDF(gsl_ran_rayleigh_pdf(x, self.parameters[0]))
916
+ elif self.distribution_type == lognormal:
917
+ return sage.rings.real_double.RDF(gsl_ran_lognormal_pdf(x, self.parameters[0], self.parameters[1]))
918
+ elif self.distribution_type == pareto:
919
+ return sage.rings.real_double.RDF(gsl_ran_pareto_pdf(x, self.parameters[0], self.parameters[1]))
920
+ elif self.distribution_type == t:
921
+ return sage.rings.real_double.RDF(gsl_ran_tdist_pdf(x, self.parameters[0]))
922
+ elif self.distribution_type == F:
923
+ return sage.rings.real_double.RDF(gsl_ran_fdist_pdf(x, self.parameters[0], self.parameters[1]))
924
+ elif self.distribution_type == chisquared:
925
+ return sage.rings.real_double.RDF(gsl_ran_chisq_pdf(x, self.parameters[0]))
926
+ elif self.distribution_type == exppow:
927
+ return sage.rings.real_double.RDF(gsl_ran_exppow_pdf(x, self.parameters[0], self.parameters[1]))
928
+ elif self.distribution_type == weibull:
929
+ return sage.rings.real_double.RDF(gsl_ran_weibull_pdf(x, self.parameters[0], self.parameters[1]))
930
+ elif self.distribution_type == beta:
931
+ return sage.rings.real_double.RDF(gsl_ran_beta_pdf(x, self.parameters[0], self.parameters[1]))
932
+ elif self.distribution_type == exponential:
933
+ return sage.rings.real_double.RDF(gsl_ran_exponential_pdf(x, self.parameters[0]))
934
+ elif self.distribution_type == gamma:
935
+ return sage.rings.real_double.RDF(gsl_ran_gamma_pdf(x, self.parameters[0], self.parameters[1]))
936
+ else:
937
+ raise TypeError("Not a supported probability distribution")
938
+
939
+ def cum_distribution_function(self, x):
940
+ r"""
941
+ Evaluate the cumulative distribution function of
942
+ the probability distribution at ``x``.
943
+
944
+ EXAMPLES::
945
+
946
+ sage: T = RealDistribution('uniform', [0, 2])
947
+ sage: T.cum_distribution_function(1)
948
+ 0.5
949
+ """
950
+ if self.distribution_type == uniform:
951
+ return sage.rings.real_double.RDF(gsl_cdf_flat_P(x, self.parameters[0], self.parameters[1]))
952
+ elif self.distribution_type == gaussian:
953
+ return sage.rings.real_double.RDF(gsl_cdf_gaussian_P(x, self.parameters[0]))
954
+ elif self.distribution_type == rayleigh:
955
+ return sage.rings.real_double.RDF(gsl_cdf_rayleigh_P(x, self.parameters[0]))
956
+ elif self.distribution_type == lognormal:
957
+ return sage.rings.real_double.RDF(gsl_cdf_lognormal_P(x, self.parameters[0], self.parameters[1]))
958
+ elif self.distribution_type == pareto:
959
+ return sage.rings.real_double.RDF(gsl_cdf_pareto_P(x, self.parameters[0], self.parameters[1]))
960
+ elif self.distribution_type == t:
961
+ return sage.rings.real_double.RDF(gsl_cdf_tdist_P(x, self.parameters[0]))
962
+ elif self.distribution_type == F:
963
+ return sage.rings.real_double.RDF(gsl_cdf_fdist_P(x, self.parameters[0], self.parameters[1]))
964
+ elif self.distribution_type == chisquared:
965
+ return sage.rings.real_double.RDF(gsl_cdf_chisq_P(x, self.parameters[0]))
966
+ elif self.distribution_type == exppow:
967
+ return sage.rings.real_double.RDF(gsl_cdf_exppow_P(x, self.parameters[0], self.parameters[1]))
968
+ elif self.distribution_type == weibull:
969
+ return sage.rings.real_double.RDF(gsl_cdf_weibull_P(x, self.parameters[0], self.parameters[1]))
970
+ elif self.distribution_type == beta:
971
+ return sage.rings.real_double.RDF(gsl_cdf_beta_P(x, self.parameters[0], self.parameters[1]))
972
+ elif self.distribution_type == exponential:
973
+ return sage.rings.real_double.RDF(gsl_cdf_exponential_P(x, self.parameters[0]))
974
+ elif self.distribution_type == gamma:
975
+ return sage.rings.real_double.RDF(gsl_cdf_gamma_P(x, self.parameters[0], self.parameters[1]))
976
+ else:
977
+ raise TypeError("Not a supported probability distribution")
978
+
979
+ def cum_distribution_function_inv(self, x):
980
+ r"""
981
+ Evaluate the inverse of the cumulative distribution
982
+ distribution function of the probability distribution at ``x``.
983
+
984
+ EXAMPLES::
985
+
986
+ sage: T = RealDistribution('uniform', [0, 2])
987
+ sage: T.cum_distribution_function_inv(.5)
988
+ 1.0
989
+ """
990
+ if self.distribution_type == uniform:
991
+ return sage.rings.real_double.RDF(gsl_cdf_flat_Pinv(x, self.parameters[0], self.parameters[1]))
992
+ elif self.distribution_type == gaussian:
993
+ return sage.rings.real_double.RDF(gsl_cdf_gaussian_Pinv(x, self.parameters[0]))
994
+ elif self.distribution_type == rayleigh:
995
+ return sage.rings.real_double.RDF(gsl_cdf_rayleigh_Pinv(x, self.parameters[0]))
996
+ elif self.distribution_type == lognormal:
997
+ return sage.rings.real_double.RDF(gsl_cdf_lognormal_Pinv(x, self.parameters[0], self.parameters[1]))
998
+ elif self.distribution_type == pareto:
999
+ return sage.rings.real_double.RDF(gsl_cdf_pareto_Pinv(x, self.parameters[0], self.parameters[1]))
1000
+ elif self.distribution_type == t:
1001
+ return sage.rings.real_double.RDF(gsl_cdf_tdist_Pinv(x, self.parameters[0]))
1002
+ elif self.distribution_type == F:
1003
+ return sage.rings.real_double.RDF(gsl_cdf_fdist_Pinv(x, self.parameters[0], self.parameters[1]))
1004
+ elif self.distribution_type == chisquared:
1005
+ return sage.rings.real_double.RDF(gsl_cdf_chisq_Pinv(x, self.parameters[0]))
1006
+ elif self.distribution_type == exppow:
1007
+ raise NotImplementedError("gsl does not provide inverse for exponential power")
1008
+ # return sage.rings.real_double.RDF(gsl_cdf_exppow_Pinv(x, self.parameters[0], self.parameters[1]))
1009
+ elif self.distribution_type == weibull:
1010
+ return sage.rings.real_double.RDF(gsl_cdf_weibull_Pinv(x, self.parameters[0], self.parameters[1]))
1011
+ elif self.distribution_type == beta:
1012
+ return sage.rings.real_double.RDF(gsl_cdf_beta_Pinv(x, self.parameters[0], self.parameters[1]))
1013
+ elif self.distribution_type == exponential:
1014
+ return sage.rings.real_double.RDF(gsl_cdf_exponential_Pinv(x, self.parameters[0]))
1015
+ elif self.distribution_type == gamma:
1016
+ return sage.rings.real_double.RDF(gsl_cdf_gamma_Pinv(x, self.parameters[0], self.parameters[1]))
1017
+ else:
1018
+ raise TypeError("Not a supported probability distribution")
1019
+
1020
+ def plot(self, *args, **kwds):
1021
+ r"""
1022
+ Plot the distribution function for the probability
1023
+ distribution. Parameters to :func:`sage.plot.plot.plot` can be
1024
+ passed through ``*args`` and ``**kwds``.
1025
+
1026
+ EXAMPLES::
1027
+
1028
+ sage: T = RealDistribution('uniform', [0, 2])
1029
+ sage: P = T.plot() # needs sage.plot
1030
+ """
1031
+ from sage.plot.plot import plot
1032
+ return plot(self.distribution_function, *args, **kwds)
1033
+
1034
+
1035
+ cdef class GeneralDiscreteDistribution(ProbabilityDistribution):
1036
+ r"""
1037
+ Create a discrete probability distribution.
1038
+
1039
+ INPUT:
1040
+
1041
+ - ``P`` -- list of probabilities; the list will automatically be
1042
+ normalised if ``sum(P)`` is not equal to 1
1043
+
1044
+ - ``rng`` -- (optional) random number generator to use; may be
1045
+ one of ``'default'``, ``'luxury'``, or ``'taus'``
1046
+
1047
+ - ``seed`` -- (optional) seed to use with the random number
1048
+ generator
1049
+
1050
+ OUTPUT: a probability distribution where the probability of selecting
1051
+ ``x`` is ``P[x]``.
1052
+
1053
+ EXAMPLES:
1054
+
1055
+ Construct a ``GeneralDiscreteDistribution`` with the probability
1056
+ distribution `P` where `P(0) = 0.3`, `P(1) = 0.4`, `P(2) = 0.3`::
1057
+
1058
+ sage: P = [0.3, 0.4, 0.3]
1059
+ sage: X = GeneralDiscreteDistribution(P)
1060
+ sage: X.get_random_element() in (0, 1, 2)
1061
+ True
1062
+
1063
+ Checking the distribution of samples::
1064
+
1065
+ sage: P = [0.3, 0.4, 0.3]
1066
+ sage: counts = [0] * len(P)
1067
+ sage: X = GeneralDiscreteDistribution(P)
1068
+ sage: nr_samples = 10000
1069
+ sage: for _ in range(nr_samples):
1070
+ ....: counts[X.get_random_element()] += 1
1071
+ sage: [1.0*x/nr_samples for x in counts] # abs tol 3e-2
1072
+ [0.3, 0.4, 0.3]
1073
+
1074
+ The distribution probabilities will automatically be normalised::
1075
+
1076
+ sage: P = [0.1, 0.3]
1077
+ sage: X = GeneralDiscreteDistribution(P, seed=0)
1078
+ sage: counts = [0, 0]
1079
+ sage: for _ in range(10000):
1080
+ ....: counts[X.get_random_element()] += 1
1081
+ sage: float(counts[1]/counts[0])
1082
+ 3.042037186742118
1083
+
1084
+ TESTS:
1085
+
1086
+ Make sure that repeated initializations are randomly seeded
1087
+ (:issue:`9770`)::
1088
+
1089
+ sage: P = [0.001] * 1000
1090
+ sage: Xs = [GeneralDiscreteDistribution(P).get_random_element() for _ in range(1000)]
1091
+ sage: len(set(Xs)) > 2^^32
1092
+ True
1093
+
1094
+ The distribution probabilities must be nonnegative::
1095
+
1096
+ sage: GeneralDiscreteDistribution([0.1, -0.1])
1097
+ Traceback (most recent call last):
1098
+ ...
1099
+ ValueError: The distribution probabilities must be nonnegative
1100
+ """
1101
+ cdef gsl_rng_type * T
1102
+ cdef gsl_rng * r
1103
+ cdef gsl_ran_discrete_t *dist
1104
+ cdef long seed
1105
+
1106
+ def __init__(self, P, rng='default', seed=None):
1107
+ r"""
1108
+ Given a list of probabilities P construct an instance of a gsl
1109
+ discrete random variable generator.
1110
+
1111
+ EXAMPLES::
1112
+
1113
+ sage: P = [0.3, 0.4, 0.3]
1114
+ sage: X = GeneralDiscreteDistribution(P)
1115
+ sage: assert X.get_random_element() in range(len(P))
1116
+
1117
+ TESTS:
1118
+
1119
+ Until :issue:`15089` a value of the ``seed`` keyword
1120
+ besides ``None`` was ignored. We check here that setting
1121
+ a seed is effective. ::
1122
+
1123
+ sage: P = [0.2, 0.3, 0.1, 0.4]
1124
+ sage: T = GeneralDiscreteDistribution(P, seed=876)
1125
+ sage: one = [T.get_random_element() for _ in range(50)]
1126
+ sage: T = GeneralDiscreteDistribution(P, seed=876)
1127
+ sage: two = [T.get_random_element() for _ in range(50)]
1128
+ sage: T = GeneralDiscreteDistribution(P, seed=123)
1129
+ sage: three = [T.get_random_element() for _ in range(50)]
1130
+ sage: one == two
1131
+ True
1132
+ sage: one == three
1133
+ False
1134
+
1135
+ Testing that :issue:`24416` is fixed for when entries are larger
1136
+ than `2^{1024}`::
1137
+
1138
+ sage: from collections import Counter
1139
+ sage: X = GeneralDiscreteDistribution([1,2,2^1024])
1140
+ sage: Counter(X.get_random_element() for _ in range(100))
1141
+ Counter({2: 100})
1142
+ """
1143
+ gsl_rng_env_setup()
1144
+ self.set_random_number_generator(rng)
1145
+ self.r = gsl_rng_alloc(self.T)
1146
+ if seed is None:
1147
+ seed = random.randint(1, 2**31)
1148
+ self.set_seed(seed)
1149
+
1150
+ cdef int n
1151
+ n = len(P)
1152
+
1153
+ s = sum(P)
1154
+ if s != 1:
1155
+ P = [p/s for p in P]
1156
+
1157
+ cdef double *P_vec
1158
+ P_vec = <double *> sig_malloc(n*(sizeof(double)))
1159
+
1160
+ cdef int i
1161
+ for i in range(n):
1162
+ if P[i] < 0:
1163
+ raise ValueError("The distribution probabilities must "
1164
+ "be nonnegative")
1165
+ P_vec[i] = P[i]
1166
+
1167
+ self.dist = gsl_ran_discrete_preproc(n, P_vec)
1168
+
1169
+ sig_free(P_vec)
1170
+
1171
+ def set_seed(self, seed):
1172
+ r"""
1173
+ Set the seed to be used by the random number generator.
1174
+
1175
+ EXAMPLES::
1176
+
1177
+ sage: X = GeneralDiscreteDistribution([0.3, 0.4, 0.3])
1178
+ sage: X.set_seed(1)
1179
+ sage: X.get_random_element()
1180
+ 1
1181
+ """
1182
+ gsl_rng_set(self.r, seed)
1183
+ self.seed = seed
1184
+
1185
+ def set_random_number_generator(self, rng='default'):
1186
+ r"""
1187
+ Set the random number generator to be used by gsl.
1188
+
1189
+ EXAMPLES::
1190
+
1191
+ sage: X = GeneralDiscreteDistribution([0.3, 0.4, 0.3])
1192
+ sage: X.set_random_number_generator('taus')
1193
+ """
1194
+ if rng == 'default':
1195
+ self.T = gsl_rng_default
1196
+ elif rng == 'luxury':
1197
+ self.T = gsl_rng_ranlxd2
1198
+ elif rng == 'taus':
1199
+ self.T = gsl_rng_taus2
1200
+ else:
1201
+ raise TypeError("Not a valid random number generator")
1202
+
1203
+ def __dealloc__(self):
1204
+ if self.r != NULL:
1205
+ gsl_rng_free(self.r)
1206
+
1207
+ if self.dist != NULL:
1208
+ gsl_ran_discrete_free(self.dist)
1209
+
1210
+ def get_random_element(self):
1211
+ r"""
1212
+ Get a random sample from the probability distribution.
1213
+
1214
+ EXAMPLES::
1215
+
1216
+ sage: P = [0.3, 0.4, 0.3]
1217
+ sage: X = GeneralDiscreteDistribution(P)
1218
+ sage: all(X.get_random_element() in (0,1,2) for _ in range(10))
1219
+ True
1220
+ sage: isinstance(X.get_random_element(), sage.rings.integer.Integer)
1221
+ True
1222
+ """
1223
+ return sage.rings.integer.Integer(gsl_ran_discrete(self.r, self.dist))
1224
+
1225
+ def reset_distribution(self):
1226
+ r"""
1227
+ This method resets the distribution.
1228
+
1229
+ EXAMPLES::
1230
+
1231
+ sage: T = GeneralDiscreteDistribution([0.1, 0.3, 0.6])
1232
+ sage: T.set_seed(0)
1233
+ sage: [T.get_random_element() for _ in range(10)]
1234
+ [2, 2, 2, 2, 2, 1, 2, 2, 1, 2]
1235
+ sage: T.reset_distribution()
1236
+ sage: [T.get_random_element() for _ in range(10)]
1237
+ [2, 2, 2, 2, 2, 1, 2, 2, 1, 2]
1238
+ """
1239
+ if self.r != NULL:
1240
+ gsl_rng_free(self.r)
1241
+ self.r = gsl_rng_alloc(self.T)
1242
+ self.set_seed(self.seed)