Vorige Pagina About the Author

' 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

Vorige Pagina About the Author