Register to reply

General algorithm for a magic square

by Vineeth T
Tags: algorithm, magic, square
Share this thread:
Vineeth T
#1
Dec28-12, 04:26 AM
P: 31
Is there any algorithm to form a magic square of any size with a desired magic sum ?
Also can we make a magic square not only with the numbers from 1 to n2
but using any random numbers ?
Phys.Org News Partner Science news on Phys.org
World's largest solar boat on Greek prehistoric mission
Google searches hold key to future market crashes
Mineral magic? Common mineral capable of making and breaking bonds
RamaWolf
#2
Dec28-12, 10:58 AM
P: 96
For a quick overview look at: http://en.wikipedia.org/wiki/Magic_square
Vineeth T
#3
Dec29-12, 02:50 AM
P: 31
Quote Quote by RamaWolf View Post
For a quick overview look at: http://en.wikipedia.org/wiki/Magic_square
But in this webpage,no general methods of construction of a magic square of any numbers are given.
Can you give me a better one ?

RamaWolf
#4
Dec29-12, 04:16 AM
P: 96
General algorithm for a magic square

There is not one algorithm for all n (a natural number); I think, there are at least 3:
for odd numbers, for double even ( ie for numbers with 4 as factor) and for even numbers.

Below you find my little algorithm (written in ARIBAS) to generate an odd magic square;
example for n = 11; for simplicity of the algorithm, a 'vector' is used to store the 'square' .


==> MagicSquareOdd(11).
-: (68, 81, 94, 107, 120, 1, 14, 27, 40, 53, 66, 80, 93, 106, 119, 11, 13, 26,
39, 52, 65, 67, 92, 105, 118, 10, 12, 25, 38, 51, 64, 77, 79, 104, 117, 9, 22,
24, 37, 50, 63, 76, 78, 91, 116, 8, 21, 23, 36, 49, 62, 75, 88, 90, 103, 7, 20,
33, 35, 48, 61, 74, 87, 89, 102, 115, 19, 32, 34, 47, 60, 73, 86, 99, 101, 114,
6, 31, 44, 46, 59, 72, 85, 98, 100, 113, 5, 18, 43, 45, 58, 71, 84, 97, 110,
112, 4, 17, 30, 55, 57, 70, 83, 96, 109, 111, 3, 16, 29, 42, 56, 69, 82, 95,
108, 121, 2, 15, 28, 41, 54)

   n1:=n - 1; n2:=n*n; n3:=n1 + n1 + 1; 
   realloc(a, n2);
   i:=1;
   j:= n1 div 2;
   a[j]:=i;
   while i < n2 do
      i:=i + 1;
      if j mod n = n1 then
         k:=j - n3;   
      else
         k:=j - n1;
      end;
      if k < 0 then
         k:=k + n2;
      end;
      if a[k] = 0 then
         j:=k;
      else
         j:=j + n;       
      end;
      a[j]:=i;
   end;
ramsey2879
#5
Dec29-12, 08:11 AM
P: 894
Quote Quote by Vineeth T View Post
But in this webpage,no general methods of construction of a magic square of any numbers are given.
Can you give me a better one ?
What do you mean by "general methods"? I consider "A method of constructing majic squares of even number of rows" and "Method for constructing a majic square of odd order" to be "general methods".
RamaWolf
#6
Dec29-12, 10:27 AM
P: 96
Below you find my little algorithm (written in ARIBAS) to generate an double-even magic square of side length n (ie 4 divides n);

example for n = 4; for simplicity of the algorithm, a 'vector' is used to store the 'square'


MagicSquareDoubleEven(4).
-: (16, 2, 3, 13, 5, 11, 10, 8, 9, 7, 6, 12, 4, 14, 15, 1)

   d:= n div 4; d2:=d + d; n2:=n * n;
   realloc(a,n2);
   k:=1 + n2; k2:=0;
   for i:=1 to d do
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k;
      end;
      for j:=1 to d2 do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k2;
      end;
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k;
      end;      
   end;
   for i:=1 to d2 do
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k2;
      end;
      for j:=1 to d2 do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k;
      end;
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k2;
      end;      
   end;  
   for i:=1 to d do
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k;
      end;
      for j:=1 to d2 do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k2;
      end;
      for j:=1 to d do
         k:=k - 1; k2:=k2 + 1; a[k2 - 1]:=k;
      end;      
   end;
RamaWolf
#7
Dec30-12, 08:09 AM
P: 96
Below you find my little algorithm (written in ARIBAS) to generate an simple-even magic square of side length n (ie n div 2 must be odd);

example for n = 6; the algorithm uses my 'MagicSquareOdd' (see above)
to form a matrix a and an auxiliary matrix 'aux' for the needed inter change of
some elements of matix a

MagicSquareSimpleEven(6)

((35, 1, 6, 26, 19, 24),
(3, 32, 7, 21, 23, 25),
(31, 9, 2, 22, 27, 20),
(8, 28, 33, 17, 10, 15),
(30, 5, 34, 12, 14, 16),
(4, 36, 29, 13, 18, 11))

A good companion for this algorithm was: http://www.hp-gramatke.de/magic_sq/index.htm

   k:= n div 2; k2:= k * k; d:= (k - 1) div 2;
   a:=alloc(array,n,alloc(array,n));
   aux:=alloc(array,k,alloc(array,n));
   for i:=0 to d - 1 do
      for j:=0 to d - 1 do
         aux[i][j]:=1;
      end;
   end;
   for j:=0 to d - 1 do
      aux[d][1+j]:=2;
   end;
   for i:=d + 1 to k - 1 do
      for j:=0 to d - 1 do
         aux[i][j]:=3;      
      end;
   end;
   for i:=0 to k - 1 do
      for j:=0 to d - 2 do
         aux[i][n-j-1]:=4;
      end;
   end;
   realloc(b, k2);
   b:=MagicSquareOdd(k);
   for i:=0 to k - 1 do
      for j:=0 to k - 1 do   
         a[i][j]:=b[i*k+j]; a[i][j+k]:=2*k2+b[i*k+j];
         a[i+k][j]:=3*k2+b[i*k+j]; a[i+k][j+k]:=k2+b[i*k+j];
      end;
   end;
   for i:=0 to k - 1 do
      for j:=0 to n - 1 do
         if aux[i][j] > 0 then
            d:=a[i][j]; a[i][j]:=a[i+k][j]; a[i+k][j]:=d;
         end;
      end;
   end;


Register to reply

Related Discussions
Magic Square- Java Engineering, Comp Sci, & Technology Homework 1
Help With Pseudo Coded Algorithm for The Diamond-Square Algorithm Engineering, Comp Sci, & Technology Homework 0
Apocalyptic Magic Square General Math 1
Magic Square question General Math 9
Magic square Fun, Photos & Games 5