Георгий Александров

 

Идеальный panmagic

 

      Идеальным будем считать такой магический квадрат, который одновременно и пандиагонален, и ассоциативен. Мною было определено, что поставленной цели можно добиться, если порядок матрицы n – число нечетное.

 

Когда же  n  делится на 4 , то строится либо пандиагональный квадрат, либо ассоциативный. Объединить оба условия, как мне кажется, невозможно (дальнейшие исследования показали, что я ошибался - идеальные магические квадраты порядка 4k существуют).

 

Еще хуже обстоит дело с магическими квадратами порядка n = 4k+2. Для этого вида матриц удается построить лишь ассоциативный магический квадрат.

     Таким образом, идеальный магический квадрат имеет либо нечетный, либо четно-четный порядок.

 

     Уникальный метод построения любого идеального квадрата при n>3 был найден мной совсем недавно (см. http://renuar911.narod.ru/ideal_mk.html ).

 

     Дальнейшие поиски показали, что существует еще один замечательный алгоритм расстановки чисел в ячейках. Он также годится для матриц, порядок которых n нечетный и не кратный 3-м. Данный идеальный квадрат, поражает, прежде всего, красотой мозаики четно-нечетных чисел. Узор настолько гармоничен, что выглядит как произведение искусства.

 

     В этом методе единица ставится в левом верхнем углу. Шахматный ход такой: три клетки вниз, две – влево. Если же в конечной ячейке уже стоит число, то вместо хода конем смещаемся на одну позицию по диагонали направо-вниз. Все остальное - то же, что и в упомянутой статье. Сказанное легко понять из такого примера (см. http://renuar911.narod.ru/U1.jpg )

 

     Программа на языке Yabasic выглядит довольно компактно:

 

rem Построение идеального магического квадрата методом одностороннего хода шахматного коня

rem Для нечетных значений n , не кратных трем

open #1,"prime_n.txt","w"

dim i(10000),j(10000),z(100,100)

n=13

i=1:j=n:z=1:z(i,j)=1

i(1)=i:j(1)=j

for k=2 to n*n

z=z+1

i1=i:i=i(k-1)+2:j1=j:j=j(k-1)+1

a()

if z(i,j)<>0 then i=i1+1:j=j1-1:fi

a()

i(k)=i:j(k)=j

z(i,j)=z

next k

for i=1 to n

for j=n to 1 step -1

print z(i,j) using "####";

print #1,z(i,j) using "####";:if j<>1 then print #1,",";:fi

next j

print

print #1

next i

print:print

end

 

sub a()

if i<=n and j>n then j=j-n:fi

if i>n and j<=n then i=i-n:fi

if i>n and j>n then i=i-n:j=j-n:fi

if j<1 then j=n+j:fi

end sub

 

 

На экране высвечивается числовая матрица. Та же матрица печатается в файл “prime_n.txt”:

 

    1,   75,  136,   28,  102,  163,   55,  129,   21,   82,  156,   48,  109

 

  123,   15,   89,  150,   42,  116,    8,   69,  143,   35,   96,  157,   62

 

   76,  137,   29,  103,  164,   56,  130,   22,   83,  144,   49,  110,    2

 

   16,   90,  151,   43,  117,    9,   70,  131,   36,   97,  158,   63,  124

 

  138,   30,  104,  165,   57,  118,   23,   84,  145,   50,  111,    3,   77

 

   91,  152,   44,  105,   10,   71,  132,   37,   98,  159,   64,  125,   17

 

   31,   92,  166,   58,  119,   24,   85,  146,   51,  112,    4,   78,  139

 

  153,   45,  106,   11,   72,  133,   38,   99,  160,   65,  126,   18,   79

 

   93,  167,   59,  120,   25,   86,  147,   52,  113,    5,   66,  140,   32

 

   46,  107,   12,   73,  134,   39,  100,  161,   53,  127,   19,   80,  154

 

  168,   60,  121,   26,   87,  148,   40,  114,    6,   67,  141,   33,   94

 

  108,   13,   74,  135,   27,  101,  162,   54,  128,   20,   81,  155,   47

 

   61,  122,   14,   88,  149,   41,  115,    7,   68,  142,   34,   95,  169

 

 

     Запятые мне потребовались для того, чтобы в редакторе Word быстро сделать преобразование текста в таблицу.

 

     В первой моей статье я забыл дать распечатку программы, позволяющей строить идеальные магические квадраты любого нечетного порядка n. Восполняю этот досадный пробел здесь:

 

rem Построение идеального магического квадрата нечетного порядка

rem методом одностороннего хода шахматного коня

dim i(10000),j(10000),z(100,100)

n=15

i=(n+1)/2:j=(n+1)/2+1:z=1:z(i,j)=1

i(1)=i:j(1)=j

for k=2 to n*n

z=z+1

i1=i:i=i(k-1)+2:j=j(k-1)+1

a()

if z(i,j)<>0 then i=i1:j=j+1:fi

a()

i(k)=i:j(k)=j

z(i,j)=z

next k

for i=n to 1 step -1

for j=1 to n

print z(i,j) using "####";

next j

print

next i

print:print

end

 

sub a()

if i<=n and j>n then j=j-n:fi

if i>n and j<=n then i=i-n:fi

if i>n and j>n then i=i-n:j=j-n:fi

end sub

 

 

В следующей статье я опишу метод построения пандиагональных квадратов порядка n=4k.

 

 

10 сентября 2007 г.

Москва

Хостинг от uCoz