' Generates Order 13 Border / Diamond Combinations with 4 x 9 Even Corner Numbers
' Suitable for Concentric Lozenge Squares of order 15
' Tested with Office 365 under Windows 10
Sub Priem13f()
Dim a1(225), a(225), a13(169), a15(225), b(225), b1(225), c(169)
y = MsgBox("Locked", vbCritical, "Routine Priem13f")
End
n5 = 0: n9 = 0: n10 = 0: k1 = 1: k2 = 1
Sheets("Klad1").Select
t1 = Timer
m1 = 1: m2 = 112: s1 = 1469: p2 = 226
For i1 = 1 To m2
a1(i1) = 2 * i1: b1(a1(i1)) = a1(i1)
Next i1
For j100 = 2 To 2
' Read Diamond Inlay / Border 11 Combinations
Erase a
For i1 = 1 To 225
a(i1) = Sheets("BrdrLns11").Cells(j100, i1):
If a(i1) <> 0 Then b(a(i1)) = a(i1)
Next i1
' Store Center Square in a13()
Erase a13
a13(6) = a(22): a13(7) = a(23): a13(8) = a(24):
a13(15) = a(33): a13(16) = a(34): a13(17) = a(35): a13(18) = a(36): a13(19) = a(37): a13(20) = a(38):
a13(21) = a(39): a13(22) = a(40): a13(23) = a(41): a13(24) = a(42): a13(25) = a(43):
a13(28) = a(48): a13(29) = a(49): a13(30) = a(50): a13(31) = a(51): a13(32) = a(52): a13(33) = a(53):
a13(34) = a(54): a13(35) = a(55): a13(36) = a(56): a13(37) = a(57): a13(38) = a(58):
a13(41) = a(63): a13(42) = a(64): a13(43) = a(65): a13(44) = a(66): a13(45) = a(67): a13(46) = a(68):
a13(47) = a(69): a13(48) = a(70): a13(49) = a(71): a13(50) = a(72): a13(51) = a(73):
a13(54) = a(78): a13(55) = a(79): a13(56) = a(80): a13(57) = a(81): a13(58) = a(82): a13(59) = a(83):
a13(60) = a(84): a13(61) = a(85): a13(62) = a(86): a13(63) = a(87): a13(64) = a(88):
a13(66) = a(92): a13(67) = a(93): a13(68) = a(94): a13(69) = a(95): a13(70) = a(96):
a13(71) = a(97): a13(72) = a(98): a13(73) = a(99): a13(74) = a(100): a13(75) = a(101):
a13(76) = a(102): a13(77) = a(103): a13(78) = a(104):
a13(79) = a(107): a13(80) = a(108): a13(81) = a(109): a13(82) = a(110): a13(83) = a(111):
a13(84) = a(112): a13(85) = a(113): a13(86) = a(114): a13(87) = a(115): a13(88) = a(116):
a13(89) = a(117): a13(90) = a(118): a13(91) = a(119):
a13(92) = a(122): a13(93) = a(123): a13(94) = a(124): a13(95) = a(125): a13(96) = a(126):
a13(97) = a(127): a13(98) = a(128): a13(99) = a(129): a13(100) = a(130): a13(101) = a(131):
a13(102) = a(132): a13(103) = a(133): a13(104) = a(134):
a13(106) = a(138): a13(107) = a(139): a13(108) = a(140): a13(109) = a(141): a13(110) = a(142): a13(111) = a(143):
a13(112) = a(144): a13(113) = a(145): a13(114) = a(146): a13(115) = a(147): a13(116) = a(148):
a13(119) = a(153): a13(120) = a(154): a13(121) = a(155): a13(122) = a(156): a13(123) = a(157): a13(124) = a(158):
a13(125) = a(159): a13(126) = a(160): a13(127) = a(161): a13(128) = a(162): a13(129) = a(163):
a13(132) = a(168): a13(133) = a(169): a13(134) = a(170): a13(135) = a(171): a13(136) = a(172): a13(137) = a(173):
a13(138) = a(174): a13(139) = a(175): a13(140) = a(176): a13(141) = a(177): a13(142) = a(178):
a13(145) = a(183): a13(146) = a(184): a13(147) = a(185): a13(148) = a(186): a13(149) = a(187): a13(150) = a(188):
a13(151) = a(189): a13(152) = a(190): a13(153) = a(191): a13(154) = a(192): a13(155) = a(193):
a13(162) = a(202): a13(163) = a(203): a13(164) = a(204):
' Complete Border (only even numbers available)
For j169 = m2 To m1 Step -1 'a13(169)
If b(a1(j169)) = 0 Then b(a1(j169)) = a1(j169): c(169) = a1(j169) Else GoTo 1690
a13(169) = a1(j169)
a13(1) = p2 - a13(169): If b(a13(1)) = 0 Then b(a13(1)) = a13(1): c(1) = a13(1) Else GoTo 10
For j168 = j169 - 1 To m1 Step -1 'a13(168)
If b(a1(j168)) = 0 Then b(a1(j168)) = a1(j168): c(168) = a1(j168) Else GoTo 1680
a13(168) = a1(j168)
a13(12) = p2 - a13(168): If b(a13(12)) = 0 Then b(a13(12)) = a13(12): c(12) = a13(12) Else GoTo 120
For j167 = j168 - 1 To m1 Step -1 'a13(167)
If b(a1(j167)) = 0 Then b(a1(j167)) = a1(j167): c(167) = a1(j167) Else GoTo 1670
a13(167) = a1(j167)
a13(11) = p2 - a13(167): If b(a13(11)) = 0 Then b(a13(11)) = a13(11): c(11) = a13(11) Else GoTo 110
For j166 = j167 - 1 To m1 Step -1 'a13(166)
If b(a1(j166)) = 0 Then b(a1(j166)) = a1(j166): c(166) = a1(j166) Else GoTo 1660
a13(166) = a1(j166)
a13(10) = p2 - a13(166): If b(a13(10)) = 0 Then b(a13(10)) = a13(10): c(10) = a13(10) Else GoTo 100
For j165 = m1 To m2 'a13(165)
If b(a1(j165)) = 0 Then b(a1(j165)) = a1(j165): c(165) = a1(j165) Else GoTo 1650
a13(165) = a1(j165)
a13(9) = p2 - a13(165): If b(a13(9)) = 0 Then b(a13(9)) = a13(9): c(9) = a13(9) Else GoTo 90
For j157 = j165 + 1 To m2 'a13(157)
If b(a1(j157)) = 0 Then b(a1(j157)) = a1(j157): c(157) = a1(j157) Else GoTo 1570
a13(157) = a1(j157)
a13(13) = p2 - a13(157): If b(a13(13)) = 0 Then b(a13(13)) = a13(13): c(13) = a13(13) Else GoTo 130
For j161 = j157 + 1 To m2 'a13(161)
If b(a1(j161)) = 0 Then b(a1(j161)) = a1(j161): c(161) = a1(j161) Else GoTo 1610
a13(161) = a1(j161)
a13(5) = p2 - a13(161): If b(a13(5)) = 0 Then b(a13(5)) = a13(5): c(5) = a13(5) Else GoTo 50
For j160 = j161 + 1 To m2 'a13(160)
If b(a1(j160)) = 0 Then b(a1(j160)) = a1(j160): c(160) = a1(j160) Else GoTo 1600
a13(160) = a1(j160)
a13(4) = p2 - a13(160): If b(a13(4)) = 0 Then b(a13(4)) = a13(4): c(4) = a13(4) Else GoTo 40
For j159 = j160 + 1 To m2 'a13(159)
If b(a1(j159)) = 0 Then b(a1(j159)) = a1(j159): c(159) = a1(j159) Else GoTo 1590
a13(159) = a1(j159)
a13(3) = p2 - a13(159): If b(a13(3)) = 0 Then b(a13(3)) = a13(3): c(3) = a13(3) Else GoTo 30
a13(158) = s1 - a13(157)-a13(159)-a13(160)-a13(161)-a13(162)-a13(163)-a13(164)-a13(165)-a13(166)-a13(167)-a13(168)-a13(169)
If a13(158) < a1(m1) Or a13(158) > a1(m2) Then GoTo 1580
If b1(a13(158)) = 0 Then GoTo 1580
If b(a13(158)) = 0 Then b(a13(158)) = a13(158): c(158) = a13(158) Else GoTo 1580
a13(2) = p2 - a13(158): If b(a13(2)) = 0 Then b(a13(2)) = a13(2): c(2) = a13(2) Else GoTo 20
For j156 = m2 To m1 Step -1 'a13(156)
If b(a1(j156)) = 0 Then b(a1(j156)) = a1(j156): c(156) = a1(j156) Else GoTo 1560
a13(156) = a1(j156)
a13(144) = p2 - a13(156): If b(a13(144)) = 0 Then b(a13(144)) = a13(144): c(144) = a13(144) Else GoTo 1440
For j143 = j156 - 1 To m1 Step -1 'a13(143)
If b(a1(j143)) = 0 Then b(a1(j143)) = a1(j143): c(143) = a1(j143) Else GoTo 1430
a13(143) = a1(j143)
a13(131) = p2 - a13(143): If b(a13(131)) = 0 Then b(a13(131)) = a13(131): c(131) = a13(131) Else GoTo 1310
For j130 = m1 To m2 'a13(130)
If b(a1(j130)) = 0 Then b(a1(j130)) = a1(j130): c(130) = a1(j130) Else GoTo 1300
a13(130) = a1(j130)
a13(118) = p2 - a13(130): If b(a13(118)) = 0 Then b(a13(118)) = a13(118): c(118) = a13(118) Else GoTo 1180
For j117 = j130 + 1 To m2 'a13(117)
If b(a1(j117)) = 0 Then b(a1(j117)) = a1(j117): c(117) = a1(j117) Else GoTo 1170
a13(117) = a1(j117)
a13(105) = p2 - a13(117): If b(a13(105)) = 0 Then b(a13(105)) = a13(105): c(105) = a13(105) Else GoTo 1050
For j65 = j117 + 1 To m2 'a13(65)
If b(a1(j65)) = 0 Then b(a1(j65)) = a1(j65): c(65) = a1(j65) Else GoTo 650
a13(65) = a1(j65)
a13(53) = p2 - a13(65): If b(a13(53)) = 0 Then b(a13(53)) = a13(53): c(53) = a13(53) Else GoTo 530
For j52 = j165 + 1 To m2 'a13(52)
If b(a1(j52)) = 0 Then b(a1(j52)) = a1(j52): c(52) = a1(j52) Else GoTo 520
a13(52) = a1(j52)
a13(40) = p2 - a13(52): If b(a13(40)) = 0 Then b(a13(40)) = a13(40): c(40) = a13(40) Else GoTo 400
For j39 = j52 + 1 To m2 'a13(39)
If b(a1(j39)) = 0 Then b(a1(j39)) = a1(j39): c(39) = a1(j39) Else GoTo 390
a13(39) = a1(j39)
a13(27) = p2 - a13(39): If b(a13(27)) = 0 Then b(a13(27)) = a13(27): c(27) = a13(27) Else GoTo 270
a13(26) = s1 - a13(13)-a13(39)-a13(52)-a13(65)-a13(78)-a13(91)-a13(104)-a13(117)-a13(130)-a13(143)-a13(156)-a13(169)
If a13(26) < a1(m1) Or a13(26) > a1(m2) Then GoTo 260
If b1(a13(26)) = 0 Then GoTo 260
If b(a13(26)) = 0 Then b(a13(26)) = a13(26): c(26) = a13(26) Else GoTo 260
a13(14) = p2 - a13(26): If b(a13(14)) = 0 Then b(a13(14)) = a13(14): c(14) = a13(14) Else GoTo 140
' Exclude solutions with identical numbers
GoSub 1800: If fl1 = 0 Then GoTo 5
n9 = n9 + 1
GoSub 2700 'Fill Print Area a15()
GoSub 2650 'Print results (squares)
' GoSub 2645 'Print results (selected numbers)
Erase b, c: GoTo 1500 'Print only first square
5
b(c(14)) = 0: c(14) = 0
140 b(c(26)) = 0: c(26) = 0
260 b(c(27)) = 0: c(27) = 0
270 b(c(39)) = 0: c(39) = 0
390 Next j39
b(c(40)) = 0: c(40) = 0
400 b(c(52)) = 0: c(52) = 0
520 Next j52
b(c(53)) = 0: c(53) = 0
530 b(c(65)) = 0: c(65) = 0
650 Next j65
b(c(105)) = 0: c(105) = 0
1050 b(c(117)) = 0: c(117) = 0
1170 Next j117
b(c(118)) = 0: c(118) = 0
1180 b(c(130)) = 0: c(130) = 0
1300 Next j130
b(c(131)) = 0: c(131) = 0
1310 b(c(143)) = 0: c(143) = 0
1430 Next j143
b(c(144)) = 0: c(144) = 0
1440 b(c(156)) = 0: c(156) = 0
1560 Next j156
b(c(2)) = 0: c(2) = 0
20 b(c(158)) = 0: c(158) = 0
1580 b(c(3)) = 0: c(3) = 0
30 b(c(159)) = 0: c(159) = 0
1590 Next j159
b(c(4)) = 0: c(4) = 0
40 b(c(160)) = 0: c(160) = 0
1600 Next j160
b(c(5)) = 0: c(5) = 0
50 b(c(161)) = 0: c(161) = 0
1610 Next j161
b(c(13)) = 0: c(13) = 0
130 b(c(157)) = 0: c(157) = 0
1570 Next j157
b(c(9)) = 0: c(9) = 0
90 b(c(165)) = 0: c(165) = 0
1650 Next j165
b(c(10)) = 0: c(10) = 0
100 b(c(166)) = 0: c(166) = 0
1660 Next j166
b(c(11)) = 0: c(11) = 0
110 b(c(167)) = 0: c(167) = 0
1670 Next j167
b(c(12)) = 0: c(12) = 0
120 b(c(168)) = 0: c(168) = 0
1680 Next j168
b(c(1)) = 0: c(1) = 0
10 b(c(169)) = 0: c(169) = 0
1690 Next j169
n10 = 0: Erase b, c
1500 Next j100
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine Priem13f")
End
' Fill Print Area a15()
2700 Erase a15
a15(17) = a13(1): a15(18) = a13(2): a15(19) = a13(3): a15(20) = a13(4): a15(21) = a13(5):
a15(22) = a13(6): a15(23) = a13(7): a15(24) = a13(8): a15(25) = a13(9): a15(26) = a13(10):
a15(27) = a13(11): a15(28) = a13(12): a15(29) = a13(13):
a15(32) = a13(14): a15(33) = a13(15): a15(34) = a13(16): a15(35) = a13(17): a15(36) = a13(18):
a15(37) = a13(19): a15(38) = a13(20): a15(39) = a13(21): a15(40) = a13(22): a15(41) = a13(23):
a15(42) = a13(24): a15(43) = a13(25): a15(44) = a13(26):
a15(47) = a13(27): a15(48) = a13(28): a15(49) = a13(29): a15(50) = a13(30): a15(51) = a13(31):
a15(52) = a13(32): a15(53) = a13(33): a15(54) = a13(34): a15(55) = a13(35): a15(56) = a13(36):
a15(57) = a13(37): a15(58) = a13(38): a15(59) = a13(39):
a15(62) = a13(40): a15(63) = a13(41): a15(64) = a13(42): a15(65) = a13(43): a15(66) = a13(44):
a15(67) = a13(45): a15(68) = a13(46): a15(69) = a13(47): a15(70) = a13(48): a15(71) = a13(49):
a15(72) = a13(50): a15(73) = a13(51): a15(74) = a13(52):
a15(77) = a13(53): a15(78) = a13(54): a15(79) = a13(55): a15(80) = a13(56): a15(81) = a13(57):
a15(82) = a13(58): a15(83) = a13(59): a15(84) = a13(60): a15(85) = a13(61): a15(86) = a13(62):
a15(87) = a13(63): a15(88) = a13(64): a15(89) = a13(65):
a15(92) = a13(66): a15(93) = a13(67): a15(94) = a13(68): a15(95) = a13(69): a15(96) = a13(70):
a15(97) = a13(71): a15(98) = a13(72): a15(99) = a13(73): a15(100) = a13(74): a15(101) = a13(75):
a15(102) = a13(76): a15(103) = a13(77): a15(104) = a13(78):
a15(107) = a13(79): a15(108) = a13(80): a15(109) = a13(81): a15(110) = a13(82): a15(111) = a13(83):
a15(112) = a13(84): a15(113) = a13(85): a15(114) = a13(86): a15(115) = a13(87): a15(116) = a13(88):
a15(117) = a13(89): a15(118) = a13(90): a15(119) = a13(91):
a15(122) = a13(92): a15(123) = a13(93): a15(124) = a13(94): a15(125) = a13(95): a15(126) = a13(96):
a15(127) = a13(97): a15(128) = a13(98): a15(129) = a13(99): a15(130) = a13(100): a15(131) = a13(101):
a15(132) = a13(102): a15(133) = a13(103): a15(134) = a13(104):
a15(137) = a13(105): a15(138) = a13(106): a15(139) = a13(107): a15(140) = a13(108): a15(141) = a13(109):
a15(142) = a13(110): a15(143) = a13(111): a15(144) = a13(112): a15(145) = a13(113): a15(146) = a13(114):
a15(147) = a13(115): a15(148) = a13(116): a15(149) = a13(117):
a15(152) = a13(118): a15(153) = a13(119): a15(154) = a13(120): a15(155) = a13(121): a15(156) = a13(122):
a15(157) = a13(123): a15(158) = a13(124): a15(159) = a13(125): a15(160) = a13(126): a15(161) = a13(127):
a15(162) = a13(128): a15(163) = a13(129): a15(164) = a13(130):
a15(167) = a13(131): a15(168) = a13(132): a15(169) = a13(133): a15(170) = a13(134): a15(171) = a13(135):
a15(172) = a13(136): a15(173) = a13(137): a15(174) = a13(138): a15(175) = a13(139): a15(176) = a13(140):
a15(177) = a13(141): a15(178) = a13(142): a15(179) = a13(143):
a15(182) = a13(144): a15(183) = a13(145): a15(184) = a13(146): a15(185) = a13(147): a15(186) = a13(148):
a15(187) = a13(149): a15(188) = a13(150): a15(189) = a13(151): a15(190) = a13(152): a15(191) = a13(153):
a15(192) = a13(154): a15(193) = a13(155): a15(194) = a13(156):
a15(197) = a13(157): a15(198) = a13(158): a15(199) = a13(159): a15(200) = a13(160): a15(201) = a13(161):
a15(202) = a13(162): a15(203) = a13(163): a15(204) = a13(164): a15(205) = a13(165): a15(206) = a13(166):
a15(207) = a13(167): a15(208) = a13(168): a15(209) = a13(169):
a15(8) = a(8): a15(106) = a(106): a15(120) = a(120): a15(218) = a(218):
Return
' Print results (selected numbers)
2645 For i1 = 1 To 225
Cells(n9, i1).Value = a15(i1)
Next i1
Cells(n9, 226).Value = n9
Return
' Print results (squares)
2650 n5 = n5 + 1
If n5 = 3 Then
n5 = 1: k1 = k1 + 16: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 16
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 15
For i2 = 1 To 15
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a15(i3)
Next i2
Next i1
Return
' Exclude solutions with identical numbers
1800 fl1 = 1
For j1 = 1 To 169
a2 = a13(j1): If a2 = 0 Then GoTo 1810
For j2 = (1 + j1) To 169
If a2 = a13(j2) Then fl1 = 0: Return
Next j2
1810 Next j1
Return
End Sub