Limits of magic squares

 

index.htm - Russian text.

MagicSquare2.zip   - outcomes of all supercompilations.

 

Let   M - magic quadrate composed from sequential natural numbers, since 1.

In this example we consider magic squares of an odd size dim, because the simple way of construction of such quadrate is used.

For dim=5 the way of construction is exhibited below. The table to the on - order on diagonals is constituted, then the outside numbers are shifted on free places.

 

        1        
      6   2      
    11   7   3    
  16   12   8   4  
21   17   13   9   5
  22   18   14   10  
    23   19   15    
      24   20      
        25        

 

11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15

 

 

Let s - sum of numbers on line, on column or on a diagonal.

Let's designate through   A   a matrix   M / s. For example, for quadrate 3 on 3 the matrix is received

4/15 9/15 2/15
3/15 5/15 7/15
8/15 1/15 6/15

 

Now we consider   a limit at   n,   tending to perpetuity, matrix A n .

The remark 1. If to divide not on s, in a limit is received or 0, or perpetuity. The proof - not so simple exercise at the rate algebra for the first course.

The remark 2. In the answer the matrix from identical units peer 1/dim is received.

We consider programs on the language Java,  

The limit for double precision is received already at 20 degree, but we do major cycle with the purpose to measure execution time.

At supercompilation of these programs the process of construction of magic quadrate completely specializes, that is the matrix is received as given.

From the point of view of supercompilation - the example is very good. The first site of programs, where there is a calculation of magic quadrate, - is completely displaced. On the second site from several nested cycles there is only one

In the present moment there are three programs for limits of magic squares (in the archived application MagicSquare2.zip accordingly three directories)

1. My program korlyukov.htm, which is more similar to the program on a FORTRAN, than on the program on Java.

2. The program Павла Чекина chekin.htm, which he has written, having seen the previous program.

3. Program  jama.htm, in which the package Jama is used

http://math.nist.gov/javanumerics/jama/

http://math.nist.gov/javanumerics/jama/Jama-1.0.1.zip

In the package Jama the functions of operation with matrixes are realized, as an example of usage of the package проиводится the program of construction of magic squares. Therefore program jama.htm was received compact.

All three programs is satisfactory supercompilation. The residual programs not so differ from each other.

In three directories of the application MagicSquare2.zip  everything is indicated, necessary for supercompilation both start-up to account of the initial and residual programs. In a subdirectory Res the outcomes of supercompilation for dim=5 are indicated.

Let's reduce the cumulative table (dim=5, iters=100 000)

 

  Korlyukov Chekin Jama
Time of supercompilation 11 сек 25 сек 9 сек
Execution time of the source program 0.661 0.63 1.170
Execution time of the residual program 0.12 0.11 0.54
Coefficient of acceleration 5.5 5.7 2.2

 

Outcome of supercompilation for dim=3 (Korlyukov)

//--------------------------------------   1 sec - postprocessing...
	public static double[][] test (final double[][] a_2)
	{
	  final double[] rr_7 = new double[3];
	  rr_7[0] = 0.26666666666666666D;
	  rr_7[1] = 0.2D;
	  rr_7[2] = 0.5333333333333333D;
	  for (int iiii_226 = 0; iiii_226 < MagicSquare.iter; iiii_226++) {
	    final double rr1_1_278 = rr_7[0] * 0.2D + rr_7[1] * 0.3333333333333333D + rr_7[2] * 0.4666666666666667D;
	    final double rr1_2_307 = rr_7[0] * 0.5333333333333333D + rr_7[1] * 0.06666666666666667D + rr_7[2] * 0.4D;
	    rr_7[0] = rr_7[0] * 0.26666666666666666D + rr_7[1] * 0.6D + rr_7[2] * 0.13333333333333333D;
	    rr_7[1] = rr1_1_278;
	    rr_7[2] = rr1_2_307;
	    continue;}
	  /*for*/
	  MagicSquare.res[0][0] = rr_7[0];
	  MagicSquare.res[0][1] = rr_7[1];
	  MagicSquare.res[0][2] = rr_7[2];
	  rr_7[0] = 0.6D;
	  rr_7[1] = 0.3333333333333333D;
	  rr_7[2] = 0.06666666666666667D;
	  for (int iiii_490 = 0; iiii_490 < MagicSquare.iter; iiii_490++) {
	    final double rr1_1_542 = rr_7[0] * 0.2D + rr_7[1] * 0.3333333333333333D + rr_7[2] * 0.4666666666666667D;
	    final double rr1_2_571 = rr_7[0] * 0.5333333333333333D + rr_7[1] * 0.06666666666666667D + rr_7[2] * 0.4D;
	    rr_7[0] = rr_7[0] * 0.26666666666666666D + rr_7[1] * 0.6D + rr_7[2] * 0.13333333333333333D;
	    rr_7[1] = rr1_1_542;
	    rr_7[2] = rr1_2_571;
	    continue;}
	  /*for*/
	  MagicSquare.res[1][0] = rr_7[0];
	  MagicSquare.res[1][1] = rr_7[1];
	  MagicSquare.res[1][2] = rr_7[2];
	  rr_7[0] = 0.13333333333333333D;
	  rr_7[1] = 0.4666666666666667D;
	  rr_7[2] = 0.4D;
	  for (int iiii_754 = 0; iiii_754 < MagicSquare.iter; iiii_754++) {
	    final double rr1_1_806 = rr_7[0] * 0.2D + rr_7[1] * 0.3333333333333333D + rr_7[2] * 0.4666666666666667D;
	    final double rr1_2_835 = rr_7[0] * 0.5333333333333333D + rr_7[1] * 0.06666666666666667D + rr_7[2] * 0.4D;
	    rr_7[0] = rr_7[0] * 0.26666666666666666D + rr_7[1] * 0.6D + rr_7[2] * 0.13333333333333333D;
	    rr_7[1] = rr1_1_806;
	    rr_7[2] = rr1_2_835;
	    continue;}
	  /*for*/
	  MagicSquare.res[2][0] = rr_7[0];
	  MagicSquare.res[2][1] = rr_7[1];
	  MagicSquare.res[2][2] = rr_7[2];
	  return MagicSquare.res;
	}
//--------------------------------------   3 sec - JScp version 0.0.75

Outcome of supercompilation for dim=3 (Chekin).

//--------------------------------------   2 sec - postprocessing...
	public static void main (final java.lang.String[] args_2)
	{
	  int i_1390 = 0;
	  WHILE_1391:
	  while (i_1390 < MagicSquareTest.iprint) {
	    final long startTime_1396 = java.lang.System.currentTimeMillis() /*static*/;
	    final double[][] m2_1537 = new double[3][3];
	    final double[][] m3_1541 = new double[3][3];
	    final double[] m2_0_1534 = m2_1537[0];
	    m2_0_1534[0] = 0.26666666666666666D;
	    m2_0_1534[1] = 0.2D;
	    m2_0_1534[2] = 0.5333333333333333D;
	    final double[] m2_1_1535 = m2_1537[1];
	    m2_1_1535[0] = 0.6D;
	    m2_1_1535[1] = 0.3333333333333333D;
	    m2_1_1535[2] = 0.06666666666666667D;
	    final double[] m2_2_1536 = m2_1537[2];
	    m2_2_1536[0] = 0.13333333333333333D;
	    m2_2_1536[1] = 0.4666666666666667D;
	    m2_2_1536[2] = 0.4D;
	    double[][] m2_2257 = m2_1537;
	    double[][] m3_2256 = m3_1541;
	    int iter_2254 = 0;
	    while (iter_2254 < MagicSquareTest.iters) {
	      m3_2256[0][0] = 0.26666666666666666D * m2_2257[0][0] + 0.6D * m2_2257[0][1] + 0.13333333333333333D * m2_2257[0][2];
	      m3_2256[0][1] = 0.2D * m2_2257[0][0] + 0.3333333333333333D * m2_2257[0][1] + 0.4666666666666667D * m2_2257[0][2];
	      m3_2256[0][2] = 0.5333333333333333D * m2_2257[0][0] + 0.06666666666666667D * m2_2257[0][1] + 0.4D * m2_2257[0][2];
	      m3_2256[1][0] = 0.26666666666666666D * m2_2257[1][0] + 0.6D * m2_2257[1][1] + 0.13333333333333333D * m2_2257[1][2];
	      m3_2256[1][1] = 0.2D * m2_2257[1][0] + 0.3333333333333333D * m2_2257[1][1] + 0.4666666666666667D * m2_2257[1][2];
	      m3_2256[1][2] = 0.5333333333333333D * m2_2257[1][0] + 0.06666666666666667D * m2_2257[1][1] + 0.4D * m2_2257[1][2];
	      m3_2256[2][0] = 0.26666666666666666D * m2_2257[2][0] + 0.6D * m2_2257[2][1] + 0.13333333333333333D * m2_2257[2][2];
	      m3_2256[2][1] = 0.2D * m2_2257[2][0] + 0.3333333333333333D * m2_2257[2][1] + 0.4666666666666667D * m2_2257[2][2];
	      m3_2256[2][2] = 0.5333333333333333D * m2_2257[2][0] + 0.06666666666666667D * m2_2257[2][1] + 0.4D * m2_2257[2][2];
	      final int iter_2622 = iter_2254 + 1;
	      final double[][] m2_2632 = m2_2257;
	      m2_2257 = m3_2256;
	      m3_2256 = m2_2632;
	      iter_2254 = iter_2622;
	      continue;}
	    /*while*/
	    final long endTime_2634 = java.lang.System.currentTimeMillis() /*static*/;
	    if (m2_2257 == null) {
	      java.lang.System.out.println("Execution time: " + (double)(endTime_2634 - startTime_1396) * 0.001D) /*virtual*/;
	      i_1390++;
	      continue WHILE_1391;}
	    else {
	      java.lang.System.out.print(m2_2257[0][0] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[0][1] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[0][2] + " ") /*virtual*/;
	      java.lang.System.out.println() /*virtual*/;
	      java.lang.System.out.print(m2_2257[1][0] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[1][1] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[1][2] + " ") /*virtual*/;
	      java.lang.System.out.println() /*virtual*/;
	      java.lang.System.out.print(m2_2257[2][0] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[2][1] + " ") /*virtual*/;
	      java.lang.System.out.print(m2_2257[2][2] + " ") /*virtual*/;
	      java.lang.System.out.println() /*virtual*/;
	      java.lang.System.out.println("Execution time: " + (double)(endTime_2634 - startTime_1396) * 0.001D) /*virtual*/;
	      i_1390++;
	      continue WHILE_1391;}}
	  /*WHILE_1391*/
	  return;
	}
//--------------------------------------   5 sec - JScp version 0.0.75

Outcome of supercompilation for dim=3 (Jama)

 

//--------------------------------------   2 sec - postprocessing...
	public static void main (final java.lang.String[] argv_2)
	{
	  int i_931 = 1;
	  WHILE_932:
	  while (i_931 <= MagicSquareLimit.iters1) {
	    final long start_937 = java.lang.System.currentTimeMillis() /*static*/;
	    final Jama.Matrix X_1108 = new Jama.Matrix(3, 3);
	    //- this is X_1108 = new Jama.Matrix(3, 3)
	    //  X_1108.m = 3;
	    //  X_1108.n = 3;
	    //  final double[][] A_1113 = new double[3][3];
	    //  X_1108.A = A_1113;
	    final double[][] A_1113 = X_1108.A;
	    final double[] A_0_1110 = A_1113[0];
	    A_0_1110[0] = 0.5333333333333333D;
	    A_0_1110[1] = 0.06666666666666667D;
	    A_0_1110[2] = 0.4D;
	    final double[] A_1_1111 = A_1113[1];
	    A_1_1111[0] = 0.2D;
	    A_1_1111[1] = 0.3333333333333333D;
	    A_1_1111[2] = 0.4666666666666667D;
	    final double[] A_2_1112 = A_1113[2];
	    A_2_1112[0] = 0.26666666666666666D;
	    A_2_1112[1] = 0.6D;
	    A_2_1112[2] = 0.13333333333333333D;
	    Jama.Matrix C_1452 = X_1108;
	    int j_1451 = 1;
	    while (j_1451 <= MagicSquareLimit.iters) {
	      final Jama.Matrix X_1458 = new Jama.Matrix(3, 3);
	      //- this is X_1458 = new Jama.Matrix(3, 3)
	      //  X_1458.m = 3;
	      //  X_1458.n = 3;
	      //  final double[][] A_1463 = new double[3][3];
	      //  X_1458.A = A_1463;
	      final double[][] A_1463 = X_1458.A;
	      final double Bcolj_0_1471 = C_1452.A[0][0];
	      final double Bcolj_1_1478 = C_1452.A[1][0];
	      final double Bcolj_2_1485 = C_1452.A[2][0];
	      final double[] A_0_1460 = A_1463[0];
	      A_0_1460[0] = 0.5333333333333333D * Bcolj_0_1471 + 0.06666666666666667D * Bcolj_1_1478 + 0.4D * Bcolj_2_1485;
	      final double[] A_1_1461 = A_1463[1];
	      A_1_1461[0] = 0.2D * Bcolj_0_1471 + 0.3333333333333333D * Bcolj_1_1478 + 0.4666666666666667D * Bcolj_2_1485;
	      final double[] A_2_1462 = A_1463[2];
	      A_2_1462[0] = 0.26666666666666666D * Bcolj_0_1471 + 0.6D * Bcolj_1_1478 + 0.13333333333333333D * Bcolj_2_1485;
	      final double Bcolj_0_1593 = C_1452.A[0][1];
	      final double Bcolj_1_1600 = C_1452.A[1][1];
	      final double Bcolj_2_1607 = C_1452.A[2][1];
	      A_0_1460[1] = 0.5333333333333333D * Bcolj_0_1593 + 0.06666666666666667D * Bcolj_1_1600 + 0.4D * Bcolj_2_1607;
	      A_1_1461[1] = 0.2D * Bcolj_0_1593 + 0.3333333333333333D * Bcolj_1_1600 + 0.4666666666666667D * Bcolj_2_1607;
	      A_2_1462[1] = 0.26666666666666666D * Bcolj_0_1593 + 0.6D * Bcolj_1_1600 + 0.13333333333333333D * Bcolj_2_1607;
	      final double Bcolj_0_1715 = C_1452.A[0][2];
	      final double Bcolj_1_1722 = C_1452.A[1][2];
	      final double Bcolj_2_1729 = C_1452.A[2][2];
	      A_0_1460[2] = 0.5333333333333333D * Bcolj_0_1715 + 0.06666666666666667D * Bcolj_1_1722 + 0.4D * Bcolj_2_1729;
	      A_1_1461[2] = 0.2D * Bcolj_0_1715 + 0.3333333333333333D * Bcolj_1_1722 + 0.4666666666666667D * Bcolj_2_1729;
	      A_2_1462[2] = 0.26666666666666666D * Bcolj_0_1715 + 0.6D * Bcolj_1_1722 + 0.13333333333333333D * Bcolj_2_1729;
	      j_1451++;
	      C_1452 = X_1458;
	      continue;}
	    /*while*/
	    C_1452.print(2, 3) /*virtual*/;
	    final long end_1848 = java.lang.System.currentTimeMillis() /*static*/;
	    java.lang.System.out.println("Total time = " + (double)(end_1848 - start_937) * 0.001D) /*virtual*/;
	    i_931++;
	    continue;}
	  /*WHILE_932*/
	  return;
	}
//--------------------------------------   3 sec - JScp version 0.0.75