passagemath-singular 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl

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

Potentially problematic release.


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

Files changed (493) hide show
  1. PySingular.cpython-314-x86_64-linux-musl.so +0 -0
  2. passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
  3. passagemath_singular-10.6.31rc3.dist-info/RECORD +493 -0
  4. passagemath_singular-10.6.31rc3.dist-info/WHEEL +5 -0
  5. passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
  6. passagemath_singular.libs/libSingular-4-67059f19.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-30166d29.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-9d37bcf4.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-fd6f12fc.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgcc_s-0cd532bd.so.1 +0 -0
  11. passagemath_singular.libs/libgf2x-9e30c3e3.so.3.0.0 +0 -0
  12. passagemath_singular.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  13. passagemath_singular.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  14. passagemath_singular.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  15. passagemath_singular.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  16. passagemath_singular.libs/libncursesw-9c9e32c3.so.6.5 +0 -0
  17. passagemath_singular.libs/libntl-26885ca2.so.44.0.1 +0 -0
  18. passagemath_singular.libs/libomalloc-0-e9ff96db.9.6.so +0 -0
  19. passagemath_singular.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  20. passagemath_singular.libs/libpolys-4-8bcf8e7d.4.1.so +0 -0
  21. passagemath_singular.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  22. passagemath_singular.libs/libreadline-06542304.so.8.2 +0 -0
  23. passagemath_singular.libs/libsingular_resources-4-73bf7623.4.1.so +0 -0
  24. passagemath_singular.libs/libstdc++-5d72f927.so.6.0.33 +0 -0
  25. sage/algebras/all__sagemath_singular.py +3 -0
  26. sage/algebras/fusion_rings/all.py +19 -0
  27. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  28. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-x86_64-linux-musl.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  30. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  31. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-x86_64-linux-musl.so +0 -0
  32. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  33. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  34. sage/algebras/fusion_rings/fusion_double.py +899 -0
  35. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  36. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-x86_64-linux-musl.so +0 -0
  37. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  38. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  39. sage/algebras/fusion_rings/shm_managers.cpython-314-x86_64-linux-musl.so +0 -0
  40. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  41. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  42. sage/algebras/letterplace/all.py +1 -0
  43. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-x86_64-linux-musl.so +0 -0
  44. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  45. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  46. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-x86_64-linux-musl.so +0 -0
  47. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  48. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  49. sage/algebras/letterplace/letterplace_ideal.cpython-314-x86_64-linux-musl.so +0 -0
  50. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  51. sage/algebras/quatalg/all.py +2 -0
  52. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  53. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-x86_64-linux-musl.so +0 -0
  54. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  55. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  56. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  57. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  58. sage/all__sagemath_singular.py +11 -0
  59. sage/ext_data/all__sagemath_singular.py +1 -0
  60. sage/ext_data/singular/function_field/core.lib +98 -0
  61. sage/interfaces/all__sagemath_singular.py +1 -0
  62. sage/interfaces/singular.py +2835 -0
  63. sage/libs/all__sagemath_singular.py +1 -0
  64. sage/libs/singular/__init__.py +1 -0
  65. sage/libs/singular/decl.pxd +1168 -0
  66. sage/libs/singular/function.cpython-314-x86_64-linux-musl.so +0 -0
  67. sage/libs/singular/function.pxd +87 -0
  68. sage/libs/singular/function.pyx +1901 -0
  69. sage/libs/singular/function_factory.py +61 -0
  70. sage/libs/singular/groebner_strategy.cpython-314-x86_64-linux-musl.so +0 -0
  71. sage/libs/singular/groebner_strategy.pxd +22 -0
  72. sage/libs/singular/groebner_strategy.pyx +582 -0
  73. sage/libs/singular/option.cpython-314-x86_64-linux-musl.so +0 -0
  74. sage/libs/singular/option.pyx +671 -0
  75. sage/libs/singular/polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  76. sage/libs/singular/polynomial.pxd +39 -0
  77. sage/libs/singular/polynomial.pyx +661 -0
  78. sage/libs/singular/ring.cpython-314-x86_64-linux-musl.so +0 -0
  79. sage/libs/singular/ring.pxd +58 -0
  80. sage/libs/singular/ring.pyx +893 -0
  81. sage/libs/singular/singular.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/libs/singular/singular.pxd +72 -0
  83. sage/libs/singular/singular.pyx +1944 -0
  84. sage/libs/singular/standard_options.py +145 -0
  85. sage/matrix/all__sagemath_singular.py +1 -0
  86. sage/matrix/matrix_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  87. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  88. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  89. sage/rings/all__sagemath_singular.py +1 -0
  90. sage/rings/function_field/all__sagemath_singular.py +1 -0
  91. sage/rings/function_field/derivations_polymod.py +911 -0
  92. sage/rings/function_field/element_polymod.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/rings/function_field/element_polymod.pyx +406 -0
  94. sage/rings/function_field/function_field_polymod.py +2611 -0
  95. sage/rings/function_field/ideal_polymod.py +1775 -0
  96. sage/rings/function_field/order_polymod.py +1475 -0
  97. sage/rings/function_field/place_polymod.py +681 -0
  98. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  99. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-x86_64-linux-musl.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  101. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  102. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  104. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  105. sage/rings/polynomial/plural.cpython-314-x86_64-linux-musl.so +0 -0
  106. sage/rings/polynomial/plural.pxd +48 -0
  107. sage/rings/polynomial/plural.pyx +3171 -0
  108. sage/symbolic/all__sagemath_singular.py +1 -0
  109. sage/symbolic/comparison_impl.pxi +428 -0
  110. sage/symbolic/constants_c_impl.pxi +178 -0
  111. sage/symbolic/expression.cpython-314-x86_64-linux-musl.so +0 -0
  112. sage/symbolic/expression.pxd +7 -0
  113. sage/symbolic/expression.pyx +14200 -0
  114. sage/symbolic/getitem_impl.pxi +202 -0
  115. sage/symbolic/pynac.pxi +572 -0
  116. sage/symbolic/pynac_constant_impl.pxi +133 -0
  117. sage/symbolic/pynac_function_impl.pxi +206 -0
  118. sage/symbolic/pynac_impl.pxi +2576 -0
  119. sage/symbolic/pynac_wrap.h +124 -0
  120. sage/symbolic/series_impl.pxi +272 -0
  121. sage/symbolic/substitution_map_impl.pxi +94 -0
  122. sage_wheels/bin/ESingular +0 -0
  123. sage_wheels/bin/Singular +0 -0
  124. sage_wheels/bin/TSingular +0 -0
  125. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  126. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  127. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  128. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  129. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  130. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  131. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  132. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  133. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  134. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  135. sage_wheels/lib/singular/MOD/interval.la +41 -0
  136. sage_wheels/lib/singular/MOD/interval.so +0 -0
  137. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  138. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  139. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  140. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  146. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  147. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  148. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  149. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  150. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  151. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  152. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  153. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  154. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  155. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  156. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  157. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  158. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  159. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  160. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  161. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  162. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  163. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  164. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  165. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  166. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  167. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  168. sage_wheels/libexec/singular/MOD/surfex +16 -0
  169. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  170. sage_wheels/share/factory/gftables/10201 +342 -0
  171. sage_wheels/share/factory/gftables/1024 +37 -0
  172. sage_wheels/share/factory/gftables/10609 +356 -0
  173. sage_wheels/share/factory/gftables/11449 +384 -0
  174. sage_wheels/share/factory/gftables/11881 +398 -0
  175. sage_wheels/share/factory/gftables/121 +6 -0
  176. sage_wheels/share/factory/gftables/12167 +408 -0
  177. sage_wheels/share/factory/gftables/125 +7 -0
  178. sage_wheels/share/factory/gftables/12769 +428 -0
  179. sage_wheels/share/factory/gftables/128 +7 -0
  180. sage_wheels/share/factory/gftables/1331 +47 -0
  181. sage_wheels/share/factory/gftables/1369 +48 -0
  182. sage_wheels/share/factory/gftables/14641 +490 -0
  183. sage_wheels/share/factory/gftables/15625 +523 -0
  184. sage_wheels/share/factory/gftables/16 +3 -0
  185. sage_wheels/share/factory/gftables/16129 +540 -0
  186. sage_wheels/share/factory/gftables/16384 +549 -0
  187. sage_wheels/share/factory/gftables/16807 +563 -0
  188. sage_wheels/share/factory/gftables/1681 +58 -0
  189. sage_wheels/share/factory/gftables/169 +8 -0
  190. sage_wheels/share/factory/gftables/17161 +574 -0
  191. sage_wheels/share/factory/gftables/1849 +64 -0
  192. sage_wheels/share/factory/gftables/18769 +628 -0
  193. sage_wheels/share/factory/gftables/19321 +646 -0
  194. sage_wheels/share/factory/gftables/19683 +659 -0
  195. sage_wheels/share/factory/gftables/2048 +71 -0
  196. sage_wheels/share/factory/gftables/2187 +75 -0
  197. sage_wheels/share/factory/gftables/2197 +76 -0
  198. sage_wheels/share/factory/gftables/2209 +76 -0
  199. sage_wheels/share/factory/gftables/22201 +742 -0
  200. sage_wheels/share/factory/gftables/22801 +762 -0
  201. sage_wheels/share/factory/gftables/2401 +82 -0
  202. sage_wheels/share/factory/gftables/243 +11 -0
  203. sage_wheels/share/factory/gftables/24389 +815 -0
  204. sage_wheels/share/factory/gftables/24649 +824 -0
  205. sage_wheels/share/factory/gftables/25 +3 -0
  206. sage_wheels/share/factory/gftables/256 +11 -0
  207. sage_wheels/share/factory/gftables/26569 +888 -0
  208. sage_wheels/share/factory/gftables/27 +3 -0
  209. sage_wheels/share/factory/gftables/27889 +932 -0
  210. sage_wheels/share/factory/gftables/2809 +96 -0
  211. sage_wheels/share/factory/gftables/28561 +954 -0
  212. sage_wheels/share/factory/gftables/289 +12 -0
  213. sage_wheels/share/factory/gftables/29791 +995 -0
  214. sage_wheels/share/factory/gftables/29929 +1000 -0
  215. sage_wheels/share/factory/gftables/3125 +107 -0
  216. sage_wheels/share/factory/gftables/32 +4 -0
  217. sage_wheels/share/factory/gftables/32041 +1070 -0
  218. sage_wheels/share/factory/gftables/32761 +1094 -0
  219. sage_wheels/share/factory/gftables/32768 +1095 -0
  220. sage_wheels/share/factory/gftables/343 +14 -0
  221. sage_wheels/share/factory/gftables/3481 +118 -0
  222. sage_wheels/share/factory/gftables/361 +14 -0
  223. sage_wheels/share/factory/gftables/36481 +1218 -0
  224. sage_wheels/share/factory/gftables/3721 +126 -0
  225. sage_wheels/share/factory/gftables/37249 +1244 -0
  226. sage_wheels/share/factory/gftables/38809 +1296 -0
  227. sage_wheels/share/factory/gftables/39601 +1322 -0
  228. sage_wheels/share/factory/gftables/4 +3 -0
  229. sage_wheels/share/factory/gftables/4096 +139 -0
  230. sage_wheels/share/factory/gftables/44521 +1486 -0
  231. sage_wheels/share/factory/gftables/4489 +152 -0
  232. sage_wheels/share/factory/gftables/49 +4 -0
  233. sage_wheels/share/factory/gftables/4913 +166 -0
  234. sage_wheels/share/factory/gftables/49729 +1660 -0
  235. sage_wheels/share/factory/gftables/5041 +170 -0
  236. sage_wheels/share/factory/gftables/50653 +1691 -0
  237. sage_wheels/share/factory/gftables/512 +20 -0
  238. sage_wheels/share/factory/gftables/51529 +1720 -0
  239. sage_wheels/share/factory/gftables/52441 +1750 -0
  240. sage_wheels/share/factory/gftables/529 +20 -0
  241. sage_wheels/share/factory/gftables/5329 +180 -0
  242. sage_wheels/share/factory/gftables/54289 +1812 -0
  243. sage_wheels/share/factory/gftables/57121 +1906 -0
  244. sage_wheels/share/factory/gftables/58081 +1938 -0
  245. sage_wheels/share/factory/gftables/59049 +1971 -0
  246. sage_wheels/share/factory/gftables/6241 +210 -0
  247. sage_wheels/share/factory/gftables/625 +23 -0
  248. sage_wheels/share/factory/gftables/63001 +2102 -0
  249. sage_wheels/share/factory/gftables/64 +5 -0
  250. sage_wheels/share/factory/gftables/6561 +221 -0
  251. sage_wheels/share/factory/gftables/6859 +231 -0
  252. sage_wheels/share/factory/gftables/6889 +232 -0
  253. sage_wheels/share/factory/gftables/729 +27 -0
  254. sage_wheels/share/factory/gftables/7921 +266 -0
  255. sage_wheels/share/factory/gftables/8 +3 -0
  256. sage_wheels/share/factory/gftables/81 +5 -0
  257. sage_wheels/share/factory/gftables/8192 +276 -0
  258. sage_wheels/share/factory/gftables/841 +30 -0
  259. sage_wheels/share/factory/gftables/9 +3 -0
  260. sage_wheels/share/factory/gftables/9409 +316 -0
  261. sage_wheels/share/factory/gftables/961 +34 -0
  262. sage_wheels/share/info/singular.info +191898 -0
  263. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  264. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  265. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  266. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  267. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  268. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  269. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  270. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  271. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  272. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  273. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  274. sage_wheels/share/singular/LIB/all.lib +136 -0
  275. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  276. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  277. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  278. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  279. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  280. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  281. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  282. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  283. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  284. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  285. sage_wheels/share/singular/LIB/central.lib +2169 -0
  286. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  287. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  288. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  289. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  290. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  291. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  292. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  293. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  294. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  295. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  296. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  297. sage_wheels/share/singular/LIB/control.lib +1636 -0
  298. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  299. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  300. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  301. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  302. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  303. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  304. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  305. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  306. sage_wheels/share/singular/LIB/deform.lib +925 -0
  307. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  308. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  309. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  310. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  311. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  312. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  313. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  314. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  315. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  316. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  317. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  318. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  319. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  320. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  321. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  322. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  323. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  324. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  325. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  326. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  327. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  328. sage_wheels/share/singular/LIB/general.lib +1350 -0
  329. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  330. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  331. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  332. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  333. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  334. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  335. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  336. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  337. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  338. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  339. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  340. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  341. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  342. sage_wheels/share/singular/LIB/help.cnf +57 -0
  343. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  344. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  345. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  346. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  347. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  348. sage_wheels/share/singular/LIB/inout.lib +679 -0
  349. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  350. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  351. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  352. sage_wheels/share/singular/LIB/invar.lib +443 -0
  353. sage_wheels/share/singular/LIB/involut.lib +980 -0
  354. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  355. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  356. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  357. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  358. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  359. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  360. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  361. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  362. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  363. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  364. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  365. sage_wheels/share/singular/LIB/methods.lib +212 -0
  366. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  367. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  368. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  369. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  370. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  371. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  372. sage_wheels/share/singular/LIB/modular.lib +545 -0
  373. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  374. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  375. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  376. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  377. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  378. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  379. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  380. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  381. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  382. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  383. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  384. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  385. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  386. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  387. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  388. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  389. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  390. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  391. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  392. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  393. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  394. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  395. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  396. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  397. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  398. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  399. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  400. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  401. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  402. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  403. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  404. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  405. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  406. sage_wheels/share/singular/LIB/perron.lib +202 -0
  407. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  408. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  409. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  410. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  411. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  412. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  413. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  414. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  415. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  416. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  417. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  418. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  419. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  420. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  421. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  422. sage_wheels/share/singular/LIB/random.lib +455 -0
  423. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  424. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  425. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  426. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  427. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  428. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  429. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  430. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  431. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  432. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  433. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  434. sage_wheels/share/singular/LIB/resources.lib +170 -0
  435. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  436. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  437. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  438. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  439. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  440. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  441. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  442. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  443. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  444. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  445. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  446. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  447. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  448. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  449. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  450. sage_wheels/share/singular/LIB/sets.lib +524 -0
  451. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  452. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  453. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  454. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  455. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  456. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  457. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  458. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  459. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  460. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  461. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  462. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  463. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  464. sage_wheels/share/singular/LIB/surf.lib +506 -0
  465. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  466. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  467. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  468. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  469. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  470. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  471. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  472. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  473. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  474. sage_wheels/share/singular/LIB/template.lib +116 -0
  475. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  476. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  477. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  478. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  479. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  480. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  481. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  482. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  483. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  484. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  485. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  486. sage_wheels/share/singular/emacs/COPYING +44 -0
  487. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  488. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  489. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  490. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  491. sage_wheels/share/singular/emacs/singular.el +4273 -0
  492. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  493. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,1197 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ version="version triang.lib 4.4.1.0 Jan_2025 "; // $Id: 7431c9513a79ef867325d7feb1d5168f576910a4 $
3
+ category="Symbolic-numerical solving";
4
+ info="
5
+ LIBRARY: triang.lib Decompose Zero-dimensional Ideals into Triangular Sets
6
+ AUTHOR: D. Hillebrand
7
+
8
+ PROCEDURES:
9
+ triangL(G); Decomposition of (G) into triangular systems (Lazard).
10
+ triangLfak(G); Decomp. of (G) into tri. systems plus factorization.
11
+ triangM(G[,.]); Decomposition of (G) into triangular systems (Moeller).
12
+ triangMH(G[,.]); Decomp. of (G) into tri. syst. with disjoint varieties.
13
+ ";
14
+
15
+ LIB "general.lib"; // Muss geladen werden fuer den Befehl sort().
16
+ LIB "elim.lib"; // Muss geladen werden fuer sat().
17
+
18
+
19
+ ///////////////////////////////////////////////////////////////////////////////
20
+ //
21
+ // Der Lazard-Algorithmus
22
+ //
23
+ ///////////////////////////////////////////////////////////////////////////////
24
+
25
+ proc triangL (ideal G)
26
+ "USAGE: triangL(G); G=ideal
27
+ ASSUME: G is the reduced lexicographical Groebner basis of the
28
+ zero-dimensional ideal (G), sorted by increasing leading terms.
29
+ RETURN: a list of finitely many triangular systems, such that
30
+ the union of their varieties equals the variety of (G).
31
+ NOTE: Algorithm of Lazard (see: Lazard, D.: Solving zero-dimensional
32
+ algebraic systems, J. Symb. Comp. 13, 117 - 132, 1992).
33
+ EXAMPLE: example triangL; shows an example
34
+ "
35
+ {
36
+
37
+ // Test, ob G Groebnerbasis eines nulldimensionalen Ideals ist.
38
+ if (attrib(G,"isSB") <> 1)
39
+ {
40
+ G = groebner(G);
41
+ }
42
+ if (dim(G) <> 0)
43
+ {
44
+ ERROR("ideal is not zero-dimensional.");
45
+ }
46
+
47
+ if (size(G) <= 2) // schon Dreiecksbasis
48
+ {
49
+ return(list(G));
50
+ }
51
+
52
+ // Noetige Optionen setzen.
53
+ // obachman: save options so that they can be reset on exit
54
+ intvec ovec = option(get);
55
+ option(redSB);
56
+ option(returnSB);
57
+ list B; // Bearbeitungsliste
58
+ list F; // Ergebnisliste = Triangulierung
59
+ ideal T, T_neu;
60
+ poly p,p_neu,r,s,lt,lc,lcr;
61
+ list inv;
62
+ int u,v;
63
+ int l,h;
64
+ string st;
65
+
66
+ T = ideal(G[1]);
67
+ attrib(T,"isSB",1);
68
+ B = list(list(T,2));
69
+
70
+ while (size(B) > 0)
71
+ {
72
+ T = B[1][1];
73
+ h = B[1][2];
74
+ B = Listenrest(B);
75
+ p = G[h];
76
+ v = lvar(p);
77
+ lc = lcoef(p,v);
78
+ st=string(nvars(basering)-v+1);
79
+ dbprint(string(timer)+" S"+st+": invertiere Leitkoeffizient von G["+string(h)+"].");
80
+
81
+ // Invertiere den Leitkoeffizienten von G[h] bzgl. var(v) modulo (T).
82
+ inv = invertieren(lc,T);
83
+
84
+ dbprint(string(timer)+" S"+st+": Anzahl Dreiecksbasen: "+string(size(inv))+".");
85
+
86
+ while (size(inv) > 0)
87
+ {
88
+ r = inv[1][1];
89
+ s = inv[1][2];
90
+ T = inv[1][3];
91
+ inv = Listenrest(inv);
92
+ if (r == 0) // r == 0?, dann p nicht der ggt der Stufe,
93
+ {
94
+ dbprint(string(timer)+" S"+st+": Leitkoeffizient == 0.");
95
+ B = list(list(T,h+1)) + B;
96
+ }
97
+ else // ansonsten ggt der Stufe gefunden.
98
+ {
99
+ dbprint(string(timer)+" S"+st+": ggt gefunden.");
100
+ lt = var(v)**degv(p,v);
101
+ p_neu = cleardenom(s*lt + reduce(r*(p-lc*lt),T));
102
+ T_neu = T,p_neu;
103
+ attrib(T_neu,"isSB",1);
104
+
105
+ // Restlichen Polynome der gleichen Stufe uebergehen.
106
+ for (l = h+1; l <= size(G); l++)
107
+ {
108
+ u = lvar(G[l]);
109
+ if (u <> v) {break;}
110
+ }
111
+
112
+ // Durchsuche restliche Stufen nach trivialen ggt's.
113
+ while (l <= size(G))
114
+ {
115
+ lc = lcoef(G[l],u);
116
+ lcr = reduce(lc,T_neu);
117
+
118
+ while (lcr == 0) // Gehe bis zum ersten Polynom <> 0
119
+ { // modulo (T_neu).
120
+ l++;
121
+ lc = lcoef(G[l],u);
122
+ lcr = reduce(lc,T_neu);
123
+ }
124
+
125
+ if (deg(lcr) == 0) // Polynom <> 0 normiert?, dann
126
+ { // an Dreiecksbasis anhaengen,
127
+ dbprint(string(timer)+" S"+string(nvars(basering)-u+1)+": Schnellerkennung: ggt gefunden.");
128
+ lt = var(u)**degv(G[l],u);
129
+ p_neu = cleardenom(lcr*lt +
130
+ reduce(G[l]-lc*lt,T_neu));
131
+ T_neu = T_neu,p_neu;
132
+ attrib(T_neu,"isSB",1);
133
+ u = lvar(G[l]);
134
+ l++;
135
+ while (l <= size(G)) // Rest der Stufe uebergehen.
136
+ {
137
+ if (lvar(G[l]) <> u) {u = lvar(G[l]); break;}
138
+ l++;
139
+ }
140
+ }
141
+ else // sonst nicht normierte Polynome auf der Stufe.
142
+ {
143
+ break;
144
+ }
145
+ }
146
+ if (l > size(G)) // Ende von G erreicht, dann Dreiecks-
147
+ { // basis der Triangulierung gefunden,
148
+ dbprint(string(timer)+" S"+st+": Dreiecksbasis der Triangulierung gefunden.");
149
+ int ndup=1;
150
+ matrix mat_T_neu=matrix(T_neu);
151
+ for(int j=size(F);j>0;j--)
152
+ {
153
+ if(matrix(F[j])==mat_T_neu) { ndup=0;break;}
154
+ }
155
+ if (ndup)
156
+ {
157
+ F = F + list(T_neu);
158
+ }
159
+ kill ndup,j,mat_T_neu;
160
+ }
161
+ else // sonst T_neu,l erneut bearbeiten.
162
+ {
163
+ B = list(list(T_neu,l)) + B;
164
+ }
165
+ }
166
+ }
167
+ }
168
+ option(set, ovec);
169
+ return(F);
170
+ }
171
+ //-------------------------------- example ----------------------------------
172
+ example
173
+ { "EXAMPLE:"; echo = 2;
174
+ ring rC5 = 0,(e,d,c,b,a),lp;
175
+ triangL(stdfglm(cyclic(5)));
176
+ }
177
+
178
+ ///////////////////////////////////////////////////////////////////////////////
179
+
180
+ proc triangLfak (ideal G)
181
+ "USAGE: triangLfak(G); G=ideal
182
+ ASSUME: G is the reduced lexicographical Groebner basis of the
183
+ zero-dimensional ideal (G), sorted by increasing leading terms.
184
+ RETURN: a list of finitely many triangular systems, such that
185
+ the union of their varieties equals the variety of (G).
186
+ NOTE: Algorithm of Lazard with factorization (see: Lazard, D.: Solving
187
+ zero-dimensional algebraic systems, J. Symb. Comp. 13, 117 - 132, 1992).
188
+ REMARK: each polynomial of the triangular systems is factorized.
189
+ EXAMPLE: example triangLfak; shows an example
190
+ "
191
+ {
192
+ return(triangLbas(G,2));
193
+ }
194
+ //-------------------------------- example ----------------------------------
195
+ example
196
+ { "EXAMPLE:"; echo = 2;
197
+ ring rC5 = 0,(e,d,c,b,a),lp;
198
+ triangLfak(stdfglm(cyclic(5)));
199
+ }
200
+
201
+ ///////////////////////////////////////////////////////////////////////////////
202
+
203
+ static proc triangLbas (ideal G, list #)
204
+ "USAGE: triangLbas(G[,i]); G reduzierte lexikographische Groebnerbasis
205
+ des nulldimensionalen Ideals (G), nach
206
+ Leittermen aufsteigend sortiert,
207
+ i = 1 oder 2 (ohne Angabe i = 1).
208
+ RETURN: Triangulierung von (G).
209
+ Ist i == 2, dann wird jedes Polynom der Dreiecksbasen
210
+ der Triangulierung zusaetzlich faktorisiert.
211
+ NOTE: Algorithmus von Lazard (siehe: Lazard, D.: Solving
212
+ zero-dimensional algebraic systems,
213
+ J. Symb. Comp., Bd. 13, S. 117 - 132, 1992).
214
+ "
215
+ {
216
+
217
+ // Test, ob G Groebnerbasis eines nulldimensionalen Ideals ist.
218
+ if (attrib(G,"isSB") <> 1)
219
+ {
220
+ G = groebner(G);
221
+ }
222
+ if (dim(G) <> 0)
223
+ {
224
+ ERROR("ideal is not zero-dimensional.");
225
+ }
226
+
227
+ // Noetige Optionen setzen.
228
+ // obachman: save options so that they can be reset on exit
229
+ intvec ovec = option(get);
230
+ option(redSB);
231
+ option(returnSB);
232
+ // Faktorisierungsschalter setzen.
233
+ int fak;
234
+ if (size(#) > 0 && typeof(#[1]) == "int")
235
+ {
236
+ if (#[1] == 2) {fak = 1;}
237
+ }
238
+
239
+ if (size(G) <= 2) // schon Dreiecksbasis
240
+ {
241
+ list E;
242
+ if (fak)
243
+ {
244
+ E = faktorisiere_DB(G);
245
+ }
246
+ else
247
+ {
248
+ E = list(G);
249
+ }
250
+ option(set, ovec);
251
+ return(E);
252
+ }
253
+
254
+ list B; // Bearbeitungsliste
255
+ list F; // Ergebnisliste = Triangulierung
256
+ list T_neu;
257
+ ideal T;
258
+ poly p,p_neu,r,s,lt,lc;
259
+ list inv;
260
+ int v;
261
+ int l,h;
262
+ string st;
263
+
264
+ // B initialisieren
265
+ if (fak)
266
+ {
267
+ B = H_anhaengen(faktorisiere_letzten(G[1]),2);
268
+ }
269
+ else
270
+ {
271
+ T = ideal(G[1]);
272
+ attrib(T,"isSB",1);
273
+ B = list(list(T,2));
274
+ }
275
+
276
+ while (size(B) > 0)
277
+ {
278
+ T = B[1][1];
279
+ h = B[1][2];
280
+ B = Listenrest(B);
281
+ p = G[h];
282
+ v = lvar(p);
283
+ lc = lcoef(p,v);
284
+ st=string(nvars(basering)-v+1);
285
+ dbprint(string(timer)+" S"+st+": invertiere Leitkoeffizient von G["+string(h)+"].");
286
+
287
+ // invertiere den Leitkoeffizienten von G[h] bzgl. var(v) modulo (T).
288
+ inv = invertieren(lc,T);
289
+ dbprint(string(timer)+" S"+st+": Anzahl Dreiecksbasen: "+string(size(inv))+".");
290
+
291
+ while (size(inv) > 0)
292
+ {
293
+ r = inv[1][1];
294
+ s = inv[1][2];
295
+ T = inv[1][3];
296
+ inv = Listenrest(inv);
297
+ if (r == 0) // r == 0?, dann p nicht der ggt der Stufe,
298
+ {
299
+ dbprint(string(timer)+" S"+st+": Leitkoeffizient == 0.");
300
+ B = list(list(T,h+1)) + B;
301
+ }
302
+ else // ansonsten ggt der Stufe gefunden.
303
+ {
304
+ dbprint(string(timer)+" S"+st+": ggt gefunden.");
305
+ lt = var(v)**degv(p,v);
306
+ p_neu = cleardenom(s*lt + reduce(r*(p-lc*lt),T));
307
+ if (fak)
308
+ {
309
+ T_neu = faktorisiere_letzten(list(T + p_neu));
310
+ }
311
+ else
312
+ {
313
+ T_neu = list(T + p_neu);
314
+ }
315
+
316
+ // Restlichen Polynome der gleichen Stufe uebergehen.
317
+ for (l = h+1; l <= size(G); l++)
318
+ {
319
+ if (lvar(G[l]) <> v) {break;}
320
+ }
321
+
322
+ if (l > size(G)) // Ende von G erreicht, dann Dreiecks-
323
+ { // basis der Triangulierung gefunden,
324
+ dbprint(string(timer)+" S"+st+": Dreiecksbasis der Triangulierung gefunden.");
325
+ F = F + T_neu;
326
+ }
327
+ else // sonst T_neu,l erneut bearbeiten.
328
+ {
329
+ B = H_anhaengen(T_neu,l) + B;
330
+ }
331
+ }
332
+ }
333
+ }
334
+ option(set, ovec);
335
+ return(F);
336
+ }
337
+
338
+ ///////////////////////////////////////////////////////////////////////////////
339
+
340
+ static proc invertieren (poly p, ideal T)
341
+ "USAGE: invertieren(p,T); p Polynom, T reduzierte Dreiecksbasis.
342
+ RETURN: Liste von Tripeln (Listen) bestehend aus einem Polynom ri,
343
+ einem Element aus dem Grundring si, und einer
344
+ reduzierten Dreiecksbasis Ti, i = 1,...,m, so dass
345
+ [T1,...,Tm] eine Triangulierung von T ist und
346
+ p = 0 mod (Ti) falls ri = 0, ansonsten
347
+ ri*p = si mod (Ti) fuer i = 1,...,m.
348
+ "
349
+ {
350
+ // Triviale Faelle vorweg behandeln.
351
+ p = reduce(p,T);
352
+ if (p == 0) {return(list(list(0,0,T)));}
353
+ if (deg(p) == 0) {return(list(list(1,p,T)));}
354
+
355
+ list inv;
356
+ int zerlegt; // zerlegt ist Schalter dafuer, ob T zerlegt wurde,
357
+ export zerlegt; // einzige globale Variable.
358
+ list toSee = list(list(p,T)); // zu bearbeitende Paare
359
+ list toSave; // Ergebnisliste
360
+ poly pr;
361
+
362
+ while (size(toSee) > 0)
363
+ {
364
+ zerlegt = 0; // zerlegt = FALSE
365
+ p = toSee[1][1];
366
+ T = toSee[1][2];
367
+ toSee = Listenrest(toSee);
368
+
369
+ // invertieren_oT aufrufen, um p+(T) zu invertieren.
370
+ inv = invertieren_oT(p,T);
371
+
372
+ if (zerlegt) // T zerlegt?, dann pro neuer Dreiecksbasis
373
+ { // weiteruntersuchen,
374
+ pr = reduce(p,inv[1]);
375
+ if (pr == 0) // es sei denn p ist reduziert gleich 0,
376
+ {
377
+ toSave = list(list(0,0,inv[1])) + toSave;
378
+ attrib(toSave[1][3],"isSB",1);
379
+ }
380
+ else
381
+ {
382
+ toSee = list(list(pr,inv[1])) + toSee;
383
+ attrib(toSee[1][2],"isSB",1);
384
+ }
385
+ pr = reduce(p,inv[2]);
386
+ if (pr == 0)
387
+ {
388
+ toSave = list(list(0,0,inv[2])) + toSave;
389
+ attrib(toSave[1][3],"isSB",1);
390
+ }
391
+ else
392
+ {
393
+ toSee = list(list(pr,inv[2])) + toSee;
394
+ attrib(toSee[1][2],"isSB",1);
395
+ }
396
+ }
397
+ else // ansonsten Quasi-Inverses gefunden.
398
+ {
399
+ toSave = list(list(inv[1],inv[2],T)) + toSave;
400
+ attrib(toSave[1][3],"isSB",1);
401
+ }
402
+ }
403
+ kill zerlegt;
404
+ return(toSave);
405
+ }
406
+
407
+ ///////////////////////////////////////////////////////////////////////////////
408
+
409
+ static proc invertieren_oT (poly p, ideal T)
410
+ "USAGE: invertieren_oT(p,T); T reduzierte Dreiecksbasis,
411
+ p <> 0 Polynom, irreduzibel modulo (T).
412
+ RETURN: Entweder ein Quasi-Inverses (r,s) von p modulo (T), d.h.
413
+ r*p = s mod (T) und s im Grundring,
414
+ oder eine Triangulierung [T1,T2] von T
415
+ mit (Ti) <> (T) fuer i = 1,2.
416
+ "
417
+ {
418
+ // Quasi-Inverses von Konstante klar.
419
+ if (deg(p) == 0) {return(list(1,p));}
420
+
421
+ ideal T_bis_k,T1,T2;
422
+ poly g,a,b;
423
+ list rq;
424
+ list gab;
425
+ int i;
426
+ int v = lvar(p);
427
+ int k = nvars(basering)-v+1;
428
+
429
+ // Zu p passende Dreiecksbasis auswaehlen.
430
+ if (k == 1)
431
+ {
432
+ T_bis_k = 0;
433
+ }
434
+ else
435
+ {
436
+ T_bis_k = T[1..(k-1)];
437
+ }
438
+ attrib(T_bis_k,"isSB",1);
439
+
440
+ // Um p+(T) zu invertieren, erw. eukl. Algorithmus anwenden.
441
+ gab = Erw_ggt_oT(T[k],p,v,T_bis_k);
442
+
443
+ // Entweder Triangulierung von T_bis_k erhalten,
444
+ if (zerlegt)
445
+ {
446
+ // T[k..size(T)] an gab[i] anhaengen und reduzieren.
447
+ T1 = gab[1];
448
+ T2 = gab[2];
449
+ for (i = k; i <= size(T); i++)
450
+ {
451
+ T1 = T1 + cleardenom(reduce(T[i],T1));
452
+ T2 = T2 + cleardenom(reduce(T[i],T2));
453
+ attrib(T1,"isSB",1);
454
+ attrib(T2,"isSB",1);
455
+ }
456
+ return(list(T1,T2));
457
+ }
458
+
459
+ // ansonsten gilt: a*T[k] + b*p = g mod (T_bis_k)
460
+ g = gab[1];
461
+ a = gab[2];
462
+ b = gab[3];
463
+
464
+ if (degv(g,v) > 0) // Entweder echten Teiler von T[k] gefunden,
465
+ { // dann splitte T,
466
+ rq = pdiv(T[k],g,v);
467
+
468
+ T1 = T_bis_k;
469
+ T1[k] = cleardenom(reduce(g,T1));
470
+ attrib(T1,"isSB",1);
471
+ T2 = T_bis_k;
472
+ T2[k] = cleardenom(reduce(rq[2],T2));
473
+ attrib(T2,"isSB",1);
474
+
475
+ // T[k..size(T)] an T1, T2 anhaengen und reduzieren.
476
+ for (i = k + 1; i <= size(T); i++)
477
+ {
478
+ T1 = T1 + cleardenom(reduce(T[i],T1));
479
+ T2 = T2 + cleardenom(reduce(T[i],T2));
480
+ attrib(T1,"isSB",1);
481
+ attrib(T2,"isSB",1);
482
+ }
483
+
484
+ // zerlegt = TRUE, hier ist einzige Stelle, wo T zerlegt wird.
485
+ zerlegt = 1;
486
+ return(list(T1,T2));
487
+ }
488
+ else // ansonsten Quasi-Inverses gefunden.
489
+ {
490
+ return(list(b,g));
491
+ }
492
+ }
493
+
494
+ ///////////////////////////////////////////////////////////////////////////////
495
+
496
+ static proc Erw_ggt_oT (poly f, poly g, int v, ideal T)
497
+ "USAGE: Erw_ggt_oT(f,g,v,T); f,g Polynome in var(v), f > g,
498
+ T Dreiecksbasis mit groesster
499
+ Variable var(v+1).
500
+ RETURN: Liste aus drei Polynomen d,a,b, wobei
501
+ a * f + b * g = d mod (T) und
502
+ (d + (T)) = ((f + (T), g + (T)).
503
+ NOTE: Dies ist der erweiterte euklidische Algorithmus im Polynom-
504
+ ring ueber dem Restklassenring modulo (T) in der Unbestimmten
505
+ var(v). Zusaetzlich wird jeweils der Dividend so normiert,
506
+ dass der Leitkoeffizient bzgl. var(v) im Grundring ist
507
+ und die Leikoeffizienten werden durch Anwendung der
508
+ Subresultant-remainder-sequence Variante des euklidischen
509
+ Algorithmus moeglichst klein gehalten.
510
+ "
511
+ {
512
+ // Initialisierung fuer erw. eukl. Algorithmus.
513
+ poly p1 = f;
514
+ poly p2 = g;
515
+ poly a1 = 1;
516
+ poly a2 = 0;
517
+ poly b1 = 0;
518
+ poly b2 = 1;
519
+
520
+ // Normierung des Dividenden.
521
+ list pab = normieren_oT(p2,a2,b2,v,T);
522
+ if (zerlegt) {return(pab);}
523
+ p2 = pab[1]; a2 = pab[2]; b2 = pab[3];
524
+
525
+ poly p3,a3,b3,q; // Hilfspolynome
526
+ list rq; // Rueckgabelisten der Fkten pdiv und normieren_oT
527
+ vector clden;
528
+
529
+ // Variablen fuer Subresultanten-Variante initialisieren.
530
+ int delta = degv(p1,v)-degv(p2,v);
531
+ number alpha;
532
+ number beta = (-1)**(delta + 1);
533
+ number psi = -1;
534
+ number m;
535
+
536
+ // Pseudodivision
537
+ rq = pdiv(p1,p2,v);
538
+ q = rq[2];
539
+ p3 = reduce(rq[1],T);
540
+
541
+ while (p3 <> 0) // Hauptschleife des eukl. Algorithmus.
542
+ {
543
+ alpha = number(lcoef(p2,v)); // return von lcoef ist type poly
544
+ m = alpha**(delta + 1); //m*p1 = q*p2 + p3 mod (T)
545
+ p3 = p3 / beta; //m*p1 = q*p2 + beta * p3 mod (T)
546
+
547
+ // a und b anpassen.
548
+ q = reduce(q,T);
549
+ a3 = reduce(m*a1 - q*a2,T);
550
+ b3 = reduce(m*b1 - q*b2,T);
551
+ a3 = a3 / beta;
552
+ b3 = b3 / beta;
553
+
554
+ // Variablen tauschen.
555
+ p1 = p2;
556
+ p2 = p3;
557
+ a1 = a2;
558
+ a2 = a3;
559
+ b1 = b2;
560
+ b2 = b3;
561
+
562
+ // Normierung des Dividenden.
563
+ pab = normieren_oT(p2,a2,b2,v,T);
564
+ if (zerlegt) {return(pab);}
565
+ p2 = pab[1]; a2 = pab[2]; b2 = pab[3];
566
+
567
+ if (degv(p2,v) > 0) // Dividend aus Grundring?, dann
568
+ { // Subresultanten-Variabeln anpassen
569
+ if (delta > 0)
570
+ {
571
+ psi = ((-alpha)**delta) / (psi**(delta-1));
572
+ }
573
+ delta = degv(p1,v)-degv(p2,v);
574
+ beta = (-alpha) * (psi**delta);
575
+
576
+ rq = pdiv(p1,p2,v); // und Pseudodivision,
577
+ q = rq[2];
578
+ p3 = reduce(rq[1], T);
579
+ }
580
+ else // ansonsten Ende.
581
+ {
582
+ p3 = 0;
583
+ }
584
+ }
585
+
586
+ // Gemeinsame Teiler herausdividieren.
587
+ clden = cleardenom([p2,a2,b2]);
588
+ return(list(clden[1],clden[2],clden[3]));
589
+ }
590
+
591
+ ///////////////////////////////////////////////////////////////////////////////
592
+
593
+ static proc normieren_oT (poly p, poly a, poly b, int v, ideal T)
594
+ "USAGE: normieren_oT(p,a,b,v,T); p,a,b Polynome in var(v),
595
+ T Dreiecksbasis.
596
+ RETURN: Entweder Triangulierung [T1,T2] von (T) oder
597
+ Liste,wobei [1] = reduce(r*p,T),
598
+ [2] = reduce(r*a,T),
599
+ [3] = reduce(r*b,T),
600
+ und reduce(r*lcoef(p,v),T) ist im Grundring.
601
+ "
602
+ {
603
+ poly lc = lcoef(p,v);
604
+ if (deg(lc) == 0) {return(list(p,a,b));} // lc im Grundring
605
+ lc = cleardenom(lc);
606
+
607
+ // invertieren_oT aufrufen, um lc+(T) zu invertieren.
608
+ list inv = invertieren_oT(lc,T);
609
+ if (zerlegt) {return(inv);}
610
+
611
+ // ansonsten Polynom zurueck gekommen.
612
+ p = reduce(inv[1] * p,T);
613
+ a = reduce(inv[1] * a,T);
614
+ b = reduce(inv[1] * b,T);
615
+ return(list(p,a,b));
616
+ }
617
+
618
+
619
+ ///////////////////////////////////////////////////////////////////////////////
620
+ //
621
+ // Der Moeller-Algorithmus
622
+ //
623
+ ///////////////////////////////////////////////////////////////////////////////
624
+
625
+ proc triangM (ideal G, list #)
626
+ "USAGE: triangM(G[,i]); G=ideal, i=integer,@*
627
+ ASSUME: G is the reduced lexicographical Groebner basis of the
628
+ zero-dimensional ideal (G), sorted by increasing leading terms.
629
+ RETURN: a list of finitely many triangular systems, such that
630
+ the union of their varieties equals the variety of (G).
631
+ If i = 2, then each polynomial of the triangular systems
632
+ is factorized.
633
+ NOTE: Algorithm of Moeller (see: Moeller, H.M.: On decomposing systems of
634
+ polynomial equations with finitely many solutions, Appl. Algebra Eng.
635
+ Commun. Comput. 4, 217 - 230, 1993).
636
+ EXAMPLE: example triangM; shows an example
637
+ "
638
+ {
639
+ // Test, ob G Groebnerbasis ist.
640
+ if (attrib(G,"isSB") <> 1)
641
+ {
642
+ G = groebner(G);
643
+ }
644
+
645
+ // Faktorisierungsschalter setzen.
646
+ int fak;
647
+ if (size(#) > 0 && typeof(#[1]) == "int")
648
+ {
649
+ if (#[1] == 2) {fak = 1;}
650
+ }
651
+
652
+ // Noetige Optionen setzen.
653
+ // obachman: save options so that they can be reset on exit
654
+ intvec ovec = option(get);
655
+ option(redSB);
656
+ option(returnSB);
657
+
658
+ list F,Fh; // Ergebnislisten
659
+ int nG = size(G);
660
+ if (nG <= 2) // G schon Dreiecksbasis?
661
+ {
662
+ if (fak)
663
+ {
664
+ F = faktorisiere_DB(G);
665
+ }
666
+ else
667
+ {
668
+ F = list(G);
669
+ }
670
+ option(set, ovec);
671
+ return(F);
672
+ }
673
+
674
+ int u = lvar(G[nG-1]);
675
+ int v = lvar(G[nG]);
676
+ int m = nG;
677
+ int l;
678
+ ideal lc,G1,G2,H;
679
+ poly lcr;
680
+ int i,j,k;
681
+ string s = string(nvars(basering)-v+1); // fuer Protokoll
682
+
683
+ // Oberes Dreieckssytem abschneiden.
684
+ while(u <> v)
685
+ {
686
+ m = m-1;
687
+ if (m == 2) // G ist bereits Dreiecksbasis.
688
+ {
689
+ if (fak)
690
+ {
691
+ F = faktorisiere_DB(G);
692
+ }
693
+ else
694
+ {
695
+ F = list(G);
696
+ }
697
+ option(set, ovec);
698
+ return (F);
699
+ }
700
+ v = u;
701
+ u = lvar(G[m-1]);
702
+ }
703
+
704
+ // Leitkoeffizienten der Polynome bzgl. var(u) bestimmen.
705
+ l = m-1;
706
+ while(u == v)
707
+ {
708
+ lc = lc + lcoef(G[l],u);
709
+ l = l - 1;
710
+ u = lvar(G[l]);
711
+ }
712
+
713
+ // Erster Teil des Splitts.
714
+ G1 = sort_red(ideal(G[1..l]) + lc); // Sortiere und reduziere GB.
715
+
716
+ s = string(nvars(basering)-v+1);
717
+ dbprint(string(timer)+" S"+s+": Erster Teil des Splitts.");
718
+
719
+ // Rekursiver Aufruf, um G1 zu triangulieren.
720
+ F = triangM(G1,#);
721
+
722
+ dbprint(string(timer)+" S"+s+": Oberes Dreieckssystem anhaengen.");
723
+
724
+ // Oberes Dreieckssystem an jede berechnete Dreiecksbasis anhaengen.
725
+ for (j = m; j <= nG; j++) // meist nur j = m = nG
726
+ {
727
+ for (i = 1; i <= size(F); i++)
728
+ {
729
+ F[i] = F[i] + cleardenom(G[j][1] + reduce(G[j]-G[j][1],F[i]));
730
+ attrib(F[i],"isSB",1);
731
+ }
732
+ if (fak)
733
+ {
734
+ F = faktorisiere_letzten(F);
735
+ }
736
+ }
737
+
738
+ dbprint(string(timer)+" S"+s+": Zweiter Teil des Splitts, "+string(m-l-1)+" Leitkoeffizient(en).");
739
+
740
+ // Zweiten Teil des Splitts berechnen.
741
+ H = ideal(G[1..m]);
742
+ attrib(H,"isSB",1);
743
+
744
+ for (k = m-l-1; k >= 1; k--) // Leitkoeffizientenliste durchgehen,
745
+ { // angefangen mit lc des kleinsten Polynoms.
746
+ lcr = reduce(lc[k],H);
747
+ if (lcr <> 0) // d.h. (H):lcr <> (1)
748
+ {
749
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Berechnung Idealquotient.");
750
+ G2 = quotient(H,lcr); // Wg. Option returnSB schon Standardbasis.
751
+ attrib(G2,"isSB",1);
752
+
753
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Rekursiver Aufruf.");
754
+ // Rekursiver Aufruf, um G2 zu triangulieren.
755
+ Fh = triangM(G2,#);
756
+
757
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Oberes Dreieckssystem, falls vorhanden, anhaengen.");
758
+ // Oberes Dreieckssystem, falls vorhanden,
759
+ // an jede berechnete Dreiecksbasis anhaengen.
760
+ for (j = m + 1; j <= nG; j++)
761
+ {
762
+ for (i = 1; i <= size(Fh); i++)
763
+ {
764
+ Fh[i] = Fh[i] + cleardenom(G[j][1] +
765
+ reduce(G[j]-G[j][1],Fh[i]));
766
+ attrib(Fh[i],"isSB",1);
767
+ }
768
+ if (fak)
769
+ {
770
+ Fh = faktorisiere_letzten(Fh);
771
+ }
772
+ }
773
+ F = F + Fh;
774
+ if (k > 1)
775
+ {
776
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Lex. GB von (H + lc) berechnen, naechsten lc reduzieren.");
777
+ H = std(H, lcr); // Wg. reduce(...,H) oben notwendig.
778
+ }
779
+ }
780
+ else
781
+ {
782
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Leere Varietaet.");
783
+ }
784
+ }
785
+
786
+ // Singular loescht die Attribute beim Listenverketten, deswegen neu setzen.
787
+ for (i = 1; i <= size(F); i++)
788
+ {
789
+ attrib(F[i],"isSB",1);
790
+ }
791
+ option(set, ovec);
792
+ return(F);
793
+ }
794
+ //-------------------------------- example----------------------------------
795
+ example
796
+ { "EXAMPLE:"; echo = 2;
797
+ ring rC5 = 0,(e,d,c,b,a),lp;
798
+ triangM(stdfglm(cyclic(5))); //oder: triangM(stdfglm(cyclic(5)),2);
799
+ }
800
+
801
+ ///////////////////////////////////////////////////////////////////////////////
802
+
803
+ proc triangMH (ideal G, list #)
804
+ "USAGE: triangMH(G[,i]); G=ideal, i=integer
805
+ ASSUME: G is the reduced lexicographical Groebner basis of the
806
+ zero-dimensional ideal (G), sorted by increasing leading terms.
807
+ RETURN: a list of finitely many triangular systems, such that
808
+ the disjoint union of their varieties equals the variety of (G).
809
+ If i = 2, then each polynomial of the triangular systems is factorized.
810
+ NOTE: Algorithm of Moeller and Hillebrand (see: Moeller, H.M.:
811
+ On decomposing systems of polynomial equations with finitely many
812
+ solutions, Appl. Algebra Eng. Commun. Comput. 4, 217 - 230, 1993 and
813
+ Hillebrand, D.: Triangulierung nulldimensionaler Ideale -
814
+ Implementierung und Vergleich zweier Algorithmen, master thesis,
815
+ Universitaet Dortmund, Fachbereich Mathematik, Prof. Dr. H.M. Moeller,
816
+ 1999).
817
+ EXAMPLE: example triangMH; shows an example
818
+ "
819
+ {
820
+ // Test, ob G Groebnerbasis ist.
821
+ if (attrib(G,"isSB") <> 1)
822
+ {
823
+ G = groebner(G);
824
+ }
825
+ if(npars(basering)<>0)
826
+ {
827
+ "Warning: factorization may fail";
828
+ }
829
+ // Faktorisierungsschalter setzen.
830
+ int fak;
831
+ if (size(#) > 0 && typeof(#[1]) == "int")
832
+ {
833
+ if (#[1] == 2) {fak = 1;}
834
+ }
835
+
836
+ // Noetige Optionen setzen.
837
+ // obachman: save options so that they can be reset on exit
838
+ intvec ovec = option(get);
839
+ option(redSB);
840
+ option(redTail);
841
+ option(returnSB);
842
+
843
+ list F,Fh; // Ergebnislisten
844
+ int nG = size(G);
845
+ if (nG <= 2) // G schon Dreiecksbasis?
846
+ {
847
+ if (fak)
848
+ {
849
+ F = faktorisiere_DB(G);
850
+ }
851
+ else
852
+ {
853
+ F = list(G);
854
+ }
855
+ option(set, ovec);
856
+ return(F);
857
+ }
858
+
859
+ int u = lvar(G[nG-1]);
860
+ int v = lvar(G[nG]);
861
+ int m = nG;
862
+ int l;
863
+ poly lcr;
864
+ ideal lc,G1,G2,H;
865
+ int i,j,k;
866
+ string s = string(nvars(basering)-v+1); // fuer Protokoll
867
+
868
+ // Oberes Dreieckssytem abschneiden.
869
+ while(u <> v)
870
+ {
871
+ m = m-1;
872
+ if (m == 2) // G ist Dreiecksbasis.
873
+ {
874
+ if (fak)
875
+ {
876
+ F = faktorisiere_DB(G);
877
+ }
878
+ else
879
+ {
880
+ F = list(G);
881
+ }
882
+ option(set, ovec);
883
+ return(F);
884
+ }
885
+ v = u;
886
+ u = lvar(G[m-1]);
887
+ }
888
+
889
+ // Leitkoeffizienten der Polynome bzgl. var(u) bestimmen.
890
+ l = m-1;
891
+ while(u == v)
892
+ {
893
+ lc = lc + lcoef(G[l],u);
894
+ l = l - 1;
895
+ u = lvar(G[l]);
896
+ }
897
+
898
+ // Erster Teil des Splitts.
899
+ G1 = sort_red(ideal(G[1..l]) + lc); // Sortiere und reduziere GB.
900
+
901
+ s = string(nvars(basering)-v+1);
902
+ dbprint(string(timer)+" S"+s+": Erster Teil des Splitts.");
903
+
904
+ // Rekursiver Aufruf, um G1 zu triangulieren.
905
+ F = triangMH(G1,#);
906
+
907
+ dbprint(string(timer)+" S"+s+": Oberes Dreieckssystem anhaengen.");
908
+
909
+ // Oberes Dreieckssystem an jede berechnete Dreiecksbasis anhaengen.
910
+ for (j = m; j <= nG; j++) // meist nur j = m = nG
911
+ {
912
+ for (i = 1; i <= size(F); i++)
913
+ {
914
+ F[i] = F[i] + cleardenom(G[j][1] + reduce(G[j]-G[j][1],F[i]));
915
+ attrib(F[i],"isSB",1);
916
+ }
917
+ if (fak)
918
+ {
919
+ F = faktorisiere_letzten(F);
920
+ }
921
+ }
922
+
923
+ dbprint(string(timer)+" S"+s+": Zweiter Teil des Splitts, "+string(m-l-1)+" Leitkoeffizient(en).");
924
+
925
+ // Zweiten Teil des Splitts berechnen.
926
+ H = ideal(G[1..l]); // Nur die Polynome in var(u).
927
+ attrib(H,"isSB",1);
928
+
929
+ for (k = m-l-1; k >= 1; k--) // Leitkoeffizientenliste durchgehen,
930
+ { // angefangen mit lc des kleinsten Polynoms.
931
+ lcr = reduce(lc[k],H);
932
+ if (lcr <> 0) // d.h. (H):lcr <> (1)
933
+ {
934
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Berechnung Saturation.");
935
+ G2 = sat(H,lcr); // Saturation statt Idealquotient.
936
+ attrib(G2,"isSB",1);
937
+
938
+ if (G2[1] <> 1)
939
+ {
940
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Rekursiver Aufruf.");
941
+ // Rekursiver Aufruf, um G2 zu triangulieren.
942
+ Fh = triangMH(G2,#);
943
+
944
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Ggt und oberes Dreieckssystem anhaengen.");
945
+ // Ggt an jede Dreiecksbasis anhaengen.
946
+ for (i = 1; i <= size(Fh); i++)
947
+ {
948
+ Fh[i] = std(Fh[i] + G[m-k]);
949
+ }
950
+ if (fak)
951
+ {
952
+ Fh = faktorisiere_letzten(Fh);
953
+ }
954
+ for (j = m+1; j <= nG; j++) // oberes Dreieckssystem an jede
955
+ { // berechnete Dreiecksbasis anhaengen
956
+ for (i = 1; i <= size(Fh); i++)
957
+ {
958
+ Fh[i] = Fh[i] + cleardenom(G[j][1]
959
+ + reduce(G[j]-G[j][1],Fh[i]));
960
+ attrib(Fh[i],"isSB",1);
961
+ }
962
+ if (fak)
963
+ {
964
+ Fh = faktorisiere_letzten(Fh);
965
+ }
966
+ }
967
+ F = F + Fh;
968
+ }
969
+ else
970
+ {
971
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Leere Varietaet (G2 == (1)).");
972
+ }
973
+ if (k > 1)
974
+ {
975
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Lex. GB von (H + lc) berechnen, naechsten lc reduzieren.");
976
+ H = std(H, lcr); // wegen reduce(...,H) oben
977
+ }
978
+ }
979
+ else
980
+ {
981
+ dbprint(string(timer)+" S"+s+"L"+string(m-l-k)+": Leere Varietaet (lcr == 0).");
982
+ }
983
+ }
984
+
985
+ // Singular loescht die Attribute beim Listenverketten, deswegen neu setzen.
986
+ for (i = 1; i <= size(F); i++)
987
+ {
988
+ attrib(F[i],"isSB",1);
989
+ }
990
+ option(set, ovec);
991
+ return(F);
992
+ }
993
+ //-------------------------------- example ----------------------------------
994
+ example
995
+ { "EXAMPLE:"; echo = 2;
996
+ ring rC5 = 0,(e,d,c,b,a),lp;
997
+ triangMH(stdfglm(cyclic(5)));
998
+ }
999
+
1000
+
1001
+ ///////////////////////////////////////////////////////////////////////////////
1002
+ //
1003
+ // Hilfsfunktionen
1004
+ //
1005
+ ///////////////////////////////////////////////////////////////////////////////
1006
+
1007
+ static proc sort_red (ideal G)
1008
+ "USAGE: sort_red(G); G lexikographische Groebnerbasis.
1009
+ RETURN: reduzierte lex. GB G, deren Elemente nach aufsteigenden
1010
+ Leittermen sortiert sind.
1011
+ "
1012
+ {
1013
+ int i;
1014
+
1015
+ // sortieren
1016
+ G = sort(G)[1];
1017
+
1018
+ // reduzieren
1019
+ ideal Gred = cleardenom(G[1]);
1020
+ attrib(Gred,"isSB",1);
1021
+
1022
+ for (i = 2; i <= size(G); i++)
1023
+ {
1024
+ Gred = Gred + cleardenom(reduce(G[i],Gred));
1025
+ attrib(Gred,"isSB",1);
1026
+ }
1027
+ attrib(Gred,"isSB",1);
1028
+ return(Gred);
1029
+ }
1030
+
1031
+ ///////////////////////////////////////////////////////////////////////////////
1032
+
1033
+ static proc Listenrest (list Liste)
1034
+ "USAGE: Listenrest(Liste); Liste muss eine mindestens einelementige
1035
+ Liste sein (leere Liste ergibt Fehler).
1036
+ RETURN: Liste ohne das erste Element.
1037
+ "
1038
+ {
1039
+ return(delete(Liste,1));
1040
+ }
1041
+
1042
+ ///////////////////////////////////////////////////////////////////////////////
1043
+
1044
+ static proc Idealrest (ideal i)
1045
+ "USAGE: Idealrest(i); i Ideal, i <> (0).
1046
+ RETURN: Ideal i ohne das erste Element bzw das Nullideal,
1047
+ falls i nur ein Erzeugendes besass.
1048
+ "
1049
+ {
1050
+ int ni = size(i);
1051
+ if (ni == 1)
1052
+ {
1053
+ return(ideal(0)); // Nullideal
1054
+ }
1055
+ return(ideal(i[2..ni]));
1056
+ }
1057
+
1058
+ ///////////////////////////////////////////////////////////////////////////////
1059
+
1060
+ static proc H_anhaengen (list L, int h)
1061
+ "USAGE: H_anhaengen(L,h); L Liste aus Idealen, h natuerliche Zahl.
1062
+ RETURN: Macht aus dem Listenelement i ein Paar [i,h] und setzt
1063
+ Attribut "isSB" fuer i.
1064
+ "
1065
+ {
1066
+ int i;
1067
+ list E; // Ergebnisliste
1068
+
1069
+ for (i = 1; i <= size(L); i++)
1070
+ {
1071
+ E = E + list(list(L[i],h));
1072
+ attrib(E[size(E)][1],"isSB",1);
1073
+ }
1074
+ return(E);
1075
+ }
1076
+
1077
+ ///////////////////////////////////////////////////////////////////////////////
1078
+
1079
+ static proc faktorisiere_letzten (list L)
1080
+ "USAGE: faktorisiere_letzten(L); L Liste aus Idealen.
1081
+ RETURN: Faktorisiert letztes Polynom aus jedem Ideal der Liste und
1082
+ zerlegt das Ideal entsprechend. Attribut "isSB" wird gesetzt.
1083
+ "
1084
+ {
1085
+ int i,j;
1086
+ ideal h;
1087
+ int nh;
1088
+ list factors;
1089
+ list E; // Ergebnisliste
1090
+ for (i = 1; i <= size(L); i++)
1091
+ {
1092
+ h = L[i];
1093
+ nh = size(h);
1094
+ factors = factorize(h[nh],1);
1095
+ for (j = 1; j <= size(factors[1]); j++)
1096
+ {
1097
+ h[nh] = factors[1][j];
1098
+ E = insert(E,h,size(E));
1099
+ attrib(E[size(E)],"isSB",1);
1100
+ }
1101
+ }
1102
+ return(E);
1103
+ }
1104
+
1105
+ ///////////////////////////////////////////////////////////////////////////////
1106
+
1107
+ static proc faktorisiere_DB (ideal db)
1108
+ "USAGE: faktorisiere_DB(db); db reduzierte Dreiecksbasis.
1109
+ RETURN: Liste aus reduzierten Dreiecksbasen,
1110
+ die ensteht, indem, mit dem ersten beginnend,
1111
+ jedes Polynom der Dreiecksbasis faktorisiert wird.
1112
+ "
1113
+ {
1114
+ int i,j;
1115
+ poly h;
1116
+ list E = faktorisiere_letzten(db[1]);
1117
+
1118
+ for (j = 2; j <= size(db); j++)
1119
+ {
1120
+ for (i = 1; i <= size(E); i++)
1121
+ {
1122
+ h = db[j][1] + reduce(db[j]-db[j][1],E[i]);
1123
+ E[i] = E[i] + h;
1124
+ }
1125
+ E = faktorisiere_letzten(E);
1126
+ }
1127
+ return(E);
1128
+ }
1129
+
1130
+ ///////////////////////////////////////////////////////////////////////////////
1131
+
1132
+ static proc degv (poly f, int v)
1133
+ "USAGE: degv(f,v); f Polynom in var(v).
1134
+ RETURN: Liefert den Grad von f bzgl. var(v) bzw -1, falls f == 0.
1135
+ "
1136
+ {
1137
+ if (f == 0) {return(-1);}
1138
+ return(size(coeffs(f,var(v))) - 1);
1139
+ }
1140
+
1141
+ //////////////////////////////////////////////////////////////////////////////
1142
+
1143
+ static proc pdiv (poly f, poly g, int v)
1144
+ "USAGE: pdiv(f,g); f,g Polynome in var(v), f > g.
1145
+ RETURN: Liste, wobei [1] = prem(f,g) (Pseudoremainder),
1146
+ [2] = pquo(f,g) (Pseudoquotient).
1147
+ NOTE: Pseudodivision von f durch g.
1148
+ "
1149
+ {
1150
+ // Initialisierung
1151
+ poly q = 0;
1152
+ poly rem = f;
1153
+ int deg_g = degv(g,v);
1154
+ int deg_rem = degv(rem,v);
1155
+ poly lcg = lcoef(g,v); // Im Lazard-Algor. aus dem Grundring.
1156
+ poly h;
1157
+ rem = rem*lcg**(deg_rem - deg_g + 1); // f durch g teilbar machen.
1158
+
1159
+ // Gewoehnliche Polynomdivision
1160
+ while (rem <> 0 and deg_rem >= deg_g)
1161
+ {
1162
+ h = (lcoef(rem,v)/lcg)*var(v)**(deg_rem - deg_g);
1163
+ q = q + h;
1164
+ rem = rem - h*g;
1165
+ deg_rem = degv(rem,v);
1166
+ }
1167
+ return(list(rem,q));
1168
+ }
1169
+
1170
+ //////////////////////////////////////////////////////////////////////////////
1171
+
1172
+ static proc lvar (poly f)
1173
+ "USAGE: lvar(f); f nicht-konstantes Polynom.
1174
+ RETURN: groesste Variable von f bzgl. der aktuellen Termordnung.
1175
+ "
1176
+ {
1177
+ int i = 1;
1178
+ intvec exp = leadexp(f);
1179
+
1180
+ while (1)
1181
+ {
1182
+ if (exp[i] <> 0) {return(i);}
1183
+ i++;
1184
+ }
1185
+ }
1186
+
1187
+ //////////////////////////////////////////////////////////////////////////////
1188
+
1189
+ static proc lcoef (poly f, int v)
1190
+ "USAGE: lcoef(f,v); f Polynom, var(v) Ringvariable.
1191
+ RETURN: Leitkoeffizient von f bzgl. var(v).
1192
+ "
1193
+ {
1194
+ matrix m = coeffs(f,var(v));
1195
+ return(m[size(m),1]);
1196
+ }
1197
+ ///////////////////////////////////////////////////////////////////////////////