Multigraded Implicitization

Let $\phi: S = \mathbb{K}[x_1, \ldots, x_n] \to R = \mathbb{K}[t_1, \ldots, t_m]$ such that $\ker(\phi)$ is homogeneous in a multigrading specified by the columns of a matrix $A \in \mathbb{Z}^{r \times n}$. Then a basis for each homogeneous components of $\ker(\phi)$ can be computed by solving an associated linear system. In particular given a multidegree $\beta = A \alpha$ such that $\alpha \cdot (1, 1, \ldots, 1) = d$ let $B_\beta$ be a basis for the homogeneous component $S_\beta$. Then a polynomial $f \in S_\beta$ has the form $f = \sum_{m \in B_\beta} c_m m$ and the constraint that $f \in \ker(\phi)$ of course means that $\phi(f) = 0$ which corresponds to a linear system in the variables $c_m$. A basis for the kernel of this linear system corresponds to a basis for $\ker(\phi) \cap S_\beta$. When the multigrading given by $A$ refines total degree this can be done in parallel and a maximal multigrading which can be induced via the map $\phi$ is given by the homogeneity space of the elimination ideal of $\phi$. This algorithm is especially effective when the rank of $ A $ is close to the dimension of $\ker(\phi)$ or when only a subset of generators of low total degree is needed. For more information on this approach to implicitization, see [CH26].

components_of_kernelMethod
components_of_kernel(d::Int, phi::MPolyAnyMap; wp::Union{OscarWorkerPool, Nothing}=nothing)

Computes all minimal generators of the kernel of the polynomial map $\phi: \mathbb{K}[x_1, \ldots, x_n] \to \mathbb{K}[t_1, \ldots, t_m]$ such that $(i, j)$ with total degree at most $d$ using the main algorithm of [CH26]. This implementation requires that $\phi$ be homogeneous in a multigrading which refines total degree which ensures the algorithm is parallelizable. The output is a dictionary whose keys are the multidegrees and values consist of a minimal generating set for that multidegree.

Examples

julia> R, x = polynomial_ring(QQ, :x => (1:2, 1:2))
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[x[1, 1] x[1, 2]; x[2, 1] x[2, 2]])

julia> S, s, t = polynomial_ring(QQ, :s => 1:2, :t => 1:2)
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[s[1], s[2]], QQMPolyRingElem[t[1], t[2]])

julia> phi = hom(R, S, [s[1]*t[1], s[1]*t[2], s[2]*t[1], s[2]*t[2]])
Ring homomorphism
  from multivariate polynomial ring in 4 variables over QQ
  to multivariate polynomial ring in 4 variables over QQ
defined by
  x[1, 1] -> s[1]*t[1]
  x[2, 1] -> s[1]*t[2]
  x[1, 2] -> s[2]*t[1]
  x[2, 2] -> s[2]*t[2]

julia> d = Oscar.components_of_kernel(2, phi);

julia> d[1, 1, 1, 1]
1-element Vector{QQMPolyRingElem}:
 x[1, 1]*x[2, 2] - x[2, 1]*x[1, 2]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
max_grade_domainMethod
max_grade_domain(phi::MPolyAnyMap)

Computes the maximal rank grading on the kernel of $\phi: \mathbb{K}[x_1, \ldots, x_n] \to \mathbb{K}[t_1, \ldots, t_m]$ which can be induced by grading the codomain of phi. The first $m$ columns of the resulting matrix correspond to the degrees of the codomain while the last $n$ columns are the resulting degrees on the domain.

Examples

julia> R, x = polynomial_ring(QQ, :x => (1:2, 1:2))
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[x[1, 1] x[1, 2]; x[2, 1] x[2, 2]])

julia> S, s, t = polynomial_ring(QQ, :s => 1:2, :t => 1:2)
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[s[1], s[2]], QQMPolyRingElem[t[1], t[2]])

julia> phi = hom(R, S, [s[1]*t[1], s[1]*t[2], s[2]*t[1], s[2]*t[2]])
Ring homomorphism
  from multivariate polynomial ring in 4 variables over QQ
  to multivariate polynomial ring in 4 variables over QQ
defined by
  x[1, 1] -> s[1]*t[1]
  x[2, 1] -> s[1]*t[2]
  x[1, 2] -> s[2]*t[1]
  x[2, 2] -> s[2]*t[2]

julia> Oscar.max_grade_domain(phi)
Multivariate polynomial ring in 4 variables over QQ graded by
  x[1, 1] -> [1 0 1 0]
  x[2, 1] -> [1 0 0 1]
  x[1, 2] -> [0 1 1 0]
  x[2, 2] -> [0 1 0 1]
source
jacobianMethod
jacobian(phi::MPolyAnyMap{<:MPolyRing, <:MPolyRing})

Computes the Jacobian of a polynomial map $\phi: \mathbb{K}[x_1, \ldots, x_n] \to \mathbb{K}[t_1, \ldots, t_m]$ such that $(i, j)$ entry is $\frac{d \phi(x_j)}{d t_i}$.

Examples

julia> R, x = polynomial_ring(QQ, :x => (1:2, 1:2))
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[x[1, 1] x[1, 2]; x[2, 1] x[2, 2]])

julia> S, s, t = polynomial_ring(QQ, :s => 1:2, :t => 1:2)
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[s[1], s[2]], QQMPolyRingElem[t[1], t[2]])

julia> phi = hom(R, S, [s[1]*t[1], s[1]*t[2], s[2]*t[1], s[2]*t[2]])
Ring homomorphism
  from multivariate polynomial ring in 4 variables over QQ
  to multivariate polynomial ring in 4 variables over QQ
defined by
  x[1, 1] -> s[1]*t[1]
  x[2, 1] -> s[1]*t[2]
  x[1, 2] -> s[2]*t[1]
  x[2, 2] -> s[2]*t[2]

julia> jacobian(phi)
[t[1]   t[2]      0      0]
[   0      0   t[1]   t[2]]
[s[1]      0   s[2]      0]
[   0   s[1]      0   s[2]]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source