Gröbner bases
This package implements two algorithms to compute Gröbner bases, namely F4 and F5. The F5 implementation is based on Lairez2024. It is recommended to use the F4 implementation as it is faster.
MultivariateCreativeTelescoping.f4 — Function
f4(gens :: Vector{OrePoly{T,M}}, A :: Alg)Return a reduced Gröbner basis of the left ideal generated by gens for the monomial order defined in A.
MultivariateCreativeTelescoping.f5 — Function
f5(gens :: Vector{OrePoly{T,M}}, A :: Alg)Return a reduced Gröbner basis of the left ideal generated by gens for the monomial order defined in A.
Example
julia> using MultivariateCreativeTelescoping
julia> A = OreAlg(order="grevlex x y > grevlex dx dy",poldiffvars=(["x","y"],["dx","dy"]))
Ore algebra
julia> g = parse_vector_OrePoly("[dx - 2*x, dy + 3*y^2]",A)
Vector of Ore polynomials
julia> gb1 = f4(g,A)
Vector of Ore polynomials
julia> gb2 = f5(g,A)
Vector of Ore polynomials
julia> gb1 == gb2
true
julia> prettyprint(gb1,A)
vector of 2 OrePoly
(1)y^2 + (1//3)dy
(1)x + (-1//2)dxWeyl closure
Let $D$ be the algebra
\[ D = \mathbb{Q}(\boldsymbol{t})[\boldsymbol{x}]\langle \partial_{\boldsymbol{t}}, \partial_{\boldsymbol{x}}\rangle\]
where $\boldsymbol{t} =(t_1,\dots,t_m)$ and $\boldsymbol{x} = (x_1,\dots,x_n)$.
Let $R$ be the same algebra as with rational coefficients
\[R = \mathbb{Q}(\boldsymbol{t},\boldsymbol{x})\langle \partial_{\boldsymbol{t}}, \partial_{\boldsymbol{x}}\rangle.\]
The Weyl closure of a submodule $S$ of $D^r$ for $r\in\mathbb{N}$ is defined to be the $D$-module $R\cdot S\cap D^r$. This definition generalizes the definition of Tsai given in his PhD thesis which corresponds to the case $m=0$.
Assuming that $D^r/S$ has finite holonomic rank and that generators gens of $S$ are given as input of the function weyl_closure, it returns a Gröbner basis of a $D$-module $S'$ such that $D^r/S'$ is holonomic and $S' \subset R\cdot S\cap D^r$. It is not guaranteed that the algorithm returns the full weyl closure.
MultivariateCreativeTelescoping.weyl_closure_init — Function
weyl_closure_init(A :: OreAlg)Initialisation function for weyl_closure
MultivariateCreativeTelescoping.weyl_closure — Function
weyl_closure(gens::Vector{OrePoly{T,M}}, A :: OreAlg, init :: WeylClosureInit)Return a Gröbner basis of a submodule of the Weyl closure of the module generated by gens.
Example
Let $W_2 = \mathbb{Q}[x,y]\langle \partial_t, \partial_x\rangle$ be the second Weyl algebra and let $f = \frac{1}{x^2 -y^3}$. The function $f$ is annihilated by the operators $\partial_x (x^2-y^3)$ and $\partial_y (x^2-y^3)$. But these two equations do not generate the full annihilator of $f$ in $W_2$. A third equation can be found using the Weyl closure.
First we load the package, define the algebra and the two obvious equations annihilating $f$.
julia> using MultivariateCreativeTelescoping
julia> A = OreAlg(order = "grevlex x y > grevlex dx dy",poldiffvars=(["x","y"],["dx","dy"]))
Ore algebra
julia> gens = [parse_OrePoly("dx*(x^2-y^3)",A),parse_OrePoly("dy*(x^2-y^3)",A)]
Vector of Ore polynomials Then we can compute its weyl closure
julia> init = weyl_closure_init(A)
WeylClosureInit
julia> gb = weyl_closure(gens,A,init)
Vector of Ore polynomials And indeed we found a third equation.
julia> prettyprint(f5(gens,A),A)
vector of 2 OrePoly
(1)dxy^3 + (-1)dxx^2
(1)dyy^3 + (-1)dyx^2
julia> prettyprint(gb,A)
vector of 3 OrePoly
(1)dyy^3 + (-1)dyx^2
(3)dxy^2 + (2)dyx
(3)dxx + (2)dyy + (1)