• Личный талисман "магический квадрат пифагора". Из чего состоит и как работает магический квадрат Как решить квадрат с четным числом ячеек

    В магическом квадрате целые числа распределены таким образом, что их сумма по горизонтали, вертикали и диагонали равна одному и тому же числу, так называемой магической константе.

    Магический квадрат в культурах мира

    Примером магического квадрата является Ло Шу, представляющий собой таблицу 3 на 3. В нем вписаны цифры от 1 до 9 таким образом, что в сумме каждая из строк и диагональ дает число 15.

    Одна китайская легенда повествует, как однажды во время потопа король пытался построить канал, который бы отвел воду в море. Вдруг из реки Ло появилась черепаха со странным рисунком на панцире. Это была сетка с вписанными в квадраты цифрами от 1 до 9. Сумма чисел на каждой стороне квадрата, а также по диагонали составляла 15. Это число соответствовало количеству дней в каждом из 24 циклов китайского солнечного года.

    Квадрат Ло Шу также называют магическим квадратом Сатурна. В нижней строке этого квадрата посередине находится число 1, а в правой верхней клетке число 2.

    Магический квадрат присутствует и в других культурах: персидской, арабской, индийской, европейской. Его запечатлел в своей гравюре «Меланхолия» в 1514 году немецкий художник Альбрехт Дюрер.

    Магический квадрат на гравюре Дюрера считается первым из тех, что когда-либо появлялись в европейской художественной культуре.

    Как решить магический квадрат

    Решать магический квадрат следует, заполняя ячейки числами таким образом, чтобы на каждой линии в сумме получилась магическая константа. Сторона магического квадрата может состоять из четного ли нечетного количества ячеек. Самые популярные магические квадраты состоят из девяти (3х3) или шестнадцати (4х4) ячеек. Существует большое разнообразие магических квадратов и вариантов их решения.

    Как решить квадрат с четным числом ячеек

    Вам понадобится лист бумаги с нарисованным на них квадратом 4х4, простой карандаш и ластик.

    Впишите в ячейки квадрата числа от 1 до 16, начиная с верхней левой клетки.

    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16

    Магическая константа этого квадрата – 34. Поменяйте местами числа на диагональной линии от 1 до 16. Для простоты поменяйте местами 16 и 1, а затем 6 и 11. В результате на диагонали будут стоять цифры 16, 11, 6, 1.

    16 2 3 4
    5 11 7 8
    9 10 6 12
    13 14 15 1

    Поменяйте местами числа на второй диагональной линии. Эта линия начинается с цифры 4 и заканчивается цифрой 13. Поменяйте их местами. Теперь поменяйте местами два других числа – 7 и 10. Сверху вниз на линии числа будут располагаться в таком порядке: 13, 10, 7, 4.

    16 2 3 13
    5 11 10 8
    9 7 6 12
    4 14 15 1

    Если вы посчитаете сумму на каждой строке, то получится 34. Этот метод работает с другими квадратами с четным количеством ячеек.

    Существует несколько различных классификаций магических квадратов

    пятого порядка, призванных хоть как-то их систематизировать. В книге

    Мартина Гарднера [ГМ90, сс. 244-345] описан один из таких способов –

    по числу в центральном квадрате. Способ любопытный, но не более того.

    Сколько существует квадратов шестого порядка, до сих пор неизвестно, но их примерно 1.77 х 1019 . Число огромное, поэтому нет никаких надежд пересчитать их с помощью полного перебора, а вот формулы для подсчёта магических квадратов никто придумать не смог.

    Как составить магический квадрат?

    Придумано очень много способов построения магических квадратов. Проще всего составлять магические квадраты нечётного порядка . Мы воспользуемся методом, который предложил французский учёный XVII века А. де ла Лубер (De La Loubère). Он основан на пяти правилах, действие которых мы рассмотрим на самом простом магическом квадрате 3 х 3 клетки.

    Правило 1. Поставьте 1 в среднюю колонку первой строки (Рис. 5.7).

    Рис. 5.7. Первое число

    Правило 2. Следующее число поставьте, если возможно в клетку, соседнюю с текущей по диагонали правее и выше (Рис. 5.8).

    Рис. 5.8. Пытаемся поставить второе число

    Правило 3. Если новая клетка выходит за пределы квадрата сверху , то запишите число в самую нижнюю строку и в следующую колонку (Рис. 5.9).

    Рис. 5.9. Ставим второе число

    Правило 4. Если клетка выходит за пределы квадрата справа , то запишите число в самую первую колонку и в предыдущую строку (Рис. 5.10).

    Рис. 5.10. Ставим третье число

    Правило 5. Если в клетке уже занята , то очередное число запишите под текущей клеткой (Рис. 5.11).

    Рис. 5.11. Ставим четвёртое число

    Рис. 5.12. Ставим пятое и шестое число

    Снова выполняйте Правила 3, 4, 5, пока не составите весь квадрат (Рис.

    Не правда ли, правила очень простые и понятные, но всё равно довольно утомительно расставлять даже 9 чисел. Однако, зная алгоритм построения магических квадратов, мы сможем легко перепоручить компьютеру всю рутинную работу, оставив себе только творческую, то есть написание программы.

    Рис. 5.13. Заполняем квадрат следующими числами

    Проект Магические квадраты (Magic)

    Набор полей для программы Магические квадраты совершенно очевиден:

    // ПРОГРАММА ДЛЯ ГЕНЕРИРОВАНИЯ

    // НЕЧЕТНЫХ МАГИЧЕСКИХ КВАДРАТОВ

    // ПО МЕТОДУ ДЕ ЛА ЛУБЕРА

    public partial class Form1 : Form

    //макс. размеры квадрата: const int MAX_SIZE = 27; //var

    int n=0; // порядок квадрата int [,] mq; // магический квадрат

    int number=0; // текущее число для записи в квадрат

    int col=0; // текущая колонка int row=0; // текущая строка

    Метод де ла Лубера годится для составления нечётных квадратов любого размера, поэтому мы можем предоставить пользователю возможность самостоятельно выбирать порядок квадрата, разумно ограничив при этом свободу выбора 27-ью клетками.

    После того как пользователь нажмёт заветную кнопку btnGen Генерировать! , метод btnGen_Click создаёт массив для хранения чисел и переходит в метод generate :

    //НАЖИМАЕМ КНОПКУ "ГЕНЕРИРОВАТЬ"

    private void btnGen_Click(object sender, EventArgs e)

    //порядок квадрата:

    n = (int )udNum.Value;

    //создаем массив:

    mq = new int ;

    //генерируем магический квадрат: generate();

    lstRes.TopIndex = lstRes.Items.Count-27;

    Здесь мы начинаем действовать по правилам де ла Лубера и записываем первое число – единицу – в среднюю клетку первой строки квадрата (или массива, если угодно):

    //Генерируем магический квадрат void generate(){

    //первое число: number=1;

    //колонка для первого числа - средняя: col = n / 2 + 1;

    //строка для первого числа - первая: row=1;

    //заносим его в квадрат: mq= number;

    Теперь мы последовательно пристраиваем по клеткам остальные числа – от двойки до n * n:

    //переходим к следующему числу:

    Запоминаем на всякий случай координаты актуальной клетки

    int tc=col; int tr = row;

    и переходим в следующую клетку по диагонали:

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

    if (row < 1) row= n;

    А затем четвёртого:

    if (col > n) { col=1;

    goto rule3;

    И пятого:

    if (mq != 0) { col=tc;

    row=tr+1; goto rule3;

    Как мы узнаем, что в клетке квадрата уже находится число? – Очень просто: мы предусмотрительно записали во все клетки нули , а числа в готовом квадрате больше нуля . Значит, по значению элемента массива мы сразу же определим, пустая клетка или уже с числом! Обратите внимание, что здесь нам понадобятся те координаты клетки, которые мы запомнили перед поиском клетки для следующего числа.

    Рано или поздно мы найдём подходящую клетку для числа и запишем его в соответствующую ячейку массива:

    //заносим его в квадрат: mq = number;

    Попробуйте иначе организовать проверку допустимости перехода в но-

    вую клетку!

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

    //если выставлены не все числа, то if (number < n*n)

    //переходим к следующему числу: goto nextNumber;

    И вот квадрат готов! Вычисляем его магическую сумму и распечатываем на экране:

    } //generate()

    Напечатать элементы массива очень просто, но важно учесть выравнивание чисел разной «длины», ведь в квадрате могут быть одно-, дву- и трёхзначные числа:

    //Печатаем магический квадрат void writeMQ()

    lstRes.ForeColor = Color .Black;

    string s = "Магическая сумма = " + (n*n*n +n)/2; lstRes.Items.Add(s);

    lstRes.Items.Add("" );

    // печатаем магический квадрат: for (int i= 1; i<= n; ++i){

    s="" ;

    for (int j= 1; j <= n; ++j){

    if (n*n > 10 && mq < 10) s += " " ; if (n*n > 100 && mq < 100) s += " " ; s= s + mq + " " ;

    lstRes.Items.Add(s);

    lstRes.Items.Add("" ); }//writeMQ()

    Запускаем программу – квадраты получаются быстро и на загляденье (Рис.

    Рис. 5.14. Изрядный квадратище!

    В книге С.Гудман, С.Хидетниеми Введение в разработку и анализ алгорит-

    мов , на страницах 297-299 мы отыщем тот же самый алгоритм, но в «сокращённом» изложении. Он не столь «прозрачен», как наша версия, но работает верно.

    Добавим кнопку btnGen2 Генерировать 2! и запишем алгоритм на языке

    Си-шарп в метод btnGen2_Click :

    //Algorithm ODDMS

    private void btnGen2_Click(object sender, EventArgs e)

    //порядок квадрата: n = (int )udNum.Value;

    //создаем массив:

    mq = new int ;

    //генерируем магический квадрат: int row = 1;

    int col = (n+1)/2;

    for (int i = 1; i <= n * n; ++i)

    mq = i; if (i % n == 0)

    if (row == 1) row = n;

    if (col == n) col = 1;

    //построение квадрата закончено: writeMQ();

    lstRes.TopIndex = lstRes.Items.Count - 27;

    Кликаем кнопку и убеждаемся, что генерируются «наши» квадраты (Рис.

    Рис. 5.15. Старый алгоритм в новом обличии

    Данная загадка быстро разлетелась по всему Интернету. Тысячи людей начали задаваться вопросом о том, как работает магический квадрат. Сегодня вы, наконец-то, найдете ответ!

    Тайна магического квадрата

    На самом деле данная загадка довольно проста и сделана с расчётом на человеческую невнимательность. Давайте разберемся, как работает магический черный квадрат, на реальном примере:

    1. Давайте загадаем любое число от 10 до 19. Теперь давайте вычтем из данного числа его составляющие цифры. К примеру, возьмем 11. Отнимем от 11 единицу и после – еще одну единицу. Выйдет 9. На самом деле не важно, какое число от 10 до 19 вы возьмете. Результат вычислений всегда будет 9. Числу 9 в «Магическом Квадрате» соответствует первая цифра с рисунками. Если присмотреться, то можно увидеть, что очень большому количеству цифр присвоены одни и те же рисунки.
    2. Что же будет, если взять число в пределах от 20 и до 29? Может, вы уже сами догадались? Правильно! Результатом вычислений всегда будет 18. Цифра 18 соответствует второй позиции на диагонали с рисунками.
    3. Если же взять число от 30 до 39, то, как можно уже угадать, выйдет число 27. Число 27 также соответствует цифре на диагонали столь необъяснимого «Магического Квадрата».
    4. Подобный алгоритм остается правдивым для любых чисел от 40 до 49, от 50 до 59 и так далее.

    То есть выходит, что неважно, какое число вы загадали - «Магический Квадрат» угадает результат, ведь в клетках под номерами 9, 18, 27, 36, 45, 54, 63, 72 и 81 на самом деле находится один и тот же символ.

    На самом деле данную загадку можно легко объяснить с помощью простого уравнения:

    1. Вообразите любое двухзначное число. В независимости от числа его можно представить в виде x*10+y. Десятки выступают в роли “x”, а единицы в роли “у”.
    2. Вычтите из загаданного числа цифры, которые составляют его. Складываем уравнение: (x*10+y)-(x+y)=9*x.
    3. Число, которое вышло в результате вычислений должно указывать на определенный символ в таблице.

    Не важно, какая цифра будет в роли “x”, так или иначе вы получите символ, у которого номер будет кратный девяти. Для того чтобы убедится в том, что под разными номерами находится один символ, достаточно просто посмотреть на таблицу и на номера 0,9,18,27,45,54,63,72,81 и последующие.