passagemath-singular 10.6.31rc3__cp314-cp314-macosx_13_0_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-singular might be problematic. Click here for more details.
- PySingular.cpython-314-darwin.so +0 -0
- passagemath_singular-10.6.31rc3.dist-info/METADATA +183 -0
- passagemath_singular-10.6.31rc3.dist-info/RECORD +490 -0
- passagemath_singular-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_singular-10.6.31rc3.dist-info/top_level.txt +3 -0
- passagemath_singular.dylibs/libSingular-4.4.1.dylib +0 -0
- passagemath_singular.dylibs/libcddgmp.0.dylib +0 -0
- passagemath_singular.dylibs/libfactory-4.4.1.dylib +0 -0
- passagemath_singular.dylibs/libflint.21.0.dylib +0 -0
- passagemath_singular.dylibs/libgf2x.3.dylib +0 -0
- passagemath_singular.dylibs/libgfortran.5.dylib +0 -0
- passagemath_singular.dylibs/libgmp.10.dylib +0 -0
- passagemath_singular.dylibs/libgsl.28.dylib +0 -0
- passagemath_singular.dylibs/libmpfr.6.dylib +0 -0
- passagemath_singular.dylibs/libntl.44.dylib +0 -0
- passagemath_singular.dylibs/libomalloc-0.9.6.dylib +0 -0
- passagemath_singular.dylibs/libopenblasp-r0.3.29.dylib +0 -0
- passagemath_singular.dylibs/libpolys-4.4.1.dylib +0 -0
- passagemath_singular.dylibs/libquadmath.0.dylib +0 -0
- passagemath_singular.dylibs/libreadline.8.2.dylib +0 -0
- passagemath_singular.dylibs/libsingular_resources-4.4.1.dylib +0 -0
- sage/algebras/all__sagemath_singular.py +3 -0
- sage/algebras/fusion_rings/all.py +19 -0
- sage/algebras/fusion_rings/f_matrix.py +2448 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.cpython-314-darwin.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pxd +5 -0
- sage/algebras/fusion_rings/fast_parallel_fmats_methods.pyx +538 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.cpython-314-darwin.so +0 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pxd +3 -0
- sage/algebras/fusion_rings/fast_parallel_fusion_ring_braid_repn.pyx +331 -0
- sage/algebras/fusion_rings/fusion_double.py +899 -0
- sage/algebras/fusion_rings/fusion_ring.py +1580 -0
- sage/algebras/fusion_rings/poly_tup_engine.cpython-314-darwin.so +0 -0
- sage/algebras/fusion_rings/poly_tup_engine.pxd +24 -0
- sage/algebras/fusion_rings/poly_tup_engine.pyx +579 -0
- sage/algebras/fusion_rings/shm_managers.cpython-314-darwin.so +0 -0
- sage/algebras/fusion_rings/shm_managers.pxd +24 -0
- sage/algebras/fusion_rings/shm_managers.pyx +780 -0
- sage/algebras/letterplace/all.py +1 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.cpython-314-darwin.so +0 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pxd +18 -0
- sage/algebras/letterplace/free_algebra_element_letterplace.pyx +755 -0
- sage/algebras/letterplace/free_algebra_letterplace.cpython-314-darwin.so +0 -0
- sage/algebras/letterplace/free_algebra_letterplace.pxd +35 -0
- sage/algebras/letterplace/free_algebra_letterplace.pyx +914 -0
- sage/algebras/letterplace/letterplace_ideal.cpython-314-darwin.so +0 -0
- sage/algebras/letterplace/letterplace_ideal.pyx +408 -0
- sage/algebras/quatalg/all.py +2 -0
- sage/algebras/quatalg/quaternion_algebra.py +4778 -0
- sage/algebras/quatalg/quaternion_algebra_cython.cpython-314-darwin.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_cython.pyx +261 -0
- sage/algebras/quatalg/quaternion_algebra_element.cpython-314-darwin.so +0 -0
- sage/algebras/quatalg/quaternion_algebra_element.pxd +29 -0
- sage/algebras/quatalg/quaternion_algebra_element.pyx +2176 -0
- sage/all__sagemath_singular.py +11 -0
- sage/ext_data/all__sagemath_singular.py +1 -0
- sage/ext_data/singular/function_field/core.lib +98 -0
- sage/interfaces/all__sagemath_singular.py +1 -0
- sage/interfaces/singular.py +2835 -0
- sage/libs/all__sagemath_singular.py +1 -0
- sage/libs/singular/__init__.py +1 -0
- sage/libs/singular/decl.pxd +1168 -0
- sage/libs/singular/function.cpython-314-darwin.so +0 -0
- sage/libs/singular/function.pxd +87 -0
- sage/libs/singular/function.pyx +1901 -0
- sage/libs/singular/function_factory.py +61 -0
- sage/libs/singular/groebner_strategy.cpython-314-darwin.so +0 -0
- sage/libs/singular/groebner_strategy.pxd +22 -0
- sage/libs/singular/groebner_strategy.pyx +582 -0
- sage/libs/singular/option.cpython-314-darwin.so +0 -0
- sage/libs/singular/option.pyx +671 -0
- sage/libs/singular/polynomial.cpython-314-darwin.so +0 -0
- sage/libs/singular/polynomial.pxd +39 -0
- sage/libs/singular/polynomial.pyx +661 -0
- sage/libs/singular/ring.cpython-314-darwin.so +0 -0
- sage/libs/singular/ring.pxd +58 -0
- sage/libs/singular/ring.pyx +893 -0
- sage/libs/singular/singular.cpython-314-darwin.so +0 -0
- sage/libs/singular/singular.pxd +72 -0
- sage/libs/singular/singular.pyx +1944 -0
- sage/libs/singular/standard_options.py +145 -0
- sage/matrix/all__sagemath_singular.py +1 -0
- sage/matrix/matrix_mpolynomial_dense.cpython-314-darwin.so +0 -0
- sage/matrix/matrix_mpolynomial_dense.pxd +7 -0
- sage/matrix/matrix_mpolynomial_dense.pyx +615 -0
- sage/rings/all__sagemath_singular.py +1 -0
- sage/rings/function_field/all__sagemath_singular.py +1 -0
- sage/rings/function_field/derivations_polymod.py +911 -0
- sage/rings/function_field/element_polymod.cpython-314-darwin.so +0 -0
- sage/rings/function_field/element_polymod.pyx +406 -0
- sage/rings/function_field/function_field_polymod.py +2611 -0
- sage/rings/function_field/ideal_polymod.py +1775 -0
- sage/rings/function_field/order_polymod.py +1475 -0
- sage/rings/function_field/place_polymod.py +681 -0
- sage/rings/polynomial/all__sagemath_singular.py +1 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.cpython-314-darwin.so +0 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pxd +5 -0
- sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx +339 -0
- sage/rings/polynomial/multi_polynomial_libsingular.cpython-314-darwin.so +0 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pxd +30 -0
- sage/rings/polynomial/multi_polynomial_libsingular.pyx +6277 -0
- sage/rings/polynomial/plural.cpython-314-darwin.so +0 -0
- sage/rings/polynomial/plural.pxd +48 -0
- sage/rings/polynomial/plural.pyx +3171 -0
- sage/symbolic/all__sagemath_singular.py +1 -0
- sage/symbolic/comparison_impl.pxi +428 -0
- sage/symbolic/constants_c_impl.pxi +178 -0
- sage/symbolic/expression.cpython-314-darwin.so +0 -0
- sage/symbolic/expression.pxd +7 -0
- sage/symbolic/expression.pyx +14200 -0
- sage/symbolic/getitem_impl.pxi +202 -0
- sage/symbolic/pynac.pxi +572 -0
- sage/symbolic/pynac_constant_impl.pxi +133 -0
- sage/symbolic/pynac_function_impl.pxi +206 -0
- sage/symbolic/pynac_impl.pxi +2576 -0
- sage/symbolic/pynac_wrap.h +124 -0
- sage/symbolic/series_impl.pxi +272 -0
- sage/symbolic/substitution_map_impl.pxi +94 -0
- sage_wheels/bin/ESingular +0 -0
- sage_wheels/bin/Singular +0 -0
- sage_wheels/bin/TSingular +0 -0
- sage_wheels/lib/singular/MOD/cohomo.la +41 -0
- sage_wheels/lib/singular/MOD/cohomo.so +0 -0
- sage_wheels/lib/singular/MOD/customstd.la +41 -0
- sage_wheels/lib/singular/MOD/customstd.so +0 -0
- sage_wheels/lib/singular/MOD/freealgebra.la +41 -0
- sage_wheels/lib/singular/MOD/freealgebra.so +0 -0
- sage_wheels/lib/singular/MOD/gfanlib.la +41 -0
- sage_wheels/lib/singular/MOD/gfanlib.so +0 -0
- sage_wheels/lib/singular/MOD/gitfan.la +41 -0
- sage_wheels/lib/singular/MOD/gitfan.so +0 -0
- sage_wheels/lib/singular/MOD/interval.la +41 -0
- sage_wheels/lib/singular/MOD/interval.so +0 -0
- sage_wheels/lib/singular/MOD/loctriv.la +41 -0
- sage_wheels/lib/singular/MOD/loctriv.so +0 -0
- sage_wheels/lib/singular/MOD/machinelearning.la +41 -0
- sage_wheels/lib/singular/MOD/machinelearning.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldGeneral.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldIndep.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldQ.so +0 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.la +41 -0
- sage_wheels/lib/singular/MOD/p_Procs_FieldZp.so +0 -0
- sage_wheels/lib/singular/MOD/partialgb.la +41 -0
- sage_wheels/lib/singular/MOD/partialgb.so +0 -0
- sage_wheels/lib/singular/MOD/pyobject.la +41 -0
- sage_wheels/lib/singular/MOD/pyobject.so +0 -0
- sage_wheels/lib/singular/MOD/singmathic.la +41 -0
- sage_wheels/lib/singular/MOD/singmathic.so +0 -0
- sage_wheels/lib/singular/MOD/sispasm.la +41 -0
- sage_wheels/lib/singular/MOD/sispasm.so +0 -0
- sage_wheels/lib/singular/MOD/subsets.la +41 -0
- sage_wheels/lib/singular/MOD/subsets.so +0 -0
- sage_wheels/lib/singular/MOD/systhreads.la +41 -0
- sage_wheels/lib/singular/MOD/systhreads.so +0 -0
- sage_wheels/lib/singular/MOD/syzextra.la +41 -0
- sage_wheels/lib/singular/MOD/syzextra.so +0 -0
- sage_wheels/libexec/singular/MOD/change_cost +0 -0
- sage_wheels/libexec/singular/MOD/singularsurf +11 -0
- sage_wheels/libexec/singular/MOD/singularsurf_jupyter +9 -0
- sage_wheels/libexec/singular/MOD/singularsurf_win +10 -0
- sage_wheels/libexec/singular/MOD/solve_IP +0 -0
- sage_wheels/libexec/singular/MOD/surfex +16 -0
- sage_wheels/libexec/singular/MOD/toric_ideal +0 -0
- sage_wheels/share/factory/gftables/10201 +342 -0
- sage_wheels/share/factory/gftables/1024 +37 -0
- sage_wheels/share/factory/gftables/10609 +356 -0
- sage_wheels/share/factory/gftables/11449 +384 -0
- sage_wheels/share/factory/gftables/11881 +398 -0
- sage_wheels/share/factory/gftables/121 +6 -0
- sage_wheels/share/factory/gftables/12167 +408 -0
- sage_wheels/share/factory/gftables/125 +7 -0
- sage_wheels/share/factory/gftables/12769 +428 -0
- sage_wheels/share/factory/gftables/128 +7 -0
- sage_wheels/share/factory/gftables/1331 +47 -0
- sage_wheels/share/factory/gftables/1369 +48 -0
- sage_wheels/share/factory/gftables/14641 +490 -0
- sage_wheels/share/factory/gftables/15625 +523 -0
- sage_wheels/share/factory/gftables/16 +3 -0
- sage_wheels/share/factory/gftables/16129 +540 -0
- sage_wheels/share/factory/gftables/16384 +549 -0
- sage_wheels/share/factory/gftables/16807 +563 -0
- sage_wheels/share/factory/gftables/1681 +58 -0
- sage_wheels/share/factory/gftables/169 +8 -0
- sage_wheels/share/factory/gftables/17161 +574 -0
- sage_wheels/share/factory/gftables/1849 +64 -0
- sage_wheels/share/factory/gftables/18769 +628 -0
- sage_wheels/share/factory/gftables/19321 +646 -0
- sage_wheels/share/factory/gftables/19683 +659 -0
- sage_wheels/share/factory/gftables/2048 +71 -0
- sage_wheels/share/factory/gftables/2187 +75 -0
- sage_wheels/share/factory/gftables/2197 +76 -0
- sage_wheels/share/factory/gftables/2209 +76 -0
- sage_wheels/share/factory/gftables/22201 +742 -0
- sage_wheels/share/factory/gftables/22801 +762 -0
- sage_wheels/share/factory/gftables/2401 +82 -0
- sage_wheels/share/factory/gftables/243 +11 -0
- sage_wheels/share/factory/gftables/24389 +815 -0
- sage_wheels/share/factory/gftables/24649 +824 -0
- sage_wheels/share/factory/gftables/25 +3 -0
- sage_wheels/share/factory/gftables/256 +11 -0
- sage_wheels/share/factory/gftables/26569 +888 -0
- sage_wheels/share/factory/gftables/27 +3 -0
- sage_wheels/share/factory/gftables/27889 +932 -0
- sage_wheels/share/factory/gftables/2809 +96 -0
- sage_wheels/share/factory/gftables/28561 +954 -0
- sage_wheels/share/factory/gftables/289 +12 -0
- sage_wheels/share/factory/gftables/29791 +995 -0
- sage_wheels/share/factory/gftables/29929 +1000 -0
- sage_wheels/share/factory/gftables/3125 +107 -0
- sage_wheels/share/factory/gftables/32 +4 -0
- sage_wheels/share/factory/gftables/32041 +1070 -0
- sage_wheels/share/factory/gftables/32761 +1094 -0
- sage_wheels/share/factory/gftables/32768 +1095 -0
- sage_wheels/share/factory/gftables/343 +14 -0
- sage_wheels/share/factory/gftables/3481 +118 -0
- sage_wheels/share/factory/gftables/361 +14 -0
- sage_wheels/share/factory/gftables/36481 +1218 -0
- sage_wheels/share/factory/gftables/3721 +126 -0
- sage_wheels/share/factory/gftables/37249 +1244 -0
- sage_wheels/share/factory/gftables/38809 +1296 -0
- sage_wheels/share/factory/gftables/39601 +1322 -0
- sage_wheels/share/factory/gftables/4 +3 -0
- sage_wheels/share/factory/gftables/4096 +139 -0
- sage_wheels/share/factory/gftables/44521 +1486 -0
- sage_wheels/share/factory/gftables/4489 +152 -0
- sage_wheels/share/factory/gftables/49 +4 -0
- sage_wheels/share/factory/gftables/4913 +166 -0
- sage_wheels/share/factory/gftables/49729 +1660 -0
- sage_wheels/share/factory/gftables/5041 +170 -0
- sage_wheels/share/factory/gftables/50653 +1691 -0
- sage_wheels/share/factory/gftables/512 +20 -0
- sage_wheels/share/factory/gftables/51529 +1720 -0
- sage_wheels/share/factory/gftables/52441 +1750 -0
- sage_wheels/share/factory/gftables/529 +20 -0
- sage_wheels/share/factory/gftables/5329 +180 -0
- sage_wheels/share/factory/gftables/54289 +1812 -0
- sage_wheels/share/factory/gftables/57121 +1906 -0
- sage_wheels/share/factory/gftables/58081 +1938 -0
- sage_wheels/share/factory/gftables/59049 +1971 -0
- sage_wheels/share/factory/gftables/6241 +210 -0
- sage_wheels/share/factory/gftables/625 +23 -0
- sage_wheels/share/factory/gftables/63001 +2102 -0
- sage_wheels/share/factory/gftables/64 +5 -0
- sage_wheels/share/factory/gftables/6561 +221 -0
- sage_wheels/share/factory/gftables/6859 +231 -0
- sage_wheels/share/factory/gftables/6889 +232 -0
- sage_wheels/share/factory/gftables/729 +27 -0
- sage_wheels/share/factory/gftables/7921 +266 -0
- sage_wheels/share/factory/gftables/8 +3 -0
- sage_wheels/share/factory/gftables/81 +5 -0
- sage_wheels/share/factory/gftables/8192 +276 -0
- sage_wheels/share/factory/gftables/841 +30 -0
- sage_wheels/share/factory/gftables/9 +3 -0
- sage_wheels/share/factory/gftables/9409 +316 -0
- sage_wheels/share/factory/gftables/961 +34 -0
- sage_wheels/share/info/singular.info +191898 -0
- sage_wheels/share/singular/LIB/GND.lib +1359 -0
- sage_wheels/share/singular/LIB/JMBTest.lib +976 -0
- sage_wheels/share/singular/LIB/JMSConst.lib +1363 -0
- sage_wheels/share/singular/LIB/KVequiv.lib +699 -0
- sage_wheels/share/singular/LIB/SingularityDBM.lib +491 -0
- sage_wheels/share/singular/LIB/VecField.lib +1542 -0
- sage_wheels/share/singular/LIB/absfact.lib +959 -0
- sage_wheels/share/singular/LIB/ainvar.lib +730 -0
- sage_wheels/share/singular/LIB/aksaka.lib +419 -0
- sage_wheels/share/singular/LIB/alexpoly.lib +2542 -0
- sage_wheels/share/singular/LIB/algebra.lib +1193 -0
- sage_wheels/share/singular/LIB/all.lib +136 -0
- sage_wheels/share/singular/LIB/arcpoint.lib +514 -0
- sage_wheels/share/singular/LIB/arnold.lib +4553 -0
- sage_wheels/share/singular/LIB/arnoldclassify.lib +2058 -0
- sage_wheels/share/singular/LIB/arr.lib +3486 -0
- sage_wheels/share/singular/LIB/assprimeszerodim.lib +755 -0
- sage_wheels/share/singular/LIB/autgradalg.lib +3361 -0
- sage_wheels/share/singular/LIB/bfun.lib +1964 -0
- sage_wheels/share/singular/LIB/bimodules.lib +774 -0
- sage_wheels/share/singular/LIB/brillnoether.lib +226 -0
- sage_wheels/share/singular/LIB/brnoeth.lib +5017 -0
- sage_wheels/share/singular/LIB/central.lib +2169 -0
- sage_wheels/share/singular/LIB/chern.lib +4162 -0
- sage_wheels/share/singular/LIB/cimonom.lib +571 -0
- sage_wheels/share/singular/LIB/cisimplicial.lib +1835 -0
- sage_wheels/share/singular/LIB/classify.lib +3239 -0
- sage_wheels/share/singular/LIB/classify2.lib +1462 -0
- sage_wheels/share/singular/LIB/classifyMapGerms.lib +1515 -0
- sage_wheels/share/singular/LIB/classify_aeq.lib +3253 -0
- sage_wheels/share/singular/LIB/classifyceq.lib +2092 -0
- sage_wheels/share/singular/LIB/classifyci.lib +1133 -0
- sage_wheels/share/singular/LIB/combinat.lib +91 -0
- sage_wheels/share/singular/LIB/compregb.lib +276 -0
- sage_wheels/share/singular/LIB/control.lib +1636 -0
- sage_wheels/share/singular/LIB/crypto.lib +3795 -0
- sage_wheels/share/singular/LIB/curveInv.lib +667 -0
- sage_wheels/share/singular/LIB/curvepar.lib +1817 -0
- sage_wheels/share/singular/LIB/customstd.lib +100 -0
- sage_wheels/share/singular/LIB/deRham.lib +5979 -0
- sage_wheels/share/singular/LIB/decodegb.lib +2134 -0
- sage_wheels/share/singular/LIB/decomp.lib +1655 -0
- sage_wheels/share/singular/LIB/deflation.lib +872 -0
- sage_wheels/share/singular/LIB/deform.lib +925 -0
- sage_wheels/share/singular/LIB/difform.lib +3055 -0
- sage_wheels/share/singular/LIB/divisors.lib +750 -0
- sage_wheels/share/singular/LIB/dmod.lib +5817 -0
- sage_wheels/share/singular/LIB/dmodapp.lib +3269 -0
- sage_wheels/share/singular/LIB/dmodideal.lib +1211 -0
- sage_wheels/share/singular/LIB/dmodloc.lib +2645 -0
- sage_wheels/share/singular/LIB/dmodvar.lib +818 -0
- sage_wheels/share/singular/LIB/dummy.lib +17 -0
- sage_wheels/share/singular/LIB/elim.lib +1009 -0
- sage_wheels/share/singular/LIB/ellipticcovers.lib +548 -0
- sage_wheels/share/singular/LIB/enumpoints.lib +146 -0
- sage_wheels/share/singular/LIB/equising.lib +2127 -0
- sage_wheels/share/singular/LIB/ffmodstd.lib +2384 -0
- sage_wheels/share/singular/LIB/ffsolve.lib +1289 -0
- sage_wheels/share/singular/LIB/findifs.lib +778 -0
- sage_wheels/share/singular/LIB/finitediff.lib +1768 -0
- sage_wheels/share/singular/LIB/finvar.lib +7989 -0
- sage_wheels/share/singular/LIB/fpadim.lib +2429 -0
- sage_wheels/share/singular/LIB/fpalgebras.lib +1666 -0
- sage_wheels/share/singular/LIB/fpaprops.lib +1462 -0
- sage_wheels/share/singular/LIB/freegb.lib +3853 -0
- sage_wheels/share/singular/LIB/general.lib +1350 -0
- sage_wheels/share/singular/LIB/gfan.lib +1768 -0
- sage_wheels/share/singular/LIB/gitfan.lib +3130 -0
- sage_wheels/share/singular/LIB/gkdim.lib +99 -0
- sage_wheels/share/singular/LIB/gmspoly.lib +589 -0
- sage_wheels/share/singular/LIB/gmssing.lib +1739 -0
- sage_wheels/share/singular/LIB/goettsche.lib +909 -0
- sage_wheels/share/singular/LIB/graal.lib +1366 -0
- sage_wheels/share/singular/LIB/gradedModules.lib +2541 -0
- sage_wheels/share/singular/LIB/graphics.lib +360 -0
- sage_wheels/share/singular/LIB/grobcov.lib +7706 -0
- sage_wheels/share/singular/LIB/groups.lib +1123 -0
- sage_wheels/share/singular/LIB/grwalk.lib +507 -0
- sage_wheels/share/singular/LIB/hdepth.lib +194 -0
- sage_wheels/share/singular/LIB/help.cnf +57 -0
- sage_wheels/share/singular/LIB/hess.lib +1946 -0
- sage_wheels/share/singular/LIB/hnoether.lib +4292 -0
- sage_wheels/share/singular/LIB/hodge.lib +400 -0
- sage_wheels/share/singular/LIB/homolog.lib +1965 -0
- sage_wheels/share/singular/LIB/hyperel.lib +975 -0
- sage_wheels/share/singular/LIB/inout.lib +679 -0
- sage_wheels/share/singular/LIB/integralbasis.lib +6224 -0
- sage_wheels/share/singular/LIB/interval.lib +1418 -0
- sage_wheels/share/singular/LIB/intprog.lib +778 -0
- sage_wheels/share/singular/LIB/invar.lib +443 -0
- sage_wheels/share/singular/LIB/involut.lib +980 -0
- sage_wheels/share/singular/LIB/jacobson.lib +1215 -0
- sage_wheels/share/singular/LIB/kskernel.lib +534 -0
- sage_wheels/share/singular/LIB/latex.lib +3146 -0
- sage_wheels/share/singular/LIB/lejeune.lib +651 -0
- sage_wheels/share/singular/LIB/linalg.lib +2040 -0
- sage_wheels/share/singular/LIB/locnormal.lib +212 -0
- sage_wheels/share/singular/LIB/lrcalc.lib +526 -0
- sage_wheels/share/singular/LIB/makedbm.lib +294 -0
- sage_wheels/share/singular/LIB/mathml.lib +813 -0
- sage_wheels/share/singular/LIB/matrix.lib +1372 -0
- sage_wheels/share/singular/LIB/maxlike.lib +1132 -0
- sage_wheels/share/singular/LIB/methods.lib +212 -0
- sage_wheels/share/singular/LIB/moddiq.lib +322 -0
- sage_wheels/share/singular/LIB/modfinduni.lib +181 -0
- sage_wheels/share/singular/LIB/modnormal.lib +218 -0
- sage_wheels/share/singular/LIB/modprimdec.lib +1278 -0
- sage_wheels/share/singular/LIB/modquotient.lib +269 -0
- sage_wheels/share/singular/LIB/modstd.lib +1024 -0
- sage_wheels/share/singular/LIB/modular.lib +545 -0
- sage_wheels/share/singular/LIB/modules.lib +2561 -0
- sage_wheels/share/singular/LIB/modwalk.lib +609 -0
- sage_wheels/share/singular/LIB/mondromy.lib +1016 -0
- sage_wheels/share/singular/LIB/monomialideal.lib +3851 -0
- sage_wheels/share/singular/LIB/mprimdec.lib +2353 -0
- sage_wheels/share/singular/LIB/mregular.lib +1863 -0
- sage_wheels/share/singular/LIB/multigrading.lib +5629 -0
- sage_wheels/share/singular/LIB/ncHilb.lib +777 -0
- sage_wheels/share/singular/LIB/ncModslimgb.lib +791 -0
- sage_wheels/share/singular/LIB/ncalg.lib +16311 -0
- sage_wheels/share/singular/LIB/ncall.lib +31 -0
- sage_wheels/share/singular/LIB/ncdecomp.lib +468 -0
- sage_wheels/share/singular/LIB/ncfactor.lib +13371 -0
- sage_wheels/share/singular/LIB/ncfrac.lib +1023 -0
- sage_wheels/share/singular/LIB/nchilbert.lib +448 -0
- sage_wheels/share/singular/LIB/nchomolog.lib +759 -0
- sage_wheels/share/singular/LIB/ncloc.lib +361 -0
- sage_wheels/share/singular/LIB/ncpreim.lib +795 -0
- sage_wheels/share/singular/LIB/ncrat.lib +2849 -0
- sage_wheels/share/singular/LIB/nctools.lib +1887 -0
- sage_wheels/share/singular/LIB/nets.lib +1456 -0
- sage_wheels/share/singular/LIB/nfmodstd.lib +1000 -0
- sage_wheels/share/singular/LIB/nfmodsyz.lib +732 -0
- sage_wheels/share/singular/LIB/noether.lib +1106 -0
- sage_wheels/share/singular/LIB/normal.lib +8700 -0
- sage_wheels/share/singular/LIB/normaliz.lib +2226 -0
- sage_wheels/share/singular/LIB/ntsolve.lib +362 -0
- sage_wheels/share/singular/LIB/numerAlg.lib +560 -0
- sage_wheels/share/singular/LIB/numerDecom.lib +2261 -0
- sage_wheels/share/singular/LIB/olga.lib +1933 -0
- sage_wheels/share/singular/LIB/orbitparam.lib +351 -0
- sage_wheels/share/singular/LIB/parallel.lib +319 -0
- sage_wheels/share/singular/LIB/paraplanecurves.lib +3110 -0
- sage_wheels/share/singular/LIB/perron.lib +202 -0
- sage_wheels/share/singular/LIB/pfd.lib +2223 -0
- sage_wheels/share/singular/LIB/phindex.lib +642 -0
- sage_wheels/share/singular/LIB/pointid.lib +673 -0
- sage_wheels/share/singular/LIB/polybori.lib +1430 -0
- sage_wheels/share/singular/LIB/polyclass.lib +525 -0
- sage_wheels/share/singular/LIB/polylib.lib +1174 -0
- sage_wheels/share/singular/LIB/polymake.lib +1902 -0
- sage_wheels/share/singular/LIB/presolve.lib +1533 -0
- sage_wheels/share/singular/LIB/primdec.lib +9576 -0
- sage_wheels/share/singular/LIB/primdecint.lib +1782 -0
- sage_wheels/share/singular/LIB/primitiv.lib +401 -0
- sage_wheels/share/singular/LIB/puiseuxexpansions.lib +1631 -0
- sage_wheels/share/singular/LIB/purityfiltration.lib +960 -0
- sage_wheels/share/singular/LIB/qhmoduli.lib +1561 -0
- sage_wheels/share/singular/LIB/qmatrix.lib +293 -0
- sage_wheels/share/singular/LIB/random.lib +455 -0
- sage_wheels/share/singular/LIB/ratgb.lib +489 -0
- sage_wheels/share/singular/LIB/realclassify.lib +5759 -0
- sage_wheels/share/singular/LIB/realizationMatroids.lib +772 -0
- sage_wheels/share/singular/LIB/realrad.lib +1197 -0
- sage_wheels/share/singular/LIB/recover.lib +2628 -0
- sage_wheels/share/singular/LIB/redcgs.lib +3984 -0
- sage_wheels/share/singular/LIB/reesclos.lib +465 -0
- sage_wheels/share/singular/LIB/resbinomial.lib +2802 -0
- sage_wheels/share/singular/LIB/resgraph.lib +789 -0
- sage_wheels/share/singular/LIB/resjung.lib +820 -0
- sage_wheels/share/singular/LIB/resolve.lib +5110 -0
- sage_wheels/share/singular/LIB/resources.lib +170 -0
- sage_wheels/share/singular/LIB/reszeta.lib +5473 -0
- sage_wheels/share/singular/LIB/ring.lib +1328 -0
- sage_wheels/share/singular/LIB/ringgb.lib +343 -0
- sage_wheels/share/singular/LIB/rinvar.lib +1153 -0
- sage_wheels/share/singular/LIB/rootisolation.lib +1481 -0
- sage_wheels/share/singular/LIB/rootsmr.lib +709 -0
- sage_wheels/share/singular/LIB/rootsur.lib +886 -0
- sage_wheels/share/singular/LIB/rstandard.lib +607 -0
- sage_wheels/share/singular/LIB/rwalk.lib +336 -0
- sage_wheels/share/singular/LIB/sagbi.lib +1353 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz.lib +1622 -0
- sage_wheels/share/singular/LIB/sagbiNormaliz0.lib +1498 -0
- sage_wheels/share/singular/LIB/sagbigrob.lib +449 -0
- sage_wheels/share/singular/LIB/schreyer.lib +321 -0
- sage_wheels/share/singular/LIB/schubert.lib +2551 -0
- sage_wheels/share/singular/LIB/sets.lib +524 -0
- sage_wheels/share/singular/LIB/sheafcoh.lib +1663 -0
- sage_wheels/share/singular/LIB/signcond.lib +437 -0
- sage_wheels/share/singular/LIB/sing.lib +1094 -0
- sage_wheels/share/singular/LIB/sing4ti2.lib +419 -0
- sage_wheels/share/singular/LIB/solve.lib +2243 -0
- sage_wheels/share/singular/LIB/spcurve.lib +1077 -0
- sage_wheels/share/singular/LIB/spectrum.lib +62 -0
- sage_wheels/share/singular/LIB/sresext.lib +757 -0
- sage_wheels/share/singular/LIB/ssi.lib +143 -0
- sage_wheels/share/singular/LIB/standard.lib +2769 -0
- sage_wheels/share/singular/LIB/stanleyreisner.lib +473 -0
- sage_wheels/share/singular/LIB/stdmodule.lib +547 -0
- sage_wheels/share/singular/LIB/stratify.lib +1070 -0
- sage_wheels/share/singular/LIB/surf.lib +506 -0
- sage_wheels/share/singular/LIB/surf_jupyter.lib +223 -0
- sage_wheels/share/singular/LIB/surfacesignature.lib +522 -0
- sage_wheels/share/singular/LIB/surfex.lib +1462 -0
- sage_wheels/share/singular/LIB/swalk.lib +877 -0
- sage_wheels/share/singular/LIB/symodstd.lib +1570 -0
- sage_wheels/share/singular/LIB/systhreads.lib +74 -0
- sage_wheels/share/singular/LIB/tasks.lib +1324 -0
- sage_wheels/share/singular/LIB/tateProdCplxNegGrad.lib +2412 -0
- sage_wheels/share/singular/LIB/teachstd.lib +858 -0
- sage_wheels/share/singular/LIB/template.lib +116 -0
- sage_wheels/share/singular/LIB/toric.lib +1119 -0
- sage_wheels/share/singular/LIB/transformation.lib +116 -0
- sage_wheels/share/singular/LIB/triang.lib +1197 -0
- sage_wheels/share/singular/LIB/tropical.lib +8741 -0
- sage_wheels/share/singular/LIB/tropicalEllipticCovers.lib +2922 -0
- sage_wheels/share/singular/LIB/tropicalNewton.lib +1128 -0
- sage_wheels/share/singular/LIB/tst.lib +1108 -0
- sage_wheels/share/singular/LIB/weierstr.lib +241 -0
- sage_wheels/share/singular/LIB/zeroset.lib +1478 -0
- sage_wheels/share/singular/emacs/.emacs-general +184 -0
- sage_wheels/share/singular/emacs/.emacs-singular +234 -0
- sage_wheels/share/singular/emacs/COPYING +44 -0
- sage_wheels/share/singular/emacs/cmd-cmpl.el +241 -0
- sage_wheels/share/singular/emacs/ex-cmpl.el +1681 -0
- sage_wheels/share/singular/emacs/hlp-cmpl.el +4318 -0
- sage_wheels/share/singular/emacs/lib-cmpl.el +179 -0
- sage_wheels/share/singular/emacs/singular.el +4273 -0
- sage_wheels/share/singular/emacs/singular.xpm +39 -0
- sage_wheels/share/singular/singular.idx +5002 -0
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-singular
|
|
2
|
+
"""
|
|
3
|
+
Dense matrices over multivariate polynomials over fields
|
|
4
|
+
|
|
5
|
+
This implementation inherits from Matrix_generic_dense, i.e. it is not
|
|
6
|
+
optimized for speed only some methods were added.
|
|
7
|
+
|
|
8
|
+
AUTHOR:
|
|
9
|
+
|
|
10
|
+
* Martin Albrecht <malb@informatik.uni-bremen.de>
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# ****************************************************************************
|
|
14
|
+
# Copyright (C) 2013 Martin Albrecht <malb@informatik.uni-bremen.de>
|
|
15
|
+
#
|
|
16
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
17
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
18
|
+
# the License, or (at your option) any later version.
|
|
19
|
+
# https://www.gnu.org/licenses/
|
|
20
|
+
# ****************************************************************************
|
|
21
|
+
from sage.categories.fields import Fields
|
|
22
|
+
from sage.matrix.matrix_generic_dense cimport Matrix_generic_dense
|
|
23
|
+
from sage.matrix.matrix2 cimport Matrix
|
|
24
|
+
|
|
25
|
+
from sage.rings.polynomial.multi_polynomial_libsingular cimport MPolynomialRing_libsingular
|
|
26
|
+
from sage.rings.polynomial.polynomial_singular_interface import can_convert_to_singular
|
|
27
|
+
|
|
28
|
+
from sage.libs.singular.function import singular_function
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
cdef class Matrix_mpolynomial_dense(Matrix_generic_dense):
|
|
32
|
+
"""
|
|
33
|
+
Dense matrix over a multivariate polynomial ring over a field.
|
|
34
|
+
"""
|
|
35
|
+
def echelon_form(self, algorithm='row_reduction', **kwds):
|
|
36
|
+
"""
|
|
37
|
+
Return an echelon form of ``self`` using chosen algorithm.
|
|
38
|
+
|
|
39
|
+
By default only a usual row reduction with no divisions or column swaps
|
|
40
|
+
is returned.
|
|
41
|
+
|
|
42
|
+
If Gauss-Bareiss algorithm is chosen, column swaps are recorded and can
|
|
43
|
+
be retrieved via :meth:`swapped_columns`.
|
|
44
|
+
|
|
45
|
+
INPUT:
|
|
46
|
+
|
|
47
|
+
- ``algorithm`` -- string, which algorithm to use (default:
|
|
48
|
+
'row_reduction'). Valid options are:
|
|
49
|
+
|
|
50
|
+
- ``'row_reduction'`` (default) -- reduce as far as
|
|
51
|
+
possible, only divide by constant entries
|
|
52
|
+
|
|
53
|
+
- ``'frac'`` -- reduced echelon form over fraction field
|
|
54
|
+
|
|
55
|
+
- ``'bareiss'`` -- fraction free Gauss-Bareiss algorithm
|
|
56
|
+
with column swaps
|
|
57
|
+
|
|
58
|
+
OUTPUT:
|
|
59
|
+
|
|
60
|
+
The row echelon form of A depending on the chosen algorithm,
|
|
61
|
+
as an immutable matrix. Note that ``self`` is *not* changed
|
|
62
|
+
by this command. Use ``A.echelonize()`` to change `A` in
|
|
63
|
+
place.
|
|
64
|
+
|
|
65
|
+
EXAMPLES::
|
|
66
|
+
|
|
67
|
+
sage: P.<x,y> = PolynomialRing(GF(127), 2)
|
|
68
|
+
sage: A = matrix(P, 2, 2, [1, x, 1, y])
|
|
69
|
+
sage: A
|
|
70
|
+
[1 x]
|
|
71
|
+
[1 y]
|
|
72
|
+
sage: A.echelon_form()
|
|
73
|
+
[ 1 x]
|
|
74
|
+
[ 0 -x + y]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
The reduced row echelon form over the fraction field is as follows::
|
|
78
|
+
|
|
79
|
+
sage: A.echelon_form('frac') # over fraction field
|
|
80
|
+
[1 0]
|
|
81
|
+
[0 1]
|
|
82
|
+
|
|
83
|
+
Alternatively, the Gauss-Bareiss algorithm may be chosen::
|
|
84
|
+
|
|
85
|
+
sage: E = A.echelon_form('bareiss'); E
|
|
86
|
+
[ 1 y]
|
|
87
|
+
[ 0 x - y]
|
|
88
|
+
|
|
89
|
+
After the application of the Gauss-Bareiss algorithm the swapped columns
|
|
90
|
+
may inspected::
|
|
91
|
+
|
|
92
|
+
sage: E.swapped_columns(), E.pivots()
|
|
93
|
+
((0, 1), (0, 1))
|
|
94
|
+
sage: A.swapped_columns(), A.pivots()
|
|
95
|
+
(None, (0, 1))
|
|
96
|
+
|
|
97
|
+
Another approach is to row reduce as far as possible::
|
|
98
|
+
|
|
99
|
+
sage: A.echelon_form('row_reduction')
|
|
100
|
+
[ 1 x]
|
|
101
|
+
[ 0 -x + y]
|
|
102
|
+
"""
|
|
103
|
+
x = self.fetch('echelon_form_'+algorithm)
|
|
104
|
+
if x is not None: return x
|
|
105
|
+
|
|
106
|
+
if algorithm == "frac":
|
|
107
|
+
E = self.matrix_over_field()
|
|
108
|
+
E.echelonize(**kwds)
|
|
109
|
+
else:
|
|
110
|
+
E = self.__copy__()
|
|
111
|
+
E.echelonize(algorithm=algorithm, **kwds)
|
|
112
|
+
|
|
113
|
+
E.set_immutable() # so we can cache the echelon form.
|
|
114
|
+
self.cache('echelon_form_'+algorithm, E)
|
|
115
|
+
|
|
116
|
+
if algorithm == "frac":
|
|
117
|
+
self.cache('pivots', E.pivots())
|
|
118
|
+
elif algorithm == "bareiss":
|
|
119
|
+
l = E.swapped_columns()
|
|
120
|
+
self.cache('pivots', tuple(sorted(l)))
|
|
121
|
+
elif algorithm == "row_reduction":
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
return E
|
|
125
|
+
|
|
126
|
+
def pivots(self):
|
|
127
|
+
"""
|
|
128
|
+
Return the pivot column positions of this matrix as a list of integers.
|
|
129
|
+
|
|
130
|
+
This returns a list, of the position of the first nonzero entry in each
|
|
131
|
+
row of the echelon form.
|
|
132
|
+
|
|
133
|
+
OUTPUT: list of Python ints
|
|
134
|
+
|
|
135
|
+
EXAMPLES::
|
|
136
|
+
|
|
137
|
+
sage: matrix([PolynomialRing(GF(2), 2, 'x').gen()]).pivots()
|
|
138
|
+
(0,)
|
|
139
|
+
sage: K = QQ['x,y']
|
|
140
|
+
sage: x, y = K.gens()
|
|
141
|
+
sage: m = matrix(K, [(-x, 1, y, x - y), (-x*y, y, y^2 - 1, x*y - y^2 + x), (-x*y + x, y - 1, y^2 - y - 2, x*y - y^2 + x + y)])
|
|
142
|
+
sage: m.pivots()
|
|
143
|
+
(0, 2)
|
|
144
|
+
sage: m.rank()
|
|
145
|
+
2
|
|
146
|
+
"""
|
|
147
|
+
x = self.fetch('pivots')
|
|
148
|
+
if x is not None:
|
|
149
|
+
return x
|
|
150
|
+
|
|
151
|
+
self.echelon_form('frac')
|
|
152
|
+
x = self.fetch('pivots')
|
|
153
|
+
|
|
154
|
+
if x is None:
|
|
155
|
+
raise RuntimeError("BUG: matrix pivots should have been set but weren't, matrix parent = '%s'" % self.parent())
|
|
156
|
+
return x
|
|
157
|
+
|
|
158
|
+
def echelonize(self, algorithm='row_reduction', **kwds):
|
|
159
|
+
"""
|
|
160
|
+
Transform ``self`` into a matrix in echelon form over the same base ring as
|
|
161
|
+
``self``.
|
|
162
|
+
|
|
163
|
+
If Gauss-Bareiss algorithm is chosen, column swaps are recorded and can
|
|
164
|
+
be retrieved via :meth:`swapped_columns`.
|
|
165
|
+
|
|
166
|
+
INPUT:
|
|
167
|
+
|
|
168
|
+
- ``algorithm`` -- string, which algorithm to use. Valid options are:
|
|
169
|
+
|
|
170
|
+
- ``'row_reduction'`` -- reduce as far as possible, only
|
|
171
|
+
divide by constant entries
|
|
172
|
+
|
|
173
|
+
- ``'bareiss'`` -- fraction free Gauss-Bareiss algorithm
|
|
174
|
+
with column swaps
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: P.<x,y> = PolynomialRing(QQ, 2)
|
|
179
|
+
sage: A = matrix(P, 2, 2, [1/2, x, 1, 3/4*y+1])
|
|
180
|
+
sage: A
|
|
181
|
+
[ 1/2 x]
|
|
182
|
+
[ 1 3/4*y + 1]
|
|
183
|
+
|
|
184
|
+
sage: B = copy(A)
|
|
185
|
+
sage: B.echelonize('bareiss'); B
|
|
186
|
+
[ 1 3/4*y + 1]
|
|
187
|
+
[ 0 x - 3/8*y - 1/2]
|
|
188
|
+
|
|
189
|
+
sage: B = copy(A)
|
|
190
|
+
sage: B.echelonize('row_reduction'); B
|
|
191
|
+
[ 1 2*x]
|
|
192
|
+
[ 0 -2*x + 3/4*y + 1]
|
|
193
|
+
|
|
194
|
+
sage: P.<x,y> = PolynomialRing(QQ, 2)
|
|
195
|
+
sage: A = matrix(P,2,3,[2,x,0,3,y,1]); A
|
|
196
|
+
[2 x 0]
|
|
197
|
+
[3 y 1]
|
|
198
|
+
|
|
199
|
+
sage: E = A.echelon_form('bareiss'); E
|
|
200
|
+
[1 3 y]
|
|
201
|
+
[0 2 x]
|
|
202
|
+
sage: E.swapped_columns()
|
|
203
|
+
(2, 0, 1)
|
|
204
|
+
sage: A.pivots()
|
|
205
|
+
(0, 1, 2)
|
|
206
|
+
"""
|
|
207
|
+
self.check_mutability()
|
|
208
|
+
|
|
209
|
+
if self._nrows == 0 or self._ncols == 0:
|
|
210
|
+
self.cache('in_echelon_form_'+algorithm, True)
|
|
211
|
+
self.cache('rank', 0)
|
|
212
|
+
self.cache('pivots', tuple())
|
|
213
|
+
return
|
|
214
|
+
|
|
215
|
+
x = self.fetch('in_echelon_form_'+algorithm)
|
|
216
|
+
if x is not None:
|
|
217
|
+
return # already known to be in echelon form
|
|
218
|
+
|
|
219
|
+
if algorithm == 'bareiss':
|
|
220
|
+
self._echelonize_gauss_bareiss()
|
|
221
|
+
elif algorithm == 'row_reduction':
|
|
222
|
+
self._echelonize_row_reduction()
|
|
223
|
+
else:
|
|
224
|
+
raise ValueError("Unknown algorithm '%s'" % algorithm)
|
|
225
|
+
|
|
226
|
+
def _echelonize_gauss_bareiss(self):
|
|
227
|
+
"""
|
|
228
|
+
Transform this matrix into a matrix in upper triangular form over the
|
|
229
|
+
same base ring as ``self`` using the fraction free Gauss-Bareiss
|
|
230
|
+
algorithm with column swaps.
|
|
231
|
+
|
|
232
|
+
The performed column swaps can be accessed via
|
|
233
|
+
:meth:`swapped_columns`.
|
|
234
|
+
|
|
235
|
+
EXAMPLES::
|
|
236
|
+
|
|
237
|
+
sage: R.<x,y> = QQ[]
|
|
238
|
+
sage: C = matrix(R, [[-6/5*x*y - y^2, -6*y^2 - 1/4*y],
|
|
239
|
+
....: [ -1/3*x*y - 3, x*y - x]])
|
|
240
|
+
sage: E = C.echelon_form('bareiss') # indirect doctest
|
|
241
|
+
sage: E
|
|
242
|
+
[ -1/3*x*y - 3 x*y - x]
|
|
243
|
+
[ 0 6/5*x^2*y^2 + 3*x*y^3 - 6/5*x^2*y - 11/12*x*y^2 + 18*y^2 + 3/4*y]
|
|
244
|
+
sage: E.swapped_columns()
|
|
245
|
+
(0, 1)
|
|
246
|
+
|
|
247
|
+
ALGORITHM:
|
|
248
|
+
|
|
249
|
+
Uses libSINGULAR or SINGULAR
|
|
250
|
+
"""
|
|
251
|
+
cdef R = self.base_ring()
|
|
252
|
+
|
|
253
|
+
x = self.fetch('in_echelon_form_bareiss')
|
|
254
|
+
if x is not None:
|
|
255
|
+
return # already known to be in echelon form
|
|
256
|
+
|
|
257
|
+
if isinstance(self.base_ring(), MPolynomialRing_libsingular):
|
|
258
|
+
|
|
259
|
+
self.check_mutability()
|
|
260
|
+
self.clear_cache()
|
|
261
|
+
|
|
262
|
+
singular_bareiss = singular_function("bareiss")
|
|
263
|
+
E, l = singular_bareiss(self.T)
|
|
264
|
+
|
|
265
|
+
m = len(E)
|
|
266
|
+
n = len(E[0])
|
|
267
|
+
|
|
268
|
+
for r in range(m):
|
|
269
|
+
for c in range(n):
|
|
270
|
+
self.set_unsafe(r, c, E[r][c])
|
|
271
|
+
for c in range(n, self.ncols()):
|
|
272
|
+
self.set_unsafe(r, c, R._zero_element)
|
|
273
|
+
for r in range(m, self.nrows()):
|
|
274
|
+
for c in range(self.ncols()):
|
|
275
|
+
self.set_unsafe(r, c, R._zero_element)
|
|
276
|
+
|
|
277
|
+
from sage.rings.integer_ring import ZZ
|
|
278
|
+
l = [ZZ(e-1) for e in l]
|
|
279
|
+
|
|
280
|
+
self.cache('in_echelon_form_bareiss',True)
|
|
281
|
+
self.cache('rank', len(E))
|
|
282
|
+
self.cache('pivots', tuple(range(len(E))))
|
|
283
|
+
self.cache('swapped_columns', tuple(l))
|
|
284
|
+
|
|
285
|
+
elif can_convert_to_singular(self.base_ring()):
|
|
286
|
+
|
|
287
|
+
self.check_mutability()
|
|
288
|
+
self.clear_cache()
|
|
289
|
+
|
|
290
|
+
E,l = self.T._singular_().bareiss()._sage_(self.base_ring())
|
|
291
|
+
|
|
292
|
+
# clear matrix
|
|
293
|
+
for r from 0 <= r < self._nrows:
|
|
294
|
+
for c from 0 <= c < self._ncols:
|
|
295
|
+
self.set_unsafe(r,c,R._zero_element)
|
|
296
|
+
|
|
297
|
+
for r from 0 <= r < E.nrows():
|
|
298
|
+
for c from 0 <= c < E.ncols():
|
|
299
|
+
self.set_unsafe(c,r, E[r,c])
|
|
300
|
+
|
|
301
|
+
self.cache('in_echelon_form_bareiss',True)
|
|
302
|
+
self.cache('rank', E.nrows())
|
|
303
|
+
self.cache('pivots', tuple(range(E.nrows())))
|
|
304
|
+
self.cache('swapped_columns', l)
|
|
305
|
+
|
|
306
|
+
else:
|
|
307
|
+
|
|
308
|
+
raise NotImplementedError("cannot apply Gauss-Bareiss algorithm over this base ring")
|
|
309
|
+
|
|
310
|
+
def _echelonize_row_reduction(self):
|
|
311
|
+
"""
|
|
312
|
+
Transform this matrix to a matrix in row reduced form as far as this is
|
|
313
|
+
possible, i.e., only perform division by constant elements.
|
|
314
|
+
|
|
315
|
+
EXAMPLES:
|
|
316
|
+
|
|
317
|
+
If all entries are constant, then this method performs the same
|
|
318
|
+
operations as ``echelon_form('default')`` ::
|
|
319
|
+
|
|
320
|
+
sage: P.<x0,x1,y0,y1> = PolynomialRing(GF(127), 4)
|
|
321
|
+
sage: A = Matrix(P, 4, 4, [-14,0,45,-55,-61,-16,0,0,0,0,25,-62,-22,0,52,0]); A
|
|
322
|
+
[-14 0 45 -55]
|
|
323
|
+
[-61 -16 0 0]
|
|
324
|
+
[ 0 0 25 -62]
|
|
325
|
+
[-22 0 52 0]
|
|
326
|
+
sage: E1 = A.echelon_form()
|
|
327
|
+
sage: E2 = A.echelon_form('row_reduction') # indirect doctest
|
|
328
|
+
sage: E1 == E2
|
|
329
|
+
True
|
|
330
|
+
|
|
331
|
+
If no entries are constant, nothing happens::
|
|
332
|
+
|
|
333
|
+
sage: P.<x0,x1,y0,y1> = PolynomialRing(GF(2), 4)
|
|
334
|
+
sage: A = Matrix(P, 2, 2, [x0, y0, x0, y0]); A
|
|
335
|
+
[x0 y0]
|
|
336
|
+
[x0 y0]
|
|
337
|
+
|
|
338
|
+
sage: B = copy(A)
|
|
339
|
+
sage: A.echelonize('row_reduction') # modifies self
|
|
340
|
+
sage: B == A
|
|
341
|
+
True
|
|
342
|
+
|
|
343
|
+
A more interesting example::
|
|
344
|
+
|
|
345
|
+
sage: P.<x0,x1,y0,y1> = PolynomialRing(GF(2), 4)
|
|
346
|
+
sage: l = [1, 1, 1, 1, 1,
|
|
347
|
+
....: 0, 1, 0, 1, x0,
|
|
348
|
+
....: 0, 0, 1, 1, x1,
|
|
349
|
+
....: 1, 1, 0, 0, y0,
|
|
350
|
+
....: 0, 1, 0, 1, y1,
|
|
351
|
+
....: 0, 1, 0, 0, x0*y0,
|
|
352
|
+
....: 0, 1, 0, 1, x0*y1,
|
|
353
|
+
....: 0, 0, 0, 0, x1*y0,
|
|
354
|
+
....: 0, 0, 0, 1, x1*y1]
|
|
355
|
+
sage: A = Matrix(P, 9, 5, l)
|
|
356
|
+
sage: B = A.__copy__()
|
|
357
|
+
sage: B.echelonize('row_reduction'); B
|
|
358
|
+
[ 1 0 0 0 x0*y0 + x1 + 1]
|
|
359
|
+
[ 0 1 0 0 x0*y0]
|
|
360
|
+
[ 0 0 1 0 x0*y0 + x0 + x1]
|
|
361
|
+
[ 0 0 0 1 x0*y0 + x0]
|
|
362
|
+
[ 0 0 0 0 x0 + y1]
|
|
363
|
+
[ 0 0 0 0 x1 + y0 + 1]
|
|
364
|
+
[ 0 0 0 0 x0*y1 + x0]
|
|
365
|
+
[ 0 0 0 0 x1*y0]
|
|
366
|
+
[ 0 0 0 0 x0*y0 + x1*y1 + x0]
|
|
367
|
+
|
|
368
|
+
This is the same result as SINGULAR's ``rowred`` command which
|
|
369
|
+
returns::
|
|
370
|
+
|
|
371
|
+
sage: E = A._singular_().rowred()._sage_(P)
|
|
372
|
+
sage: E == B
|
|
373
|
+
True
|
|
374
|
+
|
|
375
|
+
ALGORITHM:
|
|
376
|
+
|
|
377
|
+
Gaussian elimination with division limited to constant
|
|
378
|
+
entries. Based on SINGULAR's rowred command.
|
|
379
|
+
"""
|
|
380
|
+
from sage.matrix.constructor import matrix
|
|
381
|
+
|
|
382
|
+
cdef Py_ssize_t c, r, i, j, rc, start_row, nr, nc
|
|
383
|
+
|
|
384
|
+
x = self.fetch('in_echelon_form_row_reduction')
|
|
385
|
+
if x is not None:
|
|
386
|
+
return # already known to be in echelon form
|
|
387
|
+
|
|
388
|
+
nr,nc = self.nrows(),self.ncols()
|
|
389
|
+
F = self.base_ring().base_ring()
|
|
390
|
+
cdef Matrix d = matrix(F, nr, nc)
|
|
391
|
+
start_row = 0
|
|
392
|
+
|
|
393
|
+
for r from 0 <= r < nr:
|
|
394
|
+
for c from 0 <= c < nc:
|
|
395
|
+
p = self.get_unsafe(r, c)
|
|
396
|
+
if p.is_constant():
|
|
397
|
+
d.set_unsafe(r, c, p.constant_coefficient())
|
|
398
|
+
|
|
399
|
+
for c from 0 <= c < nc:
|
|
400
|
+
r = -1
|
|
401
|
+
for rc from start_row <= rc < nr:
|
|
402
|
+
if d.get_unsafe(rc, c):
|
|
403
|
+
r = rc
|
|
404
|
+
break
|
|
405
|
+
if r!=-1:
|
|
406
|
+
a_inverse = ~self.get_unsafe(r, c)
|
|
407
|
+
self.rescale_row_c(r, a_inverse, c)
|
|
408
|
+
self.swap_rows_c(r, start_row)
|
|
409
|
+
|
|
410
|
+
for i from 0 <= i < nr:
|
|
411
|
+
if i != start_row:
|
|
412
|
+
minus_b = -self.get_unsafe(i, c)
|
|
413
|
+
self.add_multiple_of_row(i, start_row, minus_b, 0)
|
|
414
|
+
|
|
415
|
+
start_row +=1
|
|
416
|
+
|
|
417
|
+
d = d._parent(0)
|
|
418
|
+
for i from start_row <= i < nr:
|
|
419
|
+
for j from c+1 <= j < nc:
|
|
420
|
+
if self.get_unsafe(i, j).is_constant():
|
|
421
|
+
d.set_unsafe(i, j, self.get_unsafe(i, j).constant_coefficient())
|
|
422
|
+
|
|
423
|
+
self.cache('in_echelon_form_row_reduction', True)
|
|
424
|
+
|
|
425
|
+
def swapped_columns(self):
|
|
426
|
+
"""
|
|
427
|
+
Return which columns were swapped during the Gauss-Bareiss reduction.
|
|
428
|
+
|
|
429
|
+
OUTPUT:
|
|
430
|
+
|
|
431
|
+
Return a tuple representing the column swaps during the last application
|
|
432
|
+
of the Gauss-Bareiss algorithm (see :meth:`echelon_form` for details).
|
|
433
|
+
|
|
434
|
+
The tuple as length equal to the rank of ``self`` and the value at the
|
|
435
|
+
`i`-th position indicates the source column which was put as the `i`-th
|
|
436
|
+
column.
|
|
437
|
+
|
|
438
|
+
If no Gauss-Bareiss reduction was performed yet, None is
|
|
439
|
+
returned.
|
|
440
|
+
|
|
441
|
+
EXAMPLES::
|
|
442
|
+
|
|
443
|
+
sage: R.<x,y> = QQ[]
|
|
444
|
+
sage: C = random_matrix(R, 2, 2, terms=2)
|
|
445
|
+
sage: while C.rank() != 2:
|
|
446
|
+
....: C = random_matrix(R, 2, 2, terms=2)
|
|
447
|
+
sage: C.swapped_columns()
|
|
448
|
+
sage: E = C.echelon_form('bareiss')
|
|
449
|
+
sage: sorted(E.swapped_columns())
|
|
450
|
+
[0, 1]
|
|
451
|
+
"""
|
|
452
|
+
return self.fetch('swapped_columns')
|
|
453
|
+
|
|
454
|
+
def _fitting_ideal(self, i):
|
|
455
|
+
r"""
|
|
456
|
+
Return the `i`-th Fitting ideal of the matrix. This is the ideal generated
|
|
457
|
+
by the `n - i` minors, where `n` is the number of columns.
|
|
458
|
+
|
|
459
|
+
INPUT:
|
|
460
|
+
|
|
461
|
+
- ``i`` -- integer
|
|
462
|
+
|
|
463
|
+
OUTPUT: an ideal on the base ring
|
|
464
|
+
|
|
465
|
+
EXAMPLES::
|
|
466
|
+
|
|
467
|
+
sage: R.<x,y,z> = QQ[]
|
|
468
|
+
sage: M = matrix(R, [[2*x-z, 0, y-z^2, 0], [0, z - y, z - x, 0],[z - y, x^2 - y, 0, z]])
|
|
469
|
+
sage: M
|
|
470
|
+
[ 2*x - z 0 -z^2 + y 0]
|
|
471
|
+
[ 0 -y + z -x + z 0]
|
|
472
|
+
[ -y + z x^2 - y 0 z]
|
|
473
|
+
sage: M.fitting_ideal(0)
|
|
474
|
+
Ideal (0) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
475
|
+
sage: M.fitting_ideal(1)
|
|
476
|
+
Ideal (2*x^4 - 3*x^3*z + x^2*z^2 + y^2*z^2 - 2*y*z^3 + z^4 - 2*x^2*y - y^3 + 3*x*y*z + 2*y^2*z - 2*y*z^2, y*z^3 - z^4 - y^2*z + y*z^2, -2*x*y*z + 2*x*z^2 + y*z^2 - z^3, -2*x^2*z + 3*x*z^2 - z^3) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
477
|
+
sage: M.fitting_ideal(2)
|
|
478
|
+
Ideal (-x^3 + x^2*z + x*y - y*z, -y^2 + 2*y*z - z^2, -x^2*z^2 + x^2*y + y*z^2 - y^2, 2*x^3 - x^2*z - 2*x*y + y*z, -x*y + x*z + y*z - z^2, -y*z^2 + z^3 + y^2 - y*z, -2*x*y + 2*x*z + y*z - z^2, y*z^2 - z^3 - y^2 + y*z, 2*x^2 - 3*x*z + z^2, 2*x*z - z^2, -z^3 + y*z, -y*z + z^2, -x*z + z^2) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
479
|
+
sage: M.fitting_ideal(3)
|
|
480
|
+
Ideal (2*x - z, -z^2 + y, -y + z, -x + z, -y + z, x^2 - y, z) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
481
|
+
sage: M.fitting_ideal(4)
|
|
482
|
+
Ideal (1) of Multivariate Polynomial Ring in x, y, z over Rational Field
|
|
483
|
+
sage: [R.ideal(M.minors(i)) == M._fitting_ideal(4 - i) for i in range(5)]
|
|
484
|
+
[True, True, True, True, True]
|
|
485
|
+
"""
|
|
486
|
+
minor = singular_function("minor")
|
|
487
|
+
R = self.base_ring()
|
|
488
|
+
for (nrow, row) in enumerate(self.rows()):
|
|
489
|
+
if not row:
|
|
490
|
+
N = self.delete_rows([nrow])
|
|
491
|
+
return N._fitting_ideal(i)
|
|
492
|
+
for (ncoef, coef) in enumerate(row):
|
|
493
|
+
if all(coef.divides(f) for f in row):
|
|
494
|
+
N = self.__copy__()
|
|
495
|
+
for j in range(self.ncols()):
|
|
496
|
+
if j != ncoef:
|
|
497
|
+
N.add_multiple_of_column(j, ncoef, -R(self[nrow,j] / coef))
|
|
498
|
+
return N.fitting_ideal(i)
|
|
499
|
+
for (ncolumn, column) in enumerate(self.columns()):
|
|
500
|
+
if not column:
|
|
501
|
+
N = self.delete_columns([ncolumn])
|
|
502
|
+
return N._fitting_ideal(i-1)
|
|
503
|
+
for (ncoef, coef) in enumerate(column):
|
|
504
|
+
if all(coef.divides(f) for f in column):
|
|
505
|
+
N = self.__copy__()
|
|
506
|
+
for j in range(self.nrows()):
|
|
507
|
+
if j != ncoef:
|
|
508
|
+
N.add_multiple_of_row(j, ncoef, -R(self[j, ncolumn] / coef))
|
|
509
|
+
return N.fitting_ideal(i)
|
|
510
|
+
rank = self.ncols() - i
|
|
511
|
+
return R.ideal(minor(self, rank))
|
|
512
|
+
|
|
513
|
+
def determinant(self, algorithm=None):
|
|
514
|
+
"""
|
|
515
|
+
Return the determinant of this matrix.
|
|
516
|
+
|
|
517
|
+
INPUT:
|
|
518
|
+
|
|
519
|
+
- ``algorithm`` -- ignored
|
|
520
|
+
|
|
521
|
+
EXAMPLES:
|
|
522
|
+
|
|
523
|
+
We compute the determinant of the arbitrary `3x3` matrix::
|
|
524
|
+
|
|
525
|
+
sage: R = PolynomialRing(QQ, 9, 'x')
|
|
526
|
+
sage: A = matrix(R, 3, R.gens())
|
|
527
|
+
sage: A
|
|
528
|
+
[x0 x1 x2]
|
|
529
|
+
[x3 x4 x5]
|
|
530
|
+
[x6 x7 x8]
|
|
531
|
+
sage: A.determinant()
|
|
532
|
+
-x2*x4*x6 + x1*x5*x6 + x2*x3*x7 - x0*x5*x7 - x1*x3*x8 + x0*x4*x8
|
|
533
|
+
|
|
534
|
+
We check if two implementations agree on the result::
|
|
535
|
+
|
|
536
|
+
sage: R.<x,y> = QQ[]
|
|
537
|
+
sage: C = matrix(R, [[-6/5*x*y - y^2, -6*y^2 - 1/4*y],
|
|
538
|
+
....: [ -1/3*x*y - 3, x*y - x]])
|
|
539
|
+
sage: C.determinant()
|
|
540
|
+
-6/5*x^2*y^2 - 3*x*y^3 + 6/5*x^2*y + 11/12*x*y^2 - 18*y^2 - 3/4*y
|
|
541
|
+
|
|
542
|
+
sage: C.change_ring(R.change_ring(QQbar)).det()
|
|
543
|
+
(-6/5)*x^2*y^2 + (-3)*x*y^3 + 6/5*x^2*y + 11/12*x*y^2 + (-18)*y^2 + (-3/4)*y
|
|
544
|
+
|
|
545
|
+
Finally, we check whether the Singular interface is working::
|
|
546
|
+
|
|
547
|
+
sage: R.<x,y> = RR[]
|
|
548
|
+
sage: C = matrix(R, [[0.368965517352886*y^2 + 0.425700773972636*x, -0.800362171389760*y^2 - 0.807635502485287],
|
|
549
|
+
....: [0.706173539423122*y^2 - 0.915986060298440, 0.897165181570476*y + 0.107903328188376]])
|
|
550
|
+
sage: C.determinant()
|
|
551
|
+
0.565194587390682*y^4 + 0.33102301536914...*y^3 + 0.381923912175852*x*y - 0.122977163520282*y^2 + 0.0459345303240150*x - 0.739782862078649
|
|
552
|
+
|
|
553
|
+
ALGORITHM: Calls Singular, libSingular or native implementation.
|
|
554
|
+
|
|
555
|
+
TESTS::
|
|
556
|
+
|
|
557
|
+
sage: R = PolynomialRing(QQ, 9, 'x')
|
|
558
|
+
sage: matrix(R, 0, 0).det()
|
|
559
|
+
1
|
|
560
|
+
|
|
561
|
+
sage: R.<h,y> = QQ[]
|
|
562
|
+
sage: m = matrix([[y,y,y,y]] * 4) # larger than 3x3
|
|
563
|
+
sage: m.charpoly() # put charpoly in the cache
|
|
564
|
+
x^4 - 4*y*x^3
|
|
565
|
+
sage: m.det()
|
|
566
|
+
0
|
|
567
|
+
|
|
568
|
+
Check :issue:`23535` is fixed::
|
|
569
|
+
|
|
570
|
+
sage: x = polygen(QQ)
|
|
571
|
+
sage: K.<a,b> = NumberField([x^2 - 2, x^2 - 5])
|
|
572
|
+
sage: R.<s,t> = K[]
|
|
573
|
+
sage: m = matrix(R, 4, [y^i for i in range(4) for y in [a,b,s,t]])
|
|
574
|
+
sage: m.det()
|
|
575
|
+
(a - b)*s^3*t^2 + (-a + b)*s^2*t^3 + 3*s^3*t + (-3)*s*t^3 + (-5*a + 2*b)*s^3 + (2*a - 5*b)*s^2*t +
|
|
576
|
+
(-2*a + 5*b)*s*t^2 + (5*a - 2*b)*t^3 + 3*b*a*s^2 + (-3*b*a)*t^2 + (10*a - 10*b)*s + (-10*a + 10*b)*t
|
|
577
|
+
"""
|
|
578
|
+
if self._nrows != self._ncols:
|
|
579
|
+
raise ValueError("self must be a square matrix")
|
|
580
|
+
|
|
581
|
+
d = self.fetch('det')
|
|
582
|
+
|
|
583
|
+
if d is not None:
|
|
584
|
+
return d
|
|
585
|
+
|
|
586
|
+
if self._nrows == 0:
|
|
587
|
+
d = self._coerce_element(1)
|
|
588
|
+
elif self._nrows <= 3:
|
|
589
|
+
from sage.matrix.matrix2 import Matrix
|
|
590
|
+
d = Matrix.determinant(self)
|
|
591
|
+
|
|
592
|
+
elif self.fetch('charpoly') is not None:
|
|
593
|
+
# if charpoly known, then det is easy.
|
|
594
|
+
D = self.fetch('charpoly')
|
|
595
|
+
if D is not None:
|
|
596
|
+
c = D[0]
|
|
597
|
+
if self._nrows % 2:
|
|
598
|
+
c = -c
|
|
599
|
+
d = self._coerce_element(c)
|
|
600
|
+
else:
|
|
601
|
+
R = self._base_ring
|
|
602
|
+
|
|
603
|
+
if isinstance(R, MPolynomialRing_libsingular) and R.base_ring() in Fields():
|
|
604
|
+
singular_det = singular_function("det")
|
|
605
|
+
d = singular_det(self)
|
|
606
|
+
|
|
607
|
+
elif can_convert_to_singular(self.base_ring()):
|
|
608
|
+
d = R(self._singular_().det())
|
|
609
|
+
|
|
610
|
+
else:
|
|
611
|
+
from sage.matrix.matrix2 import Matrix
|
|
612
|
+
d = Matrix.determinant(self)
|
|
613
|
+
|
|
614
|
+
self.cache('det', d)
|
|
615
|
+
return d
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-singular
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-singular
|