This chapter describes the function `SemiLatinSquareDuals`

which can
classify semi-Latin squares with certain given properties, and return
a list of their duals as block designs.

Let *n* and *k* be positive integers. An (*n*×*n*)/*k* **semi-Latin
square**
is an *n* by *n* array *A*, whose
entries are *k*-subsets of a *kn*-set *X* (the **symbol-set**), such that
each element of *X* occurs exactly once in each row and exactly once in
each column of *A*. (Thus an (*n*×*n*)/1 semi-Latin square is the same
thing as a Latin square of order *n*.) For extensive useful information on
semi-Latin squares, see http://www.maths.qmul.ac.uk/~rab/sls.html.

A SOMA(*k*,*n*)
is an (*n*×*n*)/*k* semi-Latin square *A*,
with *n* ≥ 2, in which no 2-subset of the symbol-set is contained in
more than one entry of *A*. For extensive useful information on SOMAs,
see http://www.maths.qmul.ac.uk/~lsoicher/soma/.

Let *A* and *B* be (*n*×*n*)/*k* semi-Latin squares. We say that
*B* is **(weakly) isomorphic** to *A* if *B* can be obtained from *A*
by applying one or more of: a row permutation; a column permutation;
transposing; renaming the symbols. If transposing is not allowed then we
get the concept of strong isomorphism. More formally, *B* is **strongly
isomorphic** to *A* if *B* can be obtained from *A* by applying one or
more of: a row permutation; a column permutation; renaming the symbols.

Let *A* be an (*n*×*n*)/*k* semi-Latin square. Then the dual of *A*
can be represented as a binary block design as follows. The point-set of
*D* is taken to be the Cartesian square of {1,…,*n*}, with [*x*,*y*]
representing the [*x*,*y*]-entry of *A*. The blocks of *D* are in one-to-one
correspondance with the symbols of *A*, with the *i*-th block of *D*
consisting of the ordered pairs [*x*,*y*] such that the *i*-th symbol of
*A* is contained in the [*x*,*y*]-entry of *A*. Given *D*, the semi-Latin
square *A* can be recovered, up to the naming of its symbols.

`SemiLatinSquareDuals( `

`, `

` )`

`SemiLatinSquareDuals( `

`, `

`, `

` )`

`SemiLatinSquareDuals( `

`, `

`, `

`, `

` )`

`SemiLatinSquareDuals( `

`, `

`, `

`, `

`, `

` )`

Let `n` and `k` be positive integers. Then this function (which makes
heavy use of the function `BlockDesigns`

) returns a list `DL` of block
designs which are the duals of the (*n* ×*n* )/*k* semi-Latin
squares whose properties are specified by the given parameters, described
below. In practice, depending on the specified properties, this function
can be useful for `n` up to about 6 or 7.

The parameter `maxmult`, if given, must be a positive integer or
the string `"default"`

. If it is a positive integer, then `maxmult`
specifies an upper bound on the multiplicity of each block in each
semi-Latin square dual in `DL`. The default value for `maxmult` (if
omitted or if given as `"default"`

) is `k`, which poses no constraint
on the block multiplicities.

The parameter `blockintsizes`, if given, must be a set of non-negative
integers or the string `"default"`

. If it is given as a set, then
`blockintsizes` specifies, for each semi-Latin square dual in `DL`,
the set of possible sizes for the intersection of a block *B* with a
different block (but possibly a repeat of *B*). The default value for
`blockintsizes` (if omitted or if given as `"default"`

) is `[0..`

`n``]`

,
which poses no constraint on the block intersection sizes. Note that
block intersection sizes in the dual of a semi-Latin square correspond
to concurrencies of points in the semi-Latin square itself. Also note
that if *n* ≥ 2 and `blockintsizes` is specified to be `[0,1]`

then
the (*n*×*n*)/*k* semi-Latin squares being considered are SOMA(*k*,*n*)s.

The parameter `isolevel`, if given, must be 0, 1, 2, 3, 4 or the string
`"default"`

(the default value is 2). The value 0 specifies that `DL`
will contain at most one (semi-Latin square dual given as a) block design,
and will contain one such block design if and only if a semi-Latin square
with the required properties exists. The value 1 specifies that `DL`
will contain a list of duals representing all weak isomorphism classes
of semi-Latin squares with the required properties (possibly with some
classes represented more than once) and the value 2 specifies that `DL`
will contain precisely one dual semi-Latin square representative for
each weak isomorphism class of semi-Latin squares with the required
properties. The values 3 and 4 for `isolevel` play the roles of 1 and 2,
respectively, but with weak isomorphism replaced by strong isomorphism.
Thus, *isolevel* =3 specifies that `DL` will contain a list of duals
representing all strong isomorphism classes of semi-Latin squares with
the required properties (possibly with some classes represented more than
once) and *isolevel* =4 specifies that `DL` will contain precisely one
dual semi-Latin square representative for each strong isomorphism class
of semi-Latin squares with the required properties.

For example, we determine the numbers of weak and strong isomorphism
classes of (4×4)/*k* semi-Latin squares for *k*=1,…,6. (These
numbers disagree with P. E. Chigbu's classification for the cases *k*=3,4
BaCh.)

gap> List([1..6],k->Length(SemiLatinSquareDuals(4,k))); # weak [ 2, 10, 40, 164, 621, 2298 ] gap> List([1..6],k->Length(SemiLatinSquareDuals(4,k,"default","default",4))); # strong [ 2, 11, 46, 201, 829, 3343 ]

Next, we determine one SOMA(3,6).

gap> SemiLatinSquareDuals(6,3,"default",[0,1],0); [ rec( isBlockDesign := true, v := 36, blocks := [ [ 1, 8, 15, 22, 29, 36 ], [ 1, 9, 16, 23, 30, 32 ], [ 1, 12, 14, 21, 28, 35 ], [ 2, 9, 17, 24, 25, 34 ], [ 2, 11, 18, 22, 27, 31 ], [ 2, 12, 16, 19, 29, 33 ], [ 3, 10, 14, 24, 29, 31 ], [ 3, 11, 16, 20, 25, 36 ], [ 3, 12, 13, 23, 26, 34 ], [ 4, 7, 14, 23, 27, 36 ], [ 4, 8, 17, 21, 30, 31 ], [ 4, 9, 18, 19, 26, 35 ], [ 5, 7, 15, 20, 30, 34 ], [ 5, 8, 13, 24, 28, 33 ], [ 5, 10, 18, 21, 25, 32 ], [ 6, 7, 17, 22, 26, 33 ], [ 6, 10, 13, 20, 27, 35 ], [ 6, 11, 15, 19, 28, 32 ] ], tSubsetStructure := rec( t := 1, lambdas := [ 3 ] ), isBinary := true, isSimple := true, blockSizes := [ 6 ], blockNumbers := [ 18 ], r := 3, autSubgroup := <permutation group of size 72 with 3 generators>, pointNames := [ [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ], [ 1, 6 ], [ 2, 1 ], [ 2, 2 ], [ 2, 3 ], [ 2, 4 ], [ 2, 5 ], [ 2, 6 ], [ 3, 1 ], [ 3, 2 ], [ 3, 3 ], [ 3, 4 ], [ 3, 5 ], [ 3, 6 ], [ 4, 1 ], [ 4, 2 ], [ 4, 3 ], [ 4, 4 ], [ 4, 5 ], [ 4, 6 ], [ 5, 1 ], [ 5, 2 ], [ 5, 3 ], [ 5, 4 ], [ 5, 5 ], [ 5, 6 ], [ 6, 1 ], [ 6, 2 ], [ 6, 3 ], [ 6, 4 ], [ 6, 5 ], [ 6, 6 ] ] ) ]

[Up] [Previous] [Next] [Index]

design manual

March 2019