Császár torus, python and sagemath · DL Ferrario's Test Web Page

# Császár torus, python and sagemath

## The simplicial complex

Consider the (abstract) simplicial $T$ defined as follows: vertices are $$X=\{ 0,1,2,3,4,5,6 \} = \{ j \mod 7 \}.$$

Now, for each $x\in X$ let $\Phi_ x$ denote the following subsets of $2^X$ : \begin{aligned} H_ x &= \{ \{j,j+1\} : j =0 \ldots 6 \} = \{ \{j,j-1\} : j =0 \ldots 6 \} \\ V_ x &= \{ \{ j,j+x \} : j =0 \ldots 6 \} = \{ \{ j,j-x \} : j =0 \ldots 6 \} \\ D_ x &= \{ \{ j, j + x+1 \} : j = 0 \ldots 6 \} = \{ \{ j, j - x-1 \} : j = 0 \ldots 6 \} \\ \Phi_ x & = H_ x \cup V_ x \cup D_ x \end{aligned} where all the integers $j$ are meant $\mod 7$.

(1)
The set $\Phi_ x$ has 21 elements (i.e., it is the set of all possible subsets of $X$ of cardinality $2$) if and only if $x=2$ or $x=4$.

Proof: $\Phi_ x$ has 21 elements if and only if the three sets $H_ x$, $V_ x$ and $D_ x$ are disjoint. Hence if they are disjoint then $x\neq 0$ (otherwise $D_ x =H_ x$), $x\neq 1,6$ (otherwise $H_ x = V_ x$), $x\neq 3$ (otherwise $\{0,3\} = \{ 3,7 \} \in V_ x \cap D_ x$), and $x\neq 5$ (otherwise $\{0,6\} = \{6,7 \} \in D_ x \cap H_ x$). We are left with the cases $x=2$ or $x=4$. Lazy idea: write a few lines of python (2.7) and compute the number of elements of $\Phi_ x$ for each $x$...

>>> def NumberOfPhi(x):
...  H= [ frozenset([j,(j+1) % 7 ]) for j in range(7) ]
...  V= [ frozenset([j,(j+x) % 7 ]) for j in range(7) ]
...  D = [ frozenset([j,(j+x+1) % 7 ]) for j in range(7) ]
...  return len( set(H) | set(V) | set(D) )
...
>>>
>>> [ NumberOfPhi(x) for x in range(7) ]
[14, 14, 21, 14, 21, 14, 14]


This is the end of the proof. (/Proof)

Now, for $2$-simplexes we can proceed in a similar way. For each $x$, let \begin{aligned} L_ x & = \{ \{ j,j+1,j+x+1 \} : j = 0 \ldots 6 \} \\ U_ x & = \{ \{ j, j+x, j+x+1 \} : j = 0 \ldots 6 \}. \end{aligned} Hence \begin{aligned} L_ 2 & = \{ \{ j,j+1,j+3 \} : j = 0 \ldots 6 \} \\ U_ 2 & = \{ \{ j, j+2, j+3 \} : j = 0 \ldots 6 \} \\ L_ 4 & = \{ \{ j,j+1,j+5 \} : j = 0 \ldots 6 \} \implies L_ 4 = U_ 2\\ U_ 4 & = \{ \{ j, j+4, j+5 \} : j = 0 \ldots 6 \} \implies U_ 4 = L_ 2. \end{aligned}

A little bit of typing and

>>> def Inter(x):
...  L = [ frozenset( [j,(j+1)%7, (j+x+1)%7 ]) for j in range(7) ]
...  U = [ frozenset( [j,(j+x)%7, (j+x+1)%7 ]) for j in range(7) ]
...  return len( set(L) | set(V) )
...
>>> [ (x,Inter(x)) for x in range(7) ]
[(0, 14), (1, 14), (2, 14), (3, 14), (4, 14), (5, 14), (6, 14)]


This implies that for $x=2,4$ the following is an abstract simplicial complex: $$T = ( X, \{ L_ 2 \cup U_ 2 \cup \ldots \} ) = ( X, \{ L_ 4 \cup U_ 4 \cup \ldots \} ),$$ where the dots stand for all possible $1$-dimensional (i.e. 21) and $0$-dimensional (i.e. 7) simplexes. The complex can be represented as in the following badly drawn diagram:

With a little bit of imagination and glueing, it is possible to "prove" the following proposition.

(2)
The abstract simplicial complex $T$ has the geometric realization which is homeomorphic to the torus $T^2 = S^1 \times S^1$.

Proof: It follows from the badly drawn diagram. The $2$-simplices $U_ 2$ are the upper diagonal triangles. The $2$-simplices $L_ 2$ are the lower diagonal triangles. The $21$ elements of $\Phi_ 2$ are all the edges (up to identification).
(/Proof)

This complex is actually embeddable in $\RR^3$: on the Wikipedia page one can find an embedding; more details a the page in the Archive of Electronic Geometry Models.

## SageMath

Here is a plain sage session. According to the documentation, the function Torus returns Csaszar's Torus.

sage: T = simplicial_complexes.Torus();
sage: T.faces()
{-1: set([()]),
0: set([(4,), (5,), (3,), (0,), (1,), (6,), (2,)]),
1: set([(0, 6),
(0, 5),
(3, 6),
(1, 2),
(1, 5),
(1, 6),
(1, 3),
(0, 3),
(2, 6),
(2, 4),
(1, 4),
(3, 5),
(3, 4),
(2, 3),
(4, 6),
(2, 5),
(5, 6),
(0, 2),
(0, 1),
(0, 4),
(4, 5)]),
2: set([(2, 4, 5),
(0, 1, 5),
(0, 4, 6),
(1, 3, 6),
(0, 3, 5),
(1, 2, 4),
(2, 3, 5),
(1, 3, 4),
(2, 3, 6),
(0, 2, 6),
(1, 5, 6),
(0, 1, 2),
(4, 5, 6),
(0, 3, 4)])}


After a little bit of reordering, faces of sage's $T$ are

[(0, 1, 2),
(0, 1, 5),
(0, 2, 6),
(0, 3, 4),
(0, 3, 5),
(0, 4, 6),
(1, 2, 4),
(1, 3, 4),
(1, 3, 6),
(1, 5, 6),
(2, 3, 5),
(2, 3, 6),
(2, 4, 5),
(4, 5, 6)]


while faces in $U_ 2 \cup L_ 2$ are different.

[(0, 1, 3),
(0, 1, 5),
(0, 2, 3),
(0, 2, 6),
(0, 4, 5),
(0, 4, 6),
(1, 2, 4),
(1, 2, 6),
(1, 3, 4),
(1, 5, 6),
(2, 3, 5),
(2, 4, 5),
(3, 4, 6),
(3, 5, 6)]


It it just a permutation of indices, or they are distinct as simplicial complexes? The automorphism group of $T$ has 42 elements

sage: G=T.automorphism_group()
sage: len(G)
42


and hence there are 120 = 7!/42 distinct possible classes of permutations. The easiest is $(0,6)$, which transforms one set of 2-faces into the other.

(3)
The two simplicial complexes are equivalent.

A little bit of sagemath help in finding such permutations:

T = simplicial_complexes.Torus();

Facce= list(T.faces()[2])
Facce.sort()

def L(x):
return set([ frozenset( [j,(j+1) % 7, (j+x+1) % 7 ]) for j in range(7) ] )
def U(x):
return set([ frozenset( [j,(j+x) % 7, (j+x+1) % 7 ]) for j in range(7) ] )

myFacce=[tuple(a) for a in ( L(2) | U(2) ) ]
myFacce.sort()

G =SymmetricGroup((0,1,2,3,4,5,6))

def PermutedFacce(g,ListOfTuples):
result=[]
for t in ListOfTuples:
goft=[g(x) for x in t ]
goft.sort()
result = result + [tuple(goft)]
result.sort()
return result

found=0
for g in G:
pFacce=PermutedFacce(g,Facce)
if pFacce == myFacce:
found += 1
print "found n. ", found, " : ", g


And interactively loading it (saved as c.sage) gives the following session.

sage: runfile ("c.sage")
found n.  1  :  (2,5,3)(4,6)
found n.  2  :  (1,2,3,4,5,6)
found n.  3  :  (1,3,6,5,2)
found n.  4  :  (1,4,3)(2,6)
found n.  5  :  (1,5)(2,4)
found n.  6  :  (1,6,3,5,4)
found n.  7  :  (0,1)(2,3,6,4)
found n.  8  :  (0,1,2,6,5,4)
found n.  9  :  (0,1,3,5)(2,4,6)
found n.  10  :  (0,1,4,5,3)
found n.  11  :  (0,1,5,6,3,2)
found n.  12  :  (0,1,6)(2,5)(3,4)
found n.  13  :  (0,2,6,1)(3,5)
found n.  14  :  (0,2,4,3)(5,6)
found n.  15  :  (0,2)(1,3,4)
found n.  16  :  (0,2,5,1,4)(3,6)
found n.  17  :  (0,2,3,1,5,4,6)
found n.  18  :  (0,2,1,6,4,5)
found n.  19  :  (0,3,4,6,5,1)
found n.  20  :  (0,3,6,2)(4,5)
found n.  21  :  (0,3,1,2,5)
found n.  22  :  (0,3,5,6)(1,4,2)
found n.  23  :  (0,3)(1,5,2,6,4)
found n.  24  :  (0,3,2,4)(1,6)
found n.  25  :  (0,4,1)(2,5,6)
found n.  26  :  (0,4)(2,3,5)
found n.  27  :  (0,4,6,3)(1,2)
found n.  28  :  (0,4,5,1,3,2,6)
found n.  29  :  (0,4,3,6,1,5)
found n.  30  :  (0,4,2)(1,6,5,3)
found n.  31  :  (0,5,4,3,2,1)
found n.  32  :  (0,5)(2,6,3,4)
found n.  33  :  (0,5,3,6)(1,2,4)
found n.  34  :  (0,5,6,4)(1,3)
found n.  35  :  (0,5,2)(1,4,6)
found n.  36  :  (0,5,1,6,2,3)
found n.  37  :  (0,6,3,1)(2,4,5)
found n.  38  :  (0,6)
found n.  39  :  (0,6,4,3,5,1,2)
found n.  40  :  (0,6,1,3)(2,5,4)
found n.  41  :  (0,6,5)(1,4)(2,3)
found n.  42  :  (0,6,2,1,5,3,4)


Equivalently, and shortly:

sage: K=SimplicialComplex(myFacce)
sage: T=simplicial_complexes.Torus()
sage: T.is_isomorphic(K)
True


## Embedding the complex in $\RR^3$

The problem of embedding is not trivial. But ...

## Poincaré Homology 3-sphere

From sagemath documentation, and adding on...

sage: Sigma3 = simplicial_complexes.PoincareHomologyThreeSphere()
sage: Sigma3.homology()
{0: 0, 1: 0, 2: 0, 3: Z}
sage: Sigma3.fundamental_group().cardinality()
sage: [len(Sigma3.faces()[x]) for x in range(4)]
[16, 106, 180, 90]