Differential polynomial rings

A differential polynomial ring over the commutative ring $R$ is an action polynomial ring $A$ whose action maps are derivations of $A$, i.e. $R$-linear maps that also satisfy the Leibniz rule.

Construction

We provide the following methods to construct derivations on the coefficient ring R. Using these is necessary, if one wants to use differential polynomial rings with nontrivial derivations.

action_derivation — Method
action_derivation(R::Ring)

Construct the zero derivation on the ring R.

Experimental

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

source
action_derivation — Method
action_derivation(m::Map{D, D}) where {D <: Ring}

Wrap the map m into an ActionDerivation. This does not check whether m is actually a derivation.

Experimental

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

source

We provide the following constructors to create differential polynomial rings where all derivations are trivial, i.e. the zero map on the coefficient ring.

differential_polynomial_ring — Method
differential_polynomial_ring(R::Ring, action_indeterminates::Union{Vector{Symbol}, Int}, n_action_maps::Int) -> Tuple{DifferentialPolyRing, Vector{DifferentialPolyRingElem}}

Construct the differential polynomial ring over the coefficient ring R with the given action indeterminates and n_action_maps-many zero derivations.

  • If action_indeterminates is a vector of symbols, those names are used.
  • If it is an integer m, the symbols u1, …, um are generated automatically.

In both cases, the jet variables that are initially available are those with jet [0,…,0], one for each action indeterminate.

This method returns a tuple (dpr, gens) where dpr is the resulting differential polynomial ring and gens is the vector of initial jet variables.

This constructor also accepts all keyword arguments of set_ranking! to control the ranking.

Examples

julia> R, variablesR = differential_polynomial_ring(QQ, 3, 4)
(Differential polynomial ring in 3 action indeterminates over QQ, DifferentialPolyRingElem{QQFieldElem}[u1[0,0,0,0], u2[0,0,0,0], u3[0,0,0,0]])

julia> R
Differential polynomial ring in 3 action indeterminates u1, u2, u3
with 4 commuting derivations
  over rational field

julia> variablesR
3-element Vector{DifferentialPolyRingElem{QQFieldElem}}:
 u1[0,0,0,0]
 u2[0,0,0,0]
 u3[0,0,0,0]

julia> S, variablesS = differential_polynomial_ring(QQ, [:a, :b, :c], 4)
(Differential polynomial ring in 3 action indeterminates over QQ, DifferentialPolyRingElem{QQFieldElem}[a[0,0,0,0], b[0,0,0,0], c[0,0,0,0]])

julia> S
Differential polynomial ring in 3 action indeterminates a, b, c
with 4 commuting derivations
  over rational field

julia> variablesS
3-element Vector{DifferentialPolyRingElem{QQFieldElem}}:
 a[0,0,0,0]
 b[0,0,0,0]
 c[0,0,0,0]
Experimental

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

source
differential_polynomial_ring — Method
differential_polynomial_ring(R::Ring, x::Symbol, n_action_maps::Int) -> Tuple{DifferentialPolyRing, DifferentialPolyRingElem}

This constructor behaves exactly like differential_polynomial_ring but only allows for one action indeterminate x instead of a vector of these. Consequently, this method returns the tuple (dpr, x[0,…,0]) where dpr is the resulting differential polynomial ring.

Examples

This constructor is preferred when one only wants to have one action indeterminate:

julia> R, x = differential_polynomial_ring(ZZ, :x, 2)
(Differential polynomial ring in 1 action indeterminates over ZZ, x[0,0])

julia> x
x[0,0]

If we instead construct this ring by passing the single action indeterminate as a vector, the variable x does not behave as intended:

julia> R, x = differential_polynomial_ring(ZZ, [:x], 2)
(Differential polynomial ring in 1 action indeterminates over ZZ, DifferentialPolyRingElem{ZZRingElem}[x[0,0]])

julia> x
1-element Vector{DifferentialPolyRingElem{ZZRingElem}}:
 x[0,0]
Experimental

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

source

We provide the following constructors to create differential polynomial rings with arbitrary commuting derivations. Note that commutativity is not actually checked and that ensuring it is left to the user.

differential_polynomial_ring — Method
differential_polynomial_ring(R::Ring, action_indeterminates::Union{Vector{Symbol}, Int}, action_maps::Vector{<:ActionDerivation}; kwargs...) -> Tuple{DifferentialPolyRing, Vector{DifferentialPolyRingElem}}

This constructor behaves exactly like and comes with the same features as differential_polynomial_ring but additionally allows the user to pass a custom vector of derivations action_maps. In particular, this constructor allows for nontrivial derivations.

Examples

julia> S, (x, y) = polynomial_ring(QQ, [:x, :y]);

julia> nontrivial_derivations = action_derivation.([map_from_func(S, S, p -> derivative(p, x)), map_from_func(S, S, p -> derivative(p, y))])
2-element Vector{Oscar.NontrivialActionDerivation{QQMPolyRing}}:
 Derivation on S
 Derivation on S

julia> dpr, (u, v) = differential_polynomial_ring(S, [:u, :v], nontrivial_derivations)
(Differential polynomial ring in 2 action indeterminates over S, DifferentialPolyRingElem{QQMPolyRingElem}[u[0,0], v[0,0]])
Experimental

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

source
differential_polynomial_ring — Method
differential_polynomial_ring(R::Ring, action_indeterminate::Symbol, action_maps::Vector{<:ActionDerivation}; kwargs...) -> Tuple{DifferentialPolyRing, DifferentialPolyRingElem}

This constructor behaves exactly like differential_polynomial_ring in that only a single action indeterminate is passed as a symbol but additionally allows the user to pass a custom vector of derivations action_maps. In particular, this constructor allows for nontrivial derivations.

Experimental

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

source

Applying derivations

You can use the following methods to apply the derivations of a differential polynomial ring to its elements:

apply_action — Method
apply_action(p::DifferentialPolyRingElem, i::Int)

Apply the i-th derivation to the differential polynomial p.

Examples

julia> dpr, (a,b,c) = differential_polynomial_ring(ZZ, [:a, :b, :c], 2); f = -2*a*b + 3*a*b^2;

julia> apply_action(3*a, 1)
3*a[1,0]

julia> apply_action(3*a, 2)
3*a[0,1]

julia> apply_action(f, 1)
(3*b[0,0]^2 - 2*b[0,0])*a[1,0] + 6*b[1,0]*a[0,0]*b[0,0] - 2*b[1,0]*a[0,0]

julia> apply_action(f, 2)
(3*b[0,0]^2 - 2*b[0,0])*a[0,1] + 6*b[0,1]*a[0,0]*b[0,0] - 2*b[0,1]*a[0,0]
Experimental

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

source
apply_action — Method
apply_action(p::DifferentialPolyRingElem, d::Vector{Int})

Successively apply the i-th derivation d[i]-times to the differential polynomial p, where $i = 1, \ldots, \mathrm{length}(d)$.

Experimental

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

source
Warning

After calling one of these methods, all jet variables that arise within their computation will be tracked afterwards.