' Generates Ultra Magic (Latin Diagonal) Squares Order 13
' Tested with Office 365 under Windows 10
Sub UltraLat13()
Dim a(169), b(13), c(169)
Dim a2(13, 13), b2(13, 13), c2(13, 13)
y = MsgBox("Blocked", vbInformation, "UltraLat13")
End
Sheets("Klad1").Select
s1 = 78: k1 = 1: k2 = 1
m1 = 1: m2 = 13
For j169 = m1 To m2
a(169) = j169 - 1
a(2) = a(169)
a(168) = 2 * s1 / 13 - a(169)
a(1) = a(168)
a(8) = 3 * s1 / 13 - a(168) - a(169)
a(162) = 3 * s1 / 13 - a(168) - a(169)
If a(162) < 0 Or a(162) > 12 Then GoTo 1690
If a(162) = a(168) Or a(162) = a(169) Then GoTo 1690
For j167 = m1 To m2
a(167) = j167 - 1
If a(167) = a(162) Or a(167) = a(168) Or a(167) = a(169) Then GoTo 1670
a(3) = 2 * s1 / 13 - a(167)
a(13) = a(167)
a(157) = 2 * s1 / 13 - a(167)
If a(157) = a(162) Or a(157) = a(167) Or a(157) = a(168) Or a(157) = a(169) Then GoTo 1670
For j166 = m1 To m2
a(166) = j166 - 1
If a(166) = a(157) Or a(166) = a(162) Or a(166) = a(167) Or a(166) = a(168) Or a(166) = a(169) Then GoTo 1660
a(4) = 2 * s1 / 13 - a(166)
a(12) = a(166)
a(158) = 2 * s1 / 13 - a(166)
If a(158) = a(157) Or a(158) = a(162) Or a(158) = a(166) Or a(158) = a(167) Or a(158) = a(168) Or a(158) = a(169) Then GoTo 1660
For j165 = m1 To m2
a(165) = j165 - 1
If a(165) = a(157) Or a(165) = a(162) Or a(165) = a(166) Or a(165) = a(167) Or a(165) = a(168) Or a(165) = a(169) Then GoTo 1650
If a(165) = a(158) Then GoTo 1650
a(5) = 2 * s1 / 13 - a(165)
a(11) = a(165)
a(159) = 2 * s1 / 13 - a(165)
If a(159) = a(157) Or a(159) = a(162) Or a(159) = a(166) Or a(159) = a(167) Or a(159) = a(168) Or a(159) = a(169) Then GoTo 1650
If a(159) = a(158) Or a(159) = a(165) Then GoTo 1650
For j164 = m1 To m2
a(164) = j164 - 1
If a(164) = a(157) Or a(164) = a(162) Or a(164) = a(166) Or a(164) = a(167) Or a(164) = a(168) Or a(164) = a(169) Then GoTo 1640
If a(164) = a(158) Or a(164) = a(159) Or a(164) = a(165) Then GoTo 1640
a(6) = 2 * s1 / 13 - a(164)
a(10) = a(164)
a(160) = 2 * s1 / 13 - a(164)
If a(160) = a(157) Or a(160) = a(162) Or a(160) = a(166) Or a(160) = a(167) Or a(160) = a(168) Or a(160) = a(169) Then GoTo 1640
If a(160) = a(158) Or a(160) = a(159) Or a(160) = a(164) Or a(160) = a(165) Then GoTo 1640
For j163 = m1 To m2
a(163) = j163 - 1
a(7) = 2 * s1 / 13 - a(163)
a(9) = a(163)
a(161) = 2 * s1 / 13 - a(163)
GoSub 900: If fl1 = 0 Then GoTo 1630 'Check Latin Row
GoSub 500 'Complete Latin Square
GoSub 300: If fl1 = 0 Then GoTo 1630 'Complete Ultra Magic Square
'' n9 = n9 + 1: GoSub 650 'Print Squares
n9 = n9 + 1: Cells(1, 1).Value = n9 'Counting
1630 Next j163
1640 Next j164
1650 Next j165
1660 Next j166
1670 Next j167
1690 Next j169
End
' Complete square
500
a(14) = a(12): a(15) = a(13): a(16) = a(1): a(17) = a(2): a(18) = a(3): a(19) = a(4): a(20) = a(5):
a(21) = a(6): a(22) = a(7): a(23) = a(8): a(24) = a(9): a(25) = a(10): a(26) = a(11):
a(27) = a(25): a(28) = a(26): a(29) = a(14): a(30) = a(15): a(31) = a(16): a(32) = a(17): a(33) = a(18):
a(34) = a(19): a(35) = a(20): a(36) = a(21): a(37) = a(22): a(38) = a(23): a(39) = a(24):
a(40) = a(38): a(41) = a(39): a(42) = a(27): a(43) = a(28): a(44) = a(29): a(45) = a(30): a(46) = a(31):
a(47) = a(32): a(48) = a(33): a(49) = a(34): a(50) = a(35): a(51) = a(36): a(52) = a(37):
a(53) = a(51): a(54) = a(52): a(55) = a(40): a(56) = a(41): a(57) = a(42): a(58) = a(43): a(59) = a(44):
a(60) = a(45): a(61) = a(46): a(62) = a(47): a(63) = a(48): a(64) = a(49): a(65) = a(50):
a(66) = a(64): a(67) = a(65): a(68) = a(53): a(69) = a(54): a(70) = a(55): a(71) = a(56): a(72) = a(57):
a(73) = a(58): a(74) = a(59): a(75) = a(60): a(76) = a(61): a(77) = a(62): a(78) = a(63):
a(79) = a(77): a(80) = a(78): a(81) = a(66): a(82) = a(67): a(83) = a(68): a(84) = a(69): a(85) = a(70):
a(86) = a(71): a(87) = a(72): a(88) = a(73): a(89) = a(74): a(90) = a(75): a(91) = a(76):
a(92) = a(90): a(93) = a(91): a(94) = a(79): a(95) = a(80): a(96) = a(81): a(97) = a(82): a(98) = a(83):
a(99) = a(84): a(100) = a(85): a(101) = a(86): a(102) = a(87): a(103) = a(88): a(104) = a(89):
a(105) = a(103): a(106) = a(104): a(107) = a(92): a(108) = a(93): a(109) = a(94): a(110) = a(95): a(111) = a(96):
a(112) = a(97): a(113) = a(98): a(114) = a(99): a(115) = a(100): a(116) = a(101): a(117) = a(102):
a(118) = a(116): a(119) = a(117): a(120) = a(105): a(121) = a(106): a(122) = a(107): a(123) = a(108): a(124) = a(109):
a(125) = a(110): a(126) = a(111): a(127) = a(112): a(128) = a(113): a(129) = a(114): a(130) = a(115):
a(131) = a(129): a(132) = a(130): a(133) = a(118): a(134) = a(119): a(135) = a(120): a(136) = a(121): a(137) = a(122):
a(138) = a(123): a(139) = a(124): a(140) = a(125): a(141) = a(126): a(142) = a(127): a(143) = a(128):
a(144) = a(142): a(145) = a(143): a(146) = a(131): a(147) = a(132): a(148) = a(133): a(149) = a(134): a(150) = a(135):
a(151) = a(136): a(152) = a(137): a(153) = a(138): a(154) = a(139): a(155) = a(140): a(156) = a(141):
Return
' Calculate and Check Ultra Magic Square
300 fl1 = 1
' Load a2()
i3 = 0
For i1 = 1 To 13
For i2 = 1 To 13
i3 = i3 + 1
a2(i1, i2) = a(i3)
Next i2
Next i1
' Determine Transposed b2()
For i1 = 1 To 13
For i2 = 1 To 13
b2(i1, i2) = a2(i2, i1)
Next i2
Next i1
' Calculate Ultra Magic Square c2(), c()
i3 = 0
For i1 = 1 To 13
For i2 = 1 To 13
c2(i1, i2) = a2(i1, i2) + 13 * b2(i1, i2) + 1
i3 = i3 + 1: c(i3) = c2(i1, i2)
Next i2
Next i1
' Check Identical Numbers
For i1 = 1 To 169
c20 = c(i1)
For i2 = (1 + i1) To 169
If c20 = c(i2) Then fl1 = 0: Return
Next i2
Next i1
Return
' Exclude solutions with identical numbers in row
900 fl1 = 1
For i1 = 157 To 169
b(i1 - 156) = a(i1)
Next i1
For j1 = 1 To 13
b20 = b(j1)
For j2 = (1 + j1) To 13
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 + 14: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 14
End If
Cells(k1, k2 + 1).Select
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = n9
i3 = 0
For i1 = 1 To 13
For i2 = 1 To 13
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = c(i3) ''a(i3)
Next i2
Next i1
Return
End Sub