Group-Divisible Designs (GDD)¶
This module gathers everything related to Group-Divisible Designs. The
constructions defined here can be accessed through designs.<tab>
:
sage: designs.group_divisible_design(14,{4},{2})
Group Divisible Design on 14 points of type 2^7
>>> from sage.all import *
>>> designs.group_divisible_design(Integer(14),{Integer(4)},{Integer(2)})
Group Divisible Design on 14 points of type 2^7
The main function implemented here is group_divisible_design()
(which
calls all others) and the main class is GroupDivisibleDesign
. The
following functions are available:
Return a \((v,K,G)\)-Group Divisible Design. |
|
Return a \((2q,\{4\},\{2\})\)-GDD for \(q\) a prime power with \(q\equiv 1\pmod{6}\). |
Functions¶
- sage.combinat.designs.group_divisible_designs.GDD_4_2(q, existence=False, check=True)[source]¶
Return a \((2q,\{4\},\{2\})\)-GDD for \(q\) a prime power with \(q\equiv 1\pmod{6}\).
This method implements Lemma VII.5.17 from [BJL99] (p.495).
INPUT:
q
– integerexistence
– boolean; instead of building the design, return:True
– meaning that Sage knows how to build the designUnknown
– meaning that Sage does not know how to build the design, but that the design may exist (seesage.misc.unknown
)False
– meaning that the design does not exist
check
– boolean (default:True
); whether to check that output is correct before returning it. As this is expected to be useless, you may want to disable it whenever you want speed.
EXAMPLES:
sage: from sage.combinat.designs.group_divisible_designs import GDD_4_2 sage: GDD_4_2(7,existence=True) True sage: GDD_4_2(7) Group Divisible Design on 14 points of type 2^7 sage: GDD_4_2(8,existence=True) Unknown sage: GDD_4_2(8) Traceback (most recent call last): ... NotImplementedError
>>> from sage.all import * >>> from sage.combinat.designs.group_divisible_designs import GDD_4_2 >>> GDD_4_2(Integer(7),existence=True) True >>> GDD_4_2(Integer(7)) Group Divisible Design on 14 points of type 2^7 >>> GDD_4_2(Integer(8),existence=True) Unknown >>> GDD_4_2(Integer(8)) Traceback (most recent call last): ... NotImplementedError
- class sage.combinat.designs.group_divisible_designs.GroupDivisibleDesign(points, groups, blocks, G=None, K=None, lambd=1, check=True, copy=True, **kwds)[source]¶
Bases:
IncidenceStructure
Group Divisible Design (GDD).
Let \(K\) and \(G\) be sets of positive integers and let \(\lambda\) be a positive integer. A Group Divisible Design of index \(\lambda\) and order \(v\) is a triple \((V,\mathcal G,\mathcal B)\) where:
\(V\) is a set of cardinality \(v\)
\(\mathcal G\) is a partition of \(V\) into groups whose size belongs to \(G\)
\(\mathcal B\) is a family of subsets of \(V\) whose size belongs to \(K\) such that any two points \(p_1,p_2\in V\) from different groups appear simultaneously in exactly \(\lambda\) elements of \(\mathcal B\). Besides, a group and a block intersect on at most one point.
If \(K=\{k_1,...,k_l\}\) and \(G\) has exactly \(m_i\) groups of cardinality \(k_i\) then \(G\) is said to have type \(k_1^{m_1}...k_l^{m_l}\).
INPUT:
points
– the underlying set. Ifpoints
is an integer \(v\), then the set is considered to be \(\{0, ..., v-1\}\)groups
– the groups of the design. Set toNone
for an automatic guess (this triggerscheck=True
and can thus cost some time)blocks
– collection of blocksG
– list of integers of which the sizes of the groups must be elements. Set toNone
(automatic guess) by defaultK
– list of integers of which the sizes of the blocks must be elements. Set toNone
(automatic guess) by defaultlambd
– integer (default: \(1\)); value of \(\lambda\)check
– boolean (default:True
); whether to check that the design is indeed a \(GDD\) with the right parameterscopy
– (use with caution) if set toFalse
thenblocks
must be a list of lists of integers. The list will not be copied but will be modified in place (each block is sorted, and the whole list is sorted). Yourblocks
object will become the instance’s internal data.
EXAMPLES:
sage: from sage.combinat.designs.group_divisible_designs import GroupDivisibleDesign sage: TD = designs.transversal_design(4,10) sage: groups = [list(range(i*10,(i+1)*10)) for i in range(4)] sage: GDD = GroupDivisibleDesign(40,groups,TD); GDD Group Divisible Design on 40 points of type 10^4
>>> from sage.all import * >>> from sage.combinat.designs.group_divisible_designs import GroupDivisibleDesign >>> TD = designs.transversal_design(Integer(4),Integer(10)) >>> groups = [list(range(i*Integer(10),(i+Integer(1))*Integer(10))) for i in range(Integer(4))] >>> GDD = GroupDivisibleDesign(Integer(40),groups,TD); GDD Group Divisible Design on 40 points of type 10^4
With unspecified groups:
sage: # needs sage.schemes sage: D = designs.transversal_design(4,3).relabel(list('abcdefghiklm'),inplace=False).blocks() sage: GDD = GroupDivisibleDesign('abcdefghiklm',None,D) sage: sorted(GDD.groups()) [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['k', 'l', 'm']]
>>> from sage.all import * >>> # needs sage.schemes >>> D = designs.transversal_design(Integer(4),Integer(3)).relabel(list('abcdefghiklm'),inplace=False).blocks() >>> GDD = GroupDivisibleDesign('abcdefghiklm',None,D) >>> sorted(GDD.groups()) [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['k', 'l', 'm']]
- groups()[source]¶
Return the groups of the Group-Divisible Design.
EXAMPLES:
sage: from sage.combinat.designs.group_divisible_designs import GroupDivisibleDesign sage: TD = designs.transversal_design(4,10) sage: groups = [list(range(i*10,(i+1)*10)) for i in range(4)] sage: GDD = GroupDivisibleDesign(40,groups,TD); GDD Group Divisible Design on 40 points of type 10^4 sage: GDD.groups() [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
>>> from sage.all import * >>> from sage.combinat.designs.group_divisible_designs import GroupDivisibleDesign >>> TD = designs.transversal_design(Integer(4),Integer(10)) >>> groups = [list(range(i*Integer(10),(i+Integer(1))*Integer(10))) for i in range(Integer(4))] >>> GDD = GroupDivisibleDesign(Integer(40),groups,TD); GDD Group Divisible Design on 40 points of type 10^4 >>> GDD.groups() [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
- sage.combinat.designs.group_divisible_designs.group_divisible_design(v, K, G, existence=False, check=False)[source]¶
Return a \((v,K,G)\)-Group Divisible Design.
A \((v,K,G)\)-GDD is a pair \((\mathcal G, \mathcal B)\) where:
\(\mathcal G\) is a partition of \(X=\bigcup \mathcal G\) where \(|X|=v\)
\(\forall S\in \mathcal G, |S| \in G\)
\(\forall S\in \mathcal B, |S| \in K\)
\(\mathcal G\cup \mathcal B\) is a \((v,K\cup G)\)-PBD
For more information, see the documentation of
GroupDivisibleDesign
orPairwiseBalancedDesign
.INPUT:
v
– integerK
,G
– sets of integersexistence
– boolean; instead of building the design, return:True
– meaning that Sage knows how to build the designUnknown
– meaning that Sage does not know how to build the design, but that the design may exist (seesage.misc.unknown
)False
– meaning that the design does not exist
check
– boolean (default:True
); whether to check that output is correct before returning it. As this is expected to be useless, you may want to disable it whenever you want speed.
Note
The GDD returned by this function are defined on
range(v)
, and its groups are sets of consecutive integers.EXAMPLES:
sage: designs.group_divisible_design(14,{4},{2}) Group Divisible Design on 14 points of type 2^7
>>> from sage.all import * >>> designs.group_divisible_design(Integer(14),{Integer(4)},{Integer(2)}) Group Divisible Design on 14 points of type 2^7