Дмитрий Елисеев - Рассказы о математике с примерами на языках Python и C

Здесь есть возможность читать онлайн «Дмитрий Елисеев - Рассказы о математике с примерами на языках Python и C» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Математика, Программирование, Программы, Базы данных, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Рассказы о математике с примерами на языках Python и C: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Рассказы о математике с примерами на языках Python и C»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Вниманию читателей представляется книга «Рассказы о математике с примерами на языках Python и C». В книге описаны различные истории или задачи, прямо или косвенно связанные с математикой (магические квадраты, простые числа и пр). Кратко рассмотрены более сложные моменты, например выполнение вычислений с помощью GPU.
Книга распространяется бесплатно, скачать оригинал в PDF можно на странице
.

Рассказы о математике с примерами на языках Python и C — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Рассказы о математике с примерами на языках Python и C», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

И наконец, общая сумма: т. к. квадрат заполнен числами 1..16, то если сложить все 4 строки квадрата, то получаем 4S = 1 + .. + 16 = 136, т. е. S = 34 (что соответствует приведенной в начале главы формуле).

Это значит, что мы легко можем выразить последние элементы через предыдущие:

x14 = S - x11 - x12 - x13

x24 = S - x21 - x22 - x23

x34 = S - x31 - x32 - x33

x41 = S - x11 - x21 - x31

x42 = S - x12 - x22 - x32

x43 = S - x13 - x23 - x33

x44 = S + x14 - x14 - x24 - x34

Что это дает? Очень многое. Вместо перебора 16 вариантов суммарным количеством 16! = 20922789888000 мы должны перебрать лишь 9 вариантов, что дает 9! = 362880 вариантов, т. е. в 57657600 раз меньше! Как нетрудно догадаться, мы фактически выразили крайние строки квадрата через соседние, т. е. уменьшили размерность поиска с 4х4 до 3х3. Это же правило будет действовать и для квадратов большей диагонали.

Обновленная программа выглядит более громоздко (в ней также добавлены проверки на ненулевые значения и проверки на уникальность элементов), зато расчет происходит в разы быстрее. Здесь также используется возможность работы со множествами в языке Python, что легко позволяет делать перебор нужных цифр в цикле:

set(range(1, 16 + 1)) - множество чисел [1..16]

set(range(1, 16 + 1)) - set([x11]) - множество чисел [1..16] за исключением x11.

Также добавлена простая проверка на минимальность суммы: очевидно, что сумма всех элементов не может быть меньше чем 16 + 1 + 2 + 3 = 22.

digits = set(range(1,16+1))

cnt = 0

for x11 in digits:

for x12 in digits - set([x11]):

for x13 in digits - set([x11, x12]):

for x14 in digits - set([x11, x12, x13]):

s = x11 + x12 + x13 + x14

if s < 22: continue

for x21 in digits - set([x11, x12, x13, x14]):

for x22 in digits - set([x11, x12, x13, x14, x21]):

for x23 in digits - set([x11, x12, x13, x14, x21, x22]):

x24 = s - x21 - x22 - x23

if x24 <= 0 or x24 in [x11, x12, x13, x14, x21, x22, x23]: continue

for x31 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24]):

for x32 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24, x31]):

for x33 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24, x31, x32]):

x34 = s - x31 - x32 - x33

x41 = s - x11 - x21 - x31

x42 = s - x12 - x22 - x32

x43 = s - x13 - x23 - x33

x44 = s - x14 - x24 - x34

if x34 <= 0 or x41 <= 0 or x42 <= 0 or x43 <= 0 or x44 <= 0: continue

data = [x11, x12, x13, x14, x21, x22, x23, x24, x31, x32, x33, x34, x41, x42, x43, x44]

if len(data) != len(set(data)): continue

if is_magic(data, 4):

print data

cnt += 1

print cnt

В результате, программа проработала всего лишь около часа (вместо 3-х лет!), всего было выведено 7040 квадратов размерностью 4х4. Разумеется, большинство из них являются поворотами или отражениями друг друга, было доказано что уникальных квадратов всего 880.

Вспомним магический квадрат Дюрера, в нижнем его столбце есть цифры 1514, соответствующие году создания гравюры. С помощью программы можно решить еще одну задачу: посмотреть сколько всего возможно квадратов с такими цифрами. Здесь число вариантов перебора еще меньше, т. к. еще 2 цифры фиксированы. Оказывается, помимо «авторского», возможны всего 32 варианта, например:

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

Интересно, что верхний ряд помимо цифр 15 и 14 может содержать либо 1, 4 либо 2, 3, других вариантов нет. Разные варианты содержат лишь перестановки этих цифр.

Если же говорить о квадратах большей размерности, то число вариантов перебора для них получается слишком большим. Так для квадрата 5х5, даже если выразить крайние члены через соседние, получаем 4х4 остающихся клеток, что даст нам те же самые 16! вариантов перебора. Разумеется, в реальности такие квадраты не строили методом полного перебора, существует множество алгоритмов их построения, например метод Франклина, Россера, Рауз-Болла, желающие могут поискать их самостоятельно. В архиве с книгой приложен файл «07 - magic5.cpp» для расчета квадратов 5х5 на С++, но автору так и не хватило терпения дождаться результатов.

И наконец, можно вспомнить так называемые «пандиагональные» магические квадраты. Это квадраты, в которых учитываются суммы также «косых» диагоналей, которые получаются если вырезать квадрат из бумаги и склеить его в тор. Желающие могут добавить в программу вывод таких квадратов самостоятельно.

8. Магический квадрат из простых чисел

Существует еще одна разновидность магического квадрата — составленного из простых чисел. Пример такого квадрата показан на рисунке:

29 131 107
167 89 11
71 47 149

Приведенную выше программу легко модифицировать для такого расчета: достаточно лишь заменить множество digits = set(range(1, 16 + 1))на другое, содержащее простые числа.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Рассказы о математике с примерами на языках Python и C»

Представляем Вашему вниманию похожие книги на «Рассказы о математике с примерами на языках Python и C» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Рассказы о математике с примерами на языках Python и C»

Обсуждение, отзывы о книге «Рассказы о математике с примерами на языках Python и C» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x