Induced morphisms on homology#

This module implements morphisms on homology induced by morphisms of simplicial complexes. It requires working with field coefficients.

See InducedHomologyMorphism for documentation.

AUTHORS:

  • John H. Palmieri (2015.09)

class sage.homology.homology_morphism.InducedHomologyMorphism(map, base_ring=None, cohomology=False)[source]#

Bases: Morphism

An element of this class is a morphism of (co)homology groups induced by a map of simplicial complexes. It requires working with field coefficients.

INPUT:

  • map – the map of simplicial complexes

  • base_ring – a field (default: QQ)

  • cohomology – boolean (default: False). If True, return the induced map in cohomology rather than homology.

Note

This is not intended to be used directly by the user, but instead via the method induced_homology_morphism().

EXAMPLES:

sage: S1 = simplicial_complexes.Sphere(1)
sage: H = Hom(S1, S1)
sage: f = H({0:0, 1:2, 2:1})  # f switches two vertices
sage: f_star = f.induced_homology_morphism(QQ, cohomology=True)
sage: f_star
Graded algebra endomorphism of
 Cohomology ring of Minimal triangulation of the 1-sphere over Rational Field
  Defn: induced by:
        Simplicial complex endomorphism of Minimal triangulation of the 1-sphere
          Defn: 0 |--> 0
                1 |--> 2
                2 |--> 1
sage: f_star.to_matrix(1)
[-1]
sage: f_star.to_matrix()
[ 1| 0]
[--+--]
[ 0|-1]

sage: T = simplicial_complexes.Torus()
sage: y = T.homology_with_basis(QQ).basis()[(1,1)]
sage: y.to_cycle()
(0, 5) - (0, 6) + (5, 6)
>>> from sage.all import *
>>> S1 = simplicial_complexes.Sphere(Integer(1))
>>> H = Hom(S1, S1)
>>> f = H({Integer(0):Integer(0), Integer(1):Integer(2), Integer(2):Integer(1)})  # f switches two vertices
>>> f_star = f.induced_homology_morphism(QQ, cohomology=True)
>>> f_star
Graded algebra endomorphism of
 Cohomology ring of Minimal triangulation of the 1-sphere over Rational Field
  Defn: induced by:
        Simplicial complex endomorphism of Minimal triangulation of the 1-sphere
          Defn: 0 |--> 0
                1 |--> 2
                2 |--> 1
>>> f_star.to_matrix(Integer(1))
[-1]
>>> f_star.to_matrix()
[ 1| 0]
[--+--]
[ 0|-1]

>>> T = simplicial_complexes.Torus()
>>> y = T.homology_with_basis(QQ).basis()[(Integer(1),Integer(1))]
>>> y.to_cycle()
(0, 5) - (0, 6) + (5, 6)

Since \((0,2) - (0,5) + (2,5)\) is a cycle representing a homology class in the torus, we can define a map \(S^1 \to T\) inducing an inclusion on \(H_1\):

sage: Hom(S1, T)({0:0, 1:2, 2:5})
Simplicial complex morphism:
  From: Minimal triangulation of the 1-sphere
  To:   Minimal triangulation of the torus
  Defn: 0 |--> 0
        1 |--> 2
        2 |--> 5
sage: g = Hom(S1, T)({0:0, 1:2, 2: 5})
sage: g_star = g.induced_homology_morphism(QQ)
sage: g_star.to_matrix(0)
[1]
sage: g_star.to_matrix(1)
[-1]
[ 0]
sage: g_star.to_matrix()
[ 1| 0]
[--+--]
[ 0|-1]
[ 0| 0]
[--+--]
[ 0| 0]
>>> from sage.all import *
>>> Hom(S1, T)({Integer(0):Integer(0), Integer(1):Integer(2), Integer(2):Integer(5)})
Simplicial complex morphism:
  From: Minimal triangulation of the 1-sphere
  To:   Minimal triangulation of the torus
  Defn: 0 |--> 0
        1 |--> 2
        2 |--> 5
>>> g = Hom(S1, T)({Integer(0):Integer(0), Integer(1):Integer(2), Integer(2): Integer(5)})
>>> g_star = g.induced_homology_morphism(QQ)
>>> g_star.to_matrix(Integer(0))
[1]
>>> g_star.to_matrix(Integer(1))
[-1]
[ 0]
>>> g_star.to_matrix()
[ 1| 0]
[--+--]
[ 0|-1]
[ 0| 0]
[--+--]
[ 0| 0]

We can evaluate such a map on (co)homology classes:

sage: H = S1.homology_with_basis(QQ)
sage: a = H.basis()[(1,0)]
sage: g_star(a)
-h_{1,0}

sage: T = S1.product(S1, is_mutable=False)
sage: diag = Hom(S1,T).diagonal_morphism()
sage: b,c = list(T.cohomology_ring().basis(1))
sage: diag_c = diag.induced_homology_morphism(cohomology=True)
sage: diag_c(b)
h^{1,0}
sage: diag_c(c)
h^{1,0}
>>> from sage.all import *
>>> H = S1.homology_with_basis(QQ)
>>> a = H.basis()[(Integer(1),Integer(0))]
>>> g_star(a)
-h_{1,0}

>>> T = S1.product(S1, is_mutable=False)
>>> diag = Hom(S1,T).diagonal_morphism()
>>> b,c = list(T.cohomology_ring().basis(Integer(1)))
>>> diag_c = diag.induced_homology_morphism(cohomology=True)
>>> diag_c(b)
h^{1,0}
>>> diag_c(c)
h^{1,0}
base_ring()[source]#

The base ring for this map.

EXAMPLES:

sage: K = simplicial_complexes.Simplex(2)
sage: H = Hom(K,K)
sage: id = H.identity()
sage: id.induced_homology_morphism(QQ).base_ring()
Rational Field
sage: id.induced_homology_morphism(GF(13)).base_ring()
Finite Field of size 13
>>> from sage.all import *
>>> K = simplicial_complexes.Simplex(Integer(2))
>>> H = Hom(K,K)
>>> id = H.identity()
>>> id.induced_homology_morphism(QQ).base_ring()
Rational Field
>>> id.induced_homology_morphism(GF(Integer(13))).base_ring()
Finite Field of size 13
is_identity()[source]#

Return True if this is the identity map on (co)homology.

EXAMPLES:

sage: S1 = simplicial_complexes.Sphere(1)
sage: H = Hom(S1, S1)
sage: flip = H({0:0, 1:2, 2:1})
sage: flip.induced_homology_morphism(QQ).is_identity()
False
sage: flip.induced_homology_morphism(GF(2)).is_identity()
True
sage: rotate = H({0:1, 1:2, 2:0})
sage: rotate.induced_homology_morphism(QQ).is_identity()
True
>>> from sage.all import *
>>> S1 = simplicial_complexes.Sphere(Integer(1))
>>> H = Hom(S1, S1)
>>> flip = H({Integer(0):Integer(0), Integer(1):Integer(2), Integer(2):Integer(1)})
>>> flip.induced_homology_morphism(QQ).is_identity()
False
>>> flip.induced_homology_morphism(GF(Integer(2))).is_identity()
True
>>> rotate = H({Integer(0):Integer(1), Integer(1):Integer(2), Integer(2):Integer(0)})
>>> rotate.induced_homology_morphism(QQ).is_identity()
True
is_injective()[source]#

Return True if this map is injective on (co)homology.

EXAMPLES:

sage: S1 = simplicial_complexes.Sphere(1)
sage: K = simplicial_complexes.Simplex(2)
sage: H = Hom(S1, K)
sage: f = H({0:0, 1:1, 2:2})
sage: f.induced_homology_morphism().is_injective()
False
sage: f.induced_homology_morphism(cohomology=True).is_injective()
True

sage: T = simplicial_complexes.Torus()
sage: g = Hom(S1, T)({0:0, 1:3, 2: 6})
sage: g_star = g.induced_homology_morphism(QQ)
sage: g.is_injective()
True
>>> from sage.all import *
>>> S1 = simplicial_complexes.Sphere(Integer(1))
>>> K = simplicial_complexes.Simplex(Integer(2))
>>> H = Hom(S1, K)
>>> f = H({Integer(0):Integer(0), Integer(1):Integer(1), Integer(2):Integer(2)})
>>> f.induced_homology_morphism().is_injective()
False
>>> f.induced_homology_morphism(cohomology=True).is_injective()
True

>>> T = simplicial_complexes.Torus()
>>> g = Hom(S1, T)({Integer(0):Integer(0), Integer(1):Integer(3), Integer(2): Integer(6)})
>>> g_star = g.induced_homology_morphism(QQ)
>>> g.is_injective()
True
is_surjective()[source]#

Return True if this map is surjective on (co)homology.

EXAMPLES:

sage: S1 = simplicial_complexes.Sphere(1)
sage: K = simplicial_complexes.Simplex(2)
sage: H = Hom(S1, K)
sage: f = H({0:0, 1:1, 2:2})
sage: f.induced_homology_morphism().is_surjective()
True
sage: f.induced_homology_morphism(cohomology=True).is_surjective()
False
>>> from sage.all import *
>>> S1 = simplicial_complexes.Sphere(Integer(1))
>>> K = simplicial_complexes.Simplex(Integer(2))
>>> H = Hom(S1, K)
>>> f = H({Integer(0):Integer(0), Integer(1):Integer(1), Integer(2):Integer(2)})
>>> f.induced_homology_morphism().is_surjective()
True
>>> f.induced_homology_morphism(cohomology=True).is_surjective()
False
to_matrix(deg=None)[source]#

The matrix for this map.

If degree deg is specified, return the matrix just in that degree; otherwise, return the block matrix representing the entire map.

INPUT:

  • deg – (default: None) the degree

EXAMPLES:

sage: S1 = simplicial_complexes.Sphere(1)
sage: S1_b = S1.barycentric_subdivision()
sage: S1_b.set_immutable()
sage: d = {(0,): 0, (0,1): 1, (1,): 2, (1,2): 0, (2,): 1, (0,2): 2}
sage: f = Hom(S1_b, S1)(d)
sage: h = f.induced_homology_morphism(QQ)
sage: h.to_matrix(1)
[2]
sage: h.to_matrix()
[1|0]
[-+-]
[0|2]
>>> from sage.all import *
>>> S1 = simplicial_complexes.Sphere(Integer(1))
>>> S1_b = S1.barycentric_subdivision()
>>> S1_b.set_immutable()
>>> d = {(Integer(0),): Integer(0), (Integer(0),Integer(1)): Integer(1), (Integer(1),): Integer(2), (Integer(1),Integer(2)): Integer(0), (Integer(2),): Integer(1), (Integer(0),Integer(2)): Integer(2)}
>>> f = Hom(S1_b, S1)(d)
>>> h = f.induced_homology_morphism(QQ)
>>> h.to_matrix(Integer(1))
[2]
>>> h.to_matrix()
[1|0]
[-+-]
[0|2]