Vorige Pagina About the Author

' Constructs 9 x 9 Magic Squares with Overlapping Subsquares (Distinct Prime Numbers, Associated)
' - Reads Prime Number Complementary Anti Symmetric (Pan) Magic Squares (5 x 5)
' - Generates Prime Number Complementary Anti Symmetric Semi Magic Squares (4 x 4)

' Tested with Office 2007 under Windows 7

Sub Priem4f2()

    Dim a1(1944), a(81), b1(43300), b(43300), c(64)
    Dim a4(16), b5(25), c5(25), d4(16)              'Sub Squares

y = MsgBox("Locked", vbCritical, "Routine Priem4f2")
End

    n2 = 0: n3 = 0: k1 = 1: k2 = 1: n9 = 0: n10 = 0
    Sht1 = "Pairs7"

'   Generate Squares

    Sheets("Klad1").Select
    
    t1 = Timer

For j100 = 2 To 35

'   Start Reading Data
    
    Rcrd1a = Sheets("Lines9").Cells(j100, 84).Value
    MC9 = Sheets("Lines9").Cells(j100, 82).Value
    MC5 = Sheets("Lines9").Cells(j100, 83).Value

'   Read Prime Numbers From Sheet Sht1

    s1 = 2 * Sheets(Sht1).Cells(Rcrd1a, 1).Value  'MC4
    s2 = 9 * s1 / 4                               'MC9
    Cntr5 = Sheets(Sht1).Cells(Rcrd1a, 6).Value   'Center
    nVar = Sheets(Sht1).Cells(Rcrd1a, 9).Value
    
    Erase b1
    For j1 = 1 To nVar
           x = Sheets(Sht1).Cells(Rcrd1a, 9 + j1).Value
           b1(x) = x
    Next j1
    pMax = Sheets(Sht1).Cells(Rcrd1a, 9 + nVar).Value

    m1 = 1: m2 = nVar

'   Read Prime Numbers used for 2 x PM5

    For i1 = 1 To 81
        a(i1) = Sheets("Lines9").Cells(j100, i1).Value
    Next i1
    GoSub 750   'Fill c5()
    GoSub 700   'Fill b5()

    GoSub 950   'Remove used primes from available primes
    
    Erase a     'Clear Scratch Area
    
'   Generate Prime Number Semi Anti Symmetric Magic Squares (4 x 4)
    
    For j64 = m1 To m2                                                       'a(64)
    If b(a1(j64)) = 0 Then b(a1(j64)) = a1(j64): c(64) = a1(j64) Else GoTo 640
    a(64) = a1(j64)

    a(1) = s1 / 2 - a(64): If b(a(1)) = 0 Then b(a(1)) = a(1): c(1) = a(1) Else GoTo 10

    For j63 = m1 To m2                                                      'a(63)
    If b(a1(j63)) = 0 Then b(a1(j63)) = a1(j63): c(63) = a1(j63) Else GoTo 630
    a(63) = a1(j63)
    
    a(2) = s1 / 2 - a(63): If b(a(2)) = 0 Then b(a(2)) = a(2): c(2) = a(2) Else GoTo 20
    
    For j62 = m1 To m2                                                      'a(62)
    If b(a1(j62)) = 0 Then b(a1(j62)) = a1(j62): c(62) = a1(j62) Else GoTo 620
    a(62) = a1(j62)
    
    a(61) = s1 - a(62) - a(63) - a(64): If a(61) < a1(m1) Or a(61) > a1(m2) Then GoTo 610
    If b1(a(61)) = 0 Then GoTo 610
    If b(a(61)) = 0 Then b(a(61)) = a(61): c(61) = a(61) Else GoTo 610

    a(4) = s1 / 2 - a(61): If b(a(4)) = 0 Then b(a(4)) = a(4): c(4) = a(4) Else GoTo 40
    a(3) = s1 / 2 - a(62): If b(a(3)) = 0 Then b(a(3)) = a(3): c(3) = a(3) Else GoTo 30

    For j60 = m1 To m2                                                      'a(60)
    If b(a1(j60)) = 0 Then b(a1(j60)) = a1(j60): c(60) = a1(j60) Else GoTo 600
    a(60) = a1(j60)

    a(5) = s1 / 2 - a(60): If b(a(5)) = 0 Then b(a(5)) = a(5): c(5) = a(5) Else GoTo 50

    For j59 = m1 To m2                                                        'a(59)
    If b(a1(j59)) = 0 Then b(a1(j59)) = a1(j59): c(59) = a1(j59) Else GoTo 590
    a(59) = a1(j59)

    a(6) = s1 / 2 - a(59): If b(a(6)) = 0 Then b(a(6)) = a(6): c(6) = a(6) Else GoTo 60
    
    For j58 = m1 To m2                                                      'a(58)
    If b(a1(j58)) = 0 Then b(a1(j58)) = a1(j58): c(58) = a1(j58) Else GoTo 580
    a(58) = a1(j58)

    a(57) = s1 - a(58) - a(59) - a(60): If a(57) < a1(m1) Or a(57) > a1(m2) Then GoTo 570
    If b1(a(57)) = 0 Then GoTo 570
    If b(a(57)) = 0 Then b(a(57)) = a(57): c(57) = a(57) Else GoTo 570

    a(8) = s1 / 2 - a(57): If b(a(8)) = 0 Then b(a(8)) = a(8): c(8) = a(8) Else GoTo 80
    a(7) = s1 / 2 - a(58): If b(a(7)) = 0 Then b(a(7)) = a(7): c(7) = a(7) Else GoTo 70
    
    For j56 = m1 To m2                                                      'a(56)
    If b(a1(j56)) = 0 Then b(a1(j56)) = a1(j56): c(56) = a1(j56) Else GoTo 560
    a(56) = a1(j56)
    
    a(52) = s1 - a(56) - a(60) - a(64): If a(52) < a1(m1) Or a(52) > a1(m2) Then GoTo 520
    If b1(a(52)) = 0 Then GoTo 520
    If b(a(52)) = 0 Then b(a(52)) = a(52): c(52) = a(52) Else GoTo 520
    
    a(13) = s1 / 2 - a(52): If b(a(13)) = 0 Then b(a(13)) = a(13): c(13) = a(13) Else GoTo 130
    a(9) = s1 / 2 - a(56): If b(a(9)) = 0 Then b(a(9)) = a(9): c(9) = a(9) Else GoTo 90
    
    For j55 = m1 To m2                                                      'a(55)
    If b(a1(j55)) = 0 Then b(a1(j55)) = a1(j55): c(55) = a1(j55) Else GoTo 550
    a(55) = a1(j55)
    
    a(51) = s1 - a(55) - a(59) - a(63): If a(51) < a1(m1) Or a(51) > a1(m2) Then GoTo 510
    If b1(a(51)) = 0 Then GoTo 510
    If b(a(51)) = 0 Then b(a(51)) = a(51): c(51) = a(51) Else GoTo 510

    a(14) = s1 / 2 - a(51): If b(a(14)) = 0 Then b(a(14)) = a(14): c(14) = a(14) Else GoTo 140
    a(10) = s1 / 2 - a(55): If b(a(10)) = 0 Then b(a(10)) = a(10): c(10) = a(10) Else GoTo 100

    For j54 = m1 To m2                                                      'a(54)
    If b(a1(j54)) = 0 Then b(a1(j54)) = a1(j54): c(54) = a1(j54) Else GoTo 540
    a(54) = a1(j54)

    a(53) = s1 - a(54) - a(55) - a(56): If a(53) < a1(m1) Or a(53) > a1(m2) Then GoTo 530
    If b1(a(53)) = 0 Then GoTo 530
    If b(a(53)) = 0 Then b(a(53)) = a(53): c(53) = a(53) Else GoTo 530
    
    a(50) = s1 - a(54) - a(58) - a(62): If a(50) < a1(m1) Or a(50) > a1(m2) Then GoTo 500
    If b1(a(50)) = 0 Then GoTo 500
    If b(a(50)) = 0 Then b(a(50)) = a(50): c(50) = a(50) Else GoTo 500
    
    a(49) = -2 * s1 + a(54) + a(55) + a(56) + a(58) + a(59) + a(60) + a(62) + a(63) + a(64)
    If a(49) < a1(m1) Or a(49) > a1(m2) Then GoTo 490
    If b1(a(49)) = 0 Then GoTo 490
    If b(a(49)) = 0 Then b(a(49)) = a(49): c(49) = a(49) Else GoTo 490

    a(16) = s1 / 2 - a(49): If b(a(16)) = 0 Then b(a(16)) = a(16): c(16) = a(16) Else GoTo 160
    a(15) = s1 / 2 - a(50): If b(a(15)) = 0 Then b(a(15)) = a(15): c(15) = a(15) Else GoTo 150
    a(12) = s1 / 2 - a(53): If b(a(12)) = 0 Then b(a(12)) = a(12): c(12) = a(12) Else GoTo 120
    a(11) = s1 / 2 - a(54): If b(a(11)) = 0 Then b(a(11)) = a(11): c(11) = a(11) Else GoTo 110

'                 Exclude solutions with identical numbers
    
                  n8 = 64: GoSub 800: If fl1 = 0 Then GoTo 75
                             
                  For i1 = 1 To 16: d4(i1) = a(i1): Next i1
                  For i1 = 1 To 16: a4(i1) = a(i1 + 48): Next i1

                  GoSub 1600                                 'Compose Main Square
                  n8 = 81: GoSub 800                         'Double Check Identical Integers
                  If fl1 = 1 Then
                      n9 = n9 + 1: GoSub 650                 'Print Composed   Square
                      Erase b, c: GoTo 1000                  'Print only first Square
                  End If

75  b(c(11)) = 0: c(11) = 0
110 b(c(12)) = 0: c(12) = 0
120 b(c(15)) = 0: c(15) = 0
150 b(c(16)) = 0: c(16) = 0
160 b(c(49)) = 0: c(49) = 0
490 b(c(50)) = 0: c(50) = 0
500 b(c(53)) = 0: c(53) = 0
530 b(c(54)) = 0: c(54) = 0
540 Next j54

    b(c(10)) = 0: c(10) = 0
100 b(c(14)) = 0: c(14) = 0
140 b(c(51)) = 0: c(51) = 0
510 b(c(55)) = 0: c(55) = 0
550 Next j55

    b(c(9)) = 0: c(9) = 0
90  b(c(13)) = 0: c(13) = 0
130 b(c(52)) = 0: c(52) = 0
520 b(c(56)) = 0: c(56) = 0
560 Next j56

    b(c(7)) = 0: c(7) = 0
70  b(c(8)) = 0: c(8) = 0
80  b(c(57)) = 0: c(57) = 0
570 b(c(58)) = 0: c(58) = 0
580 Next j58

    b(c(6)) = 0: c(6) = 0
60  b(c(59)) = 0: c(59) = 0
590 Next j59

    b(c(5)) = 0: c(5) = 0
50  b(c(60)) = 0: c(60) = 0
600 Next j60

    b(c(3)) = 0: c(3) = 0
30  b(c(4)) = 0: c(4) = 0
40  b(c(61)) = 0: c(61) = 0
610 b(c(62)) = 0: c(62) = 0
620 Next j62
    
    b(c(2)) = 0: c(2) = 0
20  b(c(63)) = 0: c(63) = 0
630 Next j63

    b(c(1)) = 0: c(1) = 0
10  b(c(64)) = 0: c(64) = 0
640 Next j64

      n10 = 0
1000  Next j100

   t2 = Timer
    
   t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
   y = MsgBox(t10, 0, "Routine Priem4f2")

End

'   Compose Main Square

1600 a(1) = a4(1):   a(2) = a4(2):   a(3) = a4(3):   a(4) = a4(4):   a(5) = b5(1):   a(6) = b5(2):   a(7) = b5(3):   a(8) = b5(4):   a(9) = b5(5):
     a(10) = a4(5):  a(11) = a4(6):  a(12) = a4(7):  a(13) = a4(8):  a(14) = b5(6):  a(15) = b5(7):  a(16) = b5(8):  a(17) = b5(9):  a(18) = b5(10):
     a(19) = a4(9):  a(20) = a4(10): a(21) = a4(11): a(22) = a4(12): a(23) = b5(11): a(24) = b5(12): a(25) = b5(13): a(26) = b5(14): a(27) = b5(15):
     a(28) = a4(13): a(29) = a4(14): a(30) = a4(15): a(31) = a4(16): a(32) = b5(16): a(33) = b5(17): a(34) = b5(18): a(35) = b5(19): a(36) = b5(20):
     a(37) = c5(1):  a(38) = c5(2):  a(39) = c5(3):  a(40) = c5(4):  a(41) = b5(21): a(42) = b5(22): a(43) = b5(23): a(44) = b5(24): a(45) = b5(25):
     a(46) = c5(6):  a(47) = c5(7):  a(48) = c5(8):  a(49) = c5(9):  a(50) = c5(10): a(51) = d4(1):  a(52) = d4(2):  a(53) = d4(3):  a(54) = d4(4):
     a(55) = c5(11): a(56) = c5(12): a(57) = c5(13): a(58) = c5(14): a(59) = c5(15): a(60) = d4(5):  a(61) = d4(6):  a(62) = d4(7):  a(63) = d4(8):
     a(64) = c5(16): a(65) = c5(17): a(66) = c5(18): a(67) = c5(19): a(68) = c5(20): a(69) = d4(9):  a(70) = d4(10): a(71) = d4(11): a(72) = d4(12):
     a(73) = c5(21): a(74) = c5(22): a(75) = c5(23): a(76) = c5(24): a(77) = c5(25): a(78) = d4(13): a(79) = d4(14): a(80) = d4(15): a(81) = d4(16):

     Return
    
'   Print results (squares)

650 n2 = n2 + 1
    If n2 = 3 Then
        n2 = 1: k1 = k1 + 10: k2 = 1
    Else
        If n9 > 1 Then k2 = k2 + 10
    End If

    Cells(k1, k2 + 1).Select
    Cells(k1, k2 + 1).Font.Color = -4165632
    Cells(k1, k2 + 1).Value = "MC = " + CStr(s2)
    
    i3 = 0
    For i1 = 1 To 9
        For i2 = 1 To 9
            i3 = i3 + 1
            Cells(k1 + i1, k2 + i2).Value = a(i3)
        Next i2
    Next i1

    Return
   
'   Transform Non Symmetric Magic Square into b5() and c5()

700 b5(1) = 2 * Cntr5 - c5(25): b5(2) = 2 * Cntr5 - c5(24): b5(3) = 2 * Cntr5 - c5(23): b5(4) = 2 * Cntr5 - c5(22): b5(5) = 2 * Cntr5 - c5(21):
    b5(6) = 2 * Cntr5 - c5(20): b5(7) = 2 * Cntr5 - c5(19): b5(8) = 2 * Cntr5 - c5(18): b5(9) = 2 * Cntr5 - c5(17): b5(10) = 2 * Cntr5 - c5(16):
    b5(11) = 2 * Cntr5 - c5(15): b5(12) = 2 * Cntr5 - c5(14): b5(13) = 2 * Cntr5 - c5(13): b5(14) = 2 * Cntr5 - c5(12): b5(15) = 2 * Cntr5 - c5(11):
    b5(16) = 2 * Cntr5 - c5(10): b5(17) = 2 * Cntr5 - c5(9): b5(18) = 2 * Cntr5 - c5(8): b5(19) = 2 * Cntr5 - c5(7): b5(20) = 2 * Cntr5 - c5(6):
    b5(21) = 2 * Cntr5 - c5(5): b5(22) = 2 * Cntr5 - c5(4): b5(23) = 2 * Cntr5 - c5(3): b5(24) = 2 * Cntr5 - c5(2): b5(25) = 2 * Cntr5 - c5(1):
    Return

750 c5(1) = a(37):   c5(2) = a(38):   c5(3) = a(39):   c5(4) = a(40):   c5(5) = a(41):
    c5(6) = a(46):   c5(7) = a(47):   c5(8) = a(48):   c5(9) = a(49):   c5(10) = a(50):
    c5(11) = a(55):  c5(12) = a(56):  c5(13) = a(57):  c5(14) = a(58):  c5(15) = a(59):
    c5(16) = a(64):  c5(17) = a(65):  c5(18) = a(66):  c5(19) = a(67):  c5(20) = a(68):
    c5(21) = a(73):  c5(22) = a(74):  c5(23) = a(75):  c5(24) = a(76):  c5(25) = a(77):
    Return
    
'   Exclude solutions with identical numbers

800 fl1 = 1
    For j1 = 1 To n8
       a2 = a(j1): If a2 = 0 Then GoTo 805
       For j2 = (1 + j1) To n8
           If a2 = a(j2) Then fl1 = 0: Return
       Next j2
805 Next j1
    Return
   
'   Remove used primes from available primes (2 x PM5)

950 For i1 = 1 To 25
        b1(b5(i1)) = 0: b1(c5(i1)) = 0
    Next i1
    
'   Store available pairs in a1()

    n10 = 0
    For j1 = 1 To pMax
        If b1(j1) <> 0 Then
            n10 = n10 + 1
            a1(n10) = b1(j1)
        End If
    Next j1
    m1 = 1: m2 = n10: n10 = 0
    If a1(1) = 1 Then m1 = 2: m2 = m2 - 1
   
    Return
   
End Sub

Vorige Pagina About the Author