# binomials B2 := function(x) return x*(x-1)/2; end; B3 := function(x) return x*(x-1)*(x-2)/6; end; HallMult := function( t, a, b ) local f; f := a+b; f[3] := f[3] + t[1][2][3]*a[2]*b[1]; f[4] := f[4] + t[1][2][4]*a[2]*b[1] + t[1][3][4]*a[3]*b[1] + t[2][3][4]*a[3]*b[2] + t[1][2][3]*t[1][3][4]*a[2]*B2(b[1]) + t[1][2][3]*t[2][3][4]*B2(a[2])*b[1] + t[1][2][3]*t[2][3][4]*a[2]*b[1]*b[2]; f[5] := f[5] + t[3][4][5]*a[4]*b[3] + t[2][4][5]*a[4]*b[2] + t[2][3][5]*a[3]*b[2] + t[1][4][5]*a[4]*b[1] + t[1][3][5]*a[3]*b[1] + t[1][2][5]*a[2]*b[1] + t[2][3][4]*t[3][4][5]*B2(a[3])*b[2] + t[2][3][4]*t[2][4][5]*a[3]*B2(b[2]) + t[1][3][4]*t[3][4][5]*B2(a[3])*b[1] + t[1][3][4]*t[1][4][5]*a[3]*B2(b[1]) + t[2][3][4]*t[3][4][5]*a[3]*b[2]*b[3] + t[1][3][4]*t[3][4][5]*a[3]*b[1]*b[3] + t[1][3][4]*t[2][4][5]*a[3]*b[1]*b[2] + t[1][2][4]*t[3][4][5]*a[2]*b[1]*b[3] + t[1][2][4]*t[3][4][5]*a[2]*a[3]*b[1] + (B2(t[1][2][3])*t[2][3][4]*t[3][4][5]+t[1][2][3]*t[2][3][5] +t[1][2][4]*t[2][4][5])*a[2]*b[1]*b[2] + (B2(t[1][2][3])*t[2][3][4]*t[3][4][5]-t[1][2][3]*t[2][3][4]*t[3][4][5] +t[1][2][3]*t[1][2][4]*t[3][4][5]+t[1][2][3]*t[2][3][5] +t[1][2][4]*t[2][4][5])*B2(a[2])*b[1] + (B2(t[1][2][3])*t[1][3][4]*t[3][4][5]+t[1][2][3]*t[1][2][4]*t[3][4][5] +t[1][2][3]*t[1][3][5]+t[1][2][4]*t[1][4][5])*a[2]*B2(b[1]) + t[1][2][3]*t[2][3][4]*t[3][4][5]*B2(a[2])*b[1]*b[3] + t[1][2][3]*t[2][3][4]*t[3][4][5]*B2(a[2])*a[3]*b[1] + t[1][2][3]*t[2][3][4]*t[2][4][5]*a[2]*b[1]*B2(b[2]) + t[1][2][3]*t[2][3][4]*t[3][4][5]*a[2]*b[1]*b[2]*b[3] + t[1][2][3]*t[2][3][4]*t[3][4][5]*a[2]*a[3]*b[1]*b[2] + t[1][2][3]*t[1][3][4]*t[3][4][5]*a[2]*B2(b[1])*b[3] + t[1][2][3]*t[1][3][4]*t[3][4][5]*a[2]*a[3]*B2(b[1]) + (2*t[1][2][3]^2*t[1][3][4]*t[3][4][5] +3*t[1][2][3]^2*t[2][3][4]*t[3][4][5] +2*t[1][2][3]*t[1][2][4]*t[3][4][5] +t[1][2][3]*t[1][3][4]*t[2][4][5])*B2(a[2])*B2(b[1]) + (2*t[1][2][3]^2*t[2][3][4]*t[3][4][5] +t[1][2][3]*t[2][3][4]*t[2][4][5])*B3(a[2])*b[1] + (t[1][2][3]^2*t[1][3][4]*t[3][4][5] +t[1][2][3]*t[1][3][4]*t[1][4][5])*a[2]*B3(b[1]) + (t[1][2][3]^2*t[2][3][4]*t[3][4][5] +t[1][2][3]*t[2][3][4]*t[2][4][5])*B2(a[2])*b[1]*b[2] + (t[1][2][3]^2*t[2][3][4]*t[3][4][5] +t[1][2][3]*t[1][3][4]*t[2][4][5])*a[2]*B2(b[1])*b[2] + 4*t[1][2][3]^2*t[2][3][4]*t[3][4][5]*B3(a[2])*B2(b[1]) + 3*t[1][2][3]^2*t[1][3][4]*t[3][4][5]*B2(a[2])*B3(b[1]) + 2*t[1][2][3]^2*t[2][3][4]*t[3][4][5]*B2(a[2])*B2(b[1])*b[2]; return f; end; CheckCons := function() local I, i, j, k, a, b, c, r; I := IdentityMat(5); r := []; for i in [1..5] do for j in [1..5] do for k in [1..5] do a := HallMult(I[i], HallMult(I[j], I[k])); b := HallMult(HallMult(I[i], I[j]), I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(-I[i], HallMult(I[j], I[k])); b := HallMult(HallMult(-I[i], I[j]), I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(I[i], HallMult(-I[j], I[k])); b := HallMult(HallMult(I[i], -I[j]), I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(I[i], HallMult(I[j], -I[k])); b := HallMult(HallMult(I[i], I[j]), -I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(-I[i], HallMult(-I[j], -I[k])); b := HallMult(HallMult(-I[i], -I[j]), -I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(-I[i], HallMult(-I[j], I[k])); b := HallMult(HallMult(-I[i], -I[j]), I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(I[i], HallMult(-I[j], -I[k])); b := HallMult(HallMult(I[i], -I[j]), -I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; a := HallMult(-I[i], HallMult(I[j], -I[k])); b := HallMult(HallMult(-I[i], I[j]), -I[k]); c := a-b; if c <> 0*c then Add(r, c); fi; od; od; od; r := Flat(r); r := Filtered(r, x -> x <> 0*x); if Length(r) = 0 then return r; fi; return ReducedGroebnerBasis(r, MonomialLexOrdering()); end; ElimSquares := function( pol, var ) local i, e, f, j, m, k, a, b, c; a := NumeratorOfRationalFunction(pol); b := DenominatorOfRationalFunction(pol); i := IndeterminateNumberOfLaurentPolynomial(var); e := ExtRepPolynomialRatFun(a); f := 0*a; for j in [1,3..Length(e)-1] do m := 1; for k in [1,3..Length(e[j])-1] do if e[j][k] = i then c := e[j][k+1] mod 2; else c := e[j][k+1]; fi; if c <> 0 then m := m * Indeterminate(Rationals, e[j][k])^c; fi; od; f := f + e[j+1]*m; od; return f/b; end; ############################################################################# # Isomorphisms 211 ############################################################################# IsomEq_211 := function( ) local s, t, h, w, i, j, res, l, r; s := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("s", String(x), String(y), String(z)))))); s[2][3][4] := 0; s[1][2][5] := 0; s[1][3][5] := 0; s[1][4][5] := 0; s[2][3][5] := 0; s[2][4][5] := 0; s[3][4][5] := 0; t := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("t", String(x), String(y), String(z)))))); t[2][3][4] := 0; t[1][2][5] := 0; t[1][3][5] := 0; t[1][4][5] := 0; t[2][3][5] := 0; t[2][4][5] := 0; t[3][4][5] := 0; # the isomorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1],[3,2], [4,1],[4,2],[4,3]]; for i in [1..4] do for j in [1..4] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h3^t123 h4^t124 l := HallMult(s, h[2], h[1]); r := HallMult(s, h[1], h[2]); r := HallMult(s, r, t[1][2][3]*h[3]); r := HallMult(s, r, t[1][2][4]*h[4]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 l := HallMult(s, h[3], h[1]); r := HallMult(s, h[1], h[3]); r := HallMult(s, r, t[1][3][4]*h[4]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 l := HallMult(s, h[3], h[2]); r := HallMult(s, h[2], h[3]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); # permute to obtain ordering in the theorem res := Permuted(res, (2,3)); # multiply with units res[1] := h[3][3] * res[1]; res[2] := h[4][4] * res[2]; res[3] := h[4][4] * res[3]; # simplify last equation res[3] := Value( res[3], [t[1][2][3]], [res[1]+t[1][2][3]]); # remove squares of units for i in [1..4] do for j in [1..Length(res)] do res[j] := ElimSquares( res[j], h[i][i] ); od; od; return res; end; ############################################################################# # Automorphisms 211 ############################################################################# AutoEq_211 := function() local T, h, w, i, j, res, l, r, s, f; T := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("T", String(x), String(y), String(z)))))); T[2][3][4] := 0; T[1][2][5] := 0; T[1][3][5] := 0; T[1][4][5] := 0; T[2][3][5] := 0; T[2][4][5] := 0; T[3][4][5] := 0; # the automorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1],[3,2], [4,1],[4,2],[4,3]]; for i in [1..4] do for j in [1..4] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h3^T123 h4^T124 l := HallMult(T, h[2], h[1]); r := HallMult(T, h[1], h[2]); r := HallMult(T, r, T[1][2][3]*h[3]); r := HallMult(T, r, T[1][2][4]*h[4]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^T134 l := HallMult(T, h[3], h[1]); r := HallMult(T, h[1], h[3]); r := HallMult(T, r, T[1][3][4]*h[4]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 l := HallMult(T, h[3], h[2]); r := HallMult(T, h[2], h[3]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); # permute res := Permuted(res, (2,3)); # multiply with units res[1] := h[3][3] * res[1]; res[2] := h[4][4] * res[2]; res[3] := h[4][4] * res[3]; # simplify last equation res[3] := Value( res[3], [T[1][2][3]], [res[1]+T[1][2][3]]); # eliminate squares of units for i in [1..4] do for j in [1..Length(res)] do res[j] := ElimSquares( res[j], h[i][i] ); od; od; # now consider Equations (1)-(3) on page 9. This allows to replace # the elements h[i][i] by suitable f, s \in {1,-1}. f := Indeterminate(Rationals, "f"); s := Indeterminate(Rationals, "s"); for j in [1..Length(res)] do res[j] := Value( res[j], [h[1][1]], [f]); res[j] := Value( res[j], [h[2][2]], [s]); res[j] := Value( res[j], [h[3][3]], [s*f]); res[j] := Value( res[j], [h[4][4]], [s]); od; # multiply res[3] by a unit res[3]:= (res[3]*(-1)*s*f); # eliminate squares for j in [1..Length(res)] do res[j] := ElimSquares( res[j], s ); res[j] := ElimSquares( res[j], f ); od; return res; end; ############################################################################# # Isomorphisms 311 ############################################################################# IsomEq_311 := function() local s, t, h, w, i, j, res, l, r; s := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("s", String(x), String(y), String(z)))))); s[1][2][3] := 0; s[2][3][4] := 0; s[2][4][5] := 0; s[3][4][5] := 0; t := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("t", String(x), String(y), String(z)))))); t[1][2][3] := 0; t[2][3][4] := 0; t[2][4][5] := 0; t[3][4][5] := 0; # the isomorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1], [4,1],[4,2],[4,3], [5,1], [5,2], [5,3], [5,4]]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h4^t124 h5^t125 l := HallMult(s, h[2], h[1]); r := HallMult(s, h[1], h[2]); r := HallMult(s, r, t[1][2][4]*h[4]); r := HallMult(s, r, t[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 h5^t135 l := HallMult(s, h[3], h[1]); r := HallMult(s, h[1], h[3]); r := HallMult(s, r, t[1][3][4]*h[4]); r := HallMult(s, r, t[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h1 = h1 h4 h5^t145 l := HallMult(s, h[4], h[1]); r := HallMult(s, h[1], h[4]); r := HallMult(s, r, t[1][4][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h5^t[2][3][5] l := HallMult(s, h[3], h[2]); r := HallMult(s, h[2], h[3]); r := HallMult(s, r, t[2][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h2 = h2 h4 l := HallMult(s, h[4], h[2]); r := HallMult(s, h[2], h[4]); Add( res, l-r ); # evaluate rel: h3 h4 = h4 h3 l := HallMult(s, h[4], h[2]); r := HallMult(s, h[2], h[4]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (1,3,4,5,2, 6)); res := Permuted(res, (6,5)); # multiply by units res[1] := h[5][5]*res[1]; res[2] := h[5][5]*res[2]; res[3] := h[4][4]*res[3]; res[4] := h[4][4]*res[4]; res[6] := h[5][5]*res[6]; res[5] := h[5][5]*res[5]; # simplify two equations res[6] := Value( res[6], [t[1][3][4]], [res[4]+t[1][3][4]]); res[5] := Value( res[5], [t[1][2][4]], [res[3]+t[1][2][4]]); for i in [1..5] do for j in [1..Length(res)] do res[j] := ElimSquares( res[j], h[i][i] ); od; od; return res; end; ############################################################################# # Automorphisms 311 ############################################################################# AutoEq_311 := function() local t, T, h, w, i, j, res, l, r, e, f, s; T := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("T", String(x), String(y), String(z)))))); T[1][2][3] := 0; T[2][3][4] := 0; T[2][4][5] := 0; T[3][4][5] := 0; T[1][3][4] := 0; # the automorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1], [4,1],[4,2],[4,3], [5,1], [5,2], [5,3], [5,4]]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h4^T124 h5^T125 l := HallMult(T, h[2], h[1]); r := HallMult(T, h[1], h[2]); r := HallMult(T, r, T[1][2][4]*h[4]); r := HallMult(T, r, T[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 h5^T135 l := HallMult(T, h[3], h[1]); r := HallMult(T, h[1], h[3]); r := HallMult(T, r, T[1][3][4]*h[4]); r := HallMult(T, r, T[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h1 = h1 h4 h5^T145 l := HallMult(T, h[4], h[1]); r := HallMult(T, h[1], h[4]); r := HallMult(T, r, T[1][4][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h5^T[2][3][5] l := HallMult(T, h[3], h[2]); r := HallMult(T, h[2], h[3]); r := HallMult(T, r, T[2][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h2 = h2 h4 l := HallMult(T, h[4], h[2]); r := HallMult(T, h[2], h[4]); Add( res, l-r ); # evaluate rel: h3 h4 = h4 h3 l := HallMult(T, h[4], h[2]); r := HallMult(T, h[2], h[4]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (1,3,4,5,2, 6)); res := Permuted(res, (6,5)); # multiply with units res[1] := h[5][5]*res[1]; res[2] := h[5][5]*res[2]; res[3] := h[4][4]*res[3]; res[4] := h[4][4]*res[4]; res[6] := h[5][5]*res[6]; res[5] := h[5][5]*res[5]; # simplify res[5] := Value( res[5], [T[1][2][4]], [res[3]+T[1][2][4]]); # eliminate squares for i in [1..5] do for j in [1..Length(res)] do res[j] := ElimSquares( res[j], h[i][i] ); od; od; # now use relations (1)-(4) on page 13. This allows to replace # the values of h[i][i] and the value of h[3][2] by 0 s := Indeterminate(Rationals, "s"); e := Indeterminate(Rationals, "e"); f := Indeterminate(Rationals, "f"); for j in [1..Length(res)] do res[j] := Value( res[j], [h[1][1]], [f]); res[j] := Value( res[j], [h[2][2]], [s]); res[j] := Value( res[j], [h[3][3]], [e]); res[j] := Value( res[j], [h[4][4]], [f*s]); res[j] := Value( res[j], [h[5][5]], [s]); res[j] := Value( res[j], [h[3][2]], [0]); od; # adjust to result res[6]:= res[6]*(-1)*s*f/T[1][4][5]; res[5]:= res[5]*s/T[1][2][4]; for j in [1..Length(res)] do res[j] := ElimSquares( res[j], f ); res[j] := ElimSquares( res[j], s ); res[j] := ElimSquares( res[j], e ); od; return Filtered(res, x -> x <> 0*x); end; ############################################################################ # Isomorphisms 2111 ############################################################################ IsomEq_2111 := function() local t, s, h, w, i, j, res, l, r; s := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("s", String(x), String(y), String(z)))))); s[2][3][4] := 0; s[2][4][5] := 0; s[3][4][5] := 0; t := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("t", String(x), String(y), String(z)))))); t[2][3][4] := 0; t[2][4][5] := 0; t[3][4][5] := 0; # the isomorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1],[3,2], [4,1],[4,2],[4,3], [5,1],[5,2],[5,3],[5,4]]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h3^t123 h4^t124 h5^t125 l := HallMult(s, h[2], h[1]); r := HallMult(s, h[1], h[2]); r := HallMult(s, r, t[1][2][3]*h[3]); r := HallMult(s, r, t[1][2][4]*h[4]); r := HallMult(s, r, t[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 h5^t135 l := HallMult(s, h[3], h[1]); r := HallMult(s, h[1], h[3]); r := HallMult(s, r, t[1][3][4]*h[4]); r := HallMult(s, r, t[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h5^t235 l := HallMult(s, h[3], h[2]); r := HallMult(s, h[2], h[3]); r := HallMult(s, r, t[2][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h1 = h1 h4 h5^t145 l := HallMult(s, h[4], h[1]); r := HallMult(s, h[1], h[4]); r := HallMult(s, r, t[1][4][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h2 = h2 h4 l := HallMult(s, h[4], h[2]); r := HallMult(s, h[2], h[4]); Add( res, l-r ); # evaluate rel: h4 h3 = h3 h4 l := HallMult(s, h[4], h[3]); r := HallMult(s, h[3], h[4]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (2,5,6)(3,7)); # multiply by units res[1] := h[3][3]*res[1]; res[2] := h[5][5]*res[2]; res[3] := h[5][5]*res[3]; res[4] := h[4][4]*res[4]; res[5] := h[4][4]*res[5]; res[6] := h[5][5]*res[6]; res[7] := h[5][5]*res[7]; # adjust res[5] := Value( res[5], [t[1][2][3]], [res[1]+t[1][2][3]]); res[6] := Value( res[6], [t[1][3][4]], [res[4]+t[1][3][4]]); res[7] := Value( res[7], [t[1][2][3]], [res[1]+t[1][2][3]]); res[7] := Value( res[7], [t[1][2][4]], [res[5]+t[1][2][4]]); for j in [1..Length(res)] do for i in [1..5] do res[j] := ElimSquares(res[j], h[i][i]); od; od; return res; end; ############################################################################# # Automorphisms 2111 ############################################################################# AutoEq_2111 := function() local T, h, w, i, j, res, l, r, e, f; T := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("T", String(x), String(y), String(z)))))); T[2][3][4] := 0; T[2][4][5] := 0; T[3][4][5] := 0; # the isomorphism h := MutableNullMat(5,5); w := [ [2,1], [3,1],[3,2], [4,1],[4,2],[4,3], [5,1],[5,2],[5,3],[5,4]]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; # use equations (1)-(4) on page 17 and replace values as in the proof # of Theorem 21. e := Indeterminate(Rationals, "e"); f := Indeterminate(Rationals, "f"); h[1][1] := e; h[2][2] := f; h[3][3] := e*f; h[4][4] := f; h[5][5] := e*f; res := []; # evaluate rel: h2 h1 = h1 h2 h3^T123 h4^T124 h5^T125 l := HallMult(T, h[2], h[1]); r := HallMult(T, h[1], h[2]); r := HallMult(T, r, T[1][2][3]*h[3]); r := HallMult(T, r, T[1][2][4]*h[4]); r := HallMult(T, r, T[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^T134 h5^T135 l := HallMult(T, h[3], h[1]); r := HallMult(T, h[1], h[3]); r := HallMult(T, r, T[1][3][4]*h[4]); r := HallMult(T, r, T[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h5^T235 l := HallMult(T, h[3], h[2]); r := HallMult(T, h[2], h[3]); r := HallMult(T, r, T[2][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h1 = h1 h4 h5^T145 l := HallMult(T, h[4], h[1]); r := HallMult(T, h[1], h[4]); r := HallMult(T, r, T[1][4][5]*h[5]); Add( res, l-r ); # evaluate rel: h4 h2 = h2 h4 l := HallMult(T, h[4], h[2]); r := HallMult(T, h[2], h[4]); Add( res, l-r ); # evaluate rel: h4 h3 = h3 h4 l := HallMult(T, h[4], h[3]); r := HallMult(T, h[3], h[4]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := List(res, x -> ElimSquares(x, e)); res := List(res, x -> ElimSquares(x, f)); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (2,3)); # simplify by using T[2][3][5]*(f-1) = 0 res[3] := res[3]+T[1][2][3]*T[2][3][5]*e*(f-1)/2; return res; end; ############################################################################ # Canonical forms 2111 ############################################################################ CanoEq_2111 := function() local t123, t124, t125, t134, t135, t145, t235, x, y, z, w, v, u1, u2, v1, v2, w1, w2, w3, e, f, d, g, h, k, n, m, l, g134, g123, h235, kh, k134, kl, hk, a, b, c, f1, f2, f3, pol, p2, p3, r, s, t; t123 := Indeterminate(Rationals, "t123"); t124 := Indeterminate(Rationals, "t124"); t125 := Indeterminate(Rationals, "t125"); t134 := Indeterminate(Rationals, "t134"); t135 := Indeterminate(Rationals, "t135"); t145 := Indeterminate(Rationals, "t145"); t235 := Indeterminate(Rationals, "t235"); x := Indeterminate(Rationals, "x"); y := Indeterminate(Rationals, "y"); z := Indeterminate(Rationals, "z"); w := Indeterminate(Rationals, "w"); v := Indeterminate(Rationals, "v"); u1 := Indeterminate(Rationals, "u1"); u2 := Indeterminate(Rationals, "u2"); v1 := Indeterminate(Rationals, "v1"); v2 := Indeterminate(Rationals, "v2"); w1 := Indeterminate(Rationals, "w1"); w2 := Indeterminate(Rationals, "w2"); w3 := Indeterminate(Rationals, "w3"); e := Indeterminate(Rationals, "e"); f := Indeterminate(Rationals, "f"); d := Indeterminate(Rationals, "d"); # ggt(t123, t145, t235) g := Indeterminate(Rationals, "g"); # ggt(t134, t123) h := Indeterminate(Rationals, "h"); # ggt(l, t134, t235) k := Indeterminate(Rationals, "i"); # ggt(l, t134) n := Indeterminate(Rationals, "n"); m := Indeterminate(Rationals, "m"); l := Indeterminate(Rationals, "l"); # n t145 g134 g134 := Indeterminate(Rationals, "g134"); # frac{t134}{g} g123 := Indeterminate(Rationals, "g123"); # frac{t123}{g} h235 := Indeterminate(Rationals, "h235"); # frac{t235}{h} k134 := Indeterminate(Rationals, "k134"); # frac{t134}{k} kl := Indeterminate(Rationals, "kl"); # frac{l}{k} kh := Indeterminate(Rationals, "kh"); # frac{h}{k} a := Indeterminate(Rationals, "a"); b := Indeterminate(Rationals, "b"); c := Indeterminate(Rationals, "c"); f1 := e * t124 - x * t123 + y * t134; f2 := e * t135 + e*f*x* t145 + v * t235 + z * t134; f3 := t125 + e*z*t124 + y*z* t134 + e*y*t135 + w*d; Print("\n"); Print("Lemma 3 translates to the replacements: \n"); Print("Replace x -> n(u1+a*g134) \n"); Print("Replace y -> -n(u2-a*g123) \n"); Print("Replace a -> -efm(w1 + b*k134 - c*v1*h235) \n"); Print("Replace z -> -m(w2 - b*kl - c*v2*h235) \n"); Print("Replace v -> -m(w3 - b*hk) \n\n"); ############################################################################# ## f1 is in final shape Print("This yields the polynomials: \n"); Print("f1: ", f1,"\n"); ############################################################################# # replace x and y in f2 and f3 pol := [f2, f3]; pol := List(pol, p -> Value(p, [x], [n*(u1+a*g134)])); pol := List(pol, p -> Value(p, [y], [-n*(u2-a*g123)])); ############################################################################# # take f2 and replace t145*n*g134 by l f2 := pol[1]; p2 := PolynomialDivisionAlgorithm(f2, [t145*n*g134], MonomialLexOrdering()); f2 := p2[2][1]*l + p2[1]; ############################################################################# # f2 is in final shape Print("f2: ", f2, "\n"); ############################################################################# # replace a, z, v in f3 pol := pol{[2]}; pol := List(pol, p -> Value(p, [a], [-e*f*m*(w1 + b*k134 - c*v1*h235)])); pol := List(pol, p -> Value(p, [z], [-m*(w2 - b*kl - c*v2*h235)])); pol := List(pol, p -> Value(p, [v], [-m*(w3 + c*kh)])); ############################################################################# # now consider f3 f3 := pol[1]; ############################################################################# # f3 has the summand w d - use this to reduce # - d divides t134 * g123 # - d divides t134 * kl # - d divides t134 * h235 f3 := PolynomialDivisionAlgorithm(f3, [t134*g123], MonomialLexOrdering())[1]; f3 := PolynomialDivisionAlgorithm(f3, [t134*kl], MonomialLexOrdering())[1]; f3 := PolynomialDivisionAlgorithm(f3, [t134*h235], MonomialLexOrdering())[1]; ############################################################################# # f3 contains the variables w, b, c # write f3 as f3 = r b + s c + t w + rem p3 := PolynomialDivisionAlgorithm(f3, [b], MonomialLexOrdering()); r := p3[2][1]; f3 := p3[1]; p3 := PolynomialDivisionAlgorithm(f3, [c], MonomialLexOrdering()); s := p3[2][1]; f3 := p3[1]; p3 := PolynomialDivisionAlgorithm(f3, [w], MonomialLexOrdering()); t := p3[2][1]; f3 := p3[1]; Print("f3 = r b + s c + t w + t125 + rest with \n"); Print(" r = ",r,"\n"); Print(" s = ",s,"\n"); Print(" t = ",t,"\n"); Print(" rest = ",f3-t125,"\n"); end; ############################################################################ # Isomorphisms 212 ############################################################################ IsomEq_212 := function() local t, s, h, w, i, j, res, l, r, rev, l1, l2; t := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("t", String(x), String(y), String(z)))))); t[1][4][5] := 0; t[2][4][5] := 0; t[3][4][5] := 0; s := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("s", String(x), String(y), String(z)))))); s[1][4][5] := 0; s[2][4][5] := 0; s[3][4][5] := 0; # the isomorphism h := MutableNullMat(5,5); w := [ [3,1],[3,2], [4,1],[4,2],[4,3], [5,1],[5,2],[5,3] ]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h3^t123 h4^t124 h5^t125 l := HallMult(s, h[2], h[1]); r := HallMult(s, h[1], h[2]); r := HallMult(s, r, t[1][2][3]*h[3]); r := HallMult(s, r, t[1][2][4]*h[4]); r := HallMult(s, r, t[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 h5^t135 l := HallMult(s, h[3], h[1]); r := HallMult(s, h[1], h[3]); r := HallMult(s, r, t[1][3][4]*h[4]); r := HallMult(s, r, t[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h4^t234 h5^t235 l := HallMult(s, h[3], h[2]); r := HallMult(s, h[2], h[3]); r := HallMult(s, r, t[2][3][4]*h[4]); r := HallMult(s, r, t[2][3][5]*h[5]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (4,2,6,3,7,5)); # multiply by unit det(U) res[1] := -res[1]*(h[1][1]*h[2][2]-h[1][2]*h[2][1]); # adjust res[1], note that det(U)^2 = 1 res[1] := res[1] +(h[1][1]*h[2][2]-h[1][2]*h[2][1])^2 * s[1][2][3]-s[1][2][3]; return res; end; ############################################################################# # Automorphisms 212 ############################################################################# AutoEq_212 := function( ) local t, T, h, w, i, j, res, l, r, a, b; T := List([1..5], x -> List([1..5], y -> List([1..5], z -> Indeterminate(Rationals, Concatenation("T", String(x), String(y), String(z)))))); T[1][4][5] := 0; T[2][4][5] := 0; T[3][4][5] := 0; T[1][3][5] := 0; T[2][3][4] := 0; T[1][3][4] := Indeterminate(Rationals, "a"); T[2][3][5] := Indeterminate(Rationals, "b"); # the isomorphism h := MutableNullMat(5,5); w := [ [3,1],[3,2], [4,1],[4,2],[4,3], [5,1],[5,2],[5,3] ]; for i in [1..5] do for j in [1..5] do if not [i,j] in w then h[i][j] := Indeterminate(Rationals, Concatenation("m",String(i),String(j))); fi; od; od; res := []; # evaluate rel: h2 h1 = h1 h2 h3^t123 h4^t124 h5^t125 l := HallMult(T, h[2], h[1]); r := HallMult(T, h[1], h[2]); r := HallMult(T, r, T[1][2][3]*h[3]); r := HallMult(T, r, T[1][2][4]*h[4]); r := HallMult(T, r, T[1][2][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h1 = h1 h3 h4^t134 h5^t135 l := HallMult(T, h[3], h[1]); r := HallMult(T, h[1], h[3]); r := HallMult(T, r, T[1][3][4]*h[4]); r := HallMult(T, r, T[1][3][5]*h[5]); Add( res, l-r ); # evaluate rel: h3 h2 = h2 h3 h4^t234 h5^t235 l := HallMult(T, h[3], h[2]); r := HallMult(T, h[2], h[3]); r := HallMult(T, r, T[2][3][4]*h[4]); r := HallMult(T, r, T[2][3][5]*h[5]); Add( res, l-r ); # summarize res := Flat(res); res := Filtered(res, x -> x <> 0*x); res := Permuted(res, (4,2,6,3,7,5)); # adjust results res[1] := res[1]/T[1][2][3]; res[2] := res[2]/T[1][3][4]; res[3] := res[3]/T[2][3][5]; res[4] := res[4]/T[1][3][4]; res[5] := res[5]/T[2][3][5]; return res; end;