1. Introduction
Definition 1. A Steiner triple system of order v (STS(v)) is a pair where V is a set of v elements called points and B a family of 3-element subsets (triples) of V called blocks, such that each pair of elements of V is contained in exactly one block of B.
An STS(v) has blocks and each of its points is in blocks. Its incidence matrix has v rows and b columns and the element in the i-th row and j-th column is 1 if point i is in block j, or 0 otherwise. An STS(v) is a 2- block design. That is why we will further talk either of STS(57)s, or of 2- designs. Two STS(v)s are isomorphic if there is a bijection of the point sets such that blocks are mapped to blocks. An automorphism of an STS(v) is an isomorphism to itself. All the automorphisms of an STS(v) form its full automorphism group.
A parallel class of an STS(
v) is a set of
blocks, such that each point is in exactly one block. A resolution of an STS(
v) is a partition of the collection of blocks to parallel classes. Two resolutions
R and
are isomorphic if there exists an automorphism of the underlying STS(
v) which maps each parallel class of
R to a parallel class of
. An automorphism of the resolution
R is an automorphism of the STS(
v) which maps each parallel class of
R to a parallel class of
R. An STS(
v) together with a resolution of its blocks is called a Kirkman triple system (KTS(
v)). For the basic knowledge on STS(
v)s and KTS(
v)s refer, for instance, to [
1,
2]. KTS(
v)s are related to error correcting codes in many different ways [
3]. It is well known that a KTS(
v) is equivalent to an optimal
equidistant code (length
r,
v codewords, distance
, alphabet of
elements) [
4].
An STS(v) is cyclic if it has an automorphism of order v permuting its points in one cycle. A cyclic STS(v) corresponds to a cyclic difference family. A resolution is point-cyclic if it has an automorphism permuting the points in one cycle. An STS(v) is resolvable if it has at least one resolution, and it is cyclically resolvable if at least one of its resolutions is point-cyclic.
Example 1. A cyclic STS(15
) is presented in Figure 1. It is invariant under an automorphism of order 15
which permutes the points in one cycle. It generates a cyclic group of order 15
which partitions the blocks to three orbits, namely one short orbit of length 5
and two full orbits of length 15
. The full automorphism group of this design is of order 20,160
. One of its resolutions is presented in the figure too. It has seven parallel classes, the short block orbit being one of them. This resolution is invariant under an automorphism group of order 168
which is transitive on the parallel classes, but it is not invariant under the cyclic group of order 15
and is therefore not point-cyclic. The incidence matrix of an STS(
v) can be used as a
parity-check matrix of a binary (
)-regular Low-Density Parity-Check (LDPC) code with
v parity-check equations,
b codeword bits, row weight
r and column weight 3 [
5]. If the STS(
v) is cyclic, the parity-check matrix is quasi-cyclic (contains circulant submatrices) and therefore allows linear-complexity encoding with simple feedback shift registers [
6,
7,
8]. KTS(
v)s are useful when the row weight of such an LDPC code has to be reduced by removing some columns of the parity-check matrix in such a way that the same number of ones are cut off from each row (true if one or several parallel classes are removed) to obtain a lower rate code without changing the other code properties [
5,
6,
9,
10]. If the KTS(
v) is point-cyclic, fast encoding might be possible too by using the quasi-cyclic structure of the remaining matrix.
A KTS(
v) exists if and only if
(mod
,
[
11]. KTS(
v)s are classified up to
[
12,
13]. The full classification of KTS(21)s is out of reach now. One of the most recent results on KTS(21)s presents over 13 million KTS(21)s with subsystems STS(7)s and STS(9)s [
14]. Constructions of KTS(
v)s for
have been considered by many authors [
14,
15,
16,
17,
18,
19,
20,
21,
22,
23]. General constructions of point-cyclic KTS(
v)s are considered in [
24,
25] and point-cyclic KTS(
v)s with small parameters have been classified up to
(
Table 1). Before the present work
was the smallest open case. The big number of cyclic STS(
v)s and possible parallel classes make it much more difficult to consider
than any smaller
v. The present paper solves this problem (
Table 1).
A KTS(57) with sub-STS(27) can be obtained from the infinite class of Dukes and Lamken of KTS(
) with sub-STS(
u) [
16]. The existence of a KTS(57) with sub-KTS(15) is proved in [
20]. There are 2,353,310 cyclic STS(57)s [
2,
26]. Using them we construct all point-cyclic KTS(57)s and study their automorphism groups and some important configurations. Our investigation is computer-aided. We use two different construction algorithms implemented respectively by the two authors in C++.
The paper consists of 5 sections. The action of the cyclic automorphism group of order
v on a point-cyclic resolution of an STS(57) is considered in
Section 2 and the construction methods are explained in
Section 3.
Section 4 presents the main results, and a discussion on their impact follows in
Section 5.
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 (
) uses substantially the results from
Section 2.3. We first construct the block orbits under
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
which are parallel classes. By Corollary 1 we further test for cyclic resolvability only the 156,040 designs that have 13 block orbits under
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.
constructs only resolutions with the structure from Theorem 1. We denote by the lexicographically smallest parallel class (base class) from the class orbit of length 19 and by , , and 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 are found by Orb19PCEnough. This function returns true if at least 10 of the orbits under 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 Orb19PCEnough is very fast, this practically reduces the computation time about 16 times. We start constructing by calling PutBlock19 to add the first block of the short block orbit and then P19Constr.
void PCres57(void)
{
for(int i=1; i<=2353310; i++)
{
ReadDes();
if(Orb19PCEnough()) //true for only 156040 of all 2353310 designs
{
PutBlock19(1,1);
P19Constr(2);
}
}
}
The function P19Constr is presented below. It performs exhaustive backtrack search to choose the blocks of , , , and . If a block is in , all the blocks from its orbit under are in the class too, and no other block from its orbit under 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 has already been added to . Using it we ensure that contains at most one block from each block orbit under . The array O19 is two-dimensional and O19[i][j] is the number of the j-th block from the i-th orbit under .
Block19OK(j,n) checks if block j is disjoint with the already chosen blocks of . PutBlock19(j,n) (TakeBlock19(j,n)) adds to (removes from) block j and the two blocks from its orbit under and makes the corresponding changes in TakenOrb19. Since not only one, but three blocks are added, P19Constr(n+3) is called next.
void P19Constr(int n) //choose the n-th block of P19
{
for(int i=1; i<=28; i++)if(!TakenOrb19[i]) //at most 1 block from orbit
{
for(int j=1; j<=19; j++) //19 blocks in an orbit
{
if(Block19OK(O19[i][j],n))
{
PutBlock19(O19[i][j],n);
if(n==17) //P19 is completed
{
//construct classes from class orbits of length 3:
if(OKP19()) if(NewRes(1)) P3Constr(20);
}
else P19Constr(n+3); //choose the n+3rd block of P19
TakeBlock19(O19[i][j],n);
}
}
}
}
If the class is ready after PutBlock19 has added the last three blocks. In this case 19 out of all 28 parallel classes have already been constructed. Then OKP19 checks if the constructed contains exactly 4 blocks from orbits under which are parallel classes. If this is true, NewRes establishes if the current solution for is not equivalent to a previously obtained lexicographically smaller one. If the solution is new, P3Constr(20) is called.
void P3Constr(int nn)
{
int n=nn;
for(int i=1; i<=28; i++) if(!TakenOrb19[i])
{
if(OKOrb19(i,n))
{
PutOrb19(i,n);
n+=3;
}
}
if(n!=28) ErrorStop();
WriteRes();
}
P3Constr chooses the remaining base parallel classes , and (with class orbits of length 3). Each of them contains the blocks of one orbit under . That is why having constructed , the remaining 9 classes of the resolution are defined, i.e. these are the 9 block orbits under which do not have blocks in the constructed . That is why P3Constr uses TakenOrb19 to see which these 9 orbits are, checks once again by OKOrb19 if they are parallel classes and by PutOrb19 adds them to the resolution together with the other two parallel classes of their class orbits and makes changes to TakenOrb19. Finally WriteRes is called to write the resolution in a file. This way the construction of all point-cyclic KTS(57)s is completed in 5 h on a 3.2 GHz Intel-i9 PC.
The second algorithm (
) constructs one by one the 28 parallel classes of the resolution, without taking in account the results from
Section 2.3, but using only the more general fact that a parallel class contains either whole block orbits under
, or whole block orbits under
. The current parallel class is constructed from orbits under one of these subgroups in all possible ways, and all parallel classes from its class orbit are added to the resolution before the construction of the next parallel class starts. In particular, the construction is organized by the function
ResConstr which does not use Corollary 1 to reduce the number of the considered designs. After reading the design, initializing the necessary variables and finding the necessary block orbits, it calls
ChooseBlock to look for possible point-cyclic resolutions.
void ResConstr(void)
{
for(int s=1; s<=2353310; s++)
{
ReadDes();
FindOrbits();
ChooseBlock(1,1,1);
}
}
Two global arrays are used in ChooseBlock. TakenBlock is one-dimensional and TakenBlock[i] is true if block i has already been added to the resolution. The array clLen contains all possible lengths of parallel class orbits, namely and , and .
void ChooseBlock(int n, int cl, int lencl)
{
for(int j=1; j<=532; j++) if (!TakenBlock[j]) //all blocks are 532
{
if(BlockOK(j, n, cl, clLen[lencl]))
{
all=PutBlock(j,n,cl,clLen[lencl]);
if(all==19) if(NewRes(cl))
{
PutClassOrb();
if(cl+clLen[lencl]-1==28) WriteRes(); //all parallel classes are 28
else ChooseBlock(1, cl+clLen[lencl], 1);
TakeClassOrb();
}
else ChooseBlock(all+1, cl, lencl);
TakeBlock(j,n,cl,clLen[lencl]);
}
}
if(n==1) if(lencl<maxlencl) ChooseBlock(1,cl,lencl+1);//next class length
}
ChooseBlock(n,cl,lencl) chooses in all possible ways the n-th block of the -th parallel class with class orbit of length . If and after finishing the search, ChooseBlock(n,cl,lencl+1) is called. BlockOK(j,n,cl,len) checks if block j and the blocks from its orbit under are mutually disjoint among themselves and disjoint with the already chosen blocks of class . PutBlock(j,n,cl,len) (TakeBlock(j,n,cl,len)) adds to (removes from) class block j and the blocks from its orbit under and makes the corresponding changes in TakenBlock. PutBlock returns the number of all the constructed blocks of class and assigns it to the variable all. If not all the blocks are constructed, ChooseBlock is called to choose the st block of the class.
If the class is ready and NewRes checks if this partial solution is not isomorphic to a previously constructed one. If the solution is new, all parallel classes from the class orbit of the last class are added to the solution by PutClassOrb, and ChooseBlock is called to start constructing the next parallel class, or if all parallel classes have been constructed WriteRes is called to write the resolution in a file.
By the algorithm it would take more than a month to complete the job on a PC. That is why we used the high-performance computer Avitohol of the Bulgarian Academy of Sciences (see the acknowledgment), where a parallel implementation of the program ran on 96 cores and completed the job in 12 h.
Advantages and disadvantages of the two algorithms:
Both algorithms are based on exhaustive backtrack search and therefore their complexity is exponential. This is a serious disadvantage which makes backtrack search usable only for classification of combinatorial structures with relatively small parameters. Such an algorithm can be made applicable for definite parameters by the rejection of isomorphic partial solutions of some sizes, and by the implementation of suitable restrictions which are true for the considered objects and parameters.
For the rejection of isomorphic solutions a minimality test is used in both algorithms in the function NewRes. This test is applied to some of the partial solutions and rejects partial solutions for which there exists an automorphism of the considered STS(57) that maps the current partial solution to a lexicographically smaller one. The rejection of partial solutions cuts off big branches of the search tree and makes the computation feasible.
is applied on all the STS(57)s, while considers only those 156,040 designs which remain after using Corollary 1 and is therefore much faster.
tries to construct resolutions of all possible types and structure, not only with the structure from Theorem 1 which is considered by . This makes faster too.
also constructs parallel classes with more than one block which is fixed under . By Theorem 1 there are no such parallel classes in a point-cyclic resolution of an STS(57) and does not construct them. This way saves a lot of time, while obtains a lot of partial solutions which are not extendable to point-cyclic resolutions.
Although is much faster, we implemented the more general algorithm too as a partial check of the correctness of the obtained results, and in particular to check that no solutions were lost by possible errors in the theoretical restrictions, or in the C++ implementations of the algorithms. Each author has implemented in C++ one of the two algorithms. The same results were obtained.
4. Results and Open Problems
We construct all point-cyclic KTS(57)s. The number of automorphisms of the cyclically resolvable STS(57)s and of their resolutions is presented in
Table 5, where the abbreviation
D stands for
designs (STS(57)s),
R for
point-cyclic resolution,
AutD denotes the number of automorphisms of the designs, and
AutR of the resolutions.
It can be seen that less than 7% of all cyclic STS(57)s are cyclically resolvable and most of their resolutions possess no automorphisms except those from the constructive automorphism group . There are 1592 point-cyclic KTS(57)s with a full automorphism group of order 171 and 2 with a full automorphism group of order 513.
Some of the point-cyclic KTS(57)s with a full automorphism group of order 171 have only two parallel class orbits under their full automorphism group (
Table 6). In this case there is an automorphism of order three which maps to one-another the parallel class orbits of length 3 under
, and this way these 9 classes form one class orbit under the full automorphism group of the resolution.
Each cyclically resolvable STS(57) has between 1 and 154 resolutions. The distribution of the number of point-cyclic resolutions of an STS(57) is presented in
Figure 2. The maximal number 154 of point-cyclic KTS(57)s of one cyclic STS(57) is achieved by an STS(57) with a full automorphism group
. There are
STS(57)s with 21 point-cyclic resolutions.
A full
m-configuration in an STS(
v) is a set of
m blocks which cover
points. Each point is in at least two blocks. Full configurations on 4 and 5 blocks are unique and also known as the Pasch and the mitre configurations. The absence of these configurations in a cyclically resolvable cyclic STS(
v) is a desirable property with respect to coding applications [
6,
7,
10,
30].
The minimum distance of an LDPC code is equal to the minimum nonzero number of columns in its parity-check matrix for which a nontrivial linear combination sums to zero (mod 2) [
31]. For an LDPC code from an STS(
v) the minimum distance constructively is settled to at least 4 (each column has weight 3 and two columns share no more than one point). The 4 blocks of a Pasch configuration sum to zero (mod 2), while the 5 blocks of a mitre configuration do not. In
anti-Pasch STS(
v)s no four triples are isomorphic to the Pasch configuration. That is why an LDPC code from an anti-Pasch STS(
v) has minimum distance at least 6 [
5].
In
anti-mitre STS(
v)s no five triples are isomorphic to the mitre configuration. If an STS(
v) is without any Pasch or mitre configuration it is
5-sparse. 5-sparse KTS(
v)s are of major importance not only for the constructions of LDPC codes, but for some other applications in Coding Theory too. One of them is the application of KTS(
v)s to optimal erasure-resilient codes for large disk arrays [
32].
The number of anti-Pasch, anti-mitre and 5-sparse cyclic STS(57)s is presented in [
26]. There are 843 5-sparse cyclic STS(57)s [
26]. We establish that only 63 of them are cyclically resolvable, one of them has 171, one 342 automorphisms and all the remaining 61 cyclically resolvable 5-sparse STS(57)s have 57 automorphisms. The number of the resolutions of 5-sparse cyclic STS(57)s is presented in
Table 7. All these resolutions possess only
.
The classification of the point-cyclic resolutions of STS(63)s is the next open problem, which at the moment is very difficult to attack by our methods because
The nonisomorphic cyclic STS(63)s are 21 times more than the cyclic STS(57)s.
The cyclic group of order 57 has two proper subgroups and a parallel class of a point-cyclic resolution is always fixed by one of the two subgroups, while the cyclic group of order 63 has 4 proper subgroups, and this leads to much more complicated considerations.
The structure of all point-cyclic resolutions of STS(57)s is the same (Theorem 1), while there are several types of point-cyclic resolutions of STS(63)s.
An STS(63) has 1.1 times more points and 1.22 times more blocks than an STS(57). Such a difference in the considered parameters affects several times the speed of an exponential backtrack search algorithm even if it rejects effectively equivalent partial solutions.