Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Deformation space of discrete groups of SU(2,1) in quaternionic hyperbolic planes

Views: 97
Kernel: SageMath (stable)

DEFORMATION SPACE OF DISCRETE GROUPS OF SU(2,1) IN QUATERNIONIC HYPERBOLIC PLANE

Companion Notebook to the paper with same title by A. Guilloux and I. Kim

I) Quaternions and basis of sp(2,1)

I-1) Quaternions and matrices representation

We define in fact Q[i3]+Q[i3]j\mathbb Q[i\sqrt 3] + \mathbb Q[i\sqrt 3]j to work only with numbers in a number field. We denote i3i\sqrt 3 by s3s3, and the action by complex conjugation on Q[i3]\mathbb Q[i\sqrt 3].

X = QQ['X'].0 K = NumberField((X^2+3),'s') s3 = K.0 conj = K.automorphisms()[1] s3^2
-3

A quaternion is then seen as a 4-tuple of real number (a,b,c,d)=a+s3b+j+s3j(a,b,c,d) = a + s3 b + j + s3j. We define first the elements 00 and 11, i(3)i \sqrt(3), jj and k(3)k\sqrt(3) of the quaternions and then a function which takes a list of 99 4-tuples and define the SL(6,C)SL(6,\mathbb C) representation of the quaternionic matrix with those 9 entries.

Zero = [0,0,0,0] One = [1,0,0,0] i = [0,1,0,0] j = [0,0,1,0] k = [0,0,0,1]
def quat_mat(l): Ibis = K(s3) return matrix(K, [ [(l[0][0]+Ibis*l[0][1]),(-l[0][2] - Ibis* l[0][3]) ,\ (l[1][0]+Ibis*l[1][1]),(-l[1][2] - Ibis* l[1][3]),\ (l[2][0]+Ibis*l[2][1]),(-l[2][2] - Ibis* l[2][3])], # First line [(l[0][2]-Ibis*l[0][3]),(l[0][0] - Ibis* l[0][1]) ,\ (l[1][2]-Ibis*l[1][3]),(l[1][0] - Ibis* l[1][1]),\ (l[2][2]-Ibis*l[2][3]),(l[2][0] - Ibis* l[2][1])], # Second line [(l[3][0]+Ibis*l[3][1]),(-l[3][2] - Ibis* l[3][3]) ,\ (l[4][0]+Ibis*l[4][1]),(-l[4][2] - Ibis* l[4][3]),\ (l[5][0]+Ibis*l[5][1]),(-l[5][2] - Ibis* l[5][3])], # Third line [(l[3][2]-Ibis*l[3][3]),(l[3][0] - Ibis* l[3][1]) ,\ (l[4][2]-Ibis*l[4][3]),(l[4][0] - Ibis* l[4][1]),\ (l[5][2]-Ibis*l[5][3]),(l[5][0] - Ibis* l[5][1])], # Fourth line [(l[6][0]+Ibis*l[6][1]),(-l[6][2] - Ibis* l[6][3]) ,\ (l[7][0]+Ibis*l[7][1]),(-l[7][2] - Ibis* l[7][3]),\ (l[8][0]+Ibis*l[8][1]),(-l[8][2] - Ibis* l[8][3])], # Fifth line [(l[6][2]-Ibis*l[6][3]),(l[6][0] - Ibis* l[6][1]) ,\ (l[7][2]-Ibis*l[7][3]),(l[7][0] - Ibis* l[7][1]),\ (l[8][2]-Ibis*l[8][3]),(l[8][0] - Ibis* l[8][1])], # Sixth line ])
quat_mat([One,i,j,k,Zero,Zero,Zero,Zero,Zero])
[ 1 0 s 0 0 -1] [ 0 1 0 -s 1 0] [ 0 -s 0 0 0 0] [-s 0 0 0 0 0] [ 0 0 0 0 0 0] [ 0 0 0 0 0 0]

I-2) A basis of sp(2,1)

We define the natural basis for sp(2,1)\mathfrak{sp}(2,1) with first 99 anti-diagonal elements and 1212 others.

a1_i = quat_mat([Zero,Zero,i,\ Zero,Zero,Zero,\ Zero,Zero,Zero]) a1_j = quat_mat([Zero,Zero,j,\ Zero,Zero,Zero,\ Zero,Zero,Zero]) a1_k = quat_mat([Zero,Zero,k,\ Zero,Zero,Zero,\ Zero,Zero,Zero]) a2_i = quat_mat([Zero,Zero,Zero,\ Zero,i,Zero,\ Zero,Zero,Zero]) a2_j = quat_mat([Zero,Zero,Zero,\ Zero,j,Zero,\ Zero,Zero,Zero]) a2_k = quat_mat([Zero,Zero,Zero,\ Zero,k,Zero,\ Zero,Zero,Zero]) a3_i = quat_mat([Zero,Zero,Zero,\ Zero,Zero,Zero,\ i,Zero,Zero]) a3_j = quat_mat([Zero,Zero,Zero,\ Zero,Zero,Zero,\ j,Zero,Zero]) a3_k = quat_mat([Zero,Zero,Zero,\ Zero,Zero,Zero,\ k,Zero,Zero])
o1_1 = quat_mat([One, Zero, Zero,\ Zero, Zero, Zero,\ Zero, Zero, [-1,0,0,0]]) o1_i = quat_mat([i, Zero, Zero,\ Zero, Zero, Zero,\ Zero, Zero, i]) o1_j = quat_mat([j, Zero, Zero,\ Zero, Zero, Zero,\ Zero, Zero, j]) o1_k = quat_mat([k, Zero, Zero,\ Zero, Zero, Zero,\ Zero, Zero, k]) o2_1 = quat_mat([Zero, One, Zero,\ Zero, Zero, [-1,0,0,0],\ Zero, Zero, Zero]) o2_i = quat_mat([Zero, i, Zero,\ Zero, Zero, i,\ Zero, Zero, Zero]) o2_j = quat_mat([Zero, j, Zero,\ Zero, Zero, j,\ Zero, Zero, Zero]) o2_k = quat_mat([Zero, k, Zero,\ Zero, Zero, k,\ Zero, Zero, Zero]) o3_1 = quat_mat([Zero, Zero, Zero,\ One, Zero, Zero,\ Zero, [-1,0,0,0], Zero]) o3_i = quat_mat([Zero, Zero, Zero,\ i, Zero, Zero,\ Zero, i, Zero]) o3_j = quat_mat([Zero, Zero, Zero,\ j, Zero, Zero,\ Zero, j, Zero]) o3_k = quat_mat([Zero, Zero, Zero,\ k, Zero, Zero,\ Zero, k, Zero])

The basis is simply the list of the 2121 above matrices.

Base_sp = [a1_i,a1_j,a1_k,\ o2_1,o2_i,o2_j,o2_k,\ a2_i,a2_j,a2_k,\ o1_1,o1_i,o1_j,o1_k,\ o3_1,o3_i,o3_j,o3_k,\ a3_i,a3_j,a3_k]

I-3) Coordinates computations

We have two way to look at elements of sp(2,1)\mathfrak{sp}(2,1): first as quaternionic matrices (in sl(6,C))\mathfrak{sl}(6,\mathbb C)) and second as vectors of 2121 coordinates. We define the functions to pass from one form to the other.

def quat_matTOcoord(M): A1_i = QQ(1/(2*s3)*(M[0,4]-M[1,5])) A1_j = QQ(1/2*(M[1,4] - M[0,5])) A1_k = -QQ(1/(2*s3)*(M[1,4] + M[0,5])) A1 = [A1_i,A1_j,A1_k] O2_1 = QQ(1/(2)*(M[0,2]+M[1,3])) O2_i = QQ(1/(2*s3)*(M[0,2]-M[1,3])) O2_j = QQ(1/2*(M[1,2] - M[0,3])) O2_k = -QQ(1/(2*s3)*(M[1,2] + M[0,3])) O2 = [O2_1,O2_i,O2_j,O2_k] O1_1 = QQ(1/(2)*(M[0,0]+M[1,1])) O1_i = QQ(1/(2*s3)*(M[0,0]-M[1,1])) O1_j = QQ(1/2*(M[1,0] - M[0,1])) O1_k = -QQ(1/(2*s3)*(M[1,0] + M[0,1])) O1 = [O1_1,O1_i,O1_j,O1_k] A2_i = QQ(1/(2*s3)*(M[2,2]-M[3,3])) A2_j = QQ(1/2*(M[3,2] - M[2,3])) A2_k = -QQ(1/(2*s3)*(M[3,2] + M[2,3])) A2 = [A2_i,A2_j,A2_k] O3_1 = QQ(1/(2)*(M[2,0]+M[3,1])) O3_i = QQ(1/(2*s3)*(M[2,0]-M[3,1])) O3_j = QQ(1/2*(M[3,0] - M[2,1])) O3_k = -QQ(1/(2*s3)*(M[3,0] + M[2,1])) O3 = [O3_1,O3_i,O3_j,O3_k] A3_i = QQ(1/(2*s3)*(M[4,0]-M[5,1])) A3_j = QQ(1/2*(M[5,0] - M[4,1])) A3_k = -QQ(1/(2*s3)*(M[5,0] + M[4,1])) A3 = [A3_i,A3_j,A3_k] return matrix(QQ,A1 + O2 + A2 + O1 + O3 + A3).transpose()
def CoordTOmat(coor): coo = coor.list() M = zero_matrix(K,6,6) for c,vec in zip(coo,Base_sp): M += c*vec return M

I-4) The adjoint action

We are now able to compute the adjoint action in coordinates.

def Ad_action(M): ad = zero_matrix(QQ,21,21) for i,vec in enumerate(Base_sp): ad[:,i] = quat_matTOcoord(M * vec * M.inverse()) return ad

II) The figure eight knot group and its representation

II-1) The group as a quotient of the free group

F2.<a,b> = FreeGroup(2)
G8 = F2/ [b^-1*a*b*a^-1*b*a*b^-1*a^-1*b*a^-1] G8.relations()
(b^-1*a*b*a^-1*b*a*b^-1*a^-1*b*a^-1,)

II-2) The representation ρ0\rho_0

We define the representation ρ0\rho_0

A = quat_mat([Un,[1,0,0,0],[-1/2,-1/2,0,0],Zero,Un,[-1,0,0,0],Zero,Zero,Un]) B = quat_mat([Un,Zero,Zero,Un,Un,Zero,[-1/2,-1/2,0,0],[-1,0,0,0],Un])

And check that they verify the relation:

G8.relations()[0](A,B)
[1 0 0 0 0 0] [0 1 0 0 0 0] [0 0 1 0 0 0] [0 0 0 1 0 0] [0 0 0 0 1 0] [0 0 0 0 0 1]

III) Alexander matrix and cohomological computations

We define the matrix such that Z1Z^1 is its kernel.

def Z1Ad_sp(G,h): H = [] for i in h: H = H + [Ad_action(i)] Z1 = G.alexander_matrix(H) Z1 = block_matrix(len(G.relations()),G.ngens(),Z1.list()) return Z1; Z1Ad_sp(G8,[A,B])
21 x 42 dense matrix over Rational Field (use the '.str()' method to see the entries)

We define the matrix such that B1B^1 is its image.

def B1Ad_sp(G,h): n = (h[0]).nrows() B1 = Ad_action(h[0])- matrix.identity(21) for i in range(1,len(h)): B1 = B1.stack(Ad_action(h[i])-matrix.identity(21)) return B1; B1Ad_sp(G8,[A,B])
42 x 21 dense matrix over Rational Field (use the '.str()' method to see the entries)

And compute the dimension of the quotient: it is 33.

def dim_H1Ad_sp(G,h): Z1 = Z1Ad_sp(G,h).right_kernel() B1 = B1Ad_sp(G,h).column_space() if not(B1.is_subspace(Z1)): print "Probleme de definition des cocycles/cobord" else: return dim(Z1.quotient(B1)) dim_H1Ad_sp(G8,[A,B])
3