| is.semimagichypercube {magic} | R Documentation |
Returns TRUE if a hypercube is semimagic, magic, perfect
is.semimagichypercube(a,give.answers=FALSE) is.magichypercube(a,give.answers=FALSE) is.perfect(a)
a |
The hypercube (array) to be tested |
give.answers |
Boolean, with TRUE meaning to also return the sums |
(Although apparently non-standard, here a hypercube is defined to have dimension d and order n—and thus has n^d elements).
A {em semimagic hypercube} has all ``rook's move'' sums equal to the magic
constant (that is, each
sum(a[i_1,i_2,...,i_{r-1},,i_{r+1},...,i_d]) with 1 <= r <= d is
equal to the magic constant for all values of the i's). In
is.semimagichypercube(), if give.answers
is TRUE, the sums returned are in the form of an array of
dimension c(rep(n,d-1),d). The first d-1 dimensions are
the coordinates of the projection of the summed elements onto the surface
hypercube. The last dimension indicates the dimension along which the
sum was taken over.
A {em magic hypercube} is a semimagic hypercube with all
2^(d-1) major (ie extreme point-to-extreme point)
diagonals summing correctly. Note that not all
subhypercubes are necessarily magic! (for example, consider a
5-dimensional magic hypercube a. The square b defined
by a[1,1,1,,] might not be magic: the diagonals of
b are not covered by the definition of a magic hypercube).
Some subhypercubes of a magic hypercube are not even semimagic: see
below for an example.
In is.magichypercube(), if argument give.answers=TRUE
then a list is returned. The first element of this list is Boolean
with TRUE if the array is a magic hypercube. The second
element gives the rook's move sums as
for is.semimagichypercube() and the third element gives an
array of 2^d elements with index 1 meaning the sum is taken
from elements in a with the d-th dimension
running over 1:n (index 2 means run over n:1).
A {em perfect magic hypercube} is a magic hypercube with all nonbroken diagonals summing correctly. This is a bad-ass requirement for high dimensional hypercubes.
Even in three dimensions, being perfect is pretty bad. Consider a
5x5x5 (ie three dimensional), cube. Say
a=magiccube.2np1(2). Then the square defined by
sapply(1:n,function(i){a[,i,6-i]}, simplify=TRUE), which is a
subhypercube of a, is not even semimagic: the
rowsums are incorrect (the colsums must sum correctly because a
is magic). Note that the diagonals of this square are two of the
``extreme point-to-point'' diagonals of a.
A {em pandiagonal magic hypercube} (or sometimes just a {em perfect hypercube}) has sums equal, and all sums of all diagonals, including broken diagonals, are equal. This is one seriously bad-ass requirement. I reckon that is a total of (3^d-1)n^(d-1)/2 correct summations. This is not coded up yet; I can't see how to do it in anything like a vectorized manner.
The terminology in this area is pretty confusing.
Robin K. S. Hankin
http://members.shaw.ca/hdhcubes/cube_perfect.htm#Cubes "Generalized magic cubes", Dana Richards . Mathematics Magazine, volume 53, number 2, March 1980.
is.magic, allsubhypercubes,hendricks
library(abind)
is.semimagichypercube(magiccube.2np1(1))
is.semimagichypercube(magichypercube.4n(1,d=4))
is.perfect(magichypercube.4n(1,d=4))
#Now for a subhypercube of a magic hypercube that is not semimagic:
is.magic(allsubhypercubes(magiccube.2np1(1))[[10]])
data(hendricks)
is.perfect(hendricks)
#note that Hendricks's magic cube also has many broken diagonals summing
#correctly:
a <- allsubhypercubes(hendricks)
ld <- function(a){length(dim(a))}
jj <- unlist(lapply(a,ld))
f <- function(i){is.perfect(a[[which(jj==2)[i]]])}
all(sapply(1:sum(jj==2),f))
#but this is NOT enough to ensure that it is pandiagonal (but I
#think hendricks is pandiagonal).