/** * Class for performing test on magic squares */ public class MagicSquareTest { public static final int dimension = 3; // dimension public static int iters = 100000; // iterations to perform public static int iprint = 5; private MagicSquare square; private int d; private double[][] matrix; /** Creates new MagicSquareTest instance by given MagicSquare instance * @param square MagicSquare instance */ public MagicSquareTest(MagicSquare square) { this.square = square; d = square.getDimension(); } public void perform() { double[][] m1 = new double[d][d]; double[][] m2 = new double[d][d]; double[][] m3 = new double[d][d]; double[][] buf = null; double sum = d*(d*d + 1)/2; // normalization for (int i = 0; i < d; i++) { for (int j = 0; j < d; j++) { m1[i][j] = m2[i][j] = square.getSquareAsArray()[i][j] / sum; } } for (int iter = 0; iter < iters; iter++) { for (int i = 0; i < d; i++) { for (int j = 0; j < d; j++) { double value = 0; for (int k = 0; k < d; k++) { value += m1[k][j] * m2[i][k]; } m3[i][j] = value; } } buf = m2; m2 = m3; m3 = buf; } matrix = m2; } public void printMatrix() { if (matrix == null) return; for (int i = 0; i < d; i++) { for (int j = 0; j < d; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } } /** * @param args the command line arguments */ public static void main (String args[]) { for (int i = 0; i < iprint; i++) { long startTime = System.currentTimeMillis(); MagicSquareTest test = new MagicSquareTest(new MagicSquare(dimension)); test.perform(); long endTime = System.currentTimeMillis(); test.printMatrix(); System.out.println("Execution time: " + (endTime - startTime)*0.001); } } }
============================================
/** * Magic Square Class */ public class MagicSquare { private int d; private int square[][]; /** * Creates magic square with given dimension. * Note: only odd dimentions are supported * @param dimension dimension of magic square */ public MagicSquare(int dimension) { d = dimension; square = new int[d][d]; int x = 0, y = 0; // coordinates int n = 1; // current number for (int i = 0; i < d; i++) { for (int j = 0; j < d; j++) { x = (d - 1)/2 - i + j; y = -(d - 1)/2 + i + j; square[wrap(x)][wrap(y)] = n++; } } } /** * Returns dimension of magic square. * @return dimension */ public int getDimension() { return d; } /** * Returns magic square as array. * @return array */ public int[][] getSquareAsArray() { return square; } private int wrap(int x) { if (x < 0) { return x + d; } else if (x >= d) { return x - d; } else { return x; } } }