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$.
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.
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 beQQor a prime field created byGF(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))