passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -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-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-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-x86_64-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-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-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-x86_64-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,1306 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
C-finite sequences
|
|
4
|
+
|
|
5
|
+
C-finite infinite sequences satisfy homogeneous linear recurrences with constant coefficients:
|
|
6
|
+
|
|
7
|
+
.. MATH::
|
|
8
|
+
|
|
9
|
+
a_{n+d} = c_0a_n + c_1a_{n+1} + \cdots + c_{d-1}a_{n+d-1}, \quad d>0.
|
|
10
|
+
|
|
11
|
+
They are completely defined by their ordinary generating function (o.g.f., which
|
|
12
|
+
is always a :mod:`fraction <sage.rings.fraction_field_element>` of
|
|
13
|
+
:mod:`polynomials <sage.rings.polynomial.polynomial_element>` over `\ZZ` or `\QQ` ).
|
|
14
|
+
|
|
15
|
+
EXAMPLES::
|
|
16
|
+
|
|
17
|
+
sage: # needs sage.symbolic
|
|
18
|
+
sage: fibo = CFiniteSequence(x/(1-x-x^2)) # the Fibonacci sequence
|
|
19
|
+
sage: fibo
|
|
20
|
+
C-finite sequence, generated by -x/(x^2 + x - 1)
|
|
21
|
+
sage: fibo.parent()
|
|
22
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
23
|
+
sage: fibo.parent().category()
|
|
24
|
+
Category of commutative rings
|
|
25
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
26
|
+
sage: fibo.parent() == C
|
|
27
|
+
True
|
|
28
|
+
sage: C
|
|
29
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
30
|
+
sage: C(x/(1-x-x^2))
|
|
31
|
+
C-finite sequence, generated by -x/(x^2 + x - 1)
|
|
32
|
+
sage: C(x/(1-x-x^2)) == fibo
|
|
33
|
+
True
|
|
34
|
+
sage: var('y')
|
|
35
|
+
y
|
|
36
|
+
sage: CFiniteSequence(y/(1-y-y^2))
|
|
37
|
+
C-finite sequence, generated by -y/(y^2 + y - 1)
|
|
38
|
+
sage: CFiniteSequence(y/(1-y-y^2)) == fibo
|
|
39
|
+
False
|
|
40
|
+
|
|
41
|
+
Finite subsets of the sequence are accessible via python slices::
|
|
42
|
+
|
|
43
|
+
sage: # needs sage.symbolic
|
|
44
|
+
sage: fibo[137] #the 137th term of the Fibonacci sequence
|
|
45
|
+
19134702400093278081449423917
|
|
46
|
+
sage: fibo[137] == fibonacci(137)
|
|
47
|
+
True
|
|
48
|
+
sage: fibo[0:12]
|
|
49
|
+
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
|
|
50
|
+
sage: fibo[14:4:-2]
|
|
51
|
+
[377, 144, 55, 21, 8]
|
|
52
|
+
|
|
53
|
+
They can be created also from the coefficients and start values of a recurrence::
|
|
54
|
+
|
|
55
|
+
sage: # needs sage.symbolic
|
|
56
|
+
sage: r = C.from_recurrence([1,1],[0,1])
|
|
57
|
+
sage: r == fibo
|
|
58
|
+
True
|
|
59
|
+
|
|
60
|
+
Given enough values, the o.g.f. of a C-finite sequence
|
|
61
|
+
can be guessed::
|
|
62
|
+
|
|
63
|
+
sage: # needs sage.symbolic
|
|
64
|
+
sage: r = C.guess([0,1,1,2,3,5,8])
|
|
65
|
+
sage: r == fibo
|
|
66
|
+
True
|
|
67
|
+
|
|
68
|
+
.. SEEALSO::
|
|
69
|
+
|
|
70
|
+
:func:`fibonacci`, :class:`BinaryRecurrenceSequence`
|
|
71
|
+
|
|
72
|
+
.. TODO::
|
|
73
|
+
|
|
74
|
+
Implement a feature enabling::
|
|
75
|
+
|
|
76
|
+
sage: # not implemented
|
|
77
|
+
sage: CFiniteSequence(x+x^2+x^3+x^4+x^5+O(x^6))
|
|
78
|
+
sage: latex(r)
|
|
79
|
+
\big\{a_{n\ge0}\big|a_{n+2}=\sum_{i=0}^{1}c_ia_{n+i}, c=\{1,1\}, a_{n<2}=\{0,0,0,1\}\big\}
|
|
80
|
+
sage: r.egf()
|
|
81
|
+
exp(2*x)
|
|
82
|
+
sage: r = CFiniteSequence(1/(1-y-x*y), x)
|
|
83
|
+
|
|
84
|
+
REFERENCES:
|
|
85
|
+
|
|
86
|
+
- [GK1982]_
|
|
87
|
+
- [KP2011]_
|
|
88
|
+
- [SZ1994]_
|
|
89
|
+
- [Zei2011]_
|
|
90
|
+
|
|
91
|
+
AUTHORS:
|
|
92
|
+
|
|
93
|
+
- Ralf Stephan (2014): initial version
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
# ****************************************************************************
|
|
97
|
+
# Copyright (C) 2014 Ralf Stephan <gtrwst9@gmail.com>
|
|
98
|
+
#
|
|
99
|
+
# This program is free software: you can redistribute it and/or modify
|
|
100
|
+
# it under the terms of the GNU General Public License as published by
|
|
101
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
102
|
+
# (at your option) any later version.
|
|
103
|
+
# https://www.gnu.org/licenses/
|
|
104
|
+
# ****************************************************************************
|
|
105
|
+
|
|
106
|
+
from numbers import Integral
|
|
107
|
+
|
|
108
|
+
from sage.categories.rings import Rings
|
|
109
|
+
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
|
|
110
|
+
from sage.misc.lazy_import import lazy_import
|
|
111
|
+
from sage.rings.integer_ring import ZZ
|
|
112
|
+
from sage.rings.rational_field import QQ
|
|
113
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
114
|
+
from sage.rings.polynomial.polynomial_ring import PolynomialRing_generic
|
|
115
|
+
from sage.rings.laurent_series_ring import LaurentSeriesRing
|
|
116
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
117
|
+
from sage.rings.fraction_field import FractionField
|
|
118
|
+
from sage.structure.element import FieldElement, parent
|
|
119
|
+
from sage.structure.parent import Parent
|
|
120
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
121
|
+
|
|
122
|
+
lazy_import('sage.libs.pari', 'pari')
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def CFiniteSequences(base_ring, names=None, category=None):
|
|
126
|
+
r"""
|
|
127
|
+
Return the commutative ring of C-Finite sequences.
|
|
128
|
+
|
|
129
|
+
The ring is defined over a base ring (`\ZZ` or `\QQ` )
|
|
130
|
+
and each element is represented by its ordinary generating function (ogf)
|
|
131
|
+
which is a rational function over the base ring.
|
|
132
|
+
|
|
133
|
+
INPUT:
|
|
134
|
+
|
|
135
|
+
- ``base_ring`` -- the base ring to construct the fraction field
|
|
136
|
+
representing the C-Finite sequences
|
|
137
|
+
- ``names`` -- (optional) the list of variables
|
|
138
|
+
|
|
139
|
+
EXAMPLES::
|
|
140
|
+
|
|
141
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
142
|
+
sage: C
|
|
143
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
144
|
+
sage: C.an_element()
|
|
145
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
146
|
+
sage: C.category()
|
|
147
|
+
Category of commutative rings
|
|
148
|
+
sage: C.one()
|
|
149
|
+
Finite sequence [1], offset = 0
|
|
150
|
+
sage: C.zero()
|
|
151
|
+
Constant infinite sequence 0.
|
|
152
|
+
sage: C(x)
|
|
153
|
+
Finite sequence [1], offset = 1
|
|
154
|
+
sage: C(1/x)
|
|
155
|
+
Finite sequence [1], offset = -1
|
|
156
|
+
sage: C((-x + 2)/(-x^2 - x + 1))
|
|
157
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
158
|
+
|
|
159
|
+
TESTS::
|
|
160
|
+
|
|
161
|
+
sage: TestSuite(C).run()
|
|
162
|
+
"""
|
|
163
|
+
if isinstance(base_ring, PolynomialRing_generic):
|
|
164
|
+
polynomial_ring = base_ring
|
|
165
|
+
base_ring = polynomial_ring.base_ring()
|
|
166
|
+
if names is None:
|
|
167
|
+
names = ['x']
|
|
168
|
+
elif len(names) > 1:
|
|
169
|
+
raise NotImplementedError("Multidimensional o.g.f. not implemented.")
|
|
170
|
+
if category is None:
|
|
171
|
+
category = Rings().Commutative()
|
|
172
|
+
if base_ring not in [QQ, ZZ]:
|
|
173
|
+
raise ValueError("O.g.f. base not rational.")
|
|
174
|
+
polynomial_ring = PolynomialRing(base_ring, names)
|
|
175
|
+
return CFiniteSequences_generic(polynomial_ring, category)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class CFiniteSequence(FieldElement,
|
|
179
|
+
metaclass=InheritComparisonClasscallMetaclass):
|
|
180
|
+
r"""
|
|
181
|
+
Create a C-finite sequence given its ordinary generating function.
|
|
182
|
+
|
|
183
|
+
INPUT:
|
|
184
|
+
|
|
185
|
+
- ``ogf`` -- a rational function, the ordinary generating function
|
|
186
|
+
(can be an element from the symbolic ring, fraction field or polynomial
|
|
187
|
+
ring)
|
|
188
|
+
|
|
189
|
+
OUTPUT: a CFiniteSequence object
|
|
190
|
+
|
|
191
|
+
EXAMPLES::
|
|
192
|
+
|
|
193
|
+
sage: # needs sage.symbolic
|
|
194
|
+
sage: CFiniteSequence((2-x)/(1-x-x^2)) # the Lucas sequence
|
|
195
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
196
|
+
sage: CFiniteSequence(x/(1-x)^3) # triangular numbers
|
|
197
|
+
C-finite sequence, generated by -x/(x^3 - 3*x^2 + 3*x - 1)
|
|
198
|
+
|
|
199
|
+
Polynomials are interpreted as finite sequences, or recurrences of degree 0::
|
|
200
|
+
|
|
201
|
+
sage: # needs sage.symbolic
|
|
202
|
+
sage: CFiniteSequence(x^2-4*x^5)
|
|
203
|
+
Finite sequence [1, 0, 0, -4], offset = 2
|
|
204
|
+
sage: CFiniteSequence(1)
|
|
205
|
+
Finite sequence [1], offset = 0
|
|
206
|
+
|
|
207
|
+
This implementation allows any polynomial fraction as o.g.f. by interpreting
|
|
208
|
+
any power of `x` dividing the o.g.f. numerator or denominator as a right or left shift
|
|
209
|
+
of the sequence offset::
|
|
210
|
+
|
|
211
|
+
sage: # needs sage.symbolic
|
|
212
|
+
sage: CFiniteSequence(x^2+3/x)
|
|
213
|
+
Finite sequence [3, 0, 0, 1], offset = -1
|
|
214
|
+
sage: CFiniteSequence(1/x+4/x^3)
|
|
215
|
+
Finite sequence [4, 0, 1], offset = -3
|
|
216
|
+
sage: P = LaurentPolynomialRing(QQ.fraction_field(), 'X')
|
|
217
|
+
sage: X=P.gen()
|
|
218
|
+
sage: CFiniteSequence(1/(1-X))
|
|
219
|
+
C-finite sequence, generated by -1/(X - 1)
|
|
220
|
+
|
|
221
|
+
The o.g.f. is always normalized to get a denominator constant coefficient of `+1`::
|
|
222
|
+
|
|
223
|
+
sage: CFiniteSequence(1/(x-2)) # needs sage.symbolic
|
|
224
|
+
C-finite sequence, generated by 1/(x - 2)
|
|
225
|
+
|
|
226
|
+
The given ``ogf`` is used to create an appropriate parent: it can
|
|
227
|
+
be a symbolic expression, a polynomial , or a fraction field element
|
|
228
|
+
as long as it can be coerced into a proper fraction field over the
|
|
229
|
+
rationals::
|
|
230
|
+
|
|
231
|
+
sage: # needs sage.symbolic
|
|
232
|
+
sage: var('x')
|
|
233
|
+
x
|
|
234
|
+
sage: f1 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
235
|
+
sage: P.<x> = QQ[]
|
|
236
|
+
sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
237
|
+
sage: f1 == f2
|
|
238
|
+
True
|
|
239
|
+
sage: f1.parent()
|
|
240
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
241
|
+
sage: f1.ogf().parent()
|
|
242
|
+
Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
243
|
+
sage: CFiniteSequence(log(x))
|
|
244
|
+
Traceback (most recent call last):
|
|
245
|
+
...
|
|
246
|
+
TypeError: unable to convert log(x) to a rational
|
|
247
|
+
|
|
248
|
+
TESTS::
|
|
249
|
+
|
|
250
|
+
sage: # needs sage.rings.real_interval_field sage.symbolic
|
|
251
|
+
sage: P.<x> = QQ[]
|
|
252
|
+
sage: CFiniteSequence(0.1/(1-x))
|
|
253
|
+
C-finite sequence, generated by -1/10/(x - 1)
|
|
254
|
+
sage: CFiniteSequence(pi/(1-x))
|
|
255
|
+
Traceback (most recent call last):
|
|
256
|
+
...
|
|
257
|
+
TypeError: unable to convert -pi to a rational
|
|
258
|
+
|
|
259
|
+
sage: P.<x,y> = QQ[]
|
|
260
|
+
sage: CFiniteSequence(x*y)
|
|
261
|
+
Traceback (most recent call last):
|
|
262
|
+
...
|
|
263
|
+
NotImplementedError: Multidimensional o.g.f. not implemented.
|
|
264
|
+
"""
|
|
265
|
+
@staticmethod
|
|
266
|
+
def __classcall_private__(cls, ogf):
|
|
267
|
+
r"""
|
|
268
|
+
Ensure that elements created by :class:`CFiniteSequence` have the same
|
|
269
|
+
parent than the ones created by the parent itself and follow the category
|
|
270
|
+
framework (they should be instance of :class:`CFiniteSequences` automatic
|
|
271
|
+
element class).
|
|
272
|
+
|
|
273
|
+
This method is called before the ``__init__`` method, it checks the
|
|
274
|
+
o.g.f to create the appropriate parent.
|
|
275
|
+
|
|
276
|
+
INPUT:
|
|
277
|
+
|
|
278
|
+
- ``ogf`` -- a rational function
|
|
279
|
+
|
|
280
|
+
TESTS::
|
|
281
|
+
|
|
282
|
+
sage: # needs sage.symbolic
|
|
283
|
+
sage: f1 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
284
|
+
sage: f1
|
|
285
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
286
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
287
|
+
sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
288
|
+
sage: f2
|
|
289
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
290
|
+
sage: f3 = C((2-x)/(1-x-x^2))
|
|
291
|
+
sage: f3
|
|
292
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
293
|
+
sage: f1 == f2 and f2 == f3
|
|
294
|
+
True
|
|
295
|
+
sage: f1.parent() == f2.parent() and f2.parent() == f3.parent()
|
|
296
|
+
True
|
|
297
|
+
sage: type(f1)
|
|
298
|
+
<class 'sage.rings.cfinite_sequence.CFiniteSequences_generic_with_category.element_class'>
|
|
299
|
+
sage: type(f1) == type(f2) and type(f2) == type(f3)
|
|
300
|
+
True
|
|
301
|
+
sage: CFiniteSequence(log(x))
|
|
302
|
+
Traceback (most recent call last):
|
|
303
|
+
...
|
|
304
|
+
TypeError: unable to convert log(x) to a rational
|
|
305
|
+
sage: CFiniteSequence(pi)
|
|
306
|
+
Traceback (most recent call last):
|
|
307
|
+
...
|
|
308
|
+
TypeError: unable to convert pi to a rational
|
|
309
|
+
sage: var('y')
|
|
310
|
+
y
|
|
311
|
+
sage: f4 = CFiniteSequence((2-y)/(1-y-y^2))
|
|
312
|
+
sage: f4
|
|
313
|
+
C-finite sequence, generated by (y - 2)/(y^2 + y - 1)
|
|
314
|
+
sage: f4 == f1
|
|
315
|
+
False
|
|
316
|
+
sage: f4.parent() == f1.parent()
|
|
317
|
+
False
|
|
318
|
+
sage: f4.parent()
|
|
319
|
+
The ring of C-Finite sequences in y over Rational Field
|
|
320
|
+
"""
|
|
321
|
+
br = ogf.base_ring()
|
|
322
|
+
if br not in [QQ, ZZ]:
|
|
323
|
+
br = QQ # if the base ring of the o.g.f is not QQ, we force it to QQ and see if the o.g.f converts nicely
|
|
324
|
+
|
|
325
|
+
# trying to figure out the ogf variables
|
|
326
|
+
variables = []
|
|
327
|
+
if ogf not in br:
|
|
328
|
+
if hasattr(ogf, 'variables'):
|
|
329
|
+
variables = ogf.variables()
|
|
330
|
+
elif hasattr(ogf.parent(), 'gens'):
|
|
331
|
+
variables = ogf.parent().gens()
|
|
332
|
+
# for some reason, fraction field elements don't have the variables
|
|
333
|
+
# method, but symbolic elements don't have the gens method so we check both
|
|
334
|
+
|
|
335
|
+
if not variables:
|
|
336
|
+
parent = CFiniteSequences(QQ) # if we cannot find variables, we create the default parent (with x)
|
|
337
|
+
else:
|
|
338
|
+
parent = CFiniteSequences(QQ, variables)
|
|
339
|
+
return parent(ogf) # if ogf cannot be converted to a fraction field, this will break and raise the proper error
|
|
340
|
+
|
|
341
|
+
def __init__(self, parent, ogf):
|
|
342
|
+
r"""
|
|
343
|
+
Initialize the C-Finite sequence.
|
|
344
|
+
|
|
345
|
+
The ``__init__`` method can only be called by the :class:`CFiniteSequences`
|
|
346
|
+
class. By Default, a class call reaches the ``__classcall_private__``
|
|
347
|
+
which first creates a proper parent and then call the ``__init__``.
|
|
348
|
+
|
|
349
|
+
INPUT:
|
|
350
|
+
|
|
351
|
+
- ``ogf`` -- the ordinary generating function, a fraction of
|
|
352
|
+
polynomials over the rationals
|
|
353
|
+
- ``parent`` -- the parent of the C-Finite sequence, an occurrence of
|
|
354
|
+
:class:`CFiniteSequences`
|
|
355
|
+
|
|
356
|
+
OUTPUT: a CFiniteSequence object
|
|
357
|
+
|
|
358
|
+
TESTS::
|
|
359
|
+
|
|
360
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
361
|
+
sage: C((2-x)/(1-x-x^2)) # indirect doctest
|
|
362
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
363
|
+
"""
|
|
364
|
+
|
|
365
|
+
br = parent.base_ring()
|
|
366
|
+
ogf = parent.fraction_field()(ogf)
|
|
367
|
+
P = parent.polynomial_ring()
|
|
368
|
+
num = ogf.numerator()
|
|
369
|
+
den = ogf.denominator()
|
|
370
|
+
|
|
371
|
+
FieldElement.__init__(self, parent)
|
|
372
|
+
|
|
373
|
+
if den == 1:
|
|
374
|
+
self._c = []
|
|
375
|
+
self._off = num.valuation()
|
|
376
|
+
self._deg = 0
|
|
377
|
+
if ogf == 0:
|
|
378
|
+
self._a = [0]
|
|
379
|
+
else:
|
|
380
|
+
self._a = num.shift(-self._off).list()
|
|
381
|
+
else:
|
|
382
|
+
# Transform the ogf numerator and denominator to canonical form
|
|
383
|
+
# to get the correct offset, degree, and recurrence coeffs and
|
|
384
|
+
# start values.
|
|
385
|
+
self._off = 0
|
|
386
|
+
self._deg = 0
|
|
387
|
+
if num.constant_coefficient() == 0:
|
|
388
|
+
self._off = num.valuation()
|
|
389
|
+
num = num.shift(-self._off)
|
|
390
|
+
elif den.constant_coefficient() == 0:
|
|
391
|
+
self._off = -den.valuation()
|
|
392
|
+
den = den.shift(self._off)
|
|
393
|
+
f = den.constant_coefficient()
|
|
394
|
+
num = P(num / f)
|
|
395
|
+
den = P(den / f)
|
|
396
|
+
f = num.gcd(den)
|
|
397
|
+
num = P(num / f)
|
|
398
|
+
den = P(den / f)
|
|
399
|
+
self._deg = den.degree()
|
|
400
|
+
self._c = [-den[i] for i in range(1, self._deg + 1)]
|
|
401
|
+
if self._off >= 0:
|
|
402
|
+
num = num.shift(self._off)
|
|
403
|
+
else:
|
|
404
|
+
den = den.shift(-self._off)
|
|
405
|
+
|
|
406
|
+
# determine start values (may be different from _get_item_ values)
|
|
407
|
+
alen = max(self._deg, num.degree() + 1)
|
|
408
|
+
R = LaurentSeriesRing(br, parent.variable_name(), default_prec=alen)
|
|
409
|
+
if den != 1:
|
|
410
|
+
self._a = R(num / den).list()
|
|
411
|
+
else:
|
|
412
|
+
self._a = num.list()
|
|
413
|
+
if len(self._a) < alen:
|
|
414
|
+
self._a.extend([0] * (alen - len(self._a)))
|
|
415
|
+
|
|
416
|
+
ogf = num / den
|
|
417
|
+
|
|
418
|
+
self._ogf = ogf
|
|
419
|
+
|
|
420
|
+
def _repr_(self) -> str:
|
|
421
|
+
"""
|
|
422
|
+
Return textual definition of sequence.
|
|
423
|
+
|
|
424
|
+
TESTS::
|
|
425
|
+
|
|
426
|
+
sage: # needs sage.symbolic
|
|
427
|
+
sage: CFiniteSequence(1/x^5)
|
|
428
|
+
Finite sequence [1], offset = -5
|
|
429
|
+
sage: CFiniteSequence(x^3)
|
|
430
|
+
Finite sequence [1], offset = 3
|
|
431
|
+
"""
|
|
432
|
+
if self._deg == 0:
|
|
433
|
+
if self.ogf() == 0:
|
|
434
|
+
return 'Constant infinite sequence 0.'
|
|
435
|
+
return 'Finite sequence ' + str(self._a) + ', offset = ' + str(self._off)
|
|
436
|
+
return 'C-finite sequence, generated by ' + str(self.ogf())
|
|
437
|
+
|
|
438
|
+
def __hash__(self):
|
|
439
|
+
r"""
|
|
440
|
+
Hash value for C finite sequence.
|
|
441
|
+
|
|
442
|
+
EXAMPLES::
|
|
443
|
+
|
|
444
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
445
|
+
sage: hash(C((2-x)/(1-x-x^2))) # random
|
|
446
|
+
42
|
|
447
|
+
"""
|
|
448
|
+
return hash(self.parent()) ^ hash(self._ogf)
|
|
449
|
+
|
|
450
|
+
def _add_(self, other):
|
|
451
|
+
"""
|
|
452
|
+
Addition of C-finite sequences.
|
|
453
|
+
|
|
454
|
+
TESTS::
|
|
455
|
+
|
|
456
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
457
|
+
sage: r = C(1/(1-2*x))
|
|
458
|
+
sage: r[0:5] # a(n) = 2^n
|
|
459
|
+
[1, 2, 4, 8, 16]
|
|
460
|
+
sage: s = C.from_recurrence([1],[1])
|
|
461
|
+
sage: (r + s)[0:5] # a(n) = 2^n + 1
|
|
462
|
+
[2, 3, 5, 9, 17]
|
|
463
|
+
sage: r + 0 == r
|
|
464
|
+
True
|
|
465
|
+
sage: (r + x^2)[0:5]
|
|
466
|
+
[1, 2, 5, 8, 16]
|
|
467
|
+
sage: (r + 3/x)[-1]
|
|
468
|
+
3
|
|
469
|
+
sage: r = CFiniteSequence(x)
|
|
470
|
+
sage: r + 0 == r
|
|
471
|
+
True
|
|
472
|
+
sage: CFiniteSequence(0) + CFiniteSequence(0)
|
|
473
|
+
Constant infinite sequence 0.
|
|
474
|
+
"""
|
|
475
|
+
return CFiniteSequence(self.ogf() + other.numerator() / other.denominator())
|
|
476
|
+
|
|
477
|
+
def _sub_(self, other):
|
|
478
|
+
"""
|
|
479
|
+
Subtraction of C-finite sequences.
|
|
480
|
+
|
|
481
|
+
TESTS::
|
|
482
|
+
|
|
483
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
484
|
+
sage: r = C(1/(1-2*x))
|
|
485
|
+
sage: r[0:5] # a(n) = 2^n
|
|
486
|
+
[1, 2, 4, 8, 16]
|
|
487
|
+
sage: s = C.from_recurrence([1],[1])
|
|
488
|
+
sage: (r - s)[0:5] # a(n) = 2^n + 1
|
|
489
|
+
[0, 1, 3, 7, 15]
|
|
490
|
+
"""
|
|
491
|
+
return CFiniteSequence(self.ogf() - other.numerator() / other.denominator())
|
|
492
|
+
|
|
493
|
+
def _mul_(self, other):
|
|
494
|
+
"""
|
|
495
|
+
Multiplication of C-finite sequences.
|
|
496
|
+
|
|
497
|
+
TESTS::
|
|
498
|
+
|
|
499
|
+
sage: # needs numpy
|
|
500
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
501
|
+
sage: r = C.guess([1,2,3,4,5,6])
|
|
502
|
+
sage: (r*r)[0:6] # self-convolution
|
|
503
|
+
[1, 4, 10, 20, 35, 56]
|
|
504
|
+
sage: r = C(x)
|
|
505
|
+
sage: r*1 == r
|
|
506
|
+
True
|
|
507
|
+
sage: r*-1
|
|
508
|
+
Finite sequence [-1], offset = 1
|
|
509
|
+
sage: C(0) * C(1)
|
|
510
|
+
Constant infinite sequence 0.
|
|
511
|
+
"""
|
|
512
|
+
return CFiniteSequence(self.ogf() * other.numerator() / other.denominator())
|
|
513
|
+
|
|
514
|
+
def _div_(self, other):
|
|
515
|
+
"""
|
|
516
|
+
Division of C-finite sequences.
|
|
517
|
+
|
|
518
|
+
TESTS::
|
|
519
|
+
|
|
520
|
+
sage: # needs numpy
|
|
521
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
522
|
+
sage: r = C.guess([1,2,3,4,5,6])
|
|
523
|
+
sage: (r/2)[0:6]
|
|
524
|
+
[1/2, 1, 3/2, 2, 5/2, 3]
|
|
525
|
+
sage: s = C(x)
|
|
526
|
+
sage: s/(s*-1 + 1)
|
|
527
|
+
C-finite sequence, generated by -x/(x - 1)
|
|
528
|
+
"""
|
|
529
|
+
return CFiniteSequence(self.ogf() / (other.numerator() / other.denominator()))
|
|
530
|
+
|
|
531
|
+
def coefficients(self):
|
|
532
|
+
"""
|
|
533
|
+
Return the coefficients of the recurrence representation of the
|
|
534
|
+
C-finite sequence.
|
|
535
|
+
|
|
536
|
+
OUTPUT: list of values
|
|
537
|
+
|
|
538
|
+
EXAMPLES::
|
|
539
|
+
|
|
540
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
541
|
+
sage: lucas = C((2-x)/(1-x-x^2)) # the Lucas sequence
|
|
542
|
+
sage: lucas.coefficients()
|
|
543
|
+
[1, 1]
|
|
544
|
+
"""
|
|
545
|
+
return self._c
|
|
546
|
+
|
|
547
|
+
def __eq__(self, other):
|
|
548
|
+
"""
|
|
549
|
+
Compare two CFiniteSequences.
|
|
550
|
+
|
|
551
|
+
EXAMPLES::
|
|
552
|
+
|
|
553
|
+
sage: # needs sage.symbolic
|
|
554
|
+
sage: f = CFiniteSequence((2-x)/(1-x-x^2))
|
|
555
|
+
sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
556
|
+
sage: f == f2
|
|
557
|
+
True
|
|
558
|
+
sage: f == (2-x)/(1-x-x^2)
|
|
559
|
+
False
|
|
560
|
+
sage: (2-x)/(1-x-x^2) == f
|
|
561
|
+
False
|
|
562
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
563
|
+
sage: r = C.from_recurrence([1,1],[2,1])
|
|
564
|
+
sage: s = C.from_recurrence([-1],[1])
|
|
565
|
+
sage: r == s
|
|
566
|
+
False
|
|
567
|
+
sage: r = C.from_recurrence([-1],[1])
|
|
568
|
+
sage: s = C(1/(1+x))
|
|
569
|
+
sage: r == s
|
|
570
|
+
True
|
|
571
|
+
"""
|
|
572
|
+
if not isinstance(other, CFiniteSequence):
|
|
573
|
+
return False
|
|
574
|
+
return self.ogf() == other.ogf()
|
|
575
|
+
|
|
576
|
+
def __ne__(self, other):
|
|
577
|
+
"""
|
|
578
|
+
Compare two CFiniteSequences.
|
|
579
|
+
|
|
580
|
+
EXAMPLES::
|
|
581
|
+
|
|
582
|
+
sage: # needs sage.symbolic
|
|
583
|
+
sage: f = CFiniteSequence((2-x)/(1-x-x^2))
|
|
584
|
+
sage: f2 = CFiniteSequence((2-x)/(1-x-x^2))
|
|
585
|
+
sage: f != f2
|
|
586
|
+
False
|
|
587
|
+
sage: f != (2-x)/(1-x-x^2)
|
|
588
|
+
True
|
|
589
|
+
sage: (2-x)/(1-x-x^2) != f
|
|
590
|
+
True
|
|
591
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
592
|
+
sage: r = C.from_recurrence([1,1],[2,1])
|
|
593
|
+
sage: s = C.from_recurrence([-1],[1])
|
|
594
|
+
sage: r != s
|
|
595
|
+
True
|
|
596
|
+
sage: r = C.from_recurrence([-1],[1])
|
|
597
|
+
sage: s = C(1/(1+x))
|
|
598
|
+
sage: r != s
|
|
599
|
+
False
|
|
600
|
+
"""
|
|
601
|
+
return not self.__eq__(other)
|
|
602
|
+
|
|
603
|
+
def __getitem__(self, key):
|
|
604
|
+
r"""
|
|
605
|
+
Return a slice of the sequence.
|
|
606
|
+
|
|
607
|
+
EXAMPLES::
|
|
608
|
+
|
|
609
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
610
|
+
sage: r = C.from_recurrence([3,3],[2,1])
|
|
611
|
+
sage: r[2]
|
|
612
|
+
9
|
|
613
|
+
sage: r[101]
|
|
614
|
+
16158686318788579168659644539538474790082623100896663971001
|
|
615
|
+
sage: r = C(1/(1-x))
|
|
616
|
+
sage: r[5]
|
|
617
|
+
1
|
|
618
|
+
sage: r = C(x)
|
|
619
|
+
sage: r[0]
|
|
620
|
+
0
|
|
621
|
+
sage: r[1]
|
|
622
|
+
1
|
|
623
|
+
sage: r = C(0)
|
|
624
|
+
sage: r[66]
|
|
625
|
+
0
|
|
626
|
+
sage: lucas = C.from_recurrence([1,1],[2,1])
|
|
627
|
+
sage: lucas[5:10]
|
|
628
|
+
[11, 18, 29, 47, 76]
|
|
629
|
+
sage: r = C((2-x)/x/(1-x-x*x))
|
|
630
|
+
sage: r[0:4]
|
|
631
|
+
[1, 3, 4, 7]
|
|
632
|
+
sage: r = C(1-2*x^2)
|
|
633
|
+
sage: r[0:4]
|
|
634
|
+
[1, 0, -2, 0]
|
|
635
|
+
sage: r[-1:4] # not tested, python will not allow this!
|
|
636
|
+
[0, 1, 0 -2, 0]
|
|
637
|
+
sage: r = C((-2*x^3 + x^2 + 1)/(-2*x + 1))
|
|
638
|
+
sage: r[0:5] # handle ogf > 1
|
|
639
|
+
[1, 2, 5, 8, 16]
|
|
640
|
+
sage: r[-2]
|
|
641
|
+
0
|
|
642
|
+
sage: r = C((-2*x^3 + x^2 - x + 1)/(2*x^2 - 3*x + 1))
|
|
643
|
+
sage: r[0:5]
|
|
644
|
+
[1, 2, 5, 9, 17]
|
|
645
|
+
sage: s=C((1-x)/(-x^2 - x + 1))
|
|
646
|
+
sage: s[0:5]
|
|
647
|
+
[1, 0, 1, 1, 2]
|
|
648
|
+
sage: s=C((1+x^20+x^40)/(1-x^12)/(1-x^30))
|
|
649
|
+
sage: s[0:20]
|
|
650
|
+
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
|
|
651
|
+
sage: s=C(1/((1-x^2)*(1-x^6)*(1-x^8)*(1-x^12)))
|
|
652
|
+
sage: s[999998]
|
|
653
|
+
289362268629630
|
|
654
|
+
sage: s = C.from_recurrence([1,1],[1,1,1])
|
|
655
|
+
sage: s[0:5]
|
|
656
|
+
[1, 1, 1, 2, 3]
|
|
657
|
+
sage: s = C((1 - x)^-2); s[0:10]
|
|
658
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
659
|
+
sage: s = C(x * (1 - x)^-2); s[0:10]
|
|
660
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
661
|
+
sage: s = C(x^2 * (1 - x)^-2); s[0:10]
|
|
662
|
+
[0, 0, 1, 2, 3, 4, 5, 6, 7, 8]
|
|
663
|
+
sage: s = C(x^3 * (1 - x)^-2); s[0:10]
|
|
664
|
+
[0, 0, 0, 1, 2, 3, 4, 5, 6, 7]
|
|
665
|
+
sage: s = C(1/(1-x^1000)); s[10^18]
|
|
666
|
+
1
|
|
667
|
+
sage: s = C(1/(1-x^1000)); s[10^20]
|
|
668
|
+
1
|
|
669
|
+
|
|
670
|
+
REFERENCES:
|
|
671
|
+
|
|
672
|
+
- [BM2021]_
|
|
673
|
+
"""
|
|
674
|
+
if isinstance(key, slice):
|
|
675
|
+
m = max(key.start, key.stop)
|
|
676
|
+
return [self[ii] for ii in range(*key.indices(m + 1))]
|
|
677
|
+
|
|
678
|
+
if isinstance(key, Integral):
|
|
679
|
+
n = key - self._off
|
|
680
|
+
if n < 0:
|
|
681
|
+
return 0
|
|
682
|
+
den = self.denominator()
|
|
683
|
+
num = self.numerator()
|
|
684
|
+
if self._off >= 0:
|
|
685
|
+
num = num.shift(-self._off)
|
|
686
|
+
else:
|
|
687
|
+
den = den.shift(self._off)
|
|
688
|
+
(quo, num) = num.quo_rem(den)
|
|
689
|
+
if quo.degree() < n:
|
|
690
|
+
wp = 0
|
|
691
|
+
else:
|
|
692
|
+
wp = quo[n]
|
|
693
|
+
P = self.parent().polynomial_ring()
|
|
694
|
+
x = P.gen()
|
|
695
|
+
while n:
|
|
696
|
+
nden = den(-x)
|
|
697
|
+
num = P((num * nden).list()[n % 2::2])
|
|
698
|
+
den = P((den * nden).list()[::2])
|
|
699
|
+
n //= 2
|
|
700
|
+
return wp + num[0] / den[0]
|
|
701
|
+
|
|
702
|
+
raise TypeError("invalid argument type")
|
|
703
|
+
|
|
704
|
+
def ogf(self):
|
|
705
|
+
"""
|
|
706
|
+
Return the ordinary generating function associated with
|
|
707
|
+
the CFiniteSequence.
|
|
708
|
+
|
|
709
|
+
This is always a fraction of polynomials in the base ring.
|
|
710
|
+
|
|
711
|
+
EXAMPLES::
|
|
712
|
+
|
|
713
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
714
|
+
sage: r = C.from_recurrence([2],[1])
|
|
715
|
+
sage: r.ogf()
|
|
716
|
+
-1/2/(x - 1/2)
|
|
717
|
+
sage: C(0).ogf()
|
|
718
|
+
0
|
|
719
|
+
"""
|
|
720
|
+
return self._ogf
|
|
721
|
+
|
|
722
|
+
def numerator(self):
|
|
723
|
+
r"""
|
|
724
|
+
Return the numerator of the o.g.f of ``self``.
|
|
725
|
+
|
|
726
|
+
EXAMPLES::
|
|
727
|
+
|
|
728
|
+
sage: # needs sage.symbolic
|
|
729
|
+
sage: f = CFiniteSequence((2-x)/(1-x-x^2)); f
|
|
730
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
731
|
+
sage: f.numerator()
|
|
732
|
+
x - 2
|
|
733
|
+
"""
|
|
734
|
+
return self.ogf().numerator()
|
|
735
|
+
|
|
736
|
+
def denominator(self):
|
|
737
|
+
r"""
|
|
738
|
+
Return the numerator of the o.g.f of ``self``.
|
|
739
|
+
|
|
740
|
+
EXAMPLES::
|
|
741
|
+
|
|
742
|
+
sage: # needs sage.symbolic
|
|
743
|
+
sage: f = CFiniteSequence((2-x)/(1-x-x^2)); f
|
|
744
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
745
|
+
sage: f.denominator()
|
|
746
|
+
x^2 + x - 1
|
|
747
|
+
"""
|
|
748
|
+
return self.ogf().denominator()
|
|
749
|
+
|
|
750
|
+
def recurrence_repr(self) -> str:
|
|
751
|
+
"""
|
|
752
|
+
Return a string with the recurrence representation of
|
|
753
|
+
the C-finite sequence.
|
|
754
|
+
|
|
755
|
+
OUTPUT: string
|
|
756
|
+
|
|
757
|
+
EXAMPLES::
|
|
758
|
+
|
|
759
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
760
|
+
sage: C((2-x)/(1-x-x^2)).recurrence_repr()
|
|
761
|
+
'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = a(n+1) + a(n), starting a(0...) = [2, 1]'
|
|
762
|
+
sage: C(x/(1-x)^3).recurrence_repr()
|
|
763
|
+
'homogeneous linear recurrence with constant coefficients of degree 3: a(n+3) = 3*a(n+2) - 3*a(n+1) + a(n), starting a(1...) = [1, 3, 6]'
|
|
764
|
+
sage: C(1).recurrence_repr()
|
|
765
|
+
'Finite sequence [1], offset 0'
|
|
766
|
+
sage: r = C((-2*x^3 + x^2 - x + 1)/(2*x^2 - 3*x + 1))
|
|
767
|
+
sage: r.recurrence_repr()
|
|
768
|
+
'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = 3*a(n+1) - 2*a(n), starting a(0...) = [1, 2, 5, 9]'
|
|
769
|
+
sage: r = CFiniteSequence(x^3/(1-x-x^2))
|
|
770
|
+
sage: r.recurrence_repr()
|
|
771
|
+
'homogeneous linear recurrence with constant coefficients of degree 2: a(n+2) = a(n+1) + a(n), starting a(3...) = [1, 1, 2, 3]'
|
|
772
|
+
"""
|
|
773
|
+
if self._deg == 0:
|
|
774
|
+
return 'Finite sequence %s, offset %d' % (str(self._a), self._off)
|
|
775
|
+
else:
|
|
776
|
+
if self._c[0] == 1:
|
|
777
|
+
cstr = 'a(n+%d) = a(n+%d)' % (self._deg, self._deg - 1)
|
|
778
|
+
elif self._c[0] == -1:
|
|
779
|
+
cstr = 'a(n+%d) = -a(n+%d)' % (self._deg, self._deg - 1)
|
|
780
|
+
else:
|
|
781
|
+
cstr = 'a(n+%d) = %s*a(n+%d)' % (self._deg, str(self._c[0]), self._deg - 1)
|
|
782
|
+
for i in range(1, self._deg):
|
|
783
|
+
j = self._deg - i - 1
|
|
784
|
+
if self._c[i] < 0:
|
|
785
|
+
if self._c[i] == -1:
|
|
786
|
+
cstr = cstr + ' - a(n+%d)' % (j,)
|
|
787
|
+
else:
|
|
788
|
+
cstr = cstr + ' - %d*a(n+%d)' % (-(self._c[i]), j)
|
|
789
|
+
elif self._c[i] > 0:
|
|
790
|
+
if self._c[i] == 1:
|
|
791
|
+
cstr = cstr + ' + a(n+%d)' % (j,)
|
|
792
|
+
else:
|
|
793
|
+
cstr = cstr + ' + %d*a(n+%d)' % (self._c[i], j)
|
|
794
|
+
cstr = cstr.replace('+0', '')
|
|
795
|
+
astr = ', starting a(%s...) = [' % str(self._off)
|
|
796
|
+
maxwexp = self.numerator().quo_rem(self.denominator())[0].degree() + 1
|
|
797
|
+
for i in range(maxwexp + self._deg):
|
|
798
|
+
astr = astr + str(self[self._off + i]) + ', '
|
|
799
|
+
astr = astr[:-2] + ']'
|
|
800
|
+
return 'homogeneous linear recurrence with constant coefficients of degree ' + str(self._deg) + ': ' + cstr + astr
|
|
801
|
+
|
|
802
|
+
def series(self, n):
|
|
803
|
+
"""
|
|
804
|
+
Return the Laurent power series associated with the
|
|
805
|
+
CFiniteSequence, with precision `n`.
|
|
806
|
+
|
|
807
|
+
INPUT:
|
|
808
|
+
|
|
809
|
+
- ``n`` -- nonnegative integer
|
|
810
|
+
|
|
811
|
+
EXAMPLES::
|
|
812
|
+
|
|
813
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
814
|
+
sage: r = C.from_recurrence([-1,2],[0,1])
|
|
815
|
+
sage: s = r.series(4); s
|
|
816
|
+
x + 2*x^2 + 3*x^3 + 4*x^4 + O(x^5)
|
|
817
|
+
sage: type(s)
|
|
818
|
+
<class 'sage.rings.laurent_series_ring_element.LaurentSeries'>
|
|
819
|
+
"""
|
|
820
|
+
R = LaurentSeriesRing(QQ, 'x', default_prec=n)
|
|
821
|
+
return R(self.ogf())
|
|
822
|
+
|
|
823
|
+
def closed_form(self, n='n'):
|
|
824
|
+
r"""
|
|
825
|
+
Return a symbolic expression in ``n``, which equals the n-th term of
|
|
826
|
+
the sequence.
|
|
827
|
+
|
|
828
|
+
It is a well-known property of C-finite sequences ``a_n`` that they
|
|
829
|
+
have a closed form of the type:
|
|
830
|
+
|
|
831
|
+
.. MATH::
|
|
832
|
+
|
|
833
|
+
a_n = \sum_{i=1}^d c_i(n) \cdot r_i^n,
|
|
834
|
+
|
|
835
|
+
where ``r_i`` are the roots of the characteristic equation and
|
|
836
|
+
``c_i(n)`` is a polynomial (whose degree equals the multiplicity of
|
|
837
|
+
``r_i`` minus one). This is a natural generalization of Binet's
|
|
838
|
+
formula for Fibonacci numbers. See, for instance, [KP2011, Theorem 4.1].
|
|
839
|
+
|
|
840
|
+
Note that if the o.g.f. has a polynomial part, that is, if the
|
|
841
|
+
numerator degree is not strictly less than the denominator degree,
|
|
842
|
+
then this closed form holds only when ``n`` exceeds the degree of that
|
|
843
|
+
polynomial part. In that case, the returned expression will differ
|
|
844
|
+
from the sequence for small ``n``.
|
|
845
|
+
|
|
846
|
+
EXAMPLES::
|
|
847
|
+
|
|
848
|
+
sage: # needs sage.symbolic
|
|
849
|
+
sage: CFiniteSequence(1/(1-x)).closed_form()
|
|
850
|
+
1
|
|
851
|
+
sage: CFiniteSequence(x^2/(1-x)).closed_form()
|
|
852
|
+
1
|
|
853
|
+
sage: CFiniteSequence(1/(1-x^2)).closed_form()
|
|
854
|
+
1/2*(-1)^n + 1/2
|
|
855
|
+
sage: CFiniteSequence(1/(1+x^3)).closed_form()
|
|
856
|
+
1/3*(-1)^n + 1/3*(1/2*I*sqrt(3) + 1/2)^n + 1/3*(-1/2*I*sqrt(3) + 1/2)^n
|
|
857
|
+
sage: CFiniteSequence(1/(1-x)/(1-2*x)/(1-3*x)).closed_form()
|
|
858
|
+
9/2*3^n - 4*2^n + 1/2
|
|
859
|
+
|
|
860
|
+
Binet's formula for the Fibonacci numbers::
|
|
861
|
+
|
|
862
|
+
sage: # needs sage.symbolic
|
|
863
|
+
sage: CFiniteSequence(x/(1-x-x^2)).closed_form()
|
|
864
|
+
sqrt(1/5)*(1/2*sqrt(5) + 1/2)^n - sqrt(1/5)*(-1/2*sqrt(5) + 1/2)^n
|
|
865
|
+
sage: [_.subs(n=k).full_simplify() for k in range(6)]
|
|
866
|
+
[0, 1, 1, 2, 3, 5]
|
|
867
|
+
sage: CFiniteSequence((4*x+3)/(1-2*x-5*x^2)).closed_form()
|
|
868
|
+
1/2*(sqrt(6) + 1)^n*(7*sqrt(1/6) + 3) - 1/2*(-sqrt(6) + 1)^n*(7*sqrt(1/6) - 3)
|
|
869
|
+
|
|
870
|
+
Examples with multiple roots::
|
|
871
|
+
|
|
872
|
+
sage: # needs sage.symbolic
|
|
873
|
+
sage: CFiniteSequence(x*(x^2+4*x+1)/(1-x)^5).closed_form()
|
|
874
|
+
1/4*n^4 + 1/2*n^3 + 1/4*n^2
|
|
875
|
+
sage: CFiniteSequence((1+2*x-x^2)/(1-x)^4/(1+x)^2).closed_form()
|
|
876
|
+
1/12*n^3 - 1/8*(-1)^n*(n + 1) + 3/4*n^2 + 43/24*n + 9/8
|
|
877
|
+
sage: CFiniteSequence(1/(1-x)^3/(1-2*x)^4).closed_form()
|
|
878
|
+
4/3*(n^3 - 3*n^2 + 20*n - 36)*2^n + 1/2*n^2 + 19/2*n + 49
|
|
879
|
+
sage: CFiniteSequence((x/(1-x-x^2))^2).closed_form()
|
|
880
|
+
1/5*(n - sqrt(1/5))*(1/2*sqrt(5) + 1/2)^n + 1/5*(n + sqrt(1/5))*(-1/2*sqrt(5) + 1/2)^n
|
|
881
|
+
"""
|
|
882
|
+
from sage.arith.misc import binomial
|
|
883
|
+
from sage.rings.qqbar import QQbar
|
|
884
|
+
|
|
885
|
+
from sage.symbolic.ring import SR
|
|
886
|
+
n = SR(n)
|
|
887
|
+
expr = SR.zero()
|
|
888
|
+
|
|
889
|
+
R = FractionField(PolynomialRing(QQbar, self.parent().variable_name()))
|
|
890
|
+
ogf = R(self.ogf())
|
|
891
|
+
|
|
892
|
+
__, parts = ogf.partial_fraction_decomposition(decompose_powers=False)
|
|
893
|
+
for part in parts:
|
|
894
|
+
denom = part.denominator().factor()
|
|
895
|
+
denom_base, denom_exp = denom[0]
|
|
896
|
+
|
|
897
|
+
# denominator is of the form (x+b)^{m+1}
|
|
898
|
+
m = denom_exp - 1
|
|
899
|
+
b = denom_base.constant_coefficient()
|
|
900
|
+
# check that the partial fraction decomposition was indeed done correctly
|
|
901
|
+
# (that is, there is only one factor, of degree 1, and monic)
|
|
902
|
+
assert len(denom) == 1 and len(denom_base.list()) == 2 and denom_base[1] == 1 and denom.unit() == 1
|
|
903
|
+
|
|
904
|
+
r = SR((-1 / b).radical_expression())
|
|
905
|
+
c = SR.zero()
|
|
906
|
+
for k, a in enumerate(part.numerator()):
|
|
907
|
+
a = -QQbar(a) if k % 2 else QQbar(a)
|
|
908
|
+
bino = binomial(n + m - k, m)
|
|
909
|
+
c += bino * SR((a * b**(k - m - 1)).radical_expression())
|
|
910
|
+
|
|
911
|
+
expr += c.expand() * r**n
|
|
912
|
+
|
|
913
|
+
return expr
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
class CFiniteSequences_generic(Parent, UniqueRepresentation):
|
|
917
|
+
r"""
|
|
918
|
+
The class representing the ring of C-Finite Sequences.
|
|
919
|
+
|
|
920
|
+
TESTS::
|
|
921
|
+
|
|
922
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
923
|
+
sage: from sage.rings.cfinite_sequence import CFiniteSequences_generic
|
|
924
|
+
sage: isinstance(C,CFiniteSequences_generic)
|
|
925
|
+
True
|
|
926
|
+
sage: type(C)
|
|
927
|
+
<class 'sage.rings.cfinite_sequence.CFiniteSequences_generic_with_category'>
|
|
928
|
+
sage: C
|
|
929
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
930
|
+
"""
|
|
931
|
+
|
|
932
|
+
Element = CFiniteSequence
|
|
933
|
+
|
|
934
|
+
def __init__(self, polynomial_ring, category):
|
|
935
|
+
r"""
|
|
936
|
+
Create the ring of CFiniteSequences over ``base_ring``.
|
|
937
|
+
|
|
938
|
+
INPUT:
|
|
939
|
+
|
|
940
|
+
- ``base_ring`` -- the base ring for the o.g.f (either ``QQ`` or ``ZZ``)
|
|
941
|
+
- ``names`` -- an iterable of variables (should contain only one variable)
|
|
942
|
+
- ``category`` -- the category of the ring (default: ``Rings().Commutative()``)
|
|
943
|
+
|
|
944
|
+
TESTS::
|
|
945
|
+
|
|
946
|
+
sage: C.<y> = CFiniteSequences(QQ); C
|
|
947
|
+
The ring of C-Finite sequences in y over Rational Field
|
|
948
|
+
sage: C.<x> = CFiniteSequences(QQ); C
|
|
949
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
950
|
+
sage: C.<x> = CFiniteSequences(ZZ); C
|
|
951
|
+
The ring of C-Finite sequences in x over Integer Ring
|
|
952
|
+
sage: C.<x,y> = CFiniteSequences(ZZ)
|
|
953
|
+
Traceback (most recent call last):
|
|
954
|
+
...
|
|
955
|
+
NotImplementedError: Multidimensional o.g.f. not implemented.
|
|
956
|
+
sage: C.<x> = CFiniteSequences(CC)
|
|
957
|
+
Traceback (most recent call last):
|
|
958
|
+
...
|
|
959
|
+
ValueError: O.g.f. base not rational.
|
|
960
|
+
"""
|
|
961
|
+
base_ring = polynomial_ring.base_ring()
|
|
962
|
+
self._polynomial_ring = polynomial_ring
|
|
963
|
+
self._fraction_field = FractionField(self._polynomial_ring)
|
|
964
|
+
if category is None:
|
|
965
|
+
category = Rings().Commutative()
|
|
966
|
+
Parent.__init__(self, base_ring, names=self._polynomial_ring.gens(),
|
|
967
|
+
category=category)
|
|
968
|
+
|
|
969
|
+
def _repr_(self):
|
|
970
|
+
r"""
|
|
971
|
+
Return the string representation of ``self``.
|
|
972
|
+
|
|
973
|
+
EXAMPLES::
|
|
974
|
+
|
|
975
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
976
|
+
sage: C
|
|
977
|
+
The ring of C-Finite sequences in x over Rational Field
|
|
978
|
+
"""
|
|
979
|
+
return "The ring of C-Finite sequences in {} over {}".format(self.gen(), self.base_ring())
|
|
980
|
+
|
|
981
|
+
def _element_constructor_(self, ogf):
|
|
982
|
+
r"""
|
|
983
|
+
Construct a C-Finite Sequence.
|
|
984
|
+
|
|
985
|
+
INPUT:
|
|
986
|
+
|
|
987
|
+
- ``ogf`` -- the ordinary generating function, a fraction of
|
|
988
|
+
polynomials over the rationals
|
|
989
|
+
|
|
990
|
+
TESTS::
|
|
991
|
+
|
|
992
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
993
|
+
sage: C((2-x)/(1-x-x^2))
|
|
994
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
995
|
+
sage: C(x/(1-x)^3)
|
|
996
|
+
C-finite sequence, generated by -x/(x^3 - 3*x^2 + 3*x - 1)
|
|
997
|
+
sage: C(x^2-4*x^5)
|
|
998
|
+
Finite sequence [1, 0, 0, -4], offset = 2
|
|
999
|
+
sage: C(x^2+3/x)
|
|
1000
|
+
Finite sequence [3, 0, 0, 1], offset = -1
|
|
1001
|
+
sage: C(1/x + 4/x^3)
|
|
1002
|
+
Finite sequence [4, 0, 1], offset = -3
|
|
1003
|
+
sage: P = LaurentPolynomialRing(QQ.fraction_field(), 'X')
|
|
1004
|
+
sage: X = P.gen()
|
|
1005
|
+
sage: C(1/(1-X))
|
|
1006
|
+
C-finite sequence, generated by -1/(x - 1)
|
|
1007
|
+
sage: C = CFiniteSequences(QQ)
|
|
1008
|
+
sage: C(x)
|
|
1009
|
+
Finite sequence [1], offset = 1
|
|
1010
|
+
"""
|
|
1011
|
+
ogf = self.fraction_field()(ogf)
|
|
1012
|
+
return self.element_class(self, ogf)
|
|
1013
|
+
|
|
1014
|
+
def ngens(self) -> int:
|
|
1015
|
+
r"""
|
|
1016
|
+
Return the number of generators of ``self``.
|
|
1017
|
+
|
|
1018
|
+
EXAMPLES::
|
|
1019
|
+
|
|
1020
|
+
sage: from sage.rings.cfinite_sequence import CFiniteSequences
|
|
1021
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1022
|
+
sage: C.ngens()
|
|
1023
|
+
1
|
|
1024
|
+
"""
|
|
1025
|
+
return 1
|
|
1026
|
+
|
|
1027
|
+
def gen(self, i=0):
|
|
1028
|
+
r"""
|
|
1029
|
+
Return the i-th generator of ``self``.
|
|
1030
|
+
|
|
1031
|
+
INPUT:
|
|
1032
|
+
|
|
1033
|
+
- ``i`` -- integer (default: 0)
|
|
1034
|
+
|
|
1035
|
+
EXAMPLES::
|
|
1036
|
+
|
|
1037
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1038
|
+
sage: C.gen()
|
|
1039
|
+
x
|
|
1040
|
+
sage: x == C.gen()
|
|
1041
|
+
True
|
|
1042
|
+
|
|
1043
|
+
TESTS::
|
|
1044
|
+
|
|
1045
|
+
sage: C.gen(2)
|
|
1046
|
+
Traceback (most recent call last):
|
|
1047
|
+
...
|
|
1048
|
+
ValueError: The ring of C-Finite sequences in x over Rational Field has only one generator (i=0)
|
|
1049
|
+
"""
|
|
1050
|
+
if i:
|
|
1051
|
+
raise ValueError("{} has only one generator (i=0)".format(self))
|
|
1052
|
+
return self.polynomial_ring().gen()
|
|
1053
|
+
|
|
1054
|
+
def gens(self) -> tuple:
|
|
1055
|
+
"""
|
|
1056
|
+
Return the generators of ``self``.
|
|
1057
|
+
|
|
1058
|
+
EXAMPLES::
|
|
1059
|
+
|
|
1060
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1061
|
+
sage: C.gens()
|
|
1062
|
+
(x,)
|
|
1063
|
+
"""
|
|
1064
|
+
return (self.gen(0),)
|
|
1065
|
+
|
|
1066
|
+
def an_element(self):
|
|
1067
|
+
r"""
|
|
1068
|
+
Return an element of C-Finite Sequences.
|
|
1069
|
+
|
|
1070
|
+
OUTPUT: the Lucas sequence
|
|
1071
|
+
|
|
1072
|
+
EXAMPLES::
|
|
1073
|
+
|
|
1074
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1075
|
+
sage: C.an_element()
|
|
1076
|
+
C-finite sequence, generated by (x - 2)/(x^2 + x - 1)
|
|
1077
|
+
"""
|
|
1078
|
+
x = self.gen()
|
|
1079
|
+
return self((2 - x) / (1 - x - x**2))
|
|
1080
|
+
|
|
1081
|
+
def __contains__(self, x) -> bool:
|
|
1082
|
+
"""
|
|
1083
|
+
Return ``True`` if x is an element of ``CFiniteSequences`` or
|
|
1084
|
+
canonically coerces to this ring.
|
|
1085
|
+
|
|
1086
|
+
EXAMPLES::
|
|
1087
|
+
|
|
1088
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1089
|
+
sage: x in C
|
|
1090
|
+
True
|
|
1091
|
+
sage: 1/x in C
|
|
1092
|
+
True
|
|
1093
|
+
sage: 5 in C
|
|
1094
|
+
True
|
|
1095
|
+
sage: pi in C # needs sage.symbolic
|
|
1096
|
+
False
|
|
1097
|
+
sage: Cy.<y> = CFiniteSequences(QQ)
|
|
1098
|
+
sage: y in C
|
|
1099
|
+
False
|
|
1100
|
+
sage: y in Cy
|
|
1101
|
+
True
|
|
1102
|
+
"""
|
|
1103
|
+
return self.has_coerce_map_from(parent(x))
|
|
1104
|
+
|
|
1105
|
+
def fraction_field(self):
|
|
1106
|
+
r"""
|
|
1107
|
+
Return the fraction field used to represent the elements of ``self``.
|
|
1108
|
+
|
|
1109
|
+
EXAMPLES::
|
|
1110
|
+
|
|
1111
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1112
|
+
sage: C.fraction_field()
|
|
1113
|
+
Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
|
1114
|
+
"""
|
|
1115
|
+
return self._fraction_field
|
|
1116
|
+
|
|
1117
|
+
def polynomial_ring(self):
|
|
1118
|
+
r"""
|
|
1119
|
+
Return the polynomial ring used to represent the elements of ``self``.
|
|
1120
|
+
|
|
1121
|
+
EXAMPLES::
|
|
1122
|
+
|
|
1123
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1124
|
+
sage: C.polynomial_ring()
|
|
1125
|
+
Univariate Polynomial Ring in x over Rational Field
|
|
1126
|
+
"""
|
|
1127
|
+
return self._polynomial_ring
|
|
1128
|
+
|
|
1129
|
+
def _coerce_map_from_(self, S):
|
|
1130
|
+
"""
|
|
1131
|
+
A coercion from `S` exists, if `S` coerces into ``self``'s fraction
|
|
1132
|
+
field.
|
|
1133
|
+
|
|
1134
|
+
EXAMPLES::
|
|
1135
|
+
|
|
1136
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1137
|
+
sage: C.has_coerce_map_from(C.fraction_field())
|
|
1138
|
+
True
|
|
1139
|
+
sage: C.has_coerce_map_from(QQ)
|
|
1140
|
+
True
|
|
1141
|
+
sage: C.has_coerce_map_from(QQ[x])
|
|
1142
|
+
True
|
|
1143
|
+
sage: C.has_coerce_map_from(ZZ)
|
|
1144
|
+
True
|
|
1145
|
+
"""
|
|
1146
|
+
if self.fraction_field().has_coerce_map_from(S):
|
|
1147
|
+
return True
|
|
1148
|
+
|
|
1149
|
+
def from_recurrence(self, coefficients, values):
|
|
1150
|
+
r"""
|
|
1151
|
+
Create a C-finite sequence given the coefficients `c` and
|
|
1152
|
+
starting values `a` of a homogeneous linear recurrence.
|
|
1153
|
+
|
|
1154
|
+
.. MATH::
|
|
1155
|
+
|
|
1156
|
+
a_{n+d} = c_0a_n + c_1a_{n+1} + \cdots + c_{d-1}a_{n+d-1}, \quad d\ge0.
|
|
1157
|
+
|
|
1158
|
+
INPUT:
|
|
1159
|
+
|
|
1160
|
+
- ``coefficients`` -- list of rationals
|
|
1161
|
+
- ``values`` -- start values, a list of rationals
|
|
1162
|
+
|
|
1163
|
+
OUTPUT: a CFiniteSequence object
|
|
1164
|
+
|
|
1165
|
+
EXAMPLES::
|
|
1166
|
+
|
|
1167
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1168
|
+
sage: C.from_recurrence([1,1],[0,1]) # Fibonacci numbers
|
|
1169
|
+
C-finite sequence, generated by -x/(x^2 + x - 1)
|
|
1170
|
+
sage: C.from_recurrence([-1,2],[0,1]) # natural numbers
|
|
1171
|
+
C-finite sequence, generated by x/(x^2 - 2*x + 1)
|
|
1172
|
+
sage: r = C.from_recurrence([-1],[1])
|
|
1173
|
+
sage: s = C.from_recurrence([-1],[1,-1])
|
|
1174
|
+
sage: r == s
|
|
1175
|
+
True
|
|
1176
|
+
sage: r = C(x^3/(1-x-x^2))
|
|
1177
|
+
sage: s = C.from_recurrence([1,1],[0,0,0,1,1])
|
|
1178
|
+
sage: r == s
|
|
1179
|
+
True
|
|
1180
|
+
sage: C.from_recurrence(1,1)
|
|
1181
|
+
Traceback (most recent call last):
|
|
1182
|
+
...
|
|
1183
|
+
ValueError: Wrong type for recurrence coefficient list.
|
|
1184
|
+
"""
|
|
1185
|
+
if not isinstance(coefficients, list):
|
|
1186
|
+
raise ValueError("Wrong type for recurrence coefficient list.")
|
|
1187
|
+
if not isinstance(values, list):
|
|
1188
|
+
raise ValueError("Wrong type for recurrence start value list.")
|
|
1189
|
+
deg = len(coefficients)
|
|
1190
|
+
|
|
1191
|
+
co = coefficients[::-1] + [0] * (len(values) - deg)
|
|
1192
|
+
R = self.polynomial_ring()
|
|
1193
|
+
den = R([-1] + co[:deg])
|
|
1194
|
+
num = R([-values[0]] +
|
|
1195
|
+
[-values[n] + sum(values[k] * co[n - 1 - k]
|
|
1196
|
+
for k in range(n))
|
|
1197
|
+
for n in range(1, len(values))])
|
|
1198
|
+
return self(num / den)
|
|
1199
|
+
|
|
1200
|
+
def guess(self, sequence, algorithm='sage'):
|
|
1201
|
+
"""
|
|
1202
|
+
Return the minimal CFiniteSequence that generates the sequence.
|
|
1203
|
+
|
|
1204
|
+
Assume the first value has index 0.
|
|
1205
|
+
|
|
1206
|
+
INPUT:
|
|
1207
|
+
|
|
1208
|
+
- ``sequence`` -- list of integers
|
|
1209
|
+
- ``algorithm`` -- string; one of
|
|
1210
|
+
- ``'sage'`` -- the default is to use Sage's matrix kernel function
|
|
1211
|
+
- ``'pari'`` -- use Pari's implementation of LLL
|
|
1212
|
+
- ``'bm'`` -- use Sage's Berlekamp-Massey algorithm
|
|
1213
|
+
|
|
1214
|
+
OUTPUT: a CFiniteSequence, or 0 if none could be found
|
|
1215
|
+
|
|
1216
|
+
With the default kernel method, trailing zeroes are chopped
|
|
1217
|
+
off before a guessing attempt. This may reduce the data
|
|
1218
|
+
below the accepted length of six values.
|
|
1219
|
+
|
|
1220
|
+
EXAMPLES::
|
|
1221
|
+
|
|
1222
|
+
sage: # needs numpy
|
|
1223
|
+
sage: C.<x> = CFiniteSequences(QQ)
|
|
1224
|
+
sage: C.guess([1,2,4,8,16,32])
|
|
1225
|
+
C-finite sequence, generated by -1/2/(x - 1/2)
|
|
1226
|
+
sage: r = C.guess([1,2,3,4,5])
|
|
1227
|
+
Traceback (most recent call last):
|
|
1228
|
+
...
|
|
1229
|
+
ValueError: sequence too short for guessing
|
|
1230
|
+
|
|
1231
|
+
With Berlekamp-Massey, if an odd number of values is given, the last one is dropped.
|
|
1232
|
+
So with an odd number of values the result may not generate the last value::
|
|
1233
|
+
|
|
1234
|
+
sage: # needs numpy
|
|
1235
|
+
sage: r = C.guess([1,2,4,8,9], algorithm='bm'); r
|
|
1236
|
+
C-finite sequence, generated by -1/2/(x - 1/2)
|
|
1237
|
+
sage: r[0:5]
|
|
1238
|
+
[1, 2, 4, 8, 16]
|
|
1239
|
+
|
|
1240
|
+
Using pari::
|
|
1241
|
+
|
|
1242
|
+
sage: # needs numpy sage.libs.pari
|
|
1243
|
+
sage: r = C.guess([1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28], algorithm='pari'); r
|
|
1244
|
+
C-finite sequence, generated by (-x - 1)/(x^3 + x^2 - 1)
|
|
1245
|
+
sage: r[0:5]
|
|
1246
|
+
[1, 1, 1, 2, 2]
|
|
1247
|
+
"""
|
|
1248
|
+
S = self.polynomial_ring()
|
|
1249
|
+
|
|
1250
|
+
if algorithm == 'bm':
|
|
1251
|
+
from sage.matrix.berlekamp_massey import berlekamp_massey
|
|
1252
|
+
if len(sequence) < 2:
|
|
1253
|
+
raise ValueError('sequence too short for guessing')
|
|
1254
|
+
R = PowerSeriesRing(QQ, 'x')
|
|
1255
|
+
if len(sequence) % 2:
|
|
1256
|
+
sequence.pop()
|
|
1257
|
+
l = len(sequence) - 1
|
|
1258
|
+
denominator = S(berlekamp_massey(sequence).reverse())
|
|
1259
|
+
numerator = R(S(sequence) * denominator, prec=l).truncate()
|
|
1260
|
+
|
|
1261
|
+
return CFiniteSequence(numerator / denominator)
|
|
1262
|
+
|
|
1263
|
+
if algorithm == 'pari':
|
|
1264
|
+
if len(sequence) < 6:
|
|
1265
|
+
raise ValueError('sequence too short for guessing')
|
|
1266
|
+
pari("ggf(v)=local(l,m,p,q,B);l=length(v);B=l\\2;\
|
|
1267
|
+
if(B<3,return(0));m=matrix(B,B,x,y,v[x-y+B+1]);\
|
|
1268
|
+
q=qflll(m,4)[1];if(length(q)==0,return(0));\
|
|
1269
|
+
p=sum(k=1,B,x^(k-1)*q[k,1]);\
|
|
1270
|
+
q=Pol(Pol(vector(l,n,v[l-n+1]))*p+O(x^(B+1)));\
|
|
1271
|
+
if(polcoeff(p,0)<0,q=-q;p=-p);q=q/p;p=Ser(q+O(x^(l+1)));\
|
|
1272
|
+
for(m=1,l,if(polcoeff(p,m-1)!=v[m],return(0)));q")
|
|
1273
|
+
pari_guess = pari("ggf")(sequence)
|
|
1274
|
+
num = S(pari_guess.numerator().Vec().sage()[::-1])
|
|
1275
|
+
den = S(pari_guess.denominator().Vec().sage()[::-1])
|
|
1276
|
+
if num == 0:
|
|
1277
|
+
return 0
|
|
1278
|
+
return CFiniteSequence(num / den)
|
|
1279
|
+
|
|
1280
|
+
from sage.matrix.constructor import matrix
|
|
1281
|
+
from sage.arith.misc import integer_ceil as ceil
|
|
1282
|
+
from numpy import trim_zeros
|
|
1283
|
+
seq = sequence[:]
|
|
1284
|
+
while seq and sequence[-1] == 0:
|
|
1285
|
+
seq.pop()
|
|
1286
|
+
l = len(seq)
|
|
1287
|
+
if l == 0:
|
|
1288
|
+
return 0
|
|
1289
|
+
if l < 6:
|
|
1290
|
+
raise ValueError('sequence too short for guessing')
|
|
1291
|
+
|
|
1292
|
+
hl = ceil(ZZ(l) / 2)
|
|
1293
|
+
A = matrix([sequence[k: k + hl] for k in range(hl)])
|
|
1294
|
+
K = A.kernel()
|
|
1295
|
+
if K.dimension() == 0:
|
|
1296
|
+
return 0
|
|
1297
|
+
R = PolynomialRing(QQ, 'x')
|
|
1298
|
+
den = R(trim_zeros(K.basis()[-1].list()[::-1]))
|
|
1299
|
+
if den == 1:
|
|
1300
|
+
return 0
|
|
1301
|
+
offset = next((i for i, x in enumerate(sequence) if x), None)
|
|
1302
|
+
S = PowerSeriesRing(QQ, 'x', default_prec=l - offset)
|
|
1303
|
+
num = S(R(sequence) * den).truncate(ZZ(l) // 2 + 1)
|
|
1304
|
+
if num == 0 or sequence != S(num / den).list():
|
|
1305
|
+
return 0
|
|
1306
|
+
return CFiniteSequence(num / den)
|