' Generates SelfOrthogonal Latin Diagonal Squares (8 x 8)
' Idempotent (Non-Associated)
' For preliminary results: activate split columns (1, 2) and rows (2, 3)
' Tested with Office 365 under Windows 11
Sub SelfOrth8a2()
Dim a(64), b(8), a1(8)
Dim b2(64), c(64), a0(8, 8)
Dim s(32)
y = MsgBox("Locked", vbCritical, "Routine SelfOrth8a2")
End
n2 = 0: n9 = 0: k1 = 1: k2 = 1
m1 = 1: m2 = 8: s1 = 28: Pr8 = s1 / 4: s4 = 2 * Pr8
For i1 = 1 To 8: a1(i1) = i1 - 1: Next i1
Sheets("Klad1").Select
t1 = Timer
' Row 1
For j63 = m1 To m2 'a(63)
a(63) = a1(j63)
If a(63) = a(64) Then GoTo 630
If a(63) = a(55) Then GoTo 630
For j62 = m1 To m2 'a(62)
a(62) = a1(j62)
If a(62) = a(63) Or a(62) = a(64) Then GoTo 620
If a(62) = a(46) Then GoTo 620
For j61 = m1 To m2 'a(61)
a(61) = a1(j61)
If a(61) = a(62) Or a(61) = a(63) Or a(61) = a(64) Then GoTo 610
If a(61) = a(37) Then GoTo 610
For j60 = m1 To m2 'a(60)
a(60) = a1(j60)
If a(60) = a(61) Or a(60) = a(62) Or a(60) = a(63) Or a(60) = a(64) Then GoTo 600
If a(60) = a(28) Then GoTo 600
For j59 = m1 To m2 'a(59)
a(59) = a1(j59)
If a(59) = a(60) Or a(59) = a(61) Or a(59) = a(62) Or a(59) = a(63) Or a(59) = a(64) Then GoTo 590
If a(59) = a(19) Then GoTo 590
For j58 = m1 To m2 'a(58)
a(58) = a1(j58)
If a(58) = a(59) Or a(58) = a(60) Or a(58) = a(61) Or a(58) = a(62) Or a(58) = a(63) Or a(58) = a(64) Then GoTo 580
If a(58) = a(10) Then GoTo 580
a(57) = s1 - a(58) - a(59) - a(60) - a(61) - a(62) - a(63) - a(64)
If a(57) < a1(m1) Or a(57) > a1(m2) Then GoTo 570
If a(57) = a(1) Then GoTo 570
' Column 1
For j56 = m1 To m2 'a(56)
a(56) = a1(j56)
If a(56) = a(64) Or a(56) = a(55) Then GoTo 560
For j48 = m1 To m2 'a(48)
a(48) = a1(j48)
If a(48) = a(64) Or a(48) = a(56) Then GoTo 480
If a(48) = a(46) Then GoTo 480
For j40 = m1 To m2
a(40) = a1(j40)
'' a(40) = s4 - a(48) - a(56) - a(64)
'' If a(40) < a1(m1) Or a(40) > a1(m2) Then GoTo 400
If a(40) = a(64) Or a(40) = a(56) Or a(40) = a(48) Then GoTo 400
If a(40) = a(37) Then GoTo 400
For j32 = m1 To m2 'a(32)
a(32) = a1(j32)
If a(32) = a(64) Or a(32) = a(56) Or a(32) = a(48) Or a(32) = a(40) Then GoTo 320
If a(32) = a(28) Then GoTo 320
For j24 = m1 To m2 'a(24)
a(24) = a1(j24)
If a(24) = a(64) Or a(24) = a(56) Or a(24) = a(48) Or a(24) = a(40) Or a(24) = a(32) Then GoTo 240
If a(24) = a(19) Then GoTo 240
For j16 = m1 To m2 'a(16)
a(16) = a1(j16)
If a(16) = a(64) Or a(16) = a(56) Or a(16) = a(48) Or a(16) = a(40) Or a(16) = a(32) Or a(16) = a(24) Then GoTo 160
If a(16) = a(10) Then GoTo 160
a(8) = s1 - a(16) - a(24) - a(32) - a(40) - a(48) - a(56) - a(64)
If a(8) < a1(m1) Or a(8) > a1(m2) Then GoTo 80
If a(8) = a(1) Then GoTo 80
GoSub 1500: If fl1 = 0 Then GoTo 80 'Check Self Orthogonal
' Row 2
For j54 = m1 To m2 'a(54)
a(54) = a1(j54)
If a(54) = a(55) Or a(54) = a(56) Then GoTo 540
If a(54) = a(62) Or a(54) = a(46) Then GoTo 540
For j53 = m1 To m2
a(53) = a1(j53)
'' a(53) = s4 - a(54) - a(55) - a(56)
'' If a(53) < a1(m1) Or a(53) > a1(m2) Then GoTo 530
If a(53) = a(54) Or a(53) = a(55) Or a(53) = a(56) Then GoTo 530
If a(53) = a(61) Or a(53) = a(37) Then GoTo 530
For j52 = m1 To m2 'a(52)
a(52) = a1(j52)
If a(52) = a(53) Or a(52) = a(54) Or a(52) = a(55) Or a(52) = a(56) Then GoTo 520
If a(52) = a(60) Or a(52) = a(28) Then GoTo 520
For j51 = m1 To m2 'a(51)
a(51) = a1(j51)
If a(51) = a(52) Or a(51) = a(53) Or a(51) = a(54) Or a(51) = a(55) Or a(51) = a(56) Then GoTo 510
If a(51) = a(59) Or a(51) = a(19) Then GoTo 510
For j50 = m1 To m2 'a(50)
a(50) = a1(j50)
If a(50) = a(51) Or a(50) = a(52) Or a(50) = a(53) Or a(50) = a(54) Or a(50) = a(55) Or a(50) = a(56) Then GoTo 500
If a(50) = a(58) Or a(50) = a(10) Then GoTo 500
If a(50) = a(8) Or a(50) = a(57) Then GoTo 500 'Diagonal 2
a(49) = s1 - a(50) - a(51) - a(52) - a(53) - a(54) - a(55) - a(56)
If a(49) < a1(m1) Or a(49) > a1(m2) Then GoTo 500
If a(49) = a(1) Or a(49) = a(57) Then GoTo 500
' Column 2
For j47 = m1 To m2 'a(47)
a(47) = a1(j47)
If a(47) = a(63) Or a(47) = a(55) Then GoTo 470
If a(47) = a(46) Or a(47) = a(48) Then GoTo 470
For j39 = m3 To m2
a(39) = a1(j39)
'' a(39) = s4 - a(47) - a(55) - a(63)
'' If a(39) < a1(m1) Or a(39) > a1(m2) Then GoTo 390
If a(39) = a(63) Or a(39) = a(55) Or a(39) = a(47) Then GoTo 390
If a(39) = a(37) Or a(39) = a(40) Then GoTo 390
For j31 = m1 To m2 'a(31)
a(31) = a1(j31)
If a(31) = a(63) Or a(31) = a(55) Or a(31) = a(47) Or a(31) = a(39) Then GoTo 310
If a(31) = a(28) Or a(31) = a(32) Then GoTo 310
For j23 = m1 To m2 'a(23)
a(23) = a1(j23)
If a(23) = a(63) Or a(23) = a(55) Or a(23) = a(47) Or a(23) = a(39) Or a(23) = a(31) Then GoTo 230
If a(23) = a(19) Or a(23) = a(24) Then GoTo 230
For j15 = m1 To m2 'a(15)
a(15) = a1(j15)
If a(15) = a(63) Or a(15) = a(55) Or a(15) = a(47) Or a(15) = a(39) Or a(15) = a(31) Or a(15) = a(23) Then GoTo 150
If a(15) = a(10) Or a(15) = a(16) Then GoTo 150
If a(15) = a(8) Or a(15) = a(50) Or a(15) = a(57) Then GoTo 150 'Diagonal 2
a(7) = s1 - a(15) - a(23) - a(31) - a(39) - a(47) - a(55) - a(63)
If a(7) < a1(m1) Or a(7) > a1(m2) Then GoTo 70
If a(7) = a(1) Or a(7) = a(8) Then GoTo 70
GoSub 1500: If fl1 = 0 Then GoTo 70 'Check Self Orthogonal
' Row 3
For j45 = m1 To m2
a(45) = a1(j45)
'' a(45) = s4 - a(46) - a(47) - a(48)
'' If a(45) < a1(m1) Or a(45) > a1(m2) Then GoTo 450
If a(45) = a(46) Or a(45) = a(47) Or a(45) = a(48) Then GoTo 450
If a(45) = a(61) Or a(45) = a(53) Or a(45) = a(37) Then GoTo 450
For j44 = m1 To m2 'a(44)
a(44) = a1(j44)
If a(44) = a(45) Or a(44) = a(46) Or a(44) = a(47) Or a(44) = a(48) Then GoTo 440
If a(44) = a(60) Or a(44) = a(52) Or a(44) = a(28) Then GoTo 440
For j43 = m1 To m2 'a(43)
a(43) = a1(j43)
If a(43) = a(44) Or a(43) = a(45) Or a(43) = a(46) Or a(43) = a(47) Or a(43) = a(48) Then GoTo 430
If a(43) = a(59) Or a(43) = a(51) Or a(43) = a(19) Then GoTo 430
If a(43) = a(8) Or a(43) = a(15) Or a(43) = a(50) Or a(43) = a(57) Then GoTo 430 'Diagonal 2
For j42 = m1 To m2 'a(42)
a(42) = a1(j42)
If a(42) = a(43) Or a(42) = a(44) Or a(42) = a(45) Or a(42) = a(46) Or a(42) = a(47) Or a(42) = a(48) Then GoTo 420
If a(42) = a(58) Or a(42) = a(50) Or a(42) = a(10) Then GoTo 420
a(41) = s1 - a(42) - a(43) - a(44) - a(45) - a(46) - a(47) - a(48)
If a(41) < a1(m1) Or a(41) > a1(m2) Then GoTo 410
If a(41) = a(1) Or a(41) = a(57) Or a(41) = a(49) Then GoTo 410
' Column 3
For j38 = m1 To m2 'a(38)
a(38) = a1(j38)
If a(38) = a(62) Or a(38) = a(54) Or a(38) = a(46) Then GoTo 380
If a(38) = a(37) Or a(38) = a(39) Or a(38) = a(40) Then GoTo 380
For j30 = m1 To m2 'a(30)
a(30) = a1(j30)
If a(30) = a(62) Or a(30) = a(54) Or a(30) = a(46) Or a(30) = a(38) Then GoTo 300
If a(30) = a(28) Or a(30) = a(31) Or a(30) = a(32) Then GoTo 300
For j22 = m1 To m2 'a(22)
a(22) = a1(j22)
If a(22) = a(62) Or a(22) = a(54) Or a(22) = a(46) Or a(22) = a(38) Or a(22) = a(30) Then GoTo 220
If a(22) = a(19) Or a(22) = a(23) Or a(22) = a(24) Then GoTo 220
If a(22) = a(8) Or a(22) = a(15) Or a(22) = a(43) Or a(22) = a(50) Or a(22) = a(57) Then GoTo 220 'Diagonal 2
For j14 = m1 To m2 'a(14)
a(14) = a1(j14)
If a(14) = a(62) Or a(14) = a(54) Or a(14) = a(46) Or a(14) = a(38) Or a(14) = a(30) Or a(14) = a(22) Then GoTo 140
If a(14) = a(10) Or a(14) = a(15) Or a(14) = a(16) Then GoTo 140
a(6) = s1 - a(14) - a(22) - a(30) - a(38) - a(46) - a(54) - a(62)
If a(6) < a1(m1) Or a(6) > a1(m2) Then GoTo 60
If a(6) = a(1) Or a(6) = a(7) Or a(6) = a(8) Then GoTo 60
GoSub 1500: If fl1 = 0 Then GoTo 60 'Check Self Orthogonal
' Row 4
For j36 = m1 To m2
a(36) = a1(j36)
If a(36) = a(37) Or a(36) = a(38) Or a(36) = a(39) Or a(36) = a(40) Then GoTo 360
If a(36) = a(60) Or a(36) = a(52) Or a(36) = a(44) Or a(36) = a(28) Then GoTo 360
If a(36) = a(8) Or a(36) = a(15) Or a(36) = a(22) Or a(36) = a(43) Or a(36) = a(50) Or a(36) = a(57) Then GoTo 360 'Diagonal 2
a(29) = s1 - a(8) - a(15) - a(22) - a(36) - a(43) - a(50) - a(57)
If a(29) < a1(m1) Or a(29) > a1(m2) Then GoTo 290
If a(29) = a(61) Or a(29) = a(53) Or a(29) = a(45) Or a(29) = a(37) Then GoTo 290
If a(29) = a(28) Or a(29) = a(30) Or a(29) = a(31) Or a(29) = a(32) Then GoTo 290
For j35 = m1 To m2 'a(35)
a(35) = a1(j35)
If a(35) = a(36) Or a(35) = a(37) Or a(35) = a(38) Or a(35) = a(39) Or a(35) = a(40) Then GoTo 350
If a(35) = a(59) Or a(35) = a(51) Or a(35) = a(43) Or a(35) = a(19) Then GoTo 350
For j34 = m1 To m2 'a(34)
a(34) = a1(j34)
If a(34) = a(35) Or a(34) = a(36) Or a(34) = a(37) Or a(34) = a(38) Or a(34) = a(39) Or a(34) = a(40) Then GoTo 340
If a(34) = a(58) Or a(34) = a(50) Or a(34) = a(42) Or a(34) = a(10) Then GoTo 340
a(33) = s1 - a(34) - a(35) - a(36) - a(37) - a(38) - a(39) - a(40)
If a(33) < a1(m1) Or a(33) > a1(m2) Then GoTo 330
If a(33) = a(34) Or a(33) = a(35) Or a(33) = a(36) Or a(33) = a(37) Or a(33) = a(38) Or a(33) = a(39) Or a(33) = a(40) Then GoTo 330
If a(33) = a(57) Or a(33) = a(49) Or a(33) = a(41) Or a(33) = a(1) Then GoTo 330
' Column 4
For j21 = m1 To m2 'a(21)
a(21) = a1(j21)
If a(21) = a(61) Or a(21) = a(53) Or a(21) = a(45) Or a(21) = a(37) Or a(21) = a(29) Then GoTo 210
If a(21) = a(19) Or a(21) = a(22) Or a(21) = a(23) Or a(21) = a(24) Then GoTo 210
For j13 = m1 To m2 'a(13)
a(13) = a1(j13)
If a(13) = a(61) Or a(13) = a(53) Or a(13) = a(45) Or a(13) = a(37) Or a(13) = a(29) Or a(13) = a(21) Then GoTo 130
If a(13) = a(10) Or a(13) = a(14) Or a(13) = a(15) Or a(13) = a(16) Then GoTo 130
a(5) = s1 - a(13) - a(21) - a(29) - a(37) - a(45) - a(53) - a(61)
If a(5) < a1(m1) Or a(5) > a1(m2) Then GoTo 50
If a(5) = a(1) Or a(5) = a(6) Or a(5) = a(7) Or a(5) = a(8) Then GoTo 50
GoSub 1500: If fl1 = 0 Then GoTo 50 'Check Self Orthogonal
' Row 5
For j27 = m1 To m2 'a(27)
a(27) = a1(j27)
If a(27) = a(28) Or a(27) = a(29) Or a(27) = a(30) Or a(27) = a(31) Or a(27) = a(32) Then GoTo 270
If a(27) = a(59) Or a(27) = a(51) Or a(27) = a(43) Or a(27) = a(35) Or a(27) = a(19) Then GoTo 270
For j26 = m1 To m2 'a(26)
a(26) = a1(j26)
If a(26) = a(27) Or a(26) = a(28) Or a(26) = a(29) Or a(26) = a(30) Or a(26) = a(31) Or a(26) = a(32) Then GoTo 260
If a(26) = a(58) Or a(26) = a(50) Or a(26) = a(42) Or a(26) = a(34) Or a(26) = a(10) Then GoTo 260
a(25) = s1 - a(26) - a(27) - a(28) - a(29) - a(30) - a(31) - a(32)
If a(25) < a1(m1) Or a(25) > a1(m2) Then GoTo 250
If a(25) = a(26) Or a(25) = a(27) Or a(25) = a(28) Or a(25) = a(29) Or a(25) = a(30) Or a(25) = a(31) Or a(25) = a(32) Then GoTo 250
If a(25) = a(57) Or a(25) = a(49) Or a(25) = a(41) Or a(25) = a(33) Or a(25) = a(1) Then GoTo 250
' Column 5
For j20 = m1 To m2 'a(20)
a(20) = a1(j20)
If a(20) = a(60) Or a(20) = a(52) Or a(20) = a(44) Or a(20) = a(36) Or a(20) = a(28) Then GoTo 200
If a(20) = a(19) Or a(20) = a(21) Or a(20) = a(22) Or a(20) = a(23) Or a(20) = a(24) Then GoTo 200
For j12 = m1 To m2 'a(12)
a(12) = a1(j12)
If a(12) = a(60) Or a(12) = a(52) Or a(12) = a(44) Or a(12) = a(36) Or a(12) = a(28) Or a(12) = a(20) Then GoTo 120
If a(12) = a(10) Or a(12) = a(13) Or a(12) = a(14) Or a(12) = a(15) Or a(12) = a(16) Then GoTo 120
a(4) = s1 - a(12) - a(20) - a(28) - a(36) - a(44) - a(52) - a(60)
If a(4) < a1(m1) Or a(4) > a1(m2) Then GoTo 40
If a(4) = a(1) Or a(4) = a(5) Or a(4) = a(6) Or a(4) = a(7) Or a(4) = a(8) Then GoTo 40
GoSub 1500: If fl1 = 0 Then GoTo 40 'Check Self Orthogonal
' Remainder
For j11 = m1 To m2 'a(11)
a(11) = a1(j11)
If a(11) = a(59) Or a(11) = a(51) Or a(11) = a(43) Or a(11) = a(35) Or a(11) = a(27) Or a(11) = a(19) Then GoTo 110
If a(11) = a(10) Or a(11) = a(12) Or a(11) = a(13) Or a(11) = a(14) Or a(11) = a(15) Or a(11) = a(16) Then GoTo 110
a(3) = s1 - a(11) - a(19) - a(27) - a(35) - a(43) - a(51) - a(59)
If a(3) < a1(m1) Or a(3) > a1(m2) Then GoTo 30
If a(3) = a(1) Or a(3) = a(4) Or a(3) = a(5) Or a(3) = a(6) Or a(3) = a(7) Or a(3) = a(8) Then GoTo 30
a(2) = s1 - a(1) - a(3) - a(4) - a(5) - a(6) - a(7) - a(8)
If a(2) < a1(m1) Or a(2) > a1(m2) Then GoTo 20
a(18) = s1 - a(2) - a(10) - a(26) - a(34) - a(42) - a(50) - a(58)
If a(18) < a1(m1) Or a(18) > a1(m2) Then GoTo 180
a(17) = s1 - a(18) - a(19) - a(20) - a(21) - a(22) - a(23) - a(24)
If a(17) < a1(m1) Or a(17) > a1(m2) Then GoTo 170
a(9) = s1 - a(10) - a(11) - a(12) - a(13) - a(14) - a(15) - a(16)
If a(9) < a1(m1) Or a(9) > a1(m2) Then GoTo 90
GoSub 1800: If fl1 = 0 Then GoTo 5 'Check Latin Rows, Columns and Diagonals
GoSub 1500: If fl1 = 0 Then GoTo 5 'Check Self Orthogonal
GoSub 950: If fl1 = 0 Then GoTo 5 'Prevent Associated
n9 = n9 + 1: GoSub 2650 'Print Square
5
90 a(9) = 0
170 a(17) = 0
180 a(18) = 0
20 a(2) = 0
30 a(3) = 0
110 a(11) = 0
Next j11
40 a(4) = 0
120 a(12) = 0
Next j12
200 a(20) = 0
Next j20
250 a(25) = 0
260 a(26) = 0
Next j26
270 a(27) = 0
Next j27
' ****************
50 a(5) = 0
130 a(13) = 0
Next j13
210 a(21) = 0
Next j21
330 a(33) = 0
340 a(34) = 0
Next j34
350 a(35) = 0
Next j35
290 a(29) = 0
360 a(36) = 0
Next j36
' ****************
60 a(6) = 0
140 a(14) = 0
Next j14
220 a(22) = 0
Next j22
300 a(30) = 0
Next j30
380 a(38) = 0
Next j38
410 a(41) = 0
420 a(42) = 0
Next j42
430 a(43) = 0
Next j43
440 a(44) = 0
Next j44
450 a(45) = 0
Next j45
' ****************
70 a(7) = 0
150 a(15) = 0
Next j15
230 a(23) = 0
Next j23
310 a(31) = 0
Next j31
390 a(39) = 0
Next j39
470 a(47) = 0
Next j47
490 a(49) = 0
500 a(50) = 0
Next j50
510 a(51) = 0
Next j51
520 a(52) = 0
Next j52
530 a(53) = 0
Next j53
540 a(54) = 0
Next j54
' ****************
80 a(8) = 0
160 a(16) = 0
Next j16
240 a(24) = 0
Next j24
320 a(32) = 0
Next j32
400 a(40) = 0
Next j40
480 a(48) = 0
Next j48
560 a(56) = 0
Next j56
570 a(57) = 0
580 a(58) = 0
Next j58
590 a(59) = 0
Next j59
600 a(60) = 0
Next j60
610 a(61) = 0
Next j61
620 a(62) = 0
Next j62
630 a(63) = 0
Next j63
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine SelfOrth8a2")
End
' Select Associated Magic Squares (Back Check)
950 fl1 = 1
s(1) = a(1) + a(64): s(9) = a(9) + a(56): s(17) = a(17) + a(48): s(25) = a(25) + a(40):
s(2) = a(2) + a(63): s(10) = a(10) + a(55): s(18) = a(18) + a(47): s(26) = a(26) + a(39):
s(3) = a(3) + a(62): s(11) = a(11) + a(54): s(19) = a(19) + a(46): s(27) = a(27) + a(38):
s(4) = a(4) + a(61): s(12) = a(12) + a(53): s(20) = a(20) + a(45): s(28) = a(28) + a(37):
s(5) = a(5) + a(60): s(13) = a(13) + a(52): s(21) = a(21) + a(44): s(29) = a(29) + a(36):
s(6) = a(6) + a(59): s(14) = a(14) + a(51): s(22) = a(22) + a(43): s(30) = a(30) + a(35):
s(7) = a(7) + a(58): s(15) = a(15) + a(50): s(23) = a(23) + a(42): s(31) = a(31) + a(34):
s(8) = a(8) + a(57): s(16) = a(16) + a(49): s(24) = a(24) + a(41): s(32) = a(32) + a(33):
n8 = 0
For j20 = 1 To 32
If s(j20) = Pr8 Then n8 = n8 + 1
Next j20
If n8 = 32 Then fl1 = 0
Return
' Exclude solutions with identical numbers in rows, columns, diagonals
1800
' Rows
i1 = -7
For i0 = 1 To 8
i1 = i1 + 8
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): b(8) = a(i1 + 7)
GoSub 1860: If fl1 = 0 Then Return
Next i0
' Columns
i1 = 0
For i0 = 1 To 8
i1 = i1 + 1
b(1) = a(i1): b(2) = a(i1 + 8): b(3) = a(i1 + 16): b(4) = a(i1 + 24):
b(5) = a(i1 + 32): b(6) = a(i1 + 40): b(7) = a(i1 + 48): b(8) = a(i1 + 56)
GoSub 1860: If fl1 = 0 Then Return
Next i0
' Main Diagonals
b(1) = a(1): b(2) = a(10): b(3) = a(19): b(4) = a(28): b(5) = a(37): b(6) = a(46): b(7) = a(55): b(8) = a(64)
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(8): b(2) = a(15): b(3) = a(22): b(4) = a(29): b(5) = a(36): b(6) = a(43): b(7) = a(50): b(8) = a(57)
GoSub 1860: If fl1 = 0 Then Return
Return
' Check identical numbers
1860 fl1 = 1
For j10 = 1 To 8
b20 = b(j10)
For j20 = (1 + j10) To 8
If b20 = b(j20) Then fl1 = 0: Return
Next j20
Next j10
Return
' Print results (selected numbers)
2645 For i1 = 1 To 64
Cells(n9, i1).Value = a(i1)
Next i1
Cells(n9, 65).Value = n9
Cells(1, 66).Value = n9
Return
' Print results (squares)
2650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 9: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 9
End If
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = n9
Cells(k1, k2 + 2).Value = j100
i3 = 0
For i1 = 1 To 8
For i2 = 1 To 8
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1
Return
' Check Self Orthogonal
1500 fl1 = 1
' Transpose a()
i3 = 0: Erase a0
For i1 = 1 To 8
For i2 = 1 To 8
i3 = i3 + 1
a0(i1, i2) = a(i3)
Next i2
Next i1
i3 = 0:
For i1 = 1 To 8
For i2 = 1 To 8
i3 = i3 + 1
b2(i3) = a0(i2, i1)
Next i2
Next i1
' Calculate c()
Erase c
For i1 = 1 To 64
c(i1) = 8 * a(i1) + b2(i1) + 1
Next i1
fl1 = 1: n20 = 0
For j1 = 1 To 64
a20 = c(j1): If a20 = 1 Then GoTo 1510
For j2 = (1 + j1) To 64
If a20 = c(j2) Then fl1 = 0: Return
Next j2
1510 Next j1
Return
End Sub