Skip to contents

Gives a magic square that is a product of two magic squares.

Usage

magic.product(a, b, mat=NULL)
magic.product.fast(a, b)

Arguments

a

First magic square; if a is an integer, use magic(a).

b

as above

mat

Matrix, of same size as a, of integers treated as modulo 8. Default value of NULL equivalent to passing a*0. Each number from 0-7 corresponds to one of the 8 squares which have the same Frenicle's standard form, as generated by transf(). Then subsquares of the product square (ie tiles of the same size as b) are rotated and transposed appropriately according to their corresponding entry in mat. This is a lot easier to see than to describe (see examples section).

Details

Function magic.product.fast() does not take a mat argument, and is equivalent to magic.product() with mat taking the default value of NULL. The improvement in speed is doubtful unless order(a)\(\gg\)order(b), in which case there appears to be a substantial saving.

References

William H. Benson and Oswald Jacoby. New recreations with magic squares, Dover 1976 (and that paper in JRM)

Author

Robin K. S. Hankin

Examples

magic.product(magic(3),magic(4))
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#>  [1,]   17   28   24   29   97  108  104  109   81    92    88    93
#>  [2,]   31   22   26   19  111  102  106   99   95    86    90    83
#>  [3,]   30   23   27   18  110  103  107   98   94    87    91    82
#>  [4,]   20   25   21   32  100  105  101  112   84    89    85    96
#>  [5,]  129  140  136  141   65   76   72   77    1    12     8    13
#>  [6,]  143  134  138  131   79   70   74   67   15     6    10     3
#>  [7,]  142  135  139  130   78   71   75   66   14     7    11     2
#>  [8,]  132  137  133  144   68   73   69   80    4     9     5    16
#>  [9,]   49   60   56   61   33   44   40   45  113   124   120   125
#> [10,]   63   54   58   51   47   38   42   35  127   118   122   115
#> [11,]   62   55   59   50   46   39   43   34  126   119   123   114
#> [12,]   52   57   53   64   36   41   37   48  116   121   117   128
magic.product(3,4)
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#>  [1,]   17   28   24   29   97  108  104  109   81    92    88    93
#>  [2,]   31   22   26   19  111  102  106   99   95    86    90    83
#>  [3,]   30   23   27   18  110  103  107   98   94    87    91    82
#>  [4,]   20   25   21   32  100  105  101  112   84    89    85    96
#>  [5,]  129  140  136  141   65   76   72   77    1    12     8    13
#>  [6,]  143  134  138  131   79   70   74   67   15     6    10     3
#>  [7,]  142  135  139  130   78   71   75   66   14     7    11     2
#>  [8,]  132  137  133  144   68   73   69   80    4     9     5    16
#>  [9,]   49   60   56   61   33   44   40   45  113   124   120   125
#> [10,]   63   54   58   51   47   38   42   35  127   118   122   115
#> [11,]   62   55   59   50   46   39   43   34  126   119   123   114
#> [12,]   52   57   53   64   36   41   37   48  116   121   117   128

mat <- matrix(0,3,3)
a <- magic.product(3,4,mat=mat)
mat[1,1] <- 1
b <- magic.product(3,4,mat=mat)

a==b
#>        [,1]  [,2]  [,3]  [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#>  [1,]  TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [2,] FALSE  TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [3,] FALSE FALSE  TRUE FALSE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [4,] FALSE FALSE FALSE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [5,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [6,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [7,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [8,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#>  [9,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#> [10,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#> [11,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE
#> [12,]  TRUE  TRUE  TRUE  TRUE TRUE TRUE TRUE TRUE TRUE  TRUE  TRUE  TRUE