I give the listing of an example of enumeration program. This program is written in Basic for magic squares of order 3 (the algorithm is the same, whatever the order and the language). It is not optimized and has only a didactic interest.
The numbers 1 to 9 have to be put in a square. The magic constant is 15. It is well known that the number 5 is in the centre. Therefore, you need 2 parameters, for example A1=A and A2=B:
A | B | 15-A-B |
20-2*A-B | 5 | 2*A+B-10 |
A+B-5 | 10-B | 10-A |
The principle of the algorithm is explained in the page
Enumeration Programs, § 1.1.
10 REM MAGIC SQUARES OF ORDER 3
15 REM GENERAL ENUMERATION PROGRAM
20 REM 2 PARAMETERS A, B
25 CLS: DIM T(9): B2=5: T(5)=1
30:
35 REM FIRST PARAMETER A
40 FOR A=1 TO 9
45 A1=A: C3=10-A
50 IF T(A)=1 OR T(C3)=1 THEN 200
55 T(A)=1: T(C3)=1
60:
65 REM SECOND PARAMETER B
70 FOR B=1 TO 9
75 A2=B: C2=10-B: A3=15-A-B: C1=10-A3: B1=15-A-C1: B3=10-B1
80 IF A3< 1 OR A3> 9 OR B1< 1 OR B1> 9 THEN 190
85 IF T(B)=1 OR T(C2)=1 OR T(A3)=1 OR T(C1)=1 OR T(B1)=1 OR T(B3)=1 THEN 190
90 IF B=A3 OR B=C1 OR B=B1 OR B=B3 OR A3=B1 OR A3=B3 THEN 190
95:
100 REM RESULT
105 N=N+1
110 PRINT: PRINT N
115 PRINT A1,A2,A3
120 PRINT B1,B2,B3
125 PRINT C1,C2,C3
130:
190 NEXT B
195 T(A)=0: T(C3)=0
200 NEXT A
Result: 8 solutions
For B, you can calculate a lower boundary-stone IB (I as Inferior) and an upper boundary-stone SB (S as Superior) by conditions:
1< = A3 < =9 which give 1< = 15-A-B < =9 or 6-A < = B < =14-A
If you compare to 1< = B < =9, you have in Basic language:
If 1< 6-A then IB=6-A else IB=1
If 9< 14-A then SB=9 else SB=14-A
These boundary-stones IB and SB can be more improved if you write conditions 1< = B1 < =9.
You find:
1< = 20-2*A-B < =9 or 11-2*A < = B < = 19-2*A
In Basic, you create two new boundary-stones JB and TB:
If IB< 11-2*A then JB=11-2*A else JB=IB
If SB< 19-2*A then TB=SB else TB=19-2*A
Here is the improved program:
10 REM MAGIC SQUARES OF ORDER 3
15 REM GENERAL ENUMERATION PROGRAM
20 REM 2 PARAMETERS A, B
25 CLS: DIM T(9): B2=5: T(5)=1
30:
35 REM FIRST PARAMETER A
40 FOR A=1 TO 9
45 A1=A: C3=10-A
50 IF T(A)=1 OR T(C3)=1 THEN 200
55 T(A)=1: T(C3)=1
60:
65 REM SECOND PARAMETER B
66 IF 1< 6-A THEN IB=6-A: SB=9 ELSE IB=1: SB=14-A
67 IF IB< 11-2*A THEN JB=11-2*A ELSE JB=IB
68 IF SB< 19-2*A THEN TB=SB ELSE TB=19-2*A
69 IF JB> TB THEN 195
70 FOR B=
JB TO
TB
75 A2=B: C2=10-B: A3=15-A-B: C1=10-A3: B1=15-A-C1: B3=10-B1
80
85 IF T(B)=1 OR T(C2)=1 OR T(A3)=1 OR T(C1)=1 OR T(B1)=1 OR T(B3)=1 THEN 190
90 IF B=A3 OR B=C1 OR B=B1 OR B=B3 OR A3=B1 OR A3=B3 THEN 190
95:
100 REM RESULT
105 N=N+1
110 PRINT: PRINT N
115 PRINT A1,A2,A3
120 PRINT B1,B2,B3
125 PRINT C1,C2,C3
130:
190 NEXT B
195 T(A)=0: T(C3)=0
200 NEXT A
It should be possible to make also a "reduced program" (I call such a program a "reduced program/8") by application of group G of order 8.
The conditions should be for example:
A1 = minimum of {A1, A3, C1, C3} by vertical symmetry, horizontal symmetry and
symmetry about the centre,
A3 < C1 by reflection by the first diagonal.