passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-singular might be problematic. Click here for more details.
- PySingular.cpython-314-aarch64-linux-gnu.so +0 -0
- passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
- passagemath_singular-10.6.31rc3.dist-info/RECORD +490 -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-6a2a8666.4.1.so +0 -0
- passagemath_singular.libs/libcddgmp-ac579979.so.0.1.3 +0 -0
- passagemath_singular.libs/libfactory-4-66e33516.4.1.so +0 -0
- passagemath_singular.libs/libflint-81de1160.so.21.0.0 +0 -0
- passagemath_singular.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
- passagemath_singular.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
- passagemath_singular.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
- passagemath_singular.libs/libgsl-e3525837.so.28.0.0 +0 -0
- passagemath_singular.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
- passagemath_singular.libs/libntl-0043a3a2.so.44.0.1 +0 -0
- passagemath_singular.libs/libomalloc-0-06512335.9.6.so +0 -0
- passagemath_singular.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
- passagemath_singular.libs/libpolys-4-cb7246b5.4.1.so +0 -0
- passagemath_singular.libs/libreadline-28330744.so.8.2 +0 -0
- passagemath_singular.libs/libsingular_resources-4-8c425241.4.1.so +0 -0
- passagemath_singular.libs/libtinfo-f81c2d16.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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-gnu.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
- sage/algebras/quatalg/quaternion_algebra_element.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-gnu.so +0 -0
- sage/libs/singular/option.pyx +671 -0
- sage/libs/singular/polynomial.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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,2127 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////
|
|
2
|
+
version="version equising.lib 4.4.0.6 Oct_2024 "; // $Id: 3688e8b0af5cae69265251bb9b3019141eb319a0 $
|
|
3
|
+
category="Singularities";
|
|
4
|
+
info="
|
|
5
|
+
LIBRARY: equising.lib Equisingularity Stratum of a Family of Plane Curves
|
|
6
|
+
AUTHOR: Christoph Lossen, lossen@mathematik.uni-kl.de
|
|
7
|
+
Andrea Mindnich, mindnich@mathematik.uni-kl.de
|
|
8
|
+
|
|
9
|
+
PROCEDURES:
|
|
10
|
+
tau_es(f); codim of mu-const stratum in semi-universal def. base
|
|
11
|
+
esIdeal(f); (Wahl's) equisingularity ideal of f
|
|
12
|
+
esStratum(F[,m,L]); equisingularity stratum of a family F
|
|
13
|
+
isEquising(F[,m,L]); tests if a given deformation is equisingular
|
|
14
|
+
|
|
15
|
+
control_Matrix(M); computes list of blowing-up data
|
|
16
|
+
";
|
|
17
|
+
|
|
18
|
+
LIB "hnoether.lib";
|
|
19
|
+
LIB "polylib.lib";
|
|
20
|
+
LIB "elim.lib";
|
|
21
|
+
LIB "deform.lib";
|
|
22
|
+
LIB "sing.lib";
|
|
23
|
+
|
|
24
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
25
|
+
//
|
|
26
|
+
// The following (static) procedures are used by esComputation
|
|
27
|
+
//
|
|
28
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
29
|
+
// COMPUTES a weight vector. x and y get weight 1 and all other
|
|
30
|
+
// variables get weight 0.
|
|
31
|
+
static proc xyVector()
|
|
32
|
+
{
|
|
33
|
+
intvec iv ;
|
|
34
|
+
iv[nvars(basering)]=0 ;
|
|
35
|
+
iv[rvar(x)] =1;
|
|
36
|
+
iv[rvar(y)] =1;
|
|
37
|
+
return (iv);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
// exchanges the variables x and y in the polynomial f
|
|
42
|
+
static proc swapXY(poly f)
|
|
43
|
+
{
|
|
44
|
+
def r_base = basering;
|
|
45
|
+
ideal MI = maxideal(1);
|
|
46
|
+
MI[rvar(x)]=y;
|
|
47
|
+
MI[rvar(y)]=x;
|
|
48
|
+
map phi = r_base, MI;
|
|
49
|
+
f=phi(f);
|
|
50
|
+
return (f);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
54
|
+
// computes m-jet w.r.t. the variables x,y (other variables weighted 0
|
|
55
|
+
static proc m_Jet(poly F,int m);
|
|
56
|
+
{
|
|
57
|
+
intvec w=xyVector();
|
|
58
|
+
poly Fd=jet(F,m,w);
|
|
59
|
+
return(Fd);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
64
|
+
// computes the 4 control matrices (input is multsequence(L))
|
|
65
|
+
proc control_Matrix(list M);
|
|
66
|
+
"USAGE: control_Matrix(L); L list
|
|
67
|
+
ASSUME: L is the output of multsequence(hnexpansion(f)).
|
|
68
|
+
RETURN: list M of 4 intmat's:
|
|
69
|
+
@format
|
|
70
|
+
M[1] contains the multiplicities at the respective infinitely near points
|
|
71
|
+
p[i,j] (i=step of blowup+1, j=branch) -- if branches j=k,...,k+m pass
|
|
72
|
+
through the same p[i,j] then the multiplicity is stored in M[1][k,j],
|
|
73
|
+
while M[1][k+1]=...=M[1][k+m]=0.
|
|
74
|
+
M[2] contains the number of branches meeting at p[i,j] (again, the information
|
|
75
|
+
is stored according to the above rule)
|
|
76
|
+
M[3] contains the information about the splitting of M[1][i,j] with respect to
|
|
77
|
+
different tangents of branches at p[i,j] (information is stored only for
|
|
78
|
+
minimal j>=k corresponding to a new tangent direction).
|
|
79
|
+
The entries are the sum of multiplicities of all branches with the
|
|
80
|
+
respective tangent.
|
|
81
|
+
M[4] contains the maximal sum of higher multiplicities for a branch passing
|
|
82
|
+
through p[i,j] ( = degree Bound for blowing up)
|
|
83
|
+
@end format
|
|
84
|
+
NOTE: the branches are ordered in such a way that only consecutive branches
|
|
85
|
+
can meet at an infinitely near point. @*
|
|
86
|
+
the final rows of the matrices M[1],...,M[3] is (1,1,1,...,1), and
|
|
87
|
+
correspond to infinitely near points such that the strict transforms
|
|
88
|
+
of the branches are smooth and intersect the exceptional divisor
|
|
89
|
+
transversally.
|
|
90
|
+
SEE ALSO: multsequence
|
|
91
|
+
EXAMPLE: example control_Matrix; shows an example
|
|
92
|
+
"
|
|
93
|
+
{
|
|
94
|
+
int i,j,k,dummy;
|
|
95
|
+
|
|
96
|
+
dummy=0;
|
|
97
|
+
for (j=1;j<=ncols(M[2]);j++)
|
|
98
|
+
{
|
|
99
|
+
dummy=dummy+M[1][nrows(M[1])-1,j]-M[1][nrows(M[1]),j];
|
|
100
|
+
}
|
|
101
|
+
intmat S[nrows(M[1])+dummy][ncols(M[1])];
|
|
102
|
+
intmat T[nrows(M[1])+dummy][ncols(M[1])];
|
|
103
|
+
intmat U[nrows(M[1])+dummy][ncols(M[1])];
|
|
104
|
+
intmat maxDeg[nrows(M[1])+dummy][ncols(M[1])];
|
|
105
|
+
|
|
106
|
+
for (i=1;i<=nrows(M[2]);i++)
|
|
107
|
+
{
|
|
108
|
+
dummy=1;
|
|
109
|
+
for (j=1;j<=ncols(M[2]);j++)
|
|
110
|
+
{
|
|
111
|
+
for (k=dummy;k<dummy+M[2][i,j];k++)
|
|
112
|
+
{
|
|
113
|
+
T[i,dummy]=T[i,dummy]+1;
|
|
114
|
+
S[i,dummy]=S[i,dummy]+M[1][i,k];
|
|
115
|
+
if (i>1)
|
|
116
|
+
{
|
|
117
|
+
U[i-1,dummy]=U[i-1,dummy]+M[1][i-1,k];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
dummy=k;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// adding an extra row (in some cases needed to control ES-Stratum
|
|
125
|
+
// computation)
|
|
126
|
+
for (i=nrows(M[1]);i<=nrows(S);i++)
|
|
127
|
+
{
|
|
128
|
+
for (j=1;j<=ncols(M[2]);j++)
|
|
129
|
+
{
|
|
130
|
+
S[i,j]=1;
|
|
131
|
+
T[i,j]=1;
|
|
132
|
+
U[i,j]=1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Computing the degree Bounds to be stored in M[4]:
|
|
137
|
+
for (i=1;i<=nrows(S);i++)
|
|
138
|
+
{
|
|
139
|
+
dummy=1;
|
|
140
|
+
for (j=1;j<=ncols(S);j++)
|
|
141
|
+
{
|
|
142
|
+
for (k=dummy;k<dummy+T[i,j];k++)
|
|
143
|
+
{
|
|
144
|
+
maxDeg[i,k]=S[i,dummy]; // multiplicity at i-th blowup
|
|
145
|
+
}
|
|
146
|
+
dummy=k;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// adding up multiplicities
|
|
150
|
+
for (i=nrows(S);i>=2;i--)
|
|
151
|
+
{
|
|
152
|
+
for (j=1;j<=ncols(S);j++)
|
|
153
|
+
{
|
|
154
|
+
maxDeg[i-1,j]=maxDeg[i-1,j]+maxDeg[i,j];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
list L=S,T,U,maxDeg;
|
|
159
|
+
return(L);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
164
|
+
// matrix of higher tangent directions:
|
|
165
|
+
// returns list: 1) tangent directions
|
|
166
|
+
// 2) swapping information (x <--> y)
|
|
167
|
+
static proc inf_Tangents(list L,int s); // L aus hnexpansion,
|
|
168
|
+
{
|
|
169
|
+
int nv=nvars(basering);
|
|
170
|
+
matrix M;
|
|
171
|
+
matrix B[s][size(L)];
|
|
172
|
+
intvec V;
|
|
173
|
+
intmat Mult=multsequence(L)[1];
|
|
174
|
+
|
|
175
|
+
int i,j,k,counter,e;
|
|
176
|
+
for (k=1;k<=size(L);k++)
|
|
177
|
+
{
|
|
178
|
+
V[k]=L[k][3]; // switch: 0 --> tangent 2nd parameter
|
|
179
|
+
// 1 --> tangent 1st parameter
|
|
180
|
+
e=0;
|
|
181
|
+
M=L[k][1];
|
|
182
|
+
counter=1;
|
|
183
|
+
B[counter,k]=M[1,1];
|
|
184
|
+
|
|
185
|
+
for (i=1;i<=nrows(M);i++)
|
|
186
|
+
{
|
|
187
|
+
for (j=2;j<=ncols(M);j++)
|
|
188
|
+
{
|
|
189
|
+
counter=counter+1;
|
|
190
|
+
if (M[i,j]==var(nv-1))
|
|
191
|
+
{
|
|
192
|
+
if (i<>nrows(M))
|
|
193
|
+
{
|
|
194
|
+
B[counter,k]=M[i,j];
|
|
195
|
+
j=ncols(M)+1; // goto new row of HNmatrix...
|
|
196
|
+
if (counter<>s)
|
|
197
|
+
{
|
|
198
|
+
if (counter+1<=nrows(Mult))
|
|
199
|
+
{
|
|
200
|
+
e=Mult[counter-1,k]-Mult[counter,k]-Mult[counter+1,k];
|
|
201
|
+
}
|
|
202
|
+
else
|
|
203
|
+
{
|
|
204
|
+
e=Mult[counter-1,k]-Mult[counter,k]-1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else
|
|
209
|
+
{
|
|
210
|
+
B[counter,k]=0;
|
|
211
|
+
j=ncols(M)+1; // goto new row of HNmatrix...
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else
|
|
215
|
+
{
|
|
216
|
+
if (e<=0)
|
|
217
|
+
{
|
|
218
|
+
B[counter,k]=M[i,j];
|
|
219
|
+
}
|
|
220
|
+
else // point is still proximate to an earlier point
|
|
221
|
+
{
|
|
222
|
+
B[counter,k]=y; // marking proximity (without swap....)
|
|
223
|
+
if (counter+1<=nrows(Mult))
|
|
224
|
+
{
|
|
225
|
+
e=e-Mult[counter+1,k];
|
|
226
|
+
}
|
|
227
|
+
else
|
|
228
|
+
{
|
|
229
|
+
e=e-1;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (counter==s) // given number of points determined
|
|
235
|
+
{
|
|
236
|
+
j=ncols(M)+1;
|
|
237
|
+
i=nrows(M)+1;
|
|
238
|
+
// leave procedure
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
L=B,V;
|
|
244
|
+
return(L);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
248
|
+
// compute "good" upper bound for needed number of help variables
|
|
249
|
+
//
|
|
250
|
+
static proc Determine_no_b(intmat U,matrix B)
|
|
251
|
+
// U is assumed to be 3rd output of control_Matrix
|
|
252
|
+
// B is assumed to be 1st output of inf_Tangents
|
|
253
|
+
{
|
|
254
|
+
int nv=nvars(basering);
|
|
255
|
+
int i,j,counter;
|
|
256
|
+
for (j=1;j<=ncols(U);j++)
|
|
257
|
+
{
|
|
258
|
+
for (i=1;i<=nrows(U);i++)
|
|
259
|
+
{
|
|
260
|
+
if (U[i,j]>1)
|
|
261
|
+
{
|
|
262
|
+
if (B[i,j]<>var(nv-1) and B[i,j]<>var(nv))
|
|
263
|
+
{
|
|
264
|
+
counter=counter+1;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
counter=counter+ncols(U);
|
|
271
|
+
return(counter);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
275
|
+
// compute number of infinitely near free points corresponding to non-zero
|
|
276
|
+
// entries in control_Matrix[1] (except first row)
|
|
277
|
+
//
|
|
278
|
+
static proc no_freePoints(intmat Mult,matrix B)
|
|
279
|
+
// Mult is assumed to be 1st output of control_Matrix
|
|
280
|
+
// U is assumed to be 3rd output of control_Matrix
|
|
281
|
+
// B is assumed to be 1st output of inf_Tangents
|
|
282
|
+
{
|
|
283
|
+
int i,j,k,counter;
|
|
284
|
+
for (j=1;j<=ncols(Mult);j++)
|
|
285
|
+
{
|
|
286
|
+
for (i=2;i<=nrows(Mult);i++)
|
|
287
|
+
{
|
|
288
|
+
if (Mult[i,j]>=1)
|
|
289
|
+
{
|
|
290
|
+
if (B[i-1,j]<>x and B[i-1,j]<>y)
|
|
291
|
+
{
|
|
292
|
+
counter=counter+1;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return(counter);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
302
|
+
// COMPUTES string(minpoly) and substitutes the parameter by newParName
|
|
303
|
+
static proc makeMinPolyString (string newParName)
|
|
304
|
+
{
|
|
305
|
+
int i;
|
|
306
|
+
string parName = parstr(basering);
|
|
307
|
+
int parNameSize = size(parName);
|
|
308
|
+
|
|
309
|
+
string oldMinPolyStr = string (minpoly);
|
|
310
|
+
int minPolySize = size(oldMinPolyStr);
|
|
311
|
+
|
|
312
|
+
string newMinPolyStr = "";
|
|
313
|
+
|
|
314
|
+
for (i=1;i <= minPolySize; i++)
|
|
315
|
+
{
|
|
316
|
+
if (oldMinPolyStr[i,parNameSize] == parName)
|
|
317
|
+
{
|
|
318
|
+
newMinPolyStr = newMinPolyStr + newParName;
|
|
319
|
+
i = i + parNameSize-1;
|
|
320
|
+
}
|
|
321
|
+
else
|
|
322
|
+
{
|
|
323
|
+
newMinPolyStr = newMinPolyStr + oldMinPolyStr[i];
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return(newMinPolyStr);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
331
|
+
//
|
|
332
|
+
// DEFINES: A new basering, "myRing",
|
|
333
|
+
// with new names for the parameters and variables.
|
|
334
|
+
// The new names for the parameters are a(1..k),
|
|
335
|
+
// and t(1..s),x,y for the variables
|
|
336
|
+
// The ring ordering is ordStr.
|
|
337
|
+
// NOTE: This proc uses 'execute'.
|
|
338
|
+
static proc createMyRing_new(poly p_F, string ordStr,
|
|
339
|
+
string minPolyStr, int no_b)
|
|
340
|
+
{
|
|
341
|
+
def r_old = basering;
|
|
342
|
+
|
|
343
|
+
int chara = char(basering);
|
|
344
|
+
string charaStr;
|
|
345
|
+
int i;
|
|
346
|
+
string helpStr;
|
|
347
|
+
int nDefParams = nvars(r_old)-2;
|
|
348
|
+
|
|
349
|
+
ideal qIdeal = ideal(basering);
|
|
350
|
+
|
|
351
|
+
if ((npars(basering)==0) and (minPolyStr==""))
|
|
352
|
+
{
|
|
353
|
+
helpStr = "ring myRing1 ="
|
|
354
|
+
+ string(chara)+ ", (t(1..nDefParams), x, y),("+ ordStr +");";
|
|
355
|
+
execute(helpStr);
|
|
356
|
+
}
|
|
357
|
+
else
|
|
358
|
+
{
|
|
359
|
+
charaStr = charstr(basering);
|
|
360
|
+
if ((charaStr == string(chara) + "," + parstr(basering)) or (minPolyStr<>""))
|
|
361
|
+
{
|
|
362
|
+
if (minPolyStr<>"")
|
|
363
|
+
{
|
|
364
|
+
helpStr = "ring myRing1 =
|
|
365
|
+
(" + string(chara) + ",a),
|
|
366
|
+
(t(1..nDefParams), x, y),(" + ordStr + ");";
|
|
367
|
+
execute(helpStr);
|
|
368
|
+
|
|
369
|
+
execute (minPolyStr);
|
|
370
|
+
}
|
|
371
|
+
else // no minpoly given
|
|
372
|
+
{
|
|
373
|
+
helpStr = "ring myRing1 =
|
|
374
|
+
(" + string(chara) + ",a(1..npars(basering)) ),
|
|
375
|
+
(t(1..nDefParams), x, y),(" + ordStr + ");";
|
|
376
|
+
execute(helpStr);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else
|
|
380
|
+
{
|
|
381
|
+
// ground field is of type (p^k,a)....
|
|
382
|
+
i = find (charaStr,",");
|
|
383
|
+
helpStr = "ring myRing1 = (" + charaStr[1,i] + "a),
|
|
384
|
+
(t(1..nDefParams), x, y),(" + ordStr + ");";
|
|
385
|
+
execute (helpStr);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
ideal mIdeal = maxideal(1);
|
|
390
|
+
ideal qIdeal = fetch(r_old, qIdeal);
|
|
391
|
+
poly p_F = fetch(r_old, p_F);
|
|
392
|
+
export p_F,mIdeal;
|
|
393
|
+
|
|
394
|
+
// Extension by no_b auxiliary variables
|
|
395
|
+
if (no_b>0)
|
|
396
|
+
{
|
|
397
|
+
if (npars(basering) == 0)
|
|
398
|
+
{
|
|
399
|
+
ordStr = "(dp("+string(no_b)+"),"+ordStr+")";
|
|
400
|
+
helpStr = "ring myRing ="
|
|
401
|
+
+ string(chara)+ ", (b(1..no_b), t(1..nDefParams), x, y),"
|
|
402
|
+
+ ordStr +";";
|
|
403
|
+
execute(helpStr);
|
|
404
|
+
}
|
|
405
|
+
else
|
|
406
|
+
{
|
|
407
|
+
charaStr = charstr(basering);
|
|
408
|
+
if (charaStr == string(chara) + "," + parstr(basering))
|
|
409
|
+
{
|
|
410
|
+
if (minpoly !=0)
|
|
411
|
+
{
|
|
412
|
+
ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
|
|
413
|
+
minPolyStr = makeMinPolyString("a");
|
|
414
|
+
helpStr = "ring myRing =
|
|
415
|
+
(" + string(chara) + ",a),
|
|
416
|
+
(b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
|
|
417
|
+
execute(helpStr);
|
|
418
|
+
|
|
419
|
+
helpStr = "minpoly =" + minPolyStr + ";";
|
|
420
|
+
execute (helpStr);
|
|
421
|
+
}
|
|
422
|
+
else // no minpoly given
|
|
423
|
+
{
|
|
424
|
+
ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
|
|
425
|
+
helpStr = "ring myRing =
|
|
426
|
+
(" + string(chara) + ",a(1..npars(basering)) ),
|
|
427
|
+
(b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
|
|
428
|
+
execute(helpStr);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else
|
|
432
|
+
{
|
|
433
|
+
i = find (charaStr,",");
|
|
434
|
+
ordStr = "(dp(" + string(no_b) + ")," + ordStr + ")";
|
|
435
|
+
helpStr = "ring myRing =
|
|
436
|
+
(" + charaStr[1,i] + "a),
|
|
437
|
+
(b(1..no_b), t(1..nDefParams), x, y)," + ordStr + ";";
|
|
438
|
+
execute (helpStr);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
ideal qIdeal = imap(myRing1, qIdeal);
|
|
442
|
+
|
|
443
|
+
if(size(qIdeal) != 0)
|
|
444
|
+
{
|
|
445
|
+
def r_base = basering;
|
|
446
|
+
setring r_base;
|
|
447
|
+
kill myRing;
|
|
448
|
+
qring myRing = std(qIdeal);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
poly p_F = imap(myRing1, p_F);
|
|
452
|
+
ideal mIdeal = imap(myRing1, mIdeal);
|
|
453
|
+
export p_F,mIdeal;
|
|
454
|
+
kill myRing1;
|
|
455
|
+
}
|
|
456
|
+
else
|
|
457
|
+
{
|
|
458
|
+
if(size(qIdeal) != 0)
|
|
459
|
+
{
|
|
460
|
+
def r_base = basering;
|
|
461
|
+
setring r_base;
|
|
462
|
+
kill myRing1;
|
|
463
|
+
qring myRing = std(qIdeal);
|
|
464
|
+
poly p_F = imap(myRing1, p_F);
|
|
465
|
+
ideal mIdeal = imap(myRing1, mIdeal);
|
|
466
|
+
export p_F,mIdeal;
|
|
467
|
+
}
|
|
468
|
+
else
|
|
469
|
+
{
|
|
470
|
+
def myRing=myRing1;
|
|
471
|
+
}
|
|
472
|
+
kill myRing1;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
setring r_old;
|
|
476
|
+
return(myRing);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
480
|
+
// returns list of coef, leadmonomial
|
|
481
|
+
//
|
|
482
|
+
static proc determine_coef (poly Fm)
|
|
483
|
+
{
|
|
484
|
+
def r_base = basering; // is assumed to be the result of createMyRing
|
|
485
|
+
|
|
486
|
+
int chara = char(basering);
|
|
487
|
+
string charaStr;
|
|
488
|
+
int i;
|
|
489
|
+
string minPolyStr = "";
|
|
490
|
+
string helpStr = "";
|
|
491
|
+
|
|
492
|
+
if (npars(basering) == 0)
|
|
493
|
+
{
|
|
494
|
+
ring myRing1 = create_ring("("+string(chara)+")", "(y,x)", "ds");
|
|
495
|
+
}
|
|
496
|
+
else
|
|
497
|
+
{
|
|
498
|
+
charaStr = charstr(basering);
|
|
499
|
+
if (charaStr == string(chara) + "," + parstr(basering))
|
|
500
|
+
{
|
|
501
|
+
if (minpoly !=0)
|
|
502
|
+
{
|
|
503
|
+
minPolyStr = makeMinPolyString("a");
|
|
504
|
+
ring myRing1 = create_ring("(" + string(chara) + ",a)", "(y,x)", "ds");
|
|
505
|
+
|
|
506
|
+
helpStr = "minpoly =" + minPolyStr + ";";
|
|
507
|
+
execute (helpStr);
|
|
508
|
+
}
|
|
509
|
+
else // no minpoly given
|
|
510
|
+
{
|
|
511
|
+
list l5;
|
|
512
|
+
for (int zz = 1; zz <= npars(basering); zz++)
|
|
513
|
+
{
|
|
514
|
+
l5[size(l5)+1] = "a("+string(zz)+")";
|
|
515
|
+
}
|
|
516
|
+
ring myRing1 = create_ring("("+string(chara)+","+string(l5)+")", "(y,x)", "ds");
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else
|
|
520
|
+
{
|
|
521
|
+
i = find (charaStr,",");
|
|
522
|
+
|
|
523
|
+
ring myRing1 = create_ring("(" + charaStr[1,i] + ",a)", "(y,x)", "ds");
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
poly f=imap(r_base,Fm);
|
|
527
|
+
poly g=leadmonom(f);
|
|
528
|
+
setring r_base;
|
|
529
|
+
poly g=imap(myRing1,g);
|
|
530
|
+
kill myRing1;
|
|
531
|
+
def M=coef(Fm,xy);
|
|
532
|
+
|
|
533
|
+
for (i=1; i<=ncols(M); i++)
|
|
534
|
+
{
|
|
535
|
+
if (M[1,i]==g)
|
|
536
|
+
{
|
|
537
|
+
poly h=M[2,i]; // determine coefficient of leading monomial (in K[t])
|
|
538
|
+
i=ncols(M)+1;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
return(list(h,g));
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
545
|
+
// RETURNS: 1, if p_f = 0 or char(basering) divides the order of p_f
|
|
546
|
+
// or p_f is not squarefree.
|
|
547
|
+
// 0, otherwise
|
|
548
|
+
static proc checkPoly (poly p_f)
|
|
549
|
+
{
|
|
550
|
+
int i_print = printlevel - voice + 3;
|
|
551
|
+
int i_ord;
|
|
552
|
+
|
|
553
|
+
if (p_f == 0)
|
|
554
|
+
{
|
|
555
|
+
print("Input is a 'deformation' of the zero polynomial!");
|
|
556
|
+
return(1);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
i_ord = mindeg1(p_f);
|
|
560
|
+
|
|
561
|
+
if (number(i_ord) == 0)
|
|
562
|
+
{
|
|
563
|
+
print("Characteristic of coefficient field "
|
|
564
|
+
+"divides order of zero-fiber !");
|
|
565
|
+
return(1);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
if (squarefree(p_f) != p_f)
|
|
569
|
+
{
|
|
570
|
+
print("Original polynomial (= zero-fiber) is not reduced!");
|
|
571
|
+
return(1);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
return(0);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
578
|
+
static proc make_ring_small(ideal J)
|
|
579
|
+
// returns varstr for new ring, the map and the number of vars
|
|
580
|
+
{
|
|
581
|
+
attrib(J,"isSB",1);
|
|
582
|
+
int counter=0;
|
|
583
|
+
ideal newmap;
|
|
584
|
+
string newvar="";
|
|
585
|
+
for (int i=1; i<=nvars(basering); i++)
|
|
586
|
+
{
|
|
587
|
+
if (reduce(var(i),J)<>0)
|
|
588
|
+
{
|
|
589
|
+
newmap[i]=var(i);
|
|
590
|
+
|
|
591
|
+
if (newvar=="")
|
|
592
|
+
{
|
|
593
|
+
newvar=newvar+string(var(i));
|
|
594
|
+
counter=counter+1;
|
|
595
|
+
}
|
|
596
|
+
else
|
|
597
|
+
{
|
|
598
|
+
newvar=newvar+","+string(var(i));
|
|
599
|
+
counter=counter+1;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
else
|
|
603
|
+
{
|
|
604
|
+
newmap[i]=0;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
list L=newvar,newmap,counter;
|
|
608
|
+
attrib(J,"isSB",0);
|
|
609
|
+
return(L);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
613
|
+
// The following procedure is called by esStratum (typ=0), resp. by
|
|
614
|
+
// isEquising (typ=1)
|
|
615
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
616
|
+
|
|
617
|
+
static proc esComputation (int typ, poly p_F, list #)
|
|
618
|
+
{
|
|
619
|
+
// Initialize variables
|
|
620
|
+
int branch=1;
|
|
621
|
+
int blowup=1;
|
|
622
|
+
int auxVar=1;
|
|
623
|
+
int nVars;
|
|
624
|
+
|
|
625
|
+
intvec upper_bound, upper_bound_old, fertig, soll;
|
|
626
|
+
list blowup_string;
|
|
627
|
+
int i_print= printlevel-voice+2;
|
|
628
|
+
|
|
629
|
+
int no_b, number_of_branches, swapped;
|
|
630
|
+
int i,j,k,m, counter, dummy;
|
|
631
|
+
string helpStr = "";
|
|
632
|
+
string ordStr = "";
|
|
633
|
+
string MinPolyStr = "";
|
|
634
|
+
|
|
635
|
+
if (nvars(basering)<=2)
|
|
636
|
+
{
|
|
637
|
+
print("family is trivial (no deformation parameters)!");
|
|
638
|
+
if (typ==1) //isEquising
|
|
639
|
+
{
|
|
640
|
+
return(1);
|
|
641
|
+
}
|
|
642
|
+
else
|
|
643
|
+
{
|
|
644
|
+
return(list(ideal(0),0));
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
if (size(#)>0)
|
|
649
|
+
{
|
|
650
|
+
if (typeof(#[1])=="int")
|
|
651
|
+
{
|
|
652
|
+
def artin_bd=#[1]; // compute modulo maxideal(artin_bd)
|
|
653
|
+
if (artin_bd <= 1)
|
|
654
|
+
{
|
|
655
|
+
print("Do you really want to compute over Basering/maxideal("
|
|
656
|
+
+string(artin_bd)+") ?");
|
|
657
|
+
print("No computation performed !");
|
|
658
|
+
if (typ==1) //isEquising
|
|
659
|
+
{
|
|
660
|
+
return(1);
|
|
661
|
+
}
|
|
662
|
+
else
|
|
663
|
+
{
|
|
664
|
+
return(list(ideal(0),int(1)));
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
if (size(#)>1)
|
|
668
|
+
{
|
|
669
|
+
if (typeof(#[2])=="list")
|
|
670
|
+
{
|
|
671
|
+
def @L=#[2]; // is assumed to be the Hamburger-Noether matrix
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
else
|
|
676
|
+
{
|
|
677
|
+
if (typeof(#)=="list")
|
|
678
|
+
{
|
|
679
|
+
def @L=#; // is assumed to be the Hamburger-Noether matrix
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
intvec ov=option(get); // store options
|
|
684
|
+
option(redSB);
|
|
685
|
+
int ring_is_changed;
|
|
686
|
+
def old_ring=basering;
|
|
687
|
+
if(defined(@L)<=0)
|
|
688
|
+
{
|
|
689
|
+
// define a new ring without deformation-parameters and change to it:
|
|
690
|
+
string str;
|
|
691
|
+
string minpolyStr = string(minpoly);
|
|
692
|
+
ring HNERing = create_ring(ring_list(basering)[1], "(x,y)", "ls", "no_minpoly");
|
|
693
|
+
if (minpolyStr!="0")
|
|
694
|
+
{str = "minpoly ="+ minpolyStr+";";execute(str);}
|
|
695
|
+
ring_is_changed=1;
|
|
696
|
+
// Basering changed to HNERing (variables x,y, with ls ordering)
|
|
697
|
+
|
|
698
|
+
k=nvars(old_ring);
|
|
699
|
+
matrix Map_Phi[1][k];
|
|
700
|
+
Map_Phi[1,k-1]=x;
|
|
701
|
+
Map_Phi[1,k]=y;
|
|
702
|
+
map phi=old_ring,Map_Phi;
|
|
703
|
+
poly f=phi(p_F);
|
|
704
|
+
|
|
705
|
+
// Heuristics: if x,y are transversal parameters then computation of HNE
|
|
706
|
+
// can be much faster when exchanging variables...!
|
|
707
|
+
if (2*size(coeffs(f,x))<size(coeffs(f,y)))
|
|
708
|
+
{
|
|
709
|
+
swapped=1;
|
|
710
|
+
f=swapXY(f);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
int error=checkPoly(f);
|
|
714
|
+
if (error)
|
|
715
|
+
{
|
|
716
|
+
setring old_ring;
|
|
717
|
+
if (typ==1) //isEquising
|
|
718
|
+
{
|
|
719
|
+
print("Return value (=0) has no meaning!");
|
|
720
|
+
option(set,ov);
|
|
721
|
+
return(0);
|
|
722
|
+
}
|
|
723
|
+
else
|
|
724
|
+
{
|
|
725
|
+
option(set,ov);
|
|
726
|
+
return(list( ideal(0),error));
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
dbprint(i_print,"// ");
|
|
731
|
+
dbprint(i_print,"// Compute HN expansion");
|
|
732
|
+
dbprint(i_print,"// ---------------------");
|
|
733
|
+
i=printlevel;
|
|
734
|
+
printlevel=printlevel-5;
|
|
735
|
+
list LLL=hnexpansion(f);
|
|
736
|
+
|
|
737
|
+
if (size(LLL)==0) { // empty list returned by hnexpansion
|
|
738
|
+
setring old_ring;
|
|
739
|
+
print(i_print,"Unable to compute HN expansion !");
|
|
740
|
+
if (typ==1) //isEquising
|
|
741
|
+
{
|
|
742
|
+
print("Return value (=0) has no meaning!");
|
|
743
|
+
option(set,ov);
|
|
744
|
+
return(0);
|
|
745
|
+
}
|
|
746
|
+
else
|
|
747
|
+
{
|
|
748
|
+
option(set,ov);
|
|
749
|
+
return(list(ideal(0),int(1)));
|
|
750
|
+
}
|
|
751
|
+
option(set,ov);
|
|
752
|
+
return(0);
|
|
753
|
+
}
|
|
754
|
+
else
|
|
755
|
+
{
|
|
756
|
+
if (typeof(LLL[1])=="ring") {
|
|
757
|
+
def HNering = LLL[1];
|
|
758
|
+
setring HNering;
|
|
759
|
+
def @L=stripHNE(hne);
|
|
760
|
+
}
|
|
761
|
+
else {
|
|
762
|
+
def @L=stripHNE(LLL);
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
printlevel=i;
|
|
766
|
+
dbprint(i_print,"// finished");
|
|
767
|
+
dbprint(i_print,"// ");
|
|
768
|
+
}
|
|
769
|
+
def HNEring=basering;
|
|
770
|
+
list M=multsequence(@L);
|
|
771
|
+
M=control_Matrix(M); // this returns the 4 control matrices
|
|
772
|
+
def maxDeg=M[4];
|
|
773
|
+
|
|
774
|
+
list L1=inf_Tangents(@L,nrows(M[1]));
|
|
775
|
+
matrix B=L1[1];
|
|
776
|
+
intvec V=L1[2];
|
|
777
|
+
kill L1;
|
|
778
|
+
|
|
779
|
+
// if we have computed the HNE for f after swapping x and y, we have
|
|
780
|
+
// to reinterprete the (swap) matrix V:
|
|
781
|
+
if (swapped==1)
|
|
782
|
+
{
|
|
783
|
+
for (i=1;i<=size(V);i++) { V[i]=V[i]-1; } // turns 0 into -1, 1 into 0
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
// Determine maximal number of needed auxiliary parameters (free tangents):
|
|
787
|
+
no_b=Determine_no_b(M[3],B);
|
|
788
|
+
|
|
789
|
+
// test whether HNexpansion needed field extension....
|
|
790
|
+
string minPolyStr = "";
|
|
791
|
+
if (minpoly !=0)
|
|
792
|
+
{
|
|
793
|
+
minPolyStr = makeMinPolyString("a");
|
|
794
|
+
minPolyStr = "minpoly =" + minPolyStr + ";";
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
setring old_ring;
|
|
798
|
+
|
|
799
|
+
def myRing=createMyRing_new(p_F,"dp",minPolyStr,no_b);
|
|
800
|
+
setring myRing; // comes with mIdeal
|
|
801
|
+
map hole=HNEring,mIdeal;
|
|
802
|
+
// basering has changed to myRing, in particular, the "old"
|
|
803
|
+
// variable names, e.g., A,B,C,z,y are replaced by t(1),t(2),t(3),x,y
|
|
804
|
+
|
|
805
|
+
ideal bNodes;
|
|
806
|
+
|
|
807
|
+
// Initialize some variables:
|
|
808
|
+
map phi;
|
|
809
|
+
poly G, F_save;
|
|
810
|
+
poly b_dummy;
|
|
811
|
+
ideal J,Jnew,final_Map;
|
|
812
|
+
number_of_branches=ncols(M[1]);
|
|
813
|
+
for (i=1;i<=number_of_branches;i++)
|
|
814
|
+
{
|
|
815
|
+
poly F(i);
|
|
816
|
+
ideal bl_Map(i);
|
|
817
|
+
}
|
|
818
|
+
upper_bound[number_of_branches]=0;
|
|
819
|
+
upper_bound[1]=number_of_branches;
|
|
820
|
+
upper_bound_old=upper_bound;
|
|
821
|
+
fertig[number_of_branches]=0;
|
|
822
|
+
for (i=1;i<=number_of_branches;i++){ soll[i]=1; }
|
|
823
|
+
|
|
824
|
+
// Hole: B = matrix of blowup points
|
|
825
|
+
if (ring_is_changed==0) { matrix B=hole(B); }
|
|
826
|
+
else { matrix B=imap(HNEring,B); }
|
|
827
|
+
m=M[1][blowup,branch]; // multiplicity at 0
|
|
828
|
+
|
|
829
|
+
// now, we start by checking equimultiplicity along trivial section
|
|
830
|
+
poly Fm=m_Jet(p_F,m-1);
|
|
831
|
+
|
|
832
|
+
matrix coef_Mat = coef(Fm,xy);
|
|
833
|
+
Jnew=coef_Mat[2,1..ncols(coef_Mat)];
|
|
834
|
+
J=J,Jnew;
|
|
835
|
+
|
|
836
|
+
if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
|
|
837
|
+
// deformation parameters can be cutted off
|
|
838
|
+
{
|
|
839
|
+
J=jet(J,artin_bd-1);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
J=interred(J);
|
|
843
|
+
if (defined(artin_bd)) { J=jet(J,artin_bd-1); }
|
|
844
|
+
|
|
845
|
+
// J=std(J);
|
|
846
|
+
|
|
847
|
+
if (typ==1) // isEquising
|
|
848
|
+
{
|
|
849
|
+
if(ideal(nselect(J,1..no_b))<>0)
|
|
850
|
+
{
|
|
851
|
+
setring old_ring;
|
|
852
|
+
option(set,ov);
|
|
853
|
+
return(0);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
F(1)=p_F;
|
|
858
|
+
|
|
859
|
+
// and reduce the remaining terms in F(1):
|
|
860
|
+
bl_Map(1)=maxideal(1);
|
|
861
|
+
|
|
862
|
+
attrib(J,"isSB",1);
|
|
863
|
+
bl_Map(1)=reduce(bl_Map(1),J);
|
|
864
|
+
attrib(J,"isSB",0);
|
|
865
|
+
|
|
866
|
+
phi=myRing,bl_Map(1);
|
|
867
|
+
F(1)=phi(F(1));
|
|
868
|
+
|
|
869
|
+
// simplify F(1)
|
|
870
|
+
attrib(J,"isSB",1);
|
|
871
|
+
F(1)=reduce(F(1),J);
|
|
872
|
+
attrib(J,"isSB",0);
|
|
873
|
+
|
|
874
|
+
// now we compute the m-jet:
|
|
875
|
+
Fm=m_Jet(F(1),m);
|
|
876
|
+
|
|
877
|
+
G=1;
|
|
878
|
+
counter=branch;
|
|
879
|
+
k=upper_bound[branch];
|
|
880
|
+
|
|
881
|
+
F_save=F(1); // is truncated differently in the following loop
|
|
882
|
+
|
|
883
|
+
while(counter<=k)
|
|
884
|
+
{
|
|
885
|
+
F(counter)=m_Jet(F_save,maxDeg[blowup,counter]);
|
|
886
|
+
if (V[counter]==0) // 2nd ring variable is tangent to this branch
|
|
887
|
+
{
|
|
888
|
+
G=G*(y-(b(auxVar)+B[blowup,counter])*x)^(M[3][blowup,counter]);
|
|
889
|
+
}
|
|
890
|
+
else // 1st ring variable is tangent to this branch
|
|
891
|
+
{
|
|
892
|
+
G=G*(x-(b(auxVar)+B[blowup,counter])*y)^(M[3][blowup,counter]);
|
|
893
|
+
F(counter)=swapXY(F(counter));
|
|
894
|
+
}
|
|
895
|
+
bl_Map(counter)=maxideal(1);
|
|
896
|
+
bl_Map(counter)[nvars(basering)]=xy+(b(auxVar)+B[blowup,counter])*x;
|
|
897
|
+
|
|
898
|
+
bNodes[counter]=b(auxVar);
|
|
899
|
+
|
|
900
|
+
auxVar=auxVar+1;
|
|
901
|
+
upper_bound[counter]=counter+M[2][blowup+1,counter]-1;
|
|
902
|
+
counter=counter+M[2][blowup+1,counter];
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
list LeadDataFm=determine_coef(Fm);
|
|
906
|
+
def LeadDataG=coef(G,xy);
|
|
907
|
+
|
|
908
|
+
for (i=1; i<=ncols(LeadDataG); i++)
|
|
909
|
+
{
|
|
910
|
+
if (LeadDataG[1,i]==LeadDataFm[2])
|
|
911
|
+
{
|
|
912
|
+
poly LeadG = LeadDataG[2,i]; // determine the coefficient of G
|
|
913
|
+
i=ncols(LeadDataG)+1;
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
G=LeadDataFm[1]*G-LeadG*Fm; // leading terms in y should cancel...
|
|
918
|
+
|
|
919
|
+
coef_Mat = coef(G,xy);
|
|
920
|
+
Jnew=coef_Mat[2,1..ncols(coef_Mat)];
|
|
921
|
+
|
|
922
|
+
// simplification of Jnew
|
|
923
|
+
|
|
924
|
+
if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
|
|
925
|
+
// deformation parameters can be cutted off
|
|
926
|
+
{
|
|
927
|
+
Jnew=jet(Jnew,artin_bd-1);
|
|
928
|
+
}
|
|
929
|
+
Jnew=interred(Jnew);
|
|
930
|
+
if (defined(artin_bd)) { Jnew=jet(Jnew,artin_bd-1); }
|
|
931
|
+
J=J,Jnew;
|
|
932
|
+
|
|
933
|
+
if (typ==1) // isEquising
|
|
934
|
+
{
|
|
935
|
+
if(ideal(nselect(J,1..no_b))<>0)
|
|
936
|
+
{
|
|
937
|
+
setring old_ring;
|
|
938
|
+
option(set,ov);
|
|
939
|
+
return(0);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
while (fertig<>soll and blowup<nrows(M[3]))
|
|
944
|
+
{
|
|
945
|
+
upper_bound_old=upper_bound;
|
|
946
|
+
dbprint(i_print,"// Blowup Step "+string(blowup)+" completed");
|
|
947
|
+
blowup=blowup+1;
|
|
948
|
+
|
|
949
|
+
for (branch=1;branch<=number_of_branches;branch=branch+1)
|
|
950
|
+
{
|
|
951
|
+
Jnew=0;
|
|
952
|
+
|
|
953
|
+
// First we check if the branch still has to be considered:
|
|
954
|
+
if (branch==upper_bound_old[branch] and fertig[branch]<>1)
|
|
955
|
+
{
|
|
956
|
+
if (M[3][blowup-1,branch]==1 and
|
|
957
|
+
((B[blowup,branch]<>x and B[blowup,branch]<>y)
|
|
958
|
+
or (blowup==nrows(M[3])) ))
|
|
959
|
+
{
|
|
960
|
+
fertig[branch]=1;
|
|
961
|
+
dbprint(i_print,"// 1 branch finished");
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
if (branch<=upper_bound_old[branch] and fertig[branch]<>1)
|
|
966
|
+
{
|
|
967
|
+
for (i=branch;i>=1;i--)
|
|
968
|
+
{
|
|
969
|
+
if (M[1][blowup-1,i]<>0)
|
|
970
|
+
{
|
|
971
|
+
m=M[1][blowup-1,i]; // multiplicity before blowup
|
|
972
|
+
i=0;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
// we blow up the branch and take the strict transform:
|
|
977
|
+
attrib(J,"isSB",1);
|
|
978
|
+
bl_Map(branch)=reduce(bl_Map(branch),J);
|
|
979
|
+
attrib(J,"isSB",0);
|
|
980
|
+
|
|
981
|
+
phi=myRing,bl_Map(branch);
|
|
982
|
+
F(branch)=phi(F(branch))/x^m;
|
|
983
|
+
|
|
984
|
+
// simplify F
|
|
985
|
+
attrib(Jnew,"isSB",1);
|
|
986
|
+
|
|
987
|
+
F(branch)=reduce(F(branch),Jnew);
|
|
988
|
+
attrib(Jnew,"isSB",0);
|
|
989
|
+
|
|
990
|
+
m=M[1][blowup,branch]; // multiplicity after blowup
|
|
991
|
+
Fm=m_Jet(F(branch),m); // homogeneous part of lowest degree
|
|
992
|
+
|
|
993
|
+
|
|
994
|
+
// we check for Fm=F[k]*...*F[k+s] where
|
|
995
|
+
//
|
|
996
|
+
// F[j]=(y-b'(j)*x)^m(j), respectively F[j]=(-b'(j)*y+x)^m(j)
|
|
997
|
+
//
|
|
998
|
+
// according to the entries m(j)= M[3][blowup,j] and
|
|
999
|
+
// b'(j) mod m_A = B[blowup,j]
|
|
1000
|
+
// computed from the HNE of the special fibre of the family:
|
|
1001
|
+
G=1;
|
|
1002
|
+
counter=branch;
|
|
1003
|
+
k=upper_bound[branch];
|
|
1004
|
+
|
|
1005
|
+
F_save=F(branch);
|
|
1006
|
+
|
|
1007
|
+
while(counter<=k)
|
|
1008
|
+
{
|
|
1009
|
+
F(counter)=m_Jet(F_save,maxDeg[blowup,counter]);
|
|
1010
|
+
|
|
1011
|
+
if (B[blowup,counter]<>x and B[blowup,counter]<>y)
|
|
1012
|
+
{
|
|
1013
|
+
G=G*(y-(b(auxVar)+B[blowup,counter])*x)^(M[3][blowup,counter]);
|
|
1014
|
+
bl_Map(counter)=maxideal(1);
|
|
1015
|
+
bl_Map(counter)[nvars(basering)]=
|
|
1016
|
+
xy+(b(auxVar)+B[blowup,counter])*x;
|
|
1017
|
+
bNodes[counter]=b(auxVar);
|
|
1018
|
+
auxVar=auxVar+1;
|
|
1019
|
+
}
|
|
1020
|
+
else
|
|
1021
|
+
{
|
|
1022
|
+
if (B[blowup,counter]==x)
|
|
1023
|
+
{
|
|
1024
|
+
G=G*x^(M[3][blowup,counter]); // branch has tangent x !!
|
|
1025
|
+
F(counter)=swapXY(F(counter)); // will turn x to y for blow up
|
|
1026
|
+
bl_Map(counter)=maxideal(1);
|
|
1027
|
+
bl_Map(counter)[nvars(basering)]=xy;
|
|
1028
|
+
}
|
|
1029
|
+
else
|
|
1030
|
+
{
|
|
1031
|
+
G=G*y^(M[3][blowup,counter]); // tangent has to be y
|
|
1032
|
+
bl_Map(counter)=maxideal(1);
|
|
1033
|
+
bl_Map(counter)[nvars(basering)]=xy;
|
|
1034
|
+
}
|
|
1035
|
+
bNodes[counter]=0;
|
|
1036
|
+
}
|
|
1037
|
+
upper_bound[counter]=counter+M[2][blowup+1,counter]-1;
|
|
1038
|
+
counter=counter+M[2][blowup+1,counter];
|
|
1039
|
+
}
|
|
1040
|
+
G=determine_coef(Fm)[1]*G-Fm; // leading terms in y should cancel
|
|
1041
|
+
coef_Mat = coef(G,xy);
|
|
1042
|
+
Jnew=coef_Mat[2,1..ncols(coef_Mat)];
|
|
1043
|
+
if (defined(artin_bd)) // the artin_bd-th power of the maxideal of
|
|
1044
|
+
// deformation parameters can be cutted off
|
|
1045
|
+
{
|
|
1046
|
+
Jnew=jet(Jnew,artin_bd-1);
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
// simplification of J
|
|
1050
|
+
Jnew=interred(Jnew);
|
|
1051
|
+
|
|
1052
|
+
J=J,Jnew;
|
|
1053
|
+
if (typ==1) // isEquising
|
|
1054
|
+
{
|
|
1055
|
+
if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
|
|
1056
|
+
if(ideal(nselect(J,1..no_b))<>0)
|
|
1057
|
+
{
|
|
1058
|
+
setring old_ring;
|
|
1059
|
+
option(set,ov);
|
|
1060
|
+
return(0);
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
if (number_of_branches>=2)
|
|
1066
|
+
{
|
|
1067
|
+
J=interred(J);
|
|
1068
|
+
if (typ==1) // isEquising
|
|
1069
|
+
{
|
|
1070
|
+
if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
|
|
1071
|
+
if(ideal(nselect(J,1..no_b))<>0)
|
|
1072
|
+
{
|
|
1073
|
+
setring old_ring;
|
|
1074
|
+
option(set,ov);
|
|
1075
|
+
return(0);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
// Computation for all equimultiple sections being trivial (I^s(f))
|
|
1082
|
+
ideal Jtriv=J;
|
|
1083
|
+
for (i=1;i<=no_b; i++)
|
|
1084
|
+
{
|
|
1085
|
+
if (reduce(b(i),std(bNodes))!=0){
|
|
1086
|
+
Jtriv=subst(Jtriv,b(i),0);
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
option(pure_gb);
|
|
1090
|
+
Jtriv=std(Jtriv);
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
|
|
1094
|
+
dbprint(i_print,"// ");
|
|
1095
|
+
dbprint(i_print,"// Elimination starts:");
|
|
1096
|
+
dbprint(i_print,"// -------------------");
|
|
1097
|
+
|
|
1098
|
+
poly gg;
|
|
1099
|
+
int b_left=no_b;
|
|
1100
|
+
|
|
1101
|
+
for (i=1;i<=no_b; i++)
|
|
1102
|
+
{
|
|
1103
|
+
attrib(J,"isSB",1);
|
|
1104
|
+
gg=reduce(b(i),J);
|
|
1105
|
+
if (gg==0)
|
|
1106
|
+
{
|
|
1107
|
+
b_left = b_left-1; // another b(i) has to be 0
|
|
1108
|
+
}
|
|
1109
|
+
J = subst(J, b(i), gg);
|
|
1110
|
+
attrib(J,"isSB",0);
|
|
1111
|
+
}
|
|
1112
|
+
J=simplify(J,10);
|
|
1113
|
+
if (typ==1) // isEquising
|
|
1114
|
+
{
|
|
1115
|
+
if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
|
|
1116
|
+
if(ideal(nselect(J,1..no_b))<>0)
|
|
1117
|
+
{
|
|
1118
|
+
setring old_ring;
|
|
1119
|
+
option(set,ov);
|
|
1120
|
+
return(0);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
//new CL 11/06: check in which equations b(k) appears and remove those b(k)
|
|
1125
|
+
// which appear in exactly one of the equations (by removing this
|
|
1126
|
+
// equation)
|
|
1127
|
+
dbprint(i_print,"// ");
|
|
1128
|
+
dbprint(i_print,"// Remove superfluous equations:");
|
|
1129
|
+
dbprint(i_print,"// -----------------------------");
|
|
1130
|
+
int Z,App_in;
|
|
1131
|
+
ideal J_Tmp;
|
|
1132
|
+
int ncJ=ncols(J);
|
|
1133
|
+
|
|
1134
|
+
intmat Mdet[ncJ][1];
|
|
1135
|
+
for (Z=1;Z<=ncJ;Z++){ Mdet[Z,1]=Z; }
|
|
1136
|
+
|
|
1137
|
+
for (i=1;i<=no_b; i++)
|
|
1138
|
+
{
|
|
1139
|
+
ideal b_appears_in(i); // Eintraege sind spaeter 1 oder 0
|
|
1140
|
+
intmat b_app_in(i)[1][ncJ]; // Eintraege sind spaeter 1 oder 0
|
|
1141
|
+
b_appears_in(i)[ncJ]=0;
|
|
1142
|
+
J_Tmp = matrix(J)-subst(J,b(i),0);
|
|
1143
|
+
for (Z=1; Z<=ncJ; Z++) {
|
|
1144
|
+
if (J_Tmp[Z]<>0) { // b(i) appear in J_Tmp[Z]
|
|
1145
|
+
b_appears_in(i)[Z]=1;
|
|
1146
|
+
b_app_in(i)[1,Z]=1;
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
if (size(b_appears_in(i))==1) { //b(i) appears only in one J_Tmp[Z]
|
|
1150
|
+
App_in = (b_app_in(i)*Mdet)[1,1]; // determines Z
|
|
1151
|
+
J[App_in]=0;
|
|
1152
|
+
b_appears_in(i)[App_in]=0;
|
|
1153
|
+
b_app_in(i)[1,App_in]=0;
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
for (i=1;i<=no_b; i++)
|
|
1158
|
+
{
|
|
1159
|
+
if (size(b_appears_in(i))==1) { //b(i) appears only in one J_Tmp[Z]
|
|
1160
|
+
App_in = (b_app_in(i)*Mdet)[1,1]; // determines Z
|
|
1161
|
+
J[App_in]=0;
|
|
1162
|
+
b_appears_in(i)[App_in]=0;
|
|
1163
|
+
b_app_in(i)[1,Z]=1;
|
|
1164
|
+
i=0;
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
Jtriv = nselect(Jtriv,1..no_b);
|
|
1169
|
+
ideal J_no_b = nselect(J,1..no_b);
|
|
1170
|
+
if (size(J) > size(J_no_b))
|
|
1171
|
+
{
|
|
1172
|
+
dbprint(i_print,"// std computation started");
|
|
1173
|
+
// some b(i) didn't appear in linear conditions and have to be eliminated
|
|
1174
|
+
if (defined(artin_bd))
|
|
1175
|
+
{
|
|
1176
|
+
// first we make the ring smaller (removing variables, which are
|
|
1177
|
+
// forced to 0 by J
|
|
1178
|
+
list LL=make_ring_small(J);
|
|
1179
|
+
ideal Shortmap=LL[2];
|
|
1180
|
+
minPolyStr = "";
|
|
1181
|
+
if (minpoly !=0)
|
|
1182
|
+
{
|
|
1183
|
+
minPolyStr = "minpoly = "+string(minpoly);
|
|
1184
|
+
}
|
|
1185
|
+
ordStr = "dp(" + string(b_left) + "),dp";
|
|
1186
|
+
ideal qId = ideal(basering);
|
|
1187
|
+
|
|
1188
|
+
ring Shortring = create_ring(ring_list(basering)[1], "("+ LL[1] +")", "("+ ordStr +")", "no_minpoly");
|
|
1189
|
+
execute(minPolyStr);
|
|
1190
|
+
// ring has changed to "Shortring"
|
|
1191
|
+
|
|
1192
|
+
ideal MM=maxideal(artin_bd);
|
|
1193
|
+
MM=subst(MM,x,0);
|
|
1194
|
+
MM=subst(MM,y,0);
|
|
1195
|
+
MM=simplify(MM,2);
|
|
1196
|
+
dbprint(i_print-1,"// maxideal("+string(artin_bd)+") has "
|
|
1197
|
+
+string(size(MM))+" elements");
|
|
1198
|
+
dbprint(i_print-1,"//");
|
|
1199
|
+
|
|
1200
|
+
// we change to the qring mod m^artin_bd
|
|
1201
|
+
// first, we have to check if we were in a qring when starting
|
|
1202
|
+
ideal qId = imap(myRing, qId);
|
|
1203
|
+
if (size(qId) == 0)
|
|
1204
|
+
{
|
|
1205
|
+
attrib(MM,"isSB",1);
|
|
1206
|
+
qring QQ=MM;
|
|
1207
|
+
}
|
|
1208
|
+
else
|
|
1209
|
+
{
|
|
1210
|
+
qId=qId,MM;
|
|
1211
|
+
qring QQ = std(qId);
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
ideal Shortmap=imap(myRing,Shortmap);
|
|
1215
|
+
map phiphi=myRing,Shortmap;
|
|
1216
|
+
|
|
1217
|
+
ideal J=phiphi(J);
|
|
1218
|
+
option(redSB);
|
|
1219
|
+
J=std(J);
|
|
1220
|
+
J=nselect(J,1..no_b);
|
|
1221
|
+
|
|
1222
|
+
setring myRing;
|
|
1223
|
+
// back to "myRing"
|
|
1224
|
+
|
|
1225
|
+
J=nselect(J,1..no_b);
|
|
1226
|
+
Jnew=imap(QQ,J);
|
|
1227
|
+
|
|
1228
|
+
J=J,Jnew;
|
|
1229
|
+
J=interred(J);
|
|
1230
|
+
if (defined(artin_bd)){ J=jet(J,artin_bd-1); }
|
|
1231
|
+
}
|
|
1232
|
+
else
|
|
1233
|
+
{
|
|
1234
|
+
J=std(J);
|
|
1235
|
+
J=nselect(J,1..no_b);
|
|
1236
|
+
if (defined(artin_bd)){ J=jet(J,artin_bd-1); }
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
dbprint(i_print,"// finished");
|
|
1241
|
+
dbprint(i_print,"// ");
|
|
1242
|
+
|
|
1243
|
+
minPolyStr = "";option(set,ov);
|
|
1244
|
+
if (minpoly !=0)
|
|
1245
|
+
{
|
|
1246
|
+
minPolyStr = "minpoly = "+string(minpoly);
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
kill HNEring;
|
|
1250
|
+
|
|
1251
|
+
if (typ==1) // isEquising
|
|
1252
|
+
{
|
|
1253
|
+
if (defined(artin_bd)) { J=jet(Jnew,artin_bd-1); }
|
|
1254
|
+
if(J<>0)
|
|
1255
|
+
{
|
|
1256
|
+
setring old_ring;
|
|
1257
|
+
option(set,ov);
|
|
1258
|
+
return(0);
|
|
1259
|
+
}
|
|
1260
|
+
else
|
|
1261
|
+
{
|
|
1262
|
+
setring old_ring;
|
|
1263
|
+
option(set,ov);
|
|
1264
|
+
return(1);
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
setring old_ring;
|
|
1269
|
+
// we are back in the original ring
|
|
1270
|
+
|
|
1271
|
+
if (npars(myRing)<>0)
|
|
1272
|
+
{
|
|
1273
|
+
ideal qIdeal = ideal(basering);
|
|
1274
|
+
ring ESSring = create_ring("("+ string(char(basering))+ "," + parstr(myRing) +")", "("+ varstr(basering)+")", "("+ ordstr(basering) +")");
|
|
1275
|
+
execute(minPolyStr);
|
|
1276
|
+
// basering has changed to ESSring
|
|
1277
|
+
|
|
1278
|
+
ideal qIdeal = fetch(old_ring, qIdeal);
|
|
1279
|
+
if(qIdeal != 0)
|
|
1280
|
+
{
|
|
1281
|
+
def r_base = basering;
|
|
1282
|
+
kill ESSring;
|
|
1283
|
+
qring ESSring = std(qIdeal);
|
|
1284
|
+
}
|
|
1285
|
+
kill qIdeal;
|
|
1286
|
+
|
|
1287
|
+
ideal SSS;
|
|
1288
|
+
for (int ii=1;ii<=nvars(basering);ii++)
|
|
1289
|
+
{
|
|
1290
|
+
SSS[ii+no_b]=var(ii);
|
|
1291
|
+
}
|
|
1292
|
+
map phi=myRing,SSS; // b(i) variables are mapped to zero
|
|
1293
|
+
|
|
1294
|
+
ideal ES=phi(J);
|
|
1295
|
+
ideal ES_all_triv=phi(Jtriv);
|
|
1296
|
+
kill phi;
|
|
1297
|
+
|
|
1298
|
+
if (defined(p_F)<=0)
|
|
1299
|
+
{
|
|
1300
|
+
poly p_F=fetch(old_ring,p_F);
|
|
1301
|
+
export(p_F);
|
|
1302
|
+
}
|
|
1303
|
+
export(ES);
|
|
1304
|
+
export(ES_all_triv);
|
|
1305
|
+
setring old_ring;
|
|
1306
|
+
dbprint(i_print+2,"
|
|
1307
|
+
// 'esStratum' created a list M of a ring and an integer.
|
|
1308
|
+
// To access the ideal defining the equisingularity stratum, type:
|
|
1309
|
+
def ESSring = M[1]; setring ESSring; ES; ");
|
|
1310
|
+
|
|
1311
|
+
option(set,ov);
|
|
1312
|
+
return(list(ESSring,0));
|
|
1313
|
+
}
|
|
1314
|
+
else
|
|
1315
|
+
{
|
|
1316
|
+
// no new ring definition necessary
|
|
1317
|
+
ideal SSS;
|
|
1318
|
+
for (int ii=1;ii<=nvars(basering);ii++)
|
|
1319
|
+
{
|
|
1320
|
+
SSS[ii+no_b]=var(ii);
|
|
1321
|
+
}
|
|
1322
|
+
map phi=myRing,SSS; // b(i) variables are mapped to zero
|
|
1323
|
+
|
|
1324
|
+
ideal ES=phi(J);
|
|
1325
|
+
ideal ES_all_triv=phi(Jtriv);
|
|
1326
|
+
kill phi;
|
|
1327
|
+
|
|
1328
|
+
setring old_ring;
|
|
1329
|
+
dbprint(i_print,"// output of 'esStratum' is a list consisting of:
|
|
1330
|
+
// _[1][1] = ideal defining the equisingularity stratum
|
|
1331
|
+
// _[1][2] = ideal defining the part of the equisingularity stratum
|
|
1332
|
+
// where all equimultiple sections are trivial
|
|
1333
|
+
// _[2] = 0");
|
|
1334
|
+
|
|
1335
|
+
option(set,ov);
|
|
1336
|
+
return(list(list(ES,ES_all_triv),0));
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
1342
|
+
|
|
1343
|
+
proc tau_es (poly f,list #)
|
|
1344
|
+
"USAGE: tau_es(f); f poly
|
|
1345
|
+
ASSUME: f is a reduced bivariate polynomial, the basering has precisely
|
|
1346
|
+
two variables, is local and no qring.
|
|
1347
|
+
RETURN: int, the codimension of the mu-const stratum in the semi-universal
|
|
1348
|
+
deformation base.
|
|
1349
|
+
NOTE: printlevel>=1 displays additional information.
|
|
1350
|
+
When called with any additional parameter, the computation of the
|
|
1351
|
+
Milnor number is avoided (no check for NND).
|
|
1352
|
+
SEE ALSO: esIdeal, tjurina, invariants
|
|
1353
|
+
EXAMPLE: example tau_es; shows an example.
|
|
1354
|
+
"
|
|
1355
|
+
{
|
|
1356
|
+
int i,j,k,s;
|
|
1357
|
+
int slope_x, slope_y, upper;
|
|
1358
|
+
int i_print = printlevel - voice + 3;
|
|
1359
|
+
string MinPolyStr;
|
|
1360
|
+
|
|
1361
|
+
// some checks first
|
|
1362
|
+
if ( nvars(basering)<>2 )
|
|
1363
|
+
{
|
|
1364
|
+
print("// basering has not the correct number (two) of variables !");
|
|
1365
|
+
print("// computation stopped");
|
|
1366
|
+
return(0);
|
|
1367
|
+
}
|
|
1368
|
+
if ( mult(std(1+var(1)+var(2))) <> 0)
|
|
1369
|
+
{
|
|
1370
|
+
print("// basering is not local !");
|
|
1371
|
+
print("// computation stopped");
|
|
1372
|
+
return(0);
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
if (mult(std(f))<=1)
|
|
1376
|
+
{
|
|
1377
|
+
// f is rigid
|
|
1378
|
+
return(0);
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
if ( deg(squarefree(f))!=deg(f) )
|
|
1382
|
+
{
|
|
1383
|
+
print("// input polynomial was not reduced");
|
|
1384
|
+
print("// try squarefree(f); first");
|
|
1385
|
+
return(0);
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
def old_ring=basering;
|
|
1389
|
+
ring @myRing = create_ring(ring_list(basering)[1], "("+varstr(basering)+")", "ds", "no_minpoly");
|
|
1390
|
+
poly f=imap(old_ring,f);
|
|
1391
|
+
|
|
1392
|
+
ideal Jacobi_Id = jacob(f);
|
|
1393
|
+
|
|
1394
|
+
// check for A_k singularity
|
|
1395
|
+
// ----------------------------------------
|
|
1396
|
+
if (mult(std(f))==2)
|
|
1397
|
+
{
|
|
1398
|
+
dbprint(i_print-1,"// ");
|
|
1399
|
+
dbprint(i_print-1,"// polynomial defined A_k singularity");
|
|
1400
|
+
dbprint(i_print-1,"// ");
|
|
1401
|
+
return( vdim(std(Jacobi_Id)) );
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
// check for D_k singularity
|
|
1405
|
+
// ----------------------------------------
|
|
1406
|
+
if (mult(std(f))==3 and size(factorize(jet(f,3))[1])>=3)
|
|
1407
|
+
{
|
|
1408
|
+
dbprint(i_print,"// ");
|
|
1409
|
+
dbprint(i_print,"// polynomial defined D_k singularity");
|
|
1410
|
+
dbprint(i_print,"// ");
|
|
1411
|
+
ideal ES_Id = f, jacob(f);
|
|
1412
|
+
return( vdim(std(Jacobi_Id)));
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
if (size(#)==0)
|
|
1417
|
+
{
|
|
1418
|
+
// check if Newton polygon non-degenerate
|
|
1419
|
+
// ----------------------------------------
|
|
1420
|
+
Jacobi_Id=std(Jacobi_Id);
|
|
1421
|
+
int mu = vdim(Jacobi_Id);
|
|
1422
|
+
poly f_tilde=f+var(1)^mu+var(2)^mu; //to obtain convenient Newton-polygon
|
|
1423
|
+
|
|
1424
|
+
list NP=newtonpoly(f_tilde);
|
|
1425
|
+
dbprint(i_print-1,"// Newton polygon:");
|
|
1426
|
+
dbprint(i_print-1,NP);
|
|
1427
|
+
dbprint(i_print-1,"");
|
|
1428
|
+
|
|
1429
|
+
if(is_NND(f,mu,NP)) // f is Newton non-degenerate
|
|
1430
|
+
{
|
|
1431
|
+
upper=NP[1][2];
|
|
1432
|
+
ideal ES_Id= x^k*y^upper;
|
|
1433
|
+
dbprint(i_print-1,"polynomial is Newton non-degenerate");
|
|
1434
|
+
dbprint(i_print-1,"");
|
|
1435
|
+
k=0;
|
|
1436
|
+
for (i=1;i<=size(NP)-1;i++)
|
|
1437
|
+
{
|
|
1438
|
+
slope_x=NP[i+1][1]-NP[i][1];
|
|
1439
|
+
slope_y=NP[i][2]-NP[i+1][2];
|
|
1440
|
+
for (k=NP[i][1]+1; k<=NP[i+1][1]; k++)
|
|
1441
|
+
{
|
|
1442
|
+
while ( slope_x*upper + slope_y*k >=
|
|
1443
|
+
slope_x*NP[i][2] + slope_y*NP[i][1])
|
|
1444
|
+
{
|
|
1445
|
+
upper=upper-1;
|
|
1446
|
+
}
|
|
1447
|
+
upper=upper+1;
|
|
1448
|
+
ES_Id=ES_Id, x^k*y^upper;
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
ES_Id=std(ES_Id);
|
|
1452
|
+
dbprint(i_print-2,"ideal of monomials above Newton bd. is generated by:");
|
|
1453
|
+
dbprint(i_print-2,ES_Id);
|
|
1454
|
+
ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
|
|
1455
|
+
ES_Id = ES_Id, Jacobi_Id;
|
|
1456
|
+
ES_Id = std(ES_Id);
|
|
1457
|
+
dbprint(i_print-1,"// ");
|
|
1458
|
+
dbprint(i_print-1,"// Equisingularity ideal is computed!");
|
|
1459
|
+
dbprint(i_print-1,"");
|
|
1460
|
+
return(vdim(ES_Id));
|
|
1461
|
+
}
|
|
1462
|
+
else
|
|
1463
|
+
{
|
|
1464
|
+
dbprint(i_print-1,"polynomial is Newton degenerate !");
|
|
1465
|
+
dbprint(i_print-1,"");
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
// for Newton degenerate polynomials, we compute the HN expansion, and
|
|
1470
|
+
// count the number of free points .....
|
|
1471
|
+
|
|
1472
|
+
dbprint(i_print-1,"// ");
|
|
1473
|
+
dbprint(i_print-1,"// Compute HN expansion");
|
|
1474
|
+
dbprint(i_print-1,"// ---------------------");
|
|
1475
|
+
i=printlevel;
|
|
1476
|
+
printlevel=printlevel-5;
|
|
1477
|
+
if (2*size(coeffs(f,x))<size(coeffs(f,y)))
|
|
1478
|
+
{
|
|
1479
|
+
f=swapXY(f);
|
|
1480
|
+
}
|
|
1481
|
+
list LLL=hnexpansion(f);
|
|
1482
|
+
if (size(LLL)==0) { // empty list returned by hnexpansion
|
|
1483
|
+
setring old_ring;
|
|
1484
|
+
ERROR("Unable to compute HN expansion !");
|
|
1485
|
+
}
|
|
1486
|
+
else
|
|
1487
|
+
{
|
|
1488
|
+
if (typeof(LLL[1])=="ring") {
|
|
1489
|
+
def HNering = LLL[1];
|
|
1490
|
+
setring HNering;
|
|
1491
|
+
def @L=hne;
|
|
1492
|
+
}
|
|
1493
|
+
else {
|
|
1494
|
+
def @L=LLL;
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
def HNEring=basering;
|
|
1498
|
+
|
|
1499
|
+
printlevel=i;
|
|
1500
|
+
dbprint(i_print-1,"// finished");
|
|
1501
|
+
dbprint(i_print-1,"// ");
|
|
1502
|
+
|
|
1503
|
+
list M=multsequence(@L);
|
|
1504
|
+
M=control_Matrix(M); // this returns the 4 control matrices
|
|
1505
|
+
intmat Mult=M[1];
|
|
1506
|
+
|
|
1507
|
+
list L1=inf_Tangents(@L,nrows(M[1]));
|
|
1508
|
+
matrix B=L1[1];
|
|
1509
|
+
|
|
1510
|
+
// determine sum_i m_i(m_i+1)/2 (over inf. near points)
|
|
1511
|
+
int conditions=0;
|
|
1512
|
+
for (i=1;i<=nrows(Mult);i++)
|
|
1513
|
+
{
|
|
1514
|
+
for (j=1;j<=ncols(Mult);j++)
|
|
1515
|
+
{
|
|
1516
|
+
conditions=conditions+(Mult[i,j]*(Mult[i,j]+1) div 2);
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
int freePts=no_freePoints(M[1],B);
|
|
1520
|
+
int taues=conditions-freePts-2;
|
|
1521
|
+
|
|
1522
|
+
setring old_ring;
|
|
1523
|
+
return(taues);
|
|
1524
|
+
}
|
|
1525
|
+
example
|
|
1526
|
+
{
|
|
1527
|
+
"EXAMPLE:"; echo=2;
|
|
1528
|
+
ring r=32003,(x,y),ds;
|
|
1529
|
+
poly f=(x4-y4)^2-x10;
|
|
1530
|
+
tau_es(f);
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
1535
|
+
|
|
1536
|
+
proc esIdeal (poly f,list #)
|
|
1537
|
+
"USAGE: esIdeal(f[,any]]); f poly
|
|
1538
|
+
ASSUME: f is a reduced bivariate polynomial, the basering has precisely
|
|
1539
|
+
two variables, is local and no qring, and the characteristic of
|
|
1540
|
+
the ground field does not divide mult(f).
|
|
1541
|
+
RETURN: if called with only one parameter: list of two ideals,
|
|
1542
|
+
@format
|
|
1543
|
+
_[1]: equisingularity ideal of f (in sense of Wahl),
|
|
1544
|
+
_[2]: ideal of equisingularity with fixed position of the
|
|
1545
|
+
singularity;
|
|
1546
|
+
@end format
|
|
1547
|
+
if called with more than one parameter: list of three ideals,
|
|
1548
|
+
@format
|
|
1549
|
+
_[1]: equisingularity ideal of f (in sense of Wahl)
|
|
1550
|
+
_[2]: ideal of equisingularity with fixed position of the
|
|
1551
|
+
singularity;
|
|
1552
|
+
_[3]: ideal of all g such that the deformation defined by f+eg
|
|
1553
|
+
(e^2=0) is isomorphic to an equisingular deformation
|
|
1554
|
+
of V(f) with all equimultiple sections being trivial.
|
|
1555
|
+
@end format
|
|
1556
|
+
NOTE: if some of the above condition is not satisfied then return
|
|
1557
|
+
value is list(0,0).
|
|
1558
|
+
SEE ALSO: tau_es, esStratum
|
|
1559
|
+
KEYWORDS: equisingularity ideal
|
|
1560
|
+
EXAMPLE: example esIdeal; shows examples.
|
|
1561
|
+
"
|
|
1562
|
+
{
|
|
1563
|
+
|
|
1564
|
+
int typ;
|
|
1565
|
+
if (size(#)>0) { typ=1; } // I^s is also computed
|
|
1566
|
+
int i,k,s;
|
|
1567
|
+
int slope_x, slope_y, upper;
|
|
1568
|
+
int i_print = printlevel - voice + 3;
|
|
1569
|
+
string MinPolyStr;
|
|
1570
|
+
|
|
1571
|
+
// some checks first
|
|
1572
|
+
if ( nvars(basering)<>2 )
|
|
1573
|
+
{
|
|
1574
|
+
print("// basering has not the correct number (two) of variables !");
|
|
1575
|
+
print("// computation stopped");
|
|
1576
|
+
return(list(0,0));
|
|
1577
|
+
}
|
|
1578
|
+
if ( mult(std(1+var(1)+var(2))) <> 0)
|
|
1579
|
+
{
|
|
1580
|
+
print("// basering is not local !");
|
|
1581
|
+
print("// computation stopped");
|
|
1582
|
+
return(list(0,0));
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
if (mult(std(f))<=1)
|
|
1586
|
+
{
|
|
1587
|
+
// f is rigid
|
|
1588
|
+
if (typ==0)
|
|
1589
|
+
{
|
|
1590
|
+
return(list(ideal(1),ideal(1)));
|
|
1591
|
+
}
|
|
1592
|
+
else
|
|
1593
|
+
{
|
|
1594
|
+
return(list(ideal(1),ideal(1),ideal(1)));
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
if ( deg(squarefree(f))!=deg(f) )
|
|
1599
|
+
{
|
|
1600
|
+
print("// input polynomial was not squarefree");
|
|
1601
|
+
print("// try squarefree(f); first");
|
|
1602
|
+
return(list(0,0));
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
if (char(basering)<>0)
|
|
1606
|
+
{
|
|
1607
|
+
if (mult(std(f)) mod char(basering)==0)
|
|
1608
|
+
{
|
|
1609
|
+
print("// characteristic of ground field divides "
|
|
1610
|
+
+ "multiplicity of polynomial !");
|
|
1611
|
+
print("// computation stopped");
|
|
1612
|
+
return(list(0,0));
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
// check for A_k singularity
|
|
1617
|
+
// ----------------------------------------
|
|
1618
|
+
if (mult(std(f))==2)
|
|
1619
|
+
{
|
|
1620
|
+
dbprint(i_print,"// ");
|
|
1621
|
+
dbprint(i_print,"// polynomial defined A_k singularity");
|
|
1622
|
+
dbprint(i_print,"// ");
|
|
1623
|
+
ideal ES_Id = f, jacob(f);
|
|
1624
|
+
ES_Id = interred(ES_Id);
|
|
1625
|
+
ideal ESfix_Id = f, maxideal(1)*jacob(f);
|
|
1626
|
+
ESfix_Id= interred(ESfix_Id);
|
|
1627
|
+
if (typ==0) // only for computation of I^es and I^es_fix
|
|
1628
|
+
{
|
|
1629
|
+
return( list(ES_Id,ESfix_Id) );
|
|
1630
|
+
}
|
|
1631
|
+
else
|
|
1632
|
+
{
|
|
1633
|
+
return( list(ES_Id,ESfix_Id,ES_Id) );
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// check for D_k singularity
|
|
1638
|
+
// ----------------------------------------
|
|
1639
|
+
if (mult(std(f))==3 and size(factorize(jet(f,3))[1])>=3)
|
|
1640
|
+
{
|
|
1641
|
+
dbprint(i_print,"// ");
|
|
1642
|
+
dbprint(i_print,"// polynomial defined D_k singularity");
|
|
1643
|
+
dbprint(i_print,"// ");
|
|
1644
|
+
ideal ES_Id = f, jacob(f);
|
|
1645
|
+
ES_Id = interred(ES_Id);
|
|
1646
|
+
ideal ESfix_Id = f, maxideal(1)*jacob(f);
|
|
1647
|
+
ESfix_Id= interred(ESfix_Id);
|
|
1648
|
+
if (typ==0) // only for computation of I^es and I^es_fix
|
|
1649
|
+
{
|
|
1650
|
+
return( list(ES_Id,ESfix_Id) );
|
|
1651
|
+
}
|
|
1652
|
+
else
|
|
1653
|
+
{
|
|
1654
|
+
return( list(ES_Id,ESfix_Id,ES_Id) );
|
|
1655
|
+
}
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
// check if Newton polygon non-degenerate
|
|
1659
|
+
// ----------------------------------------
|
|
1660
|
+
int mu = milnor(f);
|
|
1661
|
+
poly f_tilde=f+var(1)^mu+var(2)^mu; //to obtain a convenient Newton-polygon
|
|
1662
|
+
|
|
1663
|
+
list NP=newtonpoly(f_tilde);
|
|
1664
|
+
dbprint(i_print-1,"// Newton polygon:");
|
|
1665
|
+
dbprint(i_print-1,NP);
|
|
1666
|
+
dbprint(i_print-1,"");
|
|
1667
|
+
|
|
1668
|
+
if(is_NND(f,mu,NP)) // f is Newton non-degenerate
|
|
1669
|
+
{
|
|
1670
|
+
upper=NP[1][2];
|
|
1671
|
+
ideal ES_Id= x^k*y^upper;
|
|
1672
|
+
dbprint(i_print,"polynomial is Newton non-degenerate");
|
|
1673
|
+
dbprint(i_print,"");
|
|
1674
|
+
k=0;
|
|
1675
|
+
for (i=1;i<=size(NP)-1;i++)
|
|
1676
|
+
{
|
|
1677
|
+
slope_x=NP[i+1][1]-NP[i][1];
|
|
1678
|
+
slope_y=NP[i][2]-NP[i+1][2];
|
|
1679
|
+
for (k=NP[i][1]+1; k<=NP[i+1][1]; k++)
|
|
1680
|
+
{
|
|
1681
|
+
while ( slope_x*upper + slope_y*k >=
|
|
1682
|
+
slope_x*NP[i][2] + slope_y*NP[i][1])
|
|
1683
|
+
{
|
|
1684
|
+
upper=upper-1;
|
|
1685
|
+
}
|
|
1686
|
+
upper=upper+1;
|
|
1687
|
+
ES_Id=ES_Id, x^k*y^upper;
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
ES_Id=std(ES_Id);
|
|
1691
|
+
dbprint(i_print-1,"ideal of monomials above Newton bd. is generated by:");
|
|
1692
|
+
dbprint(i_print-1,ES_Id);
|
|
1693
|
+
ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
|
|
1694
|
+
ES_Id = ES_Id, f, jacob(f);
|
|
1695
|
+
dbprint(i_print,"// ");
|
|
1696
|
+
dbprint(i_print,"// equisingularity ideal is computed!");
|
|
1697
|
+
if (typ==0)
|
|
1698
|
+
{
|
|
1699
|
+
return(list(ES_Id,ESfix_Id));
|
|
1700
|
+
}
|
|
1701
|
+
else
|
|
1702
|
+
{
|
|
1703
|
+
return(list(ES_Id,ESfix_Id,ES_Id));
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
else
|
|
1707
|
+
{
|
|
1708
|
+
dbprint(i_print,"polynomial is Newton degenerate !");
|
|
1709
|
+
dbprint(i_print,"");
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
def old_ring=basering;
|
|
1713
|
+
|
|
1714
|
+
dbprint(i_print,"// ");
|
|
1715
|
+
dbprint(i_print,"// versal deformation with triv. section");
|
|
1716
|
+
dbprint(i_print,"// =====================================");
|
|
1717
|
+
dbprint(i_print,"// ");
|
|
1718
|
+
|
|
1719
|
+
ideal JJ=maxideal(1)*jacob(f);
|
|
1720
|
+
ideal kbase_versal=kbase(std(JJ));
|
|
1721
|
+
s=size(kbase_versal);
|
|
1722
|
+
ring @Pt=QQ,(t(1..s)),ds;
|
|
1723
|
+
def @Px=@Pt+old_ring;
|
|
1724
|
+
setring @Px;
|
|
1725
|
+
// basering has changed to @Px
|
|
1726
|
+
|
|
1727
|
+
poly F=imap(old_ring,f);
|
|
1728
|
+
ideal kbase_versal=imap(old_ring,kbase_versal);
|
|
1729
|
+
for (i=1; i<=s; i++)
|
|
1730
|
+
{
|
|
1731
|
+
F=F+var(i)*kbase_versal[i];
|
|
1732
|
+
}
|
|
1733
|
+
dbprint(i_print-1,F);
|
|
1734
|
+
dbprint(i_print-1,"");
|
|
1735
|
+
|
|
1736
|
+
|
|
1737
|
+
ideal ES_Id,ES_Id_all_triv;
|
|
1738
|
+
poly Ftriv=F;
|
|
1739
|
+
|
|
1740
|
+
dbprint(i_print,"// ");
|
|
1741
|
+
dbprint(i_print,"// Compute equisingularity Stratum over Spec(C[t]/t^2)");
|
|
1742
|
+
dbprint(i_print,"// ===================================================");
|
|
1743
|
+
dbprint(i_print,"// ");
|
|
1744
|
+
list M=esStratum(F,2);
|
|
1745
|
+
dbprint(i_print,"// finished");
|
|
1746
|
+
dbprint(i_print,"// ");
|
|
1747
|
+
|
|
1748
|
+
if (M[2]==1) // error occurred during esStratum computation
|
|
1749
|
+
{
|
|
1750
|
+
print("Some error has occurred during the computation");
|
|
1751
|
+
return(list(0,0));
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
if ( typeof(M[1])=="list" )
|
|
1755
|
+
{
|
|
1756
|
+
int defpars = nvars(basering)-2;
|
|
1757
|
+
poly Fred,Ftrivred;
|
|
1758
|
+
poly g;
|
|
1759
|
+
F=reduce(F,std(M[1][1]));
|
|
1760
|
+
Ftriv=reduce(Ftriv,std(M[1][2]));
|
|
1761
|
+
|
|
1762
|
+
for (i=1; i<=defpars; i++)
|
|
1763
|
+
{
|
|
1764
|
+
Fred=reduce(F,std(var(i)));
|
|
1765
|
+
Ftrivred=reduce(Ftriv,std(var(i)));
|
|
1766
|
+
|
|
1767
|
+
g=subst(F-Fred,var(i),1);
|
|
1768
|
+
ES_Id=ES_Id, g;
|
|
1769
|
+
F=Fred;
|
|
1770
|
+
|
|
1771
|
+
g=subst(Ftriv-Ftrivred,var(i),1);
|
|
1772
|
+
ES_Id_all_triv=ES_Id_all_triv, g;
|
|
1773
|
+
Ftriv=Ftrivred;
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
setring old_ring;
|
|
1777
|
+
// back to original ring
|
|
1778
|
+
|
|
1779
|
+
ideal ES_Id = imap(@Px,ES_Id);
|
|
1780
|
+
ES_Id = interred(ES_Id);
|
|
1781
|
+
|
|
1782
|
+
ideal ES_Id_all_triv = imap(@Px,ES_Id_all_triv);
|
|
1783
|
+
ES_Id_all_triv = interred(ES_Id_all_triv);
|
|
1784
|
+
|
|
1785
|
+
ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
|
|
1786
|
+
ES_Id = ES_Id, f, jacob(f);
|
|
1787
|
+
ES_Id_all_triv = ES_Id_all_triv, f, jacob(f);
|
|
1788
|
+
|
|
1789
|
+
if (typ==0)
|
|
1790
|
+
{
|
|
1791
|
+
return(list(ES_Id,ESfix_Id));
|
|
1792
|
+
}
|
|
1793
|
+
else
|
|
1794
|
+
{
|
|
1795
|
+
return(list(ES_Id,ESfix_Id,ES_Id_all_triv));
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
else
|
|
1799
|
+
{
|
|
1800
|
+
def AuxRing=M[1];
|
|
1801
|
+
|
|
1802
|
+
dbprint(i_print,"// ");
|
|
1803
|
+
dbprint(i_print,"// change ring to ESSring");
|
|
1804
|
+
|
|
1805
|
+
setring AuxRing; // contains p_F, ES
|
|
1806
|
+
|
|
1807
|
+
int defpars = nvars(basering)-2;
|
|
1808
|
+
poly Fred,Fredtriv;
|
|
1809
|
+
poly g;
|
|
1810
|
+
ideal ES_Id,ES_Id_all_triv;
|
|
1811
|
+
|
|
1812
|
+
poly p_Ftriv=p_F;
|
|
1813
|
+
|
|
1814
|
+
p_F=reduce(p_F,std(ES));
|
|
1815
|
+
p_Ftriv=reduce(p_Ftriv,std(ES_all_triv));
|
|
1816
|
+
for (i=1; i<=defpars; i++)
|
|
1817
|
+
{
|
|
1818
|
+
Fred=reduce(p_F,std(var(i)));
|
|
1819
|
+
Fredtriv=reduce(p_Ftriv,std(var(i)));
|
|
1820
|
+
|
|
1821
|
+
g=subst(p_F-Fred,var(i),1);
|
|
1822
|
+
ES_Id=ES_Id, g;
|
|
1823
|
+
p_F=Fred;
|
|
1824
|
+
|
|
1825
|
+
g=subst(p_Ftriv-Fredtriv,var(i),1);
|
|
1826
|
+
ES_Id_all_triv=ES_Id_all_triv, g;
|
|
1827
|
+
p_Ftriv=Fredtriv;
|
|
1828
|
+
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
dbprint(i_print,"// ");
|
|
1832
|
+
dbprint(i_print,"// back to the original ring");
|
|
1833
|
+
|
|
1834
|
+
setring old_ring;
|
|
1835
|
+
// back to original ring
|
|
1836
|
+
|
|
1837
|
+
ideal ES_Id = imap(AuxRing,ES_Id);
|
|
1838
|
+
ES_Id = interred(ES_Id);
|
|
1839
|
+
|
|
1840
|
+
ideal ES_Id_all_triv = imap(AuxRing,ES_Id_all_triv);
|
|
1841
|
+
ES_Id_all_triv = interred(ES_Id_all_triv);
|
|
1842
|
+
|
|
1843
|
+
kill @Px;
|
|
1844
|
+
kill AuxRing;
|
|
1845
|
+
|
|
1846
|
+
ideal ESfix_Id = ES_Id, f, maxideal(1)*jacob(f);
|
|
1847
|
+
ES_Id = ES_Id, f, jacob(f);
|
|
1848
|
+
ES_Id_all_triv = ES_Id_all_triv, f, jacob(f);
|
|
1849
|
+
dbprint(i_print,"// ");
|
|
1850
|
+
dbprint(i_print,"// equisingularity ideal is computed!");
|
|
1851
|
+
if (typ==0)
|
|
1852
|
+
{
|
|
1853
|
+
return(list(ES_Id,ESfix_Id));
|
|
1854
|
+
}
|
|
1855
|
+
else
|
|
1856
|
+
{
|
|
1857
|
+
return(list(ES_Id,ESfix_Id,ES_Id_all_triv));
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
example
|
|
1862
|
+
{
|
|
1863
|
+
"EXAMPLE:"; echo=2;
|
|
1864
|
+
ring r=0,(x,y),ds;
|
|
1865
|
+
poly f=x7+y7+(x-y)^2*x2y2;
|
|
1866
|
+
list K=esIdeal(f);
|
|
1867
|
+
option(redSB);
|
|
1868
|
+
// Wahl's equisingularity ideal:
|
|
1869
|
+
std(K[1]);
|
|
1870
|
+
|
|
1871
|
+
ring rr=0,(x,y),ds;
|
|
1872
|
+
poly f=x4+4x3y+6x2y2+4xy3+y4+2x2y15+4xy16+2y17+xy23+y24+y30+y31;
|
|
1873
|
+
list K=esIdeal(f);
|
|
1874
|
+
vdim(std(K[1]));
|
|
1875
|
+
// the latter should be equal to:
|
|
1876
|
+
tau_es(f);
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
1880
|
+
|
|
1881
|
+
proc esStratum (poly p_F, list #)
|
|
1882
|
+
"USAGE: esStratum(F[,m,L]); F poly, m int, L list
|
|
1883
|
+
ASSUME: F defines a deformation of a reduced bivariate polynomial f
|
|
1884
|
+
and the characteristic of the basering does not divide mult(f). @*
|
|
1885
|
+
If nv is the number of variables of the basering, then the first
|
|
1886
|
+
nv-2 variables are the deformation parameters. @*
|
|
1887
|
+
If the basering is a qring, ideal(basering) must only depend
|
|
1888
|
+
on the deformation parameters.
|
|
1889
|
+
COMPUTE: equations for the stratum of equisingular deformations with
|
|
1890
|
+
fixed (trivial) section.
|
|
1891
|
+
RETURN: list l: either consisting of a list and an integer, where
|
|
1892
|
+
@format
|
|
1893
|
+
l[1][1]=ideal defining the equisingularity stratum
|
|
1894
|
+
l[1][2]=ideal defining the part of the equisingularity stratum where all
|
|
1895
|
+
equimultiple sections through the non-nodes of the reduced total
|
|
1896
|
+
transform are trivial sections
|
|
1897
|
+
l[2]=1 if some error has occurred, l[2]=0 otherwise;
|
|
1898
|
+
@end format
|
|
1899
|
+
or consisting of a ring and an integer, where
|
|
1900
|
+
@format
|
|
1901
|
+
l[1]=ESSring is a ring extension of basering containing the ideal ES
|
|
1902
|
+
(describing the ES-stratum), the ideal ES_all_triv (describing the
|
|
1903
|
+
part with trivial equimultiple sections) and the polynomial p_F=F,
|
|
1904
|
+
l[2]=1 if some error has occurred, l[2]=0 otherwise.
|
|
1905
|
+
@end format
|
|
1906
|
+
NOTE: L is supposed to be the output of hnexpansion (with the given ordering
|
|
1907
|
+
of the variables appearing in f). @*
|
|
1908
|
+
If m is given, the ES Stratum over A/maxideal(m) is computed. @*
|
|
1909
|
+
This procedure uses @code{execute} or calls a procedure using
|
|
1910
|
+
@code{execute}.
|
|
1911
|
+
printlevel>=2 displays additional information.
|
|
1912
|
+
SEE ALSO: esIdeal, isEquising
|
|
1913
|
+
KEYWORDS: equisingularity stratum
|
|
1914
|
+
EXAMPLE: example esStratum; shows examples.
|
|
1915
|
+
"
|
|
1916
|
+
{
|
|
1917
|
+
list l=esComputation (0,p_F,#);
|
|
1918
|
+
return(l);
|
|
1919
|
+
}
|
|
1920
|
+
example
|
|
1921
|
+
{
|
|
1922
|
+
"EXAMPLE:"; echo=2;
|
|
1923
|
+
int p=printlevel;
|
|
1924
|
+
printlevel=1;
|
|
1925
|
+
ring r = 0,(a,b,c,d,e,f,g,x,y),ds;
|
|
1926
|
+
poly F = (x2+2xy+y2+x5)+ax+by+cx2+dxy+ey2+fx3+gx4;
|
|
1927
|
+
list M = esStratum(F);
|
|
1928
|
+
M[1][1];
|
|
1929
|
+
|
|
1930
|
+
printlevel=3; // displays additional information
|
|
1931
|
+
esStratum(F,2) ; // ES-stratum over Q[a,b,c,d,e,f,g] / <a,b,c,d,e,f,g>^2
|
|
1932
|
+
|
|
1933
|
+
ideal I = f-fa,e+b;
|
|
1934
|
+
qring q = std(I);
|
|
1935
|
+
poly F = imap(r,F);
|
|
1936
|
+
esStratum(F);
|
|
1937
|
+
printlevel=p;
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
1941
|
+
|
|
1942
|
+
proc isEquising (poly p_F, list #)
|
|
1943
|
+
"USAGE: isEquising(F[,m,L]); F poly, m int, L list
|
|
1944
|
+
ASSUME: F defines a deformation of a reduced bivariate polynomial f
|
|
1945
|
+
and the characteristic of the basering does not divide mult(f). @*
|
|
1946
|
+
If nv is the number of variables of the basering, then the first
|
|
1947
|
+
nv-2 variables are the deformation parameters. @*
|
|
1948
|
+
If the basering is a qring, ideal(basering) must only depend
|
|
1949
|
+
on the deformation parameters.
|
|
1950
|
+
COMPUTE: tests if the given family is equisingular along the trivial
|
|
1951
|
+
section.
|
|
1952
|
+
RETURN: int: 1 if the family is equisingular, 0 otherwise.
|
|
1953
|
+
NOTE: L is supposed to be the output of hnexpansion (with the given ordering
|
|
1954
|
+
of the variables appearing in f). @*
|
|
1955
|
+
If m is given, the family is considered over A/maxideal(m). @*
|
|
1956
|
+
This procedure uses @code{execute} or calls a procedure using
|
|
1957
|
+
@code{execute}.
|
|
1958
|
+
printlevel>=2 displays additional information.
|
|
1959
|
+
EXAMPLE: example isEquising; shows examples.
|
|
1960
|
+
"
|
|
1961
|
+
{
|
|
1962
|
+
int check=esComputation (1,p_F,#);
|
|
1963
|
+
return(check);
|
|
1964
|
+
}
|
|
1965
|
+
example
|
|
1966
|
+
{
|
|
1967
|
+
"EXAMPLE:"; echo=2;
|
|
1968
|
+
ring r = 0,(a,b,x,y),ds;
|
|
1969
|
+
poly F = (x2+2xy+y2+x5)+ay3+bx5;
|
|
1970
|
+
isEquising(F);
|
|
1971
|
+
ideal I = ideal(a);
|
|
1972
|
+
qring q = std(I);
|
|
1973
|
+
poly F = imap(r,F);
|
|
1974
|
+
isEquising(F);
|
|
1975
|
+
|
|
1976
|
+
ring rr=0,(A,B,C,x,y),ls;
|
|
1977
|
+
poly f=x7+y7+(x-y)^2*x2y2;
|
|
1978
|
+
poly F=f+A*y*diff(f,x)+B*x*diff(f,x);
|
|
1979
|
+
isEquising(F);
|
|
1980
|
+
isEquising(F,2); // computation over Q[a,b] / <a,b>^2
|
|
1981
|
+
}
|
|
1982
|
+
|
|
1983
|
+
|
|
1984
|
+
|
|
1985
|
+
/* Examples:
|
|
1986
|
+
|
|
1987
|
+
LIB "equising.lib";
|
|
1988
|
+
ring r = 0,(x,y),ds;
|
|
1989
|
+
poly p1 = y^2+x^3;
|
|
1990
|
+
poly p2 = p1^2+x5y;
|
|
1991
|
+
poly p3 = p2^2+x^10*p1;
|
|
1992
|
+
poly p=p3^2+x^20*p2;
|
|
1993
|
+
p;
|
|
1994
|
+
list L=versal(p);
|
|
1995
|
+
def Px=L[1];
|
|
1996
|
+
setring Px;
|
|
1997
|
+
poly F=Fs[1,1];
|
|
1998
|
+
int t=timer;
|
|
1999
|
+
list M=esStratum(F);
|
|
2000
|
+
timer-t; //-> 3
|
|
2001
|
+
|
|
2002
|
+
LIB "equising.lib";
|
|
2003
|
+
option(prot);
|
|
2004
|
+
printlevel=2;
|
|
2005
|
+
ring r=0,(x,y),ds;
|
|
2006
|
+
poly f=(x-yx+y2)^2-(y+x)^31;
|
|
2007
|
+
list L=versal(f);
|
|
2008
|
+
def Px=L[1];
|
|
2009
|
+
setring Px;
|
|
2010
|
+
poly F=Fs[1,1];
|
|
2011
|
+
int t=timer;
|
|
2012
|
+
list M=esStratum(F);
|
|
2013
|
+
timer-t; //-> 233
|
|
2014
|
+
|
|
2015
|
+
LIB "equising.lib";
|
|
2016
|
+
printlevel=2;
|
|
2017
|
+
option(prot);
|
|
2018
|
+
timer=1;
|
|
2019
|
+
ring r=0,(x,y),ls;
|
|
2020
|
+
poly f=(x4-y4)^2-x10;
|
|
2021
|
+
list L=versal(f);
|
|
2022
|
+
def Px=L[1];
|
|
2023
|
+
setring Px;
|
|
2024
|
+
poly F=Fs[1,1];
|
|
2025
|
+
int t=timer;
|
|
2026
|
+
list M=esStratum(F,3);
|
|
2027
|
+
timer-t; //-> 8
|
|
2028
|
+
|
|
2029
|
+
LIB "equising.lib";
|
|
2030
|
+
printlevel=2;
|
|
2031
|
+
timer=1;
|
|
2032
|
+
ring rr=0,(x,y),ls;
|
|
2033
|
+
poly f=x7+y7+(x-y)^2*x2y2;
|
|
2034
|
+
list K=esIdeal(f);
|
|
2035
|
+
// tau_es
|
|
2036
|
+
vdim(std(K[1])); //-> 22
|
|
2037
|
+
// tau_es_fix
|
|
2038
|
+
vdim(std(K[2])); //-> 24
|
|
2039
|
+
|
|
2040
|
+
LIB "equising.lib";
|
|
2041
|
+
printlevel=2;
|
|
2042
|
+
timer=1;
|
|
2043
|
+
ring rr=0,(x,y),ls;
|
|
2044
|
+
poly f=x7+y7+(x-y)^2*x2y2+x2y4; // Newton non-deg.
|
|
2045
|
+
list K=esIdeal(f);
|
|
2046
|
+
// tau_es
|
|
2047
|
+
vdim(std(K[1])); //-> 21
|
|
2048
|
+
// tau_es_fix
|
|
2049
|
+
vdim(std(K[2])); //-> 23
|
|
2050
|
+
|
|
2051
|
+
LIB "equising.lib";
|
|
2052
|
+
ring r=0,(w,v),ds;
|
|
2053
|
+
poly f=w2-v199;
|
|
2054
|
+
list L=hnexpansion(f);
|
|
2055
|
+
list LL=versal(f);
|
|
2056
|
+
def Px=LL[1];
|
|
2057
|
+
setring Px;
|
|
2058
|
+
list L=imap(r,L);
|
|
2059
|
+
poly F=Fs[1,1];
|
|
2060
|
+
list M=esStratum(F,2,L);
|
|
2061
|
+
|
|
2062
|
+
LIB "equising.lib";
|
|
2063
|
+
printlevel=2;
|
|
2064
|
+
timer=1;
|
|
2065
|
+
ring rr=0,(A,B,C,x,y),ls;
|
|
2066
|
+
poly f=x7+y7+(x-y)^2*x2y2;
|
|
2067
|
+
poly F=f+A*y*diff(f,x)+B*x*diff(f,x)+C*diff(f,y);
|
|
2068
|
+
list M=esStratum(F,6);
|
|
2069
|
+
std(M[1][1]); // standard basis of equisingularity ideal
|
|
2070
|
+
|
|
2071
|
+
LIB "equising.lib";
|
|
2072
|
+
printlevel=2;
|
|
2073
|
+
timer=1;
|
|
2074
|
+
ring rr=0,(x,y),ls;
|
|
2075
|
+
poly f=x20+y7+(x-y)^2*x2y2+x2y4; // Newton non-degenerate
|
|
2076
|
+
list K=esIdeal(f);
|
|
2077
|
+
K;
|
|
2078
|
+
|
|
2079
|
+
ring rr=0,(x,y),ls;
|
|
2080
|
+
poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
|
|
2081
|
+
list K=esIdeal(f);
|
|
2082
|
+
list L=versal(f);
|
|
2083
|
+
def Px=L[1];
|
|
2084
|
+
setring Px;
|
|
2085
|
+
poly F=Fs[1,1];
|
|
2086
|
+
list M=esStratum(F,2);
|
|
2087
|
+
|
|
2088
|
+
LIB "equising.lib";
|
|
2089
|
+
ring R=0,(A,B,C,D,x,y),ds;
|
|
2090
|
+
poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
|
|
2091
|
+
poly F=f+Ax9+Bx7y2+Cx9y+Dx8y2;
|
|
2092
|
+
list M=esStratum(F,2);
|
|
2093
|
+
|
|
2094
|
+
LIB "equising.lib";
|
|
2095
|
+
printlevel=2;
|
|
2096
|
+
ring rr=0,(x,y),ls;
|
|
2097
|
+
poly f=x6y-3x4y4-x4y5+3x2y7-x4y6+2x2y8-y10+2x2y9-y11+x2y10-y12-y13;
|
|
2098
|
+
list K=esIdeal(f);
|
|
2099
|
+
vdim(std(K[1])); //-> 51
|
|
2100
|
+
tau_es(f); //-> 51
|
|
2101
|
+
|
|
2102
|
+
printlevel=3;
|
|
2103
|
+
f=f*(y-x2)*(y2-x3)*(x-y5);
|
|
2104
|
+
int t=timer;
|
|
2105
|
+
list L=esIdeal(f);
|
|
2106
|
+
vdim(std(L[1])); //-> 99
|
|
2107
|
+
timer-t; //-> 42
|
|
2108
|
+
t=timer;
|
|
2109
|
+
tau_es(f); //-> 99
|
|
2110
|
+
timer-t; //-> 23
|
|
2111
|
+
|
|
2112
|
+
LIB "equising.lib";
|
|
2113
|
+
printlevel=3;
|
|
2114
|
+
ring rr=0,(x,y),ds;
|
|
2115
|
+
poly f=x4+4x3y+6x2y2+4xy3+y4+2x2y15+4xy16+2y17+xy23+y24+y30+y31;
|
|
2116
|
+
list K=esIdeal(f);
|
|
2117
|
+
vdim(std(K[1])); //-> 68
|
|
2118
|
+
tau_es(f); //-> 68
|
|
2119
|
+
|
|
2120
|
+
list L=versal(f);
|
|
2121
|
+
def Px=L[1];
|
|
2122
|
+
setring Px;
|
|
2123
|
+
poly F=Fs[1,1];
|
|
2124
|
+
list M=esStratum(F);
|
|
2125
|
+
timer-t; //-> 0
|
|
2126
|
+
|
|
2127
|
+
*/
|