maximal?(I : Ideal, lvar : List VarSet) : Boolean ==
element?(1, I) => false
empty? lvar => empty? (groebner I).idl
not zeroDim?(I, lvar) => false
n : NNI := #lvar
J := groebner I
Jd := J.idl
n = 1 =>
empty? Jd => false
g := Jd.first
x := lvar.first
deg := degree(univariate(g, x))
deg = 0 => false
deg = 1 => true
if F has PolynomialFactorizationExplicit then -- TODO: implement for Nemo
fl := factorList(factor(g)$DPoly)
#fl = 1 and fl(1).exponent = 1
else
false
x := lvar.last
lv1 := remove(x, lvar)
for attempt in 1..5 repeat
if #Jd = n then
ok : Boolean := true
i : NNI := 1
for f in Jd while ok repeat
if i < n then
if not isMonic?(f, lvar(i)) or degree(univariate(f, lvar(i))) ~= 1 then
ok := false
i := i + 1
if ok then
g := Jd(n)
deg := degree(univariate(g, x))
deg = 0 => return false
deg = 1 => return true
if F has PolynomialFactorizationExplicit then
fl := factorList(factor(g)$DPoly)
return (#fl = 1 and fl(1).exponent = 1)
else
return false
ranvals : List Z := [random(23)$Z for vv in lv1] -- use #lv1 ?
val : DPoly := _+/[rv * (vv::DPoly) for vv in lv1 for rv in ranvals] + (x::DPoly)
J := groebnerIdeal groebner [(univariate(p, x)).val for p in J.idl]
Jd := J.idl
false
maximal?(I : Ideal) : Boolean == maximal?(I, "setUnion"/[variables g for g in I.idl])