In this section, for the convenience of the reader, we recall from the chapters on rings and fields how to create multivariate polynomial rings and their elements, adding illustrating examples. At the same time, we introduce and illustrate a ring type for modelling multivariate polynomial rings with gradings.
OSCAR provides types for dense univariate and sparse multivariate polynomials. The univariate ring types belong to the abstract type PolyRing{T}, their elements have abstract type PolyRingElem{T}. The multivariate ring types belong to the abstract type MPolyRing{T}, their elements have abstract type MPolyRingElem{T}. Here, T is the element type of the coefficient ring of the polynomial ring.
Given a ring C and a vector xs of Symbols, Strings, or Characters, return a tuple R, vars, say, which consists of a polynomial ring R with coefficient ring C and a vector vars of generators (variables) which print according to the entries of xs.
Note
Caching is used to ensure that a given ring constructed from given parameters is unique in the system. For example, there is only one ring of multivariate polynomials over Z with variables printing as x, y, z.
julia> R, (x, y, z) = polynomial_ring(ZZ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over ZZ, ZZMPolyRingElem[x, y, z])
julia> typeof(R)
ZZMPolyRing
julia> typeof(x)
ZZMPolyRingElem
julia> S, (a, b, c) = polynomial_ring(ZZ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over ZZ, ZZMPolyRingElem[x, y, z])
julia> T, _ = polynomial_ring(ZZ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over ZZ, ZZMPolyRingElem[x, y, z])
julia> R === S === T
true
julia> R1, x = polynomial_ring(QQ, [:x])
(Multivariate polynomial ring in 1 variable over QQ, QQMPolyRingElem[x])
julia> typeof(x)
Vector{QQMPolyRingElem} (alias for Array{QQMPolyRingElem, 1})
julia> R2, (x,) = polynomial_ring(QQ, [:x])
(Multivariate polynomial ring in 1 variable over QQ, QQMPolyRingElem[x])
julia> typeof(x)
QQMPolyRingElem
julia> R3, x = polynomial_ring(QQ, :x)
(Univariate polynomial ring in x over QQ, x)
julia> typeof(x)
QQPolyRingElem
julia> T, x = polynomial_ring(GF(3), ["x[1]", "x[2]"]);
julia> x
2-element Vector{FqMPolyRingElem}:
x[1]
x[2]
The constructor illustrated below allows for the convenient handling of variables with multi-indices:
julia> Qx, x = QQ["x"];
julia> K, a = number_field(x^2 - 5, "a")
(Number field of degree 2 over QQ, a)
julia> Kt, t = K["t"];
julia> L, b = number_field(t^3 - 3, "b")
(Relative number field of degree 3 over K, b)
julia> Qx, x = QQ["x"];
julia> julia> L, a = number_field([x^2 - 5, x^3 - 3], "a")
(Non-simple number field of degree 6 over QQ, AbsNonSimpleNumFieldElem[a1, a2])
julia> K, a = quadratic_field(5)
(Real quadratic field defined by x^2 - 5, sqrt(5))
julia> K, zeta = cyclotomic_field(3)
(Cyclotomic field of order 3, z_3)
julia> GF(3)
Prime field of characteristic 3
julia> GF(ZZ(2)^127 - 1)
Prime field of characteristic 170141183460469231731687303715884105727
julia> GF(3,2)
Finite field of degree 2 and characteristic 3
julia> GF(3,2) == GF(9)
true
julia> F, a = finite_field(2, 70, "a")
(Finite field of degree 70 and characteristic 2, a)
julia> K, a = finite_field(9, "a")
(Finite field of degree 2 and characteristic 3, a)
julia> Kx, x = K["x"];
julia> L, b = finite_field(x^3 + x^2 + x + 2, "b")
(Finite field of degree 3 over K, b)
julia> K = algebraic_closure(GF(3))
Algebraic closure of prime field of characteristic 3
julia> L = algebraic_closure(QQ)
Algebraic closure of rational field
julia> K = GF(101)
Prime field of characteristic 101
julia> Kx, x = rational_function_field(K, :x)
(Rational function field over K, x)
julia> Kxy, y = polynomial_ring(Kx, :y)
(Univariate polynomial ring in y over Kx, y)
julia> F, a = function_field(x^3-y^2)
(Function Field over K with defining polynomial 100*_a^2 + x^3, _a)
Given a polynomial ring R=C[x1,…,xn], we may endow R with various gradings. The standard Z-grading on R is the decomposition R=⨁d∈ZRd=⨁d≥0Rd by the usual degree of polynomials. More general Z-gradings are obtained by assigning integer weights to the variables and considering the corresponding weighted degrees. Even more generally, we may consider multigradings: Given a finitely generated abelian group G, a multigrading on R by G, or a G-grading, or simply a grading, corresponds to a semigroup homomorphism ϕ:Nn→G: Given ϕ, the degree of a monomial xα is the image deg(xα):=ϕ(α)∈G; the induced G-grading on R is the decomposition R=⨁g∈GRg satisfying Rg⋅Rh⊂Rg+h, where Rg is the free C-module generated by the monomials of degree g. This grading is determined by assigning the weightsdeg(xi) to the xi. In other words, it is determined by the weight vectorW=(deg(x1),…,deg(xn))∈Gn.
We refer to the textbooks [MS05] and [KR05] for details on multigradings. With respect to notation, we follow the former book.
Note
Given a G-grading on R, we refer to G as the grading group of R. Moreover, we then say that R is G-graded, or simply that R is graded. If R is a polynomial ring over a field, we say that a G-grading on R is positive if G is free and each graded part Rg, g∈G, has finite dimension. We then also say that R is positively graded (by G). Note that the positivity condition can be equivalently expressed by asking that G is free and that the degree zero part consists of the constants only (see Theorem 8.6 in [MS05]).
Note
Given a G-grading on R in OSCAR, we say that R is Zm-graded if is_free(G) && number_of_generators(G) == rank(G) == m evaluates to true. In this case, conversion routines allow one to switch back and forth between elements of G and integer vectors of length m. Specifically, if R is Z-graded, that is, is_free(G) && number_of_generators(G) == rank(G) == 1 evaluates to true, elements of G may be converted to integers and vice versa.
Multivariate rings with gradings are modeled by objects of type MPolyDecRing{T, S} :< MPolyRing{T}, with elements of type MPolyRingElem_dec{T, S} :< MPolyRingElem{T}. Here, S is the element type of the multivariate ring, and T is the element type of its coefficient ring as above.
Note
The types MPolyDecRing{T, S} and MPolyRingElem_dec{T, S} are also meant to eventually model multivariate rings with filtrations and their elements.
The following function allows one, in particular, to distinguish between graded and filtered rings.
There are two basic ways of creating multivariate rings with gradings: While the grade function allows one to create a graded ring by assigning a grading to a polynomial ring already constructed, the graded_polynomial_ring function is meant to create a graded polynomial ring all at once.
Given a vector W of ngens(R) elements of a finitely generated abelian group G, say, create a G-graded ring by assigning the entries of W as weights to the variables of R. Return the new ring as an object of type MPolyDecRing, together with the vector of variables.
Examples
julia> R, (t, x, y) = polynomial_ring(QQ, [:t, :x, :y])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[t, x, y])
julia> typeof(R)
QQMPolyRing
julia> typeof(x)
QQMPolyRingElem
julia> G = abelian_group([0])
Z
julia> g = gen(G, 1)
Abelian group element [1]
julia> S, (t, x, y) = grade(R, [-g, g, g])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[t, x, y])
julia> S
Multivariate polynomial ring in 3 variables over QQ graded by
t -> [-1]
x -> [1]
y -> [1]
julia> typeof(S)
MPolyDecRing{QQFieldElem, QQMPolyRing}
julia> S isa MPolyRing
true
julia> typeof(x)
MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}
julia> R, x = polynomial_ring(QQ, :x => 1:5)
(Multivariate polynomial ring in 5 variables over QQ, QQMPolyRingElem[x[1], x[2], x[3], x[4], x[5]])
julia> G = abelian_group([0, 0])
Z^2
julia> g = gens(G)
2-element Vector{FinGenAbGroupElem}:
[1, 0]
[0, 1]
julia> W = [g[1], g[1], g[2], g[2], g[2]];
julia> S, _ = grade(R, W)
(Graded multivariate polynomial ring in 5 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[1], x[2], x[3], x[4], x[5]])
julia> S
Multivariate polynomial ring in 5 variables over QQ graded by
x[1] -> [1 0]
x[2] -> [1 0]
x[3] -> [0 1]
x[4] -> [0 1]
x[5] -> [0 1]
julia> typeof(x[1])
QQMPolyRingElem
julia> x = map(S, x)
5-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
x[1]
x[2]
x[3]
x[4]
x[5]
julia> typeof(x[1])
MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}
julia> R, x = polynomial_ring(QQ, :x => 1:5)
(Multivariate polynomial ring in 5 variables over QQ, QQMPolyRingElem[x[1], x[2], x[3], x[4], x[5]])
julia> G = abelian_group([0, 0, 2, 2])
Finitely generated abelian group
with 4 generators and 4 relations and relation matrix
[0 0 0 0]
[0 0 0 0]
[0 0 2 0]
[0 0 0 2]
julia> g = gens(G);
julia> W = [g[1]+g[3]+g[4], g[2]+g[4], g[1]+g[3], g[2], g[1]+g[2]]
5-element Vector{FinGenAbGroupElem}:
[1, 0, 1, 1]
[0, 1, 0, 1]
[1, 0, 1, 0]
[0, 1, 0, 0]
[1, 1, 0, 0]
julia> S, x = grade(R, W)
(Graded multivariate polynomial ring in 5 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[1], x[2], x[3], x[4], x[5]])
julia> S
Multivariate polynomial ring in 5 variables over QQ graded by
x[1] -> [1 0 1 1]
x[2] -> [0 1 0 1]
x[3] -> [1 0 1 0]
x[4] -> [0 1 0 0]
x[5] -> [1 1 0 0]
Given a vector W of ngens(R) integer vectors of the same size m, say, create a free abelian group of type FinGenAbGroup given by m free generators, and convert the vectors in W to elements of that group. Then create a Zm-graded ring by assigning the group elements as weights to the variables of R, and return the new ring, together with the vector of variables.
Given a vector W of ngens(R) integers, create a free abelian group of type FinGenAbGroup given by one free generator, and convert the entries of W to elements of that group. Then create a Z-graded ring by assigning the group elements as weights to the variables of R, and return the new ring, together with the vector of variables.
grade(R::MPolyRing)
As above, where the grading is the standard Z-grading on R.
Examples
julia> R, (x, y, z) = polynomial_ring(QQ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> W = [1, 2, 3];
julia> S, (x, y, z) = grade(R, W);
julia> S
Multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
y -> [2]
z -> [3]
julia> T, (x, y, z) = grade(R);
julia> T
Multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
y -> [1]
z -> [1]
Create a multivariate polynomial_ring with coefficient ring C and variables as described by args... (using the exact same syntax as for polynomial_ring), and grade this ring according to the data provided by the keyword argument weights. Return the graded ring as an object of type MPolyDecRing, together with the variables.
Note
If no weights are entered, the returned ring is standard Z-graded, i.e. all variables are graded with weight 1.
Note
kwargs allows one to set the same keywords as for polynomial_ring.
Examples
julia> G = abelian_group([0, 0, 2, 2])
Finitely generated abelian group
with 4 generators and 4 relations and relation matrix
[0 0 0 0]
[0 0 0 0]
[0 0 2 0]
[0 0 0 2]
julia> W1 = [G[1]+G[3]+G[4], G[2]+G[4], G[1]+G[3], G[2], G[1]+G[2]];
julia> R1, x, y = graded_polynomial_ring(QQ, :x => 1:2, :y => 1:3, W1);
julia> R1
Multivariate polynomial ring in 5 variables over QQ graded by
x[1] -> [1 0 1 1]
x[2] -> [0 1 0 1]
y[1] -> [1 0 1 0]
y[2] -> [0 1 0 0]
y[3] -> [1 1 0 0]
julia> W2 = [[1, 0], [0, 1], [1, 0], [4, 1]];
julia> R2, x = graded_polynomial_ring(QQ, 4, :x; weights = W2);
julia> R2
Multivariate polynomial ring in 4 variables over QQ graded by
x1 -> [1 0]
x2 -> [0 1]
x3 -> [1 0]
x4 -> [4 1]
julia> R3, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]; weights = [1, 2, 3]);
julia> R3
Multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
y -> [2]
z -> [3]
julia> R4, x = graded_polynomial_ring(QQ, :x => 1:3);
julia> R4
Multivariate polynomial ring in 3 variables over QQ graded by
x[1] -> [1]
x[2] -> [1]
x[3] -> [1]
julia> R5, x, y = graded_polynomial_ring(QQ, :x => 1:3, :y => (1:2, 1:2); weights = 1:7);
julia> R5
Multivariate polynomial ring in 7 variables over QQ graded by
x[1] -> [1]
x[2] -> [2]
x[3] -> [3]
y[1, 1] -> [4]
y[2, 1] -> [5]
y[1, 2] -> [6]
y[2, 2] -> [7]
Return true if R is Zm-graded for some m, false otherwise.
Note
Writing G = grading_group(R), we say that R is Zm-graded G is free abelian of rank m, and ngens(G) == m.
Examples
julia> G = abelian_group([0, 0, 2, 2])
Finitely generated abelian group
with 4 generators and 4 relations and relation matrix
[0 0 0 0]
[0 0 0 0]
[0 0 2 0]
[0 0 0 2]
julia> W = [G[1]+G[3]+G[4], G[2]+G[4], G[1]+G[3], G[2], G[1]+G[2]];
julia> S, x = graded_polynomial_ring(QQ, :x => 1:5; weights = W)
(Graded multivariate polynomial ring in 5 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[1], x[2], x[3], x[4], x[5]])
julia> is_zm_graded(S)
false
julia> G = abelian_group(ZZMatrix([1 -1]))
Finitely generated abelian group
with 2 generators and 1 relation and relation matrix
[1 -1]
julia> g = gen(G, 1)
Abelian group element [0, 1]
julia> W = [g, g, g, g];
julia> R, (w, x, y, z) = graded_polynomial_ring(QQ, [:w, :x, :y, :z], W);
julia> R
Multivariate polynomial ring in 4 variables over QQ graded by
w -> [0 1]
x -> [0 1]
y -> [0 1]
z -> [0 1]
julia> is_free(G)
true
julia> is_zm_graded(R)
false
Return true if R is positively graded, false otherwise.
Note
We say that R is positively graded by a finitely generated abelian group G if the coefficient ring of R is a field, G is free, and each graded part Rg, g∈G, has finite dimension.
Examples
julia> S, (t, x, y) = graded_polynomial_ring(QQ, [:t, :x, :y]; weights = [-1, 1, 1])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[t, x, y])
julia> grading_group(S)
Z
julia> is_positively_graded(S)
false
julia> G = abelian_group([0, 2])
Finitely generated abelian group
with 2 generators and 2 relations and relation matrix
[0 0]
[0 2]
julia> is_free(G)
false
julia> W = [gen(G, 1)+gen(G, 2), gen(G, 1)]
2-element Vector{FinGenAbGroupElem}:
[1, 1]
[1, 0]
julia> S, (x, y) = graded_polynomial_ring(QQ, [:x, :y]; weights = W)
(Graded multivariate polynomial ring in 2 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y])
julia> is_positively_graded(S)
false
julia> R, (x, y, z) = polynomial_ring(QQ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> coefficient_ring(R)
Rational field
julia> gens(R)
3-element Vector{QQMPolyRingElem}:
x
y
z
julia> gen(R, 2)
y
julia> R[3]
z
julia> number_of_generators(R)
3
julia> R, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z], [1, 2, 3])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> G = grading_group(R)
Z
julia> H = free_abelian_group(1)
Z
julia> G == H
false
Given a polynomial ring R over a field which is graded by a free group of type FinGenAbGroup, and given an element g of that group, return the monomials of degree g in R.
Given a Zm-graded polynomial ring R over a field and a vector W of m integers, convert W into an element g of the grading group of R and proceed as above.
monomial_basis(R::MPolyDecRing, d::IntegerUnion)
Given a Z-graded polynomial ring R over a field and an integer d, convert d into an element g of the grading group of R and proceed as above.
Note
If the component of the given degree is not finite dimensional, an error message will be thrown.
Examples
julia> T, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> G = grading_group(T)
Z
julia> L = monomial_basis(T, 2)
6-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
z^2
y*z
y^2
x*z
x*y
x^2
Given a polynomial ring R over a field which is graded by a free group, and given an element g of that group, return the homogeneous component of R of degree g as a standard vector space. Additionally, return the map which sends an element of that vector space to the corresponding monomial in R.
Given a Zm-graded polynomial ring R over a field, and given a vector W of m integers, convert W into an element g of the grading group of R and proceed as above.
One way to create elements of a multivariate polynomial ring is to build up polynomials from the generators (variables) of the ring using basic arithmetic as shown below:
julia> R, (x, y, z) = polynomial_ring(QQ, [:x, :y, :z])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> f = 3*x^2+y*z
3*x^2 + y*z
julia> g = R(QQ.([3, 1]), [[2, 0, 0], [0, 1, 1]])
3*x^2 + y*z
julia> f == g
true
An often more effective way to create polynomials is to use the MPoly build context as indicated below:
julia> R, (x, y) = polynomial_ring(QQ, [:x, :y])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])
julia> B = MPolyBuildCtx(R)
Builder for an element of R
julia>for i = 1:5 push_term!(B, QQ(i), [i, i-1]) endjulia> finish(B)
5*x^5*y^4 + 4*x^4*y^3 + 3*x^3*y^2 + 2*x^2*y + x
Given a multivariate polynomial ring R, zero(R) and one(R) refer to the additive and multiplicative identity of R, respectively. Relevant test calls on an element f of R are iszero(f) and isone(f).
Given an element f of a multivariate polynomial ring R or a graded version of such a ring,
parent(f) refers to R, and
total_degree(f) to the total degree of f.
Note
Given a set of variables x={x1,…,xn}, the total degree of a monomial xα=x1α1⋯xnαn∈Monn(x) is the sum of the αi. The total degree of a polynomial f is the maximum of the total degrees of its monomials. In particular, the notion of total degree ignores the weights given to the variables in the graded case.
Given an element f of a graded multivariate ring, and given an element g of the grading group of that ring, return the homogeneous component of f of degree g.
Given an element f of a Zm-graded multivariate ring R, say, and given a vector g of m integers, convert g into an element of the grading group of R, and return the homogeneous component of f whose degree is that element.
Given an element f of a Z-graded multivariate ring R, say, and given an integer g, convert g into an element of the grading group of R, and return the homogeneous component of f whose degree is that element.
Examples
julia> G = abelian_group([0, 0, 2, 2])
Finitely generated abelian group
with 4 generators and 4 relations and relation matrix
[0 0 0 0]
[0 0 0 0]
[0 0 2 0]
[0 0 0 2]
julia> W = [G[1]+G[3]+G[4], G[2]+G[4], G[1]+G[3], G[2], G[1]+G[2]];
julia> S, x = graded_polynomial_ring(QQ, :x => 1:5; weights = W)
(Graded multivariate polynomial ring in 5 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[1], x[2], x[3], x[4], x[5]])
julia> f = x[1]^2+x[3]^2+x[5]^2x[1]^2 + x[3]^2 + x[5]^2
julia> homogeneous_component(f, 2*G[1])
x[1]^2 + x[3]^2
julia> W = [[1, 0], [0, 1], [1, 0], [4, 1]]
4-element Vector{Vector{Int64}}:
[1, 0]
[0, 1]
[1, 0]
[4, 1]
julia> R, x = graded_polynomial_ring(QQ, :x => 1:4; weights = W)
(Graded multivariate polynomial ring in 4 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[1], x[2], x[3], x[4]])
julia> f = x[1]^2*x[2]+x[4]
x[1]^2*x[2] + x[4]
julia> homogeneous_component(f, [2, 1])
x[1]^2*x[2]
julia> R, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]; weights = [1, 2, 3])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> f = x^2+y+z
x^2 + y + z
julia> homogeneous_component(f, 1)
0
julia> homogeneous_component(f, 2)
x^2 + y
julia> homogeneous_component(f, 3)
z
If R is a multivariate polynomial ring, and S is any ring, then a ring homomorphism R→S is determined by specifying its restriction to the coefficient ring of R, and by assigning an image to each variable of R. In OSCAR, such homomorphisms are created by using the following constructor:
Given a homomorphism coeff_map from C to S, where C is the coefficient ring of R, and given a vector images of nvars(R) elements of S, return the homomorphism R→S whose restriction to C is coeff_map, and which sends the i-th variable of R to the i-th entry of images.
If no coefficient map is entered, invoke a canonical homomorphism of C to S, if such a homomorphism exists, and throw an error, otherwise.
Note
In case check = true (default), the function checks the conditions below:
If S is graded, the assigned images must be homogeneous with respect to the given grading.
If S is noncommutative, the assigned images must pairwise commute.
Examples
julia> K, a = finite_field(2, 2, "a");
julia> R, (x, y) = polynomial_ring(K, [:x, :y]);
julia> F = hom(R, R, z -> z^2, [y, x])
Ring homomorphism
from multivariate polynomial ring in 2 variables over K
to multivariate polynomial ring in 2 variables over K
defined by
x -> y
y -> x
with map on coefficients
#1
julia> F(a * y)
(a + 1)*x
julia> Qi, i = quadratic_field(-1)
(Imaginary quadratic field defined by x^2 + 1, sqrt(-1))
julia> S, (x, y) = polynomial_ring(Qi, [:x, :y]);
julia> G = hom(S, S, hom(Qi, Qi, -i), [x^2, y^2])
Ring homomorphism
from multivariate polynomial ring in 2 variables over Qi
to multivariate polynomial ring in 2 variables over Qi
defined by
x -> x^2
y -> y^2
with map on coefficients
Map: Qi -> Qi
julia> G(x+i*y)
x^2 - sqrt(-1)*y^2
julia> R, (x, y) = polynomial_ring(ZZ, [:x, :y]);
julia> f = 3*x^2+2*x+1;
julia> S, (x, y) = polynomial_ring(GF(2), [:x, :y]);
julia> H = hom(R, S, gens(S))
Ring homomorphism
from multivariate polynomial ring in 2 variables over ZZ
to multivariate polynomial ring in 2 variables over GF(2)
defined by
x -> x
y -> y
julia> H(f)
x^2 + 1
Given a ring homomorphism F from R to S as above, domain(F) and codomain(F) refer to R and S, respectively.
Note
Homomorphisms from quotients of multivariate rings are discussed in the section on affine algebras. In particular, in the same section, we introduce the OSCAR homomorphism type AffAlgHom which addresses ring homomorphisms R→S such that the types of R and S are subtypes of Union{MPolyRing{T}, MPolyQuoRing{U1}} and Union{MPolyRing{T}, MPolyQuoRing{U2}}, respectively. Here, T <: FieldElem and U1 <: MPolyRingElem{T}, U2 <: MPolyRingElem{T}.
Settings
This document was generated with Documenter.jl version 1.12.0 on Friday 6 June 2025. Using Julia version 1.10.9.