Comprehensive Gröbner Systems

Let $K$ be a field, $X=\{x_1,\dots,x_n\}$ a set of variables, and $U=\{u_1,\dots,u_m\}$ a set of parameters. A comprehensive Gröbner system of an ideal $I\subset K[U][X]$ is a finite list of triples $(E_i, N_i, G_i)$, with $E_i, N_i\subset K[U]$ and $G_i\subset K[U][X]$, such that

  • The union of the segments $V(E_i)\setminus V(N_i)$ covers the parameter space $\overline{K}^m$;
  • For every point $a$ of each segment $V(E_i)\setminus V(N_i)$, the specialization $G_i(a)$ is a Gröbner basis of the specialized ideal $I(a)\subset\overline{K}[X]$.

In OSCAR, the function below computes a comprehensive Gröbner system.

comprehensive_groebner_system — Function
comprehensive_groebner_system(I::MPolyIdeal{<:MPolyRingElem{T}};
  null::MPolyIdeal{T}, nonnull::MPolyIdeal{T},
  ordering::MonomialOrdering = default_ordering(base_ring(I)),
  algorithm::Symbol = :KSW) where {T <: MPolyRingElem}

If ordering is global, return a comprehensive Gröbner system of $I$ with respect to ordering.

The output is a vector of triples $(E_i, N_i, G_i)$, where $E_i$ and $N_i$ are ideals of the coefficient ring and $G_i$ is an ideal of the base ring of $I$. For every point $a$ of each segment $V(E_i)\setminus V(N_i)$, substituting $a$ for the parameters in the generators of $G_i$ gives a Gröbner basis of the same substitution in $I$.

Note

The base ring of $I$ must be a multivariate polynomial ring, whose coefficient ring is again a multivariate polynomial ring. The variables of the coefficient ring are the parameters.

Note

The keywords null and nonnull are ideals of the coefficient ring, and the segments cover $V(\mathrm{null}) \setminus V(\mathrm{nonnull})$. By default, null is the zero ideal and nonnull is the unit ideal, so that the segments cover the whole parameter space.

The keyword algorithm can be set to

  • :KSW (implementation of the Kapur-Sun-Wang algorithm [KSW10] in Singular). This implementation requires the coefficient ring of the parameters to be QQ or a prime field created by GF(p).

Examples

julia> A, (a, b) = polynomial_ring(QQ, [:a, :b]);

julia> R, (x,) = polynomial_ring(A, [:x]);

julia> comprehensive_groebner_system(ideal(R, [a*x - b]))
3-element Vector{Tuple{MPolyIdeal{QQMPolyRingElem}, MPolyIdeal{QQMPolyRingElem}, MPolyIdeal{AbstractAlgebra.Generic.MPoly{QQMPolyRingElem}}}}:
 (Ideal (0), Ideal (a), Ideal (a*x - b))
 (Ideal (a), Ideal (b, a), Ideal (1))
 (Ideal (b, a), Ideal (1), Ideal (0))
source