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 complexesbase_ring
– a field (default:QQ
)cohomology
– boolean (default:False
); ifTrue
, 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)
S1 = simplicial_complexes.Sphere(1) H = Hom(S1, S1) f = H({0:0, 1:2, 2:1}) # f switches two vertices f_star = f.induced_homology_morphism(QQ, cohomology=True) f_star f_star.to_matrix(1) f_star.to_matrix() T = simplicial_complexes.Torus() y = T.homology_with_basis(QQ).basis()[(1,1)] y.to_cycle()
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]
Hom(S1, T)({0:0, 1:2, 2:5}) g = Hom(S1, T)({0:0, 1:2, 2: 5}) g_star = g.induced_homology_morphism(QQ) g_star.to_matrix(0) g_star.to_matrix(1) g_star.to_matrix()
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}
H = S1.homology_with_basis(QQ) a = H.basis()[(1,0)] g_star(a) T = S1.product(S1, is_mutable=False) diag = Hom(S1,T).diagonal_morphism() b,c = list(T.cohomology_ring().basis(1)) diag_c = diag.induced_homology_morphism(cohomology=True) diag_c(b) diag_c(c)
- 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
K = simplicial_complexes.Simplex(2) H = Hom(K,K) id = H.identity() id.induced_homology_morphism(QQ).base_ring() id.induced_homology_morphism(GF(13)).base_ring()
- 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
S1 = simplicial_complexes.Sphere(1) H = Hom(S1, S1) flip = H({0:0, 1:2, 2:1}) flip.induced_homology_morphism(QQ).is_identity() flip.induced_homology_morphism(GF(2)).is_identity() rotate = H({0:1, 1:2, 2:0}) rotate.induced_homology_morphism(QQ).is_identity()
- 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
S1 = simplicial_complexes.Sphere(1) K = simplicial_complexes.Simplex(2) H = Hom(S1, K) f = H({0:0, 1:1, 2:2}) f.induced_homology_morphism().is_injective() f.induced_homology_morphism(cohomology=True).is_injective() T = simplicial_complexes.Torus() g = Hom(S1, T)({0:0, 1:3, 2: 6}) g_star = g.induced_homology_morphism(QQ) g.is_injective()
- 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
S1 = simplicial_complexes.Sphere(1) K = simplicial_complexes.Simplex(2) H = Hom(S1, K) f = H({0:0, 1:1, 2:2}) f.induced_homology_morphism().is_surjective() f.induced_homology_morphism(cohomology=True).is_surjective()
- 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]
S1 = simplicial_complexes.Sphere(1) S1_b = S1.barycentric_subdivision() S1_b.set_immutable() d = {(0,): 0, (0,1): 1, (1,): 2, (1,2): 0, (2,): 1, (0,2): 2} f = Hom(S1_b, S1)(d) h = f.induced_homology_morphism(QQ) h.to_matrix(1) h.to_matrix()