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,1230 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Integer-valued polynomial rings
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Frédéric Chapoton (2023-03): Initial version
|
|
8
|
+
"""
|
|
9
|
+
# ***************************************************************************
|
|
10
|
+
# Copyright (C) 2013 Frédéric Chapoton
|
|
11
|
+
#
|
|
12
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ***************************************************************************
|
|
15
|
+
from sage.arith.misc import binomial, factorial
|
|
16
|
+
from sage.categories.algebras import Algebras
|
|
17
|
+
from sage.categories.realizations import Category_realization_of_parent
|
|
18
|
+
from sage.categories.rings import Rings
|
|
19
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
20
|
+
from sage.data_structures.blas_dict import linear_combination
|
|
21
|
+
from sage.matrix.constructor import matrix
|
|
22
|
+
from sage.misc.bindable_class import BindableClass
|
|
23
|
+
from sage.misc.cachefunc import cached_method
|
|
24
|
+
from sage.modules.free_module_element import vector
|
|
25
|
+
from sage.rings.integer_ring import ZZ
|
|
26
|
+
from sage.rings.polynomial.polynomial_ring import polygen
|
|
27
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
28
|
+
from sage.rings.rational_field import QQ
|
|
29
|
+
from sage.sets.family import Family
|
|
30
|
+
from sage.sets.non_negative_integers import NonNegativeIntegers
|
|
31
|
+
from sage.structure.parent import Parent
|
|
32
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class IntegerValuedPolynomialRing(UniqueRepresentation, Parent):
|
|
36
|
+
r"""
|
|
37
|
+
The integer-valued polynomial ring over a base ring `R`.
|
|
38
|
+
|
|
39
|
+
Integer-valued polynomial rings are commutative and associative
|
|
40
|
+
algebras, with a basis indexed by nonnegative integers.
|
|
41
|
+
|
|
42
|
+
There are two natural bases, made of the sequence
|
|
43
|
+
`\binom{x}{n}` for `n \geq 0` (the *binomial basis*) and of
|
|
44
|
+
the other sequence `\binom{x+n}{n}` for `n \geq 0` (the *shifted basis*).
|
|
45
|
+
|
|
46
|
+
These two bases are available as follows::
|
|
47
|
+
|
|
48
|
+
sage: B = IntegerValuedPolynomialRing(QQ).Binomial()
|
|
49
|
+
sage: S = IntegerValuedPolynomialRing(QQ).Shifted()
|
|
50
|
+
|
|
51
|
+
or by using the shortcuts::
|
|
52
|
+
|
|
53
|
+
sage: B = IntegerValuedPolynomialRing(QQ).B()
|
|
54
|
+
sage: S = IntegerValuedPolynomialRing(QQ).S()
|
|
55
|
+
|
|
56
|
+
There is a conversion formula between the two bases:
|
|
57
|
+
|
|
58
|
+
.. MATH::
|
|
59
|
+
|
|
60
|
+
\binom{x}{i} = \sum_{k=0}^{i} (-1)^{i-k} \binom{i}{k} \binom{x+k}{k}
|
|
61
|
+
|
|
62
|
+
with inverse:
|
|
63
|
+
|
|
64
|
+
.. MATH::
|
|
65
|
+
|
|
66
|
+
\binom{x+i}{i} = \sum_{k=0}^{i} \binom{i}{k} \binom{x}{k}.
|
|
67
|
+
|
|
68
|
+
REFERENCES:
|
|
69
|
+
|
|
70
|
+
- :wikipedia:`Integer-valued polynomial`
|
|
71
|
+
|
|
72
|
+
TESTS::
|
|
73
|
+
|
|
74
|
+
sage: IntegerValuedPolynomialRing(24)
|
|
75
|
+
Traceback (most recent call last):
|
|
76
|
+
...
|
|
77
|
+
TypeError: argument R must be a commutative ring
|
|
78
|
+
"""
|
|
79
|
+
def __init__(self, R):
|
|
80
|
+
"""
|
|
81
|
+
TESTS::
|
|
82
|
+
|
|
83
|
+
sage: IV = IntegerValuedPolynomialRing(ZZ)
|
|
84
|
+
sage: TestSuite(IV).run()
|
|
85
|
+
"""
|
|
86
|
+
if R not in Rings().Commutative():
|
|
87
|
+
raise TypeError("argument R must be a commutative ring")
|
|
88
|
+
self._base = R
|
|
89
|
+
cat = Algebras(R).Commutative().WithBasis()
|
|
90
|
+
Parent.__init__(self, base=R, category=cat.WithRealizations())
|
|
91
|
+
|
|
92
|
+
_shorthands = ["B", "S"]
|
|
93
|
+
|
|
94
|
+
def _repr_(self) -> str:
|
|
95
|
+
r"""
|
|
96
|
+
Return the string representation.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: IntegerValuedPolynomialRing(QQ)
|
|
101
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
102
|
+
"""
|
|
103
|
+
br = self.base_ring()
|
|
104
|
+
return f"Integer-Valued Polynomial Ring over {br}"
|
|
105
|
+
|
|
106
|
+
def a_realization(self):
|
|
107
|
+
"""
|
|
108
|
+
Return a default realization.
|
|
109
|
+
|
|
110
|
+
The Binomial realization is chosen.
|
|
111
|
+
|
|
112
|
+
EXAMPLES::
|
|
113
|
+
|
|
114
|
+
sage: IntegerValuedPolynomialRing(QQ).a_realization()
|
|
115
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
116
|
+
in the binomial basis
|
|
117
|
+
"""
|
|
118
|
+
return self.Binomial()
|
|
119
|
+
|
|
120
|
+
class Bases(Category_realization_of_parent):
|
|
121
|
+
def super_categories(self) -> list:
|
|
122
|
+
r"""
|
|
123
|
+
Return the super-categories of ``self``.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: A = IntegerValuedPolynomialRing(QQ); A
|
|
128
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
129
|
+
sage: C = A.Bases(); C
|
|
130
|
+
Category of bases of Integer-Valued Polynomial Ring
|
|
131
|
+
over Rational Field
|
|
132
|
+
sage: C.super_categories()
|
|
133
|
+
[Category of realizations of Integer-Valued Polynomial Ring
|
|
134
|
+
over Rational Field,
|
|
135
|
+
Join of Category of algebras with basis over Rational Field and
|
|
136
|
+
Category of filtered algebras over Rational Field and
|
|
137
|
+
Category of commutative algebras over Rational Field and
|
|
138
|
+
Category of realizations of unital magmas]
|
|
139
|
+
"""
|
|
140
|
+
A = self.base()
|
|
141
|
+
category = Algebras(A.base_ring()).Commutative().Filtered()
|
|
142
|
+
return [A.Realizations(),
|
|
143
|
+
category.Realizations().WithBasis()]
|
|
144
|
+
|
|
145
|
+
class ParentMethods:
|
|
146
|
+
def _repr_(self) -> str:
|
|
147
|
+
r"""
|
|
148
|
+
EXAMPLES::
|
|
149
|
+
|
|
150
|
+
sage: F = IntegerValuedPolynomialRing(QQ).S()
|
|
151
|
+
sage: F # indirect doctest
|
|
152
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
153
|
+
in the shifted basis
|
|
154
|
+
sage: F = IntegerValuedPolynomialRing(QQ).B()
|
|
155
|
+
sage: F # indirect doctest
|
|
156
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
157
|
+
in the binomial basis
|
|
158
|
+
"""
|
|
159
|
+
real = self.realization_of()
|
|
160
|
+
return f"{real} in the {self._realization_name()} basis"
|
|
161
|
+
|
|
162
|
+
@cached_method
|
|
163
|
+
def one_basis(self):
|
|
164
|
+
r"""
|
|
165
|
+
Return the number 0, which index the unit of this algebra.
|
|
166
|
+
|
|
167
|
+
EXAMPLES::
|
|
168
|
+
|
|
169
|
+
sage: A = IntegerValuedPolynomialRing(QQ).S()
|
|
170
|
+
sage: A.one_basis()
|
|
171
|
+
0
|
|
172
|
+
sage: A.one()
|
|
173
|
+
S[0]
|
|
174
|
+
"""
|
|
175
|
+
return self.basis().keys()(0)
|
|
176
|
+
|
|
177
|
+
def degree_on_basis(self, m):
|
|
178
|
+
r"""
|
|
179
|
+
Return the degree of the basis element indexed by ``m``.
|
|
180
|
+
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: A = IntegerValuedPolynomialRing(QQ).S()
|
|
184
|
+
sage: A.degree_on_basis(4)
|
|
185
|
+
4
|
|
186
|
+
"""
|
|
187
|
+
return ZZ(m)
|
|
188
|
+
|
|
189
|
+
def from_polynomial(self, p):
|
|
190
|
+
"""
|
|
191
|
+
Convert a polynomial into the ring of integer-valued polynomials.
|
|
192
|
+
|
|
193
|
+
This raises a :exc:`ValueError` if this is not possible.
|
|
194
|
+
|
|
195
|
+
INPUT:
|
|
196
|
+
|
|
197
|
+
- ``p`` -- a polynomial in one variable
|
|
198
|
+
|
|
199
|
+
EXAMPLES::
|
|
200
|
+
|
|
201
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
202
|
+
sage: S = A.basis()
|
|
203
|
+
sage: S[5].polynomial()
|
|
204
|
+
1/120*x^5 + 1/8*x^4 + 17/24*x^3 + 15/8*x^2 + 137/60*x + 1
|
|
205
|
+
sage: A.from_polynomial(_)
|
|
206
|
+
S[5]
|
|
207
|
+
sage: x = polygen(QQ, 'x')
|
|
208
|
+
sage: A.from_polynomial(x)
|
|
209
|
+
-S[0] + S[1]
|
|
210
|
+
|
|
211
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).B()
|
|
212
|
+
sage: B = A.basis()
|
|
213
|
+
sage: B[5].polynomial()
|
|
214
|
+
1/120*x^5 - 1/12*x^4 + 7/24*x^3 - 5/12*x^2 + 1/5*x
|
|
215
|
+
sage: A.from_polynomial(_)
|
|
216
|
+
B[5]
|
|
217
|
+
sage: x = polygen(QQ, 'x')
|
|
218
|
+
sage: A.from_polynomial(x)
|
|
219
|
+
B[1]
|
|
220
|
+
|
|
221
|
+
TESTS::
|
|
222
|
+
|
|
223
|
+
sage: x = polygen(QQ,'x')
|
|
224
|
+
sage: A.from_polynomial(x+1/3)
|
|
225
|
+
Traceback (most recent call last):
|
|
226
|
+
...
|
|
227
|
+
ValueError: not a polynomial with integer values: 1/3
|
|
228
|
+
|
|
229
|
+
sage: t = polygen(ZZ,'t')
|
|
230
|
+
sage: B = IntegerValuedPolynomialRing(QQ).B()
|
|
231
|
+
sage: B.from_polynomial(t+1)
|
|
232
|
+
B[0] + B[1]
|
|
233
|
+
"""
|
|
234
|
+
B = self.basis()
|
|
235
|
+
poly = self._poly
|
|
236
|
+
remain = p.change_variable_name('x')
|
|
237
|
+
result = self.zero()
|
|
238
|
+
while remain:
|
|
239
|
+
N = remain.degree()
|
|
240
|
+
top_coeff = remain.leading_coefficient() * factorial(N)
|
|
241
|
+
try:
|
|
242
|
+
top_coeff = self.base_ring()(top_coeff)
|
|
243
|
+
except TypeError as exc:
|
|
244
|
+
msg = 'not a polynomial with integer'
|
|
245
|
+
msg += f' values: {top_coeff}'
|
|
246
|
+
raise ValueError(msg) from exc
|
|
247
|
+
remain += -top_coeff * poly(N)
|
|
248
|
+
result += top_coeff * B[N]
|
|
249
|
+
return result
|
|
250
|
+
|
|
251
|
+
def gen(self, i=0):
|
|
252
|
+
r"""
|
|
253
|
+
Return the generator of this algebra.
|
|
254
|
+
|
|
255
|
+
The optional argument is ignored.
|
|
256
|
+
|
|
257
|
+
EXAMPLES::
|
|
258
|
+
|
|
259
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
260
|
+
sage: F.gen()
|
|
261
|
+
B[1]
|
|
262
|
+
"""
|
|
263
|
+
return self.algebra_generators()[0]
|
|
264
|
+
|
|
265
|
+
@cached_method
|
|
266
|
+
def algebra_generators(self):
|
|
267
|
+
r"""
|
|
268
|
+
Return the generators of this algebra.
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S(); A
|
|
273
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
274
|
+
in the shifted basis
|
|
275
|
+
sage: A.algebra_generators()
|
|
276
|
+
Family (S[1],)
|
|
277
|
+
"""
|
|
278
|
+
NonNeg = self.basis().keys()
|
|
279
|
+
return Family([self.monomial(NonNeg(1))])
|
|
280
|
+
|
|
281
|
+
gens = algebra_generators
|
|
282
|
+
|
|
283
|
+
class ElementMethods:
|
|
284
|
+
def __call__(self, v):
|
|
285
|
+
"""
|
|
286
|
+
Return the evaluation at some value ``v``.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
291
|
+
sage: B = F.gen()
|
|
292
|
+
sage: f = B**2+4*B+6
|
|
293
|
+
sage: f(1/3)
|
|
294
|
+
118/9
|
|
295
|
+
|
|
296
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
297
|
+
sage: B = F.gen()
|
|
298
|
+
sage: f = B**2+4*B+6
|
|
299
|
+
sage: f(1/3)
|
|
300
|
+
67/9
|
|
301
|
+
"""
|
|
302
|
+
return self.polynomial()(v)
|
|
303
|
+
|
|
304
|
+
def polynomial(self):
|
|
305
|
+
"""
|
|
306
|
+
Convert to a polynomial in `x`.
|
|
307
|
+
|
|
308
|
+
EXAMPLES::
|
|
309
|
+
|
|
310
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
311
|
+
sage: B = F.gen()
|
|
312
|
+
sage: (B+1).polynomial()
|
|
313
|
+
x + 2
|
|
314
|
+
|
|
315
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
316
|
+
sage: B = F.gen()
|
|
317
|
+
sage: (B+1).polynomial()
|
|
318
|
+
x + 1
|
|
319
|
+
|
|
320
|
+
TESTS::
|
|
321
|
+
|
|
322
|
+
sage: F.zero().polynomial().parent()
|
|
323
|
+
Univariate Polynomial Ring in x over Rational Field
|
|
324
|
+
"""
|
|
325
|
+
R = PolynomialRing(QQ, 'x')
|
|
326
|
+
p = self.parent()._poly
|
|
327
|
+
return R.sum(c * p(i) for i, c in self)
|
|
328
|
+
|
|
329
|
+
def shift(self, j=1):
|
|
330
|
+
"""
|
|
331
|
+
Shift all indices by `j`.
|
|
332
|
+
|
|
333
|
+
INPUT:
|
|
334
|
+
|
|
335
|
+
- ``j`` -- integer (default: 1)
|
|
336
|
+
|
|
337
|
+
In the binomial basis, the shift by 1 corresponds to
|
|
338
|
+
a summation operator from `0` to `x`.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
343
|
+
sage: B = F.gen()
|
|
344
|
+
sage: (B+1).shift()
|
|
345
|
+
B[1] + B[2]
|
|
346
|
+
sage: (B+1).shift(3)
|
|
347
|
+
B[3] + B[4]
|
|
348
|
+
"""
|
|
349
|
+
A = self.parent()
|
|
350
|
+
return A._from_dict({A._indices(i + j): c for i, c in self})
|
|
351
|
+
|
|
352
|
+
def sum_of_coefficients(self):
|
|
353
|
+
"""
|
|
354
|
+
Return the sum of coefficients.
|
|
355
|
+
|
|
356
|
+
In the shifted basis, this is the evaluation at `x=0`.
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
361
|
+
sage: B = F.basis()
|
|
362
|
+
sage: (B[2]*B[4]).sum_of_coefficients()
|
|
363
|
+
1
|
|
364
|
+
|
|
365
|
+
TESTS::
|
|
366
|
+
|
|
367
|
+
sage: (0*B[2]).sum_of_coefficients().parent()
|
|
368
|
+
Integer Ring
|
|
369
|
+
"""
|
|
370
|
+
R = self.parent().base_ring()
|
|
371
|
+
return R.sum(self._monomial_coefficients.values())
|
|
372
|
+
|
|
373
|
+
def content(self):
|
|
374
|
+
"""
|
|
375
|
+
Return the content of ``self``.
|
|
376
|
+
|
|
377
|
+
This is the gcd of the coefficients.
|
|
378
|
+
|
|
379
|
+
EXAMPLES::
|
|
380
|
+
|
|
381
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
382
|
+
sage: B = F.basis()
|
|
383
|
+
sage: (3*B[4]+6*B[7]).content()
|
|
384
|
+
3
|
|
385
|
+
|
|
386
|
+
TESTS::
|
|
387
|
+
|
|
388
|
+
sage: (0*B[2]).content()
|
|
389
|
+
0
|
|
390
|
+
"""
|
|
391
|
+
from sage.arith.misc import gcd
|
|
392
|
+
return gcd(self._monomial_coefficients.values())
|
|
393
|
+
|
|
394
|
+
class Shifted(CombinatorialFreeModule, BindableClass):
|
|
395
|
+
r"""
|
|
396
|
+
The integer-valued polynomial ring in the shifted basis.
|
|
397
|
+
|
|
398
|
+
The basis used here is given by `S[i] = \binom{i+x}{i}` for `i \in \NN`.
|
|
399
|
+
|
|
400
|
+
Assuming `n_1 \leq n_2`, the product of two monomials `S[n_1] \cdot S[n_2]`
|
|
401
|
+
is given by the sum
|
|
402
|
+
|
|
403
|
+
.. MATH::
|
|
404
|
+
|
|
405
|
+
\sum_{k=0}^{n_1} (-1)^k \binom{n_1}{k}\binom{n_1+n_2-k}{n_1} S[n_1 + n_2 - k].
|
|
406
|
+
|
|
407
|
+
EXAMPLES::
|
|
408
|
+
|
|
409
|
+
sage: F = IntegerValuedPolynomialRing(QQ).S(); F
|
|
410
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
411
|
+
in the shifted basis
|
|
412
|
+
|
|
413
|
+
sage: F.gen()
|
|
414
|
+
S[1]
|
|
415
|
+
|
|
416
|
+
sage: S = IntegerValuedPolynomialRing(ZZ).S(); S
|
|
417
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
418
|
+
in the shifted basis
|
|
419
|
+
sage: S.base_ring()
|
|
420
|
+
Integer Ring
|
|
421
|
+
|
|
422
|
+
sage: G = IntegerValuedPolynomialRing(S).S(); G
|
|
423
|
+
Integer-Valued Polynomial Ring over Integer-Valued Polynomial
|
|
424
|
+
Ring over Integer Ring in the shifted basis in the shifted basis
|
|
425
|
+
sage: G.base_ring()
|
|
426
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
427
|
+
in the shifted basis
|
|
428
|
+
|
|
429
|
+
Integer-valued polynomial rings commute with their base ring::
|
|
430
|
+
|
|
431
|
+
sage: K = IntegerValuedPolynomialRing(QQ).S()
|
|
432
|
+
sage: a = K.gen()
|
|
433
|
+
sage: K.is_commutative()
|
|
434
|
+
True
|
|
435
|
+
sage: L = IntegerValuedPolynomialRing(K).S()
|
|
436
|
+
sage: c = L.gen()
|
|
437
|
+
sage: L.is_commutative()
|
|
438
|
+
True
|
|
439
|
+
sage: s = a * c^3; s
|
|
440
|
+
S[1]*S[1] + (-6*S[1])*S[2] + 6*S[1]*S[3]
|
|
441
|
+
sage: parent(s)
|
|
442
|
+
Integer-Valued Polynomial Ring over Integer-Valued Polynomial
|
|
443
|
+
Ring over Rational Field in the shifted basis in the shifted basis
|
|
444
|
+
|
|
445
|
+
Integer-valued polynomial rings are commutative::
|
|
446
|
+
|
|
447
|
+
sage: c^3 * a == c * a * c * c
|
|
448
|
+
True
|
|
449
|
+
|
|
450
|
+
We can also manipulate elements in the basis and
|
|
451
|
+
coerce elements from our base field::
|
|
452
|
+
|
|
453
|
+
sage: F = IntegerValuedPolynomialRing(QQ).S()
|
|
454
|
+
sage: S = F.basis()
|
|
455
|
+
sage: S[2] * S[3]
|
|
456
|
+
3*S[3] - 12*S[4] + 10*S[5]
|
|
457
|
+
sage: 1 - S[2] * S[2] / 2
|
|
458
|
+
S[0] - 1/2*S[2] + 3*S[3] - 3*S[4]
|
|
459
|
+
"""
|
|
460
|
+
def __init__(self, A):
|
|
461
|
+
r"""
|
|
462
|
+
Initialize ``self``.
|
|
463
|
+
|
|
464
|
+
EXAMPLES::
|
|
465
|
+
|
|
466
|
+
sage: F = IntegerValuedPolynomialRing(QQ).S(); F
|
|
467
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
468
|
+
in the shifted basis
|
|
469
|
+
sage: TestSuite(F).run()
|
|
470
|
+
"""
|
|
471
|
+
CombinatorialFreeModule.__init__(self, A.base_ring(),
|
|
472
|
+
NonNegativeIntegers(),
|
|
473
|
+
category=A.Bases(),
|
|
474
|
+
prefix='S',
|
|
475
|
+
latex_prefix=r"\mathbb{S}")
|
|
476
|
+
|
|
477
|
+
def _realization_name(self) -> str:
|
|
478
|
+
r"""
|
|
479
|
+
TESTS::
|
|
480
|
+
|
|
481
|
+
sage: F = IntegerValuedPolynomialRing(QQ).S()
|
|
482
|
+
sage: F._realization_name()
|
|
483
|
+
'shifted'
|
|
484
|
+
"""
|
|
485
|
+
return "shifted"
|
|
486
|
+
|
|
487
|
+
def product_on_basis(self, n1, n2):
|
|
488
|
+
r"""
|
|
489
|
+
Return the product of basis elements ``n1`` and ``n2``.
|
|
490
|
+
|
|
491
|
+
INPUT:
|
|
492
|
+
|
|
493
|
+
- ``n1``, ``n2`` -- integers
|
|
494
|
+
|
|
495
|
+
EXAMPLES::
|
|
496
|
+
|
|
497
|
+
sage: A = IntegerValuedPolynomialRing(QQ).S()
|
|
498
|
+
sage: A.product_on_basis(0, 1)
|
|
499
|
+
S[1]
|
|
500
|
+
sage: A.product_on_basis(1, 2)
|
|
501
|
+
-2*S[2] + 3*S[3]
|
|
502
|
+
"""
|
|
503
|
+
i = ZZ(n1)
|
|
504
|
+
j = ZZ(n2)
|
|
505
|
+
if j < i:
|
|
506
|
+
j, i = i, j
|
|
507
|
+
|
|
508
|
+
R = self.base_ring()
|
|
509
|
+
return self._from_dict({i + j - k: R((-1)**k * i.binomial(k) * (i + j - k).binomial(i))
|
|
510
|
+
for k in range(i + 1)})
|
|
511
|
+
|
|
512
|
+
def _from_binomial_basis(self, i):
|
|
513
|
+
"""
|
|
514
|
+
Convert from the ``binomial(x,k)`` basis.
|
|
515
|
+
|
|
516
|
+
INPUT:
|
|
517
|
+
|
|
518
|
+
- ``i`` -- integer
|
|
519
|
+
|
|
520
|
+
EXAMPLES::
|
|
521
|
+
|
|
522
|
+
sage: S = IntegerValuedPolynomialRing(ZZ).S()
|
|
523
|
+
sage: B = IntegerValuedPolynomialRing(ZZ).B()
|
|
524
|
+
sage: b = B.basis()
|
|
525
|
+
sage: S(b[3]+1) # indirect doctest
|
|
526
|
+
3*S[1] - 3*S[2] + S[3]
|
|
527
|
+
sage: B(_)
|
|
528
|
+
B[0] + B[3]
|
|
529
|
+
"""
|
|
530
|
+
i = ZZ(i)
|
|
531
|
+
R = self.base_ring()
|
|
532
|
+
return self._from_dict({k: R((-1)**(i - k) * i.binomial(k))
|
|
533
|
+
for k in range(i + 1)})
|
|
534
|
+
|
|
535
|
+
def from_h_vector(self, h):
|
|
536
|
+
"""
|
|
537
|
+
Convert from some `h`-vector.
|
|
538
|
+
|
|
539
|
+
INPUT:
|
|
540
|
+
|
|
541
|
+
- ``h`` -- tuple or vector
|
|
542
|
+
|
|
543
|
+
.. SEEALSO:: :meth:`Element.h_vector`
|
|
544
|
+
|
|
545
|
+
EXAMPLES::
|
|
546
|
+
|
|
547
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
548
|
+
sage: S = A.basis()
|
|
549
|
+
sage: ex = S[2]+S[4]
|
|
550
|
+
sage: A.from_h_vector(ex.h_vector())
|
|
551
|
+
S[2] + S[4]
|
|
552
|
+
"""
|
|
553
|
+
d = len(h) - 1
|
|
554
|
+
m = matrix(QQ, d + 1, d + 1,
|
|
555
|
+
lambda j, i: (-1)**(d - j) * binomial(d - i, d - j))
|
|
556
|
+
v = vector(QQ, [h[i] for i in range(d + 1)])
|
|
557
|
+
R = self.base_ring()
|
|
558
|
+
return self._from_dict({i: R(c)
|
|
559
|
+
for i, c in enumerate(m * v)})
|
|
560
|
+
|
|
561
|
+
def _element_constructor_(self, x):
|
|
562
|
+
r"""
|
|
563
|
+
Convert ``x`` into ``self``.
|
|
564
|
+
|
|
565
|
+
INPUT:
|
|
566
|
+
|
|
567
|
+
- ``x`` -- an element of the base ring or something convertible
|
|
568
|
+
|
|
569
|
+
EXAMPLES::
|
|
570
|
+
|
|
571
|
+
sage: R = IntegerValuedPolynomialRing(QQ).S()
|
|
572
|
+
sage: x = R.gen()
|
|
573
|
+
sage: R(3)
|
|
574
|
+
3*S[0]
|
|
575
|
+
sage: R(x)
|
|
576
|
+
S[1]
|
|
577
|
+
"""
|
|
578
|
+
P = x.parent()
|
|
579
|
+
if isinstance(P, IntegerValuedPolynomialRing.Shifted):
|
|
580
|
+
if P is self:
|
|
581
|
+
return x
|
|
582
|
+
if P is not self.base_ring():
|
|
583
|
+
return self.element_class(self, x.monomial_coefficients())
|
|
584
|
+
|
|
585
|
+
# ok, not a integer-valued polynomial ring element
|
|
586
|
+
R = self.base_ring()
|
|
587
|
+
# coercion via base ring
|
|
588
|
+
x = R(x)
|
|
589
|
+
if x == 0:
|
|
590
|
+
return self.element_class(self, {})
|
|
591
|
+
return self.from_base_ring_from_one_basis(x)
|
|
592
|
+
|
|
593
|
+
def _coerce_map_from_(self, R):
|
|
594
|
+
r"""
|
|
595
|
+
Return whether there is a coercion from ``R`` into ``self``.
|
|
596
|
+
|
|
597
|
+
INPUT:
|
|
598
|
+
|
|
599
|
+
- ``R`` -- a commutative ring
|
|
600
|
+
|
|
601
|
+
The things that coerce into ``self`` are
|
|
602
|
+
|
|
603
|
+
- Integer-Valued Polynomial Rings over a base
|
|
604
|
+
with a coercion map into ``self.base_ring()``.
|
|
605
|
+
|
|
606
|
+
- Anything with a coercion into ``self.base_ring()``.
|
|
607
|
+
|
|
608
|
+
EXAMPLES::
|
|
609
|
+
|
|
610
|
+
sage: F = IntegerValuedPolynomialRing(GF(7)).S(); F
|
|
611
|
+
Integer-Valued Polynomial Ring over Finite Field of size 7
|
|
612
|
+
in the shifted basis
|
|
613
|
+
|
|
614
|
+
Elements of the integer-valued polynomial ring canonically
|
|
615
|
+
coerce in::
|
|
616
|
+
|
|
617
|
+
sage: x = F.gen()
|
|
618
|
+
sage: F.coerce(x*x) # indirect doctest
|
|
619
|
+
6*S[1] + 2*S[2]
|
|
620
|
+
|
|
621
|
+
Elements of the integers coerce in, since there is a coerce map
|
|
622
|
+
from `\ZZ` to `\GF(7)`::
|
|
623
|
+
|
|
624
|
+
sage: F.coerce(1) # indirect doctest
|
|
625
|
+
S[0]
|
|
626
|
+
|
|
627
|
+
There is no coerce map from `\QQ` to `\GF{7}`::
|
|
628
|
+
|
|
629
|
+
sage: F.coerce(2/3) # indirect doctest
|
|
630
|
+
Traceback (most recent call last):
|
|
631
|
+
...
|
|
632
|
+
TypeError: no canonical coercion from Rational Field to
|
|
633
|
+
Integer-Valued Polynomial Ring over Finite Field of size 7
|
|
634
|
+
in the shifted basis
|
|
635
|
+
|
|
636
|
+
Elements of the base ring coerce in::
|
|
637
|
+
|
|
638
|
+
sage: F.coerce(GF(7)(5))
|
|
639
|
+
5*S[0]
|
|
640
|
+
|
|
641
|
+
The integer-valued polynomial ring over `\ZZ` on `x` coerces in,
|
|
642
|
+
since `\ZZ` coerces to `\GF{7}`::
|
|
643
|
+
|
|
644
|
+
sage: G = IntegerValuedPolynomialRing(ZZ).S()
|
|
645
|
+
sage: Gx = G.gen()
|
|
646
|
+
sage: z = F.coerce(Gx**2); z
|
|
647
|
+
-S[1] + 2*S[2]
|
|
648
|
+
sage: z.parent() is F
|
|
649
|
+
True
|
|
650
|
+
|
|
651
|
+
However, `\GF{7}` does not coerce to `\ZZ`, so the
|
|
652
|
+
integer-valued polynomial algebra over `\GF{7}` does not
|
|
653
|
+
coerce to the one over `\ZZ`::
|
|
654
|
+
|
|
655
|
+
sage: G.coerce(x^3+x)
|
|
656
|
+
Traceback (most recent call last):
|
|
657
|
+
...
|
|
658
|
+
TypeError: no canonical coercion from Integer-Valued Polynomial
|
|
659
|
+
Ring over Finite Field of size 7 in the shifted basis
|
|
660
|
+
to Integer-Valued Polynomial
|
|
661
|
+
Ring over Integer Ring in the shifted basis
|
|
662
|
+
|
|
663
|
+
TESTS::
|
|
664
|
+
|
|
665
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
666
|
+
sage: G = IntegerValuedPolynomialRing(QQ).S()
|
|
667
|
+
sage: H = IntegerValuedPolynomialRing(ZZ).S()
|
|
668
|
+
sage: F._coerce_map_from_(G)
|
|
669
|
+
False
|
|
670
|
+
sage: G._coerce_map_from_(F)
|
|
671
|
+
True
|
|
672
|
+
sage: F._coerce_map_from_(H)
|
|
673
|
+
True
|
|
674
|
+
sage: F._coerce_map_from_(QQ)
|
|
675
|
+
False
|
|
676
|
+
sage: G._coerce_map_from_(QQ)
|
|
677
|
+
True
|
|
678
|
+
sage: F.has_coerce_map_from(PolynomialRing(ZZ,'x'))
|
|
679
|
+
False
|
|
680
|
+
"""
|
|
681
|
+
# integer-valued polynomial rings over any base
|
|
682
|
+
# that coerces in:
|
|
683
|
+
if isinstance(R, IntegerValuedPolynomialRing.Shifted):
|
|
684
|
+
return self.base_ring().has_coerce_map_from(R.base_ring())
|
|
685
|
+
if isinstance(R, IntegerValuedPolynomialRing.Binomial):
|
|
686
|
+
return R.module_morphism(self._from_binomial_basis,
|
|
687
|
+
codomain=self)
|
|
688
|
+
return self.base_ring().has_coerce_map_from(R)
|
|
689
|
+
|
|
690
|
+
def _poly(self, i):
|
|
691
|
+
"""
|
|
692
|
+
Convert the basis element `S[i]` to a polynomial.
|
|
693
|
+
|
|
694
|
+
INPUT:
|
|
695
|
+
|
|
696
|
+
- ``i`` -- integer
|
|
697
|
+
|
|
698
|
+
EXAMPLES::
|
|
699
|
+
|
|
700
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
701
|
+
sage: F._poly(4)
|
|
702
|
+
1/24*x^4 + 5/12*x^3 + 35/24*x^2 + 25/12*x + 1
|
|
703
|
+
"""
|
|
704
|
+
x = polygen(QQ, 'x')
|
|
705
|
+
return binomial(x + i, i)
|
|
706
|
+
|
|
707
|
+
class Element(CombinatorialFreeModule.Element):
|
|
708
|
+
|
|
709
|
+
def umbra(self):
|
|
710
|
+
"""
|
|
711
|
+
Return the Bernoulli umbra.
|
|
712
|
+
|
|
713
|
+
This is the derivative at `-1` of the shift by one.
|
|
714
|
+
|
|
715
|
+
This is related to Bernoulli numbers.
|
|
716
|
+
|
|
717
|
+
.. SEEALSO:: :meth:`derivative_at_minus_one`
|
|
718
|
+
|
|
719
|
+
EXAMPLES::
|
|
720
|
+
|
|
721
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
722
|
+
sage: B = F.gen()
|
|
723
|
+
sage: (B+1).umbra()
|
|
724
|
+
3/2
|
|
725
|
+
|
|
726
|
+
TESTS::
|
|
727
|
+
|
|
728
|
+
sage: [(B**n).umbra() for n in range(1, 11)]
|
|
729
|
+
[1/2, 1/6, 0, -1/30, 0, 1/42, 0, -1/30, 0, 5/66]
|
|
730
|
+
"""
|
|
731
|
+
return self.shift().derivative_at_minus_one()
|
|
732
|
+
|
|
733
|
+
def delta(self):
|
|
734
|
+
r"""
|
|
735
|
+
Return the image by the difference operator `\Delta`.
|
|
736
|
+
|
|
737
|
+
The operator `\Delta` is defined on polynomials by
|
|
738
|
+
|
|
739
|
+
.. MATH::
|
|
740
|
+
|
|
741
|
+
f \mapsto f(x+1)-f(x).
|
|
742
|
+
|
|
743
|
+
EXAMPLES::
|
|
744
|
+
|
|
745
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
746
|
+
sage: S = F.basis()
|
|
747
|
+
sage: S[5].delta()
|
|
748
|
+
S[0] + S[1] + S[2] + S[3] + S[4]
|
|
749
|
+
"""
|
|
750
|
+
return self.variable_shift() - self
|
|
751
|
+
|
|
752
|
+
def variable_shift(self, k=1):
|
|
753
|
+
r"""
|
|
754
|
+
Return the image by the shift of variables.
|
|
755
|
+
|
|
756
|
+
On polynomials, the action is the shift
|
|
757
|
+
on variables `x \mapsto x + k`.
|
|
758
|
+
|
|
759
|
+
INPUT:
|
|
760
|
+
|
|
761
|
+
- ``k`` -- integer (default: 1)
|
|
762
|
+
|
|
763
|
+
EXAMPLES::
|
|
764
|
+
|
|
765
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
766
|
+
sage: S = A.basis()
|
|
767
|
+
sage: S[5].variable_shift()
|
|
768
|
+
S[0] + S[1] + S[2] + S[3] + S[4] + S[5]
|
|
769
|
+
|
|
770
|
+
sage: S[5].variable_shift(-1)
|
|
771
|
+
-S[4] + S[5]
|
|
772
|
+
|
|
773
|
+
TESTS::
|
|
774
|
+
|
|
775
|
+
sage: S[5].variable_shift(0)
|
|
776
|
+
S[5]
|
|
777
|
+
sage: S[5].variable_shift().variable_shift(-1)
|
|
778
|
+
S[5]
|
|
779
|
+
sage: S[5].variable_shift(2).variable_shift(-2)
|
|
780
|
+
S[5]
|
|
781
|
+
"""
|
|
782
|
+
if k == 0:
|
|
783
|
+
return self
|
|
784
|
+
|
|
785
|
+
A = self.parent()
|
|
786
|
+
|
|
787
|
+
def on_basis(n):
|
|
788
|
+
return {A._indices(j): binomial(k + n - 1 - j, n - j)
|
|
789
|
+
for j in range(n + 1)}
|
|
790
|
+
|
|
791
|
+
mc = self._monomial_coefficients
|
|
792
|
+
ret = linear_combination((on_basis(index), coeff)
|
|
793
|
+
for index, coeff in mc.items())
|
|
794
|
+
return A.element_class(A, ret)
|
|
795
|
+
|
|
796
|
+
def derivative_at_minus_one(self):
|
|
797
|
+
"""
|
|
798
|
+
Return the derivative at `-1`.
|
|
799
|
+
|
|
800
|
+
This is sometimes useful when `-1` is a root.
|
|
801
|
+
|
|
802
|
+
.. SEEALSO:: :meth:`umbra`
|
|
803
|
+
|
|
804
|
+
EXAMPLES::
|
|
805
|
+
|
|
806
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).S()
|
|
807
|
+
sage: B = F.gen()
|
|
808
|
+
sage: (B+1).derivative_at_minus_one()
|
|
809
|
+
1
|
|
810
|
+
"""
|
|
811
|
+
return QQ.sum(c / QQ(i) for i, c in self if i)
|
|
812
|
+
|
|
813
|
+
def h_vector(self):
|
|
814
|
+
"""
|
|
815
|
+
Return the numerator of the generating series of values.
|
|
816
|
+
|
|
817
|
+
If ``self`` is an Ehrhart polynomial, this is the `h`-vector.
|
|
818
|
+
|
|
819
|
+
.. SEEALSO:: :meth:`h_polynomial`, :meth:`fraction`
|
|
820
|
+
|
|
821
|
+
EXAMPLES::
|
|
822
|
+
|
|
823
|
+
sage: x = polygen(QQ,'x')
|
|
824
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
825
|
+
sage: ex = A.from_polynomial((1+x)**3)
|
|
826
|
+
sage: ex.h_vector()
|
|
827
|
+
(0, 1, 4, 1)
|
|
828
|
+
"""
|
|
829
|
+
d = max(self.support(), default=-1)
|
|
830
|
+
m = matrix(QQ, d + 1, d + 1,
|
|
831
|
+
lambda j, i: (-1)**(d - j) * (d - i).binomial(d - j))
|
|
832
|
+
v = vector(QQ, [self.coefficient(i) for i in range(d + 1)])
|
|
833
|
+
return m * v
|
|
834
|
+
|
|
835
|
+
def h_polynomial(self):
|
|
836
|
+
"""
|
|
837
|
+
Return the `h`-vector as a polynomial.
|
|
838
|
+
|
|
839
|
+
.. SEEALSO:: :meth:`h_vector`, :meth:`fraction`
|
|
840
|
+
|
|
841
|
+
EXAMPLES::
|
|
842
|
+
|
|
843
|
+
sage: x = polygen(QQ,'x')
|
|
844
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
845
|
+
sage: ex = A.from_polynomial((1+x)**3)
|
|
846
|
+
sage: ex.h_polynomial()
|
|
847
|
+
z^2 + 4*z + 1
|
|
848
|
+
"""
|
|
849
|
+
anneau = PolynomialRing(self.parent().base_ring(), 'z')
|
|
850
|
+
return anneau(list(reversed(self.h_vector())))
|
|
851
|
+
|
|
852
|
+
def fraction(self):
|
|
853
|
+
"""
|
|
854
|
+
Return the generating series of values as a fraction.
|
|
855
|
+
|
|
856
|
+
In the case of Ehrhart polynomials, this is known as
|
|
857
|
+
the Ehrhart series.
|
|
858
|
+
|
|
859
|
+
.. SEEALSO:: :meth:`h_vector`, :meth:`h_polynomial`
|
|
860
|
+
|
|
861
|
+
EXAMPLES::
|
|
862
|
+
|
|
863
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).S()
|
|
864
|
+
sage: ex = A.monomial(4)
|
|
865
|
+
sage: f = ex.fraction();f
|
|
866
|
+
1/(-t^5 + 5*t^4 - 10*t^3 + 10*t^2 - 5*t + 1)
|
|
867
|
+
|
|
868
|
+
sage: F = LazyPowerSeriesRing(QQ, 't') # needs sage.combinat
|
|
869
|
+
sage: F(f) # needs sage.combinat
|
|
870
|
+
1 + 5*t + 15*t^2 + 35*t^3 + 70*t^4 + 126*t^5 + 210*t^6 + O(t^7)
|
|
871
|
+
|
|
872
|
+
sage: poly = ex.polynomial()
|
|
873
|
+
sage: [poly(i) for i in range(6)]
|
|
874
|
+
[1, 5, 15, 35, 70, 126]
|
|
875
|
+
|
|
876
|
+
sage: y = polygen(QQ, 'y')
|
|
877
|
+
sage: penta = A.from_polynomial(7/2*y^2 + 7/2*y + 1)
|
|
878
|
+
sage: penta.fraction()
|
|
879
|
+
(t^2 + 5*t + 1)/(-t^3 + 3*t^2 - 3*t + 1)
|
|
880
|
+
|
|
881
|
+
TESTS::
|
|
882
|
+
|
|
883
|
+
sage: A.zero().fraction()
|
|
884
|
+
0
|
|
885
|
+
sage: A.zero().fraction().parent()
|
|
886
|
+
Fraction Field of Univariate Polynomial Ring in t over Integer Ring
|
|
887
|
+
"""
|
|
888
|
+
v = self.h_vector()
|
|
889
|
+
d = len(v)
|
|
890
|
+
ring_t = PolynomialRing(self.parent().base_ring(), 't')
|
|
891
|
+
t = ring_t.gen()
|
|
892
|
+
numer = ring_t({d - 1 - i: v[i] for i in range(d)})
|
|
893
|
+
return numer / (1 - t)**d
|
|
894
|
+
|
|
895
|
+
S = Shifted
|
|
896
|
+
|
|
897
|
+
# ===== Another basis for the same algebra =====
|
|
898
|
+
|
|
899
|
+
class Binomial(CombinatorialFreeModule, BindableClass):
|
|
900
|
+
r"""
|
|
901
|
+
The integer-valued polynomial ring in the binomial basis.
|
|
902
|
+
|
|
903
|
+
The basis used here is given by `B[i] = \binom{x}{i}` for `i \in \NN`.
|
|
904
|
+
|
|
905
|
+
Assuming `n_1 \leq n_2`, the product of two monomials `B[n_1] \cdot B[n_2]`
|
|
906
|
+
is given by the sum
|
|
907
|
+
|
|
908
|
+
.. MATH::
|
|
909
|
+
|
|
910
|
+
\sum_{k=0}^{n_1} \binom{n_1}{k}\binom{n_1+n_2-k}{n_1} B[n_1 + n_2 - k].
|
|
911
|
+
|
|
912
|
+
The product of two monomials is therefore a positive linear combination
|
|
913
|
+
of monomials.
|
|
914
|
+
|
|
915
|
+
EXAMPLES::
|
|
916
|
+
|
|
917
|
+
sage: F = IntegerValuedPolynomialRing(QQ).B(); F
|
|
918
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
919
|
+
in the binomial basis
|
|
920
|
+
|
|
921
|
+
sage: F.gen()
|
|
922
|
+
B[1]
|
|
923
|
+
|
|
924
|
+
sage: S = IntegerValuedPolynomialRing(ZZ).B(); S
|
|
925
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
926
|
+
in the binomial basis
|
|
927
|
+
sage: S.base_ring()
|
|
928
|
+
Integer Ring
|
|
929
|
+
|
|
930
|
+
sage: G = IntegerValuedPolynomialRing(S).B(); G
|
|
931
|
+
Integer-Valued Polynomial Ring over Integer-Valued Polynomial Ring
|
|
932
|
+
over Integer Ring in the binomial basis in the binomial basis
|
|
933
|
+
sage: G.base_ring()
|
|
934
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
935
|
+
in the binomial basis
|
|
936
|
+
|
|
937
|
+
Integer-valued polynomial rings commute with their base ring::
|
|
938
|
+
|
|
939
|
+
sage: K = IntegerValuedPolynomialRing(QQ).B()
|
|
940
|
+
sage: a = K.gen()
|
|
941
|
+
sage: K.is_commutative()
|
|
942
|
+
True
|
|
943
|
+
sage: L = IntegerValuedPolynomialRing(K).B()
|
|
944
|
+
sage: c = L.gen()
|
|
945
|
+
sage: L.is_commutative()
|
|
946
|
+
True
|
|
947
|
+
sage: s = a * c^3; s
|
|
948
|
+
B[1]*B[1] + 6*B[1]*B[2] + 6*B[1]*B[3]
|
|
949
|
+
sage: parent(s)
|
|
950
|
+
Integer-Valued Polynomial Ring over Integer-Valued Polynomial
|
|
951
|
+
Ring over Rational Field in the binomial basis in the binomial basis
|
|
952
|
+
|
|
953
|
+
Integer-valued polynomial rings are commutative::
|
|
954
|
+
|
|
955
|
+
sage: c^3 * a == c * a * c * c
|
|
956
|
+
True
|
|
957
|
+
|
|
958
|
+
We can also manipulate elements in the basis::
|
|
959
|
+
|
|
960
|
+
sage: F = IntegerValuedPolynomialRing(QQ).B()
|
|
961
|
+
sage: B = F.basis()
|
|
962
|
+
sage: B[2] * B[3]
|
|
963
|
+
3*B[3] + 12*B[4] + 10*B[5]
|
|
964
|
+
sage: 1 - B[2] * B[2] / 2
|
|
965
|
+
B[0] - 1/2*B[2] - 3*B[3] - 3*B[4]
|
|
966
|
+
|
|
967
|
+
and coerce elements from our base field::
|
|
968
|
+
|
|
969
|
+
sage: F(4/3)
|
|
970
|
+
4/3*B[0]
|
|
971
|
+
"""
|
|
972
|
+
def __init__(self, A) -> None:
|
|
973
|
+
r"""
|
|
974
|
+
Initialize ``self``.
|
|
975
|
+
|
|
976
|
+
EXAMPLES::
|
|
977
|
+
|
|
978
|
+
sage: F = IntegerValuedPolynomialRing(QQ).B(); F
|
|
979
|
+
Integer-Valued Polynomial Ring over Rational Field
|
|
980
|
+
in the binomial basis
|
|
981
|
+
sage: TestSuite(F).run()
|
|
982
|
+
"""
|
|
983
|
+
CombinatorialFreeModule.__init__(self, A.base_ring(),
|
|
984
|
+
NonNegativeIntegers(),
|
|
985
|
+
latex_prefix='',
|
|
986
|
+
category=A.Bases())
|
|
987
|
+
|
|
988
|
+
def _realization_name(self) -> str:
|
|
989
|
+
r"""
|
|
990
|
+
TESTS::
|
|
991
|
+
|
|
992
|
+
sage: F = IntegerValuedPolynomialRing(QQ).B()
|
|
993
|
+
sage: F._realization_name()
|
|
994
|
+
'binomial'
|
|
995
|
+
"""
|
|
996
|
+
return "binomial"
|
|
997
|
+
|
|
998
|
+
def product_on_basis(self, n1, n2):
|
|
999
|
+
r"""
|
|
1000
|
+
Return the product of basis elements ``n1`` and ``n2``.
|
|
1001
|
+
|
|
1002
|
+
INPUT:
|
|
1003
|
+
|
|
1004
|
+
- ``n1``, ``n2`` -- integers
|
|
1005
|
+
|
|
1006
|
+
EXAMPLES::
|
|
1007
|
+
|
|
1008
|
+
sage: A = IntegerValuedPolynomialRing(QQ).B()
|
|
1009
|
+
sage: A.product_on_basis(0, 1)
|
|
1010
|
+
B[1]
|
|
1011
|
+
sage: A.product_on_basis(1, 2)
|
|
1012
|
+
2*B[2] + 3*B[3]
|
|
1013
|
+
"""
|
|
1014
|
+
i = ZZ(n1)
|
|
1015
|
+
j = ZZ(n2)
|
|
1016
|
+
if j < i:
|
|
1017
|
+
j, i = i, j
|
|
1018
|
+
|
|
1019
|
+
R = self.base_ring()
|
|
1020
|
+
return self._from_dict({i + j - k:
|
|
1021
|
+
R(binomial(i, k) * binomial(i + j - k, i))
|
|
1022
|
+
for k in range(i + 1)})
|
|
1023
|
+
|
|
1024
|
+
def _from_shifted_basis(self, i):
|
|
1025
|
+
"""
|
|
1026
|
+
Convert from the shifted binomial(x+k,k) basis.
|
|
1027
|
+
|
|
1028
|
+
INPUT:
|
|
1029
|
+
|
|
1030
|
+
- ``i`` -- integer
|
|
1031
|
+
|
|
1032
|
+
EXAMPLES::
|
|
1033
|
+
|
|
1034
|
+
sage: S = IntegerValuedPolynomialRing(ZZ).S()
|
|
1035
|
+
sage: B = IntegerValuedPolynomialRing(ZZ).B()
|
|
1036
|
+
sage: s = S.basis()
|
|
1037
|
+
sage: B(s[3]+1) # indirect doctest
|
|
1038
|
+
2*B[0] + 3*B[1] + 3*B[2] + B[3]
|
|
1039
|
+
sage: S(_)
|
|
1040
|
+
S[0] + S[3]
|
|
1041
|
+
"""
|
|
1042
|
+
i = ZZ(i)
|
|
1043
|
+
R = self.base_ring()
|
|
1044
|
+
return self._from_dict({k: R(i.binomial(k))
|
|
1045
|
+
for k in range(i + 1)})
|
|
1046
|
+
|
|
1047
|
+
def _element_constructor_(self, x):
|
|
1048
|
+
r"""
|
|
1049
|
+
Convert ``x`` into ``self``.
|
|
1050
|
+
|
|
1051
|
+
EXAMPLES::
|
|
1052
|
+
|
|
1053
|
+
sage: R = IntegerValuedPolynomialRing(QQ).B()
|
|
1054
|
+
sage: x = R.gen()
|
|
1055
|
+
sage: R(3)
|
|
1056
|
+
3*B[0]
|
|
1057
|
+
sage: R(x)
|
|
1058
|
+
B[1]
|
|
1059
|
+
"""
|
|
1060
|
+
P = x.parent()
|
|
1061
|
+
if isinstance(P, IntegerValuedPolynomialRing.Binomial):
|
|
1062
|
+
if P is self:
|
|
1063
|
+
return x
|
|
1064
|
+
if P is not self.base_ring():
|
|
1065
|
+
return self.element_class(self, x.monomial_coefficients())
|
|
1066
|
+
|
|
1067
|
+
# ok, not a integer-valued polynomial ring element
|
|
1068
|
+
R = self.base_ring()
|
|
1069
|
+
# coercion via base ring
|
|
1070
|
+
x = R(x)
|
|
1071
|
+
if x == 0:
|
|
1072
|
+
return self.element_class(self, {})
|
|
1073
|
+
return self.from_base_ring_from_one_basis(x)
|
|
1074
|
+
|
|
1075
|
+
def _coerce_map_from_(self, R):
|
|
1076
|
+
r"""
|
|
1077
|
+
Return whether there is a coercion from ``R`` into ``self``.
|
|
1078
|
+
|
|
1079
|
+
INPUT:
|
|
1080
|
+
|
|
1081
|
+
- ``R`` -- a commutative ring
|
|
1082
|
+
|
|
1083
|
+
The things that coerce into ``self`` are
|
|
1084
|
+
|
|
1085
|
+
- Integer-Valued Polynomial Rings over a base
|
|
1086
|
+
with a coercion map into ``self.base_ring()``.
|
|
1087
|
+
|
|
1088
|
+
- Anything with a coercion into ``self.base_ring()``.
|
|
1089
|
+
|
|
1090
|
+
EXAMPLES::
|
|
1091
|
+
|
|
1092
|
+
sage: F = IntegerValuedPolynomialRing(GF(7)).B(); F
|
|
1093
|
+
Integer-Valued Polynomial Ring over Finite Field of size 7
|
|
1094
|
+
in the binomial basis
|
|
1095
|
+
|
|
1096
|
+
Elements of the integer-valued polynomial ring canonically coerce
|
|
1097
|
+
in::
|
|
1098
|
+
|
|
1099
|
+
sage: x = F.gen()
|
|
1100
|
+
sage: F.coerce(x*x) # indirect doctest
|
|
1101
|
+
B[1] + 2*B[2]
|
|
1102
|
+
|
|
1103
|
+
Elements of the integers coerce in, since there is a coerce map
|
|
1104
|
+
from `\ZZ` to `\GF(7)`::
|
|
1105
|
+
|
|
1106
|
+
sage: F.coerce(1) # indirect doctest
|
|
1107
|
+
B[0]
|
|
1108
|
+
|
|
1109
|
+
There is no coerce map from `\QQ` to `\GF{7}`::
|
|
1110
|
+
|
|
1111
|
+
sage: F.coerce(2/3) # indirect doctest
|
|
1112
|
+
Traceback (most recent call last):
|
|
1113
|
+
...
|
|
1114
|
+
TypeError: no canonical coercion from Rational Field to
|
|
1115
|
+
Integer-Valued Polynomial Ring over Finite Field of size 7
|
|
1116
|
+
in the binomial basis
|
|
1117
|
+
|
|
1118
|
+
Elements of the base ring coerce in::
|
|
1119
|
+
|
|
1120
|
+
sage: F.coerce(GF(7)(5))
|
|
1121
|
+
5*B[0]
|
|
1122
|
+
|
|
1123
|
+
The integer-valued polynomial ring over `\ZZ` on `x` coerces in,
|
|
1124
|
+
since `\ZZ` coerces to `\GF{7}`::
|
|
1125
|
+
|
|
1126
|
+
sage: G = IntegerValuedPolynomialRing(ZZ).B()
|
|
1127
|
+
sage: Gx = G.gen()
|
|
1128
|
+
sage: z = F.coerce(Gx**2); z
|
|
1129
|
+
B[1] + 2*B[2]
|
|
1130
|
+
sage: z.parent() is F
|
|
1131
|
+
True
|
|
1132
|
+
|
|
1133
|
+
However, `\GF{7}` does not coerce to `\ZZ`, so the
|
|
1134
|
+
integer-valued polynomial algebra over `\GF{7}` does not
|
|
1135
|
+
coerce to the one over `\ZZ`::
|
|
1136
|
+
|
|
1137
|
+
sage: G.coerce(x^3+x)
|
|
1138
|
+
Traceback (most recent call last):
|
|
1139
|
+
...
|
|
1140
|
+
TypeError: no canonical coercion from Integer-Valued Polynomial
|
|
1141
|
+
Ring over Finite Field of size 7 in the binomial basis to
|
|
1142
|
+
Integer-Valued Polynomial Ring over Integer Ring
|
|
1143
|
+
in the binomial basis
|
|
1144
|
+
|
|
1145
|
+
TESTS::
|
|
1146
|
+
|
|
1147
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
1148
|
+
sage: G = IntegerValuedPolynomialRing(QQ).B()
|
|
1149
|
+
sage: H = IntegerValuedPolynomialRing(ZZ).B()
|
|
1150
|
+
sage: F._coerce_map_from_(G)
|
|
1151
|
+
False
|
|
1152
|
+
sage: G._coerce_map_from_(F)
|
|
1153
|
+
True
|
|
1154
|
+
sage: F._coerce_map_from_(H)
|
|
1155
|
+
True
|
|
1156
|
+
sage: F._coerce_map_from_(QQ)
|
|
1157
|
+
False
|
|
1158
|
+
sage: G._coerce_map_from_(QQ)
|
|
1159
|
+
True
|
|
1160
|
+
sage: F.has_coerce_map_from(PolynomialRing(ZZ,'x'))
|
|
1161
|
+
False
|
|
1162
|
+
"""
|
|
1163
|
+
# integer-valued polynomial rings over any base
|
|
1164
|
+
# that coerces in:
|
|
1165
|
+
if isinstance(R, IntegerValuedPolynomialRing.Binomial):
|
|
1166
|
+
return self.base_ring().has_coerce_map_from(R.base_ring())
|
|
1167
|
+
if isinstance(R, IntegerValuedPolynomialRing.Shifted):
|
|
1168
|
+
return R.module_morphism(self._from_shifted_basis,
|
|
1169
|
+
codomain=self)
|
|
1170
|
+
return self.base_ring().has_coerce_map_from(R)
|
|
1171
|
+
|
|
1172
|
+
def _poly(self, i):
|
|
1173
|
+
"""
|
|
1174
|
+
Convert the basis element `B[i]` to a polynomial.
|
|
1175
|
+
|
|
1176
|
+
INPUT:
|
|
1177
|
+
|
|
1178
|
+
- ``i`` -- integer
|
|
1179
|
+
|
|
1180
|
+
EXAMPLES::
|
|
1181
|
+
|
|
1182
|
+
sage: F = IntegerValuedPolynomialRing(ZZ).B()
|
|
1183
|
+
sage: F._poly(4)
|
|
1184
|
+
1/24*x^4 - 1/4*x^3 + 11/24*x^2 - 1/4*x
|
|
1185
|
+
"""
|
|
1186
|
+
x = polygen(QQ, 'x')
|
|
1187
|
+
return binomial(x, i)
|
|
1188
|
+
|
|
1189
|
+
class Element(CombinatorialFreeModule.Element):
|
|
1190
|
+
def variable_shift(self, k=1):
|
|
1191
|
+
r"""
|
|
1192
|
+
Return the image by the shift of variables.
|
|
1193
|
+
|
|
1194
|
+
On polynomials, the action is the shift
|
|
1195
|
+
on variables `x \mapsto x + k`.
|
|
1196
|
+
|
|
1197
|
+
INPUT:
|
|
1198
|
+
|
|
1199
|
+
- ``k`` -- integer (default: 1)
|
|
1200
|
+
|
|
1201
|
+
EXAMPLES::
|
|
1202
|
+
|
|
1203
|
+
sage: A = IntegerValuedPolynomialRing(ZZ).B()
|
|
1204
|
+
sage: B = A.basis()
|
|
1205
|
+
sage: B[5].variable_shift()
|
|
1206
|
+
B[4] + B[5]
|
|
1207
|
+
sage: B[5].variable_shift(-1)
|
|
1208
|
+
-B[0] + B[1] - B[2] + B[3] - B[4] + B[5]
|
|
1209
|
+
|
|
1210
|
+
TESTS::
|
|
1211
|
+
|
|
1212
|
+
sage: B[5].variable_shift(0)
|
|
1213
|
+
B[5]
|
|
1214
|
+
sage: B[5].variable_shift().variable_shift(-1)
|
|
1215
|
+
B[5]
|
|
1216
|
+
"""
|
|
1217
|
+
if k == 0:
|
|
1218
|
+
return self
|
|
1219
|
+
A = self.parent()
|
|
1220
|
+
|
|
1221
|
+
def on_basis(n):
|
|
1222
|
+
return {A._indices(j): binomial(k, n - j)
|
|
1223
|
+
for j in range(n + 1)}
|
|
1224
|
+
|
|
1225
|
+
mc = self._monomial_coefficients
|
|
1226
|
+
ret = linear_combination((on_basis(index), coeff)
|
|
1227
|
+
for index, coeff in mc.items())
|
|
1228
|
+
return A.element_class(A, ret)
|
|
1229
|
+
|
|
1230
|
+
B = Binomial
|