passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_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-singular might be problematic. Click here for more details.
- PySingular.cpython-314-x86_64-linux-gnu.so +0 -0
- passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
- passagemath_singular-10.6.31rc3.dist-info/RECORD +491 -0
- passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
- passagemath_singular.libs/libSingular-4-20aec911.4.1.so +0 -0
- passagemath_singular.libs/libcddgmp-21acf0c6.so.0.1.3 +0 -0
- passagemath_singular.libs/libfactory-4-fcee31da.4.1.so +0 -0
- passagemath_singular.libs/libflint-66e12231.so.21.0.0 +0 -0
- passagemath_singular.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
- passagemath_singular.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_singular.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_singular.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_singular.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_singular.libs/libntl-e6f0d543.so.44.0.1 +0 -0
- passagemath_singular.libs/libomalloc-0-5c9e866e.9.6.so +0 -0
- passagemath_singular.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_singular.libs/libpolys-4-5c0a87e0.4.1.so +0 -0
- passagemath_singular.libs/libquadmath-2284e583.so.0.0.0 +0 -0
- passagemath_singular.libs/libreadline-ea270e21.so.8.2 +0 -0
- passagemath_singular.libs/libsingular_resources-4-a1aafc6d.4.1.so +0 -0
- passagemath_singular.libs/libtinfo-ceb117d9.so.6.3 +0 -0
- sage/algebras/all__sagemath_singular.py +3 -0
- sage/algebras/fusion_rings/all.py +19 -0
- sage/algebras/fusion_rings/f_matrix.py +2448 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
- sage/algebras/fusion_rings/fusion_double.py +899 -0
- sage/algebras/fusion_rings/fusion_ring.py +1580 -0
- sage/algebras/fusion_rings/poly_tup_engine.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
- sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
- sage/algebras/fusion_rings/shm_managers.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/fusion_rings/shm_managers.pxd +24 -0
- sage/algebras/fusion_rings/shm_managers.pyx +780 -0
- sage/algebras/letterplace/all.py +1 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
- sage/algebras/letterplace/free_algebra_letterplace.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
- sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
- sage/algebras/letterplace/letterplace_ideal.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
- sage/algebras/quatalg/all.py +2 -0
- sage/algebras/quatalg/quaternion_algebra.py +4778 -0
- sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
- sage/algebras/quatalg/quaternion_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
- sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
- sage/all__sagemath_singular.py +11 -0
- sage/ext_data/all__sagemath_singular.py +1 -0
- sage/ext_data/singular/function_field/core.lib +98 -0
- sage/interfaces/all__sagemath_singular.py +1 -0
- sage/interfaces/singular.py +2835 -0
- sage/libs/all__sagemath_singular.py +1 -0
- sage/libs/singular/__init__.py +1 -0
- sage/libs/singular/decl.pxd +1168 -0
- sage/libs/singular/function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/function.pxd +87 -0
- sage/libs/singular/function.pyx +1901 -0
- sage/libs/singular/function_factory.py +61 -0
- sage/libs/singular/groebner_strategy.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/groebner_strategy.pxd +22 -0
- sage/libs/singular/groebner_strategy.pyx +582 -0
- sage/libs/singular/option.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/option.pyx +671 -0
- sage/libs/singular/polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/polynomial.pxd +39 -0
- sage/libs/singular/polynomial.pyx +661 -0
- sage/libs/singular/ring.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/ring.pxd +58 -0
- sage/libs/singular/ring.pyx +893 -0
- sage/libs/singular/singular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/singular/singular.pxd +72 -0
- sage/libs/singular/singular.pyx +1944 -0
- sage/libs/singular/standard_options.py +145 -0
- sage/matrix/all__sagemath_singular.py +1 -0
- sage/matrix/matrix_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
- sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
- sage/rings/all__sagemath_singular.py +1 -0
- sage/rings/function_field/all__sagemath_singular.py +1 -0
- sage/rings/function_field/derivations_polymod.py +911 -0
- sage/rings/function_field/element_polymod.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/element_polymod.pyx +406 -0
- sage/rings/function_field/function_field_polymod.py +2611 -0
- sage/rings/function_field/ideal_polymod.py +1775 -0
- sage/rings/function_field/order_polymod.py +1475 -0
- sage/rings/function_field/place_polymod.py +681 -0
- sage/rings/polynomial/all__sagemath_singular.py +1 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
- sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
- sage/rings/polynomial/plural.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/plural.pxd +48 -0
- sage/rings/polynomial/plural.pyx +3171 -0
- sage/symbolic/all__sagemath_singular.py +1 -0
- sage/symbolic/comparison_impl.pxi +428 -0
- sage/symbolic/constants_c_impl.pxi +178 -0
- sage/symbolic/expression.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/symbolic/expression.pxd +7 -0
- sage/symbolic/expression.pyx +14200 -0
- sage/symbolic/getitem_impl.pxi +202 -0
- sage/symbolic/pynac.pxi +572 -0
- sage/symbolic/pynac_constant_impl.pxi +133 -0
- sage/symbolic/pynac_function_impl.pxi +206 -0
- sage/symbolic/pynac_impl.pxi +2576 -0
- sage/symbolic/pynac_wrap.h +124 -0
- sage/symbolic/series_impl.pxi +272 -0
- sage/symbolic/substitution_map_impl.pxi +94 -0
- sage_wheels/bin/ESingular +0 -0
- sage_wheels/bin/Singular +0 -0
- sage_wheels/bin/TSingular +0 -0
- sage_wheels/lib/singular/MOD/cohomo.la +41 -0
- sage_wheels/lib/singular/MOD/cohomo.so +0 -0
- sage_wheels/lib/singular/MOD/customstd.la +41 -0
- sage_wheels/lib/singular/MOD/customstd.so +0 -0
- sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
- sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
- sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
- sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
- sage_wheels/lib/singular/MOD/gitfan.la +41 -0
- sage_wheels/lib/singular/MOD/gitfan.so +0 -0
- sage_wheels/lib/singular/MOD/interval.la +41 -0
- sage_wheels/lib/singular/MOD/interval.so +0 -0
- sage_wheels/lib/singular/MOD/loctriv.la +41 -0
- sage_wheels/lib/singular/MOD/loctriv.so +0 -0
- sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
- sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
- sage_wheels/lib/singular/MOD/partialgb.la +41 -0
- sage_wheels/lib/singular/MOD/partialgb.so +0 -0
- sage_wheels/lib/singular/MOD/pyobject.la +41 -0
- sage_wheels/lib/singular/MOD/pyobject.so +0 -0
- sage_wheels/lib/singular/MOD/singmathic.la +41 -0
- sage_wheels/lib/singular/MOD/singmathic.so +0 -0
- sage_wheels/lib/singular/MOD/sispasm.la +41 -0
- sage_wheels/lib/singular/MOD/sispasm.so +0 -0
- sage_wheels/lib/singular/MOD/subsets.la +41 -0
- sage_wheels/lib/singular/MOD/subsets.so +0 -0
- sage_wheels/lib/singular/MOD/systhreads.la +41 -0
- sage_wheels/lib/singular/MOD/systhreads.so +0 -0
- sage_wheels/lib/singular/MOD/syzextra.la +41 -0
- sage_wheels/lib/singular/MOD/syzextra.so +0 -0
- sage_wheels/libexec/singular/MOD/change_cost +0 -0
- sage_wheels/libexec/singular/MOD/singularsurf +11 -0
- sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
- sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
- sage_wheels/libexec/singular/MOD/solve_IP +0 -0
- sage_wheels/libexec/singular/MOD/surfex +16 -0
- sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
- sage_wheels/share/factory/gftables/10201 +342 -0
- sage_wheels/share/factory/gftables/1024 +37 -0
- sage_wheels/share/factory/gftables/10609 +356 -0
- sage_wheels/share/factory/gftables/11449 +384 -0
- sage_wheels/share/factory/gftables/11881 +398 -0
- sage_wheels/share/factory/gftables/121 +6 -0
- sage_wheels/share/factory/gftables/12167 +408 -0
- sage_wheels/share/factory/gftables/125 +7 -0
- sage_wheels/share/factory/gftables/12769 +428 -0
- sage_wheels/share/factory/gftables/128 +7 -0
- sage_wheels/share/factory/gftables/1331 +47 -0
- sage_wheels/share/factory/gftables/1369 +48 -0
- sage_wheels/share/factory/gftables/14641 +490 -0
- sage_wheels/share/factory/gftables/15625 +523 -0
- sage_wheels/share/factory/gftables/16 +3 -0
- sage_wheels/share/factory/gftables/16129 +540 -0
- sage_wheels/share/factory/gftables/16384 +549 -0
- sage_wheels/share/factory/gftables/16807 +563 -0
- sage_wheels/share/factory/gftables/1681 +58 -0
- sage_wheels/share/factory/gftables/169 +8 -0
- sage_wheels/share/factory/gftables/17161 +574 -0
- sage_wheels/share/factory/gftables/1849 +64 -0
- sage_wheels/share/factory/gftables/18769 +628 -0
- sage_wheels/share/factory/gftables/19321 +646 -0
- sage_wheels/share/factory/gftables/19683 +659 -0
- sage_wheels/share/factory/gftables/2048 +71 -0
- sage_wheels/share/factory/gftables/2187 +75 -0
- sage_wheels/share/factory/gftables/2197 +76 -0
- sage_wheels/share/factory/gftables/2209 +76 -0
- sage_wheels/share/factory/gftables/22201 +742 -0
- sage_wheels/share/factory/gftables/22801 +762 -0
- sage_wheels/share/factory/gftables/2401 +82 -0
- sage_wheels/share/factory/gftables/243 +11 -0
- sage_wheels/share/factory/gftables/24389 +815 -0
- sage_wheels/share/factory/gftables/24649 +824 -0
- sage_wheels/share/factory/gftables/25 +3 -0
- sage_wheels/share/factory/gftables/256 +11 -0
- sage_wheels/share/factory/gftables/26569 +888 -0
- sage_wheels/share/factory/gftables/27 +3 -0
- sage_wheels/share/factory/gftables/27889 +932 -0
- sage_wheels/share/factory/gftables/2809 +96 -0
- sage_wheels/share/factory/gftables/28561 +954 -0
- sage_wheels/share/factory/gftables/289 +12 -0
- sage_wheels/share/factory/gftables/29791 +995 -0
- sage_wheels/share/factory/gftables/29929 +1000 -0
- sage_wheels/share/factory/gftables/3125 +107 -0
- sage_wheels/share/factory/gftables/32 +4 -0
- sage_wheels/share/factory/gftables/32041 +1070 -0
- sage_wheels/share/factory/gftables/32761 +1094 -0
- sage_wheels/share/factory/gftables/32768 +1095 -0
- sage_wheels/share/factory/gftables/343 +14 -0
- sage_wheels/share/factory/gftables/3481 +118 -0
- sage_wheels/share/factory/gftables/361 +14 -0
- sage_wheels/share/factory/gftables/36481 +1218 -0
- sage_wheels/share/factory/gftables/3721 +126 -0
- sage_wheels/share/factory/gftables/37249 +1244 -0
- sage_wheels/share/factory/gftables/38809 +1296 -0
- sage_wheels/share/factory/gftables/39601 +1322 -0
- sage_wheels/share/factory/gftables/4 +3 -0
- sage_wheels/share/factory/gftables/4096 +139 -0
- sage_wheels/share/factory/gftables/44521 +1486 -0
- sage_wheels/share/factory/gftables/4489 +152 -0
- sage_wheels/share/factory/gftables/49 +4 -0
- sage_wheels/share/factory/gftables/4913 +166 -0
- sage_wheels/share/factory/gftables/49729 +1660 -0
- sage_wheels/share/factory/gftables/5041 +170 -0
- sage_wheels/share/factory/gftables/50653 +1691 -0
- sage_wheels/share/factory/gftables/512 +20 -0
- sage_wheels/share/factory/gftables/51529 +1720 -0
- sage_wheels/share/factory/gftables/52441 +1750 -0
- sage_wheels/share/factory/gftables/529 +20 -0
- sage_wheels/share/factory/gftables/5329 +180 -0
- sage_wheels/share/factory/gftables/54289 +1812 -0
- sage_wheels/share/factory/gftables/57121 +1906 -0
- sage_wheels/share/factory/gftables/58081 +1938 -0
- sage_wheels/share/factory/gftables/59049 +1971 -0
- sage_wheels/share/factory/gftables/6241 +210 -0
- sage_wheels/share/factory/gftables/625 +23 -0
- sage_wheels/share/factory/gftables/63001 +2102 -0
- sage_wheels/share/factory/gftables/64 +5 -0
- sage_wheels/share/factory/gftables/6561 +221 -0
- sage_wheels/share/factory/gftables/6859 +231 -0
- sage_wheels/share/factory/gftables/6889 +232 -0
- sage_wheels/share/factory/gftables/729 +27 -0
- sage_wheels/share/factory/gftables/7921 +266 -0
- sage_wheels/share/factory/gftables/8 +3 -0
- sage_wheels/share/factory/gftables/81 +5 -0
- sage_wheels/share/factory/gftables/8192 +276 -0
- sage_wheels/share/factory/gftables/841 +30 -0
- sage_wheels/share/factory/gftables/9 +3 -0
- sage_wheels/share/factory/gftables/9409 +316 -0
- sage_wheels/share/factory/gftables/961 +34 -0
- sage_wheels/share/info/singular.info +191898 -0
- sage_wheels/share/singular/LIB/GND.lib +1359 -0
- sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
- sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
- sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
- sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
- sage_wheels/share/singular/LIB/VecField.lib +1542 -0
- sage_wheels/share/singular/LIB/absfact.lib +959 -0
- sage_wheels/share/singular/LIB/ainvar.lib +730 -0
- sage_wheels/share/singular/LIB/aksaka.lib +419 -0
- sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
- sage_wheels/share/singular/LIB/algebra.lib +1193 -0
- sage_wheels/share/singular/LIB/all.lib +136 -0
- sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
- sage_wheels/share/singular/LIB/arnold.lib +4553 -0
- sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
- sage_wheels/share/singular/LIB/arr.lib +3486 -0
- sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
- sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
- sage_wheels/share/singular/LIB/bfun.lib +1964 -0
- sage_wheels/share/singular/LIB/bimodules.lib +774 -0
- sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
- sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
- sage_wheels/share/singular/LIB/central.lib +2169 -0
- sage_wheels/share/singular/LIB/chern.lib +4162 -0
- sage_wheels/share/singular/LIB/cimonom.lib +571 -0
- sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
- sage_wheels/share/singular/LIB/classify.lib +3239 -0
- sage_wheels/share/singular/LIB/classify2.lib +1462 -0
- sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
- sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
- sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
- sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
- sage_wheels/share/singular/LIB/combinat.lib +91 -0
- sage_wheels/share/singular/LIB/compregb.lib +276 -0
- sage_wheels/share/singular/LIB/control.lib +1636 -0
- sage_wheels/share/singular/LIB/crypto.lib +3795 -0
- sage_wheels/share/singular/LIB/curveInv.lib +667 -0
- sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
- sage_wheels/share/singular/LIB/customstd.lib +100 -0
- sage_wheels/share/singular/LIB/deRham.lib +5979 -0
- sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
- sage_wheels/share/singular/LIB/decomp.lib +1655 -0
- sage_wheels/share/singular/LIB/deflation.lib +872 -0
- sage_wheels/share/singular/LIB/deform.lib +925 -0
- sage_wheels/share/singular/LIB/difform.lib +3055 -0
- sage_wheels/share/singular/LIB/divisors.lib +750 -0
- sage_wheels/share/singular/LIB/dmod.lib +5817 -0
- sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
- sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
- sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
- sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
- sage_wheels/share/singular/LIB/dummy.lib +17 -0
- sage_wheels/share/singular/LIB/elim.lib +1009 -0
- sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
- sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
- sage_wheels/share/singular/LIB/equising.lib +2127 -0
- sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
- sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
- sage_wheels/share/singular/LIB/findifs.lib +778 -0
- sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
- sage_wheels/share/singular/LIB/finvar.lib +7989 -0
- sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
- sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
- sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
- sage_wheels/share/singular/LIB/freegb.lib +3853 -0
- sage_wheels/share/singular/LIB/general.lib +1350 -0
- sage_wheels/share/singular/LIB/gfan.lib +1768 -0
- sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
- sage_wheels/share/singular/LIB/gkdim.lib +99 -0
- sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
- sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
- sage_wheels/share/singular/LIB/goettsche.lib +909 -0
- sage_wheels/share/singular/LIB/graal.lib +1366 -0
- sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
- sage_wheels/share/singular/LIB/graphics.lib +360 -0
- sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
- sage_wheels/share/singular/LIB/groups.lib +1123 -0
- sage_wheels/share/singular/LIB/grwalk.lib +507 -0
- sage_wheels/share/singular/LIB/hdepth.lib +194 -0
- sage_wheels/share/singular/LIB/help.cnf +57 -0
- sage_wheels/share/singular/LIB/hess.lib +1946 -0
- sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
- sage_wheels/share/singular/LIB/hodge.lib +400 -0
- sage_wheels/share/singular/LIB/homolog.lib +1965 -0
- sage_wheels/share/singular/LIB/hyperel.lib +975 -0
- sage_wheels/share/singular/LIB/inout.lib +679 -0
- sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
- sage_wheels/share/singular/LIB/interval.lib +1418 -0
- sage_wheels/share/singular/LIB/intprog.lib +778 -0
- sage_wheels/share/singular/LIB/invar.lib +443 -0
- sage_wheels/share/singular/LIB/involut.lib +980 -0
- sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
- sage_wheels/share/singular/LIB/kskernel.lib +534 -0
- sage_wheels/share/singular/LIB/latex.lib +3146 -0
- sage_wheels/share/singular/LIB/lejeune.lib +651 -0
- sage_wheels/share/singular/LIB/linalg.lib +2040 -0
- sage_wheels/share/singular/LIB/locnormal.lib +212 -0
- sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
- sage_wheels/share/singular/LIB/makedbm.lib +294 -0
- sage_wheels/share/singular/LIB/mathml.lib +813 -0
- sage_wheels/share/singular/LIB/matrix.lib +1372 -0
- sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
- sage_wheels/share/singular/LIB/methods.lib +212 -0
- sage_wheels/share/singular/LIB/moddiq.lib +322 -0
- sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
- sage_wheels/share/singular/LIB/modnormal.lib +218 -0
- sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
- sage_wheels/share/singular/LIB/modquotient.lib +269 -0
- sage_wheels/share/singular/LIB/modstd.lib +1024 -0
- sage_wheels/share/singular/LIB/modular.lib +545 -0
- sage_wheels/share/singular/LIB/modules.lib +2561 -0
- sage_wheels/share/singular/LIB/modwalk.lib +609 -0
- sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
- sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
- sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
- sage_wheels/share/singular/LIB/mregular.lib +1863 -0
- sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
- sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
- sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
- sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
- sage_wheels/share/singular/LIB/ncall.lib +31 -0
- sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
- sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
- sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
- sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
- sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
- sage_wheels/share/singular/LIB/ncloc.lib +361 -0
- sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
- sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
- sage_wheels/share/singular/LIB/nctools.lib +1887 -0
- sage_wheels/share/singular/LIB/nets.lib +1456 -0
- sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
- sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
- sage_wheels/share/singular/LIB/noether.lib +1106 -0
- sage_wheels/share/singular/LIB/normal.lib +8700 -0
- sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
- sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
- sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
- sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
- sage_wheels/share/singular/LIB/olga.lib +1933 -0
- sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
- sage_wheels/share/singular/LIB/parallel.lib +319 -0
- sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
- sage_wheels/share/singular/LIB/perron.lib +202 -0
- sage_wheels/share/singular/LIB/pfd.lib +2223 -0
- sage_wheels/share/singular/LIB/phindex.lib +642 -0
- sage_wheels/share/singular/LIB/pointid.lib +673 -0
- sage_wheels/share/singular/LIB/polybori.lib +1430 -0
- sage_wheels/share/singular/LIB/polyclass.lib +525 -0
- sage_wheels/share/singular/LIB/polylib.lib +1174 -0
- sage_wheels/share/singular/LIB/polymake.lib +1902 -0
- sage_wheels/share/singular/LIB/presolve.lib +1533 -0
- sage_wheels/share/singular/LIB/primdec.lib +9576 -0
- sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
- sage_wheels/share/singular/LIB/primitiv.lib +401 -0
- sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
- sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
- sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
- sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
- sage_wheels/share/singular/LIB/random.lib +455 -0
- sage_wheels/share/singular/LIB/ratgb.lib +489 -0
- sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
- sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
- sage_wheels/share/singular/LIB/realrad.lib +1197 -0
- sage_wheels/share/singular/LIB/recover.lib +2628 -0
- sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
- sage_wheels/share/singular/LIB/reesclos.lib +465 -0
- sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
- sage_wheels/share/singular/LIB/resgraph.lib +789 -0
- sage_wheels/share/singular/LIB/resjung.lib +820 -0
- sage_wheels/share/singular/LIB/resolve.lib +5110 -0
- sage_wheels/share/singular/LIB/resources.lib +170 -0
- sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
- sage_wheels/share/singular/LIB/ring.lib +1328 -0
- sage_wheels/share/singular/LIB/ringgb.lib +343 -0
- sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
- sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
- sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
- sage_wheels/share/singular/LIB/rootsur.lib +886 -0
- sage_wheels/share/singular/LIB/rstandard.lib +607 -0
- sage_wheels/share/singular/LIB/rwalk.lib +336 -0
- sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
- sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
- sage_wheels/share/singular/LIB/schreyer.lib +321 -0
- sage_wheels/share/singular/LIB/schubert.lib +2551 -0
- sage_wheels/share/singular/LIB/sets.lib +524 -0
- sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
- sage_wheels/share/singular/LIB/signcond.lib +437 -0
- sage_wheels/share/singular/LIB/sing.lib +1094 -0
- sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
- sage_wheels/share/singular/LIB/solve.lib +2243 -0
- sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
- sage_wheels/share/singular/LIB/spectrum.lib +62 -0
- sage_wheels/share/singular/LIB/sresext.lib +757 -0
- sage_wheels/share/singular/LIB/ssi.lib +143 -0
- sage_wheels/share/singular/LIB/standard.lib +2769 -0
- sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
- sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
- sage_wheels/share/singular/LIB/stratify.lib +1070 -0
- sage_wheels/share/singular/LIB/surf.lib +506 -0
- sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
- sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
- sage_wheels/share/singular/LIB/surfex.lib +1462 -0
- sage_wheels/share/singular/LIB/swalk.lib +877 -0
- sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
- sage_wheels/share/singular/LIB/systhreads.lib +74 -0
- sage_wheels/share/singular/LIB/tasks.lib +1324 -0
- sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
- sage_wheels/share/singular/LIB/teachstd.lib +858 -0
- sage_wheels/share/singular/LIB/template.lib +116 -0
- sage_wheels/share/singular/LIB/toric.lib +1119 -0
- sage_wheels/share/singular/LIB/transformation.lib +116 -0
- sage_wheels/share/singular/LIB/triang.lib +1197 -0
- sage_wheels/share/singular/LIB/tropical.lib +8741 -0
- sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
- sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
- sage_wheels/share/singular/LIB/tst.lib +1108 -0
- sage_wheels/share/singular/LIB/weierstr.lib +241 -0
- sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
- sage_wheels/share/singular/emacs/.emacs-general +184 -0
- sage_wheels/share/singular/emacs/.emacs-singular +234 -0
- sage_wheels/share/singular/emacs/COPYING +44 -0
- sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
- sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
- sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
- sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
- sage_wheels/share/singular/emacs/singular.el +4273 -0
- sage_wheels/share/singular/emacs/singular.xpm +39 -0
- sage_wheels/share/singular/singular.idx +5002 -0
|
@@ -0,0 +1,886 @@
|
|
|
1
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
version="version rootsur.lib 4.1.2.0 Feb_2019 "; // $Id: fc5e3d7bf7ab6329a411250d133a1594a94bfe19 $
|
|
3
|
+
category="Teaching";
|
|
4
|
+
info="
|
|
5
|
+
LIBRARY: rootsur.lib Counting number of real roots of univariate polynomial
|
|
6
|
+
AUTHOR: Enrique A. Tobis, etobis@dc.uba.ar
|
|
7
|
+
|
|
8
|
+
OVERVIEW: Routines for bounding and counting the number of real roots of a
|
|
9
|
+
univariate polynomial, by means of several different methods, namely
|
|
10
|
+
Descartes' rule of signs, the Budan-Fourier theorem, Sturm sequences
|
|
11
|
+
and Sturm-Habicht sequences. The first two give bounds on the number
|
|
12
|
+
of roots. The other two compute the actual number of roots of the
|
|
13
|
+
polynomial. There are several wrapper functions, to simplify the
|
|
14
|
+
application of the aforesaid theorems and some functions
|
|
15
|
+
to determine whether a given polynomial is univariate.
|
|
16
|
+
REFERENCES: Basu, Pollack, Roy, \"Algorithms in Real Algebraic
|
|
17
|
+
Geometry\", Springer, 2003.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
PROCEDURES:
|
|
21
|
+
isuni(p) Checks whether a polynomial is univariate
|
|
22
|
+
whichvariable(p) The only variable of a univariate monomial (or 0)
|
|
23
|
+
varsigns(p) Number of sign changes in a list
|
|
24
|
+
boundBuFou(p,a,b) Bound for number of real roots of polynomial p in interval (a,b)
|
|
25
|
+
boundposDes(p) Bound for the number of positive real roots of polynomial p
|
|
26
|
+
boundDes(p) Bound for the number of real roots of polynomial p
|
|
27
|
+
allrealst(p) Checks whether all the roots of a polynomial are real (via Sturm)
|
|
28
|
+
maxabs(p) A bound for the maximum absolute value of a root of a poly
|
|
29
|
+
allreal(p) Checks whether all the roots of a polynomial are real (via St-Ha)
|
|
30
|
+
sturm(p,a,b) Number of real roots of a polynomial on an interval (via Sturm)
|
|
31
|
+
sturmseq(p) Sturm sequence of a polynomial
|
|
32
|
+
sturmha(p,a,b) Number of real roots of a polynomial in (a,b) (via Sturm-Habicht)
|
|
33
|
+
sturmhaseq(p) A Sturm-Habicht Sequence of a polynomial
|
|
34
|
+
reverse(l) Reverses a list
|
|
35
|
+
nrroots(p) The number of real roots of p
|
|
36
|
+
isparam(p) Returns 0 if and only if the polynomial has non-parametric coefficients
|
|
37
|
+
|
|
38
|
+
KEYWORDS: real roots, univariate polynomial
|
|
39
|
+
";
|
|
40
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
|
|
42
|
+
static proc isparametric(poly p)
|
|
43
|
+
{
|
|
44
|
+
int ispar;
|
|
45
|
+
def ba = basering;
|
|
46
|
+
|
|
47
|
+
// If the basering has parameters declared
|
|
48
|
+
if (npars(basering) != 0) {
|
|
49
|
+
// If we were given just a polynomial
|
|
50
|
+
list lba = ringlist(ba);
|
|
51
|
+
lba[1]=0;
|
|
52
|
+
def rba = ring(lba); setring rba;
|
|
53
|
+
poly p1 = imap(ba,p);
|
|
54
|
+
setring ba;
|
|
55
|
+
poly p1 = imap(rba,p1);
|
|
56
|
+
ispar = (size(p-p1)!=0);
|
|
57
|
+
}
|
|
58
|
+
return (ispar);
|
|
59
|
+
}
|
|
60
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
61
|
+
proc isparam(list #)
|
|
62
|
+
"USAGE: isparam(ideal/module/poly/list);
|
|
63
|
+
RETURN: int: 0 if the argument has non-parametric coefficients and 1 if it
|
|
64
|
+
has parametric coefficients
|
|
65
|
+
EXAMPLE: example isparam; shows an example"
|
|
66
|
+
{
|
|
67
|
+
int i;
|
|
68
|
+
int ispar;
|
|
69
|
+
def ar = #[1];
|
|
70
|
+
|
|
71
|
+
// It we were given only one argument (not a list)
|
|
72
|
+
if (size(#) == 1) {
|
|
73
|
+
if (typeof(ar) == "number") {
|
|
74
|
+
ispar = (pardeg(ar) > 0);
|
|
75
|
+
} else {
|
|
76
|
+
if (typeof(ar) == "poly") {
|
|
77
|
+
ispar = isparametric(ar);
|
|
78
|
+
} else {
|
|
79
|
+
if (typeof(ar) == "ideal" || typeof(ar) == "module") {
|
|
80
|
+
// Ciclo que revisa cada polinomio
|
|
81
|
+
i = size(ar);
|
|
82
|
+
while (!ispar && (i >= 1)) {
|
|
83
|
+
ispar = ispar || (isparametric(ar[i]));
|
|
84
|
+
i--;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
if (typeof(ar) == "matrix" || typeof(ar) == "intmat") {
|
|
88
|
+
int j;
|
|
89
|
+
i = nrows(ar);
|
|
90
|
+
while (!ispar && (i >= 1)) {
|
|
91
|
+
j = nrows(ar);
|
|
92
|
+
while (!ispar && (j >= 1)) {
|
|
93
|
+
ispar = ispar || (isparametric(ar[i,j]));
|
|
94
|
+
j--;
|
|
95
|
+
}
|
|
96
|
+
i--;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}}}} else {
|
|
100
|
+
if (size(#) > 1) {
|
|
101
|
+
i = size(#);
|
|
102
|
+
while (!ispar && (i >= 1)) {
|
|
103
|
+
if ((typeof(#[i]) != "poly") && (typeof(#[i]) != "number") &&
|
|
104
|
+
typeof(#[i]) != "int") {
|
|
105
|
+
ERROR("This procedure only works with lists of polynomials");
|
|
106
|
+
}
|
|
107
|
+
ispar = ispar || (isparametric(#[i]));
|
|
108
|
+
i--;
|
|
109
|
+
}
|
|
110
|
+
}}
|
|
111
|
+
return (ispar);
|
|
112
|
+
}
|
|
113
|
+
example
|
|
114
|
+
{
|
|
115
|
+
echo = 2;
|
|
116
|
+
ring r = 0,x,dp;
|
|
117
|
+
isparam(2x3-56x+2);
|
|
118
|
+
ring s = (0,a,b,c),x,dp;
|
|
119
|
+
isparam(2x3-56x+2);
|
|
120
|
+
isparam(2x3-56x+abc);
|
|
121
|
+
}
|
|
122
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
123
|
+
proc isuni(poly p)
|
|
124
|
+
"USAGE: isuni(p); poly p;
|
|
125
|
+
RETURN: poly: if p is a univariate polynomial, it returns the variable. If
|
|
126
|
+
not, zero.
|
|
127
|
+
SEE ALSO: whichvariable
|
|
128
|
+
EXAMPLE: example isuni; shows an example"
|
|
129
|
+
{
|
|
130
|
+
int v=univariate(p);
|
|
131
|
+
if (v== -1) { v=1; }
|
|
132
|
+
if (v>0) { return(var(v)); }
|
|
133
|
+
else { return(0); }
|
|
134
|
+
}
|
|
135
|
+
example
|
|
136
|
+
{
|
|
137
|
+
echo = 2;
|
|
138
|
+
ring r = 0,(x,y),dp;
|
|
139
|
+
poly p = 6x7-3x2+2x-15/7;
|
|
140
|
+
isuni(p);
|
|
141
|
+
isuni(p*y);
|
|
142
|
+
}
|
|
143
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
144
|
+
proc whichvariable(poly p)
|
|
145
|
+
"USAGE: whichvariable(p); poly p
|
|
146
|
+
RETURN: poly: if p is a univariate monomial, the variable. Otherwise 0.
|
|
147
|
+
ASSUME: p is a monomial
|
|
148
|
+
SEE ALSO: isuni
|
|
149
|
+
EXAMPLE: example whichvariable; shows an example"
|
|
150
|
+
{
|
|
151
|
+
if (size(p) != 1)
|
|
152
|
+
{ ERROR("p must be a monomial"); }
|
|
153
|
+
int v=univariate(p);
|
|
154
|
+
if (v== -1) { v=1; }
|
|
155
|
+
if (v>0) { return(var(v)); }
|
|
156
|
+
else { return(0); }
|
|
157
|
+
}
|
|
158
|
+
example
|
|
159
|
+
{
|
|
160
|
+
echo = 2;
|
|
161
|
+
ring r = 0,(x,y),dp;
|
|
162
|
+
whichvariable(x5);
|
|
163
|
+
whichvariable(x3y);
|
|
164
|
+
}
|
|
165
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
166
|
+
proc varsigns(list l)
|
|
167
|
+
"USAGE: varsigns(l); list l.
|
|
168
|
+
RETURN: int: the number of sign changes in the list l
|
|
169
|
+
SEE ALSO: boundposDes
|
|
170
|
+
EXAMPLE: example varsigns; shows an example"
|
|
171
|
+
{
|
|
172
|
+
int lastsign;
|
|
173
|
+
int numberofchanges = 0;
|
|
174
|
+
|
|
175
|
+
if (isparam(l)) {
|
|
176
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
lastsign = sign(l[1]);
|
|
180
|
+
|
|
181
|
+
for (int i = 1; i <= size(l); i++)
|
|
182
|
+
{
|
|
183
|
+
if (sign(l[i]) != lastsign && sign(l[i]) != 0)
|
|
184
|
+
{
|
|
185
|
+
numberofchanges++;
|
|
186
|
+
lastsign = sign(l[i]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return (numberofchanges);
|
|
190
|
+
}
|
|
191
|
+
example
|
|
192
|
+
{
|
|
193
|
+
echo = 2;
|
|
194
|
+
ring r = 0,x,dp;
|
|
195
|
+
list l = 1,2,3;
|
|
196
|
+
varsigns(l);
|
|
197
|
+
l = 1,-1,2,-2,3,-3;
|
|
198
|
+
varsigns(l);
|
|
199
|
+
}
|
|
200
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
201
|
+
proc boundBuFou(poly p,number a,number b)
|
|
202
|
+
"USAGE: boundBuFou(p,a,b); p poly, a,b number
|
|
203
|
+
RETURN: int: an upper bound for the number of real roots of p in (a,b],
|
|
204
|
+
with the same parity as the actual number of roots (using the
|
|
205
|
+
Budan-Fourier Theorem)
|
|
206
|
+
ASSUME: - p is a univariate polynomial with rational coefficients@*
|
|
207
|
+
- a, b are rational numbers with a < b
|
|
208
|
+
SEE ALSO: boundposDes,varsigns
|
|
209
|
+
EXAMPLE: example boundBuFou; shows an example"
|
|
210
|
+
{
|
|
211
|
+
int i;
|
|
212
|
+
poly variable;
|
|
213
|
+
list Der;
|
|
214
|
+
list Dera,Derb;
|
|
215
|
+
int d;
|
|
216
|
+
number bound;
|
|
217
|
+
|
|
218
|
+
variable = isuni(p);
|
|
219
|
+
|
|
220
|
+
if (isparam(p) || isparam(a) || isparam(b)) {
|
|
221
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// p must be a univariate polynomial
|
|
225
|
+
if (variable == 0) {
|
|
226
|
+
ERROR("p must be a univariate polynomial");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (a >= b) {
|
|
230
|
+
ERROR("a must be smaller than b");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
d = deg(p);
|
|
234
|
+
|
|
235
|
+
// We calculate the list of derivatives
|
|
236
|
+
|
|
237
|
+
Der[d+1] = p;
|
|
238
|
+
|
|
239
|
+
for (i = 0;i < d;i++) {
|
|
240
|
+
Der[d-i] = diff(Der[d-i+1],variable);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Then evaluate that list
|
|
244
|
+
|
|
245
|
+
for (i = d+1;i >= 1;i--) {
|
|
246
|
+
Dera [i] = leadcoef(subst(Der[i],variable,a));
|
|
247
|
+
Derb [i] = leadcoef(subst(Der[i],variable,b));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Finally we calculate the sign variations
|
|
251
|
+
|
|
252
|
+
bound = varsigns(Dera) - varsigns(Derb);
|
|
253
|
+
|
|
254
|
+
return(bound);
|
|
255
|
+
}
|
|
256
|
+
example
|
|
257
|
+
{
|
|
258
|
+
echo = 2;
|
|
259
|
+
ring r = 0,x,dp;
|
|
260
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
261
|
+
boundBuFou(p,-3,5);
|
|
262
|
+
boundBuFou(p,-2,5);
|
|
263
|
+
}
|
|
264
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
265
|
+
proc boundposDes(poly p)
|
|
266
|
+
"USAGE: boundposDes(p); poly p
|
|
267
|
+
RETURN: int: an upper bound for the number of positive roots of p, with
|
|
268
|
+
the same parity as the actual number of positive roots of p.
|
|
269
|
+
ASSUME: p is a univariate polynomial with rational coefficients
|
|
270
|
+
SEE ALSO: boundBuFou
|
|
271
|
+
EXAMPLE: example boundposDes; shows an example"
|
|
272
|
+
{
|
|
273
|
+
poly g;
|
|
274
|
+
number nroots;
|
|
275
|
+
poly variable;
|
|
276
|
+
list coefficients;
|
|
277
|
+
int i;
|
|
278
|
+
|
|
279
|
+
variable = isuni(p);
|
|
280
|
+
|
|
281
|
+
if (isparam(p)) {
|
|
282
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// p must be a univariate polynomial
|
|
286
|
+
if (variable == 0) {
|
|
287
|
+
ERROR("p must be a univariate polynomial");
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
g = p; // We will work with g
|
|
291
|
+
|
|
292
|
+
// We check whether 0 is a root of g, and if so, remove it
|
|
293
|
+
if (subst(g,variable,0) == 0) {
|
|
294
|
+
g = g/variable^(deg(g[size[g]]));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// We count the number of positive roots
|
|
298
|
+
i = size(g);
|
|
299
|
+
while (i >= 1) {
|
|
300
|
+
coefficients[i] = leadcoef(g[i]);
|
|
301
|
+
i--;
|
|
302
|
+
}
|
|
303
|
+
nroots = varsigns(coefficients);
|
|
304
|
+
|
|
305
|
+
return(nroots);
|
|
306
|
+
}
|
|
307
|
+
example
|
|
308
|
+
{
|
|
309
|
+
echo = 2;
|
|
310
|
+
ring r = 0,x,dp;
|
|
311
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
312
|
+
boundposDes(p);
|
|
313
|
+
|
|
314
|
+
p = p*(x2+1);
|
|
315
|
+
|
|
316
|
+
boundposDes(p);
|
|
317
|
+
}
|
|
318
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
319
|
+
proc boundDes(poly p)
|
|
320
|
+
"USAGE: boundDes(p); poly p
|
|
321
|
+
RETURN: int: an upper bound for the number of real roots of p, with
|
|
322
|
+
the same parity as the actual number of real roots of p.
|
|
323
|
+
ASSUME: p is a univariate polynomial with rational coefficients
|
|
324
|
+
SEE ALSO: boundBuFou
|
|
325
|
+
EXAMPLE: example boundDes; shows an example"
|
|
326
|
+
{
|
|
327
|
+
poly g;
|
|
328
|
+
number nroots;
|
|
329
|
+
poly variable;
|
|
330
|
+
list coefficients;
|
|
331
|
+
int i;
|
|
332
|
+
|
|
333
|
+
variable = isuni(p);
|
|
334
|
+
|
|
335
|
+
if (isparam(p)) {
|
|
336
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// p must be a univariate polynomial
|
|
340
|
+
if (variable == 0) {
|
|
341
|
+
ERROR("p must be a univariate polynomial");
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
g = p; // We will work with g
|
|
345
|
+
|
|
346
|
+
nroots = 0;
|
|
347
|
+
// We check whether 0 is a root of g, and if so, remove it
|
|
348
|
+
if (subst(g,variable,0) == 0) {
|
|
349
|
+
g = g/variable^(deg(g[size[g]]));
|
|
350
|
+
nroots++;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// We count the number of positive roots
|
|
354
|
+
i = size(g);
|
|
355
|
+
while (i >= 1) {
|
|
356
|
+
coefficients[i] = leadcoef(g[i]);
|
|
357
|
+
i--;
|
|
358
|
+
}
|
|
359
|
+
nroots = nroots + varsigns(coefficients);
|
|
360
|
+
|
|
361
|
+
// We count the number of negative roots
|
|
362
|
+
g = subst(g,variable,-variable);
|
|
363
|
+
i = size(g);
|
|
364
|
+
while (i >= 1) {
|
|
365
|
+
coefficients[i] = leadcoef(g[i]);
|
|
366
|
+
i--;
|
|
367
|
+
}
|
|
368
|
+
nroots = nroots + varsigns(coefficients);
|
|
369
|
+
|
|
370
|
+
return(nroots);
|
|
371
|
+
}
|
|
372
|
+
example
|
|
373
|
+
{
|
|
374
|
+
echo = 2;
|
|
375
|
+
ring r = 0,x,dp;
|
|
376
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
377
|
+
boundDes(p);
|
|
378
|
+
|
|
379
|
+
p = p*(x2+1);
|
|
380
|
+
|
|
381
|
+
boundDes(p);
|
|
382
|
+
}
|
|
383
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
384
|
+
proc allrealst(poly p)
|
|
385
|
+
"USAGE: allrealst(p); poly p
|
|
386
|
+
RETURN: int: 1 if and only if all the roots of p are real, 0 otherwise.
|
|
387
|
+
Checks by using Sturm's Theorem whether all the roots of p are real
|
|
388
|
+
ASSUME: p is a univariate polynomial with rational coefficients
|
|
389
|
+
SEE ALSO: allreal,sturm,sturmha
|
|
390
|
+
EXAMPLE: example allrealst; shows an example"
|
|
391
|
+
{
|
|
392
|
+
number upper,lower;
|
|
393
|
+
poly sqfp; // The square-free part of p
|
|
394
|
+
poly variable;
|
|
395
|
+
|
|
396
|
+
variable = isuni(p);
|
|
397
|
+
|
|
398
|
+
if (isparam(p)) {
|
|
399
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
400
|
+
}
|
|
401
|
+
if (variable == 0) {
|
|
402
|
+
ERROR ("p must be a univariate polynomial");
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
sqfp = p/gcd(p,diff(p,variable));
|
|
406
|
+
|
|
407
|
+
upper = maxabs(sqfp); // By adding one we ensure that sqfp(upper) != 0
|
|
408
|
+
lower = -upper;
|
|
409
|
+
|
|
410
|
+
return (sturm(sqfp,lower,upper) == deg(sqfp));
|
|
411
|
+
}
|
|
412
|
+
example
|
|
413
|
+
{
|
|
414
|
+
echo = 2;
|
|
415
|
+
ring r = 0,x,dp;
|
|
416
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
417
|
+
allrealst(p);
|
|
418
|
+
p = p*(x2+1);
|
|
419
|
+
allrealst(p);
|
|
420
|
+
}
|
|
421
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
422
|
+
proc maxabs(poly p)
|
|
423
|
+
"USAGE: maxabs(p); poly p
|
|
424
|
+
RETURN: number: an upper bound for the largest absolute value of a root of p
|
|
425
|
+
ASSUME: p is a univariate polynomial with rational coefficients
|
|
426
|
+
SEE ALSO: sturm
|
|
427
|
+
EXAMPLE: example maxabs; shows an example"
|
|
428
|
+
{
|
|
429
|
+
number maximum;
|
|
430
|
+
poly monic;
|
|
431
|
+
int i;
|
|
432
|
+
|
|
433
|
+
if (isparam(p)) {
|
|
434
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
monic = simplify(p,1);
|
|
438
|
+
if (abs(leadcoef(p))>1) { monic=p;}
|
|
439
|
+
|
|
440
|
+
maximum = 0;
|
|
441
|
+
|
|
442
|
+
for (i = 1; i <= size(monic); i++)
|
|
443
|
+
{
|
|
444
|
+
maximum = max(abs(leadcoef(monic[i])),maximum);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return (maximum + 1);
|
|
448
|
+
}
|
|
449
|
+
example
|
|
450
|
+
{
|
|
451
|
+
echo = 2;
|
|
452
|
+
echo = 2;
|
|
453
|
+
ring r = 0,x,dp;
|
|
454
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
455
|
+
maxabs(p);
|
|
456
|
+
}
|
|
457
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
458
|
+
proc sturm(poly p,number a,number b)
|
|
459
|
+
"USAGE: sturm(p,a,b); poly p, number a,b
|
|
460
|
+
RETURN: int: the number of real roots of p in (a,b]
|
|
461
|
+
ASSUME: p is a univariate polynomial with rational coefficients,@*
|
|
462
|
+
a, b are rational numbers with a < b
|
|
463
|
+
SEE ALSO: sturmha,allrealst,allreal
|
|
464
|
+
EXAMPLE: example sturm; shows an example"
|
|
465
|
+
{
|
|
466
|
+
list l;
|
|
467
|
+
list pa;
|
|
468
|
+
list pb;
|
|
469
|
+
int signsA,signsB;
|
|
470
|
+
int i;
|
|
471
|
+
int nroots;
|
|
472
|
+
poly variable;
|
|
473
|
+
|
|
474
|
+
if (isparam(p)) {
|
|
475
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
variable = isuni(p);
|
|
479
|
+
|
|
480
|
+
if (variable == 0) {
|
|
481
|
+
ERROR ("p must be a univariate polynomial");
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (a >= b) {
|
|
485
|
+
ERROR("a must be lower than b");
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (subst(p,variable,a) == 0 || subst(p,variable,b) == 0) {
|
|
489
|
+
ERROR ("Neither a nor b can be roots of P");
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
l = sturmseq(p);
|
|
493
|
+
|
|
494
|
+
i = size(l);
|
|
495
|
+
|
|
496
|
+
while (i >= 1) { // We build the sequences
|
|
497
|
+
pa[i] = leadcoef(subst(l[i],variable,a));
|
|
498
|
+
pb[i] = leadcoef(subst(l[i],variable,b));
|
|
499
|
+
i--;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
signsA = varsigns(pa);
|
|
503
|
+
signsB = varsigns(pb);
|
|
504
|
+
|
|
505
|
+
nroots = signsA - signsB;
|
|
506
|
+
|
|
507
|
+
return (nroots);
|
|
508
|
+
}
|
|
509
|
+
example
|
|
510
|
+
{
|
|
511
|
+
echo = 2;
|
|
512
|
+
ring r = 0,x,dp;
|
|
513
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
514
|
+
sturm(p,-3,6);
|
|
515
|
+
p = p*(x2+1);
|
|
516
|
+
sturm(p,-3,6);
|
|
517
|
+
p = p*(x+2);
|
|
518
|
+
sturm(p,-3,6);
|
|
519
|
+
}
|
|
520
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
521
|
+
proc sturmseq(poly p)
|
|
522
|
+
"USAGE: sturmseq(p); p poly
|
|
523
|
+
RETURN: list: a Sturm sequence of p
|
|
524
|
+
ASSUME: p is a univariate polynomial with rational coefficients
|
|
525
|
+
THEORY: The Sturm sequence of p (also called remainder sequence) is the
|
|
526
|
+
sequence beginning with p, p' and goes on with the negative part of
|
|
527
|
+
the remainder of the two previous polynomials, until the remainder
|
|
528
|
+
is zero.
|
|
529
|
+
See: Basu, Pollack, Roy, Algorithms in Real Algebraic Geometry,
|
|
530
|
+
Springer, 2003.
|
|
531
|
+
SEE ALSO: sturm,sturmhaseq
|
|
532
|
+
EXAMPLE: example sturmseq; shows an example"
|
|
533
|
+
{
|
|
534
|
+
list stseq;
|
|
535
|
+
poly variable;
|
|
536
|
+
int i;
|
|
537
|
+
|
|
538
|
+
variable = isuni(p);
|
|
539
|
+
|
|
540
|
+
if (isparam(p)) {
|
|
541
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
if (variable == 0) {
|
|
545
|
+
ERROR ("p must be a univariate polynomial");
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// The two first polynomials in Sturm's sequence
|
|
549
|
+
stseq = list();
|
|
550
|
+
stseq[1] = p;
|
|
551
|
+
stseq[2] = diff(p,variable);
|
|
552
|
+
|
|
553
|
+
poly q = -reduce(stseq[1],std(stseq[2]));
|
|
554
|
+
i = 3;
|
|
555
|
+
|
|
556
|
+
while (q <> 0) {
|
|
557
|
+
stseq[i] = q;
|
|
558
|
+
q = -reduce(stseq[i-1],std(stseq[i]));
|
|
559
|
+
i++;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// Right now, we have gcd(P,P') in stseq[size(stseq)];
|
|
563
|
+
|
|
564
|
+
for (i = size(stseq)-1;i >= 1;i--) {
|
|
565
|
+
stseq[i] = stseq[i]/(sign(leadcoef(stseq[size(stseq)]))*stseq[size(stseq)]);
|
|
566
|
+
stseq[i] = stseq[i]/abs(leadcoef(stseq[i]));
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// We divide the gcd by itself
|
|
570
|
+
stseq[size(stseq)] = sign(leadcoef(stseq[size(stseq)]));
|
|
571
|
+
|
|
572
|
+
return (stseq);
|
|
573
|
+
}
|
|
574
|
+
example
|
|
575
|
+
{
|
|
576
|
+
echo = 2;
|
|
577
|
+
ring r = 0,(z,x),dp;
|
|
578
|
+
poly p = x5-3x4+12x3+7x-153;
|
|
579
|
+
sturmseq(p);
|
|
580
|
+
}
|
|
581
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
582
|
+
proc allreal(poly p)
|
|
583
|
+
"USAGE: allreal(p);
|
|
584
|
+
RETURN: int: 1 if and only if all the roots of p are real, 0 otherwise
|
|
585
|
+
SEE ALSO: allrealst
|
|
586
|
+
EXAMPLE: example allreal; shows an example"
|
|
587
|
+
{
|
|
588
|
+
number upper,lower;
|
|
589
|
+
poly sqfp; // The square-free part of p
|
|
590
|
+
poly variable;
|
|
591
|
+
|
|
592
|
+
if (isparam(p)) {
|
|
593
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
variable = isuni(p);
|
|
597
|
+
|
|
598
|
+
if (variable == 0) {
|
|
599
|
+
ERROR ("p must be a univariate polynomial");
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
sqfp = p/gcd(p,diff(p,variable));
|
|
603
|
+
|
|
604
|
+
return (sturmha(sqfp,-maxabs(p),maxabs(p)) == deg(sqfp));
|
|
605
|
+
}
|
|
606
|
+
example
|
|
607
|
+
{
|
|
608
|
+
echo = 2;
|
|
609
|
+
ring r = 0,x,dp;
|
|
610
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
611
|
+
allreal(p);
|
|
612
|
+
p = p*(x2+1);
|
|
613
|
+
allreal(p);
|
|
614
|
+
}
|
|
615
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
616
|
+
proc sturmha(poly P,number a,number b)
|
|
617
|
+
"USAGE: sturmha(p,a,b); poly p, number a,b
|
|
618
|
+
RETURN: int: the number of real roots of p in (a,b) (using a Sturm-Habicht sequence)
|
|
619
|
+
SEE ALSO: sturm,allreal
|
|
620
|
+
EXAMPLE: example sturmha; shows an example"
|
|
621
|
+
{
|
|
622
|
+
list seq;
|
|
623
|
+
int i;
|
|
624
|
+
list seqa,seqb;
|
|
625
|
+
poly variable;
|
|
626
|
+
number bound;
|
|
627
|
+
int result;
|
|
628
|
+
|
|
629
|
+
if (isparam(P) || isparam(a) || isparam(b))
|
|
630
|
+
{ ERROR("This procedure cannot operate with parametric arguments"); }
|
|
631
|
+
if (!attrib(basering,"global"))
|
|
632
|
+
{ ERROR("This procedure requires a global ordering"); }
|
|
633
|
+
|
|
634
|
+
variable = isuni(P);
|
|
635
|
+
|
|
636
|
+
if (variable == 0) { ERROR ("P must be a univariate polynomial"); }
|
|
637
|
+
|
|
638
|
+
if (a >= b) { ERROR("a must be lower than b"); }
|
|
639
|
+
|
|
640
|
+
if (subst(P,variable,a) == 0 || subst(P,variable,b) == 0) {
|
|
641
|
+
ERROR ("Neither a nor b can be roots of P");
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
seq = sturmhaseq(P);
|
|
645
|
+
|
|
646
|
+
bound = maxabs(P);
|
|
647
|
+
|
|
648
|
+
if (a < -bound) { a = -bound; }
|
|
649
|
+
|
|
650
|
+
if (b > bound) { b = bound; }
|
|
651
|
+
|
|
652
|
+
for (i = size(seq);i >= 1;i--) {
|
|
653
|
+
seqa[i] = leadcoef(subst(seq[i],variable,a));
|
|
654
|
+
seqb[i] = leadcoef(subst(seq[i],variable,b));
|
|
655
|
+
}
|
|
656
|
+
result = (W(seqa) - W(seqb));
|
|
657
|
+
|
|
658
|
+
return (result);
|
|
659
|
+
}
|
|
660
|
+
example
|
|
661
|
+
{
|
|
662
|
+
echo = 2;
|
|
663
|
+
ring r = 0,x,dp;
|
|
664
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
665
|
+
sturmha(p,-3,6);
|
|
666
|
+
p = p*(x2+1);
|
|
667
|
+
sturmha(p,-3,6);
|
|
668
|
+
}
|
|
669
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
670
|
+
proc sturmhaseq(poly P)
|
|
671
|
+
"USAGE: sturmhaseq(P); P poly.
|
|
672
|
+
RETURN: list: the non-zero polynomials of the Sturm-Habicht sequence of P
|
|
673
|
+
ASSUME: P is a univariate polynomial.
|
|
674
|
+
THEORY: The Sturm-Habicht sequence (also subresultant sequence) is closely
|
|
675
|
+
related to the Sturm sequence, but behaves better with respect to
|
|
676
|
+
the size of the coefficients. It is defined via subresultants.
|
|
677
|
+
See: Basu, Pollack, Roy, Algorithms in Real Algebraic Geometry,
|
|
678
|
+
Springer, 2003.
|
|
679
|
+
SEE ALSO: sturm,sturmseq,sturmha
|
|
680
|
+
EXAMPLE: example sturmhaseq; shows an example"
|
|
681
|
+
{
|
|
682
|
+
poly Q;
|
|
683
|
+
poly variable;
|
|
684
|
+
int p,q,i,j,k,l;
|
|
685
|
+
list SR;
|
|
686
|
+
list sr;
|
|
687
|
+
list srbar;
|
|
688
|
+
list T;
|
|
689
|
+
|
|
690
|
+
if (isparam(P)) {
|
|
691
|
+
ERROR("This procedure cannot operate with parametric arguments");
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
variable = isuni(P);
|
|
695
|
+
|
|
696
|
+
if (variable == 0) {
|
|
697
|
+
ERROR ("P must be a univariate polynomial");
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
p = deg(P);
|
|
701
|
+
Q = diff(P,variable);
|
|
702
|
+
q = deg(Q);
|
|
703
|
+
|
|
704
|
+
// Initialization
|
|
705
|
+
SR[p+2] = sign(leadcoef(P)^(p-q-1))*P;
|
|
706
|
+
// T[p+2] = SR[p+2];
|
|
707
|
+
|
|
708
|
+
srbar[p+2] = sign(leadcoef(P)^(p-q));
|
|
709
|
+
sr[p+2] = srbar[p+2];
|
|
710
|
+
|
|
711
|
+
SR[p-1+2] = sign(leadcoef(P)^(p-q+1))*Q;
|
|
712
|
+
// T[p-1+2] = SR[p-1+2];
|
|
713
|
+
srbar[p-1+2] = sign(leadcoef(P)^(p-q+1))*leadcoef(Q);
|
|
714
|
+
|
|
715
|
+
i = p+1;
|
|
716
|
+
j = p;
|
|
717
|
+
|
|
718
|
+
while (SR[j-1+2] != 0) {
|
|
719
|
+
k = deg(SR[j-1+2]);
|
|
720
|
+
if (k == j-1) {
|
|
721
|
+
sr[j-1+2] = srbar[j-1+2];
|
|
722
|
+
SR[k-1+2] = -(reduce(sr[j-1+2]^2*SR[i-1+2],
|
|
723
|
+
std(SR[j-1+2])))/(sr[j+2]*srbar[i-1+2]);
|
|
724
|
+
|
|
725
|
+
// T[k-1+2] = SR[k-1+2];
|
|
726
|
+
srbar[k-1+2] = leadcoef(SR[k-1+2]);
|
|
727
|
+
}
|
|
728
|
+
if (k < j-1) {
|
|
729
|
+
// Computation of sr[k+2]
|
|
730
|
+
for (l = 1;l <= j-k-1;l++) {
|
|
731
|
+
srbar[j-l-1+2] = ((-1)^l)*(srbar[j-1+2]*srbar[j-l+2])/sr[j+2];
|
|
732
|
+
}
|
|
733
|
+
sr[k+2] = srbar[k+2];
|
|
734
|
+
|
|
735
|
+
// Computation of SR[k-1+2]
|
|
736
|
+
SR[k-1+2] = -reduce(srbar[j-1+2]*sr[k+2]*SR[i-1+2],
|
|
737
|
+
std(SR[j-1+2]))/(sr[j+2]*srbar[i-1+2]);
|
|
738
|
+
|
|
739
|
+
srbar[k-1+2] = leadcoef(SR[k-1+2]);
|
|
740
|
+
|
|
741
|
+
SR[k+2] = SR[j-1+2] * ( sr[k+2] / leadcoef(SR[j-1+2]));
|
|
742
|
+
}
|
|
743
|
+
i = j;
|
|
744
|
+
j = k;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// We build a new list, discarding the undefined and zero elements
|
|
748
|
+
// Plus, we reverse the elements
|
|
749
|
+
|
|
750
|
+
list filtered;
|
|
751
|
+
i = size(SR);
|
|
752
|
+
while (i >= 1) {
|
|
753
|
+
if (typeof(SR[i]) != "none") {
|
|
754
|
+
if (SR[i] != 0) {
|
|
755
|
+
filtered = insert(filtered,SR[i]);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
i--;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
return (filtered);
|
|
762
|
+
}
|
|
763
|
+
example
|
|
764
|
+
{
|
|
765
|
+
echo = 2;
|
|
766
|
+
ring r = 0,x,dp;
|
|
767
|
+
poly p = x5-x4+x-3/2;
|
|
768
|
+
list l = sturmhaseq(p);
|
|
769
|
+
l;
|
|
770
|
+
}
|
|
771
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
772
|
+
proc nrroots(poly p)
|
|
773
|
+
"USAGE: nrroots(p); poly p
|
|
774
|
+
RETURN: int: the number of real roots of p
|
|
775
|
+
SEE ALSO: boundposDes, sturm, sturmha
|
|
776
|
+
EXAMPLE: example nrroots; shows an example"
|
|
777
|
+
{
|
|
778
|
+
if (isparam(p))
|
|
779
|
+
{ ERROR("This procedure cannot operate with parametric arguments"); }
|
|
780
|
+
|
|
781
|
+
number a = maxabs(p);
|
|
782
|
+
|
|
783
|
+
return (sturmha(p,-a,a));
|
|
784
|
+
|
|
785
|
+
}
|
|
786
|
+
example
|
|
787
|
+
{
|
|
788
|
+
echo = 2;
|
|
789
|
+
ring r = 0,x,dp;
|
|
790
|
+
poly p = (x+2)*(x-1)*(x-5);
|
|
791
|
+
nrroots(p);
|
|
792
|
+
p = p*(x2+1);
|
|
793
|
+
nrroots(p);
|
|
794
|
+
}
|
|
795
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
796
|
+
static proc abs(number x)
|
|
797
|
+
// Returns the absolute value of x
|
|
798
|
+
{
|
|
799
|
+
number av;
|
|
800
|
+
|
|
801
|
+
if (x >= 0) {
|
|
802
|
+
av = x;
|
|
803
|
+
} else {
|
|
804
|
+
av = -x;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
return (av);
|
|
808
|
+
}
|
|
809
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
810
|
+
proc sign(number x)
|
|
811
|
+
{
|
|
812
|
+
int sgn;
|
|
813
|
+
|
|
814
|
+
if (isparam(x)) {
|
|
815
|
+
print(x);
|
|
816
|
+
ERROR("This procedure cannot operate with parameters");
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
if (x > 0) {
|
|
820
|
+
sgn = 1;
|
|
821
|
+
} else { if (x < 0) {
|
|
822
|
+
sgn = -1;
|
|
823
|
+
} else {
|
|
824
|
+
sgn = 0;
|
|
825
|
+
}}
|
|
826
|
+
|
|
827
|
+
return (sgn);
|
|
828
|
+
}
|
|
829
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
830
|
+
proc reverse(list l)
|
|
831
|
+
"USAGE: reverse(l); l list
|
|
832
|
+
RETURN: list: l reversed.
|
|
833
|
+
EXAMPLE: example reverse; shows an example"
|
|
834
|
+
{
|
|
835
|
+
int i;
|
|
836
|
+
list result;
|
|
837
|
+
|
|
838
|
+
for (i = 1;i <= size(l);i++) {
|
|
839
|
+
result = list(l[i]) + result;
|
|
840
|
+
}
|
|
841
|
+
return (result);
|
|
842
|
+
}
|
|
843
|
+
example
|
|
844
|
+
{
|
|
845
|
+
echo = 2;
|
|
846
|
+
ring r = 0,x,dp;
|
|
847
|
+
list l = 1,2,3,4,5;
|
|
848
|
+
list rev = reverse(l);
|
|
849
|
+
l;
|
|
850
|
+
rev;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
854
|
+
static proc W(list l)
|
|
855
|
+
{
|
|
856
|
+
int i,temp,sc,lastsign,nofzeros,n;
|
|
857
|
+
|
|
858
|
+
n = size(l);
|
|
859
|
+
sc = 0;
|
|
860
|
+
nofzeros = 0;
|
|
861
|
+
i = 1;
|
|
862
|
+
lastsign = sign(l[i]);
|
|
863
|
+
|
|
864
|
+
i++;
|
|
865
|
+
|
|
866
|
+
while (i <= n) {
|
|
867
|
+
if (l[i] == 0) {
|
|
868
|
+
nofzeros++;
|
|
869
|
+
} else {
|
|
870
|
+
temp = lastsign * sign(l[i]);
|
|
871
|
+
|
|
872
|
+
if (temp < 0) {
|
|
873
|
+
sc++;
|
|
874
|
+
} else {
|
|
875
|
+
if (nofzeros == 2) {
|
|
876
|
+
sc = sc + 2;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
nofzeros = 0;
|
|
880
|
+
lastsign = temp div lastsign;
|
|
881
|
+
}
|
|
882
|
+
i++;
|
|
883
|
+
}
|
|
884
|
+
return (sc);
|
|
885
|
+
}
|
|
886
|
+
///////////////////////////////////////////////////////////////////////////////
|