passagemath-singular 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

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

Potentially problematic release.


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

Files changed (490) hide show
  1. PySingular.cpython-314-aarch64-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 +490 -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-6a2a8666.4.1.so +0 -0
  7. passagemath_singular.libs/libcddgmp-ac579979.so.0.1.3 +0 -0
  8. passagemath_singular.libs/libfactory-4-66e33516.4.1.so +0 -0
  9. passagemath_singular.libs/libflint-81de1160.so.21.0.0 +0 -0
  10. passagemath_singular.libs/libgf2x-fbd36f80.so.3.0.0 +0 -0
  11. passagemath_singular.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
  12. passagemath_singular.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
  13. passagemath_singular.libs/libgsl-e3525837.so.28.0.0 +0 -0
  14. passagemath_singular.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
  15. passagemath_singular.libs/libntl-0043a3a2.so.44.0.1 +0 -0
  16. passagemath_singular.libs/libomalloc-0-06512335.9.6.so +0 -0
  17. passagemath_singular.libs/libopenblasp-r0-4c5b64b1.3.29.so +0 -0
  18. passagemath_singular.libs/libpolys-4-cb7246b5.4.1.so +0 -0
  19. passagemath_singular.libs/libreadline-28330744.so.8.2 +0 -0
  20. passagemath_singular.libs/libsingular_resources-4-8c425241.4.1.so +0 -0
  21. passagemath_singular.libs/libtinfo-f81c2d16.so.6.3 +0 -0
  22. sage/algebras/all__sagemath_singular.py +3 -0
  23. sage/algebras/fusion_rings/all.py +19 -0
  24. sage/algebras/fusion_rings/f_matrix.py +2448 -0
  25. sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-aarch64-linux-gnu.so +0 -0
  26. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
  27. sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
  28. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-aarch64-linux-gnu.so +0 -0
  29. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
  30. sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
  31. sage/algebras/fusion_rings/fusion_double.py +899 -0
  32. sage/algebras/fusion_rings/fusion_ring.py +1580 -0
  33. sage/algebras/fusion_rings/poly_tup_engine.cpython-314-aarch64-linux-gnu.so +0 -0
  34. sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
  35. sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
  36. sage/algebras/fusion_rings/shm_managers.cpython-314-aarch64-linux-gnu.so +0 -0
  37. sage/algebras/fusion_rings/shm_managers.pxd +24 -0
  38. sage/algebras/fusion_rings/shm_managers.pyx +780 -0
  39. sage/algebras/letterplace/all.py +1 -0
  40. sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  41. sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
  42. sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
  43. sage/algebras/letterplace/free_algebra_letterplace.cpython-314-aarch64-linux-gnu.so +0 -0
  44. sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
  45. sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
  46. sage/algebras/letterplace/letterplace_ideal.cpython-314-aarch64-linux-gnu.so +0 -0
  47. sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
  48. sage/algebras/quatalg/all.py +2 -0
  49. sage/algebras/quatalg/quaternion_algebra.py +4778 -0
  50. sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-aarch64-linux-gnu.so +0 -0
  51. sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
  52. sage/algebras/quatalg/quaternion_algebra_element.cpython-314-aarch64-linux-gnu.so +0 -0
  53. sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
  54. sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
  55. sage/all__sagemath_singular.py +11 -0
  56. sage/ext_data/all__sagemath_singular.py +1 -0
  57. sage/ext_data/singular/function_field/core.lib +98 -0
  58. sage/interfaces/all__sagemath_singular.py +1 -0
  59. sage/interfaces/singular.py +2835 -0
  60. sage/libs/all__sagemath_singular.py +1 -0
  61. sage/libs/singular/__init__.py +1 -0
  62. sage/libs/singular/decl.pxd +1168 -0
  63. sage/libs/singular/function.cpython-314-aarch64-linux-gnu.so +0 -0
  64. sage/libs/singular/function.pxd +87 -0
  65. sage/libs/singular/function.pyx +1901 -0
  66. sage/libs/singular/function_factory.py +61 -0
  67. sage/libs/singular/groebner_strategy.cpython-314-aarch64-linux-gnu.so +0 -0
  68. sage/libs/singular/groebner_strategy.pxd +22 -0
  69. sage/libs/singular/groebner_strategy.pyx +582 -0
  70. sage/libs/singular/option.cpython-314-aarch64-linux-gnu.so +0 -0
  71. sage/libs/singular/option.pyx +671 -0
  72. sage/libs/singular/polynomial.cpython-314-aarch64-linux-gnu.so +0 -0
  73. sage/libs/singular/polynomial.pxd +39 -0
  74. sage/libs/singular/polynomial.pyx +661 -0
  75. sage/libs/singular/ring.cpython-314-aarch64-linux-gnu.so +0 -0
  76. sage/libs/singular/ring.pxd +58 -0
  77. sage/libs/singular/ring.pyx +893 -0
  78. sage/libs/singular/singular.cpython-314-aarch64-linux-gnu.so +0 -0
  79. sage/libs/singular/singular.pxd +72 -0
  80. sage/libs/singular/singular.pyx +1944 -0
  81. sage/libs/singular/standard_options.py +145 -0
  82. sage/matrix/all__sagemath_singular.py +1 -0
  83. sage/matrix/matrix_mpolynomial_dense.cpython-314-aarch64-linux-gnu.so +0 -0
  84. sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
  85. sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
  86. sage/rings/all__sagemath_singular.py +1 -0
  87. sage/rings/function_field/all__sagemath_singular.py +1 -0
  88. sage/rings/function_field/derivations_polymod.py +911 -0
  89. sage/rings/function_field/element_polymod.cpython-314-aarch64-linux-gnu.so +0 -0
  90. sage/rings/function_field/element_polymod.pyx +406 -0
  91. sage/rings/function_field/function_field_polymod.py +2611 -0
  92. sage/rings/function_field/ideal_polymod.py +1775 -0
  93. sage/rings/function_field/order_polymod.py +1475 -0
  94. sage/rings/function_field/place_polymod.py +681 -0
  95. sage/rings/polynomial/all__sagemath_singular.py +1 -0
  96. sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  97. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
  98. sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
  99. sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-aarch64-linux-gnu.so +0 -0
  100. sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
  101. sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
  102. sage/rings/polynomial/plural.cpython-314-aarch64-linux-gnu.so +0 -0
  103. sage/rings/polynomial/plural.pxd +48 -0
  104. sage/rings/polynomial/plural.pyx +3171 -0
  105. sage/symbolic/all__sagemath_singular.py +1 -0
  106. sage/symbolic/comparison_impl.pxi +428 -0
  107. sage/symbolic/constants_c_impl.pxi +178 -0
  108. sage/symbolic/expression.cpython-314-aarch64-linux-gnu.so +0 -0
  109. sage/symbolic/expression.pxd +7 -0
  110. sage/symbolic/expression.pyx +14200 -0
  111. sage/symbolic/getitem_impl.pxi +202 -0
  112. sage/symbolic/pynac.pxi +572 -0
  113. sage/symbolic/pynac_constant_impl.pxi +133 -0
  114. sage/symbolic/pynac_function_impl.pxi +206 -0
  115. sage/symbolic/pynac_impl.pxi +2576 -0
  116. sage/symbolic/pynac_wrap.h +124 -0
  117. sage/symbolic/series_impl.pxi +272 -0
  118. sage/symbolic/substitution_map_impl.pxi +94 -0
  119. sage_wheels/bin/ESingular +0 -0
  120. sage_wheels/bin/Singular +0 -0
  121. sage_wheels/bin/TSingular +0 -0
  122. sage_wheels/lib/singular/MOD/cohomo.la +41 -0
  123. sage_wheels/lib/singular/MOD/cohomo.so +0 -0
  124. sage_wheels/lib/singular/MOD/customstd.la +41 -0
  125. sage_wheels/lib/singular/MOD/customstd.so +0 -0
  126. sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
  127. sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
  128. sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
  129. sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
  130. sage_wheels/lib/singular/MOD/gitfan.la +41 -0
  131. sage_wheels/lib/singular/MOD/gitfan.so +0 -0
  132. sage_wheels/lib/singular/MOD/interval.la +41 -0
  133. sage_wheels/lib/singular/MOD/interval.so +0 -0
  134. sage_wheels/lib/singular/MOD/loctriv.la +41 -0
  135. sage_wheels/lib/singular/MOD/loctriv.so +0 -0
  136. sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
  137. sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
  138. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
  139. sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
  140. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
  141. sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
  142. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
  143. sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
  144. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
  145. sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
  146. sage_wheels/lib/singular/MOD/partialgb.la +41 -0
  147. sage_wheels/lib/singular/MOD/partialgb.so +0 -0
  148. sage_wheels/lib/singular/MOD/pyobject.la +41 -0
  149. sage_wheels/lib/singular/MOD/pyobject.so +0 -0
  150. sage_wheels/lib/singular/MOD/singmathic.la +41 -0
  151. sage_wheels/lib/singular/MOD/singmathic.so +0 -0
  152. sage_wheels/lib/singular/MOD/sispasm.la +41 -0
  153. sage_wheels/lib/singular/MOD/sispasm.so +0 -0
  154. sage_wheels/lib/singular/MOD/subsets.la +41 -0
  155. sage_wheels/lib/singular/MOD/subsets.so +0 -0
  156. sage_wheels/lib/singular/MOD/systhreads.la +41 -0
  157. sage_wheels/lib/singular/MOD/systhreads.so +0 -0
  158. sage_wheels/lib/singular/MOD/syzextra.la +41 -0
  159. sage_wheels/lib/singular/MOD/syzextra.so +0 -0
  160. sage_wheels/libexec/singular/MOD/change_cost +0 -0
  161. sage_wheels/libexec/singular/MOD/singularsurf +11 -0
  162. sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
  163. sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
  164. sage_wheels/libexec/singular/MOD/solve_IP +0 -0
  165. sage_wheels/libexec/singular/MOD/surfex +16 -0
  166. sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
  167. sage_wheels/share/factory/gftables/10201 +342 -0
  168. sage_wheels/share/factory/gftables/1024 +37 -0
  169. sage_wheels/share/factory/gftables/10609 +356 -0
  170. sage_wheels/share/factory/gftables/11449 +384 -0
  171. sage_wheels/share/factory/gftables/11881 +398 -0
  172. sage_wheels/share/factory/gftables/121 +6 -0
  173. sage_wheels/share/factory/gftables/12167 +408 -0
  174. sage_wheels/share/factory/gftables/125 +7 -0
  175. sage_wheels/share/factory/gftables/12769 +428 -0
  176. sage_wheels/share/factory/gftables/128 +7 -0
  177. sage_wheels/share/factory/gftables/1331 +47 -0
  178. sage_wheels/share/factory/gftables/1369 +48 -0
  179. sage_wheels/share/factory/gftables/14641 +490 -0
  180. sage_wheels/share/factory/gftables/15625 +523 -0
  181. sage_wheels/share/factory/gftables/16 +3 -0
  182. sage_wheels/share/factory/gftables/16129 +540 -0
  183. sage_wheels/share/factory/gftables/16384 +549 -0
  184. sage_wheels/share/factory/gftables/16807 +563 -0
  185. sage_wheels/share/factory/gftables/1681 +58 -0
  186. sage_wheels/share/factory/gftables/169 +8 -0
  187. sage_wheels/share/factory/gftables/17161 +574 -0
  188. sage_wheels/share/factory/gftables/1849 +64 -0
  189. sage_wheels/share/factory/gftables/18769 +628 -0
  190. sage_wheels/share/factory/gftables/19321 +646 -0
  191. sage_wheels/share/factory/gftables/19683 +659 -0
  192. sage_wheels/share/factory/gftables/2048 +71 -0
  193. sage_wheels/share/factory/gftables/2187 +75 -0
  194. sage_wheels/share/factory/gftables/2197 +76 -0
  195. sage_wheels/share/factory/gftables/2209 +76 -0
  196. sage_wheels/share/factory/gftables/22201 +742 -0
  197. sage_wheels/share/factory/gftables/22801 +762 -0
  198. sage_wheels/share/factory/gftables/2401 +82 -0
  199. sage_wheels/share/factory/gftables/243 +11 -0
  200. sage_wheels/share/factory/gftables/24389 +815 -0
  201. sage_wheels/share/factory/gftables/24649 +824 -0
  202. sage_wheels/share/factory/gftables/25 +3 -0
  203. sage_wheels/share/factory/gftables/256 +11 -0
  204. sage_wheels/share/factory/gftables/26569 +888 -0
  205. sage_wheels/share/factory/gftables/27 +3 -0
  206. sage_wheels/share/factory/gftables/27889 +932 -0
  207. sage_wheels/share/factory/gftables/2809 +96 -0
  208. sage_wheels/share/factory/gftables/28561 +954 -0
  209. sage_wheels/share/factory/gftables/289 +12 -0
  210. sage_wheels/share/factory/gftables/29791 +995 -0
  211. sage_wheels/share/factory/gftables/29929 +1000 -0
  212. sage_wheels/share/factory/gftables/3125 +107 -0
  213. sage_wheels/share/factory/gftables/32 +4 -0
  214. sage_wheels/share/factory/gftables/32041 +1070 -0
  215. sage_wheels/share/factory/gftables/32761 +1094 -0
  216. sage_wheels/share/factory/gftables/32768 +1095 -0
  217. sage_wheels/share/factory/gftables/343 +14 -0
  218. sage_wheels/share/factory/gftables/3481 +118 -0
  219. sage_wheels/share/factory/gftables/361 +14 -0
  220. sage_wheels/share/factory/gftables/36481 +1218 -0
  221. sage_wheels/share/factory/gftables/3721 +126 -0
  222. sage_wheels/share/factory/gftables/37249 +1244 -0
  223. sage_wheels/share/factory/gftables/38809 +1296 -0
  224. sage_wheels/share/factory/gftables/39601 +1322 -0
  225. sage_wheels/share/factory/gftables/4 +3 -0
  226. sage_wheels/share/factory/gftables/4096 +139 -0
  227. sage_wheels/share/factory/gftables/44521 +1486 -0
  228. sage_wheels/share/factory/gftables/4489 +152 -0
  229. sage_wheels/share/factory/gftables/49 +4 -0
  230. sage_wheels/share/factory/gftables/4913 +166 -0
  231. sage_wheels/share/factory/gftables/49729 +1660 -0
  232. sage_wheels/share/factory/gftables/5041 +170 -0
  233. sage_wheels/share/factory/gftables/50653 +1691 -0
  234. sage_wheels/share/factory/gftables/512 +20 -0
  235. sage_wheels/share/factory/gftables/51529 +1720 -0
  236. sage_wheels/share/factory/gftables/52441 +1750 -0
  237. sage_wheels/share/factory/gftables/529 +20 -0
  238. sage_wheels/share/factory/gftables/5329 +180 -0
  239. sage_wheels/share/factory/gftables/54289 +1812 -0
  240. sage_wheels/share/factory/gftables/57121 +1906 -0
  241. sage_wheels/share/factory/gftables/58081 +1938 -0
  242. sage_wheels/share/factory/gftables/59049 +1971 -0
  243. sage_wheels/share/factory/gftables/6241 +210 -0
  244. sage_wheels/share/factory/gftables/625 +23 -0
  245. sage_wheels/share/factory/gftables/63001 +2102 -0
  246. sage_wheels/share/factory/gftables/64 +5 -0
  247. sage_wheels/share/factory/gftables/6561 +221 -0
  248. sage_wheels/share/factory/gftables/6859 +231 -0
  249. sage_wheels/share/factory/gftables/6889 +232 -0
  250. sage_wheels/share/factory/gftables/729 +27 -0
  251. sage_wheels/share/factory/gftables/7921 +266 -0
  252. sage_wheels/share/factory/gftables/8 +3 -0
  253. sage_wheels/share/factory/gftables/81 +5 -0
  254. sage_wheels/share/factory/gftables/8192 +276 -0
  255. sage_wheels/share/factory/gftables/841 +30 -0
  256. sage_wheels/share/factory/gftables/9 +3 -0
  257. sage_wheels/share/factory/gftables/9409 +316 -0
  258. sage_wheels/share/factory/gftables/961 +34 -0
  259. sage_wheels/share/info/singular.info +191898 -0
  260. sage_wheels/share/singular/LIB/GND.lib +1359 -0
  261. sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
  262. sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
  263. sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
  264. sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
  265. sage_wheels/share/singular/LIB/VecField.lib +1542 -0
  266. sage_wheels/share/singular/LIB/absfact.lib +959 -0
  267. sage_wheels/share/singular/LIB/ainvar.lib +730 -0
  268. sage_wheels/share/singular/LIB/aksaka.lib +419 -0
  269. sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
  270. sage_wheels/share/singular/LIB/algebra.lib +1193 -0
  271. sage_wheels/share/singular/LIB/all.lib +136 -0
  272. sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
  273. sage_wheels/share/singular/LIB/arnold.lib +4553 -0
  274. sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
  275. sage_wheels/share/singular/LIB/arr.lib +3486 -0
  276. sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
  277. sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
  278. sage_wheels/share/singular/LIB/bfun.lib +1964 -0
  279. sage_wheels/share/singular/LIB/bimodules.lib +774 -0
  280. sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
  281. sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
  282. sage_wheels/share/singular/LIB/central.lib +2169 -0
  283. sage_wheels/share/singular/LIB/chern.lib +4162 -0
  284. sage_wheels/share/singular/LIB/cimonom.lib +571 -0
  285. sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
  286. sage_wheels/share/singular/LIB/classify.lib +3239 -0
  287. sage_wheels/share/singular/LIB/classify2.lib +1462 -0
  288. sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
  289. sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
  290. sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
  291. sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
  292. sage_wheels/share/singular/LIB/combinat.lib +91 -0
  293. sage_wheels/share/singular/LIB/compregb.lib +276 -0
  294. sage_wheels/share/singular/LIB/control.lib +1636 -0
  295. sage_wheels/share/singular/LIB/crypto.lib +3795 -0
  296. sage_wheels/share/singular/LIB/curveInv.lib +667 -0
  297. sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
  298. sage_wheels/share/singular/LIB/customstd.lib +100 -0
  299. sage_wheels/share/singular/LIB/deRham.lib +5979 -0
  300. sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
  301. sage_wheels/share/singular/LIB/decomp.lib +1655 -0
  302. sage_wheels/share/singular/LIB/deflation.lib +872 -0
  303. sage_wheels/share/singular/LIB/deform.lib +925 -0
  304. sage_wheels/share/singular/LIB/difform.lib +3055 -0
  305. sage_wheels/share/singular/LIB/divisors.lib +750 -0
  306. sage_wheels/share/singular/LIB/dmod.lib +5817 -0
  307. sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
  308. sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
  309. sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
  310. sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
  311. sage_wheels/share/singular/LIB/dummy.lib +17 -0
  312. sage_wheels/share/singular/LIB/elim.lib +1009 -0
  313. sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
  314. sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
  315. sage_wheels/share/singular/LIB/equising.lib +2127 -0
  316. sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
  317. sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
  318. sage_wheels/share/singular/LIB/findifs.lib +778 -0
  319. sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
  320. sage_wheels/share/singular/LIB/finvar.lib +7989 -0
  321. sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
  322. sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
  323. sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
  324. sage_wheels/share/singular/LIB/freegb.lib +3853 -0
  325. sage_wheels/share/singular/LIB/general.lib +1350 -0
  326. sage_wheels/share/singular/LIB/gfan.lib +1768 -0
  327. sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
  328. sage_wheels/share/singular/LIB/gkdim.lib +99 -0
  329. sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
  330. sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
  331. sage_wheels/share/singular/LIB/goettsche.lib +909 -0
  332. sage_wheels/share/singular/LIB/graal.lib +1366 -0
  333. sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
  334. sage_wheels/share/singular/LIB/graphics.lib +360 -0
  335. sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
  336. sage_wheels/share/singular/LIB/groups.lib +1123 -0
  337. sage_wheels/share/singular/LIB/grwalk.lib +507 -0
  338. sage_wheels/share/singular/LIB/hdepth.lib +194 -0
  339. sage_wheels/share/singular/LIB/help.cnf +57 -0
  340. sage_wheels/share/singular/LIB/hess.lib +1946 -0
  341. sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
  342. sage_wheels/share/singular/LIB/hodge.lib +400 -0
  343. sage_wheels/share/singular/LIB/homolog.lib +1965 -0
  344. sage_wheels/share/singular/LIB/hyperel.lib +975 -0
  345. sage_wheels/share/singular/LIB/inout.lib +679 -0
  346. sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
  347. sage_wheels/share/singular/LIB/interval.lib +1418 -0
  348. sage_wheels/share/singular/LIB/intprog.lib +778 -0
  349. sage_wheels/share/singular/LIB/invar.lib +443 -0
  350. sage_wheels/share/singular/LIB/involut.lib +980 -0
  351. sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
  352. sage_wheels/share/singular/LIB/kskernel.lib +534 -0
  353. sage_wheels/share/singular/LIB/latex.lib +3146 -0
  354. sage_wheels/share/singular/LIB/lejeune.lib +651 -0
  355. sage_wheels/share/singular/LIB/linalg.lib +2040 -0
  356. sage_wheels/share/singular/LIB/locnormal.lib +212 -0
  357. sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
  358. sage_wheels/share/singular/LIB/makedbm.lib +294 -0
  359. sage_wheels/share/singular/LIB/mathml.lib +813 -0
  360. sage_wheels/share/singular/LIB/matrix.lib +1372 -0
  361. sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
  362. sage_wheels/share/singular/LIB/methods.lib +212 -0
  363. sage_wheels/share/singular/LIB/moddiq.lib +322 -0
  364. sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
  365. sage_wheels/share/singular/LIB/modnormal.lib +218 -0
  366. sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
  367. sage_wheels/share/singular/LIB/modquotient.lib +269 -0
  368. sage_wheels/share/singular/LIB/modstd.lib +1024 -0
  369. sage_wheels/share/singular/LIB/modular.lib +545 -0
  370. sage_wheels/share/singular/LIB/modules.lib +2561 -0
  371. sage_wheels/share/singular/LIB/modwalk.lib +609 -0
  372. sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
  373. sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
  374. sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
  375. sage_wheels/share/singular/LIB/mregular.lib +1863 -0
  376. sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
  377. sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
  378. sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
  379. sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
  380. sage_wheels/share/singular/LIB/ncall.lib +31 -0
  381. sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
  382. sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
  383. sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
  384. sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
  385. sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
  386. sage_wheels/share/singular/LIB/ncloc.lib +361 -0
  387. sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
  388. sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
  389. sage_wheels/share/singular/LIB/nctools.lib +1887 -0
  390. sage_wheels/share/singular/LIB/nets.lib +1456 -0
  391. sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
  392. sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
  393. sage_wheels/share/singular/LIB/noether.lib +1106 -0
  394. sage_wheels/share/singular/LIB/normal.lib +8700 -0
  395. sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
  396. sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
  397. sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
  398. sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
  399. sage_wheels/share/singular/LIB/olga.lib +1933 -0
  400. sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
  401. sage_wheels/share/singular/LIB/parallel.lib +319 -0
  402. sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
  403. sage_wheels/share/singular/LIB/perron.lib +202 -0
  404. sage_wheels/share/singular/LIB/pfd.lib +2223 -0
  405. sage_wheels/share/singular/LIB/phindex.lib +642 -0
  406. sage_wheels/share/singular/LIB/pointid.lib +673 -0
  407. sage_wheels/share/singular/LIB/polybori.lib +1430 -0
  408. sage_wheels/share/singular/LIB/polyclass.lib +525 -0
  409. sage_wheels/share/singular/LIB/polylib.lib +1174 -0
  410. sage_wheels/share/singular/LIB/polymake.lib +1902 -0
  411. sage_wheels/share/singular/LIB/presolve.lib +1533 -0
  412. sage_wheels/share/singular/LIB/primdec.lib +9576 -0
  413. sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
  414. sage_wheels/share/singular/LIB/primitiv.lib +401 -0
  415. sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
  416. sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
  417. sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
  418. sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
  419. sage_wheels/share/singular/LIB/random.lib +455 -0
  420. sage_wheels/share/singular/LIB/ratgb.lib +489 -0
  421. sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
  422. sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
  423. sage_wheels/share/singular/LIB/realrad.lib +1197 -0
  424. sage_wheels/share/singular/LIB/recover.lib +2628 -0
  425. sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
  426. sage_wheels/share/singular/LIB/reesclos.lib +465 -0
  427. sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
  428. sage_wheels/share/singular/LIB/resgraph.lib +789 -0
  429. sage_wheels/share/singular/LIB/resjung.lib +820 -0
  430. sage_wheels/share/singular/LIB/resolve.lib +5110 -0
  431. sage_wheels/share/singular/LIB/resources.lib +170 -0
  432. sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
  433. sage_wheels/share/singular/LIB/ring.lib +1328 -0
  434. sage_wheels/share/singular/LIB/ringgb.lib +343 -0
  435. sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
  436. sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
  437. sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
  438. sage_wheels/share/singular/LIB/rootsur.lib +886 -0
  439. sage_wheels/share/singular/LIB/rstandard.lib +607 -0
  440. sage_wheels/share/singular/LIB/rwalk.lib +336 -0
  441. sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
  442. sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
  443. sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
  444. sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
  445. sage_wheels/share/singular/LIB/schreyer.lib +321 -0
  446. sage_wheels/share/singular/LIB/schubert.lib +2551 -0
  447. sage_wheels/share/singular/LIB/sets.lib +524 -0
  448. sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
  449. sage_wheels/share/singular/LIB/signcond.lib +437 -0
  450. sage_wheels/share/singular/LIB/sing.lib +1094 -0
  451. sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
  452. sage_wheels/share/singular/LIB/solve.lib +2243 -0
  453. sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
  454. sage_wheels/share/singular/LIB/spectrum.lib +62 -0
  455. sage_wheels/share/singular/LIB/sresext.lib +757 -0
  456. sage_wheels/share/singular/LIB/ssi.lib +143 -0
  457. sage_wheels/share/singular/LIB/standard.lib +2769 -0
  458. sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
  459. sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
  460. sage_wheels/share/singular/LIB/stratify.lib +1070 -0
  461. sage_wheels/share/singular/LIB/surf.lib +506 -0
  462. sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
  463. sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
  464. sage_wheels/share/singular/LIB/surfex.lib +1462 -0
  465. sage_wheels/share/singular/LIB/swalk.lib +877 -0
  466. sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
  467. sage_wheels/share/singular/LIB/systhreads.lib +74 -0
  468. sage_wheels/share/singular/LIB/tasks.lib +1324 -0
  469. sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
  470. sage_wheels/share/singular/LIB/teachstd.lib +858 -0
  471. sage_wheels/share/singular/LIB/template.lib +116 -0
  472. sage_wheels/share/singular/LIB/toric.lib +1119 -0
  473. sage_wheels/share/singular/LIB/transformation.lib +116 -0
  474. sage_wheels/share/singular/LIB/triang.lib +1197 -0
  475. sage_wheels/share/singular/LIB/tropical.lib +8741 -0
  476. sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
  477. sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
  478. sage_wheels/share/singular/LIB/tst.lib +1108 -0
  479. sage_wheels/share/singular/LIB/weierstr.lib +241 -0
  480. sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
  481. sage_wheels/share/singular/emacs/.emacs-general +184 -0
  482. sage_wheels/share/singular/emacs/.emacs-singular +234 -0
  483. sage_wheels/share/singular/emacs/COPYING +44 -0
  484. sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
  485. sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
  486. sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
  487. sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
  488. sage_wheels/share/singular/emacs/singular.el +4273 -0
  489. sage_wheels/share/singular/emacs/singular.xpm +39 -0
  490. sage_wheels/share/singular/singular.idx +5002 -0
@@ -0,0 +1,2849 @@
1
+ ////////////////////////////////////////////////////////////
2
+ version="version ncrat.lib 4.1.2.0 Feb_2019 "; // $Id: 922fbc9185825d6684cc2ee3dd1919c1b6bcb1d2 $
3
+ category="Noncommutative";
4
+ info="
5
+ LIBRARY: ncrat.lib Framework for working with non-commutative rational functions
6
+
7
+ AUTHOR: Ricardo Schnur, email: ricardo.schnur@math.uni-sb.de
8
+
9
+ SUPPORT: This project has been funded by the SFB-TRR 195
10
+ 'Symbolic Tools in Mathematics and their Application'.
11
+
12
+ OVERVIEW: This library provides a framework for working with
13
+ non-commutative rational functions (or rather, expressions)
14
+ and their linearized representations
15
+
16
+ REFERENCES: T. Mai: On the analytic theory of non-commutative
17
+ distributions in free probability. Universitaet des Saarlandes,
18
+ Dissertation, 2017
19
+
20
+ KEYWORDS: noncommutative, rational expressions;
21
+ rational functions; formal linear representations; minimal representations
22
+
23
+ NOTE: an almost self-explaining introduction to the possibilities of the framework
24
+ can be achieved by running the example for the procedure ncrepGetRegularMinimal.
25
+
26
+ PROCEDURES:
27
+ ncInit(list); Set up framework, list contains nc variables
28
+ ncVarsGet(); List nc variables that are in use
29
+ ncVarsAdd(list); Add variables from list to 'NCRING'
30
+ ncratDefine(); Define element of type ncrat
31
+ ncratAdd(); Addition of two ncrat's
32
+ ncratSubstract(); Subtraction of two ncrat's
33
+ ncratMultiply(); Multiplication of two ncrat's
34
+ ncratInvert(); Invert an ncrat
35
+ ncratSPrint(); Print-to-string for ncrat
36
+ ncratPrint(); Print for ncrat
37
+ ncratFromString(); Reads string into ncrat
38
+ ncratFromPoly(); Converts poly to ncrat
39
+ ncratPower(); Raises ncrat to an integer power
40
+ ncratEvaluateAt(); Evaluate ncrat at scalar or matrix point
41
+ ncrepGet(); Calculate representation of ncrat
42
+ ncrepAdd(); Addition of two ncrep's
43
+ ncrepSubstract(); Subtraction of two ncrep's
44
+ ncrepMultiply(); Multiplication of two ncrep's
45
+ ncrepInvert(); Invert an ncrep
46
+ ncrepPrint(); Print for ncrep
47
+ ncrepDim(); Return the size of ncrep
48
+ ncrepSubstitute(); Plug matrices into nc variables in ncrep
49
+ ncrepEvaluate(); Given (u, Q, v) calculate -u*Q^(-1)*v
50
+ ncrepEvaluateAt(); Evaluate ncrep at scalar or matrix point
51
+ ncrepIsDefinedDim(); Random matrix test if ncrep can be evaluated at size dim
52
+ ncrepIsDefined(); Random matrix test if domain of ncrep is not empty
53
+ ncrepIsRegular(); Random matrix test if ncrep can be evaluated at scalar point
54
+ ncrepRegularZeroMinimize(); Yields a minimal representation if regular at zero
55
+ ncrepRegularMinimize(); Yields a minimal representation if regular at scalar point
56
+ ncrepGetRegularZeroMinimal(); Get a minimal representation of ncrat regular at zero
57
+ ncrepGetRegularMinimal(); Get a minimal representation of ncrat regular at scalar point
58
+ ncrepPencilGet(); Given representation decompose its matrix in linear pencil
59
+ ncrepPencilCombine(); Given linear pencil add up its elements to single matrix
60
+ ";
61
+
62
+ LIB "linalg.lib";
63
+ LIB "random.lib";
64
+ ////////////////////////////////////////////////////////////
65
+
66
+ /*##########################################################
67
+
68
+ STATIC PROCEDURES
69
+
70
+ ##########################################################*/
71
+
72
+ /*##########################################################
73
+
74
+ GENERAL
75
+
76
+ ##########################################################*/
77
+
78
+ // Check whether all entries of a matrix are 0
79
+ static proc isMatrixEmpty(matrix M)
80
+ {
81
+ int n = ncols(M);
82
+ int m = nrows(M);
83
+
84
+ int i, j;
85
+ int isZero = 1;
86
+ i = 1;
87
+ while (i <= n)
88
+ {
89
+ j = 1;
90
+ while (isZero and j <= m)
91
+ {
92
+ if (not(M[j, i] == 0))
93
+ {
94
+ isZero = 0;
95
+ }
96
+ j++;
97
+ }
98
+ i++;
99
+ }
100
+ return (isZero);
101
+ }
102
+
103
+ /*##########################################################
104
+
105
+ STRING
106
+
107
+ ##########################################################*/
108
+
109
+ /*---------------------------------------------------------/
110
+
111
+ Some tools to work on strings
112
+
113
+ /---------------------------------------------------------*/
114
+
115
+ // Is first character a special character?
116
+ static proc isSelfRepresented(string s)
117
+ {
118
+ if (size(s) == 0)
119
+ {
120
+ ERROR("Called isSelfRepresented() with empty string.");
121
+ }
122
+ if (s[1] == ";" or s[1] == "(" or s[1] == ")" or s[1] == "+" or s[1] == "-" or
123
+ s[1] == "*" or s[1] == "^" or s[1] == "/")
124
+ {
125
+ return (1);
126
+ }
127
+ return (0);
128
+ }
129
+
130
+ // Is first character a whitespace?
131
+ static proc isWhitespace(string s)
132
+ {
133
+ if (size(s) == 0)
134
+ {
135
+ ERROR("Called isWhitespace() with empty string.");
136
+ }
137
+ if (s[1] == " " or s[1] == newline)
138
+ {
139
+ return (1);
140
+ }
141
+ return (0);
142
+ }
143
+
144
+ // Is first character a digit?
145
+ static proc isDigit(string s)
146
+ {
147
+ if (size(s) == 0)
148
+ {
149
+ ERROR("Called isDigit() with empty string.");
150
+ }
151
+ if (s[1] == "0" or s[1] == "1" or s[1] == "2" or s[1] == "3" or s[1] == "4" or
152
+ s[1] == "5" or s[1] == "6" or s[1] == "7" or s[1] == "8" or s[1] == "9")
153
+ {
154
+ return (1);
155
+ }
156
+ return (0);
157
+ }
158
+
159
+ // Is first character a letter?
160
+ static proc isLetter(string s)
161
+ {
162
+ if (size(s) == 0)
163
+ {
164
+ ERROR("Called isLetter() with empty string.");
165
+ }
166
+ if (s[1] == "A" or s[1] == "a" or s[1] == "B" or s[1] == "b" or s[1] == "C" or
167
+ s[1] == "c" or s[1] == "D" or s[1] == "d" or s[1] == "E" or s[1] == "e" or
168
+ s[1] == "F" or s[1] == "f" or s[1] == "G" or s[1] == "g" or s[1] == "H" or
169
+ s[1] == "h" or s[1] == "I" or s[1] == "i" or s[1] == "J" or s[1] == "j" or
170
+ s[1] == "K" or s[1] == "k" or s[1] == "L" or s[1] == "l" or s[1] == "M" or
171
+ s[1] == "m" or s[1] == "N" or s[1] == "n" or s[1] == "O" or s[1] == "o" or
172
+ s[1] == "P" or s[1] == "p" or s[1] == "Q" or s[1] == "q" or s[1] == "R" or
173
+ s[1] == "r" or s[1] == "S" or s[1] == "s" or s[1] == "T" or s[1] == "t" or
174
+ s[1] == "U" or s[1] == "u" or s[1] == "V" or s[1] == "v" or s[1] == "W" or
175
+ s[1] == "w" or s[1] == "X" or s[1] == "x" or s[1] == "Y" or s[1] == "y" or
176
+ s[1] == "Z" or s[1] == "z")
177
+ {
178
+ return (1);
179
+ }
180
+ return (0);
181
+ }
182
+
183
+ // Convert string representation of a number into number
184
+ static proc digitToInt(string s)
185
+ {
186
+ if (size(s) == 0)
187
+ {
188
+ ERROR("Called digitToInt() with empty string.");
189
+ }
190
+
191
+ if (s[1] == "0")
192
+ {
193
+ return (0);
194
+ }
195
+ if (s[1] == "1")
196
+ {
197
+ return (1);
198
+ }
199
+ if (s[1] == "2")
200
+ {
201
+ return (2);
202
+ }
203
+ if (s[1] == "3")
204
+ {
205
+ return (3);
206
+ }
207
+ if (s[1] == "4")
208
+ {
209
+ return (4);
210
+ }
211
+ if (s[1] == "5")
212
+ {
213
+ return (5);
214
+ }
215
+ if (s[1] == "6")
216
+ {
217
+ return (6);
218
+ }
219
+ if (s[1] == "7")
220
+ {
221
+ return (7);
222
+ }
223
+ if (s[1] == "8")
224
+ {
225
+ return (8);
226
+ }
227
+ if (s[1] == "9")
228
+ {
229
+ return (9);
230
+ }
231
+ ERROR("digitToInt() not a digit!");
232
+ }
233
+
234
+ // Convert string representation of a number into number
235
+ static proc stringToNumber(string s)
236
+ {
237
+ if (size(s) == 0)
238
+ {
239
+ ERROR("Called stringToNumber() with empty string.");
240
+ }
241
+
242
+ int i;
243
+ number n = 0;
244
+ for (i = 1; i <= size(s); i++)
245
+ {
246
+ n = n + number(digitToInt(s[i]) * 10 ^ (size(s) - i));
247
+ }
248
+
249
+ return (n);
250
+ }
251
+
252
+ /*##########################################################
253
+
254
+ END STRING
255
+
256
+ ##########################################################*/
257
+
258
+ /*##########################################################
259
+
260
+ TOKEN
261
+
262
+ ##########################################################*/
263
+
264
+ /*---------------------------------------------------------/
265
+
266
+ Constructors for token and tokenstream
267
+
268
+ /---------------------------------------------------------*/
269
+
270
+ // First argument is Kind
271
+ // Optional arguments: Value, Name
272
+ static proc makeToken(string s, list #)
273
+ {
274
+ token t;
275
+ int i, n;
276
+
277
+ n = size(#);
278
+ t.kind = s;
279
+
280
+ for (i = 1; i <= n; i++)
281
+ {
282
+ if (typeof(#[i]) == "number")
283
+ {
284
+ t.value = #[i];
285
+ }
286
+ if (typeof(#[i]) == "int")
287
+ {
288
+ t.value = number(#[i]);
289
+ }
290
+ if (typeof(#[i]) == "string")
291
+ {
292
+ t.name = #[i];
293
+ }
294
+ }
295
+
296
+ return (t);
297
+ }
298
+
299
+ // Constructor for token_stream
300
+ static proc makeTokenStream()
301
+ {
302
+ tokenstream ts;
303
+ ts.full = 0; // buffer starts empty
304
+ ts.position = 0; // initial position
305
+ ts.buffer = makeToken("empty"); // empty buffer
306
+ ts.input = ""; // no input yet
307
+ return (ts);
308
+ }
309
+
310
+ /*---------------------------------------------------------/
311
+
312
+ Member functions for TOKENSTREAM
313
+
314
+ /---------------------------------------------------------*/
315
+
316
+ // Put token back into stream
317
+ static proc tsPutback(token t)
318
+ {
319
+ if (TOKENSTREAM.full)
320
+ {
321
+ ERROR("tsPutback() into full buffer!");
322
+ }
323
+ TOKENSTREAM.buffer = t;
324
+ TOKENSTREAM.full = 1;
325
+ }
326
+
327
+ // Compose next token
328
+ static proc tsGet()
329
+ {
330
+ // Check for token in buffer
331
+ if (TOKENSTREAM.full)
332
+ {
333
+ TOKENSTREAM.full = 0;
334
+ return (TOKENSTREAM.buffer);
335
+ }
336
+
337
+ // Return empty token if there are no others
338
+ if (TOKENSTREAM.position == 0 or
339
+ TOKENSTREAM.position > size(TOKENSTREAM.input))
340
+ {
341
+ return (makeToken("empty"));
342
+ }
343
+
344
+ // Get token from TOKENSTREAM.input
345
+ int i = TOKENSTREAM.position;
346
+ string s = TOKENSTREAM.input;
347
+
348
+ // Skip whitespace
349
+ while (isWhitespace(s[i]))
350
+ {
351
+ i++;
352
+ }
353
+
354
+ if (i > size(s))
355
+ {
356
+ ERROR("tsGet() reached end of string!");
357
+ }
358
+
359
+ // switch on s[i]
360
+ // characters that represent themselves
361
+ if (isSelfRepresented(s[i]))
362
+ {
363
+ TOKENSTREAM.position = i + 1;
364
+ return (makeToken(s[i]));
365
+ }
366
+
367
+ // numbers
368
+ if (isDigit(s[i]))
369
+ {
370
+ int start = i;
371
+
372
+ while (i < size(s))
373
+ {
374
+ if (isDigit(s[i + 1]) == 1)
375
+ {
376
+ i++;
377
+ }
378
+ else
379
+ {
380
+ break;
381
+ }
382
+ }
383
+
384
+ int length = i + 1 - start;
385
+ string str = s[start, length];
386
+ TOKENSTREAM.position = i + 1;
387
+
388
+ number n = stringToNumber(str);
389
+ return (makeToken("number", n));
390
+ }
391
+
392
+ // constants,variables and keywords
393
+ if (isLetter(s[i]))
394
+ {
395
+ int start = i;
396
+
397
+ while (i < size(s))
398
+ {
399
+ if (isLetter(s[i + 1]) == 1 or isDigit(s[i + 1]) == 1 or
400
+ s[i + 1] == "_")
401
+ {
402
+ i++;
403
+ }
404
+ else
405
+ {
406
+ break;
407
+ }
408
+ }
409
+
410
+ int length = i + 1 - start;
411
+ string name = s[start, length];
412
+ TOKENSTREAM.position = i + 1;
413
+
414
+ // keyword
415
+ if (name == "inv")
416
+ {
417
+ return (makeToken("inv"));
418
+ }
419
+
420
+ // constant or variable
421
+ int isVar = 0;
422
+ int isDef = 0;
423
+ string cmd = "if( defined(" + name + ") <> 0 ) {isDef = 1}";
424
+ execute(cmd);
425
+ if (isDef)
426
+ {
427
+ // constant
428
+ int isConst = 0;
429
+ cmd = "if( typeof(" + name + ") == \"number\" ) {isConst = 1}";
430
+ execute(cmd);
431
+ cmd = "if( typeof(" + name + ") == \"int\" ) {isConst = 1}";
432
+ execute(cmd);
433
+ if (isConst)
434
+ {
435
+ cmd = "number value = number(" + name + ");";
436
+ execute(cmd);
437
+ return (makeToken("number", value));
438
+ }
439
+
440
+ // variable
441
+ for (i = 1; i <= size(NCVARIABLES); i++)
442
+ {
443
+ if (name == NCVARIABLES[i])
444
+ {
445
+ return (makeToken("name", name));
446
+ }
447
+ }
448
+
449
+ // neither constant nor variable
450
+ ERROR(name + " already defined, but not a number or a nc variable!");
451
+ }
452
+
453
+ ERROR(name + " is undefined and not a nc variable!");
454
+ }
455
+
456
+ ERROR("Unrecognized input: " + s[i]);
457
+ }
458
+
459
+ /*##########################################################
460
+
461
+ END TOKEN
462
+
463
+ ##########################################################*/
464
+
465
+ /*##########################################################
466
+
467
+ GRAMMAR
468
+
469
+ ##########################################################*/
470
+
471
+ /*---------------------------------------------------------/
472
+
473
+ Input for ncrat function
474
+ according to the following grammar
475
+
476
+ Expression:
477
+ Term
478
+ Expression "+" Term
479
+ Expression "-" Term
480
+
481
+ Term:
482
+ Secondary
483
+ Term "*" Secondary
484
+
485
+ Secondary:
486
+ Primary
487
+ Primary "^" int
488
+ Primary "/" Primary
489
+
490
+ Primary:
491
+ Number
492
+ "(" Expression ")"
493
+ "+" Primary
494
+ "-" Primary
495
+ "inv(" Expression ")"
496
+ Name
497
+
498
+ Number:
499
+ digit
500
+ Number digit
501
+
502
+ Name:
503
+ letter
504
+ letter Sequence
505
+
506
+ Sequence:
507
+ letter
508
+ digit
509
+ "_"
510
+ letter Sequence
511
+ digit Sequence
512
+ "_" Sequence
513
+
514
+ /---------------------------------------------------------*/
515
+
516
+ static proc primary()
517
+ {
518
+ token t = tsGet();
519
+
520
+ // switch on t.kind
521
+ // case "(" Expression ")"
522
+ if (t.kind == "(")
523
+ {
524
+ ncrat f = expression();
525
+
526
+ t = tsGet();
527
+ if (t.kind != ")")
528
+ {
529
+ ERROR("')' expected!");
530
+ }
531
+ return (f);
532
+ }
533
+
534
+ // unary +
535
+ if (t.kind == "+")
536
+ {
537
+ return (primary());
538
+ }
539
+
540
+ // unary -
541
+ if (t.kind == "-")
542
+ {
543
+ ncrat sign = "Const", list(number(-1));
544
+ return (sign * primary());
545
+ }
546
+
547
+ // variables and constants
548
+ if (t.kind == "name")
549
+ {
550
+ ncrat f = "Var", list(t.name);
551
+ return (f);
552
+ }
553
+ // numbers
554
+ if (t.kind == "number")
555
+ {
556
+ ncrat f = "Const", list(t.value);
557
+ return (f);
558
+ }
559
+ // inversion
560
+ if (t.kind == "inv")
561
+ {
562
+ t = tsGet();
563
+ if (t.kind != "(")
564
+ {
565
+ ERROR("'(' expected!");
566
+ }
567
+
568
+ ncrat f = expression();
569
+
570
+ t = tsGet();
571
+ if (t.kind != ")")
572
+ {
573
+ ERROR(")' expected!");
574
+ }
575
+
576
+ return (ncratInvert(f));
577
+ }
578
+
579
+ ERROR("Primary expected!");
580
+ }
581
+
582
+ static proc secondary()
583
+ {
584
+ ncrat left = primary();
585
+
586
+ while (1)
587
+ {
588
+ token t = tsGet();
589
+ if (t.kind == "^")
590
+ {
591
+ ncrat right = primary();
592
+
593
+ if (not(right.kind == "Const"))
594
+ {
595
+ ERROR("Expected integer after '^'.");
596
+ }
597
+
598
+ int n = int(right.expr[1]);
599
+ if (not(number(n) == right.expr[1]))
600
+ {
601
+ ERROR(string(right.expr[1]) + " is not an integer!");
602
+ }
603
+
604
+ kill(right);
605
+ kill(t);
606
+ return (ncratPower(left, n));
607
+ }
608
+
609
+ if (t.kind == "/")
610
+ {
611
+ ncrat right = primary();
612
+
613
+ if (not(right.kind == "Const"))
614
+ {
615
+ ERROR("Expected number after '/'.");
616
+ }
617
+
618
+ left = left * ncratInvert(right);
619
+
620
+ kill(right);
621
+ kill(t);
622
+ return (left);
623
+ }
624
+
625
+ tsPutback(t);
626
+ kill(t);
627
+ return (left);
628
+ }
629
+ }
630
+
631
+ static proc term()
632
+ {
633
+ ncrat left = secondary();
634
+
635
+ while (1)
636
+ {
637
+ token t = tsGet();
638
+ if (t.kind == "*")
639
+ {
640
+ ncrat right = secondary();
641
+ left = left * right;
642
+ kill(right);
643
+ kill(t);
644
+ }
645
+ else
646
+ {
647
+ tsPutback(t);
648
+ kill(t);
649
+ return (left);
650
+ }
651
+ }
652
+ }
653
+
654
+ static proc expression()
655
+ {
656
+ ncrat left = term();
657
+
658
+ while (1)
659
+ {
660
+ token t = tsGet();
661
+ if (t.kind == "+")
662
+ {
663
+ ncrat right = term();
664
+ left = left + right;
665
+ kill(right);
666
+ kill(t);
667
+ }
668
+ else
669
+ {
670
+ if (t.kind == "-")
671
+ {
672
+ ncrat right = term();
673
+ left = left - right;
674
+ kill(right);
675
+ kill(t);
676
+ }
677
+ else
678
+ {
679
+ tsPutback(t);
680
+ kill(t);
681
+ return (left);
682
+ }
683
+ }
684
+ }
685
+ }
686
+
687
+ /*##########################################################
688
+
689
+ END GRAMMAR
690
+
691
+ ##########################################################*/
692
+
693
+ /*##########################################################
694
+
695
+ END GENERAL
696
+
697
+ ##########################################################*/
698
+
699
+ /*##########################################################
700
+
701
+ NCRAT
702
+
703
+ ##########################################################*/
704
+
705
+ // Define ring 'NCRING' with variables from list
706
+ static proc ncRingDefine()
707
+ {
708
+ // Kill old ring if it already exists
709
+ if (not(defined(NCRING) == 0))
710
+ {
711
+ kill(NCRING);
712
+ }
713
+
714
+ // Build new ring
715
+ int i;
716
+ string s;
717
+
718
+ s = "(";
719
+ for (i = 1; i <= size(NCVARIABLES); i++)
720
+ {
721
+ if (i == 1)
722
+ {
723
+ s = s + NCVARIABLES[i];
724
+ }
725
+ else
726
+ {
727
+ s = s + ", " + NCVARIABLES[i];
728
+ }
729
+ }
730
+ s = s + ")";
731
+ ring NCRING = create_ring("(0, I)", s, "dp");
732
+ minpoly = I^2+1;
733
+ short = 0;
734
+ exportto(Top, NCRING);
735
+ }
736
+
737
+ static proc ncratIsValid(string s, list l)
738
+ {
739
+
740
+ while (1)
741
+ {
742
+ if (s == "Const")
743
+ {
744
+ if (not((size(l) == 1) and (typeof(l[1]) == "number")))
745
+ {
746
+ return (0);
747
+ }
748
+ break;
749
+ }
750
+
751
+ if (s == "Var")
752
+ {
753
+ if (not((size(l) == 1) and (typeof(l[1]) == "string")))
754
+ {
755
+ return (0);
756
+ }
757
+ break;
758
+ }
759
+
760
+ if (s == "Add" or s == "Sub" or s == "Mult")
761
+ {
762
+ if (not((size(l) == 2) and (typeof(l[1]) == "ncrat") and
763
+ (typeof(l[2]) == "ncrat")))
764
+ {
765
+ return (0);
766
+ }
767
+ break;
768
+ }
769
+
770
+ if (s == "Inv")
771
+ {
772
+ if (not((size(l) == 1) and (typeof(l[1]) == "ncrat")))
773
+ {
774
+ return (0);
775
+ }
776
+ break;
777
+ }
778
+
779
+ break;
780
+ }
781
+
782
+ return (1);
783
+ }
784
+
785
+ /*
786
+ The following procedures make it possible to evaluate a
787
+ ncrat f by substituting in the matrices in point for
788
+ the variables in var
789
+ */
790
+
791
+ static proc ncratEvaluateConst(ncrat f, list vars, list point)
792
+ {
793
+ int g = ncols(point[1]);
794
+ number n = f.expr[1];
795
+
796
+ matrix E[g][g];
797
+ E = E + 1;
798
+
799
+ matrix A = n * E;
800
+ return (A);
801
+ }
802
+
803
+ static proc ncratEvaluateAdd(ncrat f, list vars, list point)
804
+ {
805
+ matrix A = ncratEvaluateAt(f.expr[1], vars, point);
806
+ matrix B = ncratEvaluateAt(f.expr[2], vars, point);
807
+ matrix C = A + B;
808
+ return (C);
809
+ }
810
+
811
+ static proc ncratEvaluateSub(ncrat f, list vars, list point)
812
+ {
813
+ matrix A = ncratEvaluateAt(f.expr[1], vars, point);
814
+ matrix B = ncratEvaluateAt(f.expr[2], vars, point);
815
+ matrix C = A - B;
816
+ return (C);
817
+ }
818
+
819
+ static proc ncratEvaluateMult(ncrat f, list vars, list point)
820
+ {
821
+ matrix A = ncratEvaluateAt(f.expr[1], vars, point);
822
+ matrix B = ncratEvaluateAt(f.expr[2], vars, point);
823
+ matrix C = A * B;
824
+ return (C);
825
+ }
826
+
827
+ static proc ncratEvaluateInv(ncrat f, list vars, list point)
828
+ {
829
+ matrix A = ncratEvaluateAt(f.expr[1], vars, point);
830
+ matrix C = inverse(A);
831
+ return (C);
832
+ }
833
+
834
+ static proc ncratEvaluateVar(ncrat f, list vars, list point)
835
+ {
836
+ poly p;
837
+ int i;
838
+ int index = 0;
839
+ int g = size(vars);
840
+
841
+ for (i = 1; i <= g and index == 0; i++)
842
+ {
843
+ p = vars[i];
844
+ if (string(p) == f.expr[1])
845
+ {
846
+ index = i;
847
+ }
848
+ }
849
+
850
+ matrix C = point[index];
851
+ return (C);
852
+ }
853
+
854
+ /*##########################################################
855
+
856
+ END NCRAT
857
+
858
+ ##########################################################*/
859
+
860
+ /*##########################################################
861
+
862
+ NCREP
863
+
864
+ ##########################################################*/
865
+
866
+ // Handle constants
867
+ static proc ncrepConst(number n)
868
+ {
869
+ ncrep q;
870
+ matrix left[1][2] = 0, 1;
871
+ matrix right[2][1] = 0, 1;
872
+ matrix Q[2][2] = n, -1, -1, 0;
873
+ q.lvec = left;
874
+ q.rvec = right;
875
+ q.mat = Q;
876
+ return (q);
877
+ }
878
+
879
+ // Handle variables
880
+ static proc ncrepVar(poly p)
881
+ {
882
+ ncrep q;
883
+ matrix left[1][2] = 0, 1;
884
+ matrix right[2][1] = 0, 1;
885
+ matrix Q[2][2] = p, -1, -1, 0;
886
+ q.lvec = left;
887
+ q.rvec = right;
888
+ q.mat = Q;
889
+ return (q);
890
+ }
891
+
892
+ // Substitute all occurences of VARIABLE*E in M with A
893
+ static proc ncSubMat(matrix M, matrix A, poly VARIABLE)
894
+ {
895
+ int N = ncols(A);
896
+ int N2 = ncols(M);
897
+ int N3 = N2 div N;
898
+ if (not(N * N3 == N2))
899
+ {
900
+ ERROR("Size of arg1 must be a multiple of size of arg2!");
901
+ }
902
+
903
+ int n, m, i, j;
904
+ poly p;
905
+ for (i = 1; i <= N3; i++)
906
+ {
907
+ for (j = 1; j <= N3; j++)
908
+ {
909
+ p = M[1 + (i - 1) * N, 1 + (j - 1) * N] / VARIABLE;
910
+ if (not(p == 0))
911
+ {
912
+ M[1 + (i - 1) * N..i * N, 1 + (j - 1) * N..j * N] = p * A;
913
+ }
914
+ }
915
+ }
916
+ return (M);
917
+ }
918
+
919
+ /*
920
+ list # = (x1, ..., xg) contains the nc variables
921
+ occurring in g
922
+ return list(Q0, Q1,... Qg) with scalar matrices Qi s.t.
923
+ Q = Q0 + Q1*x1 + ... + Qg*xg
924
+ */
925
+ static proc ncrepLinearPencil(ncrep q, list #)
926
+ {
927
+ int g = size(#);
928
+ int n = ncols(q.mat);
929
+
930
+ int i, j, k;
931
+ poly p;
932
+ matrix Q(0) = q.mat;
933
+ for (i = 1; i <= g; i++)
934
+ {
935
+ matrix Q(i)[n][n];
936
+ for (j = 1; j <= n; j++)
937
+ {
938
+ for (k = 1; k <= n; k++)
939
+ {
940
+ p = Q(0)[j, k] / #[i];
941
+ if (not(p == 0))
942
+ {
943
+ Q(i)
944
+ [j, k] = p;
945
+ }
946
+ }
947
+ }
948
+ Q(0) = Q(0) - #[i] * Q(i);
949
+ }
950
+
951
+ list l;
952
+ for (i = 0; i <= g; i++)
953
+ {
954
+ l = l + list(Q(i));
955
+ }
956
+
957
+ return (l);
958
+ }
959
+
960
+ /*##########################################################
961
+
962
+ REGULAR CASE
963
+
964
+ ##########################################################*/
965
+
966
+ /*
967
+ g - number of nc variables
968
+ n - dimension
969
+ q - REGULAR ncrep
970
+ # - contains occurring ncvariables as 'poly'
971
+ Returns list(B, C, l) with l = list(A1, ..., Ag) such that
972
+ -u*Q^-1*v = C * (1 - A1*x1 - ... - Ag*xg)^-1 * B.
973
+
974
+ ASSUMPTION: q.mat has to be regular at zero
975
+ */
976
+ static proc ncrepToMonicDescriptorRealization(int g, int n, ncrep q, list #)
977
+ {
978
+ if (not(size(#) == g))
979
+ {
980
+ ERROR("List has wrong size!");
981
+ }
982
+
983
+ list l = ncrepLinearPencil(q, #);
984
+ matrix Q(0) = l[1];
985
+ matrix S = inverse(Q(0));
986
+
987
+ if (size(S) == 1 and S[1, 1] == 0)
988
+ {
989
+ ERROR("Q0 has to be invertible!");
990
+ }
991
+
992
+ list k;
993
+ int i;
994
+ for (i = 1; i <= g; i++)
995
+ {
996
+ matrix Q(i) = l[i + 1];
997
+ matrix A(i) = -S * Q(i);
998
+ k = k + list(A(i));
999
+ }
1000
+
1001
+ matrix C = -q.lvec;
1002
+ matrix B = S * q.rvec;
1003
+ return (list(B, C, k));
1004
+ }
1005
+
1006
+ /*
1007
+ g - number of nc variables
1008
+ n - dimension
1009
+ v - vector in C^n (that is, nx1-matrix)
1010
+ # - list containing nxn-matrices A_1, ..., A_g
1011
+
1012
+ This procedure calculates the following subspace of C^n:
1013
+ S = span { A_i1 ... A_ik v | k in N, 1 <= i1, ... ik <= g }
1014
+
1015
+ It returns a basis of this space.
1016
+ */
1017
+ static proc calculateControllabilitySpace(int g, int n, matrix v, list #)
1018
+ {
1019
+ if (size(#) != g)
1020
+ {
1021
+ ERROR("List has wrong size!");
1022
+ }
1023
+
1024
+ if (not(ncols(v) == 1 and nrows(v) == n))
1025
+ {
1026
+ ERROR("Matrix must be of size " + string(n) + "x1!");
1027
+ }
1028
+
1029
+ int i;
1030
+ for (i = 1; i <= g; i++)
1031
+ {
1032
+ if (typeof(#[i]) != "matrix")
1033
+ {
1034
+ ERROR("List must only contain matrices!");
1035
+ }
1036
+ matrix A(i) = #[i];
1037
+ }
1038
+
1039
+ // case v = 0
1040
+ if (isMatrixEmpty(v))
1041
+ {
1042
+ return (list(v));
1043
+ }
1044
+
1045
+ // case v != 0
1046
+ // case n = 1
1047
+ if (n == 1)
1048
+ {
1049
+ return (list(v));
1050
+ }
1051
+
1052
+ // case n > 1
1053
+ list b = list(v);
1054
+ list s = b;
1055
+ matrix baseMat = v;
1056
+ matrix testMat;
1057
+ int oldSize = size(b);
1058
+ int j;
1059
+
1060
+ while (1)
1061
+ {
1062
+ list m;
1063
+
1064
+ // m = {A1, ..., Ag} * s
1065
+ for (i = 1; i <= g; i++)
1066
+ {
1067
+ for (j = 1; j <= size(s); j++)
1068
+ {
1069
+ m = m + list(A(i) * s[j]);
1070
+ }
1071
+ }
1072
+
1073
+ // check if mi is linearly independent of b
1074
+ // in this case append to b, and build new s
1075
+ kill(s);
1076
+ list s;
1077
+
1078
+ for (i = 1; i <= size(m); i++)
1079
+ {
1080
+ testMat = concat(baseMat, m[i]);
1081
+
1082
+ if (rank(testMat) == ncols(testMat))
1083
+ {
1084
+ s = s + list(m[i]);
1085
+ b = b + list(m[i]);
1086
+ baseMat = testMat;
1087
+
1088
+ if (size(b) == n)
1089
+ {
1090
+ return (b);
1091
+ }
1092
+ }
1093
+ }
1094
+
1095
+ kill(m);
1096
+ if (size(b) == oldSize)
1097
+ {
1098
+ return (b);
1099
+ }
1100
+ oldSize = size(b);
1101
+ }
1102
+ }
1103
+
1104
+ /*
1105
+ n - dimension of whole space
1106
+ b - list containing a basis of S
1107
+
1108
+ Calculates a list c containing a basis of S^ortho, i.e.,
1109
+ C^n = S directsum S^ortho.
1110
+ */
1111
+ static proc calculateComplement(int n, list b)
1112
+ {
1113
+ list c;
1114
+ int i;
1115
+
1116
+ // case S = C^n
1117
+ if (size(b) == n)
1118
+ {
1119
+ return (c);
1120
+ }
1121
+
1122
+ for (i = 1; i <= n; i++)
1123
+ {
1124
+ matrix e(i)[n][1];
1125
+ e(i)[i, 1] = 1;
1126
+ }
1127
+
1128
+ // case S = {0}
1129
+ if (isMatrixEmpty(b[1]))
1130
+ {
1131
+ for (i = 1; i <= n; i++)
1132
+ {
1133
+ c = c + list(e(i));
1134
+ }
1135
+ return (c);
1136
+ }
1137
+
1138
+ // case 0 < dim S < n
1139
+ matrix baseMat = b[1];
1140
+ for (i = 2; i <= size(b); i++)
1141
+ {
1142
+ baseMat = concat(baseMat, b[i]);
1143
+ }
1144
+
1145
+ matrix testMat;
1146
+ for (i = 1; i <= n; i++)
1147
+ {
1148
+ testMat = concat(baseMat, e(i));
1149
+
1150
+ if (rank(testMat) == ncols(testMat))
1151
+ {
1152
+ c = c + list(e(i));
1153
+ baseMat = testMat;
1154
+
1155
+ if (ncols(baseMat) == n)
1156
+ {
1157
+ return (c);
1158
+ }
1159
+ }
1160
+ }
1161
+ }
1162
+
1163
+ // INPUT: list containing basis vectors
1164
+ // OUTPUT: orthogonal matrix, whose columns span the same space
1165
+ static proc orthogonalBase(list b)
1166
+ {
1167
+ matrix B;
1168
+
1169
+ if (size(b) == 0)
1170
+ {
1171
+ return (B);
1172
+ }
1173
+
1174
+ B = b[1];
1175
+ int i;
1176
+ for (i = 2; i <= size(b); i++)
1177
+ {
1178
+ B = concat(B, b[i]);
1179
+ }
1180
+ return (orthogonalize(B));
1181
+ }
1182
+
1183
+ /*
1184
+ bMat - orthogonal matrix whose columns span S
1185
+ cMat - orthogonal matrix whose columns span S^ortho
1186
+ # - matrices A1, ..., Ag
1187
+ Returns ( P^-1 * B, C * P, list( P^-1 * Ai * P ) ), where P = (bMat cMat).
1188
+ */
1189
+ static proc orthogonalTransform(matrix bMat, matrix cMat, matrix B, matrix C,
1190
+ list #)
1191
+ {
1192
+ int i;
1193
+ list l;
1194
+ int bMatEmpty = isMatrixEmpty(bMat);
1195
+ int cMatEmpty = isMatrixEmpty(cMat);
1196
+
1197
+ // Define orthogonal transformation
1198
+ if (bMatEmpty)
1199
+ {
1200
+ if (cMatEmpty)
1201
+ {
1202
+ ERROR("Both empty!");
1203
+ }
1204
+ else
1205
+ {
1206
+ matrix P = cMat;
1207
+ }
1208
+ }
1209
+ else
1210
+ {
1211
+ if (cMatEmpty)
1212
+ {
1213
+ matrix P = bMat;
1214
+ }
1215
+ else
1216
+ {
1217
+ matrix P = concat(bMat, cMat);
1218
+ }
1219
+ }
1220
+
1221
+ matrix PInv = inverse(P);
1222
+ B = PInv * B;
1223
+ C = C * P;
1224
+
1225
+ for (i = 1; i <= size(#); i++)
1226
+ {
1227
+ matrix A(i) = PInv * #[i] * P;
1228
+ l = l + list(A(i));
1229
+ }
1230
+
1231
+ return (list(B, C, l));
1232
+ }
1233
+
1234
+ /*
1235
+ n - dimension to cut down to
1236
+ offset - where to cut out
1237
+ # - matrices A1, ..., Ag
1238
+ C * (1 - A1 x1 - .. - Ag xg)^(-1) * B monic descriptor realization
1239
+ */
1240
+ static proc cutdown(int n, int offset, matrix B, matrix C, list #)
1241
+ {
1242
+ int a = 1 + offset;
1243
+ int b = n + offset;
1244
+
1245
+ // Case B or C is zero
1246
+ if (isMatrixEmpty(B) or isMatrixEmpty(C))
1247
+ {
1248
+ matrix zero[1][1] = 0;
1249
+ list zerolist;
1250
+ int i;
1251
+ for (i = 1; i <= size(#); i++)
1252
+ {
1253
+ zerolist = zerolist + list(zero);
1254
+ }
1255
+ return (zero, zero, zerolist);
1256
+ }
1257
+
1258
+ // Case B and C not zero
1259
+ matrix B2 = submat(B, a..b, 1..1);
1260
+ matrix C2 = submat(C, 1..1, a..b);
1261
+
1262
+ list l;
1263
+ int i;
1264
+ for (i = 1; i <= size(#); i++)
1265
+ {
1266
+ matrix A2(i) = submat(#[i], a..b, a..b);
1267
+ l = l + list(A2(i));
1268
+ }
1269
+
1270
+ return (list(B2, C2, l));
1271
+ }
1272
+
1273
+ /*##########################################################
1274
+
1275
+ END REGULAR CASE
1276
+
1277
+ ##########################################################*/
1278
+
1279
+ /*##########################################################
1280
+
1281
+ END NCREP
1282
+
1283
+ ##########################################################*/
1284
+
1285
+ /*##########################################################
1286
+
1287
+ END STATIC PROCEDURES
1288
+
1289
+ ##########################################################*/
1290
+
1291
+ /*##########################################################
1292
+
1293
+ NON-STATIC PROCEDURES
1294
+
1295
+ ##########################################################*/
1296
+
1297
+ /*##########################################################
1298
+
1299
+ GENERAL
1300
+
1301
+ ##########################################################*/
1302
+
1303
+ proc ncInit(list vars)
1304
+ "USAGE: ncInit(vars);
1305
+ list vars containing strings
1306
+
1307
+ RETURN:
1308
+ datatypes ncrat and ncrep (and token, tokenstream,
1309
+ but they are not meant for users),
1310
+ sets ring as 'NCRING' with nc variables from list l
1311
+
1312
+ EXAMPLE: example ncInit;
1313
+ shows an example"
1314
+ {
1315
+ // Check if already initialized
1316
+ // In this case just add missing variables
1317
+ if (defined(NCRATINITIALIZE))
1318
+ {
1319
+ if (!defined(basering))
1320
+ {
1321
+ ncRingDefine();
1322
+ }
1323
+ return ();
1324
+ }
1325
+ int NCRATINITIALIZE = 1;
1326
+ export(NCRATINITIALIZE);
1327
+
1328
+ // Check if variables are specified
1329
+ if (size(vars) == 0)
1330
+ {
1331
+ ERROR("No nc variables specified!");
1332
+ }
1333
+
1334
+ /*---------------------------------------------------------/
1335
+
1336
+ Datatype 'ncrat' for nc rational functions
1337
+
1338
+ The following constructions are allowed:
1339
+ ("Const", [number]) constant
1340
+ ("Var", [string]) variable
1341
+ ("Add", [ncrat, ncrat]) addition
1342
+ ("Sub", [ncrat, ncrat]) sustraction
1343
+ ("Mult", [ncrat, ncrat]) multiplication
1344
+ ("Inv", [ncrat]) inverse
1345
+
1346
+ /---------------------------------------------------------*/
1347
+
1348
+ newstruct("ncrat", "
1349
+ string kind,
1350
+ list expr
1351
+ ");
1352
+
1353
+
1354
+ /*---------------------------------------------------------/
1355
+
1356
+ Struct for representations
1357
+
1358
+ /---------------------------------------------------------*/
1359
+
1360
+ newstruct("ncrep", "
1361
+ matrix lvec,
1362
+ matrix mat,
1363
+ matrix rvec
1364
+ ");
1365
+
1366
+
1367
+ /*---------------------------------------------------------/
1368
+
1369
+ Structs for handling input
1370
+
1371
+ /---------------------------------------------------------*/
1372
+
1373
+ newstruct("token", "
1374
+ string kind,
1375
+ number value,
1376
+ string name
1377
+ ");
1378
+
1379
+
1380
+ newstruct("tokenstream", "
1381
+ int full,
1382
+ int position,
1383
+ token buffer,
1384
+ string input
1385
+ ");
1386
+
1387
+
1388
+ /*---------------------------------------------------------/
1389
+
1390
+ Overloading operators for ncrat and ncrep
1391
+
1392
+ /---------------------------------------------------------*/
1393
+
1394
+ system("install", "ncrat", "=", ncratDefine, 1);
1395
+ system("install", "ncrat", "+", ncratAdd, 2);
1396
+ system("install", "ncrat", "-", ncratSubstract, 2);
1397
+ system("install", "ncrat", "*", ncratMultiply, 2);
1398
+ system("install", "ncrat", "^", ncratPower, 2);
1399
+ system("install", "ncrat", "print", ncratPrint, 1);
1400
+ system("install", "ncrep", "+", ncrepAdd, 2);
1401
+ system("install", "ncrep", "-", ncrepSubstract, 2);
1402
+ system("install", "ncrep", "*", ncrepMultiply, 2);
1403
+ system("install", "ncrep", "print", ncrepPrint, 1);
1404
+
1405
+
1406
+ /*---------------------------------------------------------/
1407
+
1408
+ Global objects
1409
+
1410
+ /---------------------------------------------------------*/
1411
+
1412
+ list NCVARIABLES = vars;
1413
+ export(NCVARIABLES);
1414
+
1415
+ tokenstream TOKENSTREAM = makeTokenStream();
1416
+ export(TOKENSTREAM);
1417
+
1418
+ ncRingDefine();
1419
+ }
1420
+ example
1421
+ {
1422
+ "EXAMPLE:";
1423
+ echo = 2;
1424
+ ncInit(list("x", "y", "z"));
1425
+ NCRING;
1426
+ }
1427
+
1428
+ proc ncVarsGet()
1429
+ "USAGE: ncVarsGet();
1430
+
1431
+ RETURNS:
1432
+ nc variables that are in use
1433
+
1434
+ EXAMPLE: example ncVarsGet;
1435
+ shows an example"
1436
+ {
1437
+ string(NCVARIABLES);
1438
+ }
1439
+ example
1440
+ {
1441
+ "EXAMPLE:";
1442
+ echo = 2;
1443
+ ncInit(list("x", "y", "z"));
1444
+ ncVarsGet();
1445
+ }
1446
+
1447
+ proc ncVarsAdd(list vars)
1448
+ "USAGE: ncVarsAdd(vars);
1449
+ list vars contains variables
1450
+
1451
+ RETURNS:
1452
+ sets list elements as nc variables
1453
+
1454
+ EXAMPLE: example ncVarsAdd;
1455
+ shows an example"
1456
+ {
1457
+ int i, j;
1458
+ int exists = 0;
1459
+
1460
+ for (i = 1; i <= size(vars); i++)
1461
+ {
1462
+ for (j = 1; j <= size(NCVARIABLES); j++)
1463
+ {
1464
+ if (vars[i] == NCVARIABLES[j])
1465
+ {
1466
+ exists = 1;
1467
+ }
1468
+ }
1469
+ if (exists == 0)
1470
+ {
1471
+ NCVARIABLES = NCVARIABLES + list(vars[i]);
1472
+ }
1473
+ else
1474
+ {
1475
+ exists = 0;
1476
+ }
1477
+ }
1478
+
1479
+ ncRingDefine();
1480
+ }
1481
+ example
1482
+ {
1483
+ "EXAMPLE:";
1484
+ echo = 2;
1485
+ ncInit(list("x", "y", "z"));
1486
+ ncVarsGet();
1487
+ ncVarsAdd(list("a", "b", "c"));
1488
+ ncVarsGet();
1489
+ }
1490
+
1491
+ /*##########################################################
1492
+
1493
+ END GENERAL
1494
+
1495
+ ##########################################################*/
1496
+
1497
+ /*##########################################################
1498
+
1499
+ NCRAT
1500
+
1501
+ ##########################################################*/
1502
+
1503
+ proc ncratDefine(string s, list l)
1504
+ "USAGE: ncrat f = ncratDefine(s, l);
1505
+ string s contains kind, list l contains expressions
1506
+
1507
+ RETURN: ncrat with kind s and expressions l
1508
+
1509
+ NOTE:
1510
+ assignment operator '=' for ncrat is overloaded
1511
+ with this procedure, hence
1512
+ ncrat f = s, l;
1513
+ yields the same result as
1514
+ ncrat f = ncratDefine(s, l);
1515
+
1516
+ EXAMPLE: example ncratDefine;
1517
+ shows an example"
1518
+ {
1519
+ if (not(ncratIsValid(s, l)))
1520
+ {
1521
+ ERROR("Not a valid rational expression!");
1522
+ }
1523
+
1524
+ ncrat f;
1525
+ f.kind = s;
1526
+ f.expr = l;
1527
+ return (f);
1528
+ }
1529
+ example
1530
+ {
1531
+ "EXAMPLE:";
1532
+ echo = 2;
1533
+ ncInit(list("x", "y", "z"));
1534
+ number n = 5;
1535
+ ncrat f = ncratDefine("Const", list(n));
1536
+ typeof(f);
1537
+ f.kind;
1538
+ f.expr;
1539
+ f;
1540
+ ncrat g = "Const", list(n);
1541
+ g;
1542
+ }
1543
+
1544
+ proc ncratAdd(ncrat f, ncrat g)
1545
+ "USAGE: ncrat h = ncratAdd(f, g);
1546
+ f, g both of type ncrat
1547
+
1548
+ RETURN: h = f + g
1549
+
1550
+ NOTE:
1551
+ operator '+' for ncrat is overloaded
1552
+ with this procedure, hence
1553
+ ncrat h = f + g;
1554
+ yields the same result as
1555
+ ncrat h = ncratAdd(f, g);
1556
+
1557
+ EXAMPLE: example ncratAdd;
1558
+ shows an example"
1559
+ {
1560
+ ncrat h = "Add", list(f, g);
1561
+ return (h);
1562
+ }
1563
+ example
1564
+ {
1565
+ "EXAMPLE:";
1566
+ echo = 2;
1567
+ ncInit(list("x", "y", "z"));
1568
+ ncrat f = ncratFromString("2*x*y");
1569
+ print(f);
1570
+ ncrat g = ncratFromString("z");
1571
+ print(g);
1572
+ ncrat h1, h2;
1573
+ h1 = ncratAdd(f, g);
1574
+ print(h1);
1575
+ h2 = f + g;
1576
+ print(h2);
1577
+ }
1578
+
1579
+ proc ncratSubstract(ncrat f, ncrat g)
1580
+ "USAGE: ncrat h = ncratSubstract(f, g);
1581
+ f, g both of type ncrat
1582
+
1583
+ RETURN: h = f - g
1584
+
1585
+ NOTE:
1586
+ operator '-' for ncrat is overloaded
1587
+ with this procedure, hence
1588
+ ncrat h = f - g;
1589
+ yields the same result as
1590
+ ncrat h = ncratSubstract(f, g);
1591
+
1592
+ EXAMPLE: example ncratSubstract;
1593
+ shows an example"
1594
+ {
1595
+ ncrat h = "Sub", list(f, g);
1596
+ return (h);
1597
+ }
1598
+ example
1599
+ {
1600
+ "EXAMPLE:";
1601
+ echo = 2;
1602
+ ncInit(list("x", "y", "z"));
1603
+ ncrat f = ncratFromString("2*x*y");
1604
+ print(f);
1605
+ ncrat g = ncratFromString("z");
1606
+ print(g);
1607
+ ncrat h1, h2;
1608
+ h1 = ncratSubstract(f, g);
1609
+ print(h1);
1610
+ h2 = f - g;
1611
+ print(h2);
1612
+ }
1613
+
1614
+ proc ncratMultiply(ncrat f, ncrat g)
1615
+ "USAGE: ncrat h = ncratMultiply(f, g);
1616
+ f, g both of type ncrat
1617
+
1618
+ RETURN: h = f * g
1619
+
1620
+ NOTE:
1621
+ operator '*' for ncrat is overloaded
1622
+ with this procedure, hence
1623
+ ncrat h = f * g;
1624
+ yields the same result as
1625
+ ncrat h = ncratMultiply(f, g);
1626
+
1627
+ EXAMPLE: example ncratMultiply;
1628
+ shows an example"
1629
+ {
1630
+ // Both factors are constants
1631
+ if (f.kind == "Const" and g.kind == "Const")
1632
+ {
1633
+ ncrat h = "Const", list(f.expr[1] * g.expr[1]);
1634
+ return (h)
1635
+ }
1636
+
1637
+ // Only second factor is a constant
1638
+ // Switch order of multiplication
1639
+ if (g.kind == "Const")
1640
+ {
1641
+ return (ncratMultiply(g, f));
1642
+ }
1643
+
1644
+ // Otherwise
1645
+ ncrat h = "Mult", list(f, g);
1646
+ return (h);
1647
+ }
1648
+ example
1649
+ {
1650
+ "EXAMPLE:";
1651
+ echo = 2;
1652
+ ncInit(list("x", "y", "z"));
1653
+ ncrat f = ncratFromString("2*x*y");
1654
+ print(f);
1655
+ ncrat g = ncratFromString("z");
1656
+ print(g);
1657
+ ncrat h1, h2;
1658
+ h1 = ncratMultiply(f, g);
1659
+ print(h1);
1660
+ h2 = f * g;
1661
+ print(h2);
1662
+ }
1663
+
1664
+ proc ncratInvert(ncrat f)
1665
+ "USAGE: ncrat h = ncratInvert(f);
1666
+ f of type ncrat
1667
+
1668
+ RETURN: h = inv(f)
1669
+
1670
+ NOTE:
1671
+ ncrat h = f^-1;
1672
+ yields the same result as
1673
+ ncrat h = ncratInvert(f);
1674
+
1675
+ EXAMPLE: example ncratInvert;
1676
+ shows an example"
1677
+ {
1678
+ ncrat h;
1679
+ if (f.kind == "Const")
1680
+ {
1681
+ if (f.expr[1] != 0)
1682
+ {
1683
+ number n = 1;
1684
+ number m = f.expr[1];
1685
+ h = "Const", list(n / m);
1686
+ return (h);
1687
+ }
1688
+ }
1689
+ h = "Inv", list(f);
1690
+ return (h);
1691
+ }
1692
+ example
1693
+ {
1694
+ "EXAMPLE:";
1695
+ echo = 2;
1696
+ ncInit(list("x", "y", "z"));
1697
+ ncrat f = ncratFromString("2*x*y");
1698
+ print(f);
1699
+ ncrat h1, h2;
1700
+ h1 = ncratInvert(f);
1701
+ print(h1);
1702
+ h2 = f ^ -1;
1703
+ print(h2);
1704
+ }
1705
+
1706
+ proc ncratSPrint(ncrat f)
1707
+ "USAGE: string s = ncratSPrint(f);
1708
+ f of type ncrat
1709
+
1710
+ RETURN: prints f to string
1711
+
1712
+ EXAMPLE: example ncratSPrint;
1713
+ shows an example"
1714
+ {
1715
+ string t, h, k;
1716
+ string s = f.kind;
1717
+ list l = f.expr;
1718
+
1719
+ if (s == "Const")
1720
+ {
1721
+ t = string(l[1]);
1722
+ }
1723
+
1724
+ if (s == "Var")
1725
+ {
1726
+ t = l[1];
1727
+ }
1728
+
1729
+ if (s == "Add")
1730
+ {
1731
+ t = ncratSPrint(l[1]) + "+" + ncratSPrint(l[2]);
1732
+ }
1733
+
1734
+ if (s == "Sub")
1735
+ {
1736
+ if (l[2].kind == "Add" or l[2].kind == "Sub")
1737
+ {
1738
+ h = "(" + ncratSPrint(l[2]) + ")";
1739
+ }
1740
+ else
1741
+ {
1742
+ h = ncratSPrint(l[2]);
1743
+ }
1744
+ t = ncratSPrint(l[1]) + "-" + h;
1745
+ }
1746
+
1747
+ if (s == "Mult")
1748
+ {
1749
+ if (l[1].kind == "Add" or l[1].kind == "Sub")
1750
+ {
1751
+ h = "(" + ncratSPrint(l[1]) + ")";
1752
+ }
1753
+ else
1754
+ {
1755
+ h = ncratSPrint(l[1]);
1756
+ }
1757
+ if (l[2].kind == "Add" or l[2].kind == "Sub")
1758
+ {
1759
+ k = "(" + ncratSPrint(l[2]) + ")";
1760
+ }
1761
+ else
1762
+ {
1763
+ k = ncratSPrint(l[2]);
1764
+ }
1765
+ t = h + "*" + k;
1766
+ }
1767
+
1768
+ if (s == "Inv")
1769
+ {
1770
+ t = "inv(" + ncratSPrint(l[1]) + ")";
1771
+ }
1772
+
1773
+ return (t);
1774
+ }
1775
+ example
1776
+ {
1777
+ "EXAMPLE:";
1778
+ echo = 2;
1779
+ ncInit(list("x", "y", "z"));
1780
+ ncrat f = ncratFromString("2*x*y");
1781
+ string s = ncratSPrint(f);
1782
+ print(s);
1783
+ }
1784
+
1785
+ proc ncratPrint(ncrat f)
1786
+ "USAGE: ncratPrint(f);
1787
+ f of type ncrat
1788
+
1789
+ RETURN: prints f
1790
+
1791
+ NOTE:
1792
+ print(f);
1793
+ yields the same result as
1794
+ ncratPrint(f);
1795
+
1796
+ EXAMPLE: example ncratPrint;
1797
+ shows an example"
1798
+ {
1799
+ print(ncratSPrint(f));
1800
+ }
1801
+ example
1802
+ {
1803
+ "EXAMPLE:";
1804
+ echo = 2;
1805
+ ncInit(list("x", "y", "z"));
1806
+ ncrat f = ncratFromString("2*x*y");
1807
+ ncratPrint(f);
1808
+ print(f);
1809
+ }
1810
+
1811
+ proc ncratFromString(string s)
1812
+ "USAGE: ncrat f = ncratFromString(s);
1813
+ s of type string
1814
+
1815
+ RETURN: read string s into ncrat f
1816
+
1817
+ EXAMPLE: example ncratFromString;
1818
+ shows an example"
1819
+ {
1820
+ // Clear tokenstream
1821
+ TOKENSTREAM.input = s;
1822
+ TOKENSTREAM.position = 1;
1823
+ TOKENSTREAM.full = 0;
1824
+
1825
+ ncrat f = expression();
1826
+ return (f);
1827
+ }
1828
+ example
1829
+ {
1830
+ "EXAMPLE:";
1831
+ echo = 2;
1832
+ ncInit(list("x", "y", "z"));
1833
+ ncrat f = ncratFromString("2*x*y");
1834
+ print(f);
1835
+ }
1836
+
1837
+ proc ncratFromPoly(poly p)
1838
+ "USAGE: ncrat f = ncratFromPoly(p);
1839
+ p of type poly
1840
+
1841
+ RETURN: convert poly to ncrat
1842
+
1843
+ EXAMPLE: example ncratFromPoly;
1844
+ shows an example"
1845
+ {
1846
+ string s = print(p);
1847
+ ncrat f = ncratFromString(s);
1848
+ return (f);
1849
+ }
1850
+ example
1851
+ {
1852
+ "EXAMPLE:";
1853
+ echo = 2;
1854
+ ncInit(list("x", "y", "z"));
1855
+ poly p = 2 * x * y;
1856
+ ncrat f = ncratFromPoly(p);
1857
+ print(f);
1858
+ }
1859
+
1860
+ proc ncratPower(ncrat f, int n)
1861
+ "USAGE: ncrat h = ncratPower(f, n);
1862
+ f of type ncrat, n integer
1863
+
1864
+ RETURN: h = f^n
1865
+
1866
+ EXAMPLE: example ncratPower;
1867
+ shows an example"
1868
+ {
1869
+ if (n < 0)
1870
+ {
1871
+ return (ncratInvert(ncratPower(f, -n)));
1872
+ }
1873
+
1874
+ if (n == 0)
1875
+ {
1876
+ return (ncratFromString("1"));
1877
+ }
1878
+
1879
+ if (n == 1)
1880
+ {
1881
+ return (f);
1882
+ }
1883
+
1884
+ return (ncratPower(f, n - 1) * f);
1885
+ }
1886
+ example
1887
+ {
1888
+ "EXAMPLE:";
1889
+ echo = 2;
1890
+ ncInit(list("x", "y", "z"));
1891
+ ncrat f = ncratFromString("2*x*y");
1892
+ ncrat h = ncratPower(f, 3);
1893
+ print(h);
1894
+ }
1895
+
1896
+ proc ncratEvaluateAt(ncrat f, list vars, list point)
1897
+ "USAGE: matrix M = ncratEvaluateAt(f, vars, point);
1898
+
1899
+ RETURN: Evaluate the ncrat f by substituting in the
1900
+ matrices contained in point for the respective
1901
+ variables contained in var, that is, calculate
1902
+ f(point).
1903
+
1904
+ EXAMPLE: example ncratEvaluateAt;
1905
+ shows an example"
1906
+ {
1907
+ string s = f.kind;
1908
+
1909
+ if (s == "Const")
1910
+ {
1911
+ matrix A = ncratEvaluateConst(f, vars, point);
1912
+ return (A);
1913
+ }
1914
+
1915
+ if (s == "Add")
1916
+ {
1917
+ matrix A = ncratEvaluateAdd(f, vars, point);
1918
+ return (A);
1919
+ }
1920
+
1921
+ if (s == "Sub")
1922
+ {
1923
+ matrix A = ncratEvaluateSub(f, vars, point);
1924
+ return (A);
1925
+ }
1926
+
1927
+ if (s == "Mult")
1928
+ {
1929
+ matrix A = ncratEvaluateMult(f, vars, point);
1930
+ return (A);
1931
+ }
1932
+
1933
+ if (s == "Inv")
1934
+ {
1935
+ matrix A = ncratEvaluateInv(f, vars, point);
1936
+ return (A);
1937
+ }
1938
+
1939
+ if (s == "Var")
1940
+ {
1941
+ matrix A = ncratEvaluateVar(f, vars, point);
1942
+ return (A);
1943
+ }
1944
+ }
1945
+ example
1946
+ {
1947
+ "EXAMPLE:";
1948
+ echo = 2;
1949
+ ncInit(list("x", "y"));
1950
+ ncrat f = ncratFromString("x+y");
1951
+ matrix A[2][2] = 1, 2, 3, 4;
1952
+ matrix B[2][2] = 5, 6, 7, 8;
1953
+ matrix M = ncratEvaluateAt(f, list(x, y), list(A, B));
1954
+ print(M);
1955
+ }
1956
+
1957
+ /*##########################################################
1958
+
1959
+ END NCRAT
1960
+
1961
+ ##########################################################*/
1962
+
1963
+ /*##########################################################
1964
+
1965
+ NCREP
1966
+
1967
+ ##########################################################*/
1968
+
1969
+ proc ncrepGet(ncrat f)
1970
+ "USAGE: ncrep q = ncrepGet(f);
1971
+ f of type ncrat
1972
+
1973
+ RETURN: q = (u, Q, v) linear representation of f
1974
+
1975
+ EXAMPLE: example ncrepGet;
1976
+ shows an example"
1977
+ {
1978
+ ncrep q;
1979
+
1980
+ // switch on f.kind
1981
+ if (f.kind == "Const")
1982
+ {
1983
+ q = ncrepConst(f.expr[1]);
1984
+ return (q);
1985
+ }
1986
+
1987
+ if (f.kind == "Var")
1988
+ {
1989
+ string s = "poly p = " + f.expr[1] + ";";
1990
+ execute(s);
1991
+ q = ncrepVar(p);
1992
+ return (q);
1993
+ }
1994
+
1995
+ if (f.kind == "Add")
1996
+ {
1997
+ q = ncrepAdd(ncrepGet(f.expr[1]), ncrepGet(f.expr[2]));
1998
+ return (q);
1999
+ }
2000
+
2001
+ if (f.kind == "Sub")
2002
+ {
2003
+ q = ncrepSubstract(ncrepGet(f.expr[1]), ncrepGet(f.expr[2]));
2004
+ return (q);
2005
+ }
2006
+
2007
+ if (f.kind == "Mult")
2008
+ {
2009
+ // First factor is a non-zero constant
2010
+ if (f.expr[1].kind == "Const")
2011
+ {
2012
+ if (f.expr[1].expr[1] != 0) {
2013
+ q = ncrepGet(f.expr[2]);
2014
+ q.mat = q.mat / f.expr[1].expr[1];
2015
+ return (q);
2016
+ }
2017
+ }
2018
+
2019
+ // Second factor is a non-zero constant
2020
+ if (f.expr[2].kind == "Const")
2021
+ {
2022
+ if (f.expr[2].expr[1] != 0) {
2023
+ q = ncrepGet(f.expr[1]);
2024
+ q.mat = q.mat / f.expr[2].expr[1];
2025
+ return (q);
2026
+ }
2027
+ }
2028
+
2029
+ // No constant factors
2030
+ q = ncrepMultiply(ncrepGet(f.expr[1]), ncrepGet(f.expr[2]));
2031
+ return (q);
2032
+ }
2033
+
2034
+ if (f.kind == "Inv")
2035
+ {
2036
+ q = ncrepInvert(ncrepGet(f.expr[1]));
2037
+ return (q);
2038
+ }
2039
+ }
2040
+ example
2041
+ {
2042
+ "EXAMPLE:";
2043
+ echo = 2;
2044
+ ncInit(list("x", "y", "z"));
2045
+ ncrat f = ncratFromString("2*x*y");
2046
+ ncrep q = ncrepGet(f);
2047
+ print(q);
2048
+ }
2049
+
2050
+ proc ncrepAdd(ncrep s, ncrep t)
2051
+ "USAGE: ncrep s = ncrepAdd(q, r);
2052
+ q, r both of type ncrep
2053
+
2054
+ RETURN: representation s of h = f + g
2055
+ if q, r are representations of f, g
2056
+
2057
+ NOTE:
2058
+ operator '+' for ncrep is overloaded
2059
+ with this procedure, hence
2060
+ ncrep s = q + r;
2061
+ yields the same result as
2062
+ ncrep s = ncrepAdd(q, r);
2063
+
2064
+ EXAMPLE: example ncrepAdd;
2065
+ shows an example"
2066
+ {
2067
+ ncrep q;
2068
+ q.lvec = concat(s.lvec, t.lvec);
2069
+ q.rvec = transpose(concat(transpose(s.rvec), transpose(t.rvec)));
2070
+ q.mat = dsum(s.mat, t.mat);
2071
+ return (q);
2072
+ }
2073
+ example
2074
+ {
2075
+ "EXAMPLE:";
2076
+ echo = 2;
2077
+ ncInit(list("x", "y", "z"));
2078
+ ncrat f = ncratFromString("x");
2079
+ ncrat g = ncratFromString("y");
2080
+ ncrep q = ncrepGet(f);
2081
+ ncrep r = ncrepGet(g);
2082
+ ncrep s1, s2;
2083
+ s1 = ncrepAdd(q, r);
2084
+ print(s1);
2085
+ s2 = q + r;
2086
+ print(s2);
2087
+ }
2088
+
2089
+ proc ncrepSubstract(ncrep s, ncrep t)
2090
+ "USAGE: ncrep s = ncrepSubstract(q, r);
2091
+ q, r both of type ncrep
2092
+
2093
+ RETURN: representation s of h = f - g
2094
+ if q, r are representations of f, g
2095
+
2096
+ NOTE:
2097
+ operator '-' for ncrep is overloaded
2098
+ with this procedure, hence
2099
+ ncrep s = q - r;
2100
+ yields the same result as
2101
+ ncrep s = ncrepSubstract(q, r);
2102
+
2103
+ EXAMPLE: example ncrepSubstract;
2104
+ shows an example"
2105
+ {
2106
+ ncrep q;
2107
+ q.lvec = concat(s.lvec, t.lvec);
2108
+ q.rvec = transpose(concat(transpose(s.rvec), transpose(t.rvec)));
2109
+ q.mat = dsum(s.mat, -t.mat);
2110
+ return (q);
2111
+ }
2112
+ example
2113
+ {
2114
+ "EXAMPLE:";
2115
+ echo = 2;
2116
+ ncInit(list("x", "y", "z"));
2117
+ ncrat f = ncratFromString("x");
2118
+ ncrat g = ncratFromString("y");
2119
+ ncrep q = ncrepGet(f);
2120
+ ncrep r = ncrepGet(g);
2121
+ ncrep s1, s2;
2122
+ s1 = ncrepSubstract(q, r);
2123
+ print(s1);
2124
+ s2 = q - r;
2125
+ print(s2);
2126
+ }
2127
+
2128
+ proc ncrepMultiply(ncrep s, ncrep t)
2129
+ "USAGE: ncrep s = ncrepMultiply(q, r);
2130
+ q, r both of type ncrep
2131
+
2132
+ RETURN: representation s of h = f * g
2133
+ if q, r are representations of f, g
2134
+
2135
+ NOTE:
2136
+ operator '*' for ncrep is overloaded
2137
+ with this procedure, hence
2138
+ ncrep s = q * r;
2139
+ yields the same result as
2140
+ ncrep s = ncrepMultiply(q, r);
2141
+
2142
+ EXAMPLE: example ncrepMultiply;
2143
+ shows an example"
2144
+ {
2145
+ ncrep q;
2146
+ int dims = ncols(s.lvec);
2147
+ int dimt = ncols(t.lvec);
2148
+ matrix lzero[1][dimt] = 0;
2149
+ matrix rzero[dims][1] = 0;
2150
+ matrix mzero[dimt][dims] = 0;
2151
+
2152
+ q.lvec = concat(lzero, s.lvec);
2153
+ q.rvec = transpose(concat(transpose(rzero), transpose(t.rvec)));
2154
+
2155
+ matrix A = concat(s.rvec * t.lvec, s.mat);
2156
+ matrix B = concat(t.mat, mzero);
2157
+ q.mat = transpose(concat(transpose(A), transpose(B)));
2158
+
2159
+ return (q);
2160
+ }
2161
+ example
2162
+ {
2163
+ "EXAMPLE:";
2164
+ echo = 2;
2165
+ ncInit(list("x", "y", "z"));
2166
+ ncrat f = ncratFromString("x");
2167
+ ncrat g = ncratFromString("y");
2168
+ ncrep q = ncrepGet(f);
2169
+ ncrep r = ncrepGet(g);
2170
+ ncrep s1, s2;
2171
+ s1 = ncrepMultiply(q, r);
2172
+ print(s1);
2173
+ s2 = q * r;
2174
+ print(s2);
2175
+ }
2176
+
2177
+ proc ncrepInvert(ncrep s)
2178
+ "USAGE: ncrep s = ncrepInvert(q);
2179
+ q of type ncrep
2180
+
2181
+ RETURN: representation of h = inv(f)
2182
+ if q is a representation of f
2183
+
2184
+ EXAMPLE: example ncrepInvert;
2185
+ shows an example"
2186
+ {
2187
+ ncrep q;
2188
+ int n = ncols(s.lvec);
2189
+ matrix one[1][1] = 1;
2190
+ matrix vzero[1][n] = 0;
2191
+ matrix mzero[1][1] = 0;
2192
+
2193
+ q.lvec = concat(one, vzero);
2194
+ q.rvec = transpose(q.lvec);
2195
+
2196
+ matrix A = concat(mzero, s.lvec);
2197
+ matrix B = concat(s.rvec, -s.mat);
2198
+ q.mat = transpose(concat(transpose(A), transpose(B)));
2199
+
2200
+ return (q);
2201
+ }
2202
+ example
2203
+ {
2204
+ "EXAMPLE:";
2205
+ echo = 2;
2206
+ ncInit(list("x", "y", "z"));
2207
+ ncrat f = ncratFromString("2*x*y");
2208
+ ncrep q = ncrepGet(f);
2209
+ ncrep s = ncrepInvert(q);
2210
+ print(s);
2211
+ }
2212
+
2213
+ proc ncrepPrint(ncrep q)
2214
+ "USAGE: ncrepPrint(q);
2215
+ q of type ncrep
2216
+
2217
+ RETURN: prints q
2218
+
2219
+ NOTE:
2220
+ print(q);
2221
+ yields the same result as
2222
+ ncrepPrint(q);
2223
+
2224
+ EXAMPLE: example ncrepPrint;
2225
+ shows an example"
2226
+ {
2227
+ print("lvec=");
2228
+ print(q.lvec);
2229
+ print(newline + "mat=");
2230
+ print(q.mat);
2231
+ print(newline + "rvec=");
2232
+ print(q.rvec);
2233
+ }
2234
+ example
2235
+ {
2236
+ "EXAMPLE:";
2237
+ echo = 2;
2238
+ ncInit(list("x", "y", "z"));
2239
+ ncrat f = ncratFromString("2*x*y");
2240
+ ncrep q = ncrepGet(f);
2241
+ ncrepPrint(q);
2242
+ print(q);
2243
+ }
2244
+
2245
+ proc ncrepDim(ncrep q)
2246
+ "USAGE: ncrepDim(q);
2247
+ q of type ncrep
2248
+
2249
+ RETURN: dimension of q;
2250
+ returns 0 if q represents the zero-function
2251
+
2252
+ EXAMPLE: example ncrepDim;
2253
+ shows an example"
2254
+ {
2255
+ int n = ncols(q.mat);
2256
+ // Does q represent zero?
2257
+ if (n == 1)
2258
+ {
2259
+ if (q.lvec == 0 or q.rvec == 0)
2260
+ {
2261
+ n = 0;
2262
+ }
2263
+ }
2264
+ return (n);
2265
+ }
2266
+ example
2267
+ {
2268
+ "EXAMPLE:";
2269
+ echo = 2;
2270
+ ncInit(list("x", "y", "z"));
2271
+ ncrat f = ncratFromString("2*x*y");
2272
+ ncrep q = ncrepGet(f);
2273
+ print(q);
2274
+ ncrepDim(q);
2275
+ }
2276
+
2277
+ proc ncrepSubstitute(ncrep q, list vars, list points)
2278
+ "USAGE: ncrep s = ncrepSubstitute(q, l);
2279
+ q of type ncrep, vars = (x1, ..., xg),
2280
+ points = (A1, ... , Ag) with Ai matrices of the
2281
+ same dimension and xi of type poly are nc variables
2282
+
2283
+ RETURN: substitutes in Ai for xi in q
2284
+
2285
+ EXAMPLE: example ncrepSubstitute;
2286
+ shows an example"
2287
+ {
2288
+ int g = size(vars);
2289
+ if (not(size(points) == g))
2290
+ {
2291
+ ERROR("Number of variables and points does not match!");
2292
+ }
2293
+
2294
+ // Lists empty
2295
+ if (g == 0)
2296
+ {
2297
+ return (q.mat);
2298
+ }
2299
+
2300
+ // Lists non-empty
2301
+ int i;
2302
+ list l = ncrepLinearPencil(q, vars);
2303
+ for (i = 0; i <= g; i++)
2304
+ {
2305
+ matrix Q(i) = l[i + 1];
2306
+ }
2307
+
2308
+ int n=1;
2309
+ if (typeof(points[1])!="poly") { n = ncols(points[1]);}
2310
+ matrix E[n][n];
2311
+ E = E + 1;
2312
+
2313
+ matrix M = tensor(Q(0), E);
2314
+ for (i = 1; i <= g; i++)
2315
+ {
2316
+ matrix A(i) = points[i];
2317
+ M = M + tensor(Q(i), A(i));
2318
+ }
2319
+
2320
+ ncrep q2;
2321
+ q2.mat = M;
2322
+ q2.lvec = tensor(q.lvec, E);
2323
+ q2.rvec = tensor(q.rvec, E);
2324
+
2325
+ return (q2);
2326
+ }
2327
+ example
2328
+ {
2329
+ "EXAMPLE:";
2330
+ echo = 2;
2331
+ ncInit(list("x", "y", "z"));
2332
+ ncrat f = ncratFromString("x+y");
2333
+ ncrep q = ncrepGet(f);
2334
+ matrix A[2][2] = 1, 2, 3, 4;
2335
+ matrix B[2][2] = 5, 6, 7, 8;
2336
+ ncrep s = ncrepSubstitute(q, list(x, y), list(A, B));
2337
+ print(q);
2338
+ print(s);
2339
+ }
2340
+
2341
+ proc ncrepEvaluate(ncrep q)
2342
+ "USAGE: matrix M = ncrepEvaluate(q);
2343
+
2344
+ RETURN: for q=(u, Q, v) calculate -u*Q^(-1)*v
2345
+
2346
+ EXAMPLE: example ncrepEvaluate;
2347
+ shows an example"
2348
+ {
2349
+ matrix QInv = inverse(q.mat);
2350
+ if (size(QInv) == 1 and QInv[1, 1] == 0)
2351
+ {
2352
+ ERROR("Matrix not invertible!");
2353
+ }
2354
+ matrix M = -q.lvec * QInv * q.rvec;
2355
+ return (M);
2356
+ }
2357
+ example
2358
+ {
2359
+ "EXAMPLE:";
2360
+ echo = 2;
2361
+ ncInit(list("x", "y", "z"));
2362
+ ncrat f = ncratFromString("x+y");
2363
+ ncrep q = ncrepGet(f);
2364
+ matrix A[2][2] = 1, 2, 3, 4;
2365
+ matrix B[2][2] = 5, 6, 7, 8;
2366
+ ncrep s = ncrepSubstitute(q, list(x, y), list(A, B));
2367
+ matrix M = ncrepEvaluate(s);
2368
+ print(M);
2369
+ }
2370
+
2371
+ proc ncrepEvaluateAt(ncrep q, list vars, list point)
2372
+ "USAGE: matrix M = ncrepEvaluateAt(q, vars, point);
2373
+
2374
+ RETURN: For q=(u, Q, v) calculate -u*Q(point)^(-1)*v,
2375
+ that is to say, evaluate the ncrat represented
2376
+ by q at point (scalar or matrix point).
2377
+
2378
+ EXAMPLE: example ncrepEvaluateAt;
2379
+ shows an example"
2380
+ {
2381
+ ncrep r = ncrepSubstitute(q, vars, point);
2382
+ matrix M = ncrepEvaluate(r);
2383
+ return (M);
2384
+ }
2385
+ example
2386
+ {
2387
+ "EXAMPLE:";
2388
+ echo = 2;
2389
+ ncInit(list("x", "y"));
2390
+ ncrat f = ncratFromString("x+y");
2391
+ ncrep q = ncrepGet(f);
2392
+ matrix A[2][2] = 1, 2, 3, 4;
2393
+ matrix B[2][2] = 5, 6, 7, 8;
2394
+ matrix M = ncrepEvaluateAt(q, list(x, y), list(A, B));
2395
+ print(M);
2396
+ }
2397
+
2398
+ proc ncrepIsDefinedDim(ncrep q, int N, list vars, int n, int maxcoeff)
2399
+ "USAGE: list l = ncrepIsDefinedDim(q, N, vars, n, maxcoeff);
2400
+
2401
+ RETURN: list(k, list vars, list(A1, ..., Ak)), where:
2402
+ If k = N then there are matrices A1, ..., Ak of size N
2403
+ such that q is defined at A = (A1, ..., Ak), i.e.,
2404
+ q.mat is invertible at A.
2405
+ If k = 0 then no such point was found.
2406
+
2407
+ NOTE: Test whether q.mat is invertible via evaluation
2408
+ at random matrix points with integer coefficients
2409
+ in [-maxcoeff, maxcoeff]. Stops after n tries.
2410
+ Use square matrices of dimension N. The list vars
2411
+ contains the nc variables which occur in q.
2412
+
2413
+ EXAMPLE: example ncrepIsDefinedDim;
2414
+ shows an example"
2415
+ {
2416
+ int g = size(vars);
2417
+ int i, k;
2418
+ for (i = 1; i <= n; i++)
2419
+ {
2420
+ // Substitute random matrices
2421
+ list points;
2422
+ for (k = 1; k <= g; k++)
2423
+ {
2424
+ matrix A(k) = randommat(N, N, maxideal(0), maxcoeff);
2425
+ points = points + list(A(k));
2426
+ kill(A(k));
2427
+ }
2428
+ ncrep q2 = ncrepSubstitute(q, vars, points);
2429
+
2430
+ // Check for invertibility
2431
+ if (mat_rk(q2.mat) == ncols(q2.mat))
2432
+ {
2433
+ list result = list(N) + list(vars) + list(points);
2434
+ kill(q2);
2435
+ kill(points);
2436
+ return (result);
2437
+ }
2438
+ kill(q2);
2439
+ kill(points);
2440
+ }
2441
+ list empty;
2442
+ list result = list(0) + list(vars) + list(empty);
2443
+ return (result);
2444
+ }
2445
+ example
2446
+ {
2447
+ "EXAMPLE:";
2448
+ echo = 2;
2449
+ ncInit(list("x", "y"));
2450
+ ncrat f = ncratFromString("inv(x*y-y*x)");
2451
+ ncrep q = ncrepGet(f);
2452
+ ncrepIsDefinedDim(q, 1, list(x, y), 10, 100);
2453
+ ncrepIsDefinedDim(q, 2, list(x, y), 10, 100);
2454
+ }
2455
+
2456
+ proc ncrepIsDefined(ncrep q, list vars, int n, int maxcoeff)
2457
+ "USAGE: list l = ncrepIsDefined(q, vars, n, maxcoeff);
2458
+
2459
+ RETURN: list(dim, list vars, list(A1, ..., Ak)), where:
2460
+ If dim > 0 then there are matrices A1, ..., Ak of size dim
2461
+ such that q is defined at A = (A1, ..., Ak), i.e.,
2462
+ q.mat is invertible at A.
2463
+ If dim = 0 then no such point was found.
2464
+
2465
+ NOTE: Test whether q.mat is invertible via evaluation
2466
+ at random matrix points with integer coefficients
2467
+ in [-maxcoeff, maxcoeff]. Stops after n tries.
2468
+ Use ixi-matrix in i-th try. The list vars contains the
2469
+ nc variables which occur in q.
2470
+
2471
+ EXAMPLE: example ncrepIsDefined;
2472
+ shows an example"
2473
+ {
2474
+ int i;
2475
+ list l;
2476
+ for (i = 1; i <= n; i++)
2477
+ {
2478
+ l = ncrepIsDefinedDim(q, i, vars, 1, maxcoeff);
2479
+ if (l[1] > 0)
2480
+ {
2481
+ return (l);
2482
+ }
2483
+ }
2484
+ return (l);
2485
+ }
2486
+ example
2487
+ {
2488
+ "EXAMPLE:";
2489
+ echo = 2;
2490
+ ncInit(list("x", "y"));
2491
+ ncrat f = ncratFromString("inv(x*y-y*x)");
2492
+ ncrep q = ncrepGet(f);
2493
+ ncrepIsDefined(q, list(x, y), 5, 10);
2494
+ ncrat g = ncratFromString("inv(x-x)");
2495
+ ncrep r = ncrepGet(g);
2496
+ ncrepIsDefined(r, list(x), 5, 10);
2497
+ }
2498
+
2499
+ proc ncrepIsRegular(ncrep q, list vars, int n, int maxcoeff)
2500
+ "USAGE: list l = ncrepIsRegular(q, vars, n, maxcoeff);
2501
+
2502
+ RETURN: list(k, list vars, list(a1, ..., ak)), where:
2503
+ If k = 1 then there are scalars (1x1-matrices) a1, ..., ak
2504
+ such that q is defined at a = (a1, ..., ak), i.e.,
2505
+ q.mat is invertible at a.
2506
+ If k = 0 then no such point was found.
2507
+
2508
+ NOTE: Test whether q.mat is invertible via evaluation
2509
+ at random integers in [-maxcoeff, maxcoeff].
2510
+ Stops after n tries. The list vars
2511
+ contains the nc variables which occur in q.
2512
+
2513
+ EXAMPLE: example ncrepIsRegular;
2514
+ shows an example"
2515
+ {
2516
+ list l = ncrepIsDefinedDim(q, 1, vars, n, maxcoeff);
2517
+ return (l);
2518
+ }
2519
+ example
2520
+ {
2521
+ "EXAMPLE:";
2522
+ echo = 2;
2523
+ ncInit(list("x", "y"));
2524
+ ncrat f = ncratFromString("inv(x*y-y*x)");
2525
+ ncrep q = ncrepGet(f);
2526
+ ncrepIsRegular(q, list(x, y), 10, 100);
2527
+ ncrat g = ncratFromString("inv(1+x*y-y*x)");
2528
+ ncrep r = ncrepGet(g);
2529
+ ncrepIsRegular(r, list(x, y), 10, 100);
2530
+ }
2531
+
2532
+ proc ncrepPencilGet(ncrep r, list vars)
2533
+ "USAGE: list pencil = ncrepPencilGet(r, vars);
2534
+
2535
+ RETURN: pencil = list(vars, matrices),
2536
+ where vars = list(1, x1, ..., xg) are the variables
2537
+ occurring in r and matrices = (Q0, ..., Qg) is a list of
2538
+ matrices such that
2539
+ r.mat = Q0 * x0 + ... + Qg * xg
2540
+ with x0 = 1
2541
+
2542
+ NOTE: list vars = list(x1, ..., xn) has to consist
2543
+ exactly of the nc variables occurring in f
2544
+
2545
+ EXAMPLE: example ncrepPencilGet;
2546
+ shows an example"
2547
+ {
2548
+ poly p = 1;
2549
+ list varsNew = list(p) + vars;
2550
+ list matrices = ncrepLinearPencil(r, vars);
2551
+ list l = list(varsNew, matrices);
2552
+ return (l);
2553
+ }
2554
+ example
2555
+ {
2556
+ "EXAMPLE:";
2557
+ echo = 2;
2558
+ ncInit(list("x", "y"));
2559
+ ncrat f = ncratFromString("x*y");
2560
+ ncrep r = ncrepGet(f);
2561
+ print(r.mat);
2562
+ list l = ncrepPencilGet(r, list(x, y));
2563
+ print(l[1]);
2564
+ print(l[2][1]);
2565
+ print(l[2][2]);
2566
+ print(l[2][3]);
2567
+ }
2568
+
2569
+ proc ncrepPencilCombine(list pencil)
2570
+ "USAGE: matrix Q = ncrepPencilCombine(pencil);
2571
+
2572
+ RETURN: matrix Q = Q0*x0 + ... + Qg*xg,
2573
+ where vars = list(x0, ..., xg) consists of polynomials
2574
+ and matrices = (Q0, ..., Qg) is a list of matrices
2575
+
2576
+ EXAMPLE: example ncrepPencilCombine;
2577
+ shows an example"
2578
+ {
2579
+ int g = size(pencil[1]);
2580
+ int n = ncols(pencil[2][1]);
2581
+ matrix Q[n][n];
2582
+ int i;
2583
+ for (i = 1; i <= g; i++)
2584
+ {
2585
+ Q = Q + pencil[1][i] * pencil[2][i];
2586
+ }
2587
+ return (Q);
2588
+ }
2589
+ example
2590
+ {
2591
+ "EXAMPLE:";
2592
+ echo = 2;
2593
+ ncInit(list("x", "y"));
2594
+ ncrat f = ncratFromString("x*y");
2595
+ ncrep r = ncrepGet(f);
2596
+ print(r.mat);
2597
+ list l = ncrepPencilGet(r, list(x, y));
2598
+ matrix Q = ncrepPencilCombine(l);
2599
+ print(Q);
2600
+ }
2601
+
2602
+ /*##########################################################
2603
+
2604
+ REGULAR CASE
2605
+
2606
+ ##########################################################*/
2607
+
2608
+ proc ncrepRegularZeroMinimize(ncrep q, list #)
2609
+ "USAGE: ncrep s = ncrepRegularZeroMinimize(q, l);
2610
+
2611
+ RETURN: ncrep s representing the same rational
2612
+ function as ncrep q, where s is of minimal size
2613
+
2614
+ ASSUMPTION: q is regular at zero, i.e.,
2615
+ if one substitutes in 0 for all nc variables in q
2616
+ then q.mat has to be invertible
2617
+
2618
+ NOTE: list l = list(x1, ..., xn) has to consist
2619
+ exactly of the nc variables occurring in q
2620
+
2621
+ EXAMPLE: example ncrepRegularZeroMinimize;
2622
+ shows an example"
2623
+ {
2624
+ int i;
2625
+ int g = size(#);
2626
+ int n = ncols(q.mat);
2627
+ int offset = 0;
2628
+ list k = ncrepToMonicDescriptorRealization(g, n, q, #);
2629
+
2630
+ // cut down on controllable space
2631
+ list b = calculateControllabilitySpace(g, n, k[1], k[3]);
2632
+ list c = calculateComplement(n, b);
2633
+ n = size(b);
2634
+ matrix bMat = orthogonalBase(b);
2635
+ matrix cMat = orthogonalBase(c);
2636
+ k = orthogonalTransform(bMat, cMat, k[1], k[2], k[3]);
2637
+ k = cutdown(n, offset, k[1], k[2], k[3]);
2638
+
2639
+ // cut down on observable space
2640
+ n = size(b);
2641
+ list l;
2642
+
2643
+ // switch to adjoint system
2644
+ for (i = 1; i <= g; i++)
2645
+ {
2646
+ l = l + list(transpose(k[3][i]));
2647
+ }
2648
+ list ktp = list(transpose(k[2]), transpose(k[1]), l);
2649
+
2650
+ b = calculateControllabilitySpace(g, n, ktp[1], ktp[3]);
2651
+ c = calculateComplement(n, b);
2652
+ n = size(b);
2653
+ offset = size(c);
2654
+ bMat = orthogonalBase(b);
2655
+ cMat = orthogonalBase(c);
2656
+ ktp = orthogonalTransform(cMat, bMat, ktp[1], ktp[2], ktp[3]);
2657
+ ktp = cutdown(n, offset, ktp[1], ktp[2], ktp[3]);
2658
+
2659
+ // build ncrep
2660
+ n = size(b);
2661
+ ncrep r;
2662
+ r.lvec = -1 * transpose(ktp[1]);
2663
+ r.rvec = transpose(ktp[2]);
2664
+
2665
+ matrix Q[n][n];
2666
+ Q = Q + 1;
2667
+ for (i = 1; i <= g; i++)
2668
+ {
2669
+ Q = Q - transpose(ktp[3][i]) * #[i];
2670
+ }
2671
+ r.mat = Q;
2672
+
2673
+ return (r);
2674
+ }
2675
+ example
2676
+ {
2677
+ "EXAMPLE:";
2678
+ echo = 2;
2679
+ ncInit(list("x", "y"));
2680
+ ncrat f = ncratFromString("inv(1+x*y-y*x)");
2681
+ ncrep q = ncrepGet(f);
2682
+ ncrepDim(q);
2683
+ ncrep s = ncrepRegularZeroMinimize(q, list(x, y));
2684
+ ncrepDim(s);
2685
+ s;
2686
+ }
2687
+
2688
+ proc ncrepRegularMinimize(ncrep q, list vars, list point)
2689
+ "USAGE: ncrep s = ncrepRegularMinimize(q, vars, point);
2690
+
2691
+ RETURN: ncrep s representing the same rational
2692
+ function as ncrep q, where s is of minimal size
2693
+
2694
+ ASSUMPTION: q is regular at scalar point a, i.e.,
2695
+ if one substitutes in ai for all nc variables xi in q
2696
+ then q.mat has to be invertible
2697
+
2698
+ NOTE: list vars = list(x1, ..., xn) has to consist
2699
+ exactly of the nc variables occurring in q and
2700
+ list point = list(a1, ..., an) consists of scalars
2701
+
2702
+ EXAMPLE: example ncrepRegularMinimize;
2703
+ shows an example"
2704
+ {
2705
+ int g = size(vars);
2706
+ if (not(size(point) == g))
2707
+ {
2708
+ ERROR("Lists have to be of the same size!");
2709
+ }
2710
+
2711
+ list shift, backshift;
2712
+ int i;
2713
+ poly p1, p2;
2714
+
2715
+ // point matrices?
2716
+ if (g > 0 and typeof(point[1]) == "matrix")
2717
+ {
2718
+ if (ncols(point[1]) > 1)
2719
+ {
2720
+ ERROR("Not a scalar point!");
2721
+ }
2722
+ for (i = 1; i <= g; i++)
2723
+ {
2724
+ poly z(i) = point[i][1, 1];
2725
+ }
2726
+ }
2727
+ // point scalars
2728
+ else
2729
+ {
2730
+ for (i = 1; i <= g; i++)
2731
+ {
2732
+ poly z(i) = point[i];
2733
+ }
2734
+ }
2735
+
2736
+ for (i = 1; i <= g; i++)
2737
+ {
2738
+ p1 = vars[i] - z(i);
2739
+ p2 = vars[i] + z(i);
2740
+ shift = shift + list(p1);
2741
+ backshift = backshift + list(p2);
2742
+ }
2743
+
2744
+ ncrep s = ncrepSubstitute(q, vars, shift);
2745
+ ncrep r = ncrepRegularZeroMinimize(s, vars);
2746
+ ncrep q2 = ncrepSubstitute(r, vars, backshift);
2747
+
2748
+ return (q2);
2749
+ }
2750
+ example
2751
+ {
2752
+ "EXAMPLE:";
2753
+ echo = 2;
2754
+ ncInit(list("x", "y"));
2755
+ ncrat f = ncratFromString("inv(x*y)");
2756
+ ncrep q = ncrepGet(f);
2757
+ ncrepDim(q);
2758
+ ncrep s = ncrepRegularMinimize(q, list(x, y), list(1, 1));
2759
+ ncrepDim(s);
2760
+ s;
2761
+ }
2762
+
2763
+ proc ncrepGetRegularZeroMinimal(ncrat f, list vars)
2764
+ "USAGE: ncrep q = ncrepGetRegularZeroMinimal(f, vars);
2765
+
2766
+ RETURN: q is a representation of f with
2767
+ minimal dimension
2768
+
2769
+ ASSUMPTION: f is regular at zero, i.e.,
2770
+ f(0) has to be defined
2771
+
2772
+ NOTE: list vars = list(x1, ..., xn) has to consist
2773
+ exactly of the nc variables occurring in f
2774
+
2775
+ EXAMPLE: example ncrepGetRegularZeroMinimal;
2776
+ shows an example"
2777
+ {
2778
+ ncrep q = ncrepGet(f);
2779
+ ncrep q2 = ncrepRegularZeroMinimize(q, vars);
2780
+ return (q2);
2781
+ }
2782
+ example
2783
+ {
2784
+ "EXAMPLE:";
2785
+ echo = 2;
2786
+ ncInit(list("x", "y"));
2787
+ ncrat f = ncratFromString("inv(1+x*y-y*x)");
2788
+ list vars = list(x, y);
2789
+ ncrep q = ncrepGetRegularZeroMinimal(f, vars);
2790
+ q;
2791
+ }
2792
+
2793
+ proc ncrepGetRegularMinimal(ncrat f, list vars, list point)
2794
+ "USAGE: ncrep q = ncrepGetRegularMinimal(f, vars, point);
2795
+
2796
+ RETURN: q is a representation of f with
2797
+ minimal dimension
2798
+
2799
+ ASSUMPTION: f is regular at point, i.e.,
2800
+ f(point) has to be defined
2801
+
2802
+ NOTE: list vars = list(x1, ..., xn) has to consist
2803
+ exactly of the nc variables occurring in f and
2804
+ list point = (p1, ..., pn) of scalars such that
2805
+ f(point) is defined
2806
+
2807
+ EXAMPLE: example ncrepGetRegularMinimal;
2808
+ shows an example"
2809
+ {
2810
+ ncrep q = ncrepGet(f);
2811
+ ncrep q2 = ncrepRegularMinimize(q, vars, point);
2812
+ return (q2);
2813
+ }
2814
+ example
2815
+ {
2816
+ "EXAMPLE: (Hua's identity)";
2817
+ echo = 2;
2818
+ // We want to prove the Hua's identity, telling that for two
2819
+ // invertible elements x,y from a division ring, one has
2820
+ // inv(x+x*inv(y)*x)+inv(x+y) = inv(x)
2821
+ // where inv(t) stands for the two-sided inverse of t
2822
+ ncInit(list("x", "y"));
2823
+ ncrat f = ncratFromString("inv(x+x*inv(y)*x)+inv(x+y)-inv(x)");
2824
+ print(f);
2825
+ ncrep r = ncrepGet(f);
2826
+ ncrepDim(r);
2827
+ ncrep s = ncrepGetRegularMinimal(f, list(x, y), list(1, 1));
2828
+ ncrepDim(s);
2829
+ print(s);
2830
+ // since s represents the zero element, Hua's identity holds.
2831
+ }
2832
+
2833
+ /*##########################################################
2834
+
2835
+ END REGULAR CASE
2836
+
2837
+ ##########################################################*/
2838
+
2839
+ /*##########################################################
2840
+
2841
+ END NCREP
2842
+
2843
+ ##########################################################*/
2844
+
2845
+ /*##########################################################
2846
+
2847
+ END NON-STATIC PROCEDURES
2848
+
2849
+ ##########################################################*/