Nested resolvable designs and associated uniform designs: the 2013 paper, reproduced and generalised

knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(PGM2)

This vignette reproduces, with the current version of PGM2, all the worked examples, and the first-generation rows of both parameter tables, of the paper that the package implements [@boudraa2013]:

A. Boudraa, Z. Gheribi-Aoulmi and M. Laib (2013). Recursive method for construction of resolvable nested designs and uniform designs associated. International Journal of Research and Reviews in Applied Sciences, 17(2), 167--176.

The paper states its theory for a projective geometry $PG(m, p)$ over a Galois field $GF(p)$ of any prime order $p$, but versions $\le$ 1.2 of the package implemented only $p = 2$. Version 2.0 implements the general prime case, so rows of both Table 1 ($p = 2$) and Table 2 ($p = 3$) of the paper can be regenerated by the package; the first-generation rows of each are reproduced at the end of this vignette.

The construction in brief

A balanced incomplete block design ($BIB$) with parameters $(v, b, r, k, \lambda)$ arranges $v$ treatments into $b$ blocks of size $k < v$ so that every treatment occurs in $r$ blocks and every pair of treatments concurs in $\lambda$ blocks. The method of the paper identifies treatments with the points of $PG(m, p)$ and blocks with its hyperplanes [@dugue1958], and then recurses:

  1. Stage 1 — the hyperplanes of $PG(m,p)$ form a symmetric $BIB$ of the first generation (BIB).
  2. Next generations — deleting a block (a sub-variety $V(i_1)$) and intersecting it with the remaining blocks yields the $BIB$ of $PG(m-1, p)$, the second generation (Gen), and so on recursively.
  3. Resolvable designs — deleting a block together with its treatments leaves a resolvable $BIB$ (Resolvable): its blocks partition into $r$ parallel classes of $p$ blocks each (this is the design of the affine geometry $AG(m,p)$ [@bose1942]).
  4. Uniform designs — each resolvable design is converted into a symmetric uniform design $U(p^m, p^{r})$ by the correspondence of @fang2003 [see also @fang2004]: parallel classes become factors and block membership within a class gives the level (Uniform).

The driver Steps runs the whole recursion and returns the designs of all stages.

Example 1 of the paper: $PG(3,2)$

Step 1 gives the first-generation $BIB$ with parameters $v_1 = b_1 = 15$, $r_1 = k_1 = 7$, $\lambda_1 = 3$; step 2 gives second-generation designs with parameters $(7, 3, 1)$:

X <- BIB(3)
c(V = X$V, B = X$B, R = X$R, K = X$K, Lambda = X$Lambda)

X2 <- Gen(1, X$BIB)
c(V = X2$V, B = X2$B, R = X2$R, K = X2$K)

Example 2 of the paper: the chain $BIB \to RBIB \to UD$

The paper's Example 2 (its pages 174--175) builds, from $PG(3,2)$, the $BIB(15, 7, 3)$, extracts the $RBIB(8, 14, 7, 4, 3)$ and converts it into the uniform design $U(8, 2^7)$:

bib <- BIB(3)$BIB
bib

resolvable <- Resolvable(1, bib)
resolvable$RBIB

Uniform(resolvable$RBIB)$UD

The matrices above coincide (up to the point numbering, which version 2.0 keeps identical to versions $\le$ 1.2 for $p = 2$) with the listings printed in the paper.

Example 3 of the paper: a more economic resolvable design

The paper's Example 3 unites the second-generation designs of $PG(3,2)$ obtained by deleting each block in turn, removes the treatments of a chosen first-generation block, and converts the result — an $RBIB(8, 28, 7, 2, 1)$ — into the uniform design $U(8, (2^2)^7)$ with four-level factors:

bib <- BIB(3)$BIB
mat <- NULL
for (i in 1:15) mat[[i]] <- Gen(i, bib)$BIB2
x <- Reduce("rbind", mat)
e <- dim(x)[1]; b <- dim(x)[2]
v <- bib[1, ]
for (i in 1:e) for (j in 1:b) if (any(x[i, j] == v)) x[i, j] <- 0
for (i in e:1) if (all(x[i, ] == 0)) x <- x[-i, ]
s <- x[1, ]; s <- s[s > 0]
x1 <- matrix(nrow = dim(x)[1], ncol = length(s))
for (i in 1:dim(x)[1]) x1[i, ] <- x[i, ][x[i, ] > 0]
A <- unique(x1)
A

ud <- Uniform(A)
ud$UD

All stages at once: Steps

s <- Steps(4, 1)
names(s)
sapply(s$UDs, function(u) c(runs = u$n, factors = u$F))

Reproducing Table 1 ($p = 2$) and Table 2 ($p = 3$) of the paper

The helper below extracts, for each geometry $PG(m,p)$, the parameters of the first-generation $BIB$, of the $RBIB$ and of the associated uniform design — the first three rows of each table of the paper:

table_rows <- function(p, ms) {
  out <- NULL
  for (m in ms) {
    X <- BIB(m, p)
    Y <- Resolvable(1, X$BIB)
    U <- Uniform(Y$RBIB)
    out <- rbind(out, data.frame(
      geometry = sprintf("PG(%d,%d)", m, p),
      BIB = sprintf("(%d, %d, %d)", X$V, X$K, X$Lambda),
      RBIB = sprintf("(%d, %d, %d, %d, %d)", Y$V, Y$B, Y$R, Y$K, X$Lambda),
      UD = sprintf("U(%d, %d^%d)", U$n, p, U$F)))
  }
  out
}

knitr::kable(table_rows(2, 2:4), caption = "Paper, Table 1 (p = 2)")
knitr::kable(table_rows(3, 2:4), caption = "Paper, Table 2 (p = 3)")

Both agree with the published tables: for $p=2$ the designs $BIB(7,3,1)$, $BIB(15,7,3)$, $BIB(31,15,7)$ with resolvable designs $(4,6,3,2,1)$, $(8,14,7,4,3)$, $(16,30,15,8,7)$; for $p=3$ the designs $BIB(13,4,1)$, $BIB(40,13,4)$, $BIB(121,40,13)$ with resolvable designs $(9,12,4,3,1)$, $(27,39,13,9,4)$, $(81,120,40,27,13)$.

The reduced designs $Q^*_n$ directly: Qn

The manual juxtaposition of Example 3 is automated by Qn(m, n, p), which builds the reduced resolvable design $Q^_n$ and its uniform design $U(p^m, (p^n)^{r})$ for any stage. Its parameters match the paper's tables, e.g. $Q^_2(16, 140, 35, 4, 7)$ for $PG(4,2)$:

Q <- Qn(4, 2)
c(V = Q$V, B = Q$B, R = Q$R, K = Q$K, Lambda = Q$Lambda)

identical(dim(Qn(3, 2)$UD), dim(ud$UD))  # the design of Example 3

Any two distinct runs of a Qn design coincide in exactly Lambda factors (the designs are equidistant), so every stage attains the discrete-discrepancy lower bound of Fang et al. (2004). Successive stages are linked by a many-to-many subspace-incidence refinement relation: whenever $W' \subset W$, the level partition of $W'$ refines that of $W$. This does not make the full arrays nested designs in the usual run-subset or columnwise sense.

Beyond the paper: any prime order

Nothing restricts the recursion to the orders tabulated in the paper — any prime works:

Z <- BIB(2, p = 5)          # BIB(31, 6, 1): the projective plane of order 5
W <- Resolvable(1, Z$BIB)   # RBIB(25, 30, 6, 5, 1): AG(2, 5)
Uniform(W$RBIB)$UD          # U(25, 5^6)

References



Try the PGM2 package in your browser

Any scripts or data that you put into this service are public.

PGM2 documentation built on Aug. 27, 2026, 9:07 a.m.