Product of two magic squares
magic.product.RdGives 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
ais an integer, usemagic(a).- b
as above
- mat
Matrix, of same size as
a, of integers treated as modulo 8. Default value ofNULLequivalent to passinga*0. Each number from 0-7 corresponds to one of the 8 squares which have the same Frenicle's standard form, as generated bytransf(). Then subsquares of the product square (ie tiles of the same size asb) are rotated and transposed appropriately according to their corresponding entry inmat. 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)
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