# This is sad! Some of the tests in this directory use magic
# squares. Our new magic squares code yields a different order than
# the old code, which breaks these tests. So, I'm just including the
# old code here. It works fine, but it's much slower than the new
# stuff.
# What programming language would be complete without magic squares?
# This function generates magic squares. A magic square is a square
# matrix of order N whose elements consist of the consecutive whole
# numbers from 1 to N^2, arranged so that the sums of each row, each
# column, and each diagonal are all equal.
# Note that magic(2) is undefined and returns NULL.
# I hacked this up one night when I should have been working on the
# house. (That's my excuse for this mess.)
# Copyright (C) 1994-96 K. Scott Hunziker.
magic = function (n)
{
local (x; i; j; r; c; v);
n = scalar (integer (n));
if (n == 1) { return [1]; }
if (n < 3) { return NULL; }
if (n % 2)
{
x = fill (n,n; 0);
for (i in 1:n)
{
v = (i-1)*n + 1 : i*n;
r = 2*i-1:2*i-n; r -= n*(r>n); r += n*(r<1);
c = (n+3)/2-i:(n+3)/2-i+n-1; c -= n*(c>n); c+= n*(c<1);
for (j in 1:n) { x[r[j];c[j]] = v[j]; }
}
elseif (n % 4)
x = self (n/2);
x = [ x, x+n^2/2; x+n^2*3/4, x+n^2/4 ];
for (i in 1:(n/2-1)/2)
{
c=x[1:n/2;i];
x[1:n/2;i] = x[n/2+1:n;i];
x[n/2+1:n;i] = c;
}
if (n > 6)
{
for (i in 1:(n/2-1)/2-1)
{
j = n-i+1;
c = x[1:n/2;j];
x[1:n/2;j] = x[n/2+1:n;j];
x[n/2+1:n;j] = c;
}
}
j = (n+2)/4;
c = x[j;1];
x[j;1] = x[j+n/2;1];
x[j+n/2;1] = c;
c = x[j;j];
x[j;j] = x[j+n/2;j];
x[j+n/2;j] = c;
else
x = ( self.block (n; 1) [2,1;n:1] +
self.block (n; n^2-n+1) [;n:1] );
for (i in 2:n/2)
{
if (i%4 > 1)
{
r = (self.block (n; (i-1)*n+1) +
self.block (n; n^2-i*n+1) [2,1;]);
else
r = (self.block (n; (i-1)*n+1) [2,1;n:1] +
self.block( n; n^2-i*n+1) [;n:1]);
}
x = [ r[1;]; x; r[2;] ];
}
}
return x;
};
magic.block = function (n; s)
{
local (i; j; x)
x = fill (2,n; 0);
x[2;1] = s;
s += 1;
i = 1;
for (j in n-1:2:2)
{
if (i == 1)
{
x[1;j] = s;
x[1;j-1] = s+1;
i=2;
else
x[2;j-1] = s;
x[2;j] = s+1;
i=1;
}
s += 2;
}
x[2;n] = s;
return x;
};
provide ("OLDmagic");
syntax highlighted by Code2HTML, v. 0.9.1