passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- 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)
|