# Operations on Modules

### Kernel

kernelMethod
kernel(a::ModuleFPHom)

Return the kernel of a as an object of type SubquoModule.

Additionally, if K denotes this object, return the inclusion map K $\to$ domain(a).

Examples

julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 3);

julia> G = free_module(R, 2);

julia> W = R[y 0; x y; 0 z]
[y   0]
[x   y]
[0   z]

julia> a = hom(F, G, W);

julia> K, incl = kernel(a);

julia> K
Submodule with 1 generator
1 -> x*z*e - y*z*e + y^2*e
represented as subquotient with no relations.

julia> incl
Map with following data
Domain:
=======
Submodule with 1 generator
1 -> x*z*e - y*z*e + y^2*e
represented as subquotient with no relations.
Codomain:
=========
Free module of rank 3 over Multivariate polynomial ring in 3 variables over QQ
julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 1);

julia> A = R[x; y]
[x]
[y]

julia> B = R[x^2; y^3; z^4]
[x^2]
[y^3]
[z^4]

julia> M = SubquoModule(F, A, B)
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> N = M;

julia> V = [y^2*N, x*N]
2-element Vector{SubquoModuleElem{QQMPolyRingElem}}:
x*y^2*e
x*y*e

julia> a = hom(M, N, V);

julia> K, incl = kernel(a);

julia> K
Subquotient of Submodule with 3 generators
1 -> (-x + y^2)*e
2 -> x*y*e
3 -> -x*y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> incl
Map with following data
Domain:
=======
Subquotient of Submodule with 3 generators
1 -> (-x + y^2)*e
2 -> x*y*e
3 -> -x*y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e
Codomain:
=========
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e
julia> R, _ = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])

julia> Z = abelian_group(0)
GrpAb: Z

julia> Rg, (x, y, z) = grade(R, [Z,Z,Z])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> A = Rg[x; y];

julia> B = Rg[x^2; y^3; z^4];

julia> M = SubquoModule(F, A, B)
Graded subquotient of submodule of F generated by
1 -> x*e
2 -> y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> N = M;

julia> V = [y^2*N, x^2*N];

julia> a = hom(M, N, V)
M -> M
x*e -> x*y^2*e
y*e -> x^2*y*e
Graded module homomorphism of degree 

julia> kernel(a)
(Graded subquotient of submodule of F generated by
1 -> -y*e
2 -> (x^2 - y^2)*e
3 -> -x*y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e, Graded subquotient of submodule of F generated by
1 -> -y*e
2 -> (x^2 - y^2)*e
3 -> -x*y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e -> M
-y*e -> -y*e
(x^2 - y^2)*e -> (x^2 - y^2)*e
-x*y*e -> -x*y*e
Homogeneous module homomorphism)

source

### Image

imageMethod
image(a::ModuleFPHom)

Return the image of a as an object of type SubquoModule.

Additionally, if I denotes this object, return the inclusion map I $\to$ codomain(a).

Examples

julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 3);

julia> G = free_module(R, 2);

julia> W = R[y 0; x y; 0 z]
[y   0]
[x   y]
[0   z]

julia> a = hom(F, G, W);

julia> I, incl = image(a);

julia> I
Submodule with 3 generators
1 -> y*e
2 -> x*e + y*e
3 -> z*e
represented as subquotient with no relations.

julia> incl
Map with following data
Domain:
=======
Submodule with 3 generators
1 -> y*e
2 -> x*e + y*e
3 -> z*e
represented as subquotient with no relations.
Codomain:
=========
Free module of rank 2 over Multivariate polynomial ring in 3 variables over QQ
julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 1);

julia> A = R[x; y]
[x]
[y]

julia> B = R[x^2; y^3; z^4]
[x^2]
[y^3]
[z^4]

julia> M = SubquoModule(F, A, B)
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> N = M;

julia> V = [y^2*N, x*N]
2-element Vector{SubquoModuleElem{QQMPolyRingElem}}:
x*y^2*e
x*y*e

julia> a = hom(M, N, V);

julia> I, incl = image(a);

julia> I
Subquotient of Submodule with 2 generators
1 -> x*y^2*e
2 -> x*y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> incl
Map with following data
Domain:
=======
Subquotient of Submodule with 2 generators
1 -> x*y^2*e
2 -> x*y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e
Codomain:
=========
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e
julia> R, _ = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])

julia> Z = abelian_group(0)
GrpAb: Z

julia> Rg, (x, y, z) = grade(R, [Z,Z,Z])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> A = Rg[x; y];

julia> B = Rg[x^2; y^3; z^4];

julia> M = SubquoModule(F, A, B)
Graded subquotient of submodule of F generated by
1 -> x*e
2 -> y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> N = M;

julia> V = [y^2*N, x^2*N];

julia> a = hom(M, N, V)
M -> M
x*e -> x*y^2*e
y*e -> x^2*y*e
Graded module homomorphism of degree 

julia> image(a)
(Graded subquotient of submodule of F generated by
1 -> x*y^2*e
2 -> x^2*y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e, Graded subquotient of submodule of F generated by
1 -> x*y^2*e
2 -> x^2*y*e
by submodule of F generated by
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e -> M
x*y^2*e -> x*y^2*e
x^2*y*e -> x^2*y*e
Homogeneous module homomorphism)
source

### Cokernel

cokernelMethod
cokernel(a::ModuleFPHom)

Return the cokernel of a as an object of type SubquoModule.

Examples

julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 3);

julia> G = free_module(R, 2);

julia> W = R[y 0; x y; 0 z]
[y   0]
[x   y]
[0   z]

julia> a = hom(F, G, W);

julia> cokernel(a)
Subquotient of Submodule with 2 generators
1 -> e
2 -> e
by Submodule with 3 generators
1 -> y*e
2 -> x*e + y*e
3 -> z*e
julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);

julia> F = free_module(R, 1);

julia> A = R[x; y]
[x]
[y]

julia> B = R[x^2; y^3; z^4]
[x^2]
[y^3]
[z^4]

julia> M = SubquoModule(F, A, B)
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 3 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e

julia> N = M;

julia> V = [y^2*N, x*N]
2-element Vector{SubquoModuleElem{QQMPolyRingElem}}:
x*y^2*e
x*y*e

julia> a = hom(M, N, V);

julia> cokernel(a)
Subquotient of Submodule with 2 generators
1 -> x*e
2 -> y*e
by Submodule with 5 generators
1 -> x^2*e
2 -> y^3*e
3 -> z^4*e
4 -> x*y^2*e
5 -> x*y*e
julia> R, _ = polynomial_ring(QQ, ["x", "y", "z"]);

julia> Z = abelian_group(0);

julia> Rg, (x, y, z) = grade(R,[Z, Z, Z]);

julia> W = Rg[y 0; x y; 0 z]
[y   0]
[x   y]
[0   z]

julia> a = hom(F, G, W)
F -> G
e -> y*e
e -> x*e + y*e
e -> z*e
Graded module homomorphism of degree 

julia> M = cokernel(a)
Graded subquotient of submodule of G generated by
1 -> e
2 -> e
by submodule of G generated by
1 -> y*e
2 -> x*e + y*e
3 -> z*e

source

## Direct Sums and Products

direct_sumMethod
direct_sum(M::ModuleFP{T}...; task::Symbol = :sum) where T

Given modules $M_1\dots M_n$, say, return the direct sum $\bigoplus_{i=1}^n M_i$.

• a vector containing the canonical injections $M_i\to\bigoplus_{i=1}^n M_i$ if task = :sum (default),
• a vector containing the canonical projections $\bigoplus_{i=1}^n M_i\to M_i$ if task = :prod,
• two vectors containing the canonical injections and projections, respectively, if task = :both,
• none of the above maps if task = :none.
source
direct_productMethod
direct_product(M::ModuleFP{T}...; task::Symbol = :prod) where T

Given modules $M_1\dots M_n$, say, return the direct product $\prod_{i=1}^n M_i$.

• a vector containing the canonical projections $\prod_{i=1}^n M_i\to M_i$ if task = :prod (default),
• a vector containing the canonical injections $M_i\to\prod_{i=1}^n M_i$ if task = :sum,
• two vectors containing the canonical projections and injections, respectively, if task = :both,
• none of the above maps if task = :none.
source

## Truncation

truncateFunction
truncate(M::ModuleFP, g::GrpAbFinGenElem, task::Symbol = :with_morphism)

Given a finitely presented graded module M over a $\mathbb Z$-graded multivariate polynomial ring with positive weights, return the truncation of M at degree g.

Put more precisely, return the truncation as an object of type SubquoModule.

Additionally, if N denotes this object,

• return the inclusion map N $\to$ M if task = :with_morphism (default),
• return and cache the inclusion map N $\to$ M if task = :cache_morphism,
• do none of the above if task = :none.

If task = :only_morphism, return only the inclusion map.

truncate(M::ModuleFP, d::Int, task::Symbol = :with_morphism)

Given a module M as above, and given an integer d, convert d into an element g of the grading group of base_ring(I) and proceed as above.

Examples

julia> R, (x, y, z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);

Graded free module R^1() of rank 1 over R

julia> V = [x*F; y^4*F; z^5*F];

julia> M, _ = quo(F, V);

julia> M
e

julia> MT = truncate(M, 3);

julia> MT
Graded subquotient of submodule of F generated by
1 -> z^3*e
2 -> y*z^2*e
3 -> y^2*z*e
4 -> y^3*e
5 -> x*z^2*e
6 -> x*y*z*e
7 -> x*y^2*e
8 -> x^2*z*e
9 -> x^2*y*e
10 -> x^3*e
by submodule of F generated by
1 -> x*e
2 -> y^4*e
3 -> z^5*e
source