На одном из занятий математического кружка мы знакомились с магическими квадратами, но поскольку детям известна популярная игрушка–головоломка кубик Рубика, то, естественно, у ребят возник вопрос: а нельзя ли в ячейки куба nxnxn записать числа от 1 до n3 так, чтобы в каждом слое и в каждом диагональном сечении куба сумма чисел оказалась одна и та же. Эта задача заинтересовала не только ребят, увлекающихся математикой, но и тех учащихся, кто интересуется программированием. Задача также привлекательна для педагога, поскольку развивает пространственное воображение и алгоритмическое мышление учащихся.
Описанное ниже исследование явилось результатом совместного творчества учителя, группы ребят, увлекающихся математикой и группы ребят, интересующихся программированием. Совместная работа над этой проблемой показала креативные возможности соединения математики и информатики на занятиях кружка, при подготовке к олимпиаде, на занятиях по предпрофильной подготовке по названным предметам.
Убеждён в плодотворности и перспективности подобных занятий, ибо именно на стыке наук рождаются открытия!
Определение. Магическими кубами называются кубы, в которых сумма чисел в рядах, параллельных граням и сумма чисел на диагоналях одинакова, (1+n3)n/2. Будем говорить, что куб почти магический, если суммы чисел любого из 3n слоёв и любого из 6 диагональных сечений равны, (1+n3)n/2.
Необычность задачи в том, что нужно вписывать числа в объёмное тело, поэтому мы решили заполнять почти магический куб порядка , рассматривая каждый из n его слоёв.
Сначала вспомним известный алгоритм заполнения магического квадрата нечётного порядка на примере квадратов порядка 3 и 5. Записываем числа следующим образом:
Числа, не попавшие в заштрихованный квадрат, сдвигаем на n=3 единицы: 1 – вниз, 3 – влево, 9 – вверх, 7 – вправо. Получаем:
Аналогично заполняется магический квадрат порядка 5:
Важное наблюдение. Магические квадраты нечётного порядка, построенные описанным выше алгоритмом, обладают следующим свойством: нет ни одной строки и ни одного столбца в магическом квадрате, в которых стоят два сравнимых по модулю n числа.
Нам удалось отыскать универсальный алгоритм заполнения почти магического куба нечётного порядка. Рассмотрим в качестве примера почти магический куб порядка 3. Все три слоя куба пока пусты.
Шаг А. Вписываем числа от 1 до 9: число 1 вписываем в слой А, в ту клетку, где стояло число 1 в магическом квадрате (рис. 2); число 2 вписываем в ту клетку, где стояло число 2 в магическом квадрате (рис. 2), но уже в слое B; число 3 вписываем в клетку, где стояло число 3 в магическом квадрате (рис. 2), но в слое С; число 4 снова записываем в слое А, и так далее. Получаем:
Заметим, что в слое А находятся числа, сравнимые с 1 по модулю n, в слое В – числа, сравнимые с 2, в слое С – числа, сравнимые с 0.
Шаг B. Аналогично вписываем числа от 10 до 18, но заполнение начинаем теперь со слоя B: число 10 вписываем в слой B, в ту клетку, где стояло число 1 в магическом квадрате (рис. 2); число 11 вписываем в ту клетку, где стояло число 2 в магическом квадрате (рис. 2), но уже в слое С; число 12 вписываем в клетку, где стояло число 3 в магическом квадрате (рис. 2), но в слое A; и так далее. Получаем:
Шаг C выполняем аналогично предыдущим, но вписываем числа от 19 до 27 начиная со слоя С. Окончательно получаем слои почти магического куба порядка 3:
Нетрудно убедиться, что это действительно почти магический куб, – сумма чисел каждого из 9 слоёв и каждого из 6 диагональных сечений равна 162.
Ученик 11 класса Ядуванкин Вадим реализовал найденный алгоритм, написав компьютерную программу, которая строит магический квадрат нечётного порядка, а на его основе – почти магический куб нечётного порядка. В результате работы программы выяснилось, что построенные таким образом кубы нечётных порядков не превосходящих 23, действительно являются почти магическими. (Исходный код программы на языке Pascal мы разместили на сайте http://morozko1967.boom.ru/soft.htm). При переводе программы с языка Pascal на язык Delphi нам удалось существенно увеличить размер строящихся почти магических кубов.
Интересно отметить, что ребята–математики, убедившись, что построенные таким образом кубы для некоторых нечётных n являются почти магическими, сами поставили перед собой и перед учителем проблему доказательства этой гипотезы для любого нечетного n.
Теорема. Куб любого нечётного порядка, построенный описанным выше алгоритмом, является почти магическим (то есть суммы чисел всех 3n слоёв и 6 диагональных сечений одинаковы).
Доказательство. Заполним куб числами от 1 до n3 по алгоритму, описанному выше и используя данный магический квадрат порядка n. Без ограничения общности можно считать, что слой А – самый верхний, слой В – ниже, и т. д. Сразу под 1 по построению находится число 1+n2, ещё ниже – 1+2n2, …, в последнем слое 1+(n–1)n2. Во втором сверху слое В число 2, а под ним в слое C число 2+n2; в свою очередь, под ним 2+2n2,…, в последнем слое – 2+(n–2)n2; а над числом 2 в слое А находится число 2+(n–1)n2, и т. д. Таким образом, какое бы число куба не взять, это число сравнимо с каждым из чисел под ним и над ним по модулю n2. Обозначим элементы слоя А – aij, элементы слоя В – bij, и т. д., где i – номер строки, j – номер столбца. Если выбрать любое число aij верхнего слоя А и сложить со всеми числами под ним, то получим
aij+bij+…=naij+n2(1+2+…+(n–1))=naij+(n–1)n3/2.
Обозначим элементы данного магического квадрата b ij. Поскольку исходный квадрат магический, то
Далее будем обозначать эту сумму S . Тогда сумма чисел любого слоя, перпендикулярного основанию равна:
Аналогично вычисляется сумма чисел любого диагонального сечения, перпендикулярного основанию.
Теперь убедимся, что сумма чисел каждого горизонтального слоя X такая же. Действительно, рассмотрим любой горизонтальный слой куба и любую сроку (столбец) в нём. Докажем, что сумма чисел в этой строке (столбце) одна и та же.
Любое число в этой строке (столбце) сравнимо по модулю n2 с соответствующим числом в магическом квадрате. Поэтому сумма чисел этой строки (столбца) равна сумме чисел строки магического квадрата + n2, умноженное на некоторое натуральное число z.
Найдём это число z, убедимся, что это число не зависит от выбора слоя X и строки в нём. Рассмотрим в кубе только числа от 1 до n2. Как уже отмечалось, числа, сравнимые с 1 по модулю n находятся в верхнем слое и в разных строках и столбцах, числа, сравнимые с 2 по модулю n находятся в первом слое и в разных строках и столбцах, …, числа, сравнимые с 0 по модулю n находятся в нижнем слое и в разных строках и столбцах. Под 1 числами 1, n+1, … первого слоя находятся числа, на n2 больше, ещё ниже – на 2n2 больше и т. д. Можно говорить, что числа от 1 до n2 “добавляют” в другие слои несколько раз по n2. В слой Х в нашей строке числа с предыдущего слоя с той же строки (таких чисел ровно одно, см. важное наблюдение о магических квадратах выше) добавляют n2, числа с ещё более высокого слоя с той же строки добавляют 2n2, …, числа со слоя ниже слоя Х, но той же строки добавляют (n–1)n2. Таким образом, сумма чисел нашей строки (столбца) в слое Х имеет вид:
То есть сумма чисел любой строки (столбца) любого слоя Х зависит только от n. Значит и суммы чисел в горизонтальных слоях одинаковы, (1+n3)n2/2.
Поскольку диагональные сечения, перпендикулярные боковым граням куба составляются из строк (столбцов) различных слоёв, то и сумма чисел, стоящих на диагональных сечениях также равна (1+n3)n2/2.
Теорема доказана.
Замечание 1. Доказывая теорему, мы увидели, что алгоритм заполнения почти магического куба заключается в следующем: сначала в куб вписываются числа от 1 до n2, а затем ячейки под этими числами последовательно увеличивают на n2, если дошли до последнего слоя, то переходим к верхнему, пока не дойдём до начального числа.
Замечание 2. Если к магическому квадрату порядка 4 попытаться и применить наш алгоритм, то полученный таким образом куб не является почти магическим: хотя сумма чисел любого слоя одинакова, сумма чисел двух диагональных сечений отличается от (1+n3)n2/2.
Как учителя математики и информатики могут использовать этот материал? Перед учащимися можно поставить проблему построения почти магического куба. Эта задача будет интересна школьникам. Далее возможны два пути: 1) решать задачу вместе с детьми сначала средствами математики, доказать существование почти магических кубов, а затем поставить перед ребятами проблему создания компьютерной программы построения почти магических кубов; 2) сначала реализовать на компьютере описанный выше алгоритм построения почти магического куба, а когда дети благодаря этой программе убедятся в том, что для многих нечётных n построенный таким образом куб является почти магическим, то у ребят возникнет естественная потребность доказать этот факт для любого нечётного n.
Приложение.
Исходный код программы построения почти магического куба нечётного порядка.
program q; {Программа построения почти магического куба нечетного порядка n}
{Авторы программы Ядуванкин Вадим, Морозов Владимир, 2003 г.
mailto: morozko1967@mail.ru
url : http://morozko1967.boom.ru/
ICQ: 259920363}
uses crt;
const n=23; {Порядок куба обязательно нечетное
число. Больше 23 Pascal не справляется}
Type TSqr=array [1..n,1..n] of longint; {Тип для хранения
магического квадрата}
TCube=array [1..n,1..n,1..n] of longint; {Тип для хранения
магического куба}
var
b:TSqr; {Магический квадрат}
a:TCube; {Магический куб}
i,j,k,l:longint; {Индексы}
s,ss:longint; {Для проверки сумм}
f:text; {Файл для вывода слоев магического куба}
h:string; {Строка для хранения имени файла}
ll:boolean; {проверка ошибок сумм слоев магического куба}
Procedure MagicSqr(var bb:TSqr); {Процедура построения магического квадрата нечётного порядка n}
var
x:array [1..600,1..2] of integer;
begin
for k:=1 to n do
for i:=1+n*(k–1) to n*k do
begin
x[i,1]:=((3–n) div 2)–k+i–(n–2)*(k–1);
x[i,2]:=((n+1)div 2)–k+i–n*(k–1)
end;
for i:=1 to n*n do
for j:=1 to 2 do
begin {Коррекция координат}
if x[i,j]>n then x[i,j]:=x[i,j]–n;
if x[i,j]<=0 then x[i,j]:=x[i,j]+n;
end;
for i:=1 to n*n do {Заполнение магического квадрата bb}
bb[x[i,1],x[i,2]]:=i
end;
begin
TextBackGround(1); TextColor(11); ClrScr;
MagicSqr(b); {Вызывается процедура построения
магического квадрата нечетного порядка}
str(n,h); h:='C:/output'+h+'.txt';
assign(f,h); {Слои куба и результаты проверки будут
выводиться и на экран, и в файл output_n.txt в текущем
каталоге}
rewrite(f); {Очистка/создание файла}
writeln(f,'Построение магического квадрата порядка
',n);
writeln('Построение магического квадрата порядка ',n);
writeln; writeln(f);
for i:=1 to n do
begin
for j:=1 to n do
begin write(b[i,j]:5); write(f,b[i,j]:6) end;
writeln; writeln(f)
end;
writeln; writeln(f);
writeln('Построение магического куба порядка ',n);
writeln(f,'Построение магического куба порядка ',n);
{Далее следует реализация алгоритма заполнения магического куба.
За основу взят магический квадрат b}
for l:=0 to n–1 do
for i:=1 to n do
for j:=1 to n do
begin
k:=(b[i,j]+l) mod n; {Номер слоя, в который следует записать a(i,j)}
if k=0 then k:=n;
a[i,j,k]:=b[i,j]+l*n*n
end;
{Магический куб построен. Теперь выводим слои куба на экран и в файл f}
for k:=1 to n do
begin
writeln; writeln(f); writeln('Слой ',k); writeln(f,'Слой ',k);
for i:=1 to n do
begin
for j:=1 to n do
begin write(a[i,j,k]:5); write(f,a[i,j,k]:6) end;
writeln; writeln(f)
end;
end;
k:=(1+n*n*n)*n*n; {k в любом случае четно}
ss:=k div 2;
ll:=true; {Флаг ошибки. Если свойство магичности
нарушится, то ll=false}
writeln; writeln(f); writeln('Проверка сумм слоев : должно
получиться ', ss);
writeln(f,'Проверка сумм слоев : должно получиться ',
ss);
{Подсчитывается сумма каждого слоя и каждого диагонального сечения}
for k:=1 to n do
begin
s:=0;
for i:=1 to n do
for j:=1 to n do
s:=s+a[i,j,k];
ll:=ll and (s=ss);
write(s:8); write(f,s:8)
end;
writeln; writeln(f);
for i:=1 to n do
begin
s:=0;
for k:=1 to n do
for j:=1 to n do
s:=s+a[i,j,k];
ll:=ll and (s=ss);
write(s:8); write(f,s:8)
end;
writeln; writeln(f);
for j:=1 to n do
begin
s:=0;
for i:=1 to n do
for k:=1 to n do
s:=s+a[i,j,k];
ll:=ll and (s=ss);
write(s:8); write(f,s:8)
end;
writeln; writeln(f); writeln; writeln(f);
writeln('Проверка сумм диагональных сечений:');
writeln(f,'Проверка сумм диагональных сечений:');
s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[i,i,k]; end;
ll:=ll and (s=ss); write(s:8); write(f,s:8);s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[i,n–i+1,k]; end;
ll:=ll and (s=ss);
write(s:8); write(f,s:8); s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[i,k,i]; end;
ll:=ll and (s=ss); write(s:8); write(f,s:8); s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[i,k,n–i+1]; end;
ll:=ll and (s=ss); write(s:8); write(f,s:8); s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[k,i,i]; end;
ll:=ll and (s=ss); write(s:8); write(f,s:8); s:=0;
for k:=1 to n do
begin for i:=1 to n do s:=s+a[k,i,n–i+1]; end;
ll:=ll and (s=ss); write(s:8); write(f,s:8); writeln(f);writeln(f); writeln; writeln;
if ll then
begin
TextColor(10); writeln(f,'Построенный куб выдержал проверку.');
writeln(f,'Суммы всех ',3*n,' слоев и 6 диагональных сечений равны ',ss);
writeln('Построенный куб выдержал проверку.');
writeln('Суммы всех ',3*n,' слоев и 6 диагональных сечений равны ',ss);
end
else
begin
TextColor(12);
writeln(f,'Построенный куб не выдерживает проверку и не магический!!!');
writeln('Построенный куб не выдерживает проверку и не магический!!!');
end;
close(f); {Текстовый файл закрывается}
writeln; Textcolor(14); writeln('Программа успешно завершена.');
writeln('Слои магического куба смотрите в файле '+h);
repeat until keypressed
end.