- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование игр и головоломок - Жак Арсак
Шрифт:
Интервал:
Закладка:
Построим последовательность Полларда для n = 22879:
a1 = 2
a2 = 3
a3 = 8
a4 = 63
a5 = 3968
a6 = 4271
a7 = 6877
a8 = 2235
a9 = 7602
a10 = 20928
a11 = 8486
a12 = 11982
НОД чисел a12 − a4 и n = 22879 есть 137, делитель числа n.
Если мы способны сказать, становится ли данная последовательность периодической (головоломка 1), то мы располагаем быстрым методом определения, имеет ли данное число делитель. Можете играть. Это не такая уж простая программа…
Есть тест на простоту числа, основанный на так называемой малой теореме Ферма: если n — простое, причем число n не является делителем a, то
an−1 = 1 по модулю n.
Представим n в виде n = 2sm + 1. Назовем число n сильно псевдопростым по основанию a, если выполнено одно из следующих двух условий:
либо am = 1 по модулю n,
либо am2r = n − 1 по модулю n = 2sm + 1 для некоторого r, 0 ≤ r < s.
Очень мало сильно псевдопростых чисел, не являющихся простыми; так
2047 = 23 * 89 — сильно псевдопросто по основанию 2,
1373653 = 829 * 1657 — по основанию 2 и 3,
25326001 = 2251 * 11251 — по основанию 2, 3 и 5,
3215031751 = 151 * 751 * 28351 — по основанию 2, 3, 5 и 7.
Метод интересен, потому что an вычисляется за время, растущее не быстрее, чем ln n. Это утверждение вытекает из соотношений:
а0 = 1, а1 = а,
a2n = (а * а)n, a2n+1 = (a * a)n * а.
Все, что нужно для работы, у вас есть. Больше делать нечего, кроме собственно составления программы.
Кстати: знаете ли вы две универсальные конструкции в информатике? Первая — «известно, что…». Вторая — «это и нужно сделать…».
Таинственные программы
Я надеялся не приводить в этой книге никаких готовых программ. Программирую не я, а вы. И я не очень люблю смотреть, как подростки копируют программу, набирая ее на клавиатуре и при этом не отдавая себе отчета в том, что она делает и как устроена. Но сказать, что делает та или иная программа, может оказаться настоящей головоломкой, Программы, которые мы будем обсуждать, написаны на некотором воображаемом языке[10]. Вам придется по крайней мере сделать усилие, чтобы перевести их на ваш обычный язык: Бейсик, LSE или Паскаль. Условная команда записывается в виде
ЕСЛИ условие ТО последовательность команд
КОНЕЦ_ЕСЛИ
(последовательность команд выполняется тогда и только тогда, когда условие истинно)
или
ЕСЛИ условие ТО последовательность команд
ИНАЧЕ последовательность команд
КОНЕЦ_ЕСЛИ
(если условие истинно, то выполняется последовательность команд, заключенная между ТО и ИНАЧЕ, в противном случае выполняется та последовательность команд, которая расположена между ИНАЧЕ и КОНЕЦ_ЕСЛИ).
В обоих случаях КОНЕЦ_ЕСЛИ играет роль закрывающей скобки, связанной с открывающей скобкой ЕСЛИ. Мы будем использовать цикл
ПОКА условие ВЫПОЛНЯТЬ
последовательность команд
ВЕРНУТЬСЯ
Последовательность команд, содержащаяся между ВЫПОЛНЯТЬ и ВЕРНУТЬСЯ, повторяется, ПОКА условие истинно.
* Головоломка 17. Для забавы. Вот легко понимаемая программа. Здесь n и b — два натуральных числа и b нечетно (это существенно)
ПРОЧЕСТЬ n, b
ПОКА n > b ВЫПОЛНЯТЬ
ЕСЛИ n четно ТО n := n/2
ИНАЧЕ n := n − b
КОНЕЦ_ЕСЛИ
ВЕРНУТЬСЯ
СООБЩИТЬ ЕСЛИ n = 0 ТО 'ДА'
ИНАЧЕ 'НЕТ' КОНЕЦ_ЕСЛИ
Вы можете попробовать выполнить ее вручную для
n = 277 − 3, b = 7.
Забавно, не правда ли? Несмотря на свою исключительную» простоту, эта программа, кажется, новая…
*** Головоломка 18. Посерьезнее. Эта — несомненно более трудная. И тоже неопубликованная. Боюсь, что вы можете избаловаться… На вход программы подается n — нечетное натуральное число.
ПРОЧЕСТЬ n
q := (n − 1)/4; p := целая_часть (q)
ЕСЛИ q ≠ p ТО СООБЩИТЬ 'НЕТ';
КОНЕЦ_РАБОТЫ КОНЕЦ ЕСЛИ
ЕСЛИ нечетное p ТО СООБЩИТЬ 'НЕТ';
КОНЕЦ_РАБОТЫ КОНЕЦ_ЕСЛИ
a := 4; b := 1
ПОКА p ≥ a ВЫПОЛНЯТЬ
p := p/2
ЕСЛИ нечетное p ТО p := p − a/2 − b;
b := a − b КОНЕЦ ЕСЛИ a := a + a ВЕРНУТЬСЯ
ЕСЛИ p = 0 ТО СООБЩИТЬ b;
КОНЕЦ РАБОТЫ КОНЕЦ_ЕСЛИ
ЕСЛИ p + 2*b = a ТО СООБЩИТЬ a − b;
КОНЕЦ РАБОТЫ КОНЕЦ_ЕСЛИ
ЕСЛИ p = 4 * (a − b) ТО СООБЩИТЬ 2 * a − b;
КОНЕЦ РАБОТЫ КОНЕЦ_ЕСЛИ
СООБЩИТЬ 'НЕТ'; КОНЕЦ_РАБОТЫ
Я не запрещаю вам перевести эту программу на ваш любимый язык, а затем испытать ее для различных значений n. Есть маленький шанс, что вы угадаете, на что она способна. Это не очевидно!
** Головоломка 19. Вклад Жака Гебенстрейта. Я обязан Жаку Гебенстрейту следующей программой. Она была предложена в том виде, в каком я ее привожу, без какого-либо комментария (это было сделано без злого умысла с его стороны: сам он получил не больше от того, кто дал ему эту программу).
ПРОЧЕСТЬ a, b; p : = max (a, b); q := min (a, b)
ПОКА q > eps ВЫПОЛНЯТЬ
r := (q/p)²; s := r/(r + 4)
p := (2 * s + 1) * p; q := s * q
ВЕРНУТЬСЯ
результат := p
Как вам кажется, что вычисляет эта программа?
3. Игры без стратегии
Общие предложения
Мы собираемся предложить здесь игры для программирования. Мы выбрали их потому, что они не требуют придумывания выигрывающей стратегии при составлении программы. Каждая игра ставит вас перед, вообще говоря, непредсказуемой ситуацией. Вы должны играть, соблюдая правила и имея в виду добиться определенной цели. Вам следовало бы развить собственную стратегию. После того, как вы предложили свой ход, компьютер сообщает новое состояние игры, затем изменяет это состояние некоторым почти полностью определенным образом. Ваша стратегия должна оценить, как именно.
Программирование этих игр не представляет заметных трудностей. Это — не головоломка (если исключить лабиринт для коня, который представляет настоящую трудность). Но нужно работать очень тщательно, чтобы компьютер соблюдал правила и не жульничал. Ошибки программирования всегда достойны осуждения. Здесь может возникнуть. искушение сделать все быстро, потому что в конце концов всегда что-то получится. Тщательно изучите задачу, продумайте прежде чем писать, составьте план вашей программы, разберите подзадачи отдельно…
Игра 6. Гениальный ответчик.
Я не думаю, что есть еще хоть кто-нибудь, кто не знает игру, которую М. Мейрович назвал «гениальный ответчик»[11]. Обычно она играется с цветными шашками (6 и 8 различных цветов в зависимости от изготовления). Играющий должен угадать сделанную из этих шашек тайную комбинацию. Так, в варианте «мини» вы должны угадать комбинацию из четырех шашек, например: ГОЛУБАЯ ЖЕЛТАЯ ЖЕЛТАЯ КРАСНАЯ (в этом порядке). Второй игрок — ведущий. Это он выбирает комбинацию для угадывания и он оценивает ходы, которые вы делаете. Ваш ход в игре состоит в том, что вы предлагаете комбинацию, содержащую то же число шашек, из того же набора цветов, например, КРАСНАЯ ГОЛУБАЯ ЖЕЛТАЯ ГОЛУБАЯ.
Ведущий сообщает вам, сколько шашек из вашей комбинации содержат правильный цвет на правильном месте: здесь — 1, третья шашка ЖЕЛТАЯ, как и в неизвестной вам комбинации. Затем он сообщает вам, сколько шашек имеют правильный цвет, но стоят на неправильных местах. Здесь 1, так как вы предложили красную шашку, но она на неверном месте. Согласно традиции, ведущий выставляет столько черных шашек, сколько в вашем ответе шашек правильного цвета на правильном месте, а затем столько белых шашек, сколько шашек правильного цвета на неверных местах.

