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).