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,1481 @@
|
|
|
1
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
version="version rootisolation.lib 4.2.1.0 Jul_2021 "; // $Id: fa80650b02b6137a98231e35c47ac201601ab0a3 $
|
|
3
|
+
info="
|
|
4
|
+
LIBRARY: rootisolation.lib implements an algorithm for real root isolation
|
|
5
|
+
using interval arithmetic
|
|
6
|
+
AUTHORS: Dominik Bendle (bendle@rhrk.uni-kl.de)
|
|
7
|
+
Janko Boehm (boehm@mathematik.uni-lk.de), supervisor Fachpraktikum
|
|
8
|
+
@* Clara Petroll (petroll@rhrk.uni-kl.de)
|
|
9
|
+
|
|
10
|
+
OVERVIEW: In this library the interval arithmetic from @code{interval.so}
|
|
11
|
+
is used. The new type @code{ivmat}, a matrix consisting of
|
|
12
|
+
intervals, is implemented as @code{newstruct}. There are various
|
|
13
|
+
functions for computations with interval matrices implemented, such
|
|
14
|
+
as Gaussian elimination for interval matrices.
|
|
15
|
+
|
|
16
|
+
@* Interval arithmetic, the interval Newton Step and exclusion methods
|
|
17
|
+
are used to implement the procedure @code{rootIsolation}, an
|
|
18
|
+
algorithm which finds boxes containing elements of the vanishing
|
|
19
|
+
locus of an ideal. This algorithm is specialised for
|
|
20
|
+
zero-dimensional radical ideals. The theory about the interval
|
|
21
|
+
Newton Step is detailed in [2].
|
|
22
|
+
|
|
23
|
+
@* Note that interval arithmetic and the aforementioned procedures are
|
|
24
|
+
intended for rational or real polynomial rings.
|
|
25
|
+
|
|
26
|
+
REFERENCES: [1] Cloud, Kearfott, Moore: Introduction to Interval Analysis,
|
|
27
|
+
Society for Industrial and Applied Mathematics, 2009
|
|
28
|
+
@* [2] Eisenbud, Grayson, Herzog, Stillman, Vasconcelos: Computational
|
|
29
|
+
Methods in Commutative Algebra and Algebraic Geometry, Springer
|
|
30
|
+
Verlag Berlin-Heidelberg, 3. edition 2004
|
|
31
|
+
@* [3] Andrew J. Sommese and Charles W. Wampler: The Numerical
|
|
32
|
+
Solution of Systems of Polynomials - Arising in Engineering and
|
|
33
|
+
Science, World Scientific Publishing Co. Pte. Ltd., 2005
|
|
34
|
+
|
|
35
|
+
OVERLOADS:
|
|
36
|
+
[ ivmatGet indexing
|
|
37
|
+
print ivmatPrint printing
|
|
38
|
+
nrows ivmatNrows number of rows
|
|
39
|
+
ncols ivmatNcols number of columns@*
|
|
40
|
+
* ivmatMultiplyGeneral matrix multiplication
|
|
41
|
+
|
|
42
|
+
PROCEDURES:
|
|
43
|
+
bounds(a,#); creates a new interval with given bounds
|
|
44
|
+
length(I); returns Euclidean length of interval
|
|
45
|
+
boxSet(B,i,I); returns box B with B[i]==I
|
|
46
|
+
ivmatInit(m, n); returns m x n [0,0]-matrix
|
|
47
|
+
ivmatSet(A,i,j,I); returns matrix A where A[i][j]=I
|
|
48
|
+
unitMatrix(m); returns m x m unit matrix where 1 = [1,1]
|
|
49
|
+
ivmatGaussian(M); computes M^(-1) using Gaussian elimination for intervals
|
|
50
|
+
evalPolyAtBox(f,B); returns evaluation of polynomial at a box
|
|
51
|
+
evalJacobianAtBox(A,B); jacobian matrix of A where polynomials are evaluated at B
|
|
52
|
+
|
|
53
|
+
rootIsolationNoPreprocessing(I,L,e);
|
|
54
|
+
computes boxes containing unique roots of I lying in L
|
|
55
|
+
rootIsolation(I,B,e); slims down input box B and calls rootIsolationNoPreprocessing
|
|
56
|
+
rootIsolationPrimdec(I,B,e); runs a primary decomposition primdecGTZ before root isoation
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
KEYWORDS: real root isolation; interval arithmetic; Newton step
|
|
60
|
+
SEE ALSO: interval_lib
|
|
61
|
+
";
|
|
62
|
+
LIB "presolve.lib";
|
|
63
|
+
LIB "rootsur.lib";
|
|
64
|
+
LIB "primdec.lib";
|
|
65
|
+
LIB "solve.lib";
|
|
66
|
+
LIB "crypto.lib";
|
|
67
|
+
|
|
68
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
69
|
+
static proc mod_init()
|
|
70
|
+
{
|
|
71
|
+
intvec opt = option(get);
|
|
72
|
+
option(noredefine);
|
|
73
|
+
LIB "interval.so";
|
|
74
|
+
option(set,opt);
|
|
75
|
+
|
|
76
|
+
if (!reservedName("ivmat"))
|
|
77
|
+
{
|
|
78
|
+
newstruct("ivmat", "list rows");
|
|
79
|
+
system("install", "ivmat", "print", ivmatPrint, 1);
|
|
80
|
+
system("install", "ivmat", "[", ivmatGet, 2);
|
|
81
|
+
system("install", "ivmat", "nrows", ivmatNrows, 1);
|
|
82
|
+
system("install", "ivmat", "ncols", ivmatNcols, 1);
|
|
83
|
+
system("install", "ivmat", "*", ivmatMultiplyGeneral, 2);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
88
|
+
|
|
89
|
+
// HELPER FUNCTIONS
|
|
90
|
+
|
|
91
|
+
static proc floor(number a)
|
|
92
|
+
{
|
|
93
|
+
// a = m/n
|
|
94
|
+
bigint m, n = bigint(numerator(a)), bigint(denominator(a));
|
|
95
|
+
// div for bigint seemingly works like floor
|
|
96
|
+
return(number(m div n));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static proc ceil(number a)
|
|
100
|
+
{
|
|
101
|
+
return(-floor(-a));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// INTERVAL FUNCTIONS
|
|
105
|
+
|
|
106
|
+
// helper function for assignment
|
|
107
|
+
proc bounds(number a, list #)
|
|
108
|
+
"USAGE: @code{bounds(a)}; @code{a number};
|
|
109
|
+
@* @code{bounds(a, b)}; @code{a, b number};
|
|
110
|
+
RETURN: interval: if @code{size(#)==0} it returns the interval @code{[a, a]},
|
|
111
|
+
else the interval @code{[a,#[1]]}
|
|
112
|
+
EXAMPLE: example bounds; create two intervals"
|
|
113
|
+
{
|
|
114
|
+
interval I;
|
|
115
|
+
if (size(#) == 0)
|
|
116
|
+
{
|
|
117
|
+
I = a;
|
|
118
|
+
return(I);
|
|
119
|
+
}
|
|
120
|
+
if (size(#) == 1 && (typeof(#[1]) == "number" || typeof(#[1]) == "int"))
|
|
121
|
+
{
|
|
122
|
+
I = a, #[1];
|
|
123
|
+
return(I);
|
|
124
|
+
}
|
|
125
|
+
ERROR("syntax: bounds(<number>) or bounds(<number>, <number>)");
|
|
126
|
+
}
|
|
127
|
+
example
|
|
128
|
+
{
|
|
129
|
+
"EXAMPLE:"; echo = 2;
|
|
130
|
+
ring R = 0,x,dp;
|
|
131
|
+
interval I = bounds(1);
|
|
132
|
+
I;
|
|
133
|
+
|
|
134
|
+
interval J = bounds(2/3,3);
|
|
135
|
+
J;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// function defined in interval.so
|
|
139
|
+
proc length()
|
|
140
|
+
"USAGE: @code{length(I)}; @code{I interval}
|
|
141
|
+
RETURN: number, the Euclidean length of the interval
|
|
142
|
+
EXAMPLE: example length; shows an example"
|
|
143
|
+
{
|
|
144
|
+
}
|
|
145
|
+
example
|
|
146
|
+
{
|
|
147
|
+
"EXAMPLE:"; echo = 2;
|
|
148
|
+
ring R = 0,x,dp;
|
|
149
|
+
interval I = -1,3;
|
|
150
|
+
length(I);
|
|
151
|
+
I = 1/5,1/3;
|
|
152
|
+
length(I);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// BOX FUNCTIONS
|
|
156
|
+
|
|
157
|
+
proc boxSet()
|
|
158
|
+
"USAGE: @code{boxSet(B, i, I)}; @code{B box, i int, I interval}
|
|
159
|
+
RETURN: new box @code{C} where @code{C[i]==I}
|
|
160
|
+
PURPOSE: modifies a single entry of a box
|
|
161
|
+
EXAMPLE: example boxSet; shows an example"
|
|
162
|
+
{
|
|
163
|
+
}
|
|
164
|
+
example
|
|
165
|
+
{
|
|
166
|
+
"EXAMPLE:"; echo = 2;
|
|
167
|
+
ring R = 0,(x,y,z),dp;
|
|
168
|
+
box B; B;
|
|
169
|
+
B = boxSet(B, 2, bounds(-1,1)); B;
|
|
170
|
+
B = boxSet(B, 1, B[2]); B;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
static proc boxLength(box B)
|
|
174
|
+
"USAGE: boxLength(B), B box
|
|
175
|
+
RETURN: length/size in measure sense"
|
|
176
|
+
{
|
|
177
|
+
number maxLength, l = 0, 0;
|
|
178
|
+
int n = nvars(basering);
|
|
179
|
+
|
|
180
|
+
for (int i=1; i <= n; i++)
|
|
181
|
+
{
|
|
182
|
+
l = length(B[i]);
|
|
183
|
+
if (maxLength < l)
|
|
184
|
+
{
|
|
185
|
+
maxLength = l;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return(maxLength);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
static proc boxEmptyIntervals(box B)
|
|
193
|
+
{
|
|
194
|
+
int N = nvars(basering);
|
|
195
|
+
intvec z;
|
|
196
|
+
for (int i = 1; i <= N; i++)
|
|
197
|
+
{
|
|
198
|
+
z[i] = length(B[i]) == 0;
|
|
199
|
+
}
|
|
200
|
+
return(z);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
static proc boxCenter(box B)
|
|
204
|
+
"USAGE: boxCenter(B); B box
|
|
205
|
+
RETURN: box containing center elements of B"
|
|
206
|
+
{
|
|
207
|
+
int n = nvars(basering);
|
|
208
|
+
|
|
209
|
+
list C;
|
|
210
|
+
int i;
|
|
211
|
+
|
|
212
|
+
for (i = 1; i <= n; i++)
|
|
213
|
+
{
|
|
214
|
+
C[i] = interval((B[i][1] + B[i][2])/2);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return(box(C));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
static proc splitBox(box B, ideal I)
|
|
221
|
+
"USAGE: splitBox(box, I); box list of intervals, I ideal
|
|
222
|
+
RETURN: new list of smaller boxes, such that intersection of borders does not
|
|
223
|
+
contain zeros of I
|
|
224
|
+
NOTE: this uses exclusion tests and Groebner bases to determine whether the
|
|
225
|
+
intersection plane contains a root of I"
|
|
226
|
+
{
|
|
227
|
+
// at first split only at largest interval
|
|
228
|
+
int imax = 1;
|
|
229
|
+
int N = nvars(basering);
|
|
230
|
+
|
|
231
|
+
for (int i = 2; i <= N; i++)
|
|
232
|
+
{
|
|
233
|
+
if (length(B[i]) > length(B[imax]))
|
|
234
|
+
{
|
|
235
|
+
imax = i;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
number ratio = 1/2;
|
|
240
|
+
number mean;
|
|
241
|
+
box intersection;
|
|
242
|
+
ideal Inew;
|
|
243
|
+
|
|
244
|
+
while(1)
|
|
245
|
+
{
|
|
246
|
+
mean = ratio * B[imax][1] + (1 - ratio) * B[imax][2];
|
|
247
|
+
|
|
248
|
+
// note this works only for ideals with N generators or less
|
|
249
|
+
intersection = evalIdealAtBox(I, boxSet(B, imax, interval(mean)));
|
|
250
|
+
for (i = 1; i <= N; i++)
|
|
251
|
+
{
|
|
252
|
+
// check if any interval does not contain zero
|
|
253
|
+
if (intersection[i][1]*intersection[i][2] > 0)
|
|
254
|
+
{
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
Inew = I + (var(imax) - mean);
|
|
260
|
+
// check if groebner basis is trivial
|
|
261
|
+
if (std(Inew) == 1)
|
|
262
|
+
{
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// else there must?/might be a zero on the intersection, so decrease ratio
|
|
267
|
+
// slightly
|
|
268
|
+
ratio = ratio * 15/16;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// now split boxes
|
|
272
|
+
box boxLeft = boxSet(B, imax, bounds(B[imax][1], mean));
|
|
273
|
+
box boxRight = boxSet(B, imax, bounds(mean, B[imax][2]));
|
|
274
|
+
|
|
275
|
+
return(boxLeft, boxRight);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
static proc boxIsInterior(box A, box B)
|
|
279
|
+
"USAGE: boxIsInterior(A, B); A, B box
|
|
280
|
+
RETURN: 1 if A contained in int(B), else 0
|
|
281
|
+
EXAMPLE: example boxIsInterior; check whether A is contained in int(B)"
|
|
282
|
+
{
|
|
283
|
+
int N = nvars(basering);
|
|
284
|
+
for (int i = 1; i <= N; i++)
|
|
285
|
+
{
|
|
286
|
+
if (A[i][1] <= B[i][1] || A[i][2] >= B[i][2])
|
|
287
|
+
{
|
|
288
|
+
return(0);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return(1);
|
|
292
|
+
}
|
|
293
|
+
example
|
|
294
|
+
{
|
|
295
|
+
"EXAMPLE:"; echo=2;
|
|
296
|
+
|
|
297
|
+
ring R = 0,(x,y,z), lp;
|
|
298
|
+
|
|
299
|
+
box A = list(bounds(1,2), bounds(2,3), bounds(1/2,7/2)); A;
|
|
300
|
+
box B1 = list(bounds(0,5/2), bounds(1,4), bounds(0,9)); B1;
|
|
301
|
+
boxIsInterior(A,B1);
|
|
302
|
+
|
|
303
|
+
box B2 = list(bounds(2,4), bounds(1,4), bounds(0,9)); B2;
|
|
304
|
+
boxIsInterior(A,B2);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
308
|
+
|
|
309
|
+
// MATRIX FUNCTIONS
|
|
310
|
+
|
|
311
|
+
proc ivmatInit(int numrows, int numcols)
|
|
312
|
+
"USAGE: @code{ivmatInit(m, n)}; @code{m, n int}
|
|
313
|
+
RETURN: @code{m}x@code{n} matrix of [0,0]-intervals
|
|
314
|
+
PURPOSE: initialises an interval matrix with [0,0] intervals to ensure the
|
|
315
|
+
proper structure of the @code{ivmat} type
|
|
316
|
+
EXAMPLE: example ivmatInit; initialises an interval matrix"
|
|
317
|
+
{
|
|
318
|
+
ivmat A;
|
|
319
|
+
A.rows = list();
|
|
320
|
+
int i, j;
|
|
321
|
+
interval z = 0;
|
|
322
|
+
|
|
323
|
+
for (i = 1; i <= numrows; i++)
|
|
324
|
+
{
|
|
325
|
+
A.rows[i] = list();
|
|
326
|
+
for (j=1; j <= numcols; j++)
|
|
327
|
+
{
|
|
328
|
+
A.rows[i][j] = z;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return(A);
|
|
333
|
+
}
|
|
334
|
+
example
|
|
335
|
+
{
|
|
336
|
+
"EXAMPLE:"; echo = 2;
|
|
337
|
+
ring R = 0,x(1..5),dp;
|
|
338
|
+
|
|
339
|
+
ivmat A = ivmatInit(4, 5); A;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
static proc ivmatNrows(ivmat M)
|
|
343
|
+
"USAGE: nrows(M), M ivmat
|
|
344
|
+
RETURN: number of rows of M
|
|
345
|
+
EXAMPLE: example ivmatNrows; return number of rows"
|
|
346
|
+
{
|
|
347
|
+
return(size(M.rows));
|
|
348
|
+
}
|
|
349
|
+
example
|
|
350
|
+
{
|
|
351
|
+
"EXAMPLE:"; echo = 2;
|
|
352
|
+
ring R = 0,x,dp;
|
|
353
|
+
|
|
354
|
+
ivmat A = ivmatInit(2,3);
|
|
355
|
+
nrows(A);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
static proc ivmatNcols(ivmat M)
|
|
359
|
+
{
|
|
360
|
+
return(size(M.rows[1]));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static proc ivmatPrint(ivmat A)
|
|
364
|
+
{
|
|
365
|
+
int m = nrows(A);
|
|
366
|
+
for (int i = 1; i <= m; i++)
|
|
367
|
+
{
|
|
368
|
+
string(A.rows[i]);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
static proc ivmatGet(ivmat A, int i)
|
|
373
|
+
"USAGE: A[i], A ivmat, i int
|
|
374
|
+
RETURN: list A[i] of i-th row of A"
|
|
375
|
+
{
|
|
376
|
+
return(A.rows[i]);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
proc ivmatSet(ivmat A, int i, int j, interval I)
|
|
380
|
+
"USAGE: @code{ivmatSet(A, i, j, I)}; @code{A ivmat, i, j, int, I interval}
|
|
381
|
+
RETURN: interval matrix @code{A} where @code{A[i][j] == I}
|
|
382
|
+
PURPOSE: modify a single entry of an @code{ivmat}
|
|
383
|
+
EXAMPLE: example ivmatSet; assign values to A"
|
|
384
|
+
{
|
|
385
|
+
A.rows[i][j] = I;
|
|
386
|
+
return(A);
|
|
387
|
+
}
|
|
388
|
+
example
|
|
389
|
+
{
|
|
390
|
+
"EXAMPLE:"; echo = 2;
|
|
391
|
+
ring R = 0,x,dp;
|
|
392
|
+
ivmat A = ivmatInit(2,2); A;
|
|
393
|
+
A = ivmatSet(A, 1, 2, bounds(1, 2)); A;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
static proc diagMatrix(int n, interval I)
|
|
397
|
+
"USAGE: diagMatrix(n, I), n int, I interval
|
|
398
|
+
RETURN: diagonal nxn-matrix E where E[i][i] == I for all 1 <= i <= n
|
|
399
|
+
EXAMPLE: example diagMatrix; create diagonal matrix"
|
|
400
|
+
{
|
|
401
|
+
ivmat E = ivmatInit(n, n);
|
|
402
|
+
for (int i = 1; i <= n; i++)
|
|
403
|
+
{
|
|
404
|
+
E.rows[i][i] = I;
|
|
405
|
+
}
|
|
406
|
+
return(E);
|
|
407
|
+
}
|
|
408
|
+
example
|
|
409
|
+
{
|
|
410
|
+
"EXAMPLE:"; echo = 2;
|
|
411
|
+
ring R = 0,x,dp;
|
|
412
|
+
ivmat A = diagMatrix(2, bounds(1, 2)); A;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
proc unitMatrix(int n)
|
|
416
|
+
"USAGE: @code{unitMatrix(n)}; @code{n int}
|
|
417
|
+
RETURN: @code{n}x@code{n} unit interval matrix
|
|
418
|
+
EXAMPLE: example unitMatrix; generate a unit matrix"
|
|
419
|
+
{
|
|
420
|
+
return(diagMatrix(n, 1));
|
|
421
|
+
}
|
|
422
|
+
example
|
|
423
|
+
{
|
|
424
|
+
"EXAMPLE:"; echo = 2;
|
|
425
|
+
ring R = 0,(x,y),dp;
|
|
426
|
+
unitMatrix(2);
|
|
427
|
+
unitMatrix(3);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
static proc ivmatMultiply(ivmat A, ivmat B)
|
|
431
|
+
{
|
|
432
|
+
int m = nrows(A);
|
|
433
|
+
int n = ncols(B);
|
|
434
|
+
int p = ncols(A);
|
|
435
|
+
|
|
436
|
+
if (p <> nrows(B))
|
|
437
|
+
{
|
|
438
|
+
ERROR("Matrices have wrong dimensions!");
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
ivmat C = ivmatInit(m, n);
|
|
442
|
+
int i, j, k;
|
|
443
|
+
interval I;
|
|
444
|
+
|
|
445
|
+
for (i = 1; i <= m; i++)
|
|
446
|
+
{
|
|
447
|
+
for (j = 1; j <= n; j++)
|
|
448
|
+
{
|
|
449
|
+
I = 0;
|
|
450
|
+
for (k = 1; k <= p; k++)
|
|
451
|
+
{
|
|
452
|
+
I = I + A[i][k] * B[k][j];
|
|
453
|
+
}
|
|
454
|
+
C.rows[i][j] = I;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return(C);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
proc ivmatGaussian(ivmat A)
|
|
462
|
+
"USAGE: @code{ivmatGaussian(A)}; @code{A ivmat}
|
|
463
|
+
RETURN: 0, if @code{A} not invertible, @code{(1, Ainv)} if @code{A} invertible
|
|
464
|
+
where @code{Ainv} is the inverse matrix
|
|
465
|
+
PURPOSE: Inverts an interval matrix using Gaussian elimination in the setting
|
|
466
|
+
of interval arithmetic. Pivoting is handled as a special case as
|
|
467
|
+
@code{I/I != [1,1]} and @code{I-I != [0,0]} in general.
|
|
468
|
+
EXAMPLE: example ivmatGaussian; inverts a matrix"
|
|
469
|
+
{
|
|
470
|
+
int n = nrows(A);
|
|
471
|
+
if (n <> ncols(A))
|
|
472
|
+
{
|
|
473
|
+
ERROR("Matrix non-square");
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
ivmat Ainv = unitMatrix(n);
|
|
477
|
+
list tmp;
|
|
478
|
+
interval TMP;
|
|
479
|
+
|
|
480
|
+
int i, j, pos;
|
|
481
|
+
for (pos = 1; pos <= n; pos++)
|
|
482
|
+
{
|
|
483
|
+
i = pos;
|
|
484
|
+
|
|
485
|
+
// get non-zero interval on diagonal
|
|
486
|
+
while(A[i][pos][1] * A[i][pos][2] <= 0)
|
|
487
|
+
{
|
|
488
|
+
i++;
|
|
489
|
+
// if no non-zero intervals exist, then matrix must be singular
|
|
490
|
+
if (i > n)
|
|
491
|
+
{
|
|
492
|
+
return(0);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (i <> pos)
|
|
496
|
+
{
|
|
497
|
+
tmp = A.rows[i];
|
|
498
|
+
A.rows[i] = A.rows[pos];
|
|
499
|
+
A.rows[pos] = tmp;
|
|
500
|
+
|
|
501
|
+
tmp = Ainv.rows[i];
|
|
502
|
+
Ainv.rows[i] = Ainv.rows[pos];
|
|
503
|
+
Ainv.rows[pos] = tmp;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// pivot (pos,pos)
|
|
507
|
+
TMP = A[pos][pos];
|
|
508
|
+
A.rows[pos][pos] = interval(1);
|
|
509
|
+
|
|
510
|
+
for (j = 1; j <= n; j++)
|
|
511
|
+
{
|
|
512
|
+
if (pos <> j)
|
|
513
|
+
{
|
|
514
|
+
A.rows[pos][j] = A[pos][j]/TMP;
|
|
515
|
+
}
|
|
516
|
+
Ainv.rows[pos][j] = Ainv[pos][j]/TMP;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// clear entries above and below
|
|
520
|
+
for (i = 1; i <= n; i++)
|
|
521
|
+
{
|
|
522
|
+
if (i <> pos)
|
|
523
|
+
{
|
|
524
|
+
TMP = A[i][pos];
|
|
525
|
+
A.rows[i][pos] = interval(0);
|
|
526
|
+
for (j = 1; j <= n; j++)
|
|
527
|
+
{
|
|
528
|
+
if (j <> pos)
|
|
529
|
+
{
|
|
530
|
+
A.rows[i][j] = A[i][j] - A[pos][j]*TMP;
|
|
531
|
+
}
|
|
532
|
+
Ainv.rows[i][j] = Ainv[i][j] - Ainv[pos][j]*TMP;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return(1, Ainv);
|
|
538
|
+
}
|
|
539
|
+
example
|
|
540
|
+
{
|
|
541
|
+
"EXAMPLE:"; echo = 2;
|
|
542
|
+
ring R = 0,(x,y),dp;
|
|
543
|
+
|
|
544
|
+
ideal I = 2x2-xy+2y2-2,2x2-3xy+3y2-2;
|
|
545
|
+
box B = list(bounds(7/8, 9/8), bounds(-1/10, 1/20));
|
|
546
|
+
|
|
547
|
+
ivmat J = evalJacobianAtBox (I, B); J;
|
|
548
|
+
|
|
549
|
+
list result = ivmatGaussian(J);
|
|
550
|
+
ivmat Jinv = result[2];
|
|
551
|
+
Jinv;
|
|
552
|
+
|
|
553
|
+
Jinv * J;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
static proc applyMatrix(ivmat A, box b)
|
|
557
|
+
{
|
|
558
|
+
int n = nvars(basering);
|
|
559
|
+
|
|
560
|
+
if (ncols(A) <> n || nrows(A) <> n)
|
|
561
|
+
{
|
|
562
|
+
ERROR("Matrix has wrong dimensions");
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
int i, j;
|
|
566
|
+
list result;
|
|
567
|
+
interval tmp;
|
|
568
|
+
|
|
569
|
+
for (i = 1; i <= n; i++)
|
|
570
|
+
{
|
|
571
|
+
tmp = 0;
|
|
572
|
+
for (j = 1; j <= n; j++)
|
|
573
|
+
{
|
|
574
|
+
tmp = tmp + A[i][j] * b[j];
|
|
575
|
+
}
|
|
576
|
+
result[i] = tmp;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
return(box(result));
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
static proc ivmatMultiplyGeneral(ivmat A, B)
|
|
583
|
+
{
|
|
584
|
+
if (typeof(B) == "ivmat")
|
|
585
|
+
{
|
|
586
|
+
return(ivmatMultiply(A, B));
|
|
587
|
+
}
|
|
588
|
+
if (typeof(B) == "box")
|
|
589
|
+
{
|
|
590
|
+
return(applyMatrix(A, B));
|
|
591
|
+
}
|
|
592
|
+
ERROR("Type not supported.");
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
596
|
+
|
|
597
|
+
// POLYNOMIAL APPLICATIONS
|
|
598
|
+
|
|
599
|
+
proc evalPolyAtBox()
|
|
600
|
+
"USAGE: @code{evalPolyAtBox(f, B)}; @code{f poly, B box}
|
|
601
|
+
RETURN: interval, evaluation of @code{f} at @code{B} using interval arithmetic
|
|
602
|
+
PURPOSE: computes an interval extension of the polynomial
|
|
603
|
+
EXAMPLE: example evalPolyAtBox; shows an example"
|
|
604
|
+
{
|
|
605
|
+
}
|
|
606
|
+
example
|
|
607
|
+
{
|
|
608
|
+
"EXAMPLE:"; echo = 2;
|
|
609
|
+
ring R = 0,(x,y),dp;
|
|
610
|
+
poly f = x2+y-1;
|
|
611
|
+
box B = list(bounds(-1,1), bounds(1,3)/2);
|
|
612
|
+
interval I = evalPolyAtBox(f, B); I;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
proc evalJacobianAtBox(ideal I, box B)
|
|
616
|
+
"USAGE: @code{evalJacobianAtBox(I, B)}; @code{I ideal, B box}
|
|
617
|
+
RETURN: Jacobian matrix of @code{I} where polynomials are evaluated at @code{B}
|
|
618
|
+
PURPOSE: evaluates each polynomial of the Jacobian matrix of @code{I} using
|
|
619
|
+
interval arithmetic
|
|
620
|
+
EXAMPLE: example evalJacobianAtBox; evaluate Jacobian at box"
|
|
621
|
+
{
|
|
622
|
+
matrix J = jacob(I);
|
|
623
|
+
int m = nrows(J);
|
|
624
|
+
int n = ncols(J);
|
|
625
|
+
ivmat M = ivmatInit(m, n);
|
|
626
|
+
|
|
627
|
+
int i, j;
|
|
628
|
+
|
|
629
|
+
for (i = 1; i <= m; i++)
|
|
630
|
+
{
|
|
631
|
+
for (j = 1; j <=n ; j++)
|
|
632
|
+
{
|
|
633
|
+
M.rows[i][j] = evalPolyAtBox(J[i,j], B);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return(M);
|
|
637
|
+
}
|
|
638
|
+
example
|
|
639
|
+
{
|
|
640
|
+
"EXAMPLE:"; echo = 2;
|
|
641
|
+
ring R = 0,(x,y),dp;
|
|
642
|
+
ideal I = 2x2-xy+2y2-2, 2x2-3xy+3y2-2;
|
|
643
|
+
|
|
644
|
+
interval J = bounds(-1,1);
|
|
645
|
+
evalJacobianAtBox(I, list(J,J));
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
static proc testPolyBox(ideal I, box B)
|
|
649
|
+
"USAGE: testPolyBox(I, B); I ideal, B box
|
|
650
|
+
RETURN: list(int, box):
|
|
651
|
+
-1, if ideal has no zeros in given box,
|
|
652
|
+
1, if unique zero in given box,
|
|
653
|
+
0, if test is inconclusive;
|
|
654
|
+
box is intersection of Newton step and supplied box if applicable
|
|
655
|
+
NOTE: rounding is performed on fractions obtained by matrix inversion to
|
|
656
|
+
prevent the size of denominators and numerators from increasing
|
|
657
|
+
dramatically
|
|
658
|
+
EXAMPLE: example testPolyBox; tests the above for intersection of ellipses."
|
|
659
|
+
{
|
|
660
|
+
int N = nvars(basering);
|
|
661
|
+
int isreal = find(charstr(basering), "Float(");
|
|
662
|
+
int i;
|
|
663
|
+
|
|
664
|
+
interval tmp;
|
|
665
|
+
number lo, up, m, n;
|
|
666
|
+
|
|
667
|
+
for (i = 1; i <= ncols(I); i++)
|
|
668
|
+
{
|
|
669
|
+
tmp = evalPolyAtBox(I[i], B);
|
|
670
|
+
// check if 0 contained in every interval
|
|
671
|
+
// return -1 if not
|
|
672
|
+
if (tmp[1]*tmp[2] > 0)
|
|
673
|
+
{
|
|
674
|
+
return(-1, B);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// this is always the case in our applications
|
|
679
|
+
if (ncols(I) == N)
|
|
680
|
+
{
|
|
681
|
+
// calculate center as box of intervals instead of numbers so we may reuse
|
|
682
|
+
// other procedures
|
|
683
|
+
box Bcenter = boxCenter(B);
|
|
684
|
+
|
|
685
|
+
ivmat J = evalJacobianAtBox(I, B);
|
|
686
|
+
list inverse = ivmatGaussian(J);
|
|
687
|
+
|
|
688
|
+
// only continue if J is invertible, i.e. J contains no singular matrix
|
|
689
|
+
if (!inverse[1])
|
|
690
|
+
{
|
|
691
|
+
return(0, B);
|
|
692
|
+
}
|
|
693
|
+
ivmat Jinverse = inverse[2];
|
|
694
|
+
|
|
695
|
+
// calculate Bcenter - f(B)^(-1)f(Bcenter)
|
|
696
|
+
box fB = evalIdealAtBox(I, Bcenter);
|
|
697
|
+
fB = Bcenter - (Jinverse * fB);
|
|
698
|
+
|
|
699
|
+
// algorithm will not process box further, so do not modify
|
|
700
|
+
int laststep = boxIsInterior(fB, B);
|
|
701
|
+
|
|
702
|
+
// else intersection is empty or non-trivial
|
|
703
|
+
def bInt = intersect(B, fB);
|
|
704
|
+
|
|
705
|
+
// if intersection is empty bInt == -1
|
|
706
|
+
if (typeof(bInt) == "int")
|
|
707
|
+
{
|
|
708
|
+
return(-1, B);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// if Newton step is a single point it is a root
|
|
712
|
+
if (boxLength(fB) == 0)
|
|
713
|
+
{
|
|
714
|
+
return(1,fB);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
if (isreal)
|
|
718
|
+
{
|
|
719
|
+
// fraction simplification over real basering is pointless
|
|
720
|
+
B = bInt;
|
|
721
|
+
}
|
|
722
|
+
else
|
|
723
|
+
{
|
|
724
|
+
// attempt simplification of fractions
|
|
725
|
+
list bb;
|
|
726
|
+
for (i = 1; i <= N; i++)
|
|
727
|
+
{
|
|
728
|
+
lo = B[i][1];
|
|
729
|
+
up = B[i][2];
|
|
730
|
+
|
|
731
|
+
// modify numerators of B to tighten box
|
|
732
|
+
if (lo < bInt[i][1])
|
|
733
|
+
{
|
|
734
|
+
n = denominator(lo);
|
|
735
|
+
lo = floor(bInt[i][1]*n)/n;
|
|
736
|
+
}
|
|
737
|
+
if (up > bInt[i][2])
|
|
738
|
+
{
|
|
739
|
+
n = denominator(up);
|
|
740
|
+
up = ceil(bInt[i][2]*n)/n;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// make sure box does not grow
|
|
744
|
+
if (lo >= B[i][1] && up <= B[i][2])
|
|
745
|
+
{
|
|
746
|
+
bb[i] = bounds(lo, up);
|
|
747
|
+
}
|
|
748
|
+
else
|
|
749
|
+
{
|
|
750
|
+
bb[i] = bInt[i];
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
B = bb;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
if (laststep)
|
|
758
|
+
{
|
|
759
|
+
return(1, B);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// no condition could be verified
|
|
764
|
+
return(0, B);
|
|
765
|
+
}
|
|
766
|
+
example
|
|
767
|
+
{
|
|
768
|
+
"EXAMPLE:"; echo = 2;
|
|
769
|
+
ring R = 0,(x,y),dp;
|
|
770
|
+
ideal I = 2x2-xy+2y2-2, 2x2-3xy+3y2-2;
|
|
771
|
+
|
|
772
|
+
interval unit = bounds(0, 1);
|
|
773
|
+
// there may be common zeros in [0,1]x[0,1]
|
|
774
|
+
testPolyBox(I, list(unit, unit));
|
|
775
|
+
|
|
776
|
+
// there are no common zeros in [0,0.5]x[0,0.5]
|
|
777
|
+
testPolyBox(I, list(unit/2, unit/2));
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
static proc evalIdealAtBox(ideal I, box B)
|
|
781
|
+
"USAGE: evalIdealAtBox(I, B); I ideal, B box;
|
|
782
|
+
ASSUME: ncols(I) <= nvars(basering), as boxes have exactly nvars(basering)
|
|
783
|
+
entries
|
|
784
|
+
RETURN: box which results from evaluating each polynomial in I at B
|
|
785
|
+
EXAMPLE: example evalIdealAtBox; evaluates an ideal at a box"
|
|
786
|
+
{
|
|
787
|
+
list resu;
|
|
788
|
+
|
|
789
|
+
for (int j = 1; j <= size(I); j++)
|
|
790
|
+
{
|
|
791
|
+
resu[j] = evalPolyAtBox(I[j], B);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
return(box(resu));
|
|
795
|
+
}
|
|
796
|
+
example
|
|
797
|
+
{
|
|
798
|
+
"EXAMPLE:"; echo = 2;
|
|
799
|
+
ring R = 0,(x,y),dp;
|
|
800
|
+
interval I1 = bounds(0, 1); I1;
|
|
801
|
+
interval I2 = bounds(0, 1); I2;
|
|
802
|
+
|
|
803
|
+
poly f = xy2 + 2x2 + (3/2)*y3x + 1;
|
|
804
|
+
poly g = 3x2 + 2y;
|
|
805
|
+
|
|
806
|
+
ideal I = f,g;
|
|
807
|
+
list intervals = I1,I2;
|
|
808
|
+
|
|
809
|
+
evalIdealAtBox(I, intervals);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// construct box in subring that contains var(i) iff u[i]==0
|
|
813
|
+
static proc boxProjection(box B, intvec v)
|
|
814
|
+
{
|
|
815
|
+
box new;
|
|
816
|
+
int i, j = 1, 1;
|
|
817
|
+
for (i = 1; i <= size(v); i++)
|
|
818
|
+
{
|
|
819
|
+
if (v[i] == 0)
|
|
820
|
+
{
|
|
821
|
+
new = boxSet(new, j, B[i]);
|
|
822
|
+
j++;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
return(new);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// construct box from box in subring, replacing entries corresponding to
|
|
829
|
+
// variables that also exist in subring
|
|
830
|
+
static proc boxEmbedding(box B, box Bproj, intvec v)
|
|
831
|
+
{
|
|
832
|
+
int N = nvars(basering);
|
|
833
|
+
int i, j = 1, 1;
|
|
834
|
+
for (i = 1; i<= N; i++)
|
|
835
|
+
{
|
|
836
|
+
if (v[i] == 0)
|
|
837
|
+
{
|
|
838
|
+
B = boxSet(B, i, Bproj[j]);
|
|
839
|
+
j++;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
return(B);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
// use laguerre solver for univariate case
|
|
847
|
+
static proc solveunivar(poly f)
|
|
848
|
+
{
|
|
849
|
+
def R1 = basering;
|
|
850
|
+
ring R = (real,30,i),x,dp;
|
|
851
|
+
poly f = fetch(R1,f);
|
|
852
|
+
int i,j,k;
|
|
853
|
+
int epsilon=12;
|
|
854
|
+
int tst;
|
|
855
|
+
while (tst==0)
|
|
856
|
+
{
|
|
857
|
+
if (epsilon>29){ERROR("Precision not sufficient");}
|
|
858
|
+
setring R;
|
|
859
|
+
list r = laguerre_solve(f,epsilon);
|
|
860
|
+
list r1;
|
|
861
|
+
for(j = 1;j<=size(r);j++)
|
|
862
|
+
{
|
|
863
|
+
if(impart(r[j])==0)
|
|
864
|
+
{
|
|
865
|
+
number rj =r[j];
|
|
866
|
+
if (rj<>0){rj=round(rj*number(10)^epsilon);}
|
|
867
|
+
r1 = insert(r1,string(imap(R,rj)));
|
|
868
|
+
kill rj;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
kill r;
|
|
872
|
+
k = size(r1);
|
|
873
|
+
setring R1;
|
|
874
|
+
list r2;
|
|
875
|
+
for(i=1; i<=k;i++)
|
|
876
|
+
{
|
|
877
|
+
execute("number m ="+r1[i]);
|
|
878
|
+
m=m/(number(10)^epsilon);
|
|
879
|
+
r2 = insert(r2,m);
|
|
880
|
+
kill m;
|
|
881
|
+
}
|
|
882
|
+
number t = (number(10)^epsilon)^(-1);
|
|
883
|
+
tst=1;
|
|
884
|
+
for (j=1;j<=k;j++)
|
|
885
|
+
{
|
|
886
|
+
if (sturm(f,r2[j]-t,r2[j]+t)>1){tst=0;break;};
|
|
887
|
+
}
|
|
888
|
+
epsilon++;
|
|
889
|
+
}
|
|
890
|
+
list iv;
|
|
891
|
+
for (i=1; i<=size(r2);i++)
|
|
892
|
+
{
|
|
893
|
+
number lo = r2[i]-t;
|
|
894
|
+
number hi = r2[i]+t;
|
|
895
|
+
iv[i]=bounds(lo,hi);
|
|
896
|
+
kill lo,hi;
|
|
897
|
+
}
|
|
898
|
+
return(iv);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
proc rootIsolationNoPreprocessing(ideal I, list start, number eps)
|
|
902
|
+
"USAGE: @code{rootIsolationNoPreprocessing(I, B, eps)};
|
|
903
|
+
@code{I ideal, B list of boxes, eps number};
|
|
904
|
+
ASSUME: @code{I} is a zero-dimensional radical ideal
|
|
905
|
+
RETURN: @code{(L1, L2)}, where @code{L1} contains boxes smaller than eps which
|
|
906
|
+
may contain an element of V(@code{I}), i.e. a root and @code{L2}
|
|
907
|
+
contains boxes which contain exactly one element of V(@code{I})
|
|
908
|
+
PURPOSE: Given input box(es) @code{start} we try to find all roots of @code{I}
|
|
909
|
+
lying in @code{start} by computing boxes that contain exactly one root.
|
|
910
|
+
If @code{eps} > 0 then boxes that become smaller than @code{eps} will
|
|
911
|
+
be returned.
|
|
912
|
+
THEORY: We first check for every box if it contains no roots by interval
|
|
913
|
+
arithmetic. If this is inconclusive we apply the Newton step which, as
|
|
914
|
+
outlined in [2] and [3], converges to a root lying in the starting box.
|
|
915
|
+
If the result of the Newton step is already contained in the interior
|
|
916
|
+
of the starting box, it contains a unique root.
|
|
917
|
+
NOTE: While @code{rootIsolation} does, @code{rootIsolationNoPreprocessing}
|
|
918
|
+
does not check input ideal for necessary conditions.
|
|
919
|
+
EXAMPLE: example rootIsolationNoPreprocessing; exclusion test for intersection
|
|
920
|
+
of two ellipses"
|
|
921
|
+
{
|
|
922
|
+
int i;
|
|
923
|
+
if (nvars(basering)==1)
|
|
924
|
+
{
|
|
925
|
+
list iv = solveunivar(I[1]);
|
|
926
|
+
list bo;
|
|
927
|
+
for (i=1; i<=size(iv);i++)
|
|
928
|
+
{
|
|
929
|
+
bo[i] = box(list(iv[i]));
|
|
930
|
+
}
|
|
931
|
+
return(list(),bo);
|
|
932
|
+
}
|
|
933
|
+
// set of boxes smaller than eps
|
|
934
|
+
list lBoxesSize;
|
|
935
|
+
// set of boxes which exactly contain one solution
|
|
936
|
+
list lBoxesUnique;
|
|
937
|
+
// set of boxes initialised to input
|
|
938
|
+
list lBoxes = start;
|
|
939
|
+
//help set of boxes
|
|
940
|
+
list lBoxesHelp;
|
|
941
|
+
|
|
942
|
+
int j, s, cnt;
|
|
943
|
+
int zeroTest;
|
|
944
|
+
int N = nvars(basering);
|
|
945
|
+
|
|
946
|
+
intvec empty;
|
|
947
|
+
def rSource = basering;
|
|
948
|
+
list lSubstBoxesSize, lSubstBoxesUnique;
|
|
949
|
+
|
|
950
|
+
ideal Isubst;
|
|
951
|
+
string rSubstString;
|
|
952
|
+
|
|
953
|
+
while (size(lBoxes) <> 0)
|
|
954
|
+
{
|
|
955
|
+
// lBoxesHelp is empty set
|
|
956
|
+
lBoxesHelp = list();
|
|
957
|
+
s = 0;
|
|
958
|
+
|
|
959
|
+
for (i=1; i<=size(lBoxes); i++)
|
|
960
|
+
{
|
|
961
|
+
//case that maybe there is a root in the box
|
|
962
|
+
zeroTest, lBoxes[i] = testPolyBox(I,lBoxes[i]);
|
|
963
|
+
if (zeroTest == 1)
|
|
964
|
+
{
|
|
965
|
+
lBoxesUnique[size(lBoxesUnique)+1] = lBoxes[i];
|
|
966
|
+
}
|
|
967
|
+
if (zeroTest == 0)
|
|
968
|
+
{
|
|
969
|
+
// check for empty interior
|
|
970
|
+
empty = boxEmptyIntervals(lBoxes[i]);
|
|
971
|
+
// check if at least one interval is single number
|
|
972
|
+
if (max(empty[1..N]))
|
|
973
|
+
{
|
|
974
|
+
// If the box lBoxes[i] contains singleton intervals, i.e. single
|
|
975
|
+
// numbers, we substitute the corresponding ring variables with these
|
|
976
|
+
// numbers and pass to the subring where these variables have been
|
|
977
|
+
// removed.
|
|
978
|
+
// As rootIsolation now accepts ideals with arbitrary generators we
|
|
979
|
+
// compute the zeros of the substitution ideal and reassemble the
|
|
980
|
+
// boxes afterwards.
|
|
981
|
+
//
|
|
982
|
+
// This is probably overkill.
|
|
983
|
+
Isubst = I;
|
|
984
|
+
// name ring rSubst(voice) to avoid name conflicts if
|
|
985
|
+
// we (unlikely) enter another level of recursion
|
|
986
|
+
rSubstString = "(";
|
|
987
|
+
for (j = 1; j <= N; j++)
|
|
988
|
+
{
|
|
989
|
+
if (empty[j])
|
|
990
|
+
{
|
|
991
|
+
Isubst = subst(Isubst, var(j), lBoxes[i][j][1]);
|
|
992
|
+
}
|
|
993
|
+
else
|
|
994
|
+
{
|
|
995
|
+
rSubstString = rSubstString + varstr(j) + ",";
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
rSubstString = string(rSubstString[1..(size(rSubstString)-1)]) + ")";
|
|
999
|
+
dbprint("passing to subring");
|
|
1000
|
+
ring rSubst(voice) = create_ring(0, rSubstString, "dp");
|
|
1001
|
+
ideal Isubst = imap(rSource, Isubst);
|
|
1002
|
+
number eps = imap(rSource, eps);
|
|
1003
|
+
lSubstBoxesSize, lSubstBoxesUnique = rootIsolation(Isubst,
|
|
1004
|
+
boxProjection(lBoxes[i], empty), eps);
|
|
1005
|
+
setring rSource;
|
|
1006
|
+
for (j = 1; j <= size(lSubstBoxesSize); j++)
|
|
1007
|
+
{
|
|
1008
|
+
lSubstBoxesSize[j] = boxEmbedding(lBoxes[i], lSubstBoxesSize[j], empty);
|
|
1009
|
+
}
|
|
1010
|
+
lBoxesSize = lBoxesSize + lSubstBoxesSize;
|
|
1011
|
+
for (j = 1; j <= size(lSubstBoxesUnique); j++)
|
|
1012
|
+
{
|
|
1013
|
+
lSubstBoxesUnique[j] = boxEmbedding(lBoxes[i], lSubstBoxesUnique[j], empty);
|
|
1014
|
+
}
|
|
1015
|
+
lBoxesUnique = lBoxesUnique + lSubstBoxesUnique;
|
|
1016
|
+
kill rSubst(voice);
|
|
1017
|
+
}
|
|
1018
|
+
else
|
|
1019
|
+
{
|
|
1020
|
+
// remove boxes smaller than limit eps
|
|
1021
|
+
if (boxLength(lBoxes[i]) < eps)
|
|
1022
|
+
{
|
|
1023
|
+
lBoxesSize[size(lBoxesSize)+1] = lBoxes[i];
|
|
1024
|
+
}
|
|
1025
|
+
else
|
|
1026
|
+
{
|
|
1027
|
+
// else split the box and put the smaller boxes to lBoxesHelp
|
|
1028
|
+
lBoxesHelp[s+1..s+2] = splitBox(lBoxes[i], I);
|
|
1029
|
+
s = s+2;
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
cnt++;
|
|
1036
|
+
dbprint(string("[", cnt, "] ", s, " boxes"));
|
|
1037
|
+
|
|
1038
|
+
lBoxes = lBoxesHelp;
|
|
1039
|
+
}
|
|
1040
|
+
return(lBoxesSize, lBoxesUnique);
|
|
1041
|
+
}
|
|
1042
|
+
example
|
|
1043
|
+
{
|
|
1044
|
+
"EXAMPLE:"; echo = 2;
|
|
1045
|
+
|
|
1046
|
+
ring R = 0,(x,y),dp;
|
|
1047
|
+
ideal I = 2x2-xy+2y2-2,2x2-3xy+3y2-2; // V(I) has four elements
|
|
1048
|
+
|
|
1049
|
+
interval i = bounds(-3/2,3/2);
|
|
1050
|
+
box B = list(i, i);
|
|
1051
|
+
|
|
1052
|
+
list result = rootIsolationNoPreprocessing(I, list(B), 1/512);
|
|
1053
|
+
size(result[1]);
|
|
1054
|
+
size(result[2]);
|
|
1055
|
+
|
|
1056
|
+
result;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
// this takes a triangular decomposition of an ideal and applies rootIsolation
|
|
1060
|
+
// to all the ideals in the list and checks afterwards if the found boxes
|
|
1061
|
+
// intersect.
|
|
1062
|
+
static proc rootIsolationTriangL(list T, #)
|
|
1063
|
+
{
|
|
1064
|
+
int n = size(T);
|
|
1065
|
+
int i;
|
|
1066
|
+
list lBoxesUnique, lBoxesSize, lRoots;
|
|
1067
|
+
def bInt;
|
|
1068
|
+
for (i = 1; i <= n; i++)
|
|
1069
|
+
{
|
|
1070
|
+
lRoots = rootIsolation(T[i], #);
|
|
1071
|
+
// since we don't know anything about boxes in the first list just put them
|
|
1072
|
+
// together
|
|
1073
|
+
lBoxesSize = lBoxesSize + lRoots[1];
|
|
1074
|
+
lBoxesUnique = lBoxesUnique + lRoots[2];
|
|
1075
|
+
}
|
|
1076
|
+
return(lBoxesSize, lBoxesUnique);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
proc rootIsolationPrimdec(ideal I)
|
|
1080
|
+
"USAGE: @code{rootIsolationPrimdec(I)};
|
|
1081
|
+
@code{I ideal}
|
|
1082
|
+
ASSUME: @code{I} is a zero-dimensional radical ideal
|
|
1083
|
+
RETURN: @code{L}, where @code{L}
|
|
1084
|
+
contains boxes which contain exactly one element of V(@code{I})
|
|
1085
|
+
PURPOSE: same as @code{rootIsolation}, but speeds up computation and improves output
|
|
1086
|
+
by doing a primary decomposition before doing the root isolation
|
|
1087
|
+
THEORY: For the primary decomposition we use the algorithm of Gianni-Traeger-Zarcharias.
|
|
1088
|
+
NOTE: This algorithm and some procedures used therein perform Groebner basis
|
|
1089
|
+
computations in @code{basering}. It is thus advised to define @code{I}
|
|
1090
|
+
w.r.t. a fast monomial ordering. @*
|
|
1091
|
+
EXAMPLE: example rootIsolationPrimdec; for intersection of two ellipses"
|
|
1092
|
+
{
|
|
1093
|
+
def R = basering;
|
|
1094
|
+
int n = nvars(R);
|
|
1095
|
+
I=radical(I);
|
|
1096
|
+
list dc = primdecGTZ(I);
|
|
1097
|
+
list sols,va,dci,ri,RL,RLi;
|
|
1098
|
+
int i,j,l;
|
|
1099
|
+
ideal idi;
|
|
1100
|
+
interval ii;
|
|
1101
|
+
RL = ringlist(R);
|
|
1102
|
+
for (i = 1; i<=size(dc);i++)
|
|
1103
|
+
{
|
|
1104
|
+
dci = elimpart(dc[i][1]);
|
|
1105
|
+
idi = dci[1];
|
|
1106
|
+
list keepvar,delvar;
|
|
1107
|
+
for (j=1; j<=n;j++)
|
|
1108
|
+
{
|
|
1109
|
+
if ((dci[4][j]!=0) or (deg(dci[5][j])>0))
|
|
1110
|
+
{
|
|
1111
|
+
keepvar[size(keepvar)+1] = j;
|
|
1112
|
+
} else {
|
|
1113
|
+
delvar[size(delvar)+1] = j;
|
|
1114
|
+
}
|
|
1115
|
+
if ((dci[4][j]==0) and (deg(dci[5][j])>0))
|
|
1116
|
+
{
|
|
1117
|
+
idi = idi + ideal(var(j)-dci[5][j]);
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
RLi = RL;
|
|
1121
|
+
if (size(delvar)>0)
|
|
1122
|
+
{
|
|
1123
|
+
RLi[2]=deleteSublist(intvec(delvar[1..size(delvar)]),RLi[2]);
|
|
1124
|
+
RLi[3]=list(list("dp",intvec(1:size(keepvar))),list("C",0));
|
|
1125
|
+
}
|
|
1126
|
+
if (size(keepvar)>0)
|
|
1127
|
+
{
|
|
1128
|
+
def Ri = ring(RLi);
|
|
1129
|
+
setring Ri;
|
|
1130
|
+
ideal idi=imap(R,idi);
|
|
1131
|
+
ri = rootIsolation(idi);
|
|
1132
|
+
setring R;
|
|
1133
|
+
kill Ri;
|
|
1134
|
+
list ivlist;
|
|
1135
|
+
for (l=1;l<=size(ri[2]);l++)
|
|
1136
|
+
{
|
|
1137
|
+
for (j=1; j<=size(keepvar); j++)
|
|
1138
|
+
{
|
|
1139
|
+
ivlist[keepvar[j]]=ri[2][l][j];
|
|
1140
|
+
}
|
|
1141
|
+
for (j=1; j<=size(delvar); j++)
|
|
1142
|
+
{
|
|
1143
|
+
ii = bounds(number(dci[5][delvar[j]]));
|
|
1144
|
+
ivlist[delvar[j]]=ii;
|
|
1145
|
+
}
|
|
1146
|
+
sols[size(sols)+1]=box(ivlist);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
else
|
|
1150
|
+
{
|
|
1151
|
+
list ivlist;
|
|
1152
|
+
for (j=1; j<=size(delvar); j++)
|
|
1153
|
+
{
|
|
1154
|
+
ii = bounds(number(dci[5][delvar[j]]));
|
|
1155
|
+
ivlist[delvar[j]]=ii;
|
|
1156
|
+
}
|
|
1157
|
+
sols[size(sols)+1]=box(ivlist);
|
|
1158
|
+
}
|
|
1159
|
+
kill keepvar,delvar,ivlist;
|
|
1160
|
+
}
|
|
1161
|
+
return(sols);
|
|
1162
|
+
}
|
|
1163
|
+
example
|
|
1164
|
+
{
|
|
1165
|
+
"EXAMPLE:"; echo = 2;
|
|
1166
|
+
|
|
1167
|
+
ring R = 0,(x,y),dp;
|
|
1168
|
+
ideal I = 2x2-xy+2y2-2,2x2-3xy+3y2-2; // V(I) has four elements
|
|
1169
|
+
list result = rootIsolationPrimdec(I);
|
|
1170
|
+
|
|
1171
|
+
result;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
proc rootIsolation(ideal I, list #)
|
|
1176
|
+
"USAGE: @code{rootIsolation(I, [start, eps])};
|
|
1177
|
+
@code{I ideal, start box, eps number}
|
|
1178
|
+
ASSUME: @code{I} is a zero-dimensional radical ideal
|
|
1179
|
+
RETURN: @code{(L1, L2)}, where @code{L1} contains boxes smaller than eps which
|
|
1180
|
+
may contain an element of V(@code{I}), i.e. a root and @code{L2}
|
|
1181
|
+
contains boxes which contain exactly one element of V(@code{I})
|
|
1182
|
+
PURPOSE: same as @code{rootIsolationNoPreprocessing}, but speeds up computation
|
|
1183
|
+
by preprocessing starting box
|
|
1184
|
+
THEORY: As every root of @code{I} is a root of the polynomials @code{I[i]}, we
|
|
1185
|
+
use Groebner elimination to find univariate polynomials for every
|
|
1186
|
+
variable which have these roots as well. Using that @code{I} is
|
|
1187
|
+
zero-dimensional these Groebner bases may be quickly computed using
|
|
1188
|
+
FGLM. Applying root isolation to these univariate polynomials then
|
|
1189
|
+
provides smaller starting boxes which speed up computations in the
|
|
1190
|
+
multivariate case.
|
|
1191
|
+
NOTE: This algorithm and some procedures used therein perform Groebner basis
|
|
1192
|
+
computations in @code{basering}. It is thus advised to define @code{I}
|
|
1193
|
+
w.r.t. a fast monomial ordering. @*
|
|
1194
|
+
The algorithm performs checks on @code{I} to prevent errors. If
|
|
1195
|
+
@code{I} does not have the right number of generators, we first try to
|
|
1196
|
+
find a suitable Groebner basis. If this fails we apply the algorithm
|
|
1197
|
+
to the triangular decomposition of @code{I}.
|
|
1198
|
+
EXAMPLE: example rootIsolation; for intersection of two ellipses"
|
|
1199
|
+
{
|
|
1200
|
+
dbprint("Start rootisolation");
|
|
1201
|
+
int N = nvars(basering);
|
|
1202
|
+
int i, j, k, l;
|
|
1203
|
+
int genNumIndex = 0;
|
|
1204
|
+
|
|
1205
|
+
// input parameter check
|
|
1206
|
+
int determinebox;
|
|
1207
|
+
|
|
1208
|
+
if (size(#)==0)
|
|
1209
|
+
{
|
|
1210
|
+
determinebox = 1;
|
|
1211
|
+
number eps = 0;
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
if (size(#)==1)
|
|
1215
|
+
{
|
|
1216
|
+
if (typeof(#[1])=="box")
|
|
1217
|
+
{
|
|
1218
|
+
box start = #[1];
|
|
1219
|
+
number eps = 0;
|
|
1220
|
+
}
|
|
1221
|
+
if (typeof(#[1])=="number")
|
|
1222
|
+
{
|
|
1223
|
+
number eps = #[1];
|
|
1224
|
+
determinebox = 1;
|
|
1225
|
+
}
|
|
1226
|
+
if ((typeof(#[1])!="box") and (typeof(#[1])!="number"))
|
|
1227
|
+
{
|
|
1228
|
+
ERROR("second argument should be a box or a number");
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
if (size(#)==2)
|
|
1233
|
+
{
|
|
1234
|
+
if (typeof(#[1])!="box")
|
|
1235
|
+
{
|
|
1236
|
+
ERROR("second argument should be a box");
|
|
1237
|
+
}
|
|
1238
|
+
if (typeof(#[2])!="number")
|
|
1239
|
+
{
|
|
1240
|
+
ERROR("third argument should be a number");
|
|
1241
|
+
}
|
|
1242
|
+
box start = #[1];
|
|
1243
|
+
number eps = #[2];
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
if (size(#)>2)
|
|
1247
|
+
{
|
|
1248
|
+
ERROR("too many arguments");
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
// compute reduced GB in (hopefully) fast ordering
|
|
1252
|
+
option(redSB);
|
|
1253
|
+
ideal fastGB = groebner(I);
|
|
1254
|
+
|
|
1255
|
+
if (dim(fastGB) > 0)
|
|
1256
|
+
{
|
|
1257
|
+
ERROR("rootIsolation: ideal not zero-dimensional");
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
ideal rad = radical(fastGB);
|
|
1261
|
+
// since fastGB is contained in rad we only need to test one inclusion size
|
|
1262
|
+
// counts only non-zero entries
|
|
1263
|
+
if (size(reduce(rad, fastGB)) > 0)
|
|
1264
|
+
{
|
|
1265
|
+
"Warning: ideal not radical, passing to radical.";
|
|
1266
|
+
I = rad;
|
|
1267
|
+
fastGB = groebner(I);
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
// create lp-rings
|
|
1271
|
+
ring rSource = basering;
|
|
1272
|
+
list rList = ringlist(rSource);
|
|
1273
|
+
// set ordering to lp
|
|
1274
|
+
rList[3] = list( list( "lp", 1:N ), list( "C", 0 ) );
|
|
1275
|
+
// save variable order for later
|
|
1276
|
+
list varstrs = rList[2];
|
|
1277
|
+
|
|
1278
|
+
for (i = 1; i <= N; i++)
|
|
1279
|
+
{
|
|
1280
|
+
// permute variables in ringlist, create and switch to ring with
|
|
1281
|
+
// elimination ordering
|
|
1282
|
+
rList[2][i] = varstrs[N];
|
|
1283
|
+
rList[2][N] = varstrs[i];
|
|
1284
|
+
def rElimOrd(i) = ring(rList);
|
|
1285
|
+
setring rElimOrd(i);
|
|
1286
|
+
// get GB in elimination ordering, note that GB[1] only depends on var(i)
|
|
1287
|
+
// of rSource, which is var(N) in rElimOrd(i)
|
|
1288
|
+
ideal GB = fglm(rSource, fastGB);
|
|
1289
|
+
if (size(GB) == N)
|
|
1290
|
+
{
|
|
1291
|
+
genNumIndex = i;
|
|
1292
|
+
}
|
|
1293
|
+
setring rSource;
|
|
1294
|
+
rList[2] = varstrs;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
if (N <> ncols(I))
|
|
1298
|
+
{
|
|
1299
|
+
if (genNumIndex > 0)
|
|
1300
|
+
{
|
|
1301
|
+
// If elements of V(I) have pairwise distinct xj coordinates for some
|
|
1302
|
+
// variable xj, then the reduced Groebner basis w.r.t. the monomial
|
|
1303
|
+
// ordering where xj is smaller than all other variables has exactly
|
|
1304
|
+
// nvars(basering) generators, see [2].
|
|
1305
|
+
// As we compute all these Groebner bases anyway we can replace the input
|
|
1306
|
+
// ideal with a proper generator set if necessary.
|
|
1307
|
+
I = imap(rElimOrd(genNumIndex), GB);
|
|
1308
|
+
dbprint("Replaced ideal with suitable reduced Groebner basis.");
|
|
1309
|
+
}
|
|
1310
|
+
else
|
|
1311
|
+
{
|
|
1312
|
+
// the ideals in a triangular decomposition always satisfy the conditions
|
|
1313
|
+
// on I, so we apply rootIsolation to them as a last resort
|
|
1314
|
+
|
|
1315
|
+
// note that zero-dimensional ideals can always be generated by
|
|
1316
|
+
// nvars(basering) polynomials, however the way of computing these
|
|
1317
|
+
// generators is currently not known to the authors
|
|
1318
|
+
setring rElimOrd(N);
|
|
1319
|
+
list T = triangL(GB);
|
|
1320
|
+
setring rSource;
|
|
1321
|
+
list T = imap(rElimOrd(N), T);
|
|
1322
|
+
// kill elimination rings to avoid name conflicts in rootIsolation called
|
|
1323
|
+
// later
|
|
1324
|
+
for (i = 1; i <= N; i++)
|
|
1325
|
+
{
|
|
1326
|
+
kill rElimOrd(i);
|
|
1327
|
+
}
|
|
1328
|
+
dbprint("Applying rootIsolation to triangular decomposition.");
|
|
1329
|
+
return(rootIsolationTriangL(T, #));
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
// need at least two variables
|
|
1334
|
+
if (N < 2)
|
|
1335
|
+
{
|
|
1336
|
+
if (determinebox)
|
|
1337
|
+
{
|
|
1338
|
+
number mx = maxabs(fastGB[1]);
|
|
1339
|
+
box start = list(bounds(-mx, mx));
|
|
1340
|
+
}
|
|
1341
|
+
return(rootIsolationNoPreprocessing(I, list(start), eps));
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
// need nvars(basering) generators from here on
|
|
1345
|
+
rList = ringlist(rSource);
|
|
1346
|
+
// first construct univariate ring
|
|
1347
|
+
int numords = size(rList[3]);
|
|
1348
|
+
// remove all but first variables
|
|
1349
|
+
rList[2] = list(rList[2][1]);
|
|
1350
|
+
// change ordering accordingly (keep last block)
|
|
1351
|
+
rList[3] = list( list(rList[3][1][1], intvec(1)), rList[3][numords] );
|
|
1352
|
+
|
|
1353
|
+
// construct and switch to univariate ring
|
|
1354
|
+
def rUnivar = ring(rList);
|
|
1355
|
+
setring rUnivar;
|
|
1356
|
+
|
|
1357
|
+
// some necessary variables
|
|
1358
|
+
ideal gbUnivar;
|
|
1359
|
+
// maps var(N) in rElimOrd(i) to var(1) in rUnivar
|
|
1360
|
+
intvec varmap = (0:(N-1)),1;
|
|
1361
|
+
number eps = fetch(rSource, eps);
|
|
1362
|
+
list univarResult, startBoxesPerDim;
|
|
1363
|
+
|
|
1364
|
+
intvec sizes, repCount = 0:N, 1:N;
|
|
1365
|
+
int numBoxes = 1;
|
|
1366
|
+
|
|
1367
|
+
number lo, up;
|
|
1368
|
+
number mx;
|
|
1369
|
+
|
|
1370
|
+
for (i = 1; i <= N; i++)
|
|
1371
|
+
{
|
|
1372
|
+
dbprint("variable ",i);
|
|
1373
|
+
setring rElimOrd(i);
|
|
1374
|
+
// throw out non-univariate polys
|
|
1375
|
+
GB = GB[1];
|
|
1376
|
+
|
|
1377
|
+
setring rUnivar;
|
|
1378
|
+
gbUnivar = fetch(rElimOrd(i), GB, varmap);
|
|
1379
|
+
// clean up ring and its elements
|
|
1380
|
+
kill rElimOrd(i);
|
|
1381
|
+
|
|
1382
|
+
// check if there are roots on the bounds of start[i]
|
|
1383
|
+
// (very easy in univariate case)
|
|
1384
|
+
if (determinebox)
|
|
1385
|
+
{
|
|
1386
|
+
dbprint("univariate GB", gbUnivar,laguerre_solve(gbUnivar[1],5));
|
|
1387
|
+
mx = maxabs(std(gbUnivar)[1]);
|
|
1388
|
+
dbprint("maxabs ",mx);
|
|
1389
|
+
lo, up = -mx, mx;
|
|
1390
|
+
}
|
|
1391
|
+
else
|
|
1392
|
+
{
|
|
1393
|
+
lo, up = start[i][1], start[i][2];
|
|
1394
|
+
}
|
|
1395
|
+
// move bounds if they are a root of the polynomial
|
|
1396
|
+
while(subst(gbUnivar[1], var(1), lo) == 0)
|
|
1397
|
+
{
|
|
1398
|
+
lo = lo - 1;
|
|
1399
|
+
}
|
|
1400
|
+
while(subst(gbUnivar[1], var(1), up) == 0)
|
|
1401
|
+
{
|
|
1402
|
+
up = up + 1;
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
// get boxes containing roots of univariate polynomial
|
|
1406
|
+
univarResult = rootIsolationNoPreprocessing(gbUnivar,
|
|
1407
|
+
list(box(list(bounds(lo, up)))), eps);
|
|
1408
|
+
// maybe result[1] is not empty, so take both
|
|
1409
|
+
startBoxesPerDim[i] = univarResult[1] + univarResult[2];
|
|
1410
|
+
// debug:
|
|
1411
|
+
dbprint(string("Sieved variable ", varstrs[i], " to ",
|
|
1412
|
+
size(startBoxesPerDim[i]), " intervals."));
|
|
1413
|
+
|
|
1414
|
+
sizes[i] = size(startBoxesPerDim[i]);
|
|
1415
|
+
numBoxes = numBoxes * sizes[i];
|
|
1416
|
+
|
|
1417
|
+
// stop early if one variable already has no roots
|
|
1418
|
+
if (numBoxes == 0)
|
|
1419
|
+
{
|
|
1420
|
+
dbprint("No roots exist for input. Stopping.");
|
|
1421
|
+
return(list(), list());
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
setring rSource;
|
|
1426
|
+
|
|
1427
|
+
for (i = N-1; i >= 1; i--)
|
|
1428
|
+
{
|
|
1429
|
+
repCount[i] = repCount[i+1] * sizes[i+1];
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
list startBoxes, sbTemp;
|
|
1433
|
+
|
|
1434
|
+
// prepare a list of lists
|
|
1435
|
+
for (i = 1; i <= numBoxes; i++)
|
|
1436
|
+
{
|
|
1437
|
+
sbTemp[i] = list();
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
// computes "cartesian product" of found boxes to lift to N variables
|
|
1441
|
+
for (i = 1; i <= N; i++)
|
|
1442
|
+
{
|
|
1443
|
+
// full loop of elements
|
|
1444
|
+
for (j = 0; j < numBoxes; j = j + sizes[i]*repCount[i])
|
|
1445
|
+
{
|
|
1446
|
+
// boxes
|
|
1447
|
+
for (k = 0; k < sizes[i]; k++)
|
|
1448
|
+
{
|
|
1449
|
+
// repetitions
|
|
1450
|
+
for (l = 1; l <= repCount[i]; l++)
|
|
1451
|
+
{
|
|
1452
|
+
// last index since we need interval in one-dimensional box
|
|
1453
|
+
sbTemp[j+k*repCount[i]+l][i] = startBoxesPerDim[i][k+1][1];
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
// since we're back in rSource box(...) will return box of proper size
|
|
1460
|
+
for (i = 1; i <= size(sbTemp); i++)
|
|
1461
|
+
{
|
|
1462
|
+
startBoxes[i] = box(sbTemp[i]);
|
|
1463
|
+
}
|
|
1464
|
+
// can be optimized
|
|
1465
|
+
return(rootIsolationNoPreprocessing(I, startBoxes, eps));
|
|
1466
|
+
}
|
|
1467
|
+
example
|
|
1468
|
+
{
|
|
1469
|
+
"EXAMPLE:"; echo = 2;
|
|
1470
|
+
|
|
1471
|
+
ring R = 0,(x,y),dp;
|
|
1472
|
+
ideal I = 2x2-xy+2y2-2,2x2-3xy+3y2-2; // V(I) has four elements
|
|
1473
|
+
|
|
1474
|
+
interval i = bounds(-3/2,3/2);
|
|
1475
|
+
box B = list(i, i);
|
|
1476
|
+
|
|
1477
|
+
list result = rootIsolation(I, B);
|
|
1478
|
+
|
|
1479
|
+
result;
|
|
1480
|
+
}
|
|
1481
|
+
// vim: ft=singular
|