# Homomorphisms of finitely presented graded modules#

AUTHORS:

• Robert R. Bruner, Michael J. Catanzaro (2012): Initial version.

• Sverre Lunoee–Nielsen and Koen van Woerden (2019-11-29): Updated the original software to Sage version 8.9.

• Sverre Lunoee–Nielsen (2020-07-01): Refactored the code and added new documentation and tests.

Create a homomorphism between finitely presented graded modules.

INPUT:

• parent – a homspace of finitely presented graded modules

• values – a list of elements in the codomain; each element corresponds to a module generator in the domain

• check – boolean (default: True); if True, check that the morphism is well-defined

change_ring(algebra)#

Change the base ring of self.

INPUT:

• algebra – a graded algebra

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A2 = SteenrodAlgebra(2, profile=(3,2,1))
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
sage: M = FPModule(A2, [0], relations=[[Sq(1)]])
sage: N = FPModule(A2, [0], relations=[[Sq(4)],[Sq(1)]])

sage: f = Hom(M,N)([A2.Sq(3)*N.generator(0)]); f
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
To:   Finitely presented left module on 1 generator and 2 relations over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
Defn: g[0] |--> Sq(3)*g[0]

sage: f.base_ring()
sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]

sage: g = f.change_ring(A3)
sage: g.base_ring()
sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]

cokernel_projection()#

Return the map to the cokernel of self.

OUTPUT:

The natural projection from the codomain of this homomorphism to its cokernel.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A1 = SteenrodAlgebra(2, profile=(2,1))
sage: M = FPModule(A1, [0], [[Sq(2)]])
sage: F = FPModule(A1, [0])

sage: r = Hom(F, M)([A1.Sq(1)*M.generator(0)])
sage: co = r.cokernel_projection(); co
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [2, 1]
To:   Finitely presented left module on 1 generator and 2 relations over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [2, 1]
Defn: g[0] |--> g[0]

sage: co.domain().is_trivial()
False

degree()#

The degree of self.

OUTPUT:

The integer degree of self.

EXAMPLES:

sage: from sage.modules.fp_graded.module import *
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
sage: N = FPModule(A, [2], [[Sq(4)]])
sage: homspace = Hom(M, N)

sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]
sage: f = homspace(values)
sage: f.degree()
7


The trivial homomorphism has no degree:

sage: homspace.zero().degree()
Traceback (most recent call last):
...
ValueError: the zero morphism does not have a well-defined degree

fp_module()#

Create a finitely presented module from self.

OUTPUT:

The finitely presented module having presentation equal to self as long as the domain and codomain are free.

EXAMPLES:

We construct examples with free modules that are presented with a redundant relation:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: F1 = FPModule(A, (2,), [[0]])
sage: F2 = FPModule(A, (0,), [[0]])
sage: v = F2([Sq(2)])
sage: pres = Hom(F1, F2)([v])
sage: M = pres.fp_module(); M
Finitely presented left module on 1 generator and 1 relation over
mod 2 Steenrod algebra, milnor basis
sage: M.generator_degrees()
(0,)
sage: M.relations()
(Sq(2)*g[0],)

sage: v = F2([Sq(2)])
sage: pres = Hom(F1, F2)([v])
sage: M = pres.fp_module(); M
Finitely presented left module on 1 generator and 1 relation over
mod 2 Steenrod algebra, milnor basis
sage: M.generator_degrees()
(0,)
sage: M.relations()
(Sq(2)*g[0],)

sage: F3 = FPModule(A, (0,), [[Sq(4)]])
sage: v = F3([Sq(2)])
sage: pres = Hom(F1, F3)([v])
sage: pres.fp_module()
Traceback (most recent call last):
...
ValueError: this is not a morphism between free modules

homology(f, top_dim=None, verbose=False)#

Compute the sub-quotient module of $$H(self, f) = \ker(self)/\operatorname{im}(f)$$ in a range of degrees.

For a pair of composable morphisms $$f: M\to N$$ and $$g: N \to Q$$ of finitely presented modules, the homology module is a finitely presented quotient of the kernel sub module $$\ker(g) \subset N$$.

INPUT:

• f – a homomorphism with codomain equal to the domain of self and image contained in the kernel of this homomorphism

• top_dim – integer (optional); used by this function to stop the computation at the given degree

• verbose – boolean (default: False); enable progress messages

OUTPUT:

A quotient homomorphism $$\ker(self) \to H$$, where $$H$$ is isomorphic to $$H(self, f)$$ in degrees less than or equal to top_dim.

Note

If the algebra for this module is finite, then no top_dim needs to be specified in order to ensure that this function terminates.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2, profile=(3,2,1))
sage: M = FPModule(A, [0], [[Sq(3)]])
sage: N = FPModule(A, [0], [[Sq(2,2)]])
sage: F = FPModule(A, [0])
sage: f = Hom(M,N)([A.Sq(2)*N.generator(0)])
sage: g = Hom(F, M)([A.Sq(4)*A.Sq(1,2)*M.generator(0)])
sage: ho = f.homology(g)
sage: ho.codomain()
Finitely presented left module on 1 generator and 5 relations over
sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [3, 2, 1]
sage: ho.codomain().is_trivial()
False

image(top_dim=None, verbose=False)#

Compute the image of self.

INPUT:

• top_dim – integer (optional); used by this function to stop the computation at the given degree

• verbose – boolean (default: False); enable progress messages

OUTPUT:

A homomorphism into $$\operatorname{im}(self)$$ that is an isomorphism in degrees less than or equal to top_dim

Note

If the algebra for this module is finite, then no top_dim needs to be specified in order to ensure that this function terminates.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
sage: F = FPModule(A3, [1,3]);
sage: L = FPModule(A3, [2,3], [[Sq(2),Sq(1)], [0,Sq(2)]]);
sage: H = Hom(F, L);

sage: H([L((A3.Sq(1), 1)), L((0, A3.Sq(2)))]).image() # long time
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
To:   Finitely presented left module on 2 generators and 2 relations over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
Defn: g[3] |--> Sq(1)*g[2] + g[3]

sage: M = FPModule(A3, [0,7], [[Sq(1), 0], [Sq(2), 0], [Sq(4), 0], [Sq(8), Sq(1)], [0, Sq(7)], [0, Sq(0,1,1)+Sq(4,2)]])
sage: F2 = FPModule(A3, [0], [[Sq(1)], [Sq(2)], [Sq(4)], [Sq(8)], [Sq(15)]])
sage: H = Hom(M, F2)
sage: f = H([F2([1]), F2([0])])
sage: K = f.image(verbose=True, top_dim=17)
1. Computing the generators of the image presentation:
Resolving the image in the range of dimensions [0, 17]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.
2. Computing the relations of the image presentation:
Computing using the profile:
(4, 3, 2, 1)
Resolving the kernel in the range of dimensions [0, 17]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.

sage: K.is_injective()  # long time
True
sage: K.domain().generator_degrees()
(0,)
sage: K.domain().relations()
(Sq(1)*g[0], Sq(2)*g[0], Sq(4)*g[0], Sq(8)*g[0])
sage: K.domain().is_trivial()
False

is_identity()#

Decide if self is the identity endomorphism.

EXAMPLES:

sage: from sage.modules.fp_graded.module import *
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
sage: N = FPModule(A, [2], [[Sq(4)]])
sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]

sage: f = Hom(M, N)(values)
sage: f.is_identity()
False

sage: one = Hom(M, M)(M.generators()); one
Module endomorphism of Finitely presented left module on 2 generators and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]
g[1] |--> g[1]

sage: one.is_identity()
True

sage: v = N.generator(0)
sage: values = [Sq(5)*v, Sq(3,1)*v]
sage: f = Hom(M, N)(values)
sage: f.is_identity()
False
sage: one = Hom(M, M)(M.generators()); one
Module endomorphism of Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]
g[1] |--> g[1]
sage: one.is_identity()
True

is_injective(top_dim=None, verbose=False)#

Return True if and only if self has a trivial kernel.

INPUT:

• top_dim – integer (optional); used by this function to stop the computation at the given degree

• verbose – boolean (default: False); enable progress messages

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)

sage: K = FPModule(A, [2], [[Sq(2)]])
sage: HZ = FPModule(A, [0], [[Sq(1)]])

sage: f = Hom(K, HZ)([Sq(2)*HZ([1])])
sage: f.is_injective(top_dim=23)
True

is_surjective()#

Return True if and only if self has a trivial cokernel.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: F = FPModule(A, [0])

sage: f = Hom(F,F)([Sq(1)*F.generator(0)])
sage: f.is_surjective()
False

is_zero()#

Decide if self is the zero homomorphism.

OUTPUT:

The boolean value True if self is trivial and False otherwise.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
sage: N = FPModule(A, [2], [[Sq(4)]])
sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]

sage: f = Hom(M, N)(values)
sage: f.is_zero()
False

sage: (f-f).is_zero()
True

sage: v = N.generator(0)
sage: values = [Sq(5)*v, Sq(3,1)*v]
sage: f = Hom(M, N)(values)
sage: f.is_zero()
False
sage: (f-f).is_zero()
True

kernel_inclusion(top_dim=None, verbose=False)#

Return the kernel of self.

INPUT:

• top_dim – integer (optional); used by this function to stop the computation at the given degree

• verbose – boolean (default: False); enable progress messages

OUTPUT:

A homomorphism into $$\ker(self)$$ which is an isomorphism in degrees less than or equal to top_dim.

Note

If the algebra for this module is finite, then no top_dim needs to be specified in order to ensure that this function terminates.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A3 = SteenrodAlgebra(2, profile=(4,3,2,1))
sage: F = FPModule(A3, [1,3]);
sage: L = FPModule(A3, [2,3], [[Sq(2),Sq(1)], [0,Sq(2)]]);
sage: H = Hom(F, L);

sage: H([L((A3.Sq(1), 1)), L((0, A3.Sq(2)))]).kernel_inclusion() # long time
Module morphism:
From: Finitely presented left module on 2 generators and 1 relation over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
To:   Free graded left module on 2 generators over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
Defn: g[3] |--> g[3]
g[4] |--> Sq(0,1)*g[1]

sage: M = FPModule(A3, [0,7], [[Sq(1), 0], [Sq(2), 0], [Sq(4), 0], [Sq(8), Sq(1)], [0, Sq(7)], [0, Sq(0,1,1)+Sq(4,2)]])
sage: F2 = FPModule(A3, [0], [[Sq(1)], [Sq(2)], [Sq(4)], [Sq(8)], [Sq(15)]])
sage: H = Hom(M, F2)
sage: f = H([F2([1]), F2([0])])

sage: K = f.kernel_inclusion(verbose=True, top_dim=17)
1. Computing the generators of the kernel presentation:
Resolving the kernel in the range of dimensions [0, 17]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17.
2. Computing the relations of the kernel presentation:
Computing using the profile:
(4, 3, 2, 1)
Resolving the kernel in the range of dimensions [7, 17]:
7 8 9 10 11 12 13 14 15 16 17.

sage: K.domain().generators()
(g[7],)
sage: K.domain().relations()
((Sq(0,1)+Sq(3))*g[7],
(Sq(0,0,1)+Sq(1,2)+Sq(4,1))*g[7],
Sq(9)*g[7],
(Sq(0,1,1)+Sq(4,2))*g[7])

sage: K
Module morphism:
From: Finitely presented left module on 1 generator and 4 relations over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
To:   Finitely presented left module on 2 generators and 6 relations over sub-Hopf algebra of mod 2 Steenrod algebra, milnor basis, profile function [4, 3, 2, 1]
Defn: g[7] |--> g[7]

lift(f, verbose=False)#

Return a lift of this homomorphism over the given homomorphism f.

INPUT:

• f – a homomorphism with codomain equal to the codomain of self

• verbose – boolean (default: False); enable progress messages

OUTPUT:

A homomorphism $$g$$ with the property that self equals $$f \circ g$$. If no lift exist, None is returned.

ALGORITHM:

Let $$s$$ be this homomorphism with $$L$$ the domain of $$s$$. Choose $$x_1, \ldots, x_N$$ such that $$f(x_i) = s(g_i)$$, where the $$g_i$$’s are the module generators of $$L$$.

The linear function sending $$g_i$$ to $$x_i$$ for every $$i$$ is well defined if and only if the vector $$x = (x_1, \ldots, x_N)$$ lies in the nullspace of the coefficient matrix $$R = (r_{ij})$$ given by the relations of $$L$$.

Let $$k \in \ker(f)$$ solve the matrix equation:

$R \cdot k = R \cdot x.$

Define a module homomorphism by sending the generators of $$L$$ to $$x_1 - k_1, \ldots, x_N - k_N$$. This is well defined, and is also a lift of this homomorphism over $$f$$.

Note that it does not matter how we choose the initial elements $$x_i$$: If $$x'$$ is another choice then $$x' - x\in \ker(f)$$ and $$R\cdot k = R\cdot x$$ if and only if $$R\cdot (k + x' - x) = R\cdot x'$$.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)


Lifting a map from a free module is always possible:

sage: M = FPModule(A, [0], [[Sq(3)]])
sage: N = FPModule(A, [0], [[Sq(2,2)]])
sage: F = FPModule(A, [0])
sage: f = Hom(M,N)([Sq(2)*N.generator(0)])
sage: k = Hom(F,N)([Sq(1)*Sq(2)*N.generator(0)])
sage: f_ = k.lift(f)
sage: f*f_ == k
True
sage: f_
Module morphism:
From: Free graded left module on 1 generator over mod 2 Steenrod algebra, milnor basis
To:   Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> Sq(1)*g[0]


A split projection:

sage: A_plus_HZ = FPModule(A, [0,0], [[0, Sq(1)]])
sage: HZ = FPModule(A, [0], [[Sq(1)]])
sage: q = Hom(A_plus_HZ, HZ)([HZ([1]), HZ([1])])
sage: # We can construct a splitting of q manually:
sage: split = Hom(HZ,A_plus_HZ)([A_plus_HZ.generator(1)])
sage: (q*split).is_identity()
True


Thus, lifting the identity homomorphism over $$q$$ should be possible:

sage: one = Hom(HZ,HZ).identity()
sage: j = one.lift(q); j
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
To:   Finitely presented left module on 2 generators and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0, 1]
sage: q*j
Module endomorphism of Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]


Lifting over the inclusion of the image sub module:

sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0], relations=[[Sq(0,1)]])
sage: f = Hom(M,M)([Sq(2)*M.generator(0)])
sage: im = f.image(top_dim=10)
sage: f.lift(im)
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
To:   Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[2]


When a lift cannot be found, the None value is returned. By setting the verbose argument to True, an explanation of why the lifting failed will be displayed:

sage: F2 = FPModule(A, [0,0])
sage: non_surjection = Hom(F2, F2)([F2([1, 0]), F2([0, 0])])
sage: lift = Hom(F2, F2).identity().lift(non_surjection, verbose=True)
The generators of the domain of this homomorphism do not map into
the image of the homomorphism we are lifting over.
sage: lift is None
True

solve(x)#

Return an element in the inverse image of x.

INPUT:

• x – an element of the codomain of this morphism

OUTPUT:

An element of the domain which maps to x under this morphism or None if x was not in the image of this morphism.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0], [[Sq(3)]])
sage: N = FPModule(A, [0], [[Sq(2,2)]])
sage: f = Hom(M, N)( [Sq(2)*N.generator(0)] )
sage: y = Sq(1,1)*N.generator(0); y
Sq(1,1)*g[0]
sage: x = f.solve(y); x
Sq(2)*g[0]
sage: y == f(x)
True


Trying to lift an element which is not in the image results in a None value:

sage: z = f.solve(Sq(1)*N.generator(0))
sage: z is None
True

split(verbose=False)#

Return a split of self.

INPUT:

• verbose – boolean (default: False); enable progress messages

OUTPUT:

A homomorphism with the property that the composite homomorphism $$S \circ f = id$$, where $$S$$ is self, is The identity homomorphism If no such split exist, None is returned.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,0], [[0, Sq(1)]])
sage: N = FPModule(A, [0], [[Sq(1)]])
sage: p = Hom(M, N)([N.generator(0), N.generator(0)])
sage: s = p.split(); s
Module morphism:
From: Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
To:   Finitely presented left module on 2 generators and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0, 1]
sage: # Verify that s is a splitting:
sage: p*s
Module endomorphism of Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]

suspension(t)#

The suspension of this morphism by the given degree t.

INPUT:

• t – an integer by which the morphism is suspended

OUTPUT:

The morphism which is the suspension of self by the degree t.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: F1 = FPModule(A, [4,5])
sage: F2 = FPModule(A, [5])

sage: f = Hom(F1, F2)( ( F2([Sq(4)]), F2([Sq(5)]) ) ); f
Module morphism:
From: Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis
To:   Free graded left module on 1 generator over mod 2 Steenrod algebra, milnor basis
Defn: g[4] |--> Sq(4)*g[5]
g[5] |--> Sq(5)*g[5]

sage: e1 = F1([1, 0])
sage: e2 = F1([0, 1])
sage: f(e1)
Sq(4)*g[5]
sage: f(e2)
Sq(5)*g[5]

sage: sf = f.suspension(4); sf
Module morphism:
From: Free graded left module on 2 generators over mod 2 Steenrod algebra, milnor basis
To:   Free graded left module on 1 generator over mod 2 Steenrod algebra, milnor basis
Defn: g[8] |--> Sq(4)*g[9]
g[9] |--> Sq(5)*g[9]

sage: sf.domain() is f.domain().suspension(4)
True

sage: sf.codomain() is f.codomain().suspension(4)
True

values()#

The values under self of the module generators of the domain module.

OUTPUT:

A sequence of module elements of the codomain.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
sage: N = FPModule(A, [2], [[Sq(4)]])
sage: homspace = Hom(M, N)

sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]
sage: f = homspace(values)

sage: f.values()
(Sq(5)*g[2], Sq(3,1)*g[2])

sage: homspace.zero().values()
(0, 0)

sage: N = homspace.codomain()
sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]
sage: f = homspace(values)
sage: f.values()
(Sq(5)*g[2], Sq(3,1)*g[2])
sage: homspace.zero().values()
(0, 0)

vector_presentation(n)#

Return the restriction of self to the domain module elements of degree n.

The restriction of a non-zero module homomorphism to the free module of module elements of degree $$n$$ is a linear function into the free module of elements of degree $$n+d$$ belonging to the codomain. Here $$d$$ is the degree of this homomorphism.

When this homomorphism is zero, it has no well defined degree so the function cannot be presented since we do not know the degree of its codomain. In this case, an error is raised.

INPUT:

• n – an integer degree

OUTPUT:

A linear function of finite dimensional free modules over the ground ring of the algebra for this module. The domain is isomorphic to the free module of domain elements of degree n of self via the choice of basis given by basis_elements(). If the morphism is zero, an error is raised.

EXAMPLES:

sage: from sage.modules.fp_graded.module import FPModule
sage: A = SteenrodAlgebra(2)
sage: M = FPModule(A, [0,1], [[Sq(2), Sq(1)]])
sage: N = FPModule(A, [2], [[Sq(4)]])
sage: values = [Sq(5)*N.generator(0), Sq(3,1)*N.generator(0)]
sage: f = Hom(M, N)(values)
sage: f.vector_presentation(0)
Vector space morphism represented by the matrix:
[0]
Domain: Vector space quotient V/W of dimension 1 over Finite Field of size 2 where
V: Vector space of dimension 1 over Finite Field of size 2
W: Vector space of degree 1 and dimension 0 over Finite Field of size 2
Basis matrix:
[]
Codomain: Vector space quotient V/W of dimension 1 over Finite Field of size 2 where
V: Vector space of dimension 2 over Finite Field of size 2
W: Vector space of degree 2 and dimension 1 over Finite Field of size 2
Basis matrix:
[0 1]
sage: f.vector_presentation(1)
Vector space morphism represented by the matrix:
[0 0]
[0 1]
Domain: Vector space quotient V/W of dimension 2 over Finite Field of size 2 where
V: Vector space of dimension 2 over Finite Field of size 2
W: Vector space of degree 2 and dimension 0 over Finite Field of size 2
Basis matrix:
[]
Codomain: Vector space quotient V/W of dimension 2 over Finite Field of size 2 where
V: Vector space of dimension 3 over Finite Field of size 2
W: Vector space of degree 3 and dimension 1 over Finite Field of size 2
Basis matrix:
[0 1 1]
sage: f.vector_presentation(2)
Vector space morphism represented by the matrix:
[0 0]
Domain: Vector space quotient V/W of dimension 1 over Finite Field of size 2 where
V: Vector space of dimension 2 over Finite Field of size 2
W: Vector space of degree 2 and dimension 1 over Finite Field of size 2
Basis matrix:
[1 1]
Codomain: Vector space quotient V/W of dimension 2 over Finite Field of size 2 where
V: Vector space of dimension 4 over Finite Field of size 2
W: Vector space of degree 4 and dimension 2 over Finite Field of size 2
Basis matrix:
[0 0 1 0]
[0 0 0 1]

sage: v = N.generator(0)
sage: values = [Sq(5)*v, Sq(3,1)*v]
sage: f = Hom(M, N)(values)
sage: f.vector_presentation(0)
Vector space morphism represented by the matrix:
[0 1]
Domain: Vector space of dimension 1 over Finite Field of size 2
Codomain: Vector space of dimension 2 over Finite Field of size 2
sage: f.vector_presentation(1)
Vector space morphism represented by the matrix:
[0 0 0]
[0 1 0]
Domain: Vector space of dimension 2 over Finite Field of size 2
Codomain: Vector space of dimension 3 over Finite Field of size 2
sage: f.vector_presentation(2)
Vector space morphism represented by the matrix:
[0 0 1 1]
[0 0 0 0]
Domain: Vector space of dimension 2 over Finite Field of size 2
Codomain: Vector space of dimension 4 over Finite Field of size 2