' Generates Ultra Magic (Latin Diagonal) Squares Order 17
' Public Area's defined in Module 4
' Routines P01 ... P253 contain the equations describing the correponding pattern and a call to Ctn17 (Count Patterns)
' (not available in HTML)
' Tested with Office 365 under Windows 10
Sub UltraLat17()
Dim a1(289), b(17)
Dim a2(17, 17), b2(17, 17), c2(17, 17)
Dim nTot17(253)
y = MsgBox("Blocked", vbInformation, "UltraLat17")
End
ShtNm2 = "PtrnCnt17" 'Print Quadrant Count
Sheets(ShtNm2).Select
n17 = 1
s17 = 136: k1 = 1: k2 = 1
m1 = 1: m2 = 17: n9 = 0: n10 = 0
For j289 = 11 To 11 ''m1 To m2
a1(289) = j289 - 1
Cells(1, 256).Value = j289
a1(2) = a1(289)
a1(288) = 2 * s17 / 17 - a1(289)
a1(1) = a1(288)
a1(10) = 3 * s17 / 17 - a1(288) - a1(289)
a1(280) = 3 * s17 / 17 - a1(288) - a1(289)
If a1(280) < 0 Or a1(280) > 16 Then GoTo 2890
If a1(280) = a1(288) Or a1(280) = a1(289) Then GoTo 2890
For j287 = m1 To m2
a1(287) = j287 - 1
If a1(287) = a1(280) Or a1(287) = a1(288) Or a1(287) = a1(289) Then GoTo 2870
Cells(1, 257).Value = j287
a1(3) = 2 * s17 / 17 - a1(287)
a1(17) = a1(287)
''y = MsgBox("Test", 0, "Test")
a1(273) = 2 * s17 / 17 - a1(287)
If a1(273) = a1(287) Or a1(273) = a1(280) Or a1(273) = a1(288) Or a1(273) = a1(289) Then GoTo 2870
For j286 = m1 To m2
a1(286) = j286 - 1
If a1(286) = a1(273) Or a1(286) = a1(287) Or a1(286) = a1(280) Or a1(286) = a1(288) Or a1(286) = a1(289) Then GoTo 2860
a1(4) = 2 * s17 / 17 - a1(286)
a1(16) = a1(286)
a1(274) = 2 * s17 / 17 - a1(286)
If a1(274) = a1(286) Or a1(274) = a1(273) Or a1(274) = a1(287) Or a1(274) = a1(280) Or a1(274) = a1(288) Or a1(274) = a1(289) Then GoTo 2860
For j285 = m1 To m2
a1(285) = j285 - 1
If a1(285) = a1(286) Or a1(285) = a1(273) Or a1(285) = a1(287) Or a1(285) = a1(280) Or a1(285) = a1(288) Or a1(285) = a1(289) Then GoTo 2850
If a1(285) = a1(274) Then GoTo 2850
a1(5) = 2 * s17 / 17 - a1(285)
a1(15) = a1(285)
a1(275) = 2 * s17 / 17 - a1(285)
If a1(275) = a1(286) Or a1(275) = a1(273) Or a1(275) = a1(287) Or a1(275) = a1(280) Or a1(275) = a1(288) Or a1(275) = a1(289) Then GoTo 2850
If a1(275) = a1(285) Or a1(275) = a1(274) Then GoTo 2850
For j284 = m1 To m2
a1(284) = j284 - 1
If a1(284) = a1(286) Or a1(284) = a1(273) Or a1(284) = a1(287) Or a1(284) = a1(280) Or a1(284) = a1(288) Or a1(284) = a1(289) Then GoTo 2840
If a1(284) = a1(275) Or a1(284) = a1(285) Or a1(284) = a1(274) Then GoTo 2840
a1(6) = 2 * s17 / 17 - a1(284)
a1(14) = a1(284)
a1(276) = 2 * s17 / 17 - a1(284)
If a1(276) = a1(286) Or a1(276) = a1(273) Or a1(276) = a1(287) Or a1(276) = a1(280) Or a1(276) = a1(288) Or a1(276) = a1(289) Then GoTo 2840
If a1(276) = a1(284) Or a1(276) = a1(275) Or a1(276) = a1(285) Or a1(276) = a1(274) Then GoTo 2840
For j283 = m1 To m2
a1(283) = j283 - 1
If a1(283) = a1(286) Or a1(283) = a1(273) Or a1(283) = a1(287) Or a1(283) = a1(280) Or a1(283) = a1(288) Or a1(283) = a1(289) Then GoTo 2830
If a1(283) = a1(276) Or a1(283) = a1(284) Or a1(283) = a1(275) Or a1(283) = a1(285) Or a1(283) = a1(274) Then GoTo 2830
a1(7) = 2 * s17 / 17 - a1(283)
a1(13) = a1(283)
a1(277) = 2 * s17 / 17 - a1(283)
If a1(277) = a1(286) Or a1(277) = a1(273) Or a1(277) = a1(287) Or a1(277) = a1(280) Or a1(277) = a1(288) Or a1(277) = a1(289) Then GoTo 2830
If a1(277) = a1(283) Or a1(277) = a1(276) Or a1(277) = a1(284) Or a1(277) = a1(275) Or a1(277) = a1(285) Or a1(277) = a1(274) Then GoTo 2830
For j282 = m1 To m2
a1(282) = j282 - 1
If a1(282) = a1(286) Or a1(282) = a1(273) Or a1(282) = a1(287) Or a1(282) = a1(280) Or a1(282) = a1(288) Or a1(282) = a1(289) Then GoTo 2820
If a1(282) = a1(283) Or a1(282) = a1(276) Or a1(282) = a1(284) Or a1(282) = a1(275) Or a1(282) = a1(285) Or a1(282) = a1(274) Then GoTo 2820
If a1(282) = a1(277) Then GoTo 2820
a1(8) = 2 * s17 / 17 - a1(282)
a1(12) = a1(282)
a1(278) = 2 * s17 / 17 - a1(282)
If a1(278) = a1(286) Or a1(278) = a1(273) Or a1(278) = a1(287) Or a1(278) = a1(280) Or a1(278) = a1(288) Or a1(278) = a1(289) Then GoTo 2820
If a1(278) = a1(283) Or a1(278) = a1(276) Or a1(278) = a1(284) Or a1(278) = a1(275) Or a1(278) = a1(285) Or a1(278) = a1(274) Then GoTo 2820
If a1(278) = a1(282) Or a1(278) = a1(277) Then GoTo 2820
For j281 = m1 To m2
a1(281) = j281 - 1
a1(9) = 2 * s17 / 17 - a1(281)
a1(11) = a1(281)
a1(279) = 2 * s17 / 17 - a1(281)
GoSub 900: If fl1 = 0 Then GoTo 2810 'Check Latin Row
GoSub 500 'Complete Latin Square
GoSub 300 'Complete Ultra Magic Square
GoSub 700: 'Check Magic Patterns (General)
GoSub 600: If fl1 = 0 Then GoTo 2810 'Count / Print Paterns
'' n10 = n10 + 1: GoSub 650 'Print Squares
'' n10 = n10 + 1: Cells(1, 1).Value = n10 'Counting
''End
2810 Next j281
2820 Next j282
2830 Next j283
2840 Next j284
2850 Next j285
2860 Next j286
2870
Next j287
2890 Next j289
For i1 = 1 To 98
Cells(i1 + 2, 1).Value = i1
Cells(i1 + 2, 2).Value = nTot17(i1)
Next i1
End
' Calculate and Check Ultra Magic Square
300 fl1 = 1
' Load a2()
i3 = 0
For i1 = 1 To 17
For i2 = 1 To 17
i3 = i3 + 1
a2(i1, i2) = a1(i3)
Next i2
Next i1
' Determine Transposed b2()
For i1 = 1 To 17
For i2 = 1 To 17
b2(i1, i2) = a2(i2, i1)
Next i2
Next i1
' Calculate Ultra Magic Square c2(), a()
i3 = 0
For i1 = 1 To 17
For i2 = 1 To 17
c2(i1, i2) = a2(i1, i2) + 17 * b2(i1, i2) + 1
i3 = i3 + 1: a(i3) = c2(i1, i2)
Next i2
Next i1
' Check Identical Numbers
For i1 = 1 To 289
c20 = a(i1)
For i2 = (1 + i1) To 289
If c20 = a(i2) Then fl1 = 0: Return
Next i2
Next i1
Return
End
' Complete square
500
a1(18) = a1(16): a1(19) = a1(17): a1(20) = a1(1): a1(21) = a1(2): a1(22) = a1(3): a1(23) = a1(4):
a1(24) = a1(5): a1(25) = a1(6): a1(26) = a1(7): a1(27) = a1(8): a1(28) = a1(9): a1(29) = a1(10):
a1(30) = a1(11): a1(31) = a1(12): a1(32) = a1(13): a1(33) = a1(14): a1(34) = a1(15):
a1(35) = a1(33): a1(36) = a1(34): a1(37) = a1(18): a1(38) = a1(19): a1(39) = a1(20): a1(40) = a1(21):
a1(41) = a1(22): a1(42) = a1(23): a1(43) = a1(24): a1(44) = a1(25): a1(45) = a1(26): a1(46) = a1(27):
a1(47) = a1(28): a1(48) = a1(29): a1(49) = a1(30): a1(50) = a1(31): a1(51) = a1(32):
a1(52) = a1(50): a1(53) = a1(51): a1(54) = a1(35): a1(55) = a1(36): a1(56) = a1(37): a1(57) = a1(38):
a1(58) = a1(39): a1(59) = a1(40): a1(60) = a1(41): a1(61) = a1(42): a1(62) = a1(43): a1(63) = a1(44):
a1(64) = a1(45): a1(65) = a1(46): a1(66) = a1(47): a1(67) = a1(48): a1(68) = a1(49):
a1(69) = a1(67): a1(70) = a1(68): a1(71) = a1(52): a1(72) = a1(53): a1(73) = a1(54): a1(74) = a1(55):
a1(75) = a1(56): a1(76) = a1(57): a1(77) = a1(58): a1(78) = a1(59): a1(79) = a1(60): a1(80) = a1(61):
a1(81) = a1(62): a1(82) = a1(63): a1(83) = a1(64): a1(84) = a1(65): a1(85) = a1(66):
a1(86) = a1(84): a1(87) = a1(85): a1(88) = a1(69): a1(89) = a1(70): a1(90) = a1(71): a1(91) = a1(72):
a1(92) = a1(73): a1(93) = a1(74): a1(94) = a1(75): a1(95) = a1(76): a1(96) = a1(77): a1(97) = a1(78):
a1(98) = a1(79): a1(99) = a1(80): a1(100) = a1(81): a1(101) = a1(82): a1(102) = a1(83):
a1(103) = a1(101): a1(104) = a1(102): a1(105) = a1(86): a1(106) = a1(87): a1(107) = a1(88): a1(108) = a1(89):
a1(109) = a1(90): a1(110) = a1(91): a1(111) = a1(92): a1(112) = a1(93): a1(113) = a1(94): a1(114) = a1(95):
a1(115) = a1(96): a1(116) = a1(97): a1(117) = a1(98): a1(118) = a1(99): a1(119) = a1(100):
a1(120) = a1(118): a1(121) = a1(119): a1(122) = a1(103): a1(123) = a1(104): a1(124) = a1(105): a1(125) = a1(106):
a1(126) = a1(107): a1(127) = a1(108): a1(128) = a1(109): a1(129) = a1(110): a1(130) = a1(111): a1(131) = a1(112):
a1(132) = a1(113): a1(133) = a1(114): a1(134) = a1(115): a1(135) = a1(116): a1(136) = a1(117):
a1(137) = a1(135): a1(138) = a1(136): a1(139) = a1(120): a1(140) = a1(121): a1(141) = a1(122): a1(142) = a1(123):
a1(143) = a1(124): a1(144) = a1(125): a1(145) = a1(126): a1(146) = a1(127): a1(147) = a1(128): a1(148) = a1(129):
a1(149) = a1(130): a1(150) = a1(131): a1(151) = a1(132): a1(152) = a1(133): a1(153) = a1(134):
a1(154) = a1(152): a1(155) = a1(153): a1(156) = a1(137): a1(157) = a1(138): a1(158) = a1(139): a1(159) = a1(140):
a1(160) = a1(141): a1(161) = a1(142): a1(162) = a1(143): a1(163) = a1(144): a1(164) = a1(145): a1(165) = a1(146):
a1(166) = a1(147): a1(167) = a1(148): a1(168) = a1(149): a1(169) = a1(150): a1(170) = a1(151):
a1(171) = a1(169): a1(172) = a1(170): a1(173) = a1(154): a1(174) = a1(155): a1(175) = a1(156): a1(176) = a1(157):
a1(177) = a1(158): a1(178) = a1(159): a1(179) = a1(160): a1(180) = a1(161): a1(181) = a1(162): a1(182) = a1(163):
a1(183) = a1(164): a1(184) = a1(165): a1(185) = a1(166): a1(186) = a1(167): a1(187) = a1(168):
a1(188) = a1(186): a1(189) = a1(187): a1(190) = a1(171): a1(191) = a1(172): a1(192) = a1(173): a1(193) = a1(174):
a1(194) = a1(175): a1(195) = a1(176): a1(196) = a1(177): a1(197) = a1(178): a1(198) = a1(179): a1(199) = a1(180):
a1(200) = a1(181): a1(201) = a1(182): a1(202) = a1(183): a1(203) = a1(184): a1(204) = a1(185):
a1(205) = a1(203): a1(206) = a1(204): a1(207) = a1(188): a1(208) = a1(189): a1(209) = a1(190): a1(210) = a1(191):
a1(211) = a1(192): a1(212) = a1(193): a1(213) = a1(194): a1(214) = a1(195): a1(215) = a1(196): a1(216) = a1(197):
a1(217) = a1(198): a1(218) = a1(199): a1(219) = a1(200): a1(220) = a1(201): a1(221) = a1(202):
a1(222) = a1(220): a1(223) = a1(221): a1(224) = a1(205): a1(225) = a1(206): a1(226) = a1(207): a1(227) = a1(208):
a1(228) = a1(209): a1(229) = a1(210): a1(230) = a1(211): a1(231) = a1(212): a1(232) = a1(213): a1(233) = a1(214):
a1(234) = a1(215): a1(235) = a1(216): a1(236) = a1(217): a1(237) = a1(218): a1(238) = a1(219):
a1(239) = a1(237): a1(240) = a1(238): a1(241) = a1(222): a1(242) = a1(223): a1(243) = a1(224): a1(244) = a1(225):
a1(245) = a1(226): a1(246) = a1(227): a1(247) = a1(228): a1(248) = a1(229): a1(249) = a1(230): a1(250) = a1(231):
a1(251) = a1(232): a1(252) = a1(233): a1(253) = a1(234): a1(254) = a1(235): a1(255) = a1(236):
a1(256) = a1(254): a1(257) = a1(255): a1(258) = a1(239): a1(259) = a1(240): a1(260) = a1(241): a1(261) = a1(242):
a1(262) = a1(243): a1(263) = a1(244): a1(264) = a1(245): a1(265) = a1(246): a1(266) = a1(247): a1(267) = a1(248):
a1(268) = a1(249): a1(269) = a1(250): a1(270) = a1(251): a1(271) = a1(252): a1(272) = a1(253):
Return
' Print Patterns
600 nQ4 = 0: fl1 = 1
For i1 = 1 To 253
If nQ(i1) = 4 Then nQ4 = nQ4 + 1
Next i1
If nQ4 = 0 Then Return 'Counting Only
nTot17(nQ4) = nTot17(nQ4) + 1
Return
If nQ4 < n17 Then fl1 = 0: Return
n9 = n9 + 1: n17 = nQ4 + 1
For i1 = 1 To 253
Cells(n9 + 1, i1) = nQ(i1)
Next i1
Cells(n9 + 1, 254).Value = nQ4
Cells(n9 + 1, 255).Value = n9
Cells(n9 + 1, 256).Value = j289
Cells(n9 + 1, 257).Value = j287
Cells(1, 258).Value = n17
Return
' Check Magic Patterns
700 fl1 = 1: Erase nP, nQ, s
P01 1: P02 2: P03 3: P04 4: P05 5: P06 6: P07 7: P08 8: P09 9: P10 10:
P11 11: P12 12: P13 13: P14 14: P15 15: P16 16: P17 17: P18 18: P19 19: P20 20:
P21 21: P22 22: P23 23: P24 24: P25 25: P26 26: P27 27: P28 28: P29 29: P30 30:
P31 31: P32 32: P33 33: P34 34: P35 35: P36 36: P37 37: P38 38: P39 39: P40 40:
P41 41: P42 42: P43 43: P44 44: P45 45: P46 46: P47 47: P48 48: P49 49: P50 50:
P51 51: P52 52: P53 53: P54 54: P55 55: P56 56: P57 57: P58 58: P59 59: P60 60:
P61 61: P62 62: P63 63: P64 64: P65 65: P66 66: P67 67: P68 68: P69 69: P70 70:
P71 71: P72 72: P73 73: P74 74: P75 75: P76 76: P77 77: P78 78: P79 79: P80 80:
P81 81: P82 82: P83 83: P84 84: P85 85: P86 86: P87 87: P88 88: P89 89: P90 90:
P91 91: P92 92: P93 93: P94 94: P95 95: P96 96: P97 97: P98 98: P99 99: P100 100:
P101 101: P102 102: P103 103: P104 104: P105 105: P106 106: P107 107: P108 108: P109 109: P110 110:
P111 111: P112 112: P113 113: P114 114: P115 115: P116 116: P117 117: P118 118: P119 119: P120 120:
P121 121: P122 122: P123 123: P124 124: P125 125: P126 126: P127 127: P128 128: P129 129: P130 130:
P131 131: P132 132: P133 133: P134 134: P135 135: P136 136: P137 137: P138 138: P139 139: P140 140:
P141 141: P142 142: P143 143: P144 144: P145 145: P146 146: P147 147: P148 148: P149 149: P150 150:
P151 151: P152 152: P153 153: P154 154: P155 155: P156 156: P157 157: P158 158: P159 159: P160 160:
P161 161: P162 162: P163 163: P164 164: P165 165: P166 166: P167 167: P168 168: P169 169: P170 170:
P171 171: P172 172: P173 173: P174 174: P175 175: P176 176: P177 177: P178 178: P179 179: P180 180:
P181 181: P182 182: P183 183: P184 184: P185 185: P186 186: P187 187: P188 188: P189 189: P190 190:
P191 191: P192 192: P193 193: P194 194: P195 195: P196 196: P197 197: P198 198: P199 199: P200 200:
P201 201: P202 202: P203 203: P204 204: P205 205: P206 206: P207 207: P208 208: P209 209: P210 210:
P211 211: P212 212: P213 213: P214 214: P215 215: P216 216: P217 217: P218 218: P219 219: P220 220:
P221 221: P222 222: P223 223: P224 224: P225 225: P226 226: P227 227: P228 228: P229 229: P230 230:
P231 231: P232 232: P233 233: P234 234: P235 235: P236 236: P237 237: P238 238: P239 239: P240 240:
P241 241: P242 242: P243 243: P244 244: P245 245: P246 246: P247 247: P248 248: P249 249: P250 250:
P251 251: P252 252: P253 253:
Return
' Exclude solutions with identical numbers in row
900 fl1 = 1
For i1 = 273 To 289
b(i1 - 272) = a1(i1)
Next i1
For j1 = 1 To 17
b20 = b(j1)
For j2 = (1 + j1) To 17
If b20 = b(j2) Then fl1 = 0: Return
Next j2
Next j1
Return
' Print results (squares)
650 n1 = n1 + 1
If n1 = 2 Then
n1 = 1: k1 = k1 + 18: k2 = 1
Else
If n10 > 1 Then k2 = k2 + 18
End If
Sheets("Klad1").Cells(k1, k2 + 1).Font.Color = -4165632
Sheets("Klad1").Cells(k1, k2 + 1).Value = n10
i3 = 0
For i1 = 1 To 17
For i2 = 1 To 17
i3 = i3 + 1
Sheets("Klad1").Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1
Return
End Sub