Induced morphisms on homology - Chain complexes and homology

Skip to content
Back to top
View this page
Edit this page

# 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)

  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

      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)

  Python

      >>> 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

      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]

  [Python]

      >>> 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

      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}

  Python

      >>> 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()

    The base ring for this map.

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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)

    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

        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]

    Python

        >>> 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]