all := function(x1, x2, y1, y2) # generates the list [[x1,y1],...,[x1,y2],...,[x2,y1],...,[x2,y2]] local w, k, i, j; w := [ ]; k := 1; for i in [x1..x2] do for j in [y1..y2] do w[k] := [i,j]; k := k+1; od; od; return w; end; test := function(M, N, q, r, s, t, cM, cN) # checks candidate a_q*b_r*a_s^-1*b_t^-1 if (s = cM+1-q and t = cN+1-r) or M[s][cN+1-r] <> 0 or M[cM-q+1][t] <> 0 or M[cM+1-s][cN+1-t] <> 0 or # M[q][r] <> 0 is tested in test2 ForAny(all(1,cM,1,cN), v -> ([M[v[1]][v[2]],N[v[1]][v[2]]] in [[s,t], [q,cN+1-t], [cM+1-s,r], [cM+1-q,cN+1-r]])) then return false; else return true; fi; end; part := function(x, y, z) # we assume y <= z # generates list [[1,1],...,[1,z],...,[x-1,1],...,[x-1,z],[x,1],...,[x,y-1]] local w, k, i1, i2, j; w := [ ]; k := 1; for i1 in [1..x-1] do for i2 in [1..z] do w[k] := [i1,i2]; k := k+1; od; od; for j in [1..y-1] do w[k] := [x,j]; k := k+1; od; return w; end; test2 := function(A, x, y, z) # returns true if (x,y) is the first "free" position in A if A[x][y] = 0 and ForAll(part(x,y,z), v -> A[v[1]][v[2]] <> 0) then return true; else return false; fi; end; full := function(A) # returns true if matrix A contains no 0 if ForAny(A, x -> 0 in x) then return false; else return true; fi; end; z := 0; main := function(A, B) local cA, cB, i, j, k, l, AA, BB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; for i in [1..cA/2] do for j in [1..cB] do if test2(A,i,j,cB) then # (i,j) is first free position in A for k in [1..cA] do for l in [1..cB] do if test(A,B,i,j,k,l,cA,cB) then # tests if a_i b_j a_k^-1 b_l^-1 is ok AA := StructuralCopy(A); BB := StructuralCopy(B); AA[i][j] := k; BB[i][j] := l; AA[k][cB-j+1] := i; BB[k][cB-j+1] := cB+1-l; AA[cA+1-i][l] := cA+1-k; BB[cA+1-i][l] := j; AA[cA+1-k][cB+1-l] := cA+1-i; BB[cA+1-k][cB+1-l] := cB+1-j; if full(AA) then # (AA,BB) now describes a (cA,cB)-complex z := z + 1; # counter # if conditions(AA,BB) then Print(AA, " ", BB, "\n"); fi; else main(AA, BB); # recursive step fi; fi; od; od; fi; od; od; return z; end; # e.g. main(NullMat(4, 6), NullMat(4, 6)); # e.g. main(C,D); ############################################################################ full all test part test2 as before Ma := function(m, n) # generates (m x n)-matrix A, A[i][j] = i local i, j, w; w := NullMat(m,n); for i in [1..m] do for j in [1..n] do w[i][j] := i; od; od; return w; end; Mb := function(m, n) # generates (m x n)-matrix A, A[i][j] = j local i, j, w; w := NullMat(m,n); for i in [1..m] do for j in [1..n] do w[i][j] := j; od; od; return w; end; out := []; rdm := function(A, B, p) local cA, cB, i, j, k, l, AA, BB, kl, pp, z; z := 0; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; for i in [1..cA/2] do for j in [1..cB] do if test2(A,i,j,cB) then repeat kl := Random(p); # p: available edges in link z := z+1; # z counts number of attempts until test(A,B,i,j,kl[1],kl[2],cA,cB) or z = 30; AA := StructuralCopy(A); BB := StructuralCopy(B); if z < 30 then # test ok AA[i][j] := kl[1]; BB[i][j] := kl[2]; AA[kl[1]][cB-j+1] := i; BB[kl[1]][cB-j+1] := cB+1-kl[2]; AA[cA+1-i][kl[2]] := cA+1-kl[1]; BB[cA+1-i][kl[2]] := j; AA[cA+1-kl[1]][cB+1-kl[2]] := cA+1-i; BB[cA+1-kl[1]][cB+1-kl[2]] := cB+1-j; pp := StructuralCopy(p); RemoveSet(pp,kl); RemoveSet(pp,[i,cB+1-kl[2]]); RemoveSet(pp,[cA+1-kl[1],j]); RemoveSet(pp,[cA+1-i,cB+1-j]); # removes used edges in link if full(AA) then out := StructuralCopy([AA,BB,cA,cB]); else rdm(AA, BB, pp); fi; fi; fi; od; od; return out; end; slc := function(aa,bb) local res; repeat out := [Ma(aa,bb),Mb(aa,bb),aa,bb]; res := rdm(NullMat(aa, bb), NullMat(aa, bb), all(1,aa,1,bb)); until # conditions(res[1],res[2]); Print(res[1],"\n",res[2],"\n"); end; # e.g. slc(6,6); ############################local groups ######## PhPerm := function(j, cA, A) # generates permutation in P_h induced by "b_j" local v, i; v := [ ]; for i in [1..cA] do v[i] := cA+1-A[cA-i+1][j]; od; return PermList(v); end; Ph := function(A) # generates P_h as a permutation group local p, j, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for j in [1..cB/2] do p[j] := PhPerm(j,cA,A); od; return Group(p,()); end; PvPerm := function(i, cA, cB, B) # generates permutation in P_v induced by "a_i" local w, j; w := [ ]; for j in [1..cB] do w[j] := B[cA-i+1][j]; od; return PermList(w); end; Pv := function(B) # generates P_v local p, i, cA, cB; cA := DimensionsMat(B)[1]; cB := DimensionsMat(B)[2]; p := [ ]; for i in [1..cA/2] do p[i] := PvPerm(i,cA,cB,B); od; return Group(p,()); end; indx := function(v, x) # returns index of first appearance of x in vector v local i; i := 1; while v[i] <> x do i := i+1; od; return i; end; s2 := function(c) # generates points in 2-sphere of c-tree local v, k, i, j; v := [ ]; k := 1; for i in [1..c] do for j in [1..c] do if i+j <> c+1 then # exclude reducible paths v[k] := [i,j]; k := k+1; fi; od; od; return v; end; vPerm2i := function(i, cA, cB, A, B) # generates i-th permutation in P2v local w, j; w := [ ]; for j in [1..cB*(cB-1)] do w[j] := indx(s2(cB), [B[cA+1-i][s2(cB)[j][1]], B[A[cA+1-i][s2(cB)[j][1]]][s2(cB)[j][2]]]); od; return PermList(w); end; P2v := function(A, B) # generates P2v local i, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for i in [1..cA/2] do p[i] := vPerm2i(i, cA, cB, A, B); od; return Group(p,()); end; hPerm2j := function(j, cA, cB, A, B) # generates j-th permutation in P2h local w, i; w := [ ]; for i in [1..cA*(cA-1)] do w[i] := indx(s2(cA), [cA+1-A[cA+1-s2(cA)[i][1]][j], cA+1-A[cA+1-s2(cA)[i][2]][B[cA+1-s2(cA)[i][1]][j]]]); od; return PermList(w); end; P2h := function(A, B) # generates P2h local j, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for j in [1..cB/2] do p[j] := hPerm2j(j, cA, cB, A, B); od; return Group(p,()); end; s3 := function(c) # generates points in 3-sphere of c-tree local v, k, i1, i2, i3; v := [ ]; k := 1; for i1 in [1..c] do for i2 in [1..c] do for i3 in [1..c] do if i1+i2 <> c+1 and i2+i3 <> c+1 then # exclude reducible paths v[k] := [i1,i2,i3]; k := k+1; fi; od; od; od; return v; end; vPerm3i := function(i, cA, cB, A, B) # generates i-th permutation in P3v local w, j; w := [ ]; for j in [1..cB*(cB-1)^2] do w[j] := indx(s3(cB),[B[cA+1-i][s3(cB)[j][1]], B[A[cA+1-i][s3(cB)[j][1]]][s3(cB)[j][2]], B[A[A[cA+1-i][s3(cB)[j][1]]][s3(cB)[j][2]]][s3(cB)[j][3]]]); od; return PermList(w); end; P3v := function(A, B) # generates P3v local i, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for i in [1..cA/2] do p[i] := vPerm3i(i, cA, cB, A, B); od; return Group(p,()); end; hPerm3j := function(j, cA, cB, A, B) # generates j-th permutation in P3h local w, i; w := [ ]; for i in [1..cA*(cA-1)^2] do w[i] := indx(s3(cA),[cA+1-A[cA+1-s3(cA)[i][1]][j], cA+1-A[cA+1-s3(cA)[i][2]][B[cA+1-s3(cA)[i][1]][j]], cA+1-A[cA+1-s3(cA)[i][3]][B[cA+1-s3(cA)[i][2]][B[cA+1-s3(cA)[i][1]][j]]]]); od; return PermList(w); end; P3h := function(A, B) # generates P3h local j, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for j in [1..cB/2] do p[j] := hPerm3j(j, cA, cB, A, B); od; return Group(p,()); end; s4 := function(c) # generates points in 4-sphere of c-tree local v, k, i1, i2, i3, i4; v := [ ]; k := 1; for i1 in [1..c] do for i2 in [1..c] do for i3 in [1..c] do for i4 in [1..c] do if i1+i2 <> c+1 and i2+i3 <> c+1 and i3+i4 <> c+1 then # exclude reducible paths v[k] := [i1,i2,i3,i4]; k := k+1; fi; od; od; od; od; return v; end; vPerm4i := function(i, cA, cB, A, B) # generates i-th permutation in P4v local w, j; w := [ ]; for j in [1..cB*(cB-1)^3] do w[j] := indx(s4(cB),[B[cA+1-i][s4(cB)[j][1]], B[A[cA+1-i][s4(cB)[j][1]]][s4(cB)[j][2]], B[A[A[cA+1-i][s4(cB)[j][1]]][s4(cB)[j][2]]][s4(cB)[j][3]], B[A[A[A[cA+1-i][s4(cB)[j][1]]][s4(cB)[j][2]]][s4(cB)[j][3]]][s4(cB)[j][4]]]); od; return PermList(w); end; P4v := function(A, B) # generates P4v local i, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for i in [1..cA/2] do p[i] := vPerm4i(i, cA, cB, A, B); od; return Group(p,()); end; hPerm4j := function(j, cA, cB, A, B) # generates j-th permutation in P4h local w, i; w := [ ]; for i in [1..cA*(cA-1)^3] do w[i] := indx(s4(cA),[cA+1-A[cA+1-s4(cA)[i][1]][j], cA+1-A[cA+1-s4(cA)[i][2]][B[cA+1-s4(cA)[i][1]][j]], cA+1-A[cA+1-s4(cA)[i][3]][B[cA+1-s4(cA)[i][2]][B[cA+1-s4(cA)[i][1]][j]]], cA+1-A[cA+1-s4(cA)[i][4]][B[cA+1-s4(cA)[i][3]][B[cA+1-s4(cA)[i][2]][B[cA+1-s4(cA)[i][1]][j]]]]]); od; return PermList(w); end; P4h := function(A, B) # generates P4h local j, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for j in [1..cB/2] do p[j] := hPerm4j(j, cA, cB, A, B); od; return Group(p,()); end; s5 := function(c) # generates points in 5-sphere of c-tree local v, k, i1, i2, i3, i4, i5; v := [ ]; k := 1; for i1 in [1..c] do for i2 in [1..c] do for i3 in [1..c] do for i4 in [1..c] do for i5 in [1..c] do if i1+i2 <> c+1 and i2+i3 <> c+1 and i3+i4 <> c+1 and i4+i5 <> c+1 then # exclude reducible paths v[k] := [i1,i2,i3,i4,i5]; k := k+1; fi; od; od; od; od; od; return v; end; vPerm5i := function(i, cA, cB, A, B) # generates i-th permutation in P5v local w, j; w := [ ]; for j in [1..cB*(cB-1)^4] do w[j] := indx(s5(cB),[B[cA+1-i][s5(cB)[j][1]], B[A[cA+1-i][s5(cB)[j][1]]][s5(cB)[j][2]], B[A[A[cA+1-i][s5(cB)[j][1]]][s5(cB)[j][2]]][s5(cB)[j][3]], B[A[A[A[cA+1-i][s5(cB)[j][1]]][s5(cB)[j][2]]][s5(cB)[j][3]]][s5(cB)[j][4]], B[A[A[A[A[cA+1-i][s5(cB)[j][1]]][s5(cB)[j][2]]][s5(cB)[j][3]]][s5(cB)[j][4]]][s5(cB)[j][5]]]); od; return PermList(w); end; P5v := function(A, B) # generates P5v local i, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for i in [1..cA/2] do p[i] := vPerm5i(i, cA, cB, A, B); od; return Group(p,()); end; hPerm5j := function(j, cA, cB, A, B) # generates j-th permutation in P5h local w, i; w := [ ]; for i in [1..cA*(cA-1)^4] do w[i] := indx(s5(cA),[cA+1-A[cA+1-s5(cA)[i][1]][j], cA+1-A[cA+1-s5(cA)[i][2]][B[cA+1-s5(cA)[i][1]][j]], cA+1-A[cA+1-s5(cA)[i][3]][B[cA+1-s5(cA)[i][2]][B[cA+1-s5(cA)[i][1]][j]]], cA+1-A[cA+1-s5(cA)[i][4]][B[cA+1-s5(cA)[i][3]][B[cA+1-s5(cA)[i][2]][B[cA+1-s5(cA)[i][1]][j]]]], cA+1-A[cA+1-s5(cA)[i][5]][B[cA+1-s5(cA)[i][4]][B[cA+1-s5(cA)[i][3]][B[cA+1-s5(cA)[i][2]][B[cA+1-s5(cA)[i][1]][j]]]]]]); od; return PermList(w); end; P5h := function(A, B) # generates P5h local j, p, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; p := [ ]; for j in [1..cB/2] do p[j] := hPerm5j(j, cA, cB, A, B); od; return Group(p,()); end; ####################################################### presentation ######################### F := FreeGroup("a1", "a2", "a3", "b1", "b2", "b3"); a1 := F.1; a2 := F.2; a3 := F.3; b1 := F.4; b2 := F.5; b3 := F.6; NL6a := function(n) local v; if n=1 then v := a1; elif n=2 then v := a2; elif n=3 then v := a3; elif n=4 then v := a3^-1; elif n=5 then v := a2^-1; elif n=6 then v := a1^-1; fi; return v; end; NL6b := function(n) local v; if n=1 then v := b1; elif n=2 then v := b2; elif n=3 then v := b3; elif n=4 then v := b3^-1; elif n=5 then v := b2^-1; elif n=6 then v := b1^-1; fi; return v; end; relation6 := function(A, B) local i, j, rel, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; rel := []; for i in [1..cA/2] do for j in [1..cB] do if not NL6a(i)*NL6b(j)*NL6a(cA+1-A[i][j])*NL6b(cB+1-B[i][j]) in rel and not NL6a(cA+1-A[i][j])*NL6b(cB+1-B[i][j])*NL6a(i)*NL6b(j) in rel and not NL6a(cA+1-A[i][j])^-1*NL6b(j)^-1*NL6a(i)^-1*NL6b(cB+1-B[i][j])^-1 in rel then Add(rel,NL6a(i)*NL6b(j)*NL6a(cA+1-A[i][j])*NL6b(cB+1-B[i][j])); fi; od; od; return rel; end; G := F / relation6(A,B); ###########################################################normal form############################### F NL6a NL6b as before LN6a := function(w) local n; if w=a1 then n := 1; elif w=a2 then n := 2; elif w=a3 then n := 3; elif w=a3^-1 then n := 4; elif w=a2^-1 then n := 5; elif w=a1^-1 then n := 6; fi; return n; end; LN6b := function(w) local n; if w=b1 then n := 1; elif w=b2 then n := 2; elif w=b3 then n := 3; elif w=b3^-1 then n := 4; elif w=b2^-1 then n := 5; elif w=b1^-1 then n := 6; fi; return n; end; SetA6 := [a1, a2, a3, a3^-1, a2^-1, a1^-1]; SetB6 := [b1, b2, b3, b3^-1, b2^-1, b1^-1]; nfab := function(A,B,w) # brings w in a normal form a..b local i; for i in [1..Length(w)-1] do if Subword(w,i,i) in SetB6 and Subword(w,i+1,i+1) in SetA6 then return nfab(A,B,SubstitutedWord(w,i,i+1, (NL6b(B[LN6a(Subword(w,i+1,i+1)^-1)][LN6b(Subword(w,i,i)^-1)])* NL6a(A[LN6a(Subword(w,i+1,i+1)^-1)][LN6b(Subword(w,i,i)^-1)]))^-1)); fi; od; return w; end; nfba := function(A,B,w) # brings w in a normal form b..a local i; for i in [1..Length(w)-1] do if Subword(w,i,i) in SetA6 and Subword(w,i+1,i+1) in SetB6 then return nfba(A,B,SubstitutedWord(w,i,i+1, NL6b(B[LN6a(Subword(w,i,i))][LN6b(Subword(w,i+1,i+1))])* NL6a(A[LN6a(Subword(w,i,i))][LN6b(Subword(w,i+1,i+1))]))); fi; od; return w; end; ##################################################################### Aut(X) ########## relation := function(A, B) local i, j, k, rel, rel2, cA, cB; cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; rel := []; rel2 := []; for i in [1..cA] do for j in [1..cB] do rel[cB*(i-1)+j] := NL6a(i)*NL6b(j)*NL6a(cA+1-A[i][j])*NL6b(cB+1-B[i][j]); od; od; for k in [1..cA*cB] do rel2[k] := Subword(rel[k],2,4)*Subword(rel[k],1,1); od; return Union(rel,rel2);; end; LN := function(w,k1,k2,k3,k4,k5,k6,c) local n; if w=a1 then n := k1; elif w=a2 then n := k2; elif w=a3 then n := k3; elif w=b1 then n := k4; elif w=b2 then n := k5; elif w=b3 then n := k6; elif w=b3^-1 then n := c-k6; elif w=b2^-1 then n := c-k5; elif w=b1^-1 then n := c-k4; elif w=a3^-1 then n := c-k3; elif w=a2^-1 then n := c-k2; elif w=a1^-1 then n := c-k1; fi; return n; end; NL := function(z) local n; if z=1 then n := a1; elif z=2 then n := a2; elif z=3 then n := a3; elif z=4 then n := b1; elif z=5 then n := b2; elif z=6 then n := b3; elif z=7 then n := b3^-1; elif z=8 then n := b2^-1; elif z=9 then n := b1^-1; elif z=10 then n := a3^-1; elif z=11 then n := a2^-1; elif z=12 then n := a1^-1; fi; return n; end; permute := function(A,B) local i1, i2, i3, j1, j2, j3, k, PL, L, cA, cB, c; PL := []; L := relation(A,B); cA := DimensionsMat(A)[1]; cB := DimensionsMat(A)[2]; c := cA + cB; for i1 in [1..c] do for i2 in Difference([1..c], [i1, c+1-i1]) do for i3 in Difference([1..c], [i1, c+1-i1, i2, c+1-i2])do for j1 in Difference([1..c], [i1, c+1-i1, i2, c+1-i2, i3, c+1-i3])do for j2 in Difference([1..c], [i1, c+1-i1, i2, c+1-i2, i3, c+1-i3, j1, c+1-j1])do for j3 in Difference([1..c], [i1, c+1-i1, i2, c+1-i2, i3, c+1-i3, j1, c+1-j1, j2, c+1-j2])do for k in [1..Size(L)] do PL[k] := NL(LN(Subword(L[k],1,1),i1,i2,i3,j1,j2,j3,c+1)) * NL(LN(Subword(L[k],2,2),i1,i2,i3,j1,j2,j3,c+1)) * NL(LN(Subword(L[k],3,3),i1,i2,i3,j1,j2,j3,c+1)) * NL(LN(Subword(L[k],4,4),i1,i2,i3,j1,j2,j3,c+1)); od; if Set(PL) = Set(L) then Print(NL(i1)," ",NL(i2)," ",NL(i3)," ", NL(j1)," ",NL(j2)," ",NL(j3)," ","\n"); fi; od; od; od; od; od; od; end; permute(A,B); ##################################################################### quaternions ################### psi := function(v,x0,x1,x2,x3) return[[x0 + v*x1*E(4), v*x2 + v*x3*E(4)],[-v*x2 + v*x3*E(4), x0 - v*x1*E(4)]]; end; a := []; b := []; a[1] := psi(1,1,0,1,1); # psi(1+j+k) a[2] := psi(1,1,0,1,-1); # psi(1+j-k) a[3] := psi(-1,1,0,1,-1); # psi(1-j+k) a[4] := psi(-1,1,0,1,1); # psi(1-j-k) b[1] := psi(1,1,2,0,0); b[2] := psi(1,1,0,2,0); b[3] := psi(1,1,0,0,2); b[4] := psi(-1,1,0,0,2); b[5] := psi(-1,1,0,2,0); b[6] := psi(-1,1,2,0,0); qAB := function(p,l) local i, j, k, m, A, B; A := NullMat(p+1,l+1); B := NullMat(p+1,l+1); for i in [1..p+1] do for j in [1..l+1] do for k in [1..l+1] do for m in [1..p+1] do if a[i]*b[j] = b[k]*a[m] or a[i]*b[j] = -b[k]*a[m] then A[i][j] := m; B[i][j] := k; fi; od; od; od; od; return([A,B]); end; A := qAB(3,5)[1]; B := qAB(3,5)[2]; ################################################################## transition matrices #################### M1 := function(B,cA,cB) local M, i, j; M := NullMat(cA*cB, cA*cB); for i in [1..cA*cB] do for j in [1..cA*cB] do if all(1,cA,1,cB)[j][2] = B[all(1,cA,1,cB)[i][1]][all(1,cA,1,cB)[i][2]] and all(1,cA,1,cB)[j][1] <> cA + 1 - all(1,cA,1,cB)[i][1] then M[i][j] := 1; fi; od; od; return M; end; M2 := function(A,cA,cB) local M, i, j; M := NullMat(cA*cB, cA*cB); for i in [1..cA*cB] do for j in [1..cA*cB] do if all(1,cA,1,cB)[i][1] = A[all(1,cA,1,cB)[j][1]][all(1,cA,1,cB)[j][2]] and all(1,cA,1,cB)[i][2] <> cB + 1 - all(1,cA,1,cB)[j][2] then M[i][j] := 1; fi; od; od; return M; end; ################################################################################ examples #### (A6,A6): A := [ [ 1, 1, 5, 3, 1, 1 ], [ 3, 3, 3, 4, 6, 3 ], [ 2, 5, 1, 2, 2, 2 ], [ 5, 6, 2, 5, 5, 5 ], [ 4, 4, 4, 1, 3, 4 ], [ 6, 2, 6, 6, 4, 6 ] ]; B := [ [ 1, 3, 2, 5, 4, 6 ], [ 2, 3, 6, 5, 4, 1 ], [ 6, 3, 2, 1, 4, 5 ], [ 4, 3, 2, 5, 6, 1 ], [ 6, 1, 2, 5, 4, 3 ], [ 1, 3, 2, 5, 4, 6 ] ]; (A4,D4): A := [[1,2,3,1],[3,3,1,4],[4,1,2,2],[2,4,4,3]]; B := [[2,4,1,3],[3,4,1,2],[3,4,1,2],[3,1,4,2]]; (S4,S4): A := [ [ 2, 3, 4, 4 ], [ 3, 4, 3, 1 ], [ 4, 2, 1, 2 ], [ 1, 1, 2, 3 ] ]; B := [ [ 4, 3, 1, 2 ], [ 2, 3, 4, 1 ], [ 4, 1, 2, 3 ], [ 3, 4, 2, 1 ] ]; ##############################################################################################