' Generates Self Orthogonal Latin (Diagonal) Squares of order 7
' Pan Magic, Integers 0 thru 6
' Tested with Office 365 under Windows 11
Sub SelfOrth7b()
Dim a(49), b(49), s(24)
Dim a2(49), b2(49), c(49)
Dim a0(7, 7)
y = MsgBox("Locked", vbCritical, "Routine SelfOrth7b")
End
n2 = 0: n9 = 0: k1 = 1: k2 = 1
m1 = 1: m2 = 7: s1 = 21: s2 = 6
' Generate data
Sheets("Klad1").Select
t1 = Timer
For j49 = m1 To m2 'a(49)
a(49) = j49 - 1
For j48 = m1 To m2 'a(48)
a(48) = j48 - 1
If a(48) = a(49) Then GoTo 480
For j47 = m1 To m2 'a(47)
a(47) = j47 - 1
If a(47) = a(48) Or a(47) = a(49) Then GoTo 470
For j46 = m1 To m2 'a(46)
a(46) = j46 - 1
If a(46) = a(47) Or a(46) = a(48) Or a(46) = a(49) Then GoTo 460
For j45 = m1 To m2 'a(45)
a(45) = j45 - 1
If a(45) = a(46) Or a(45) = a(47) Or a(45) = a(48) Or a(45) = a(49) Then GoTo 450
For j44 = m1 To m2 'a(44)
a(44) = j44 - 1
If a(44) = a(45) Or a(44) = a(46) Or a(44) = a(47) Or a(44) = a(48) Or a(44) = a(49) Then GoTo 440
a(43) = s1 - a(44) - a(45) - a(46) - a(47) - a(48) - a(49)
If a(43) < 0 Or a(43) > 6 Then GoTo 440
For j42 = m1 To m2 'a(42)
a(42) = j42 - 1
If a(42) = a(49) Then GoTo 420
If a(42) = a(48) Or a(42) = a(43) Then GoTo 420
For j41 = m1 To m2 'a(41)
a(41) = j41 - 1
If a(41) = a(42) Then GoTo 410
If a(41) = a(48) Then GoTo 410
If a(41) = a(49) Then GoTo 410
If a(41) = a(49) Or a(41) = a(47) Then GoTo 410
For j40 = m1 To m2 'a(40)
a(40) = j40 - 1
If a(40) = a(41) Or a(40) = a(42) Then GoTo 400
If a(40) = a(47) Then GoTo 400
If a(40) = a(48) Or a(40) = a(46) Then GoTo 400
For j39 = m1 To m2 'a(39)
a(39) = j39 - 1
If a(39) = a(40) Or a(39) = a(41) Or a(39) = a(42) Then GoTo 390
If a(39) = a(46) Then GoTo 390
If a(39) = a(47) Or a(39) = a(45) Then GoTo 390
For j38 = m1 To m2 'a(38)
a(38) = j38 - 1
If a(38) = a(39) Or a(38) = a(40) Or a(38) = a(41) Or a(38) = a(42) Then GoTo 380
If a(38) = a(45) Then GoTo 380
If a(38) = a(46) Or a(38) = a(44) Then GoTo 380
For j37 = m1 To m2 'a(37)
a(37) = j37 - 1
If a(37) = a(38) Or a(37) = a(39) Or a(37) = a(40) Or a(37) = a(41) Or a(37) = a(42) Then GoTo 370
If a(37) = a(44) Or a(37) = a(43) Then GoTo 370
If a(37) = a(45) Or a(37) = a(43) Then GoTo 370
a(36) = s1 - a(37) - a(38) - a(39) - a(40) - a(41) - a(42)
If a(36) < 0 Or a(36) > 6 Then GoTo 370
If a(36) = a(43) Then GoTo 370
If a(36) = a(44) Or a(36) = a(49) Then GoTo 370
For j35 = m1 To m2 'a(35)
a(35) = j35 - 1
If a(35) = a(49) Or a(35) = a(42) Then GoTo 350
If a(35) = a(41) Or a(35) = a(47) Or a(35) = a(36) Or a(35) = a(44) Then GoTo 350
For j34 = m1 To m2 'a(34)
a(34) = j34 - 1
If a(34) = a(35) Then GoTo 340
If a(34) = a(48) Or a(34) = a(41) Then GoTo 340
If a(34) = a(40) Or a(34) = a(46) Or a(34) = a(42) Or a(34) = a(43) Then GoTo 340
For j33 = m1 To m2 'a(33)
a(33) = j33 - 1
If a(33) = a(34) Or a(33) = a(35) Then GoTo 330
If a(33) = a(47) Or a(33) = a(40) Then GoTo 330
If a(33) = a(49) Or a(33) = a(41) Then GoTo 330
If a(33) = a(39) Or a(33) = a(45) Or a(33) = a(41) Or a(33) = a(49) Then GoTo 330
For j32 = m1 To m2 'a(32)
a(32) = j32 - 1
If a(32) = a(33) Or a(32) = a(34) Or a(32) = a(35) Then GoTo 320
If a(32) = a(46) Or a(32) = a(39) Then GoTo 320
If a(32) = a(38) Or a(32) = a(44) Or a(32) = a(40) Or a(32) = a(48) Then GoTo 320
For j31 = m1 To m2 'a(31)
a(31) = j31 - 1
If a(31) = a(32) Or a(31) = a(33) Or a(31) = a(34) Or a(31) = a(35) Then GoTo 310
If a(31) = a(45) Or a(31) = a(38) Then GoTo 310
If a(31) = a(43) Or a(31) = a(37) Then GoTo 310
If a(31) = a(37) Or a(31) = a(43) Or a(31) = a(39) Or a(31) = a(47) Then GoTo 310
For j30 = m1 To m2 'a(30)
a(30) = j30 - 1
If a(30) = a(31) Or a(30) = a(32) Or a(30) = a(33) Or a(30) = a(34) Or a(30) = a(35) Then GoTo 300
If a(30) = a(44) Or a(30) = a(37) Then GoTo 300
If a(30) = a(36) Or a(30) = a(49) Or a(30) = a(38) Or a(30) = a(46) Then GoTo 300
a(29) = s1 - a(30) - a(31) - a(32) - a(33) - a(34) - a(35)
If a(29) < 0 Or a(29) > 6 Then GoTo 300
If a(29) = a(43) Or a(29) = a(36) Then GoTo 300
If a(29) = a(42) Or a(29) = a(48) Or a(29) = a(37) Or a(29) = a(45) Then GoTo 300
For j28 = m1 To m2 'a(28)
a(28) = j28 - 1
If a(28) = a(49) Or a(28) = a(42) Or a(28) = a(35) Then GoTo 280
For j27 = m1 To m2 'a(27)
a(27) = j27 - 1
If a(27) = a(48) Or a(27) = a(41) Or a(27) = a(34) Then GoTo 270
If a(27) = a(28) Then GoTo 270
For j26 = m1 To m2 'a(26)
a(26) = j26 - 1
If a(26) = a(47) Or a(26) = a(40) Or a(26) = a(33) Then GoTo 260
If a(26) = a(27) Or a(26) = a(28) Then GoTo 260
a(20) = s1 - a(26) - a(27) - a(28) + a(30) + a(31) - a(34) - a(40) - a(41) - a(42) - a(48)
If a(20) < 0 Or a(20) > 6 Then GoTo 260
a(13) = -s1 + a(26) + a(27) + a(28) - a(30) - a(31) + a(33) + a(34) + a(35) - a(37) +
- a(38) + a(40) + a(41) + a(42) + a(47) + a(48) + a(49)
If a(13) < 0 Or a(13) > 6 Then GoTo 260
For j25 = m1 To m2 'a(25)
a(25) = j25 - 1
If a(25) = a(46) Or a(25) = a(39) Or a(25) = a(32) Then GoTo 250
If a(25) = a(26) Or a(25) = a(27) Or a(25) = a(28) Then GoTo 250
If a(25) = a(33) Or a(25) = a(41) Or a(25) = a(49) Then GoTo 250
If a(25) = a(31) Or a(25) = a(37) Or a(25) = a(43) Then GoTo 250
a(19) = 2 * s1 - a(25) - a(26) - a(27) - a(31) - a(32) - 2 * a(33) - a(34) - a(35) +
- a(39) - a(40) - a(41) - a(47)
If a(19) < 0 Or a(19) > 6 Then GoTo 250
a(16) = a(25) + a(26) + a(27) + a(28) - a(30) + a(33) + a(34) - a(36) - a(37) - a(38) - a(44)
If a(16) < 0 Or a(16) > 6 Then GoTo 250
a(12) = a(25) + a(26) + a(27) - a(29) - a(30) + a(32) + a(33) + a(34) - 2 * a(36) +
- 2 * a(37) - a(38) - a(42) + a(46) + a(47) + a(48)
If a(12) < 0 Or a(12) > 6 Then GoTo 250
a(9) = 3 * s1 - a(25) - a(26) - a(27) - a(28) - a(32) - 2 * a(33) - 2 * a(34) +
- a(35) - a(39) - 2 * a(40) - 2 * a(41) - a(42) - a(46) - a(47) - a(48) - a(49)
If a(9) < 0 Or a(9) > 6 Then GoTo 250
For j24 = m1 To m2 'a(24)
a(24) = j24 - 1
If a(24) = a(45) Or a(24) = a(38) Or a(24) = a(31) Then GoTo 240
If a(24) = a(25) Or a(24) = a(26) Or a(24) = a(27) Or a(24) = a(28) Then GoTo 240
a(18) = s1 - a(24) - a(25) - a(26) + a(29) - a(32) + a(35) - a(38) - a(39) - a(40) - a(46)
If a(18) < 0 Or a(18) > 6 Then GoTo 240
a(15) = -s1 + a(24) + a(25) + a(26) + a(27) - a(29) + a(32) + a(33) + a(38) + a(39) +
+ a(40) + a(41) - a(43)
If a(15) < 0 Or a(15) > 6 Then GoTo 240
a(11) = -s1 + a(24) + a(25) + a(26) - a(29) + a(31) + a(32) + a(33) - a(35) - a(36) + a(38) +
+ a(39) + a(40) - a(42) + a(45) + a(46) + a(47)
If a(11) < 0 Or a(11) > 6 Then GoTo 240
a(8) = 2 * s1 - a(24) - a(25) - a(26) - a(27) - a(31) - 2 * a(32) - 2 * a(33) +
- a(34) - a(38) - 2 * a(39) - 2 * a(40) - a(41) + a(43) + a(44) + a(49)
If a(8) < 0 Or a(8) > 6 Then GoTo 240
For j23 = m1 To m2 'a(23)
a(23) = j23 - 1
If a(23) = a(44) Or a(23) = a(37) Or a(23) = a(30) Then GoTo 230
If a(23) = a(24) Or a(23) = a(25) Or a(23) = a(26) Or a(23) = a(27) Or a(23) = a(28) Then GoTo 230
a(22) = s1 - a(23) - a(24) - a(25) - a(26) - a(27) - a(28)
If a(22) < 0 Or a(22) > 6 Then GoTo 230
If a(22) = a(43) Or a(22) = a(36) Or a(22) = a(29) Then GoTo 230
a(21) = s1 - a(22) - a(27) - a(28) + a(31) + a(32) - a(35) - a(36) - a(41) - a(42) - a(49)
If a(21) < 0 Or a(21) > 6 Then GoTo 230
a(17) = s1 - a(23) - a(24) - a(25) - a(31) + a(34) + a(35) - a(37) - a(38) - a(39) - a(45)
If a(17) < 0 Or a(17) > 6 Then GoTo 230
a(14) = 3 * s1 - a(23) - a(24) - a(25) - a(26) - a(30) - 2 * a(31) - 2 * a(32) +
- a(33) - a(37) - 2 * a(38) - 2 * a(39) - a(40) - a(44) - a(45) - a(46) - a(47)
If a(14) < 0 Or a(14) > 6 Then GoTo 230
a(10) = -s1 + a(23) + a(24) + a(25) + a(30) + a(31) + a(32) - a(34) - a(35) +
+ a(37) + a(38) + a(39) - a(41) - a(42) + a(44) + a(45) + a(46)
If a(10) < 0 Or a(10) > 6 Then GoTo 230
a(7) = s1 - a(14) - a(21) - a(28) - a(35) - a(42) - a(49): If a(7) < 0 Or a(7) > 6 Then GoTo 230
a(6) = s1 - a(13) - a(20) - a(27) - a(34) - a(41) - a(48): If a(6) < 0 Or a(6) > 6 Then GoTo 230
a(5) = s1 - a(12) - a(19) - a(26) - a(33) - a(40) - a(47): If a(5) < 0 Or a(5) > 6 Then GoTo 230
a(4) = s1 - a(11) - a(18) - a(25) - a(32) - a(39) - a(46): If a(4) < 0 Or a(4) > 6 Then GoTo 230
a(3) = s1 - a(10) - a(17) - a(24) - a(31) - a(38) - a(45): If a(3) < 0 Or a(3) > 6 Then GoTo 230
a(2) = s1 - a(9) - a(16) - a(23) - a(30) - a(37) - a(44): If a(2) < 0 Or a(2) > 6 Then GoTo 230
a(1) = s1 - a(8) - a(15) - a(22) - a(29) - a(36) - a(43): If a(1) < 0 Or a(1) > 6 Then GoTo 230
GoSub 800: If fl1 = 0 Then GoTo 230
' Check Self Orthogonal
Erase a2
For i1 = 1 To 49: a2(i1) = a(i1): Next i1
GoSub 1500: If fl1 = 0 Then GoTo 5
' Check Associated 'Option
' GoSub 900: If fl1 = 0 Then GoTo 5
n9 = n9 + 1
' GoSub 2650 'Print results (squares)
' GoSub 2645 'Print results (selected numbers
Cells(1, 1).Value = n9 'Counting
5
230 Next j23
240 Next j24
250 Next j25
260 Next j26
270 Next j27
280 Next j28
300 Next j30
310 Next j31
320 Next j32
330 Next j33
340 Next j34
350 Next j35
370 Next j37
380 Next j38
390 Next j39
400 Next j40
410 Next j41
420 Next j42
440 Next j44
450 Next j45
460 Next j46
470 Next j47
480 Next j48
490 Next j49
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine SelfOrth7b")
End
' Print results (selected numbers)
2645 For i1 = 1 To 49
Cells(n9, i1).Value = a(i1)
Next i1
Return
' Print results (squares)
2650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 8: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 8
End If
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = n9
i3 = 0
For i1 = 1 To 7
For i2 = 1 To 7
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1
Return
' Exclude solutions with identical numbers in rows, columns, diagonals
800 fl1 = 1
' Rows
i1 = -6
For i0 = 1 To 7
i1 = i1 + 7
b(1) = a(i1): b(2) = a(i1 + 1): b(3) = a(i1 + 2): b(4) = a(i1 + 3):
b(5) = a(i1 + 4): b(6) = a(i1 + 5): b(7) = a(i1 + 6)
GoSub 860: If fl1 = 0 Then Return
Next i0
' Columns
i1 = 0
For i0 = 1 To 7
i1 = i1 + 1
b(1) = a(i1): b(2) = a(i1 + 7): b(3) = a(i1 + 14): b(4) = a(i1 + 21):
b(5) = a(i1 + 28): b(6) = a(i1 + 35): b(7) = a(i1 + 42)
GoSub 860: If fl1 = 0 Then Return
Next i0
' Pan Diagonals
b(1) = a(1): b(2) = a(9): b(3) = a(17): b(4) = a(25): b(5) = a(33): b(6) = a(41): b(7) = a(49):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(2): b(2) = a(10): b(3) = a(18): b(4) = a(26): b(5) = a(34): b(6) = a(42): b(7) = a(43):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(3): b(2) = a(11): b(3) = a(19): b(4) = a(27): b(5) = a(35): b(6) = a(36): b(7) = a(44):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(4): b(2) = a(12): b(3) = a(20): b(4) = a(28): b(5) = a(29): b(6) = a(37): b(7) = a(45):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(5): b(2) = a(13): b(3) = a(21): b(4) = a(22): b(5) = a(30): b(6) = a(38): b(7) = a(46):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(6): b(2) = a(14): b(3) = a(15): b(4) = a(23): b(5) = a(31): b(6) = a(39): b(7) = a(47):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(7): b(2) = a(8): b(3) = a(16): b(4) = a(24): b(5) = a(32): b(6) = a(40): b(7) = a(48):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(43): b(2) = a(37): b(3) = a(31): b(4) = a(25): b(5) = a(19): b(6) = a(13): b(7) = a(7):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(44): b(2) = a(38): b(3) = a(32): b(4) = a(26): b(5) = a(20): b(6) = a(14): b(7) = a(1):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(45): b(2) = a(39): b(3) = a(33): b(4) = a(27): b(5) = a(21): b(6) = a(8): b(7) = a(2):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(46): b(2) = a(40): b(3) = a(34): b(4) = a(28): b(5) = a(15): b(6) = a(9): b(7) = a(3):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(47): b(2) = a(41): b(3) = a(35): b(4) = a(22): b(5) = a(16): b(6) = a(10): b(7) = a(4):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(48): b(2) = a(42): b(3) = a(29): b(4) = a(23): b(5) = a(17): b(6) = a(11): b(7) = a(5):
GoSub 860: If fl1 = 0 Then Return
b(1) = a(49): b(2) = a(36): b(3) = a(30): b(4) = a(24): b(5) = a(18): b(6) = a(12): b(7) = a(6):
GoSub 860: If fl1 = 0 Then Return
Return
860 fl1 = 1
For j1 = 1 To 7
b20 = b(j1)
For j2 = (1 + j1) To 7
If b20 = b(j2) Then fl1 = 0: Return
Next j2
Next j1
Return
' Check Associated
900 fl1 = 1
s(1) = a(1) + a(49): s(2) = a(2) + a(48): s(3) = a(3) + a(47): s(4) = a(4) + a(46)
s(5) = a(5) + a(45): s(6) = a(6) + a(44): s(7) = a(7) + a(43): s(8) = a(8) + a(42)
s(9) = a(9) + a(41): s(10) = a(10) + a(40): s(11) = a(11) + a(39): s(12) = a(12) + a(38)
s(13) = a(13) + a(37): s(14) = a(14) + a(36): s(15) = a(15) + a(35): s(16) = a(16) + a(34)
s(17) = a(17) + a(33): s(18) = a(18) + a(32): s(19) = a(19) + a(31): s(20) = a(20) + a(30)
s(21) = a(21) + a(29): s(22) = a(22) + a(28): s(23) = a(23) + a(27): s(24) = a(24) + a(26)
For j20 = 1 To 24
If s(j20) <> s2 Then fl1 = 0: Exit For
Next j20
Return
1500 fl1 = 1
' Transpose a2()
i3 = 0: Erase a0
For i1 = 1 To 7
For i2 = 1 To 7
i3 = i3 + 1
a0(i1, i2) = a2(i3)
Next i2
Next i1
i3 = 0:
For i1 = 1 To 7
For i2 = 1 To 7
i3 = i3 + 1
b2(i3) = a0(i2, i1)
Next i2
Next i1
' Calculate c()
Erase c
For i1 = 1 To 49
c(i1) = 7 * a2(i1) + b2(i1) + 1
Next i1
fl1 = 1: n20 = 0
For j1 = 1 To 49
a20 = c(j1):
For j2 = (1 + j1) To 49
If a20 = c(j2) Then fl1 = 0: Return
Next j2
1510 Next j1
Return
End Sub