Generating solutions to large sudokus

Given a 9x9 grid, divided into (nine non-overlapping) 3x3 subgrids, the objective is to fill each cell with digits D={1,...,9}D = \{1, ..., 9\} such that

  1. Each row contains every digit
  2. Each column contains every digit
  3. Each 3x3 subgrid contains every digit

The problem of solving a sudoku can be modelled as a satisfiability problem and solved as such by a SAT-solver. Let’s introduce a boolean variable for each digit in each cell, x1,1,1x_{1,1,1} x1,1,2x_{1,1,2} x1,1,3x_{1,1,3}

Or, more generally xd,i,jd,i,jD×D×D x_{d,i,j} \quad \forall d,i,j \in D \times D \times D That is, for a 9x9 sudoku there are 939^3 variables. A cell i,ji,j contains digit dd when xd,i,jx_{d,i,j} is true.

Now, to enforce the rules, we have to ensure that a cell contains exactly one digit. That means of all the variables in a cell, only one can be true and for each cell there has to be at least one variable which is true. If, say, the cell 2,3 contains digit 1, then this implies that cell 2,3 does not contain any other digit x1,2,3x2,2,3¯x3,2,3¯...x9,2,3¯ x_{1,2,3} \implies \overline{ x_{2,2,3} } \land \overline{x_{3,2,3} } \land ... \land \overline{ x_{9,2,3} } Similarly, if the cell contains any other digit. Generally, xd,i,jcD\dxc,i,j¯dDi,jD×D x_{d,i,j} \implies \bigwedge_{c \in D \setminus d} \overline{ x_{c,i,j} } \quad \forall d \in D \quad \forall i, j \in D \times D To ensure the second point, that at least one variable in cell 2,3 is true; x1,2,3x2,2,3x3,2,3...x9,2,3 x_{1,2,3} \lor x_{2,2,3} \lor x_{3,2,3} \lor ... \lor x_{9,2,3} Generally, dDxd,i,ji,jD×D\bigvee_{d \in D} x_{d,i,j} \quad \forall i,j \in D \times D

To implement the first rule, an approach similar to the above is followed where each row has only one variable true for each digit. For instance, x1,2,3x1,2,1¯x1,2,2¯x1,2,4¯..x1,2,9¯ x_{1,2,3} \implies \overline{ x_{1,2,1} } \land \overline{ x_{1,2,2} } \land \overline{ x_{1,2,4 } } \land .. \land \overline{ x_{1,2,9} } Generally, xd,i,jcD\jxd,i,c¯dDi,jD×D x_{d,i,j} \implies \bigwedge_{c \in D \setminus j} \overline{ x_{d,i,c} } \quad \forall d \in D \quad \forall i,j \in D \times D Very similarly this is done for the columns and subgrids. (omitted)

To make this digestible for a SAT-solver the problem has to be brought to conjunctive normal form, which consists of clauses anded together, where each clause is variables ored together. c1c2c3... c_1 \land c_2 \land c_3 \land ... Where each cc is of the form x1x2x3¯... x_1 \lor x_2 \lor \overline{ x_3} \lor ...

An implication of the type x1x2¯x3¯... x_1 \implies \overline{x_2} \land \overline{x_3} \land ... Can equivalenty be expressed as x1x2¯x1x3¯... x_1 \implies \overline{x2} \land x_1 \implies \overline{x_3} ... To get rid of the implications altogether, the following logical equivalency is used: pqp¯qp \implies q \iff \overline p \lor q. Thus (x1¯x2¯)(x1¯x3¯)... ( \overline{x_1} \lor \overline{x_2} ) \land ( \overline{x_1} \lor \overline{x_3} ) \land ...

The sudoku problem can be generalized to, not just 9, but any square number.

The following script generates a description of the dxddxd sudoku problem given a square number dd for a SAT-solver.

#!/usr/bin/env python3
import sys

def gen_clauses( n, d ):
    # ingen ens cifre vandret
    row_clause( n, range( d**2 ), range( 0, d**4, d**2 ) )
    
    # ingen ens cifre lodret
    row_clause( n, range( 0, d**4, d**2 ), range( d**2 ) )

    #ingen ens cifre i kasser
    r = [ j * d + i * d**3 for i in range( d ) for j in range( d ) ]
    a = [ i * d**2 + j for i in range( d ) for j in range( d ) ]
    row_clause( n, a, r )

def digit_clause( d ):
    # kun ét ciffer i hvert felt
    for i in range( d**4 ):
        impl( [ j*d**4+i for j in range(d**2) ] )

def fill_clause( d ):
    # der skal være et ciffer i hvert felt
    for i in range( d**4 ):
        for k in [ j*d**4+i for j in range(d**2) ]:
            print( k+1, end=" " )
        print( 0 )

def row_clause( n, a, r ):
    for i in r:
        impl( [ n+i+j for j in a ] )

def impl( r ):
    for i in r:
        for j in r:
            if i != j:
                print( "-{} -{} 0".format( i+1, j+1) )

def all_clauses( d ):
    for i in range( d**2 ):
        gen_clauses( d**4*i, d )
    digit_clause( d )
    fill_clause( d )

if __name__ == "__main__":
    all_clauses( int( sys.argv[1] ) )

Below are presented solutions to instances of the sudoku problem.

Time taken for computing sudokus up to and including 25x25 is in the order of seconds. 36x36 is in the order of minutes. 49x49 is in the order of hours and I was never able to finish computing a 64x64 sudoku having run out of memory after running for 5 days. How a 64x64 sudoku looks like is left as an exercise for the reader.



16x16

0 c 6 7 4 d b f 1 9 3 2 8 e 5 a
2 b 1 5 e 6 7 0 d 8 a c 9 f 3 4
9 d 8 f a c 5 3 4 b 6 e 1 2 7 0
e a 4 3 1 2 8 9 5 f 0 7 b 6 d c
1 2 7 a 5 f 6 4 9 c e 3 d 0 8 b
b 3 e 6 d 8 2 1 0 a 7 f 4 c 9 5
c 5 9 4 0 b 3 a 8 1 2 d e 7 6 f
f 8 0 d 7 e 9 c b 5 4 6 2 3 a 1
7 e a b c 1 4 d 2 3 8 5 f 9 0 6
3 4 5 2 6 9 0 8 7 d f b a 1 c e
6 9 d 0 f 5 a 2 e 4 c 1 7 8 b 3
8 1 f c b 3 e 7 6 0 9 a 5 d 4 2
a f 2 8 3 4 d e c 6 5 9 0 b 1 7
4 7 b 9 2 0 c 5 3 e 1 8 6 a f d
d 0 3 e 9 a 1 6 f 7 b 4 c 5 2 8
5 6 c 1 8 7 f b a 2 d 0 3 4 e 9
3 7 0 a f 1 9 b 6 8 2 c d 5 4 e
c 5 e b 2 7 d 3 a 4 0 9 f 1 6 8
6 4 8 f 0 c e 5 d 7 1 b 2 3 a 9
2 1 d 9 6 8 a 4 3 5 f e 0 c b 7
b 3 f 7 1 d 8 6 9 e 4 a c 2 5 0
4 0 9 e b f 2 a c 3 5 8 6 7 1 d
a 8 c 6 5 4 0 7 1 2 d f 3 e 9 b
1 d 2 5 3 e c 9 7 0 b 6 8 4 f a
9 e a 0 7 2 5 1 8 6 3 d 4 b c f
d 6 b 1 c 3 f e 5 9 a 4 7 8 0 2
f c 4 3 8 a b 0 e 1 7 2 9 6 d 5
5 2 7 8 4 9 6 d b f c 0 1 a e 3
8 9 1 2 e b 7 c f d 6 5 a 0 3 4
e b 3 d a 6 4 2 0 c 9 7 5 f 8 1
7 a 5 c 9 0 1 f 4 b 8 3 e d 2 6
0 f 6 4 d 5 3 8 2 a e 1 b 9 7 c
f e 2 8 3 4 7 9 5 d 6 1 0 a c b
5 d 9 7 b 1 a 6 0 c 2 3 4 f e 8
c 0 b a d 8 f 5 e 9 4 7 1 2 6 3
4 3 6 1 e 2 c 0 8 b f a 9 7 d 5
9 f 1 0 c a 4 e 3 2 d b 8 5 7 6
8 4 5 2 1 9 0 3 7 6 c f d b a e
d c 7 6 f 5 b 8 9 4 a e 3 1 0 2
e a 3 b 6 7 d 2 1 5 0 8 c 9 f 4
6 7 f e 9 c 8 4 a 1 3 2 5 0 b d
a 8 4 c 2 b 5 1 d 0 9 6 f e 3 7
b 2 d 9 0 e 3 f c 7 8 5 a 6 4 1
3 1 0 5 a d 6 7 f e b 4 2 c 8 9
2 5 e d 8 f 1 b 4 a 7 c 6 3 9 0
7 b c 3 4 0 2 d 6 f 1 9 e 8 5 a
1 6 a 4 5 3 9 c b 8 e 0 7 d 2 f
0 9 8 f 7 6 e a 2 3 5 d b 4 1 c

25x25

18 23 14 24 21 07 09 03 08 19 22 04 20 11 00 15 05 10 12 16 01 02 17 13 06
22 03 16 19 11 00 01 17 10 04 07 23 24 13 02 20 21 09 06 08 05 18 12 14 15
08 01 05 00 12 16 23 24 18 15 10 06 14 21 17 13 19 02 11 04 07 20 09 22 03
20 06 10 04 07 12 11 05 02 13 08 01 15 09 03 17 18 00 22 14 24 19 21 23 16
13 17 02 15 09 06 22 14 21 20 05 12 18 16 19 03 01 07 23 24 00 04 08 10 11
23 14 00 13 16 15 21 19 11 07 03 22 09 12 24 18 08 04 17 06 02 01 20 05 10
01 09 12 03 17 10 05 02 22 06 23 18 04 07 13 16 14 15 19 20 11 08 24 21 00
21 02 04 18 06 01 24 00 13 23 19 20 16 15 08 07 10 11 09 05 03 22 14 12 17
15 11 20 05 22 14 17 08 04 09 06 02 10 00 01 24 03 12 21 13 19 07 18 16 23
24 19 07 08 10 03 12 16 20 18 21 17 11 05 14 23 02 01 00 22 13 15 06 04 09
06 20 09 17 14 11 08 10 03 02 12 00 07 22 21 19 13 16 05 15 04 24 23 18 01
19 10 01 11 04 23 20 09 00 14 15 13 08 03 06 21 22 18 24 12 17 05 16 02 07
02 07 15 22 03 21 06 18 19 12 01 16 17 24 05 04 09 14 10 23 20 11 13 00 08
16 00 23 12 08 05 13 04 24 01 18 11 19 14 10 02 17 20 07 03 09 06 22 15 21
05 18 24 21 13 17 16 15 07 22 04 09 02 23 20 00 11 06 08 01 14 03 10 19 12
12 05 22 16 20 08 18 21 06 11 00 03 23 02 04 14 07 17 15 09 10 13 19 01 24
14 08 11 02 24 22 04 12 17 10 16 21 13 01 09 06 20 03 18 19 23 00 15 07 05
09 21 03 07 00 19 14 23 05 24 20 15 22 17 18 01 12 13 04 10 06 16 11 08 02
04 15 17 01 19 13 07 20 16 00 14 10 05 06 11 08 24 23 02 21 22 12 03 09 18
10 13 18 06 23 09 02 01 15 03 24 19 12 08 07 22 00 05 16 11 21 14 04 17 20
03 24 06 23 02 18 15 11 12 05 13 14 21 10 22 09 16 19 01 00 08 17 07 20 04
07 22 13 10 18 24 19 06 01 17 09 08 00 04 12 11 15 21 20 02 16 23 05 03 14
17 12 08 20 01 04 00 22 09 16 11 05 03 19 15 10 23 24 14 07 18 21 02 06 13
00 16 21 09 05 02 03 07 14 08 17 24 06 20 23 12 04 22 13 18 15 10 01 11 19
11 04 19 14 15 20 10 13 23 21 02 07 01 18 16 05 06 08 03 17 12 09 00 24 22
04 22 03 06 24 08 13 17 12 18 20 16 14 19 01 00 23 21 07 09 15 05 10 02 11
02 14 17 07 19 21 03 10 24 20 15 05 06 23 08 04 12 11 16 01 13 22 00 09 18
01 21 16 20 12 05 22 09 02 04 11 17 18 00 10 13 15 06 19 14 23 03 07 08 24
18 11 23 08 00 15 07 19 01 06 12 09 24 13 21 02 03 22 10 05 04 17 14 16 20
10 15 09 05 13 14 23 00 11 16 22 07 03 04 02 24 17 08 20 18 19 01 06 21 12
21 10 15 22 18 09 17 07 04 13 01 11 23 08 14 20 24 03 02 06 00 12 05 19 16
00 16 20 03 06 02 14 23 08 22 17 12 13 24 19 10 05 01 15 11 21 09 18 07 04
05 04 24 23 17 01 00 21 18 19 03 02 10 06 07 12 08 09 22 16 14 15 11 20 13
13 12 02 01 09 16 10 15 06 11 04 22 20 05 00 19 18 14 21 07 03 23 17 24 08
14 07 08 19 11 12 20 24 05 03 09 15 21 16 18 17 00 23 04 13 06 02 22 01 10
03 09 10 12 01 00 18 11 07 15 13 08 22 02 04 16 20 17 14 21 05 06 24 23 19
08 05 00 24 14 23 19 04 13 10 07 21 01 18 09 15 06 12 11 03 20 16 02 17 22
23 13 19 18 22 17 08 06 16 21 10 00 12 15 20 07 01 24 05 02 11 14 04 03 09
16 20 06 04 07 22 24 02 14 12 05 23 11 17 03 09 13 00 08 19 18 10 01 15 21
17 02 11 21 15 03 05 01 20 09 16 06 19 14 24 23 04 10 18 22 12 07 08 13 00
06 00 14 11 03 20 12 05 21 24 19 01 15 09 22 08 07 18 13 17 02 04 16 10 23
12 17 05 02 23 18 11 16 15 14 24 10 07 21 13 01 19 04 09 00 22 08 20 06 03
07 18 04 09 21 06 02 22 03 17 14 20 08 12 16 11 10 05 23 15 24 13 19 00 01
24 01 22 15 08 10 09 13 19 00 02 04 05 03 23 21 14 16 06 20 17 11 12 18 07
20 19 13 10 16 07 04 08 23 01 00 18 17 11 06 03 22 02 24 12 09 21 15 14 05
15 23 07 13 10 11 06 18 09 02 21 19 00 22 05 14 16 20 01 04 08 24 03 12 17
09 06 18 17 04 19 16 12 10 07 23 24 02 20 15 05 11 13 03 08 01 00 21 22 14
19 03 12 14 02 24 01 20 17 05 08 13 09 07 11 22 21 15 00 10 16 18 23 04 06
11 08 21 00 20 04 15 03 22 23 18 14 16 01 17 06 09 07 12 24 10 19 13 05 02
22 24 01 16 05 13 21 14 00 08 06 03 04 10 12 18 02 19 17 23 07 20 09 11 15
14 18 13 07 12 02 15 09 05 24 04 06 08 16 20 21 11 03 17 10 22 01 19 00 23
21 01 03 00 10 06 18 14 12 07 13 15 02 17 22 24 23 19 05 16 08 11 09 04 20
23 05 24 09 04 16 20 01 13 08 11 21 03 19 00 22 12 14 06 18 10 15 17 02 07
11 20 15 16 19 03 17 23 00 22 01 10 12 07 05 02 08 13 09 04 24 06 14 18 21
17 22 08 06 02 10 21 19 04 11 23 24 18 09 14 07 15 20 01 00 12 16 05 13 03
05 10 02 08 20 09 11 06 21 01 00 07 22 13 04 23 03 15 16 24 17 14 18 19 12
18 16 22 03 21 07 05 17 14 23 12 09 10 01 11 13 19 02 04 06 20 08 00 15 24
00 13 12 17 24 15 08 04 22 02 16 03 14 18 19 11 10 21 20 07 23 09 06 01 05
09 06 04 11 23 13 19 18 10 16 05 17 15 20 24 14 00 01 08 12 21 02 03 07 22
01 07 19 15 14 24 03 00 20 12 08 02 23 21 06 09 17 05 18 22 11 13 04 16 10
04 08 10 05 16 17 01 21 02 19 20 13 07 14 12 03 24 23 15 09 00 18 22 06 11
02 00 21 14 11 05 24 22 15 18 09 01 06 10 23 04 07 16 13 19 03 20 08 12 17
07 12 20 24 03 00 14 13 23 06 18 16 04 15 17 08 21 11 22 05 19 10 02 09 01
22 19 06 18 09 11 16 10 07 03 21 08 00 05 02 01 20 12 14 17 15 04 24 23 13
15 17 23 01 13 04 12 20 08 09 22 11 19 24 03 10 06 18 00 02 07 21 16 05 14
12 11 07 13 00 23 06 02 18 17 10 19 20 22 01 05 09 08 21 14 04 03 15 24 16
10 15 18 04 22 19 13 11 03 21 24 05 09 00 16 06 02 17 12 01 14 23 07 20 08
03 09 01 19 08 14 07 16 24 05 06 23 17 04 21 20 18 00 10 15 13 12 11 22 02
24 21 14 20 05 08 10 15 09 00 03 12 13 02 07 16 22 04 23 11 06 19 01 17 18
06 02 16 23 17 20 22 12 01 04 14 18 11 08 15 19 13 07 24 03 09 05 21 10 00
20 03 17 22 07 12 04 08 16 10 19 14 21 06 18 15 01 24 02 13 05 00 23 11 09
13 04 11 12 06 18 23 24 19 20 02 22 01 03 08 00 05 09 07 21 16 17 10 14 15
08 24 09 21 15 01 00 05 17 14 07 20 16 11 13 18 04 10 19 23 02 22 12 03 06
19 14 05 02 18 21 09 03 06 15 17 00 24 23 10 12 16 22 11 20 01 07 13 08 04
16 23 00 10 01 22 02 07 11 13 15 04 05 12 09 17 14 06 03 08 18 24 20 21 19

36x36

28 18 32 07 35 17 02 30 34 27 06 14 19 25 09 08 12 26 00 29 04 31 33 23 21 22 05 16 03 01 24 15 11 13 20 10
10 14 12 26 27 16 19 15 01 22 25 33 20 04 05 34 13 02 21 09 30 28 07 32 11 08 24 23 17 29 00 03 31 18 35 06
04 08 15 01 03 24 00 10 20 28 29 26 33 16 32 23 17 30 34 02 06 11 14 18 35 31 13 25 19 12 07 27 09 22 05 21
20 31 29 23 33 21 09 18 16 24 05 11 15 03 14 06 35 00 10 22 13 08 19 12 27 02 30 07 32 28 25 34 04 26 17 01
11 34 02 25 22 00 08 04 32 35 13 17 27 31 07 21 18 28 01 24 26 05 15 03 14 33 06 09 20 10 16 29 23 19 12 30
06 09 05 13 19 30 21 23 31 12 07 03 29 01 11 22 10 24 17 20 35 16 27 25 04 26 15 18 34 00 08 33 02 28 14 32
15 22 08 05 17 29 34 32 35 11 12 00 24 18 01 02 06 14 20 10 16 23 03 28 13 07 27 19 04 09 30 21 26 25 33 31
02 00 21 18 01 32 13 24 09 15 33 19 03 08 23 35 26 12 04 31 07 06 30 27 10 25 29 22 16 20 17 28 05 34 11 14
16 33 11 31 06 34 20 28 10 18 03 04 05 22 30 25 27 21 24 26 00 35 02 13 08 14 32 17 15 23 09 01 12 07 29 19
23 12 26 10 20 09 25 27 07 14 01 16 11 34 28 17 04 31 32 33 29 19 21 22 00 05 03 30 35 18 15 02 13 24 06 08
27 13 25 24 04 19 05 26 29 30 17 08 07 33 15 16 32 20 18 01 14 09 34 11 28 06 12 21 31 02 35 00 03 10 22 23
30 28 03 35 14 07 22 02 06 31 21 23 10 13 00 29 09 19 15 08 12 25 05 17 01 34 33 11 24 26 18 32 20 16 27 04
07 32 23 22 24 26 01 12 30 16 11 05 06 20 19 15 28 18 35 13 08 00 17 04 29 10 31 34 02 14 27 25 21 09 03 33
09 21 04 03 25 01 18 34 22 33 23 31 14 11 27 10 00 17 16 07 28 24 32 29 05 15 20 06 26 35 13 30 19 08 02 12
34 20 14 30 00 02 10 13 19 17 15 32 09 21 29 31 08 25 27 05 22 26 12 33 23 11 18 24 07 03 28 35 06 01 04 16
29 19 28 08 16 12 35 20 21 00 04 24 26 05 03 33 22 23 06 14 01 02 18 15 09 30 25 32 27 13 31 17 34 11 10 07
33 05 10 27 18 11 06 03 26 02 08 29 30 35 04 13 24 07 25 21 09 34 20 31 17 19 01 12 28 16 32 14 00 23 15 22
31 17 13 06 15 35 27 14 25 07 28 09 02 32 12 01 16 34 03 23 11 30 10 19 22 00 08 33 21 04 20 26 24 05 18 29
13 25 31 09 10 05 30 35 18 01 16 07 12 00 34 19 23 22 02 15 21 20 04 06 32 27 11 03 08 33 29 24 14 17 26 28
08 06 01 34 32 33 31 22 24 03 20 12 17 14 02 11 15 04 23 00 19 13 28 09 26 18 16 29 25 21 05 07 10 35 30 27
35 11 07 04 21 27 28 00 33 26 19 15 16 29 25 20 05 10 30 18 17 01 24 08 12 23 02 31 14 06 22 09 32 03 13 34
22 29 18 14 30 15 04 21 17 10 09 27 31 24 06 26 01 33 11 32 34 03 25 05 07 28 00 35 13 19 12 23 16 20 08 02
24 02 16 00 26 28 14 08 05 23 34 06 18 27 13 32 03 35 22 12 31 10 29 07 20 17 04 15 09 30 21 19 01 33 25 11
17 03 19 12 23 20 11 29 13 32 02 25 28 09 21 30 07 08 33 35 27 14 26 16 24 01 22 10 05 34 04 18 15 06 31 00
18 27 00 21 07 10 03 06 11 09 35 02 25 15 17 28 29 01 13 04 32 22 16 26 30 12 34 05 23 31 19 08 33 14 24 20
32 35 20 11 05 25 15 19 23 08 30 18 04 26 22 00 14 06 07 03 02 12 09 34 16 29 17 28 33 24 10 31 27 21 01 13
14 26 30 33 02 22 24 31 27 05 10 20 35 19 18 12 34 32 28 25 23 29 08 00 15 21 09 13 01 11 03 06 07 04 16 17
19 15 17 29 34 23 33 01 14 21 22 28 13 07 16 09 20 05 31 11 18 27 06 24 03 04 35 26 10 08 02 12 30 00 32 25
01 04 06 28 12 31 07 16 00 29 26 13 08 30 10 24 33 03 05 17 20 21 35 14 25 32 19 02 22 27 23 11 18 15 34 09
03 24 09 16 13 08 12 17 04 25 32 34 23 02 31 27 21 11 19 30 33 15 01 10 06 20 14 00 18 07 26 22 35 29 28 05
00 07 34 19 29 04 17 11 03 20 14 21 22 12 24 05 25 15 26 28 10 33 31 30 18 16 23 27 06 32 01 13 08 02 09 35
12 01 22 32 31 03 16 05 02 04 18 10 00 06 26 07 11 09 08 34 25 17 23 35 19 13 28 14 30 15 33 20 29 27 21 24
26 16 35 02 08 18 32 25 12 34 00 30 01 28 20 03 19 27 14 06 24 07 13 21 33 09 10 04 29 22 11 05 17 31 23 15
21 30 27 15 28 14 23 09 08 13 24 35 34 10 33 18 02 16 29 19 05 32 22 20 31 03 07 01 11 17 06 04 25 12 00 26
25 10 24 17 09 06 29 33 15 19 31 22 21 23 08 14 30 13 12 27 03 04 11 01 02 35 26 20 00 05 34 16 28 32 07 18
05 23 33 20 11 13 26 07 28 06 27 01 32 17 35 04 31 29 09 16 15 18 00 02 34 24 21 08 12 25 14 10 22 30 19 03
16 27 32 24 17 18 34 21 35 04 20 30 25 09 05 03 26 14 29 01 33 12 22 08 31 10 07 00 23 02 19 11 06 13 28 15
23 30 33 09 22 05 00 02 17 07 10 25 11 08 29 35 15 06 03 28 27 31 21 04 34 01 12 13 20 19 24 32 26 14 16 18
10 31 21 19 11 13 05 23 26 33 32 15 16 22 01 12 02 24 20 00 35 14 30 25 28 04 17 06 27 18 29 03 08 09 34 07
08 26 34 15 01 07 14 13 31 06 22 27 10 00 28 19 04 21 05 23 24 18 16 09 03 32 29 11 25 35 02 17 20 12 33 30
29 00 02 14 35 25 03 12 28 11 09 18 07 20 23 13 30 33 17 32 19 06 15 34 24 21 16 08 05 26 27 31 22 01 10 04
12 20 28 03 04 06 01 19 16 29 08 24 34 27 17 32 31 18 02 07 10 11 26 13 22 33 15 30 09 14 25 21 00 05 23 35
32 35 16 28 00 31 18 22 09 02 23 20 08 11 24 05 27 25 01 10 26 03 17 29 13 07 04 14 21 12 34 30 33 06 15 19
14 12 09 17 33 04 08 31 00 01 27 35 02 28 13 06 18 23 15 25 32 07 11 20 30 26 19 24 34 16 21 05 29 10 03 22
13 24 19 22 27 10 15 17 34 05 03 11 01 21 20 14 00 30 16 33 06 08 09 12 35 25 32 28 29 23 26 04 07 02 18 31
26 07 20 23 25 21 12 04 33 24 06 28 22 32 31 29 03 15 34 30 14 19 02 05 11 18 09 01 10 17 16 13 35 00 08 27
06 08 03 11 15 34 13 29 21 30 25 26 19 35 07 10 12 16 23 18 00 28 04 24 27 05 02 22 31 33 09 14 01 20 32 17
18 01 05 29 30 02 32 10 14 16 07 19 09 04 33 26 34 17 22 21 31 27 13 35 08 06 00 20 03 15 12 23 25 28 24 11
30 14 07 13 29 32 11 05 03 20 17 23 26 33 35 34 28 31 08 09 04 25 18 10 21 22 24 19 06 01 15 00 27 16 02 12
21 15 23 05 28 08 27 33 30 32 31 29 12 06 04 22 01 09 14 17 02 34 19 16 25 00 13 18 35 07 10 20 11 03 26 24
11 25 27 35 20 26 09 16 15 14 04 34 24 29 00 21 10 03 28 22 01 23 07 06 32 08 30 12 02 31 05 19 18 33 17 13
19 33 22 31 16 09 28 35 10 12 18 06 13 25 15 30 14 02 26 20 05 24 00 11 17 34 27 29 04 03 23 07 21 32 01 08
17 18 04 06 02 00 24 26 01 19 21 08 05 23 27 11 20 07 35 12 03 13 29 32 33 14 28 16 15 10 31 22 34 30 25 09
01 03 10 34 12 24 02 25 07 13 00 22 17 19 16 18 08 32 33 27 15 30 31 21 23 09 26 05 11 20 04 28 14 29 35 06
27 17 06 18 23 15 33 30 19 08 05 32 21 01 02 28 13 11 09 35 25 20 10 00 07 03 22 34 24 29 14 16 12 04 31 26
09 11 35 12 07 22 29 03 20 27 15 21 04 05 25 24 23 10 19 13 16 26 33 18 14 28 31 32 08 30 00 01 02 17 06 34
20 16 24 04 03 01 17 00 11 31 26 02 32 12 09 07 06 34 30 05 22 21 14 27 15 23 25 10 18 13 33 08 28 35 19 29
05 29 30 32 26 19 10 14 25 34 24 04 27 15 03 31 33 35 07 08 11 17 28 02 12 16 06 09 01 00 22 18 13 21 20 23
34 02 00 08 13 33 22 01 06 09 28 07 29 14 18 16 19 26 04 31 12 32 23 03 05 27 20 35 17 21 30 15 10 24 11 25
25 10 31 21 14 28 16 18 23 35 13 12 00 30 22 20 17 08 24 06 34 29 01 15 02 19 11 26 33 04 32 09 03 07 27 05
28 09 14 33 32 29 04 06 18 25 16 03 30 13 19 17 21 22 31 34 08 15 27 07 10 20 01 02 26 05 35 24 23 11 12 00
15 13 17 02 05 23 35 27 08 10 34 14 18 24 12 00 29 20 25 19 28 04 32 33 16 11 21 07 30 06 03 26 31 22 09 01
31 04 11 16 24 35 19 32 13 22 29 00 15 03 06 33 25 01 21 26 18 02 05 23 09 12 08 17 14 34 28 10 30 27 07 20
22 21 12 26 34 27 30 11 05 15 02 31 14 10 08 09 07 28 06 03 20 01 35 17 04 29 23 25 00 24 18 33 16 19 13 32
00 19 01 25 10 20 23 07 12 26 33 17 31 16 32 27 35 04 11 14 29 09 24 30 18 13 03 15 28 22 08 06 05 34 21 02
03 06 08 07 18 30 20 28 24 21 01 09 23 34 26 02 11 05 00 16 13 10 12 22 19 31 35 33 32 27 17 25 04 15 29 14
04 34 15 27 21 16 31 24 02 03 19 13 33 17 11 01 05 00 18 29 09 35 25 14 06 30 10 23 07 08 20 12 32 26 22 28
24 22 25 30 31 12 07 34 27 18 11 16 06 26 10 08 32 29 13 02 21 05 20 28 00 17 33 04 19 09 01 35 15 23 14 03
02 23 13 20 06 14 21 15 29 00 35 33 28 18 30 25 09 19 12 04 07 22 08 26 01 24 34 03 16 32 11 27 17 31 05 10
35 05 18 00 08 11 26 09 32 23 12 01 03 07 34 04 24 27 10 15 17 33 06 31 20 02 14 21 22 28 13 29 19 25 30 16
07 28 29 10 19 03 25 20 22 17 14 05 35 31 21 23 16 13 32 24 30 00 34 01 26 15 18 27 12 11 06 02 09 08 04 33
33 32 26 01 09 17 06 08 04 28 30 10 20 02 14 15 22 12 27 11 23 16 03 19 29 35 05 31 13 25 07 34 24 18 00 21
24 12 28 16 34 14 00 25 29 05 11 03 06 10 31 19 15 02 01 20 30 32 08 23 22 17 04 09 33 21 13 26 07 35 18 27
04 06 23 30 25 01 15 34 17 33 20 09 32 21 07 00 27 13 14 11 24 05 31 18 35 26 16 03 12 19 28 22 10 29 08 02
00 29 08 18 22 07 31 28 35 27 21 19 03 26 30 23 04 14 09 16 10 15 34 02 06 01 11 13 32 20 17 05 12 25 33 24
31 10 03 09 15 32 08 06 30 04 07 23 11 25 28 05 12 33 35 13 17 26 21 22 18 02 00 27 29 24 20 34 14 16 01 19
26 35 13 05 33 21 18 02 24 10 32 12 20 34 01 16 22 17 04 29 00 07 19 27 14 08 23 25 28 15 06 11 03 31 30 09
27 20 19 17 02 11 26 22 16 01 14 13 09 18 08 35 29 24 33 28 03 25 06 12 31 34 10 30 05 07 00 23 04 32 15 21
06 28 34 15 17 09 14 12 05 22 18 10 31 35 25 11 08 01 03 32 23 04 16 30 27 21 24 02 07 13 33 00 19 26 29 20
02 18 31 12 04 19 07 08 27 35 13 24 29 06 22 34 23 26 00 17 33 10 15 14 01 28 09 20 16 32 30 25 21 05 11 03
35 07 20 21 23 16 29 04 03 17 25 01 13 30 15 33 05 18 28 06 02 31 27 08 00 19 22 26 14 11 10 24 09 12 32 34
33 27 32 24 00 10 28 30 06 26 23 11 17 16 02 20 21 09 13 01 19 12 22 25 34 29 05 08 03 04 35 15 31 14 07 18
11 05 29 14 03 08 32 31 33 15 09 02 19 00 12 27 28 07 18 21 34 20 26 24 25 10 35 17 06 30 04 01 22 23 16 13
22 13 25 26 01 30 20 00 21 34 19 16 14 03 10 04 24 32 07 35 11 29 05 09 23 15 18 33 31 12 02 08 27 06 28 17
19 26 18 27 29 05 30 21 25 31 28 33 01 23 06 17 16 12 24 22 09 14 32 35 02 07 08 15 13 34 11 10 00 03 20 04
32 09 17 01 13 31 34 26 12 02 00 06 05 11 35 03 30 28 10 18 16 23 07 29 19 33 14 04 20 25 24 21 15 27 22 08
14 02 04 28 24 23 01 27 11 32 22 05 15 13 19 26 09 21 08 25 20 34 03 33 16 00 31 10 17 06 18 12 29 07 35 30
07 16 15 34 11 12 19 35 14 08 24 20 02 29 04 22 25 10 31 00 01 21 13 05 09 30 27 32 18 03 26 33 06 17 23 28
10 22 00 06 35 03 23 29 15 09 04 18 07 27 20 08 33 31 02 30 28 19 11 17 24 12 26 05 21 01 32 14 16 34 13 25
08 33 30 25 21 20 03 10 13 07 16 17 34 24 18 14 32 00 26 15 12 27 04 06 11 22 28 35 23 29 01 19 02 09 05 31
16 31 24 08 06 34 09 20 10 23 29 32 35 19 13 25 17 05 12 14 21 00 28 01 03 18 07 22 15 33 27 02 30 04 26 11
25 03 26 02 32 29 11 19 07 00 27 22 33 14 09 12 06 15 23 31 04 24 18 13 30 20 34 28 01 35 08 16 17 10 21 05
05 30 33 20 19 28 13 16 01 06 12 21 18 04 03 24 11 22 32 27 25 09 02 15 26 14 17 29 10 08 07 31 23 00 34 35
23 14 12 13 07 35 02 24 28 25 31 34 26 01 21 10 00 30 05 08 22 03 17 20 04 32 19 11 27 16 15 06 33 18 09 29
09 00 21 22 18 27 33 15 08 30 17 04 28 20 29 32 07 23 16 34 35 11 10 26 05 06 12 31 25 02 19 13 01 24 03 14
01 17 11 04 10 15 35 14 18 03 05 26 16 31 27 02 34 08 06 33 07 30 29 19 13 09 21 23 24 00 12 32 20 28 25 22
12 34 14 07 27 02 04 01 31 18 03 25 24 33 26 29 19 06 17 10 05 08 30 32 15 13 20 21 09 23 22 35 28 11 00 16
13 15 06 03 26 18 22 05 34 19 30 29 00 32 17 28 01 04 11 12 27 33 24 21 07 25 02 16 35 14 23 09 08 20 31 10
29 11 09 32 28 00 06 33 26 21 35 07 10 12 16 13 14 20 25 04 31 18 23 03 17 27 01 24 08 22 05 30 34 02 19 15
30 01 22 19 20 24 12 11 09 28 10 08 21 02 23 18 31 27 29 26 15 35 14 16 33 03 06 00 34 05 25 17 32 13 04 07
17 23 16 35 31 04 24 13 00 20 02 14 08 15 05 07 03 25 34 09 06 22 01 28 12 11 32 19 30 10 29 18 26 21 27 33
21 25 05 10 08 33 17 32 23 16 15 27 22 09 34 30 35 11 20 19 13 02 00 07 28 31 29 18 04 26 14 03 24 01 06 12
34 21 10 31 30 17 05 09 20 24 33 28 23 08 11 15 26 16 27 02 14 01 25 00 29 04 13 06 22 18 03 07 35 19 12 32
03 08 27 11 14 06 25 07 04 29 01 35 30 05 00 09 20 19 15 23 18 16 12 31 32 24 33 34 02 17 21 28 13 22 10 26
20 19 07 29 12 26 16 18 22 11 06 30 25 28 32 01 02 03 21 24 08 13 09 34 10 35 15 14 00 27 31 04 05 33 17 23
28 24 35 00 09 13 10 17 02 12 34 15 04 22 33 21 18 29 19 05 32 06 20 11 08 23 03 07 26 31 16 27 25 30 14 01
18 04 01 33 05 25 21 23 32 14 08 31 27 07 24 06 13 34 22 03 26 17 35 10 20 16 30 12 19 28 09 29 11 15 02 00
15 32 02 23 16 22 27 03 19 13 26 00 12 17 14 31 10 35 30 07 29 28 33 04 21 05 25 01 11 09 34 20 18 08 24 06

49x49

28 11 05 47 48 00 21 24 32 12 13 38 15 07 37 18 42 45 44 09 39 22 40 36 19 01 34 41 43 04 10 03 16 35 46 17 29 31 20 23 33 14 25 30 08 27 02 06 26
39 06 07 04 27 44 10 46 01 21 18 02 45 28 22 16 38 36 26 30 48 23 12 37 13 17 24 20 15 40 31 33 41 14 42 35 11 25 08 00 32 43 47 29 19 09 34 05 03
34 36 29 26 20 45 32 31 05 06 43 08 25 09 40 14 04 23 07 17 21 47 33 27 35 10 48 16 18 11 13 22 02 19 38 41 28 30 03 46 15 37 42 44 24 01 39 12 00
01 03 30 13 37 22 23 42 44 48 04 40 26 34 31 24 08 20 11 28 46 14 25 39 07 43 05 38 17 21 36 29 00 45 32 06 09 02 47 27 19 12 16 18 10 15 41 33 35
14 42 33 09 46 19 31 30 11 22 27 36 37 03 13 12 41 35 25 15 10 00 02 44 45 21 29 04 26 39 34 47 28 06 08 24 48 38 16 18 05 01 43 32 07 20 17 23 40
15 12 02 41 35 43 38 16 19 39 29 14 23 17 05 00 34 33 03 01 47 06 08 46 26 32 42 18 25 48 09 27 20 30 24 04 10 40 44 22 07 36 37 21 28 45 31 13 11
24 25 18 16 40 17 08 41 35 00 47 20 33 10 43 32 29 06 27 02 19 09 30 28 15 11 03 31 05 01 44 23 12 37 07 21 39 42 13 26 45 34 46 48 36 22 04 14 38
02 23 32 45 09 08 46 00 41 37 05 29 13 31 34 01 35 24 06 38 07 30 44 04 11 19 20 40 47 25 22 10 27 36 48 18 17 03 43 14 28 39 26 33 21 12 15 16 42
48 07 35 17 39 26 16 03 23 36 25 43 10 12 00 47 32 08 19 21 15 01 24 05 14 09 38 13 28 18 06 40 29 42 33 30 44 46 34 45 22 31 04 20 27 11 37 41 02
33 31 03 43 00 38 37 18 04 14 20 01 32 24 26 27 40 28 29 10 09 34 36 47 02 16 08 22 11 13 23 17 46 41 30 05 21 07 12 06 42 15 35 45 25 44 48 19 39
21 29 44 12 42 20 41 15 26 46 48 30 07 02 11 45 16 22 39 36 18 25 31 17 27 23 06 10 14 37 03 01 24 04 19 33 35 47 00 32 40 13 05 28 38 08 09 34 43
18 19 40 34 30 47 01 09 17 16 33 06 38 21 46 48 23 05 14 25 42 29 28 43 00 15 41 37 35 02 45 44 26 39 12 10 20 08 24 11 27 04 22 03 13 31 36 32 07
04 28 10 25 24 15 11 35 42 08 40 27 47 22 41 02 44 13 31 37 43 33 45 12 21 03 39 32 38 00 05 20 07 09 34 26 01 48 23 36 16 19 14 46 18 30 06 29 17
22 13 27 14 06 05 36 34 39 19 45 28 11 44 04 03 33 30 12 20 17 46 07 26 48 42 18 35 16 15 08 43 32 31 21 25 38 29 41 37 09 02 40 47 00 24 23 10 01
16 37 45 29 33 24 44 01 20 23 31 21 40 06 08 35 11 25 13 03 38 05 46 19 47 34 27 36 32 43 15 26 39 48 10 14 42 12 17 41 04 22 30 00 09 02 07 18 28
41 38 11 46 43 02 15 17 10 44 08 13 22 32 19 09 48 26 28 24 45 37 01 35 30 12 40 33 36 07 04 18 25 16 47 00 31 39 29 03 21 06 34 23 05 42 20 27 14
26 22 34 23 47 28 12 11 48 27 41 07 39 29 36 43 30 10 16 14 20 02 32 24 44 06 17 21 40 03 42 37 05 00 31 46 15 13 45 19 18 09 38 01 33 25 08 35 04
00 10 39 03 32 18 30 26 16 35 38 19 36 37 02 29 31 12 17 06 01 11 41 42 23 48 04 07 34 45 33 21 09 20 14 08 40 28 27 05 25 24 44 13 15 43 47 22 46
17 04 25 19 31 14 13 28 47 34 30 24 09 18 23 37 00 07 42 05 33 15 38 20 39 08 16 43 46 27 12 02 01 22 29 36 26 35 48 10 44 32 03 41 06 40 11 45 21
42 48 20 01 08 21 27 02 15 04 14 05 00 25 39 44 46 40 18 32 22 26 29 13 09 28 45 03 06 19 41 35 30 24 11 47 07 43 33 34 38 23 17 31 37 10 16 36 12
40 35 06 07 36 09 05 12 45 43 42 03 46 33 47 21 27 34 15 04 41 18 10 00 31 22 25 14 44 08 28 13 38 17 23 16 02 20 01 30 37 11 48 39 26 32 19 24 29
47 30 19 22 10 32 35 33 38 13 37 46 44 01 18 28 09 04 20 08 23 03 39 25 17 07 43 48 00 31 29 41 15 12 40 45 14 06 05 24 02 16 36 27 42 26 21 11 34
08 45 17 18 41 36 42 48 02 26 06 22 29 20 32 46 47 38 30 11 16 19 09 21 24 13 35 05 39 14 27 25 03 44 01 34 12 10 28 07 00 33 23 40 31 04 43 15 37
05 34 00 15 44 46 04 14 21 41 03 09 24 43 29 07 17 42 40 39 06 36 16 10 38 27 26 23 20 32 18 19 22 28 45 13 37 01 11 31 48 35 33 25 02 47 12 08 30
13 24 37 38 21 40 09 32 07 11 35 16 30 45 25 36 12 14 00 33 27 08 22 31 28 20 02 01 42 34 47 46 43 05 04 15 23 44 26 29 17 03 41 06 39 19 18 48 10
12 43 26 06 07 29 02 40 28 42 39 31 19 23 48 34 15 21 10 44 05 45 37 14 18 41 46 11 30 17 24 38 33 13 35 27 36 04 32 47 08 25 20 22 03 16 00 01 09
03 14 01 31 28 39 33 25 08 47 36 00 04 27 45 26 43 02 37 41 24 32 06 34 42 44 12 15 23 10 21 11 48 07 16 09 19 18 22 20 30 40 29 38 17 35 05 46 13
25 20 23 27 16 11 48 05 18 10 34 12 17 15 35 19 22 31 01 13 03 40 47 33 04 30 00 29 02 36 26 09 37 08 06 38 43 21 42 39 46 41 28 24 14 07 45 44 32
30 41 47 37 25 33 07 29 13 45 23 42 31 39 12 20 02 19 48 16 36 17 04 11 43 18 15 26 09 44 00 05 08 40 03 32 22 34 21 01 10 27 06 14 35 46 28 38 24
31 15 21 44 22 04 06 27 33 05 02 18 43 11 38 42 07 41 24 45 26 35 03 30 32 39 01 08 12 16 37 28 14 25 20 23 47 09 46 17 29 00 13 19 48 34 10 40 36
29 46 28 00 19 12 17 47 40 32 07 34 21 38 06 11 25 03 05 43 30 42 23 16 10 24 31 45 27 26 35 04 18 01 13 02 33 15 36 08 14 48 09 37 22 41 44 39 20
45 18 36 32 13 16 39 08 24 15 22 44 03 30 14 17 21 27 09 31 04 12 05 40 41 29 47 19 48 46 43 34 10 23 02 28 06 37 38 35 26 20 01 07 11 00 33 42 25
11 27 38 05 23 03 20 10 00 28 01 35 48 04 15 33 39 47 46 18 34 44 14 07 36 37 09 02 29 24 17 31 06 32 22 40 45 19 25 13 41 42 12 26 16 21 30 43 08
10 40 08 24 26 42 43 19 46 09 12 25 06 14 01 23 37 00 32 22 35 27 13 48 20 33 28 34 21 41 38 36 45 11 15 07 03 16 04 44 39 30 02 17 47 18 29 31 05
09 01 14 48 02 35 34 20 36 17 26 37 16 41 44 10 13 29 08 40 28 21 00 06 46 38 22 25 07 47 19 30 42 33 39 12 05 24 31 43 11 18 15 04 32 23 27 03 45
07 00 16 08 01 13 03 44 34 33 21 26 18 42 30 22 24 46 36 29 40 41 19 32 12 05 14 28 31 35 02 39 23 47 09 48 25 17 15 04 06 10 11 43 45 37 38 20 27
20 32 42 40 29 25 24 13 22 01 15 48 35 00 10 41 03 37 33 47 02 04 17 09 16 31 21 30 45 05 07 08 11 26 18 43 27 23 39 12 34 38 19 36 44 14 46 28 06
19 09 04 35 34 41 18 07 14 03 32 11 20 16 28 31 45 43 23 48 12 39 42 15 25 40 33 00 13 38 30 06 17 21 27 44 46 05 37 02 36 08 24 10 01 29 22 26 47
43 17 31 21 05 10 22 38 06 25 46 41 02 40 27 39 14 44 04 26 08 20 11 23 34 45 36 47 03 42 32 16 19 29 37 01 24 33 07 09 13 28 00 15 12 48 35 30 18
27 02 46 28 14 37 45 04 43 31 09 39 12 47 16 06 18 17 38 19 13 24 35 29 22 26 07 44 10 33 01 48 36 15 00 11 41 32 30 40 20 21 08 05 34 03 42 25 23
38 44 48 39 11 23 47 36 30 29 19 45 27 08 20 15 05 32 21 34 00 10 43 01 03 02 37 06 24 28 40 12 04 46 25 22 18 14 35 42 31 26 07 16 41 17 13 09 33
06 33 15 36 12 30 26 23 37 24 10 17 28 05 07 25 01 09 35 42 11 48 18 38 08 46 13 27 41 22 20 14 44 34 43 03 00 45 19 16 47 29 32 02 04 39 40 21 31
44 08 41 42 15 27 29 21 09 18 24 47 14 26 17 38 19 16 34 35 31 07 20 03 05 04 32 12 01 30 39 45 40 02 36 37 13 22 06 28 23 46 10 11 43 33 25 00 48
35 39 13 10 03 06 28 37 27 02 44 23 41 48 24 08 20 15 45 00 32 31 21 22 33 14 30 42 04 09 11 07 34 38 05 29 16 26 40 25 43 47 18 12 46 36 01 17 19
46 47 12 11 04 07 14 22 31 20 28 33 01 19 42 30 36 18 43 23 37 38 48 41 29 25 10 17 08 06 16 00 13 03 26 39 32 27 09 15 35 45 21 34 40 05 24 02 44
37 26 22 02 38 34 00 39 29 30 17 10 42 36 21 13 28 01 41 27 25 43 15 08 40 35 19 24 33 23 46 32 47 18 44 31 04 11 14 48 12 05 45 09 20 06 03 07 16
36 21 43 30 17 48 19 06 12 38 16 32 05 35 03 40 26 39 02 46 44 28 34 45 37 47 11 09 22 29 25 24 31 10 41 20 08 00 18 33 01 07 27 42 23 13 14 04 15
23 16 24 33 45 01 40 43 25 07 00 04 34 46 09 05 10 11 47 12 14 13 26 18 06 36 44 39 19 20 48 15 35 27 28 42 30 41 02 21 03 17 31 08 29 38 32 37 22
32 05 09 20 18 31 25 45 03 40 11 15 08 13 33 04 06 48 22 07 29 16 27 02 01 00 23 46 37 12 14 42 21 43 17 19 34 36 10 38 24 44 39 35 30 28 26 47 41