passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passagemath-singular might be problematic. Click here for more details.

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