# The Cyclically Resolvable Steiner Triple Systems of Order 57
## 3 Construction  
To double-check the results, we obtain them in parallel by two different algorithms. For each design we start with sorting its blocks in a lexicographic order defined by the points they contain. We further work with the successive numbers of the blocks in the sorted array. The first algorithm (\(A_{1}\)) uses substantially the results from Section 2.3. We first construct the block orbits under \(G_{19}\) and establish that there are 368,486, 1,828,784 and 156,040 cyclic STS(57)s with respectively 1, 7, and 13 block orbits under \(G_{19}\) which are parallel classes. By Corollary 1 we further test for cyclic resolvability only the 156,040 designs that have 13 block orbits under \(G_{19}\) which are parallel classes. Their full automorphism groups are presented in Table 4. It further turns out that only 74 of the 156,040 designs are not cyclically resolvable. \(A_{1}\) constructs only resolutions with the structure from Theorem 1. We denote by \(P_{19}\) the lexicographically smallest parallel class (base class) from the class orbit of length 19 and by \(P_{3_{1}}\), \(P_{3_{2}}\), and \(P_{3_{3}}\) the lexicographically smallest parallel classes (base classes) from the three class orbits of length 3. We shall illustrate the construction by several code segments. The first of them presents the function PCres57 in which ReadDes reads each cyclic STS(57) and initializes the variables that will be used further. The block orbits under the subgroups of \(G_{57}\) are found by Orb19 PCEnough. This function returns true if at least 10 of the orbits under \(G_{19}\) are parallel classes and the computation goes on only for the designs for which this is true. This way using Corollary 1 we consider a number of designs which is 16 times smaller than the initial one. Since Orb19 PCEnough is very fast, this practically reduces the computation time about 16 times. \begin{table}
\begin{tabular}{c c c c c c c c c c} \hline \hline
**Automorphisms** & **57** & **114** & **171** & **342** & **1026** & **1083** & **6498** & **19,494** & **All** \\ \hline STS(57) & 154,894 & 46 & 1062 & 32 & 2 & 1 & 2 & 1 & 156,040 \\ \hline \hline \end{tabular}
\end{table} 
Table 4: The number of automorphisms of the cyclic \(STS(57)\) with 13 parallel classes that are block orbits under \(G_{19}\). We start constructing \(P_{19}\) by calling PutBlock19 to add the first block of the short block orbit and then P19 Constr. void PCres57(void)  {  for(int i=1; i<=2353310; i++)  {  ReadDes();  if(Orb19 PCEnough()) //true for only 156040 of all 2353310 designs  {  PutBlock19(1,1);  P19 Constr(2);  }  }  } } The function P19 Constr is presented below. It performs exhaustive backtrack search to choose the blocks of \(P_{19}\), \(P_{31}\), \(P_{32}\), and \(P_{33}\). If a block is in \(P_{19}\), all the blocks from its orbit under \(G_{3}\) are in the class too, and no other block from its orbit under \(G_{19}\) is in the class. Two global arrays are used in the function. TakenOrb19 is one-dimensional and TakenOrb19[i] is true if a block from the \(i\)-th orbit under \(G_{19}\) has already been added to \(P_{19}\). Using it we ensure that \(P_{19}\) contains at most one block from each block orbit under \(G_{19}\). The array 019 is two-dimensional and 019[i][j] is the number of the \(j\)-th block from the \(i\)-th orbit under \(G_{19}\). Block190K(j,n) checks if block \(j\) is disjoint with the already chosen \(n-1\) blocks of \(P_{19}\). PutBlock19(j,n) (TakeBlock19(j,n)) adds to (removes from) \(P_{19}\) block \(j\) and the two blocks from its orbit under \(G_{3}\) and makes the corresponding changes in TakenOrb19. Since not only one, but three blocks are added, P19 Constr(n+3) is called next.