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 ?
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 ?
#4
RamaWolf
95
2
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' .
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;
#5
ramsey2879
841
3
Vineeth T said:
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".
#6
RamaWolf
95
2
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'
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;
#7
RamaWolf
95
2
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
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;