msolve
julia> using GroebnerBasis, Singular julia> R, (a, b, c) = PolynomialRing(QQ, ["a", "b", "c"]); julia> I(n) = Ideal(R, [(a+b)^n+c-3, (b+c)^n+a-2, (2*c+a)^n+b-1]); julia> for n = 5:15 print(n,":"); @time msolve(I(n), get_param = true) end; 5: 0.122010 seconds (11.82 k allocations: 1.950 MiB, 0.02% compilation time) 6: 0.348948 seconds (19.29 k allocations: 4.985 MiB, 0.01% compilation time) 7: 0.878888 seconds (27.93 k allocations: 11.589 MiB, 0.01% compilation time) 8: 2.193366 seconds (40.84 k allocations: 24.917 MiB, 0.00% compilation time) 9: 4.885550 seconds (57.68 k allocations: 49.346 MiB, 0.00% compilation time) 10: 11.550713 seconds (82.87 k allocations: 91.559 MiB, 0.06% gc time, 0.00% compilation time) 11: 23.599137 seconds (105.80 k allocations: 160.780 MiB, 0.00% compilation time) 12: 52.038471 seconds (139.22 k allocations: 269.434 MiB, 0.02% gc time, 0.00% compilation time) 13: 99.050393 seconds (253.12 k allocations: 453.029 MiB, 0.02% gc time, 0.10% compilation time) 14:202.253239 seconds (331.56 k allocations: 691.498 MiB, 0.10% gc time, 0.07% compilation time) 15:362.278998 seconds (358.05 k allocations: 1.065 GiB, 0.01% gc time, 0.03% compilation time)
julia> using GroebnerBasis, Singular, Nemo; julia> # problem svs = ["a", "b", "c"]; sys((a, b, c)) = [(a+b)^5+c-3,(b+c)^5+a-2,(2*c+a)^5+b-1]; julia> R, vs = Singular.PolynomialRing(Singular.QQ, svs); julia> # run msolve @time prm, nmc = msolve(Ideal(R, sys(vs)), get_param = true); 3.348726 seconds (3.36 M allocations: 204.432 MiB, 1.05% gc time, 96.05% compilation time) julia> p1, _, p3, p4, p5, p6 = prm; julia> # vars. order pmt = map(s->findfirst(e->e==s, p1), svs); julia> # for factors fcs = factor(p3); println("#irr_fct_elm: ", length(fcs)) #irr_fct_elm: 1 julia> for (fct, _) in fcs print("deg: ", Singular.degree(fct), "\nrur time:"); # rur using nf_elem p = Nemo.NumberField(fct, "p")[2]; @time rur = vcat([Nemo.evaluate((-1)*e1, p)//Nemo.evaluate(e2*p4, p) for (e1, e2) in zip(p5, p6)], [p]); # Symbolic test @time println(sys(rur[pmt])); # Numeric test for raw map(e->println(sys(map(Float64, e[pmt]))), nmc); # Numeric test for solve_rational_parametrization @time srp = solve_rational_parametrization(prm[3:end], precision = 100); map(e->println(sys(map(Float64, e[pmt]))), srp); end; deg: 125 rur time: 1.995804 seconds (1.41 M allocations: 171.327 MiB, 1.16% gc time, 23.01% compilation time) nf_elem[0, 0, 0] 0.745820 seconds (642.35 k allocations: 196.643 MiB, 1.31% gc time, 55.69% compilation time) [-2.220446049250313e-15, -8.881784197001252e-16, 0.0] den: fmpq_poly 2.880423 seconds (3.58 M allocations: 205.021 MiB, 1.46% gc time, 0.58% compilation time) [-2.220446049250313e-15, -8.881784197001252e-16, 0.0]
? msolve2("kat10-qq"); --2021-04-20 22:46:37-- https://gitlab.lip6.fr/eder/msolve-examples/-/raw/master/zero-dimensional/kat10-qq.ms Resolving gitlab.lip6.fr (gitlab.lip6.fr)... 132.227.201.130 Connecting to gitlab.lip6.fr (gitlab.lip6.fr)|132.227.201.130|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 665 [text/plain] Saving to: 'kat10-qq.ms' kat10-qq.ms 100%[===========================================>] 665 --.-KB/s in 0s 2021-04-20 22:46:39 (36.0 MB/s) - 'kat10-qq.ms' saved [665/665] 26.73user 0.01system 0:26.77elapsed 99%CPU (0avgtext+0avgdata 21152maxresident)k 0inputs+8144outputs (0major+15298minor)pagefaults 0swaps 120[[0,0,0,0,0,0,0,0,0,0]] time = 271 ms.
Tst.jl
using GroebnerBasis, Singular, Nemo; # for global R, I function tst1() vs = gens(R); sys(lst) = ( map(e->eval(Meta.parse("$(e[1]) = $(e[2])")), zip(vs, lst)); map(e->eval(Meta.parse("$e")), gens(I)) ); # run msolve print("msolve with param: "); @time prm, nmc = msolve(I, get_param = true); # vars. order p1 = prm[1]; println(p1); pmt = map(s->findfirst(e->e==string(s), p1), vs); # tests tst0(sys, prm, nmc, pmt); end; # for global svs, sys function tst2() R, vs = Singular.PolynomialRing(Singular.QQ, svs); # run msolve print("msolve with param: "); @time prm, nmc = msolve(Ideal(R, sys(vs)), get_param = true); # vars. order p1 = prm[1]; println(p1); pmt = map(s->findfirst(e->e==s, p1), svs); # tests tst0(sys, prm, nmc, pmt); end; # rur and tests function tst0(sys, prm, nmc, pmt) p3, p4, p5, p6 = prm[3:end]; # for factors fcs = factor(p3); println("#irr_fct_elm: ", length(fcs)); for (fct, _) in fcs print("deg: ", degree(fct), "\nrur:"); # rur global p = Nemo.NumberField(fct, "p")[2]; @time global rur = vcat( [Nemo.evaluate((-1)*p5[k], p)//Nemo.evaluate(e*p4, p) for (k, e) in enumerate(p6)], [p] ); # Symbolic test println("sym:"); @time println(sys(rur[pmt])); # Numeric test for raw println("num_raw:"); map(e->println(sys(map(Float64, e[pmt]))), nmc); # Numeric test for solve_rational_parametrization println("num_srp:"); @time srp = solve_rational_parametrization(prm[3:end], precision = 100); map(e->println(sys(map(Float64, e[pmt]))), srp); end; end; #= # prob.1 R, I = GroebnerBasis.katsura_4(0); tst1(); # prob.2 svs = ["a", "b", "c"]; sys((a, b, c)) = [-1+c+b+a^3, -1+b+c*a+2*a^3, 1+c*b+c^2*a]; tst2(); # prob.3 R, (a, b, c) = Singular.PolynomialRing(Singular.QQ, ["a", "b", "c"]); I = Ideal(R, [a^16+b+c, a+b^3+c-2, a*b*c-1]); for n = 1:50 tst1() end; # prob.4 svs = ["a", "b", "c"]; for n in [16, 25, 27, 29, 31, 38, 40, 42, 44, 46, 51, 55, 61, 66, 68, 70, 74, 76, 91]; println(n," >>>"); global sys((a, b, c)) = [a^n+b+c, a+b^3+c-2, a*b*c-1]; tst2(); end; =#
https://arxiv.org/pdf/2104.03572.pdf
https://msolve.lip6.fr/
https://icerm.brown.edu/video_archive/?play=2455