This chapter describes the function PartitionsIntoBlockDesigns
which can
classify partitions of (the block multiset of) a given block design into
(the block multisets of) block designs having user-specified properties.
We also describe MakeResolutionsComponent
which is useful for the
special case when the desired partitions are resolutions.
PartitionsIntoBlockDesigns(
param )
Let D equal param
.blockDesign
. This function returns a list PL
of partitions of (the block multiset of) D. Each element of PL is a
record with one component partition
, and, in most cases, a component
autGroup
. The partition
component gives a list P of block designs,
all with the same point set as D, such that the list of (the block
multisets of) the designs in P
.partition
forms a partition of (the
block multiset of) D. The component P
.autGroup
, if bound, gives
the automorphism group of the partition, which is the stabilizer of the
partition in the automorphism group of D. The precise interpretation
of the output depends on param, described below.
The required components of param are blockDesign
, v
, blockSizes
,
and tSubsetStructure
.
param
.blockDesign
is the block design to be partitioned.
param
.v
must be a positive integer, and specifies that for each block
design in each partition in PL, the points are 1,...,param
.v
.
It is required that param
.v
be equal to param
.blockDesign.v
.
param
.blockSizes
must be a set of positive integers, and specifies
that the block sizes of each block design in each partition in PL
will be contained in param
.blockSizes
.
param
.tSubsetStructure
must be a record, having
components t
, partition
, and lambdas
. Let t be
equal to param
.tSubsetStructure.t
, partition be
param
.tSubsetStructure.partition
, and lambdas be
param
.tSubsetStructure.lambdas
. Then t must be a non-negative
integer, partition must be a list of non-empty sets of t-subsets of
[1..
param.v]
, forming an ordered partition of all the t-subsets of
[1..
param.v]
, and lambdas must be a list of distinct non-negative
integers (not all zero) of the same length as partition. This specifies
that for each design in each partition in PL, each t-subset in
partition
[
i]
will occur exactly lambdas
[
i]
times, counted
over all blocks of the design. For binary designs, this means that each
t-subset in partition
[
i]
is contained in exactly lambdas
[
i]
blocks. The partition
component is optional if lambdas has length 1.
We require that t is less than or equal to each element of
param
.blockSizes
, and that each block of param
.blockDesign
contains at least t distinct elements.
The optional components of param are used to specify additional
constraints on the partitions in PL, or to change default parameter
values. These optional components are r
, b
, blockNumbers
,
blockIntersectionNumbers
, blockMaxMultiplicities
, isoGroup
,
requiredAutSubgroup
, and isoLevel
. Note that the last three of these
optional components refer to the partitions and not to the block designs
in a partition.
param
.r
must be a positive integer, and specifies that in each design
in each partition in PL, each point must occur exactly param
.r
times in the list of blocks.
param
.b
must be a positive integer, and specifies that each design
in each partition in PL has exactly param
.b
blocks.
param
.blockNumbers
must be a list of non-negative integers, the i-th
element of which specifies the number of blocks whose size is equal to
param
.blockSizes[
i]
(in each design in each partition in PL). The
length of param
.blockNumbers
must equal that of param
.blockSizes
,
and at least one entry of param
.blockNumbers
must be positive.
param
.blockIntersectionNumbers
must be a symmetric matrix of sets
of non-negative integers, the [
i][
j]
-element of which specifies
the set of possible sizes for the intersection of a block B of size
param
.blockSizes[
i]
with a different block (but possibly a repeat of
B) of size param
.blockSizes[
j]
(in each design in each partition
in PL). In the case of multisets, we take the multiplicity of an
element in the intersection to be the minimum of its multiplicities in
the multisets being intersected; for example, the intersection of
[1,1,1,2,2,3]
with [1,1,2,2,2,4]
is [1,1,2,2]
, having size 4.
The dimension of param
.blockIntersectionNumbers
must equal the length
of param
.blockSizes
.
param
.blockMaxMultiplicities
must be a list of non-negative
integers, the i-th element of which specifies an upper bound on the
multiplicity of a block whose size is equal to param
.blockSizes[
i]
(for each design in each partition in PL). The length of
param
.blockMaxMultiplicities
must equal that of param
.blockSizes
.
param
.isoGroup
must be a subgroup of the automorphism group of
param
.blockDesign
. We consider two elements of PL to be
equivalent if they are in the same orbit of param
.isoGroup
(in its action on multisets of block multisets). The default for
param
.isoGroup
is the automorphism group of param
.blockDesign
.
param
.requiredAutSubgroup
must be a subgroup of param
.isoGroup
,
and specifies that each partition in PL must be invariant under
param
.requiredAutSubgroup
(in its action on multisets of block
multisets). The default for param
.requiredAutSubgroup
is the trivial
permutation group.
param
.isoLevel
must be 0, 1, or 2 (the default is 2). The value 0
specifies that PL will contain at most one partition, and will contain
one partition with the required properties if and only if such a partition
exists; the value 1 specifies that PL will contain (perhaps properly)
a list of param
.isoGroup
orbit-representatives of the required
partitions; the value 2 specifies that PL will consist precisely of
param
.isoGroup
-orbit representatives of the required partitions.
For an example, we first classify up to isomorphism the 2-(15,3,1)
designs invariant under a semi-regular group of automorphisms of order 5,
and then use PartitionsIntoBlockDesigns
to classify all the resolutions
of these designs, up to the actions of the respective automorphism groups
of the designs.
gap> DL:=BlockDesigns(rec( > v:=15,blockSizes:=[3], > tSubsetStructure:=rec(t:=2,lambdas:=[1]), > requiredAutSubgroup:= > Group((1,2,3,4,5)(6,7,8,9,10)(11,12,13,14,15))));; gap> List(DL,D->Size(AutGroupBlockDesign(D))); [ 20160, 5, 60 ] gap> PL:=PartitionsIntoBlockDesigns(rec( > blockDesign:=DL[1], > v:=15,blockSizes:=[3], > tSubsetStructure:=rec(t:=1,lambdas:=[1]))); [ rec( partition := [ rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 2, 6 ], [ 3, 4, 8 ], [ 5, 7, 14 ], [ 9, 12, 15 ], [ 10, 11, 13 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 3, 11 ], [ 2, 4, 12 ], [ 5, 6, 8 ], [ 7, 13, 15 ], [ 9, 10, 14 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 4, 14 ], [ 2, 5, 15 ], [ 3, 10, 12 ], [ 6, 7, 11 ], [ 8, 9, 13 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 5, 10 ], [ 2, 9, 11 ], [ 3, 14, 15 ], [ 4, 6, 13 ], [ 7, 8, 12 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 7, 9 ], [ 2, 8, 10 ], [ 3, 5, 13 ], [ 4, 11, 15 ], [ 6, 12, 14 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 8, 15 ], [ 2, 13, 14 ], [ 3, 6, 9 ], [ 4, 7, 10 ], [ 5, 11, 12 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 12, 13 ], [ 2, 3, 7 ], [ 4, 5, 9 ], [ 6, 10, 15 ], [ 8, 11, 14 ] ] ) ], autGroup := Group([ (1,10)(2,11)(3,8)(6,13)(7,14)(12,15), (1,13)(2,11)(3,14)(4,5)(6,10)(7,8), (1,13,7)(2,11,5)(6,10,14)(9,12,15), (2,11,5,15,4,9,12)(3,10,8,14,7,13,6) ]) ), rec( partition := [ rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 2, 6 ], [ 3, 4, 8 ], [ 5, 7, 14 ], [ 9, 12, 15 ], [ 10, 11, 13 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 3, 11 ], [ 2, 4, 12 ], [ 5, 6, 8 ], [ 7, 13, 15 ], [ 9, 10, 14 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 4, 14 ], [ 2, 5, 15 ], [ 3, 10, 12 ], [ 6, 7, 11 ], [ 8, 9, 13 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 5, 10 ], [ 2, 13, 14 ], [ 3, 6, 9 ], [ 4, 11, 15 ], [ 7, 8, 12 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 7, 9 ], [ 2, 8, 10 ], [ 3, 14, 15 ], [ 4, 6, 13 ], [ 5, 11, 12 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 8, 15 ], [ 2, 9, 11 ], [ 3, 5, 13 ], [ 4, 7, 10 ], [ 6, 12, 14 ] ] ), rec( isBlockDesign := true, v := 15, blocks := [ [ 1, 12, 13 ], [ 2, 3, 7 ], [ 4, 5, 9 ], [ 6, 10, 15 ], [ 8, 11, 14 ] ] ) ], autGroup := Group([ (1,15)(2,9)(3,4)(5,7)(6,12)(10,13), (1,12)(2,9)(3,5)(4,7)(6,15)(8,14), (1,14)(2,5)(3,8)(6,7)(9,12)(10,13), (1,8,10)(2,5,15)(3,14,13)(4,9,12) ]) ) ] gap> List(PL,resolution->Size(resolution.autGroup)); [ 168, 168 ] gap> PL:=PartitionsIntoBlockDesigns(rec( > blockDesign:=DL[2], > v:=15,blockSizes:=[3], > tSubsetStructure:=rec(t:=1,lambdas:=[1]))); [ ] gap> PL:=PartitionsIntoBlockDesigns(rec( > blockDesign:=DL[3], > v:=15,blockSizes:=[3], > tSubsetStructure:=rec(t:=1,lambdas:=[1]))); [ ]
MakeResolutionsComponent(
D )
MakeResolutionsComponent(
D,
isolevel )
This function computes resolutions of the block design D, and stores
the result in D
.resolutions
. If D
.resolutions
already exists
then it is ignored and overwritten. This function returns no value.
A resolution of a block design D is a partition of the blocks into subsets, each of which forms a partition of the point set. We say that two resolutions R and S of D are isomorphic if there is an element g in the automorphism group of D, such that the g-image of R is S. (Isomorphism defines an equivalence relation on the set of resolutions of D.)
The parameter isolevel (default 2) determines how many resolutions are computed: isolevel=2 means to classify up to isomorphism, isolevel=1 means to determine at least one representative from each isomorphism class, and isolevel=0 means to determine whether or not D has a resolution.
When this function is finished, D
.resolutions
will have the following
three components:
list
: a list of distinct partitions into block designs forming resolutions
of D;
pairwiseNonisomorphic
: true
, false
or "unknown"
, depending on the
resolutions in list
and what is known. If isolevel=0 or isolevel=2
then this component will be true
;
allClassesRepresented
: true
, false
or "unknown"
, depending on the
resolutions in list
and what is known. If isolevel=1 or isolevel=2
then this component will be true
.
Note that D
.resolutions
may be changed to contain more information
as a side-effect of other functions in the DESIGN package.
gap> L:=BlockDesigns(rec(v:=9,blockSizes:=[3], > tSubsetStructure:=rec(t:=2,lambdas:=[1])));; gap> D:=L[1];; gap> MakeResolutionsComponent(D); gap> D; rec( isBlockDesign := true, v := 9, blocks := [ [ 1, 2, 3 ], [ 1, 4, 5 ], [ 1, 6, 7 ], [ 1, 8, 9 ], [ 2, 4, 6 ], [ 2, 5, 8 ], [ 2, 7, 9 ], [ 3, 4, 9 ], [ 3, 5, 7 ], [ 3, 6, 8 ], [ 4, 7, 8 ], [ 5, 6, 9 ] ], tSubsetStructure := rec( t := 2, lambdas := [ 1 ] ), isBinary := true, isSimple := true, blockSizes := [ 3 ], blockNumbers := [ 12 ], r := 4, autGroup := Group([ (1,2)(5,6)(7,8), (1,3,2)(4,8,7)(5,6,9), (1,2)(4,7)(5,9), (1,2)(4,9)(5,7)(6,8), (1,4,8,6,9,2)(3,5,7) ]), resolutions := rec( list := [ rec( partition := [ rec( isBlockDesign := true, v := 9, blocks := [ [ 1, 2, 3 ], [ 4, 7, 8 ], [ 5, 6, 9 ] ] ), rec( isBlockDesign := true, v := 9, blocks := [ [ 1, 4, 5 ], [ 2, 7, 9 ], [ 3, 6, 8 ] ] ), rec( isBlockDesign := true, v := 9, blocks := [ [ 1, 6, 7 ], [ 2, 5, 8 ], [ 3, 4, 9 ] ] ), rec( isBlockDesign := true, v := 9, blocks := [ [ 1, 8, 9 ], [ 2, 4, 6 ], [ 3, 5, 7 ] ] ) ], autGroup := Group( [ (2,3)(4,5)(6,7)(8,9), (1,3,2)(4,8,7)(5,6,9), (1,8,9)(2,4,6)(3,7,5), (1,2)(5,6)(7,8), (1,2)(4,7)(5,9), (1,2,9,6,8,4)(3,7,5) ]) ) ], pairwiseNonisomorphic := true, allClassesRepresented := true ) )
[Up] [Previous] [Next] [Index]
design manual