ASKSAGE: Sage Q&A Forum - RSS feedhttps://ask.sagemath.org/questions/Q&A Forum for SageenCopyright Sage, 2010. Some rights reserved under creative commons license.Mon, 01 May 2017 00:20:32 +0200Test for zero cup producthttps://ask.sagemath.org/question/33331/test-for-zero-cup-product/How can I check whether the cohomology ring H^*(X) of a simplicial complex X has zero cup product (like, say, for X a wedge of spheres). I have a long list of simplicial complexes, so I need a fully algorithmic approach. I probably should start with X.cohomology_ring(QQ) but I don't know what to do next...
Btw, I am a sage newbie.
Fri, 06 May 2016 18:50:24 +0200https://ask.sagemath.org/question/33331/test-for-zero-cup-product/Answer by dan_fulea for <p>How can I check whether the cohomology ring H^*(X) of a simplicial complex X has zero cup product (like, say, for X a wedge of spheres). I have a long list of simplicial complexes, so I need a fully algorithmic approach. I probably should start with X.cohomology_ring(QQ) but I don't know what to do next...</p>
<p>Btw, I am a sage newbie.</p>
https://ask.sagemath.org/question/33331/test-for-zero-cup-product/?answer=37252#post-id-37252
The path to proceed should be...
1. Construct the object correspdonding to the wedge of spheres.
2. The call cohomology_ring method.
3. Look at the generators.
4. Take those generators in degree > 0, compute products.
5. If one of the products is non zero, than return False.
6. Else, if the loop does find only zero products, finally return True.
The problem i had was a "minor one", but one that delayed the answer one (more) day.
For short, the method cohomology_ring of the constructed wedge of spheres WS works only
for a WS which is immutable. The default constructor makes it mutable.
In order to explain (myself) the answer, so that i'll understand it also tomorrow, here are first some examples. This is...
sage: version()
'SageMath version 7.3, Release Date: 2016-08-04'
(1)
Let us take a Klein bottle and ask
for the cohomology ring over
rationals and over the two elements
field. The rings will have
generators. We compute the relevant
products.
K = simplicial_complexes.KleinBottle()
HK = K.cohomology_ring( QQ )
print "H( K, Q ) has the following generators:"
print HK.gens() # there are two gen(erator)s
a, b = HK.gens() # they've got names, a and b
print "We rename them a, b."
print "Their degrees are %s, %s" % ( a.degree(), b.degree() )
print "Then we have for instance b*b = %s" % (b*b)
print "Is b*b zero? %s" % ( (b*b).is_zero() )
print
HK2 = K.cohomology_ring( GF(2) )
print "H( K, GF(2) ) has the following generators:"
print HK2.gens() # there are FOUR gen(erator)s
print "We rename them a, b, c, d."
a, b, c, d = HK2.gens() # they've got names, a, b, c, d
print "Their degrees are %s, %s, %s, %s" % ( a.degree(), b.degree(), c.degree(), d.degree() )
print "The values b*b, b*c, c*b, c*c are respectively %s, %s, %s, %s" % ( b*b, b*c, c*b, c*c )
print "Is b*b == 0? %s" % bool( b*b == 0 )
print "Is b*c == d? %s" % bool( b*c == d )
print "Is c*b == d? %s" % bool( c*b == d )
print "Is c*c == d? %s" % bool( c*c == d )
And we get so far (after a %cpaste into the sage interpreter):
H( K, Q ) has the following generators:
(h^{0,0}, h^{1,0})
We rename them a, b.
Their degrees are 0, 1
Then we have for instance b*b = 0
Is b*b zero? True
H( K, GF(2) ) has the following generators:
(h^{0,0}, h^{1,0}, h^{1,1}, h^{2,0})
We rename them a, b, c, d.
Their degrees are 0, 1, 1, 2
The values b*b, b*c, c*b, c*c are respectively 0, h^{2,0}, h^{2,0}, h^{2,0}
Is b*b == 0? True
Is b*c == d? True
Is c*b == d? True
Is c*c == d? True
(2)
Let us define a function that computes a wedge of spheres.
This is a quick solution, there is no raise in case a bad argument.
We expect as argument a tuple of integers > 0.
def WedgeOfSpheres( spheresTuple ):
"""
return the corresponding wedge of spheres
for dimensionsTuple (1,3,4) we return for instance
S1 /\ S3 /\ S4.
"""
for k in range( len( spheresTuple ) ):
if k == 0: S = simplicial_complexes.Sphere( spheresTuple[k])
else : S = S.wedge( simplicial_complexes.Sphere( spheresTuple[k])
, is_mutable=False )
return S
There is one delicate point above: we really need the is_mutable=False option.
Else the forthcomming method quotient_ring fails! (As i said, this may cost a day...)
(3) Then we can construct:
S = WedgeOfSpheres( (1,4,6) )
HS = S.cohomology_ring( QQ )
print "S = %s" % S
print "Computing H( S, QQ ) ... be patient..."
print HS
gens = [ g for g in HS.gens() if g.degree() > 0 ]
print "CUP PRODUCT matrix:"
for g in gens:
for h in gens:
print g*h,
print
print "Is the CUP PRODUCT zero? %s" % all( [ not(g*h) for g in gens for h in gens ] )
and we get:
S = Simplicial complex with 15 vertices and 17 facets
Computing H( S, QQ ) ... be patient...
Cohomology ring of Simplicial complex with 15 vertices and 17 facets over Rational Field
CUP PRODUCT matrix:
0 0 0
0 0 0
0 0 0
Is the CUP PRODUCT zero? True
(4) Resumed: In order to see if the pairing is trivial on the cohomology ring of a space X,
the following call would do the job:
def is_zero_cup_product( X, base_ring=QQ ):
generators = [ g for g in X.cohomology_ring( base_ring ).gens() if g.degree() > 0 ]
for g in generators:
for h in generators:
if g*h:
# print "%s * %s = %s" % ( g, h, g*h )
return False
return True
For instance:
sage: K = simplicial_complexes.KleinBottle()
sage: K
Minimal triangulation of the Klein bottle
sage: is_zero_cup_product( K, QQ )
True
sage: is_zero_cup_product( K, GF(2) )
False
sage: is_zero_cup_product( K, GF(5) )
True
sage: P2 = simplicial_complexes.RealProjectiveSpace( 2 )
sage: P2
Minimal triangulation of the real projective plane
sage: is_zero_cup_product( P2, QQ )
True
sage: is_zero_cup_product( P2, GF(2) )
False
sage: M7 = simplicial_complexes.MooreSpace( 7 )
sage: M7
Triangulation of the mod 7 Moore space
sage: M7.cohomology_ring( GF(7) ).gens()
(h^{0,0}, h^{1,0}, h^{2,0})
sage: a,b,c = _
sage: b * b
0
sage: is_zero_cup_product( M7 )
True
Mon, 10 Apr 2017 21:05:34 +0200https://ask.sagemath.org/question/33331/test-for-zero-cup-product/?answer=37252#post-id-37252Comment by Mathrocks for <p>The path to proceed should be...</p>
<ol>
<li>Construct the object correspdonding to the wedge of spheres.</li>
<li>The call cohomology_ring method.</li>
<li>Look at the generators.</li>
<li>Take those generators in degree > 0, compute products.</li>
<li>If one of the products is non zero, than return False.</li>
<li>Else, if the loop does find only zero products, finally return True.</li>
</ol>
<p>The problem i had was a "minor one", but one that delayed the answer one (more) day.
For short, the method cohomology_ring of the constructed wedge of spheres WS works only
for a WS which is immutable. The default constructor makes it mutable.</p>
<p>In order to explain (myself) the answer, so that i'll understand it also tomorrow, here are first some examples. This is...</p>
<pre><code>sage: version()
'SageMath version 7.3, Release Date: 2016-08-04'
</code></pre>
<p>(1)
Let us take a Klein bottle and ask
for the cohomology ring over
rationals and over the two elements
field. The rings will have
generators. We compute the relevant
products.</p>
<pre><code>K = simplicial_complexes.KleinBottle()
HK = K.cohomology_ring( QQ )
print "H( K, Q ) has the following generators:"
print HK.gens() # there are two gen(erator)s
a, b = HK.gens() # they've got names, a and b
print "We rename them a, b."
print "Their degrees are %s, %s" % ( a.degree(), b.degree() )
print "Then we have for instance b*b = %s" % (b*b)
print "Is b*b zero? %s" % ( (b*b).is_zero() )
print
HK2 = K.cohomology_ring( GF(2) )
print "H( K, GF(2) ) has the following generators:"
print HK2.gens() # there are FOUR gen(erator)s
print "We rename them a, b, c, d."
a, b, c, d = HK2.gens() # they've got names, a, b, c, d
print "Their degrees are %s, %s, %s, %s" % ( a.degree(), b.degree(), c.degree(), d.degree() )
print "The values b*b, b*c, c*b, c*c are respectively %s, %s, %s, %s" % ( b*b, b*c, c*b, c*c )
print "Is b*b == 0? %s" % bool( b*b == 0 )
print "Is b*c == d? %s" % bool( b*c == d )
print "Is c*b == d? %s" % bool( c*b == d )
print "Is c*c == d? %s" % bool( c*c == d )
</code></pre>
<p>And we get so far (after a %cpaste into the sage interpreter):</p>
<pre><code>H( K, Q ) has the following generators:
(h^{0,0}, h^{1,0})
We rename them a, b.
Their degrees are 0, 1
Then we have for instance b*b = 0
Is b*b zero? True
H( K, GF(2) ) has the following generators:
(h^{0,0}, h^{1,0}, h^{1,1}, h^{2,0})
We rename them a, b, c, d.
Their degrees are 0, 1, 1, 2
The values b*b, b*c, c*b, c*c are respectively 0, h^{2,0}, h^{2,0}, h^{2,0}
Is b*b == 0? True
Is b*c == d? True
Is c*b == d? True
Is c*c == d? True
</code></pre>
<p>(2)
Let us define a function that computes a wedge of spheres.
This is a quick solution, there is no raise in case a bad argument.
We expect as argument a tuple of integers > 0.</p>
<pre><code> def WedgeOfSpheres( spheresTuple ):
"""
return the corresponding wedge of spheres
for dimensionsTuple (1,3,4) we return for instance
S1 /\ S3 /\ S4.
"""
for k in range( len( spheresTuple ) ):
if k == 0: S = simplicial_complexes.Sphere( spheresTuple[k])
else : S = S.wedge( simplicial_complexes.Sphere( spheresTuple[k])
, is_mutable=False )
return S
</code></pre>
<p>There is one delicate point above: we really need the is_mutable=False option.
Else the forthcomming method quotient_ring fails! (As i said, this may cost a day...)</p>
<p>(3) Then we can construct:</p>
<pre><code> S = WedgeOfSpheres( (1,4,6) )
HS = S.cohomology_ring( QQ )
print "S = %s" % S
print "Computing H( S, QQ ) ... be patient..."
print HS
gens = [ g for g in HS.gens() if g.degree() > 0 ]
print "CUP PRODUCT matrix:"
for g in gens:
for h in gens:
print g*h,
print
print "Is the CUP PRODUCT zero? %s" % all( [ not(g*h) for g in gens for h in gens ] )
</code></pre>
<p>and we get:</p>
<pre><code> S = Simplicial complex with 15 vertices and 17 facets
Computing H( S, QQ ) ... be patient...
Cohomology ring of Simplicial complex with 15 vertices and 17 facets over Rational Field
CUP PRODUCT matrix:
0 0 0
0 0 0
0 0 0
Is the CUP PRODUCT zero? True
</code></pre>
<p>(4) Resumed: In order to see if the pairing is trivial on the cohomology ring of a space X,
the following call would do the job:</p>
<pre><code>def is_zero_cup_product( X, base_ring=QQ ):
generators = [ g for g in X.cohomology_ring( base_ring ).gens() if g.degree() > 0 ]
for g in generators:
for h in generators:
if g*h:
# print "%s * %s = %s" % ( g, h, g*h )
return False
return True
</code></pre>
<p>For instance:</p>
<pre><code>sage: K = simplicial_complexes.KleinBottle()
sage: K
Minimal triangulation of the Klein bottle
sage: is_zero_cup_product( K, QQ )
True
sage: is_zero_cup_product( K, GF(2) )
False
sage: is_zero_cup_product( K, GF(5) )
True
sage: P2 = simplicial_complexes.RealProjectiveSpace( 2 )
sage: P2
Minimal triangulation of the real projective plane
sage: is_zero_cup_product( P2, QQ )
True
sage: is_zero_cup_product( P2, GF(2) )
False
sage: M7 = simplicial_complexes.MooreSpace( 7 )
sage: M7
Triangulation of the mod 7 Moore space
sage: M7.cohomology_ring( GF(7) ).gens()
(h^{0,0}, h^{1,0}, h^{2,0})
sage: a,b,c = _
sage: b * b
0
sage: is_zero_cup_product( M7 )
True
</code></pre>
https://ask.sagemath.org/question/33331/test-for-zero-cup-product/?comment=37476#post-id-37476Awesome. Thanks @dan_fuleaMon, 01 May 2017 00:20:32 +0200https://ask.sagemath.org/question/33331/test-for-zero-cup-product/?comment=37476#post-id-37476