От издательства
Предисловие
Глава 7. Комбинаторный поиск
7.2.1.2. Генерация всех перестановок
Ответы к упражнениям
Предметно-именной указатель
Опкоды MMIX
Text
                    ИСКУССТВО
ПРОГРАММИРОВАНИЯ
ТОМ 4, ВЫПУСК 2


THE ART OF COMPUTER PROGRAMMING VOLUME 4, FASCICLE 2 Generating All Tuples and Permutations DONALD E. KNUTH Stanford University ADDISON-WESLEY Upper Saddle River, NJ • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munich • Paris • Madrid Capetown • Sydney • Tokyo • Singapore • Mexico City
ИСКУССТВО ПРОГРАММИРОВАНИЯ ТОМ 4, ВЫПУСК 2 Генерация всех кортежей и перестановок ДОНАЛЬД Э. КНУТ Станфордский университет Москва • Санкт-Петербург • Киев 2008
ББК 32.973.26-018.2.75 К53 УДК 681.142.2 Издательский дом "Вильяме" Зав. редакцией С. Н. Тригуб Перевод с английского и редакция канд. физ.-мат. наук Ю.Г. Гордиенко По общим вопросам обращайтесь в Издательский дом "Вильяме" по адресу: infoOwilliamspublishing.com, http://www.williamspublishing.com 115419, Москва, а/я 783; 03150, Киев, а/я 152 Кнут, Дональд Эрвин. К53 Искусство программирования, том 4, выпуск 2. Генерация всех кортежей и перестановок. : Пер. с англ. — М. : ООО "И.Д. Вильяме", 2008. — 160 с. : ил. — Парал. тит. англ. ISBN 978-5-8459-1164-3 (рус.) Этот выпуск представляет собой продолжение главы о комбинаторных алгоритмах, которая будет включена в четвертый том Искусство программирования. Поскольку часть этого тома составит большая глава о комбинаторном поиске, то этот выпуск начинается с рассмотрения генерации всех возможных объектов. Особое внимание уделяется генерации всех n-кортежей, которые расширяют эти идеи для всех перестановок. Такие алгоритмы дают естественную мотивацию, с помощью которой вводятся и развиваются многие ключевые идеи комбинаторной математики. Кнут в этом и других выпусках тома 4 иллюстрирует важные теории, рассматривая связанные с ними игры и головоломки. Даже самое серьезное программирование может быть увлекательным. ББК 32.973.26-018.2.75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Addison-Wesley Publishing Company, Inc. Authorized translation from the English language edition published by Addison-Wesley Publishing Company, Inc, Copyright © 2005 by Pearson Education, Inc. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Rights to this book were obtained by arrangement with Addison-Wesley Longman, Inc. Russian language edition published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2007 ISBN 978-5-8459-1164-3 (рус.) ISBN 0-201-85393-0 (англ.) © Издательский дом "Вильяме", 2008 © by Pearson Education, Inc., 2005
СОДЕРЖАНИЕ Глава 7. Комбинаторный поиск 11 7.2. Генерация всех возможных объектов 12 7.2.1. Генерация основных комбинаторных объектов 12 7.2.1.1. Генерация всех п-кортежей 12 7.2.1.2. Генерация всех перестановок 53 Ответы к упражнениям 91 Предметно-именной указатель 140 Я считаю, что стоило потратить Дни труда, чтобы создать нечто об этом Искусстве или Науке, Законы которых не должны быть утеряны или скрыты. — РИЧАРД ДАКВОРТ (RICHARD DUCKWORTH), Тинтинналогия, или Искусство колокольного звона (Tintinnalogia) (1668)
ОТ ИЗДАТЕЛЬСТВА Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо либо просто посетить наш Web-сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш обратный адрес Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши почтовые адреса: E-mail: inf oQwilliamspublishing. com WWW: http: //www. williamspublishing. com Наши электронные адреса: в России: 115419, Москва, а/я 783 в Украине: 03150, Киев, а/я 152
ПРЕДИСЛОВИЕ Я благодарен всем моим друзьям и выражаю здесь и сейчас мою самую искреннюю признательность тем из них, которые спустя значительное время перестали спрашивать меня: "Ну как там твоя книга, получается?" — ПЕТЕР ДЖ. ГОМЕС (PETER J. GOMES), Хорошая книга (The Good Book) (1996) Эта брошюра содержит дополнение 2 книги Искусство программирования, Том 4: Комбинаторные алгоритмы. Как уже говорилось в предисловии к дополнению 1 тома 1, я публикую этот материал в предварительной форме, поскольку знаю, что для завершения тома 4 потребуется много лет, а я не могу допустить, чтобы читатели так долго ждали, и мне хочется поскорее получить их ценные замечания. Конечно, когда-нибудь я напишу и дополнение 1 для тома 4 и даже дополнение О, но пока что я написал дополнение 2. Опытные программисты знают, что инициализацию программы нельзя выполнить должным образом, если не создана основная часть программы. Чтобы создать контекст, это дополнение содержит разделы 7.2.1.1 и 7.2.1.2 очень длинной главы о комбинаторном поиске. В конечном итоге глава 7 займет три тома (а именно тома 4А, 4В и 4С), если, конечно, мое здоровье позволит завершить эту работу. Она начинается с обзора теории графов с акцентом на некоторые интересные графы в базе данных The Stanford GraphBase, из которой я буду приводить множество примеров. Затем идет раздел 7.1, в котором описываются битовые операции и алгоритмы, связанные с логическими (булевыми) функциями. Раздел 7.2 посвящен генерации всех возможных объектов и начинается с раздела 7.2.1 о генерации основных комбинаторных объектов. Эти разделы, а именно разделы 7.2.1.1 (где я начинаю изложение с описания генерации гс-кортежей) и 7.2.1.2 (которые расширяют идеи перестановок), образуют основное содержание данной брошюры. Затем идут раздел 7.2.1.3 (о комбинациях), раздел 7.2.1.4 (о целочисленных разбиениях) и раздел 7.2.1.5 (о разбиениях множеств) в дополнении 3, раздел 7.2.1.6 (о деревьях) и раздел 7.2.1.7 (об истории генерации комбинаций) в дополнении 4. Раздел 7.2.2 посвящен общим вопросам перебора с возвратами. И так далее, если все пойдет так, как задумано. Текущее содержание всей главы 7 регулярно обновляется на Web-странице taocp, которая указана на странице 8. С огромным удовольствием я излагал этот материал, подобно тому приятному возбуждению, с которым я писал том 2 много лет назад. При работе над томом 2 я, к своему восхищению, обнаружил, что основные принципы элементарной теории вероятности и теории чисел возникают естественным образом при изучении
8 ПРЕДИСЛОВИЕ алгоритмов генерации случайных чисел и арифметики. Так и при работе над разделом 7.2.1 я обнаружил, что основные принципы элементарной комбинаторики возникают естественным и аргументированным образом при изучении алгоритмов генерации комбинаций. Таким образом, снова обнаружилась прекрасная история, которую следовало бы рассказать. Моим исходным намерением было уделить меньше внимания этой теме. Однако, когда я обнаружил, насколько фундаментальными являются эти идеи для комбинаторики в целом, я не мог оставаться равнодушным и решил раскрыть эту тему более подробно. Потому я приложил все усилия для создания прочного фундамента для теоретических и практических идей, которые используются при создании многих надежных сверхструктур. Тема генерации комбинаторных объектов дает мне возможность не только обсудить важные математические теории, но и развлечься, поскольку эта тема тесно связана с занимательными играми и головоломками. Хорошие головоломки очень помогают в процессе обучения, поэтому я решил продолжить их использование в томе 4. Обычный мальчишка, который ненавидит квадратный корень или алгебру, приходит в восторг, решая головоломки, в которых используются те же принципы, и может настолько войти в курс дела, что у него разовьются такие математические и изобретательные шишки, которые приведут в изумление семейного френолога. (Френология—это лженаука о зависимости способностей человека от формы и размера его мозга, с особым вниманием на шишки, т.е. отдел мозга, где якобы концентрируются какие-то выдающиеся способности.—Примеч. ред.) — СЭМ ЛОЙД (SAM LOYD), Мир загадок (The World of Puzzledom) (1896) За каждую опечатку*, политически некорректное высказывание, а также ошибку, относящуюся к сути излагаемого материала или к приведенным историческим сведениям, я охотно заплачу $2,56 тому, кто первым ее найдет. То же самое вознаграждение будет назначено тому, кто найдет термины, которые я забыл упомянуть в предметно-именном указателе. Любые ценные предложения для улучшения текста будут оценены 32 центами за каждое. (Более того, если вы найдете более эффективное решение упражнения, я вознагражу вас бессмертной славой вместо презренных денег, публикуя ваше имя в окончательном варианте этой книги:—) Я хочу поблагодарить Йоичи Харигучи (Yoichi Hariguchi) за помощь в сборке и модернизации компьютера, с помощью которого написана эта брошюра. Я также благодарю Фрэнка Раски (Frank Ruskey) за смелую попытку навязать черновик этого материала студентам колледжа и пересказ полученного им опыта при использовании этих материалов во время занятий. Описания используемых в этой книге обозначений (если они не описаны явно в тексте) можно найти в перечне обозначений в конце томов 1, 2 или 3 со ссылками на места с более подробной информацией. Конечно, том 4 в будущем будет содержать собственный перечень обозначений. * Имеется в виду оригинал настоящего издания. — Примеч. ред.
ПРЕДИСЛОВИЕ 9 Примеры на машинном языке во всех будущих изданиях книги Искусство программирования будут основаны на компьютере MMIX, который определяется в разделе 1.3. Г тома 1, дополнения 1. Перекрестные ссылки на разделы 1.3. Г, 1.3.2', 1.4. Г, 1.4.2' и 1.4.3' в данной брошюре относятся к этому дополнению. Перекрестные ссылки на еще не написанный материал содержат обозначения '00', т.е. ссылки на несуществующие страницы, которые будут заменены фактическими страницами позднее в окончательном варианте книги. Приятного чтения! Станфорд, Калифорния D. Е. К. Декабрь 2004 Web-страница http: //www-сs-faculty. Stanford. edu/~knuth/taocp. html содержит информацию о текущем состоянии англоязычной версии этой книги и связанных с ней других книг. Web-страница http: //www-cs-f acuity. stanf ord. edu/~knuth/sgb.html содержит информацию о базе данных The Stanford GraphBase, включая доступное для копирования программное обеспечение для работы с графами, которые используются во многих примерах главы 7. Web-страница http: //www-cs-facuity. Stanford. edu/~knuth/mmix • html содержит информацию о компьютере MMIX.
ГЛАВА 7 КОМБИНАТОРНЫЙ ПОИСК ^\ Начальные разделы этой главы появятся в дополнениях 0 и 1 тома 4, который JL планируется опубликовать в 2007 году.
12 КОМБИНАТОРНЫЙ ПОИСК 7.2 7.2. ГЕНЕРАЦИЯ ВСЕХ ВОЗМОЖНЫХ ОБЪЕКТОВ Все на месте и под контролем, сэр. — Традиционная форма доклада начальству в американской армии Все на месте и в порядке, сэр. — Традиционная форма доклада начальству в британской армии 7.2.1. Генерация основных комбинаторных структур Наша цель в этом разделе состоит в изучении методов обработки всех возможных объектов в некой комбинаторной вселенной, поскольку часто приходится сталкиваться с проблемами, при решении которых необходимо или желательно тщательно изучить все возможные случаи. Например, часто требуется изучить все перестановки заданного множества. Одни авторы называют эту задачу перечислением всех возможностей, но это не совсем верно, поскольку "перечисление" в большинстве случаев означает, что мы всего лишь хотим подсчитать общее количество случаев, а не проанализировать их. Если кто-нибудь поставит задачу перечислить все перестановки множества {1,2,3}, то вполне обоснованно можно дать краткий ответ, 3! = 6, вместо более полного ответа — {123,132,213,231,312,321}. Другие авторы называют эту задачу составлением перечня всех возможностей, но это также не совсем верно. Вряд ли кто-нибудь захочет создавать перечень всех 10! = 3,628,800 перестановок {0,1,2,3,4,5,6,7,8,9}, печатая их на тысячах страниц или вводя в огромный файл. Что действительно нужно, так это научиться представлять их в виде некоторой структуры данных, чтобы программа могла последовательно анализировать каждую перестановку. Поэтому мы говорим о генерации всех необходимых комбинаторных объектов и посещении каждого объекта. В разделе 2.3.1 мы изучали алгоритмы обхода дерева, где целью было посещение каждого узла дерева. Здесь мы также попробуем создать алгоритмы, которые систематически обходят комбинаторное пространство возможных объектов. Он всех их зачислил — Он всех их зачислил; И никто не упущен — Никто не упущен. — УИЛЬЯМ С. ГИЛЬБЕРТ, Микадо (The Mikado) (1885) 7.2.1.1. Генерация всех п-кортежей. Начнем с малого, рассматривая процедуру обхода всех 2П строк, которые состоят из п двоичных цифр. Иначе говоря, попробуем обойти все n-кортежи (ai,..., an), где каждый элемент dj является либо 0, либо 1. Эта задача, по сути, эквивалентна проверке всех подмножеств заданного множества {х\,..., хп}, поскольку можно сказать, что Xj находится в подмножестве тогда и только тогда, когда = 1.
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 13 Конечно, такая задача имеет чрезвычайно простое решение. Все, что нужно, — начать с двоичного числа (0... 00)2 = 0 и повторно добавлять 1 до тех пор, пока не достигнем (1... 11)г = 2n— 1. Однако вскоре при более глубоком анализе мы увидим, что эта очень простая задача имеет удивительно интересные особенности. Изучение n-кортежей окупится позже при изучении особенностей генерации более сложных типов структур. Прежде всего, нетрудно заметить, что двоичная запись может быть расширена на другие типы n-кортежей. Например, если нужно генерировать все варианты (ai,...,an), в которых каждый элемент а3- является одной из десятичных цифр {0,1,2,3,4,5,6,7,8,9}, то их можно подсчитать от (0...00)ю = 0 до (9...99)ю = 10п — 1 в десятичной системе счисления. Если нужно в более общем смысле проанализировать все случаи, в которых 0 < aj < rrij для 1 < j < n, (1) где верхние границы rrij могут отличаться в разных компонентах вектора (а\,..., an), то задача сводится к задаче повторного добавления единицы к числу ai, a2, ..., ап j ^ mi, 7722, • • • ? тп J в смешанной позиционной системе счисления (см. уравнение 4.1-(9) и упражнение 4.3.1-9). Возьмем паузу и опишем этот процесс более строго. Алгоритм М (генерация в смешанной позиционной системе счисления). Это алгоритм посещения всех n-кортежей, которые удовлетворяют (1) за счет повторного добавления 1 к числу в смешанной позиционной системе счисления в (2) до тех пор, пока не возникнет переполнение. Вспомогательные переменные ао и то вводятся для удобства. Ml. [Инициализировать.] Пусть a,j <— 0 для 0 < j < п, и установить то <— 2. М2. [Посетить.] Посетить n-кортеж (ai,...,an). (Программа, в которой нужно проверить все n-кортежи, теперь приступает к этому.) МЗ. [Подготовиться к прибавлению единицы.] Установить j <— п. М4. [Перенести в случае необходимости.] Если а3 = т3; — 1, установить а3 <— 0, j' «— j — 1, и повторить этот этап. М5. [Увеличить, если это еще не сделано.] Если j = 0, завершить алгоритм. В противном случае установить a,j <— а3; + 1 и вернуться к этапу М2. | Алгоритм М прост и прямолинеен, но не следует забывать, что вложенные циклы еще проще, если п является очень малой константой. Если п = 4, то можно было бы, например, записать следующие инструкции. Для а\ — 0, 1, ..., mi — 1 (в этом порядке) выполнить следующее: Для а,2 = 0, 1, ..., 7П2 — 1 (в этом порядке) выполнить следующее: Для аз = 0, 1, ..., шз — 1 (в этом порядке) выполнить следующее: (3) Для а4 = 0, 1, ..., rri4 — 1 (в этом порядке) выполнить следующее: Посетить (ai,a2,a3,a4).
14 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Рис. 10. (а) Лексикографический двоичный код; (Ь) Двоичный код Грэя Эти инструкции эквивалентны алгоритму М и легко выражаются на любом языке программирования. Двоичный код Грэя. Алгоритм М проходит все варианты (ai,..., ап) в лексикографическом порядке, как в словаре. Но есть много ситуаций, в которых предпочтительнее было бы посетить эти n-кортежи в некотором другом порядке. Наиболее известным альтернативным упорядочением является так называемый двоичный код Грэя, который перечисляет все 2П строк из п бит таким образом, что только один бит изменяется каждый раз простым и регулярным способом. Например, двоичный код Грэя для п = 4 выглядит так: Такой код имеет особо важное значение в приложениях, в которых аналоговая информация преобразуется в цифровую или наоборот. Предположим, что с помощью 4 сенсоров белого и черного цветов нужно идентифицировать текущее положение на вращающемся диске, который поделен на 16 секторов. Если использовать лексикографический порядок для обозначения треков от 0000 до 1111, как показано на рис. 10,а, то на границах секторов может возникнуть неточность измерения. А при использовании двоичного кода Грэя, как показано на рис. 10,6, неточностей не может быть вовсе. Двоичный код Грэя можно определить несколькими эквивалентными способами. Например, если Гп обозначает двоичную последовательность Грэя из п-битовых строк, то можно определить Гп рекурсивно двумя правилами: где € обозначает пустую строку; 0ГП — последовательность Гп с префиксом 0 в каждой строке; а 1Г^ — последовательность Гп в обратном порядке с префиксом 1 в каждой строке. Поскольку последняя строка в Гп равняется первой строке в Г^, то из (5) ясно, что в точности один бит изменяется на каждом этапе Гп+1, если Гп имеет то же свойство. Еще один способ определения последовательности Гп = #(0), #(1), ..., #(2n— 1) заключается в задании явной формулы для отдельных элементов g(k). Действи- 0000,0001, ООН, 0010, ОНО, 0111,0101,0100, 1100,1101,1111,1110,1010,1011,1001,1000. (4) Г0 = е; (5) Гп+1 = 0ГП, 1Г^,
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 15 тельно, поскольку Гп+х начинается с 0ГП, то неограниченная последовательность Гос = 9(0), д(1), д(2), д(3), д(4),... = (0)2,(1)2,(11)2,(10)2,(110)2)... ( } является перестановкой всех неотрицательных целых чисел, если рассматривать каждую строку из нулей и единиц как двоичное целое число с необязательными ведущими нулями. Тогда Гп состоит из первых 2П элементов (6), преобразованных в n-битовые строки за счет вставки нулей слева, если необходимо. Если к = 2П + г, где 0 < г < 2П, то (5) означает, что д(к) равен 2П + д(2п- 1 — г). Следовательно, по индукции можно доказать для п, что целое число к с двоичным представлением (...62^1^0)2 имеет эквивалент д(к) в двоичном коде Грэя с представлением (... a2aiao)2> где а3 = bj ф 67+1, для j > 0. (7) (См. упр. 6.) Например, ^((111001000011)2) = (100101100010)2. Наоборот, если д(к) = (... a2aiao)2> то можно найти к = (... 62^1 &оЬ? обращая систему равенств (7) и получая bj = CLj Ф Ф Q>j+2 Ф • • •, для j > 0. (8) Эта бесконечная сумма на самом деле конечна, поскольку aJ+t = 0 для всех больших t. Одно из многочисленных приятных следствий уравнения (7) заключается в том, что д(к) можно вычислить очень легко с помощью битовой арифметики: д(к) = к®[к/2\. (9) Аналогично, обратная функция в (8) удовлетворяет = / е L'/2J е L'/-*J ф • • •. (ю) Однако для этой функции требуется больше вычислений (см. упр. 7.1.3-117). Из (7) можно также вывести, что если кик' являются любыми неотрицательными целыми числами, то g(k®V) = д(к)®д(к'). (11) Еще одно следствие состоит в том, что (п + 1)-битовый двоичный код Грэя может быть записан в виде Гп+1 = 0ГП, (огп)епо...о. Эта структура очевидна, например, в (4). Сравнивая ее с (5), можно заметить, что обращение порядка двоичного кода Грэя эквивалентно дополнению первого бита: п-1 Г£ = Гп ф 10^0. (12) В приведенном ниже упражнении показано, что функция д(к), определенная в (7), и обратная ей функция д^~1\ определенная в (8), имеют много других интересных свойств и приложений. Порой эти функции рассматриваются как принимающие двоичные строки и возвращающие двоичные строки. А иногда эти функции рассматриваются как принимающие целые числа и возвращающие целые числа посредством двоичной системы обозначений без учета ведущих нулей.
16 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Двоичный код Грэя назван так в честь физика Фрэнка Грэя (Frank Gray), прославившегося изобретением, которое долгое время использовалось для обеспечения нормального приема цветных программ черно-белым телевизионным приемником [Bell System Tech. J. 13 (1934), р.464-515]. Он изобрел код Гп для приложений с кодово-импульсной модуляцией , т.е. метода аналоговой передачи цифровых сигналов [Bell System Tech. J. 30 (1951), p.38-40; U.S. Patent 2632058 (17 March 1953); W. R. Bennett, Introduction to Signal Transmission (1971), р.238-240]. Но идея двоичного кода Грэя была известна задолго до его работы над этой проблемой, например, из патента U.S. Patent 2307868 (12 January 1943) Джорджа Стибица (George Stibitz). Важнее другое: код Г5 использовался в телеграфной машине, продемонстрированной в 1878 году Эмилем Бодо (Emile Baudot), в честь которого была названа единица измерения "бод". Почти в то же время аналогичный, но более систематический код для телеграфа был независимо предложен Отто Шафлером (Otto Schaffler) [Journal Telegraphique 4 (1878), p.252-253; Annates Telegraphiques 6 (1879), 361, p.382-383].* Интересно, что двоичный код Грэя неявно присутствует в классической игрушке, которая веками забавляла людей и известна как "китайское переплетение колец", или "Chinese ring puzzle" на английском языке, хотя англичане часто называют эту головоломку "утомительными железками" ("tiring irons"). На рис. 11 показан пример этой головоломки с 7 кольцами. Задача заключается в том, чтобы снять кольца со стержня, а кольца переплетены таким образом, что возможны только два основных действия (хотя это может быть не совсем очевидно на данном рисунке): a) Самое правое кольцо можно снять или сдвинуть в любой момент времени; b) Любое другое кольцо можно снять или сдвинуть тогда и только тогда, когда кольцо справа от него находится на стержне и сняты все кольца справа от него. Текущее состояние головоломки можно представить в двоичной системе счисления, где 1 означает, что кольцо находится на стержне, а 0 — что кольцо снято. Таким образом, на рис. 11 показано состояние с кодом 1011000. (Второе кольцо слева обозначено нулем, поскольку оно полностью находится над стержнем.) Французский судья-магистрат Луи Грос (Louis Gros) продемонстрировал явную связь между этой головоломкой и двоичными числами в анонимно опубликованной книжке Теория безделья (Theorie du Baguenodier) [шик!] (Lyon: Aime Vingtrinier, 1872). Если кольца находятся в состоянии an_i.. .ao и если определить двоичное число к = (bn-i... 60)2 согласно (8), то точно на к шагов больше будет необходимо и достаточно для решения головоломки. Таким образом, Грос является истинным изобретателем двоичного кода Грэя. * Некоторые авторы утверждают, что код Грэя был изобретен Элиша Грэем (Elisha Gray), который создал печатающую телеграфную машину в то же время, что и Бодо и Шафлер. Такие заявления не соответствуют действительности, хотя с Элиша обошлись несправедливо в отношении приоритета в изобретении телефона [L. W. Taylor, Amer. Physics Teacher 5 (1937), p.243-251]. Рис. 11. Головоломка "китайское переплетение колец'
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 17 Несомненно, что эта очаровательная, историческая и поучительная головоломка должна быть в каждом доме. — ГЕНРИ Э. ДЬЮДЕНИ (HENRY Е. DUDENEY) (1901) Если кольца находятся в произвольном состоянии, отличном от состояний 00... О или 10... 0, то возможны точно два действия: одно типа (а) и одно типа (Ь). Только одно из этих действий дает продвижение к заданной цели, а другое является шагом назад, который нужно отменить. Действие типа (а) меняет к на к 0 1. Таким образом, его нужно выполнять, если к является нечетным числом, поскольку в таком случае удается уменьшить к. Действие типа (Ь) в состоянии, которое оканчивается в виде (10J_1)2 для 1 < j < п, изменяет к на &0(F+1)2 = &0(2J+1 — 1). Если к четно, то нужно fc0(2-7+1 — 1) приравнять к /с — 1, что означает, что к должно быть кратно 2J, но не кратно 2J+1, или, иначе говоря, 3 = (13) где р называется "масштабной функцией" уравнения 7.1.3-(44). Следовательно, для оптимального решения головоломки действия с кольцами должны подчиняться следующей закономерности. Если пронумеровать кольца 0, 1, ..., п — 1 (начиная со свободного конца), то последовательность снятий и одеваний колец со стержня будет иметь вид последовательности чисел, которая заканчивается р(4), р(3), Р(2), Идя в обратном направлении, нужно последовательно снимать или одевать кольца до тех пор, пока не будет достигнуто конечное состояние 10... 0 (которое, как заметил Джон Уоллис (John Wallis) в 1693 г., гораздо сложнее получить, чем, на первый взгляд, более сложное состояние 11...1). Таким образом, получаем алгоритм решения в двоичном коде Грэя: Алгоритм G (генерация двоичного кода Грэя). Этот алгоритм посещает все двоичные n-кортежи (an_i,..., а\, ао), начинаясь с (0,..., 0,0) и изменяя последовательно только по одному биту и поддерживая бит четности в таком состоянии, что «оо - «п-1 0 • • • 0 ai 0 а0. (14) Он последовательно дополняет биты р(1), р(2), р(3), ..., p(2n- 1) и затем останавливается. G1. [Инициализировать.] Установить а3 <— 0 для 0 < j < п; также установить doc «- 0. G2. [Посетить.] Посетить n-кортеж (an_i,..., ai, ао). G3. [Изменить четность.] Установить a^ <— 1 — а^. G4. [Выбрать j.] Если a^ = 1, то установить j +— 0. В противном случае пусть J > 1 будет таким минимальным, что ад-\ — 1. (После fc-го выполнения этого этапа j = p(k).) G5. [Дополнить координату j.] Завершить, если j = п. В противном случае установить aj <— 1 — а3- и вернуться к Г2. | Бит четности aoo пригодится при вычислении суммы ^000 — -^001 — -^010 + -^011 — ^100 + -^101 + -^110 — ^111
18 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Х$ ~ Ха — Хь -ь Хаь — Хс + Хас + Xbc — Хаьс где знак зависит от четности двоичной строки или количества элементов подмножества. Такие суммы часто возникают в формулах "включения-исключения", как в уравнениях 1.3.3-(29). Бит четности также необходим для эффективности: без него было бы не так просто выбрать один из двух способов определения значения j, которое соответствует выполнению действия типа (а) или типа (Ь) в "китайском переплетении колец". Но наиболее важной особенностью алгоритма G является то, что на этапе G5 происходит только одно изменение координаты. Следовательно, обычно требуется только простое изменение суммируемых членов X или других структур, с которыми приходится иметь дело при посещении каждого п-кортежа. Конечно, невозможно избежать двусмысленности, связанной с цифрой самого младшего разряда, за исключением способа, с помощью которого, по слухам, одна из ирландских железных дорог попробовала решить одну проблему: они предложили удалить последний вагон во всех поездах, поскольку именно они особенно уязвимы при столкновениях поездов. — Г. Р. СТИБИЦ (G. R. STIBITZ) и ДЖ. Э. ЛАРРИВИ (J. A. LARRIVEE), Математика и компьютеры (Mathematics и Computers) (1957) Еще одно ключевое свойство двоичного кода Грэя было открыто Дж. Л. Уолшем (J. L. Walsh) в связи с важной последовательностью функций, которые теперь известны как функции Уолша [Amer. J. Math. 45 (1923), p. 5-24]. Пусть wo(x) = 1 для всех действительных чисел х, а wk{x) = (-l)L2a5jrfc/2lti;Lfc/2j(2x) для к > 0. (15) Например, w\(x) = (—l)L2a?J изменяет знак всякий раз, когда х является целым числом или целым числом плюс \. Отсюда следует, что Wk(x) = Wk{x+1) для всех к nwk(x) = ±1 для всех х. Гораздо важнее то, что Wk(0) = 1 и Wk(x) точно к раз меняет знак в диапазоне (0.. 1) и приближается к (—1)к по мере того, как х приближается к 1 слева. Следовательно, Wk(x) ведет себя скорее как тригонометрическая функция cos ктгх или sin ктгх. Поэтому другие функции можно представить в виде линейной комбинации функций Уолша таким же образом, каким они обычно представляются с помощью рядов Фурье. Этот факт, вместе с простой дискретной природой Wk(x), означает, что функции Уолша чрезвычайно полезны в компьютерных вычислениях, связанных с передачей информации, обработкой изображений и многими другими приложениями. На рис. 12 показаны первые восемь функций Уолша вместе с их тригонометрическими "собратьями". Инженеры обычно называют Wk(x) функцией Уолша с порядком fc, по аналогии с тригонометрическими функциями cos ктгх и sin ктгх с частотой к/2 [см., например, Н. F. Harmuth, Sequency Theory: Foundations и Applications (New York: Academic Press, 1977)]. Хотя уравнение (15) на первый взгляд выглядит пугающе, на самом деле оно предоставляет с помощью индукции простой способ объяснения, почему Wk(x) имеет точно к изменений знака. Если к четно, например к = 21, то W2i{x) = wi(2x) для 0 < х < |, т.е. функция wi(x) сжимается вдвое и W2i(x) содержит I изменений
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 19 w0(x) w2(x) w3(x) w4(x) w5(x) Wq(x) Рис. 12. Функции Уолша Wk(x) для О < < 8 и аналогичные тригонометрические функции y/2cosk7rxy показанные для сравнения серым цветом знака. Тогда u)2i{x) = (—l)lwi(2x) = (—\)lwi(2x — 1) в диапазоне | < х < 1, что позволяет присоединить другую копию wi(2x), обращая знак в случае необходимости во избежание изменения знака при х = \. Функция W2i+i{x) аналогична, но она вынуждает изменить знак при х = |. Какое отношение к этому имеет двоичный код Грэя? Уолш обнаружил, что все его функции можно компактно выразить на основе более простых функций Радемахера [см. Hans Rademacher, Math. Annalen 87 (1922), p.112-138], rk(x) = (-1)L24 (16) которые принимают значение (—l)c-fc, где (... C2C\Cq.c-\C-2 • • • Ь является двоичным представлением х. Действительно, w\(x) = r\(x), W2(x) = г\(х)г2(х), ws(x) = г2(ж), и в общем случае wk(x) = П ri+i (xp®b^, где k = (bn.!... 6x60)2. (17) j>0 (См. упр. 33.) Таким образом, порядок rj+i(x) в Wk(x) представляет собой j-й бит двоичного числа Грэя g(к), согласно (7), и имеем: wk(x) = rp(k)+i(x)wk-i(x) для А; > 0. (18) Уравнение (17) подразумевает удобную формулу ™k(x)wk>(x) = Wfcefc'O*)* (W)
20 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 которая намного проще, чем соответствующие формулы для произведения синуса и косинуса. Это тождество легко проверить, поскольку rj(x)2 = 1 для всех j и ж, следовательно, rj(x)a®b = rj(x)a+b. В частности, подразумевается, что Wk(x) ортогональна Wk'(x), если к ф к', в том смысле, что среднее значение Wk(x)wk'{x) равно нулю. Уравнение (17) можно использовать для определения Wk(x) для дробных значений к, например 1/2 или 13/8. Преобразованием Уолша 2п чисел (Xq, • • • ? х-2п—i) называется вектор, определенный уравнением (а?о, • • • > #2n-i)T = Wn(Xo,.. . ,Х2п_!)т, где Wn является матрицей 2П х 2П с элементами Wj(k/2n) на пересечении строки j и столбца к для 0 < j, к < 2п. Например, на рис. 12 показано, что преобразование Уолша при п = 3 имеет вид /яооо \ /1 1 xooi 1 1 хою 1 1 x°n - 1 I жюо 1 1 Xioi 1 1 Жцо 1 1 \xiu/ Vl 1 (где 1 обозначает —1, а подстрочный индекс обычно рассматривается как двоичная строка 000-111 для обозначения целых чисел 0-7). Аналогично определяется преобразование Адамара, но вместо матрицы Wn в нем используется матрица Нп, где Нп содержит элементы {—\ук на пересечении строки j и столбца к. Здесь "j • fc" обозначает скалярное произведение an_ifrn_i + • • • + ao&o двоичных представлений j = (an_i... а0)г и А; = (6n_i... 60)2- Например, преобразование Адамара для п = 3 имеет вид / хооо \ с001 1\ / Хооо \ 1 -^001 1 ^010 т ^011 1 -^100 т -^101 1 ^110 Т/ Uiii/ (20) L010 r011 -100 '101 'ПО Z1 I 1 I 1 1 1 1\ / Хооо \ 1111 ^001 1 1 т T 1111 Хою 1 T T 1 1 T T 1 ^011 1111 Till Хюо 1 T 1 T T 1 T 1 X\oi 1 1 T T Till Till) \х1и/ (21) Win/ Это то же самое, что и дискретное преобразование Фурье на n-мерном кубе, см. уравнения 4.6.4-(38), и его можно сразу же "на месте" оценить, адаптируя метод Йетса из раздела 4.6.4: Дано Первый этап Второй этап Хооо ^ooo+-X"ooi Х000+-Х001+-Х010+-Х011 -Хооо -fXooi +Х010 -Х001 Хооо—-Х001 -Хооо— -Xooi+Xoio— Хон Хооо— Xooi+ Хою -Хою Х010+-Х011 Xooo+Xooi — Хою—Хон -Х000+-Х001 — Хою Хон Хою— -Xou Хооо—Xooi — Хою+Xon Хооо— -Xooi —-Хою Хюо Xioo+>Xioi Х100+-Х101+Х110+Х111 Хооо+-Хоо 1 + Хою Xioi Хюо— Xioi Хюо— Xioi+Хцо— Хщ Хооо— Х001+-Х010 Хцо Хцо+A'in Хюо+Xioi —Хцо—Хщ Xooo+^ooi — ^ою Хщ Хцо —Хщ Хюо— Xioi — Xiio+Xm Хооо— -Xooi — Хою Третий этап +-Х011+-Х100+-Х101+Х110+Х111 —^Хоп+-Хюо — Xioi+Хцо— Хщ —Х011+Х100+-Х101 —-Хцо—Хщ +Х011+Х100— Xioi —Хцо+Хщ +Хои —Хюо —-Xioi —Хцо —Хщ —Хон — Х100+-Х101 —-Хцо+Хщ —Хон —Хюо—-Х101+-Х110+-Х111 +Х011 —Х100+-Х101+-Х110 — Хщ
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 21 Обратите внимание на то, что строки Нз являются перестановками строк W%. Это верно и в общем случае, а поэтому преобразование Уолша можно выполнить за счет перестановки элементов преобразования Адамара. Этот прием подробно рассматривается в упражнении 36. Еще быстрее. При анализе 2П возможностей обычно требуется, насколько это возможно, сократить время вычисления. Алгоритм G дополняет только один бит а3 за одно посещение (an_i,..., ao), но зацикливается на этапе G4 при выборе соответствующего значения j. Другой подход был предложен Гидеоном Ерлихом (Gideon Ehrlich) [JACM 20 (1973), p.500-513], который ввел понятие бесцикловой комбинаторной генерации. В бесцикловом алгоритме количество операций, выполняемых между последовательными посещениями, заранее ограничивается, поэтому никогда не приходится долго ожидать генерации новой структуры. В разделе 7.1.3 мы узнали несколько хитроумных и быстрых способов определения количества ведущих или замыкающих 0s в двоичном числе. Эти методы могут быть использованы на этапе Г4, чтобы сделать алгоритм G бесцикловым, если п не слишком велико. Но метод Эрлиха совсем другой и более универсальный, поэтому он расширяет арсенал доступных методов эффективного вычисления. Вот как этот подход можно использовать для генерации двоичных n-кортежей [Bitпег, Ehrlich, and Reingold, САСМ 19 (1976), р.517-521]. Алгоритм L [бесцикловая генерация двоичного кода Грэя). В этом алгоритме, как и в алгоритме G, посещаются все двоичные n-кортежи (an_i,..., ao) в порядке двоичного кода Грэя. Но вместо бита четности в нем используется массив "указателей фокуса" (/п,..., /о), значение которых обсуждается ниже. L1. [Инициализировать.] Установить а3 *— 0 и f3 <— j для 0 < j < п; а также установить /п <— п. (Бесцикловый алгоритм может иметь циклы на этапе инициализации, если это достаточно эффективно. В конце концов, любая программа должна быть загружена и запущена.) L2. [Посетить.] Посетить n-кортеж (an_i,..., ai, ao). L3. [Выбрать j.] Установить j <— /о, /о <— 0. (Если данный этап выполняется в к- й раз, то j теперь равно р(к).) Завершить, если j = п, в противном случае установить f3 <- f3+i и fj+x <- j + 1. L4. [Дополнить координату j.] Установить а3; <— 1 — а3 и вернуться к этапу L2. | Например, для п = 4 вычисления проходят следующим образом. Элемент а3 подчеркнут в этой таблице, если соответствующий бит Ъ3 равен 1 в двоичной строке bsb2bib0 так, что аза2ахао = g(b3b2bib0): 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 а2 0 0 0 0 1 1 I 1 1 1 1 1 0 0 0 0 ai 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 ао 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 /з 3 3 3 3 3 3 3 3 4 4 4 4 3 3 3 3 h 2 2 2 2 3 3 2 2 2 2 2 2 4 4 2 2 h 1 1 2 1 1 1 3 1 1 1 2 1 1 1 4 1 /о 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4
22 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Хотя двоичное число к = (6n_i.. .60)2 никогда не появляется явно в алгоритме L, указатели фокуса fj представляют его неявно хитроумным образом так, что можно повторно получать д(к) = (an_i.. .00)2> дополняя бит ар^у Пусть пассивность а3 обозначается подчеркиванием, а активность — без подчеркивания. Тогда указатели фокуса удовлетворяют следующим инвариантным отношениям: 1) Если бит aj пассивен, а бит а3-\ активен, то fj является таким наименьшим индексом j' > j, что бит aj' активен. (Биты ап и a_i считаются активными в этом правиле, хотя они реально не представлены в алгоритме.) 2) В противном случае fj — j. Таким образом, самый правый элемент aj блока пассивных элементов ai-i... Q>j+io,j с уменьшающимися индексами имеет указатель фокуса который указывает на элемент а» с левой стороны этого блока. Все другие элементы aj имеют указатели фокуса /7, указывающие на себя. На основании этого первые две операции lj <— /0, /о <— 0' на этапе L3 эквивалентны высказыванию: "Установить j равным индексу самого правого активного элемента и активизировать все элементы справа от а/'. Обратите внимание, что если /о = 0, то операция /о <— 0 избыточна, но это не причиняет никакого вреда. Другие две операции на этапе L3, lfj <— /7+1, fj+i <~ 3 + 1'? эквивалентны высказыванию: "Сделаем aj пассивным", поскольку известно, что aj и aj-i активны на этом этапе вычисления. (Опять-таки операция <— j + 1 может быть избыточной, но соверешенно безвредной.) Следовательно, общий результат активизации и деактивизации эквивалентен подсчетам в двоичном системе обозначений, как в алгоритме М, с пассивными битами 1 и активными битами 0. Алгоритм L поразительно быстр, поскольку он содержит только пять операций присваивания и одну проверку завершения между каждыми посещениями генерированного n-кортежа. Но его все равно можно улучшить. Чтобы понять, как его можно улучшить, рассмотрим его приложение в занимательной лингвистике: Рудольф Кастаун (Rudolph Castown) заметил [Word Ways 1 (1968), p.165-169], что все 16 способов смешения букв в слове sins с соответствующими буквами слова fate приводят к получению слов, которые можно найти в обширном словаре английского языка: sine, sits, site и т.д. Все эти слова, кроме слов fane, fite и sats, широко распространены и бесспорно являются частью английского языка. Следовательно, естественно было бы задать аналогичный вопрос для слов из пяти букв: какие две строки из пяти букв порождают максимальное количество слов в базе данных Stanford GraphBase, где буквы в соответствующих положениях обмениваются всеми 32 возможными способами? Для ответа на этот вопрос нужно проверить все (296)5 = 3,625,908,203,125 разные пары строк. Достаточно просмотреть все ( 2 ) = 16,568,646 пары слов в базе данных GraphBase, при условии, что по крайней мере одна из этих пар порождает не меньше 17 слов, поскольку каждый набор из 17 или более 5-буквенных слов, полученных из двух 5-буквенных строк, должен содержать две строки-антипода (без одинаковых соответствующих букв). Для каждой пары строк-антиподов нужно максмально быстро определить, дают ли 32 возможные перестановки слова английского языка. Каждое 5-буквенное слово можно представить как 25-битовое число с помощью 5-битового представления одной буквы: от "а" = 00000 до "z" = 11001. Тогда
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ ГС-КОРТЕЖЕЙ 23 с помощью таблицы из 225 битов или байтов можно быстро определить, является ли 5-буквенная строка словом. Таким образом, задача сводится к генерации битовых комбинаций 32 возможных слов, получаемых с помощью смешения букв двух данных слов, и поиску этих комбинаций в таблице. Для каждой пары 25-битовых слов w и w' следует выполнить следующие действия. W1. [Проверить разницу.] Установить z <— w (Bwf. Отвергнуть пару (w,wf), если ((z - т) 0 z 0 т)кт' ф 0, где т = 220 + 215 + 210 + 25 + 1 и т! = 25т. Благодаря этой проверке исключаются случаи, когда w и и/ имеют общую букву в некотором положении. (См. 7.1.3-(90). Оказывается, что 10 614 085 из 16 568 646 пар слов не имеют таких общих букв.) W2. [Создать индивидуальную маску.] Установить то <— z&c(2b — 1), mi <— z&(210 — 25), m2 <- z&(215-210), m3 <- z&(220-215) и ra4 <- zk(22b-220) для подготовки к следующему этапу. W3. [Подсчитать слова.] Установить / <— 1 и Ао <— w. Переменная / будет содержать количество найденных до сих пор слов, начиная с w. Затем выполнить описанные ниже операции swap(4). W4. [Вывести максимальное решение.] Если I больше текущего максимума или равно ему, то вывести Aj для 0 < j < 1. \ Сердцем этого высокоскоростного метода является последовательность операций swap(4), которая должна быть расширена (например, с помощью макропроцессора) для исключения всех ненужных накладных расходов. Она определяется на основе базовой операции Для заданной операции sw(j), которая переводит буквы в положение j, определяем: swap(0) — sw(0); swap(l) = swap (0), sw(l), swap (0); Таким образом, swap(4) расширяется в последовательность 31 шага stu(0), sw(l), sw(0), stu(2), ..., sw(0) = stu(p(l)), sw(p(2))1 ..., sw(p(31)), которые будут использоваться десять миллионов раз. Очевидно, что выигрыш в скорости получается за счет вставки значений масштабной функции р(к) непосредственно в нашу программу, а не повторных вычислений для каждой пары слов с помощью алгоритмов М, G или L. Победившая пара слов генерирует набор из 21 слова: sw(j): установить w <— w 0 mj. Затем, если w является словом, установить А\ <— w и I <— I + 1. swap(2) swap(S) swap (4) swap(l), sw(2), swap(l)\ swap(2), 5iy(3), swap(2)] swap(3), sw(4), swap(3). (22) ducks, ducky, duces, dunes, dunks, dinks, dinky, dines, dices, dicey, dicky, dicks, picks, picky, pines, piney, pinky, pinks, punks, punky, pucks. (23)
24 КОМБИНАТОРНЫЙ поиск 7.2.1.1 Если, например, w = ducks и vJ = piney, то то = s0y, и первая операция sw(0) заменяет строку ducks строкой ducky, которая является словом. Следующая операция sw(l) применяет тщ, т.е. приводит к замене k0e буквы на предпоследнем месте, что порождает строку ducey, которая не является словом. Применение операции sw(0) заменяет строку ducey строкой duces (слово, являющееся частью юридического термина duces tecum)*и т.д. Все пары слов можно обработать этим методом всего за несколько секунд. Этот метод можно оптимизировать еще больше. Например, после нахождения пары, которая дает к слов, следует отвергнуть все другие пары, если они генерируют 33 — к строк, которые не являются словами. Но рассмотренный выше метод и так достаточно быстрый и может превзойти даже бесцикловый алгоритм L. Приверженцы алгоритма L могут, конечно, возразить, что процесс ускорен только в частном случае, п — 5, а алгоритм L решает задачу генерации для произвольного п. Однако аналогичная идея применима и для п > 5: программу можно расширить так, чтобы она быстро генерировала все 32 положения самых правых битов 0,40,30,20,10,0, как показано выше. Затем можно применить алгоритм L после каждых 32 шагов для последовательных изменений других битов, ап-\... а*>. Этот подход сокращает объем ненужной работы, выполняемой алгоритмом L, почти в 32 раза. Другие двоичные коды Грэя. Двоичный код Грэя #(0), #(1), ..., д(2п — 1) является только одним из многих спсообов обхода всех возможных n-битовых строк, изменяя только один бит на каждом этапе. Назовем в общем случае циклом Грэя для двоичных n-кортежей любую последовательность (г>о, vi,..., ^2^-1), которая включает каждый п-кортеж и обладает таким свойством, что vk отличается от v(k+i) mod 2п только одним битом. Таким образом, на языке теории графов цикл Грэя является ориентированным циклом Гамильтона на n-кубе. Здесь предполагается, что индексы выбраны таким образом, что vo = 0.. .0. Если v представить в виде двоичных чисел, то существуют такие целые числа So • • . #2n-l) что mod 2* = v* © 2*fc для 0 < к < 2п. (24) Эта так называемая дельта-последовательность представляет собой еще один способ описания цикла Грэя. Например, дельта-последовательность для стандартного двоичного кода Грэя для п = 3 имеет вид 01020102. Это, по сути, масштабная функция Sk = р(к + 1) из (13), но последнее значение £2^-1 равно п — 1 вместо п, поэтому цикл завершается. Поскольку отдельные элементы 8к всегда находятся в диапазоне 0 < 5k < п, они называются координатами. Пусть d(n) — это количество разных дельта-последовательностей, которые определяют n-битовый цикл Грэя, а с(п) — это количество канонических дельта- последовательностей, в которых каждая координата к появляется перед первым появлением к + 1. Тогда d(n) = n!c(n), поскольку каждая перестановка координат в дельта-последовательности очевидно порождает другую дельта-последовательность. Легко видеть, что единственными возможными каноническими дельта- * Означает повестку о явке в суд для предоставления имеющихся письменных доказательств. — Примеч. ред.
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 25 Рис. 13. (а) Дополняющий двоичный код Грэя; (Ь) Сбалансированный двоичный код Грэя последовательностями для п < 3 являются 00; 0101; 01020102 и 01210121. (25) Следовательно, с(1) = с(2) = 1, с(3) = 2; d(l) = 1, d(2) = 2, d(3) = 12. Прямые вычисления с помощью методов перечисления циклов Гамильтона, которые будут рассмотрены ниже, дают следующие значения: Здесь трудно уловить закономерность, а числа растут очень быстро (см. упр. 45). Поэтому можно с уверенностью сказать, что никто никогда не скажет, какими будут значения с(8) и с!(8). Поскольку количество возможностей столь велико, то имеет смысл поискать дополнительные полезные свойства циклов Грэя. Например, на рис. 13,а показан 4-битовый цикл Грэя, в котором каждая строка азотахао диаметрально противоположна своему дополнению а^^агао. Такая схема кодирования возможна, когда количество битов является четным (см. упр. 49). Еще больший интерес представляет цикл Грэя, найденный Дж. С. Тутиллом (G. С. Tootill) [Proc. IEE 103, Part В Supplement (1956), p.435] и показанный на рис. 13,6. Он имеет одинаковое количество изменений в каждом из четырех координатных треков, поэтому все координаты в равной мере участвуют во всех операциях. Сбалансированные таким образом циклы Грэя можно создать для всех более крупных значений п с помощью следующего универсального метода расширения цикла от п бит до п + 2 бит. Теорема D. Пусть ol\3\ol23i • ♦ -aiji является дельта-последовательностью для n-битового цикла Грэя, где каждое значение jk является одной координатой, каждое значение а к может быть пустой последовательностью координат, а I — четно. Тогда с(4) = 112; с(5) = 15,109,096; d(4) = 2688; d(5) = 1,813,091,520. (26) ax (n+l)af пс*! j1a2na24(n+l)a2 j2a3(n+l)agna3 ... jz_ia,(n+l)afna{ (n+lJafj^afLi • • -afjiaf n является дельта-последовательностью (n + 2)-битового цикла Грэя. (27)
26 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Например, если начать с последовательности 01020102 для п = 3, где три подчеркнутых элемента являются j\, j2, J3, то новая последовательность (27) для 5-битового цикла имеет вид 01410301020131024201043401020103. (28) Доказательство. Пусть ак имеет длину mk, a vkt является достигнутой вершиной, если начать с 0... 0 и применить изменения координат a\j\... ctk-\jk-i и первые t из ак. Нужно доказать, что все вершины 00vkt, Olv^t, Wvkt и llvkt встречаются при использовании (27) для 1<А;</и0<£< тк. (Самой левой координатой является п+1.) Начиная с 000... 0 = ОО^ю, переходим к вершинам ОО^п, 00vimi, 10vimi, 10vio,lbio, lbimi. Затем ji приводит к 11v2q, за которым следует 11^21, • • • , 1Ь2т2, Ю^2т2, • • • , 10^20,00^20, • • • , 00v2m2. Потом идет ОО^зо и т.д., а в итоге получаем llvimi. В заключение используется третья строка из (27) для генерации всех недостающих вершин 01vimi, ..., Olvio и возвращения к 000... 0. | Числа логических переходов (со,..., cn_i) в дельта-последовательности определяются, полагая, что с3 равняется количеству раз, когда 6к = j. Например, для (28) числа логических переходов равны (12,8,4,4,4) и определяются на основании последовательности с числами логических переходов (4,2,2). Если тщательно выбрать исходную дельта-последовательность и подчеркнуть соответствующий элемент jk, то можно получить максимально близкие (насколько это возможно) числа логических переходов. Следствие В. Для всех п > 1 существует п-битовый цикл Грэя с числами логических переходов (со, с\,..., cn_i), которые удовлетворяют условию \cj-ck\ < 2 для 0 < j < к < п. (29) (Это наилучшее возможное условие равновесия, поскольку каждое значение Cj должно быть четным и со + с\ + • • • -I- cn_i = 2П. Действительно, условие (29) выполняется тогда и только тогда, когда п — г чисел равны 2q и г чисел равны 2q + 2, где q = [2n_1/nJ и г = 2n~l mod п.) Доказательство. Для заданной дельта-последовательности для n-битового цикла Грэя с числами логических переходов (со,..., cn_i) числа для цикла (27) получаются, начиная со значений (cq,..., с^_х, dn, с'п+1) = (4с0,..., 4сп-1, /+1, /+1), затем вычитанием 2 из c'Jk для 1 < k < I и вычитанием 4 из c'jr Например, для п = 3 можно получить 5-битовый сбалансированный цикл Грэя с числами логических переходов (8 — 2,16 —10,8,6,6) = (6,6,8,6,6), если применить теорему D для дельта- последовательности 01210121. В упр. 51 подробно рассматриваются случаи с другими значениями п. | Другой важный класс n-битовых циклов Грэя, в которых каждый трек координат обладает равной ответственностью, возникает при изучении длины серии,
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 27 т.е. расстояния между последовательными появлениями того же значения S. Стандартный двоичный код Грэя имеет длину серии 2 для самого младшего положения, и это может привести к потере точности при необходимости выполнения точных измерений [см., например, рассуждения Дж. М. Лоуренса (G. М. Lawrence) и В. Э. Мак-Клинтока (W. Е. McClintock) в Ртос. SPIE 2831 (1996), р.104-111]. Но все серии имеют длину 4 или более в замечательном 5-битовом цикле Грэя, дельта- последовательность которого имеет вид (0123042103210423)2. (30) Пусть г(п) является таким максимальным значением г, что можно найти такой n-битовый цикл Грэя, в котором все серии имеют длину > г. Ясно, что r(l) = 1, а г(2) = г(3) = г(4) = 2. Легко видеть, что г(п) должно быть меньше п для п > 2. Поэтому из (30) следует, что г(5) = 4. Исчерпывающий компьютерный поиск дает г(6) = 4 и г(7) = 5. Действительно, для прямого вычисления с возвратом для случая п = 7 требуется дерево приблизительно всего с 60 миллионами узлов для определения того, что г(7) < 6. В упражнении 61(a) используется 7-битовый цикл с длинами серий не менее 5. Точные значения г(п) неизвестны для п > 8, но значение г(10) почти определенно равно 8. Существуют интересные соображения, с помощью которых можно доказать, что r(n) = п — O(logn), если п —> со. (См. упр. 60-64.) еДвоичные пути Грэя. Ранее n-битовый цикл Грэя был определен как способ упорядочения всех двоичных n-кортежей в виде последовательности (vo, v\,... ,^2n_i) с таким свойством, что vk является смежным для vk+i в n-кубе для 0 < к < 2П, и таким, что v2"-i является смежным для v$. Это свойство цикличности прекрасно, но не всегда имеет важное значение, и порой можно добиться большего даже без него. Поэтому n-битовым путем Грэя, или кодом Грэя, является любая последовательность, которая удовлетворяет условиям цикла Грэя, за исключением того, что последний элемент необязательно должен быть смежным с первым элементом. Иначе говоря, цикл Грэя является циклом Гамильтона на вершинах n-куба, но код Грэя является просто путем Гамильтона на этом графе. Наиболее важным двоичным путем Грэя, который также не является циклом Грэя, является n-битовая монотонная последовательность (vo, v\,..., V2n-i)? в которой соблюдается условие "Ы) < Фм) для0< k<2n-2. (31) (Здесь и далее и используется для обозначения веса или продольной контрольной суммы двоичной строки, а именно количества единиц в ней.) Метод проб и ошибок свидетельствует, что существует только два монотонных n-битовых кода Грэя для каждого п < 4: один начинается с 0П, а другой — с 0П_11. Для п = 3 они имеют вид 000, 001, 011, 010, 110, 100, 101, 111; (32) 001, 000, 010, ПО, 100, 101, 111, 011. (33) Для п = 4 они менее очевидны, но определяются без особого труда. Поскольку v(vk+\) = v{vk) i 1 всякий раз, когда vk является смежным с Vfc+i, то очевидно нельзя усилить (31) требованием, что все n-кортежи отсортированы
КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 (Ъ) (с) (d) (е) (f) (g) Рис. 14. Примеры 8-битового кода Грэя: a) стандартный; b) сбалансированный; c) дополняющий; d) длинносерийный; e) нелокальный; f) монотонный; g) бестрендовый.
.1 ГЕНЕРАЦИЯ ВСЕХ ГС-КОРТЕЖЕЙ 29 .рого по весу. Но (31) достаточно сильно для определения веса каждого vk, для заданного к и веса vq, поскольку нам известно, что (™) из n-кортежей имеют вес j. На рис. 14 показано всего семь из несметного количества кодов Грэя, которые перечисляют все 256 возможных 8-битовых байтов. Черные квадраты представляют единицы, а белые квадраты — нули. На рис. 14, о показан стандартный двоичный код Грэя,а на рис. 14,6 показан сбалансированный двоичный код Грэя с точно 256/8 = 32 логическими переходами в каждом положении координаты. На рис. 14,с показан код Грэя, аналогичный коду на рис. 13,а, но в котором нижние 128 кодов дополняютверхние 128 кодов. На рис. 14,d показан длинносерийный код, в котором логические переходы в каждом положении координаты происходят не ближе, чем в пяти шагах. Иначе говоря, все серии имеют по крайней мере длину 5. Цикл на рис. 14,е является нелокальным, смысл которого объясняется в упражнении 59. На рис. 14,/ показан монотонный путь для п = 8. Обратите внимание на плавное почернение рисунка в нижей части. Наконец, на рис. 14,# показан полностью немонотонный код Грэя, в том смысле, что центр масс черных квадратов находится точно посередине каждого столбца. Стандартный двоичный код Грэя обладает таким же свойством в семи положениях координат, но на рис. 14,# достигается полное равновесие во всех восьми столбцах. Такой код называется бестрендовым. Он имеет большое значение в аграрной отрасли и других видах деятельности (см. упр. 75 и 76). Карла Сэвидж (Carla Savage) и Питер Винклер (Peter Winkler) [J. Combinatorial Theory A 70 (1995), p.230-248] нашли элегантный способ создания монотонных двоичных кодов Грэя для всех п > 0. Такие пути обязательно строятся на основе подчиненных путей Pnj, в которых все логические переходы совершаются между гс-кортежами весов j и j + 1. Сэвидж и Винклер определили подходящие подчиненные пути, рекурсивно допуская, что Pi о = 0,1, и для всех п > 0 имеем Pnj = 0, если j < 0 или j > гс, (35) где 7гп обозначает перестановку координат, которая описывается далее, а Рж обозначает такую перестановку координат, что каждый элемент an_i...aiao последовательности Р заменяется элементом Ъп-\... b\bo, где bjn = aj. (Здесь для Р* не используется условие bj — ajn, поскольку нужно, чтобы (2-7)71" равнялось 2J7r.) Отсюда следует, например, что Р20 = 0Р1О = 00, 01, (36) поскольку Pi(-i) пуста; также Р21 = 1Р# = 10, 11, (37) поскольку Рц пуста и щ должна быть тождественной подстановкой. В общем случае Pnj является последовательностью n-битовых строк, содержащих точно (п~1) строк с весом j, которые перемежаются (п~1) строками с весом j + 1. Пусть anj и ujnj являются первым и последним элементами Pnj. Тогда мы легко находим, что ujnj = 0n-j-x V+1 для 0 < j < щ (38) ап0 = 0П для п > 0; (39)
30 КОМБИНАТОРНЫЙ ПОИСК ) 000,001,..., 009,019,018,..., 011,010,020,021,..., 091,090,190,191,..., 900, anj = lafn-i)(j-i) для 1 < j < п. (4 В частности, anj всегда имеет вес j и unj всегда имеет вес j + 1. Определим перестановки тгп of {0,1,..., n — 1} так, что обе последовательности -Рпо» -^Л» -Рп2» -Рпз» ••• (41) *Р&> Рщ> Р&, Р«а, ■•■ (42) являются монотонными двоичными путями Грэя для п = 1, 2, 3, .... Действительно, монотонность очевидна, и сомнения остаются только по поводу принадлежности к коду Грэя. Последовательности (41), (42) хорошо связываются, поскольку смежность элементов OinO Oini <*n(n-l)> ^nO b*nl ^n(n-l) (43) непосредственно следует из (34) независимо от перестановок 7гп. Таким образом, ключевым пунктом является переход в месте запятой в формуле (34), который делает Р(п+1^- подчиненным путем Грэя, тогда и только тогда, когда <0-i) = anj Для 0 < 3 < п- (44) Например, если п = 2 и j = 1, приходим к необходимости (Ol)71^2 = c*2i = 10, согласно (38)-(40). Следовательно, 7Г2 приводит к перестановке координат 0 и 1. Общая формула (см. упр. 71) принимает вид *п = wl-i, (45) где оп является n-циклом (п—1 ... 10). Следовательно, первые несколько случаев имеют вид 7Г1 =(0), 7Г4 = (03), 7Г2 = (01), 7Г5 = (04321), тгз = (021), 7гб = (052413). Похоже, не видно замкнутой формы для магических перестановок 7гп. В упр. 73 показано, как могут эффективно генерироваться коды Сэвидж-Винклера. Недвоичные коды Грэя. Мы очень подробно рассмотрели случай двоичных n-кортежей, поскольку это простейшая, классическая, наиболее часто используемая и наиболее исследованная область. Однако есть многочисленные приложения, в которых нужно генерировать (а\,..., ап) с координатами в более широком диапазоне 0 < dj < rrij, как в алгоритме М. Коды Грэя также прекрасно подходят в этом случае. Рассмотрим, например, десятичные цифры, где 0 < а3 < 10 для всех j. Существует ли в десятичной системе счисления способ подсчета, аналогичный двоичному коду Грэя, с изменением только одной цифры? Да, действительно, есть две естественные схемы. В первой схеме, которая называется отраженным десятичным кодом Грэя, последовательность для счета до тысячи с помощью 3-цифровых строк имеет вид
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 31 где каждая координата изменяется попеременно от 0 до 9 и затем обратно от 9 до 0. Во второй схеме, которая называется модульным десятичным кодом Грэя, цифры всегда увеличиваются на 1 по модулю 10, следовательно, они "заворачиваются" от 9 доО: ООО, 001,..., 009,019,010,..., 017,018,028,029,..., 099,090,190,191,..., 900. В обоих случаях цифра, которая изменяется на шаге к, определяется масштабной функцией с десятичным основанием рю(к), т.е. наибольшей степенью, в которой 10 делит к. Значит, каждый га-кортеж цифр появляется только один раз: мы генерируем 10J разных состояний j самых правых цифр до изменения каких-либо других, для 1 < j < п. Вообще, отраженный код Грэя в любой смешанной системе счисления можно рассматривать как перестановку неотрицательных целых чисел, т.е. как функцию, которая отображает обычное число в смешанной системе счисления к = Г ^п_ь ^> ^° 1 — bn-imn-2 .. .mim0 Н Ь &im0 + b0 (46) Lmn_i, ..., mi, mo J в ее эквивалент в отраженном коде Грэя g(k) = = an_imn_2 ... mim0 H Ь ахт0 + а0, (47) Lmn_i,..., mi, то J как в особом случае двоичных чисел в уравнении (7). Пусть Lmn_i,..., rrij J Lmn_i,..., rrij] где An = Bn = 0 так, что при 0 < j < n имеем Aj = rrijAj+\ + aj и Bj = rrijBj+i 4- bj. (49) Нетрудно по индукции вывести правило соединения а и b для п — j: bj, если Bj+i четно; - 1 — bj, если Bj+i нечетно. aJ = {[ (50) (Здесь координаты n-кортежей (an_i,..., а\, ао) и (6n_i,..., fti, &о) перечисляются справа налево для соответствия с (7) и соглашениями смешанной системы счисления в уравнении 4.1-(9). Читатели, которые предпочитают обозначения типа (oi,..., ап), могут заменить j на п — j во всех формулах, если есть такое желание.) В обратном направлении имеем: ( aj, если aj+i + + • • • четно; bj = < . (51) yrrij — 1 — aj, если aj+i -I- aJ+2 H нечетно. Забавно, что правило (50) и обратное ему правило (51) будут идентичны, если все основания rrij нечетны. Например, в троичном коде Грэя, где mo = mi = • • = 3, имеем: р((10010211012)3) = (12210211010)3 и $((12210211010)3) = (Ю010211012)3. В упр. 78 доказываются (50) и (51) и обсуждаются аналогичные формулы, которые справедливы в модульном случае. Действительно, обобщая алгоритмы М и L, можно генерировать такие последовательности Грэя без циклов:
32 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Алгоритм Н (генерация без циклов с отраженным кодом Грэя в смешанной системе счисления). Этот алгоритм посещает все такие п-кортежи (an_i,..., ao), где О < а3< т3 для 0 < j < п, изменяя только одну координату на ±1 на каждом этапе. Он поддерживает массив указателей фокуса (/п>---5/о) для управления действиями, как в алгоритме L, вместе с массивом направлений (on_i,..., оо). Предполагается, что каждое основание т3 > 2. HI. [Инициализировать.] Установить а3 +— О, f3 <— j, и о3; «— 1 для 0 < j < щ также установить /п <— п. Н2. [Посетить.] Посетить n-кортеж (an_i,..., ai, ao). НЗ. [Выбрать j.] Установить j <— /о и /о <— 0. (Как в алгоритме L, j был самой правой активной координатой, а все элементы справа теперь повторно активизированы.) Н4. [Изменить координату j.] Завершить, если j = п; в противном случае установить а 3 <r- а3 + Oj. Н5. [Отразить?] Если а3 = 0 или а3 — т3 — 1, то установить Oj < о3, f3 и j + 1. (Координата j, таким образом, становится пассивной.) Вернуться к Н2. | Аналогичный алгоритм генерирует модульную вариацию (см. упр. 77). * Подчиненный лес. Интересное и поучительное обобщение алгоритма Н, открытое И. Кода (Y. Koda) и Ф. Раски (F. Ruskey) [J. Algorithms 15 (1993), р.324-340], проливает свет на дополнительные особенности кода Грэя и бесцикловой генерации. Допустим, что мы имеем лес п узлов и нам нужно посетить все основные подлеса, а именно все такие подмножества узлов 5, что если х находится в S и х не является корнем, то родитель х также находится в 5. Например, 7-узловой лес имеет 33 таких подмножества, соответствующих черным узлам на следующих 33 диаграммах: tJk tJk tJk tJk lJk lJk lJk lJk lJk lJk lJk lJk Обратите внимание на то, что если верхний ряд считывать слева направо, средний ряд — справа налево, а нижний ряд — слева направо, то на каждом шаге изменяется состояние точно одного узла. Если указанный лес состоит из вырожденных неветвящихся деревьев, то основные подлеса эквивалентны числам со смешанным основанием. Например, лес ООО имеет 3x2x4x2 основных подлесов, соответствующих таким 4-ным кортежам (х1,х2,хз,Х4), что 0 < xi < 3, 0 < х2 < 2, 0 < х3 < 4 и 0 < х4 < 2. Значение Xj равно количеству узлов, выделенных в j-м дереве. Если алгоритм Кода и Рас-
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 33 ки применяется к такому лесу, то он посещает подлеса в том же порядке, что и отраженный код Грэя для оснований (3,2,4,2). Алгоритм К (отраженная генерация подлесов без циклов). Для заданного леса, узлы которого (1,..., п) упорядочены в обратном порядке, этот алгоритм посещает все такие двоичные n-кортежи (ai,..., an), для которых ар > aq всякий раз, когда р является родителем q. (Таким образом, ар = 1 означает, что р является узлом в текущем подлесу.) Точно один бит aj изменяется между одним и следующим посещениями. Указатели фокуса (/o,/i, • •,/п)> аналогичные указателям фокуса из алгоритма L, используются вместе с дополнительными массивами указателей (/о, h, • •., In) и (го, 7*1,..., гп), которые представляют собой дважды связанные списки или текущую полосу. Текущая полоса содержит все узлы текущего подлеса и их дочерних узлов; г о указывает на самый левый узел, а /о — на самый правый узел. Вспомогательный массив (со, ci,..., сп) определяет лес следующим образом: если р не имеет дочерних узлов, то ср = 0. В противном случае ср является самым левым (наименьшим) дочерним узлом р. Кроме того, со является самым левым корнем самого леса. В начале алгоритма предполагается, что rp = q и lq = р всякий раз, когда р и q являются последовательными дочерними узлами одного семейства. Таким образом, например, лес в (52) имеет обратный порядок нумерации: Следовательно, в этом случае имеем: (со, ...,07) = (2,0,1,0,0,0,4,3) и г2 = 7, /7 = 2, г3 = б, 1в = 3, Г4 = 5 и /5 = 4 в начале этапа К1. К1. [Инициализировать.] Установить а3; <— 0 и fj <— j для 1 < j < п, опустошая таким образом исходный подлее и активизируя все узлы. Установить /о <— 0, /о <— п, гп *— 0, го <— со и 1Со <— 0, помещая таким образом все корни в текущую полосу. К2. [Посетить.] Посетить подлее, заданный (ai,..., ап). КЗ. [Выбрать р.] Установить q <— lo, р <— fq. (Теперь р является самым правым активным узлом полосы.) Также установить fq <— q (таким образом, активизируя все узлы справа от р). К4. [Проверить ар.] Завершить алгоритм, если р = 0. В противном случае перейти к Кб, если ар = 1. К5. [Вставить дочерние узлы узла р.] Установить ар <— 1. Затем, если ср ф 0, установить q <— rp, lq <— р — 1, rp-\ <— g, rp <— ср, lCp <— р (таким образом, помещая дочерние узлы р справа от р в этой полосе). Перейти к К7. Кб. [Удалить дочерние узлы р.] Установить ар <— 0. Затем, если ср ф 0, установить q <— rp_i, rp <— g, lq р (таким образом, удаляя дочерние узлы р из этой полосы). К7. [Сделать р пассивным.] (На этом этапе нам известно, что р активен.) Установить /р <— fip и fip <г- /р. Вернуться к К2. |
34 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Читателю предлагается поэкспериментировать с этим алгоритмом на примерах типа (52), чтобы изучить прекрасный механизм, с помощью которых полоса растет и сжимается как раз в нужное время. *Последовательности со сдвигом регистра. Также возможен совершенно иной способ генерации всех n-кортежей га-х цифр. Можно последовательно генерировать по одному биту и повторно работать с п самыми последними генерированными цифрами, таким образом, переходя от одного n-кортежа (xq, х\ ,..., хп-\) к другому (х\,... ,a*n_i,xn), сдвигая соответствующую новую цифру вправо. Например, на рис. 15 показано, как можно получить все 5-битовые числа, как блоки 5 последовательных битов в некоторой циклической структуре с длиной 32. Эта общая идея уже обсуждалась в некоторых упражнениях разделов 2.3.4.2 и 3.2.2, и теперь можно приступать к ее изучению. Рис. 15. Цикл де Бруийна для 5-битовых чисел Алгоритм S (обобщенная генерация со сдвигом регистра). Этот алгоритм посещает все такие n-кортежи (а\,..., ап), что 0 < a j < т для 1 < j < гг, при условии, что на этапе S3 используется подходящая функция /. 51. [Инициализировать.] Установить aj <— 0 для — п < j <0 и к +— 1. 52. [Посетить.] Посетить n-кортеж (а^_п,..., ак~г). Завершить, если к = тп. 53. [Продвинуться.] Установить ак <— f(ak-n, • • •, a>k-i), к <— к + 1 и вернуться kS2. | Каждая функция /, которая подходит для алгоритма S, соответствует такому циклу тп цифр с основанием т, что каждая комбинация п цифр возникает последовательно в этом цикле. Например, случай т = 2 и п = 5 (см. рис. 15) соответствует двоичному циклу 00000100011001010011101011011111; (53) и первые га2 цифр бесконечной последовательности 0011021220313233041424344... (54) достигают соответствующего цикла для п = 2 и произвольного т. Такие циклы обычно называются m-ми циклами де Бруийна, поскольку Н. Г. де Бруийн рассмотрел двоичный случай для произвольного п в Indagationes Mathematicae 8 (1946), р.461-467.
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 35 Таблица 1 ПАРАМЕТРЫ АЛГОРИТМА А СО : 1 8 : 1,5 13 : :1,3 18 : : 7 23 : : 5 28 : : 3 4 : : 1 9:4 14 : 1,11 19 : :1,5 24 : 1,3 29 : : 2 5 : : 2 10:3 15 : : 1 20: :3 25 : : 3 30: : 1,15 6 : : 1 11 : 2 16 : 2,3 21 : : 2 26 : 1,7 31 : 3 7: : 1 12 : 3,4 17: 3 22 : 1,7 27: 1,7 32 : : 1,27 Элементы 'n : s' или *n : s,V означают, что многочлены xn+xs + l или xn + (xs + 1)(х* + 1) являются примитивными по модулю 2. Дополнительные значения табулированы до п = 168 [В. Штанке (W. Stahnke), Math. Сотр. 27 (1973), р.977-980]. В упр. 2.3.4.2-23 доказывается, что точно га!771" 1/тп функций / имеют требуемые свойства. Это огромное число, но только некоторые из этих функций могут быть эффективно вычислены. Мы обсудим три типа функций /, которые представляются наиболее полезными. Первый важный случай возникает, когда га является простым числом, а / — почти линейным рекуррентным соотношением: ' сь если (Ж1,ж2,...,хп) = (0,0,...,0); /(Ж1,...,жп) = < 0, если (Ж1,ж2,...,хп) = (1,0,...,0); (55) (с\Х\ + С2Х2 Л Ь спхп) mod га в противном случае. Здесь коэффициенты (с\,..., сп) должны быть такими, что хп - спхп~1 с2х - ci (56) является примитивным многочленом по модулю га в смысле, упомянутом после формулы 3.2.2-(9). Количество таких многочленов равно (р(тп — 1)/п, и оно достаточно велико, чтобы среди них можно было найти один, в котором только несколько коэффициентов с не равны нулю. [Эта конструкция берет свое начало в пионерской статье Виллема Мантеля (Willem Mantel), Nieuw Archief voor Wiskunde (2) 1 (1897), p. 172-184.] Например, предположим, что га = 2. Тогда можно генерировать двоичные n-кортежи с помощью очень простой бесцикловой процедуры. Алгоритм А (почти линейная генерация со сдвигом битов). В этом алгоритме посещаются все n-битовые векторы либо с помощью одного специального отступа s [случай 1], либо с помощью двух специальных отступов s и t [случай 2], как показано в табл. 1. А1. [Инициализировать.] Установить (#о, #ъ • • •, #n-i В случае 2 также установить i <— t и h *— s + t. A2. [Посетить.] Посетить n-кортеж (xk-i,..., #0, #n-i,..., Xk+i, Xk)- A3. [Проверить на окончание.] Если Хк ф 0, установить г <— 0; в противном случае установить г «— г +1 и перейти к А6, если г = п— 1. (Имеем г последовательных нулей.) А4. [Сдвинуть.] Установить к <— (к — 1) mod nnj<r-(j — 1) mod п. В случае 2 также установить г <— (г — 1) mod п и h +— (h — 1) mod п.
36 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 А5. [Вычислить новый бит.] Установить хк <— xk ®Xj [случай 1] или хк <— Xk®Xj 0 Х{ ф Xfi [случай 2]. Вернуться к А2. А6. [Завершить.] Посетить (0,..., 0) и завершить. | Соответствующие параметры отступа 5 и, возможно, t практически всегда существуют для всех п, поскольку примитивных многочленов имеется достаточно много. Например, существует восемь разных случаев (s, t) для п — 32, а в табл. 1 перечислены лишь наименьшие. Однако строгое доказательство их существования во всех случаях выходит за рамки современного состояния математических знаний. Наша первая конструкция циклов де Бруийна в (55) была алгебраической и основывалась на теории конечных полей. Аналогичный метод, который работает, когда т не является простым числом, представлен в упр. 3.2.2-21. Наша следующая конструкция, наоборот, будет только комбинаторной. Действительно, она сильно связана с идеей модульных га-х кодов Грэя. Алгоритм R (генерация на основе рекурсивного цикла де Бруийна). Предположим, что /() является сопрограммой, которая выводит последовательные цифры т-го цикла де Бруийна длины тп, начиная с п нулей, при повторном вызове. Этот алгоритм аналогичен сопрограмме, которая выводит цикл длины mn+1 при условии, что п > 2. В нем используются три закрытых переменных х, у и t, а переменная х в исходном состоянии равна нулю. R1. [Вывести.] Вывести х. Перейти к R3, если х ф 0 и t > п. R2. [Вызвать /.] Установить у <— /(). R3. [Подсчитать единицы.] Если у = 1, установить t <— t + 1; в противном случае установить t <— 0. R4. [Пропустить единицу?] Если t = п и х ф 0, вернуться к R2. R5. [Подогнать х.] Установить х <— (х + у) mod т и вернуться к Rl. | Например, пусть т = 3 и п — 2. Если /() порождает бесконечный 9-й цикл 001102122 001102122 0..., (57) то алгоритм R приводит к следующему бесконечному 27-му циклу на этапе R1: у = 001021220011110212200102122 001... t = 001001000012340010000100100 001... х = 000110102220120020211122121 0001.... Доказательство корректной работы алгоритма R интересно и поучительно (см. упр. 93). А доказательство корректной работы следующего алгоритма, в котором используется окно, размеры которого вдвое больше, чем п, еще более интересно и поучительно (см. упр. 95). Алгоритм D (генерация на основе двойного рекурсивного цикла де Бруийна). Предположим, что /() и /'() являются сопрограммами, которые выводят последовательные цифры m-го цикла де Бруийна длины тп при повторных вызовах, начиная с п нулей. (Эти два цикла идентичны, но они должны генерироваться независимыми сопрограммами, поскольку их значения будут использоваться с разной частотой.)
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 37 Этот алгоритм аналогичен сопрограмме, которая выводит цикл длины т2п. Он содержит шесть закрытых переменных х, г/, t, х', у' и t', а переменные х и х' в исходном состоянии равны га. Специальный параметр г должен быть равен константе, для которой выполняются следующие условия: О < г < га и gcd(mn - г, тп + г) = 2. (58) Обычно г = 1, если га нечетно, и г = 2, если m четно. D1. [Возможно вызвать /.] Если t ф п или х > г, установить у <— /(). D2. [Подсчитать повторы.] Если х ф у, установить ж <— у и £ <— 1. В противном случае установить t <— £ + 1. D3. [Вывести из /.] Вывести текущее значение х. D4. [Вызвать /'.] Установить у' *— /'(). D5. [Подсчитать повторы.] Если х' ф у', установить х' <— у' и t' <— 1. В противном случае установить t' <— + 1. D6. [Возможно отвергнуть /'.] Если t' = п и х' < г и либо t < п, либо ж' < ж, то перейти к D4. Если t' = п и ж' < г и ж' = х, то перейти к D3. D7. [Вывести из /'.] Вывести текущее значение х'. Вернуться к D3, если t' = п и х' < г, в противном случае вернуться к Dl. | Основная идея алгоритма D состоит в том, чтобы выводить из /() и /'() попеременно, делая специальные настройки, когда любая из последовательностей генерирует п последовательных х для х < г. Например, когда /() и /'() порождают 9-й цикл (57), берем г = 1 и получаем: t наэтапе D2: 12 31211112 12312111 12123121 11121231 21111212 ... х на этапе D3: 00001102122 00011021 22000110 21220001 102122000... f на этапе D6: 121211112121211112121211112121211112121211112121 ... х1 на этапе D7: 0 11021220 11021220 11021220 11021220 11021220 1 .... Итак, на этапах D3 и D7 получается 81-й цикл 00001011012 ... 2222 00001.... Случай т = 2 для алгоритма R был открыт Абрахамом Лемпелем (Abraham Lempel) [IEEE Trans. C-19 (1970), р.1204-1209]. Алгоритм D был открыт только двадцать пять лет спустя [С. J. Mitchell, Т. Etzion, и К. G. Paterson, IEEE Trans. IT-42 (1996), p.1472-1478]. Используя их совместно, начиная с простых сопрограмм для п = 2 на основе (54), можно создать интересное семейство взаимодействующих сопрограмм, которые будут генерировать цикл де Бруийна длины тп для любого заданного га>2ип>2,с помощью только O(logn) простых вычислений для каждой выведенной цифры, (см. упр. 96). Более того, в простейшем случае т — 2, эта комбинация "R&D" обладает таким свойством, что ее к-й вывод можно вычислить непосредственно как функцию к, выполняя O(nlogn) простых операций на n-битовых числах. И наоборот, для любой заданной n-битовой структуры /? положение /3 в цикле также можно вычислить за 0(п log п) шагов (см. упр. 97-99). В настоящее время неизвестны никакие другие двоичные циклы де Бруийна, которые обладали бы последним свойством.
38 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 Наша третья конструкция цикла де Бруийна основана на теории простых строк, которые будут иметь огромное значение при изучении операции сопоставления с образцом в главе 9. Пусть 7 = а/3 является конкатенацией двух строк, где а называется префиксом 7 и (3 — суффиксом. Префикс или суффикс 7 называется собственным, если его длина положительна, но меньше длины 7. Таким образом, /3 является собственным суффиксом а(3 тогда и только тогда, когда а ф е и /3 ф е. Определение Р. Строка является простой, если оне не пуста и (лексикографически) меньше, чем все ее собственные суффиксы. Например, строка 01101 не является простой, поскольку она больше 01. А строка 01102 является простой, поскольку она меньше 1102, 102, 02 и 2. (Предполагается, что строки состоят из букв, цифр или других символов из линейно упорядоченного алфавита. Лексикографический или словарный порядок является обычным способом сравнения строк, поэтому мы записываем, что a < /3, и говорим, что а меньше (3, когда а лексикографически меньше (3. В частности, a < a/3 и a < a(3 тогда и только тогда, когда (3 ф е.) Простые строки часто называют словами Линдона, поскольку они были введены Р. К. Линдоном (R. С. Lyndon) [Trans. Amer. Math. Soc. 77 (1954), р.202-215]. Линдон назвал их стандартными последовательностями, но более обоснованным является термин "простой", согласно фундаментальной теореме разложения на множители в упр. 101. Однако из уважения к заслугам Линдона мы будем часто использовать букву Л для обозначения простых строк. Несколько наиболее важных свойств простых строк были выведены Ченом, Фоксом и Линдоном в важной статье по теории групп [Annals of Math. 68 (1958), р.81-95], которая содержала следующий простой, но важный результат. Теорема Р. Непустая строка, которая меньше всех своих циклических сдвигов, является простой. (Циклическими сдвигами а\... ап являются а2 ... апа\, аз ... апа\а2, ..., апа\ ... ап-ь) Доказательство. Пусть строка 7 = а/? не является пустой, поскольку а ф е и 7 > (3 ф е. Но допустим, что 7 также меньше, чем ее циклический сдвиг (За. Тогда условия (3 < 7 < (За подразумевают, что 7 = (30 для некоторых строк в < а. Следовательно, если 7 также меньше своего циклического сдвига 6(3, то имеем: в < а < а(3 < 9(3. Но это невозможно, поскольку а и в имеют одинаковую длину. | Пусть Lm(n) является количеством т-х простых строк длиной п. Каждая строка а\... ап вместе с ее циклическими сдвигами дает d разных строк для некоторого делителя d для п, соответствующего точно одной строке длиной d. Например, из 010010 с помощью циклического сдвига можно получить строки 100100 и 001001, а наименьшей из периодических частей {010,100,001} является простая строка 001. Следовательно, имеем: для всех т, п > 1. (59) d\n
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 39 Это семейство уравнений можно решить для Lm(n) с помощью упражнений 4.5.3- 28(a) и получить: Lm(n) = - 5>(<2)mn/d. (60) d\n В 1970-х годах Гарольд Фредриксен (Harold Fredricksen) и Джеймс Майорана (James Maiorana) открыли простой способ генерации всех ш-х простых строк длины п или меньше, в порядке возрастания [Discrete Math. 23 (1978), р.207-210]. Для понимания этого алгоритма нужно рассмотреть п-расширение непустых строк Л, а именно первых п символов бесконечных строк АЛЛ.... Например, 10-расширение 123 имеет вид 1231231231. Вообще, если |Л| = к, то его n-расширение имеет вид \\.п1к\\\ гдеА' — префикс А, длина которого равна п mod к. Определение Q. Строка является предпростой, если она является непустым префиксом простой строки в некотором алфавите. Теорема Q. Строка длины п > 0 является предпростой тогда и только тогда, когда она является n-расширением простой строки А длины к < п. Эта простая строка определяется однозначно. Доказательство. См. упр. 105. | Теорема Q, по сути, утверждает, что существует взаимно-однозначное соответствие между простыми строками длины < п и предпростыми строками длины п. Следующий алгоритм генерирует все га-е экземпляры в порядке возрастания. Алгоритм F (генерация простых и предпростых строк). Этот алгоритм посещает все такие т-е га-кортежи (а\,..., ап), что строка а\... ап является предпростой. Он также определяет такой индекс j, что а\.. .ап является n-расширением простой строки а\ .. .а3. F1. [Инициализировать.] Установить а\ <— • • • <— ап <— 0 и j <— 1; также установить а0 < 1. F2. [Посетить.] Посетить (ai,..., ап) с индексом j. F3. [Подготовить к увеличению.] Установить j <— п. Затем, если а3 — т — 1, уменьшать j до тех пор, пока не обнаружится а3 < т — 1. F4. [Добавить единицу.] Завершить, если j = 0. В противном случае установить аз *~ clj + 1. (Теперь строка а\ ...а3 является простой, согласно результату в упр. 105(a).) F5. [Сделать n-расширение.] Для k <— j + 1, ..., п (в этом порядке) установить а*; <— a>k-j- Вернуться к этапу F2. | Например, алгоритм F посещает 32 троичных предпростых строки при т = 3 и п — 4: 0000 ООП 0022л 01П 0122д 0212д 1111 0001л 0012^ ОШ 0112^ 0202Л 0220Л 1112 0002^ 0020Л 0102л 0Ш 02\o 022\ 112/ 0010Л 0021 0110Л 0121 0211 0222Л 1122 12л12 1222л 2222Л (61)
40 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 (Цифры перед символом являются простыми строками 0, 0001, 0002, 001, ООП, ...,2.) Теорема Q объясняет, почему этот алгоритм является корректным: этапы F3 и F4, очевидно, позволяют найти наименьшую т-ю строку длиной < п, которая превышает предыдущую предпростую строку а\.. . ап. Обратите внимание на то, что после увеличения а\ от 0 до 1 этот алгоритм посещает все (га — 1)-е простые и предпростые строки, увеличенные на 1... 1. Алгоритм F, конечно, прекрасен, но какое отношение он имеет к циклам де Бруийна? Дело вот в чем: если выводить цифры сц, ..., а3; на этапе F2, когда j является делителем п, то последовательность всех таких цифр образует цикл де Бруийна! Например, в случае т = 3 и п = 4 следующая 81 цифра образует: 0 00010002 ООП 0012 00210022 010102 01110112 01210122 02 02110212 02210222111121122121222 2. (62) (Здесь опущены простые строки 001, 002, 011, ..., 122 из (61), поскольку их длина не делится на 4.) Причины этих почти магических свойств описываются в упр. 108. Обратите внимание на то, что цикл имеет корректную длину, согласно (59). В некотором смысле выход этой процедуры фактически эквивалентен "дедушке" всех циклов де Бруийна для всех га и п, а именно конструкции, впервые опубликованной в работе М. X. Мартина (М. Н. Martin) [Bull. Amer. Math. Soc. 40 (1934), р.859-864]. Оригинальный цикл Мартина для т = 3 и п — 4 имел вид 2222122202211.. .10000, т.е. дополнение до двух для (62). Действительно, Гарольд Фредриксен (Harold Fredricksen) и Джеймс Майорана (James Maiorana) открыли алгоритм F почти случайно, в поисках простого способа генерации последовательности Мартина. Явная связь между их алгоритмом и предпростыми строками не была замечена еще много лет, пока Раски, Сэвидж и Ванг не выполнили тщательный анализ времени выполнения [J. Algorithms 13 (1992), р.414-430]. В упр. 107 представлены основные результаты этого анализа, а именно: i) Среднее значение п — j на этапах F3 и F5 приблизительно равно 1/(га — 1). ii) Общее время работы алгоритма для создания цикла де Бруийна, как в (62), равно 0(тп). УПРАЖНЕНИЯ 1. [10] Объясните, как генерировать все n-кортежи (ai,... ,an), для которых соблюдается условие lj < dj < где для каждой координаты определены нижняя, lj, и верхняя граница, щ. (Предполагается, что lj < Uj.) 2. [15] Каким будет 1000000-й n-кортеж, посещенный алгоритмом М, если п = 10 и rrij = j для 1 < j < п? Подсказка: [°; \ jj; °; £ £ °0] = 1000000. 3. [М20] Сколько раз алгоритм М выполняет этап М4? 4. [18] В большинстве компьютеров быстрее вести счет по убыванию до 0, чем по возрастанию до га. Переделайте алгоритм М так, чтобы он посещал все п-кортежи в обратном порядке, начиная с (mi — 1,..., тп — 1) и заканчивая (0,..., 0). 5. [20] Алгоритмы быстрого преобразования Фурье (в упражнениях 4.6.4-14) часто заканчиваются массивом ответов в порядке обращения битов с А[(Ьо... 671-1)2] вместо А[(Ьп-1 .. • 60)2]. Предложите подходящий способ переупорядочения ответов в правильном порядке. [Подсказка. Обратите алгоритм М.]
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 41 6. [Mi7] Докажите справедливость формулы (7), т.е. основной формулы двоичного кода Грэя. 7. [20] На рис. 10,6 показан двоичный код Грэя для диска, который поделен на 16 секторов. Предложите эффективный код, аналогичный коду Грэя, для диска с 12 или 60 секторами (как на циферблате с указанием часов и минут) или с 360 секторами (как на транспортире с указанием углов в градусах). 8. [15] Предложите простой способ прохода всех n-битовых строк с проверкой на четность, изменяя только два бита на каждом этапе. 9. [16] Какой ход следует сделать в соответствии с рис. 11 при решении головоломки "китайское переплетение колец"? ► 10. [M#i] Найдите простую формулу для общего количества шагов Ап или Вп, в которой кольцо (а) сниматся или (Ь) заменяется, в кратчайшей процедуре снятия п китайских колец. Например, Аз = 4 и Вз = 1. 11. [М22] (X. Дж. Перкис (Н. J. Purkiss), 1865.) Два самых маленьких кольца китайской головоломки можно снимать или одевать одновременно. Сколько шагов потребуется, если использовать такие ускоренные шаги? ► 12. [25] Композициями п называются последовательности положительных целых чисел, которые в сумме дают п. Например, композициями 4 являются 1111, 112, 121, 13, 211, 22, 31 и 4. Целое число п имеет точно 2П-1 композиций, соответствующих всем подмножествам точек {1,...,га — 1}, которые могут использоваться для разбиения интервала (0..п) на подчиненные интервалы целочисленного размера. a) Придумайте бесцикловый алгоритм для генерации всех композиций п, представляющих каждую композицию в виде последовательного массива целых чисел s\S2 ... Sj. b) Аналогично, придумайте бесцикловый алгоритм, который неявно представляет композиции в виде массива указателей go qi • • • qt, где элементами композиции являются (qo — qi)(qi — #2). •. (qt-i — qt), a qo — n, qt — 0. Например, композиция 211 может быть представлена в этой схеме указателями qo = 4, qi = 2, q<i = 1, #з =0, где t = 3. 13. [21] В продолжение предыдущего упражнения вычислите также коэффициенты многочлена С = (31n,Sj) для использования в качестве посещаемой композиции si... Sj. 14. [20] Предложите алгоритм генерации всех таких строк a\...a,j, что 0 < j < п и 0 < ai < ггц для 1 < г < j, в лексикографическом порядке. Например, если т\ = гп2 = п = 2, то этот алгоритм должен последовательно посещать е, 0, 00, 01, 1, 10, 11. ► 15. [25] Предложите алгоритм генерации строк из предыдущего упражнения. Все строки одинаковой длины нужно "посетить" (т.е. перебрать) в лексикографическом порядке, как и раньше, но строки разной длины можно перемешивать в любом удобном порядке. Например, 0, 00, 01, е, 10, 11, 1 находятся в приемлемом порядке, когда гп\ = тп2 = п = 2. 16. [23] Бесцикловый алгоритм не может генерировать все двоичные векторы (ai,..., ап) в лексикографическом порядке, поскольку количество координат а-,, которое необходимо сменить между последовательными посещениями, не ограничено. Покажите, что бесцикловая лексикографическая генерация становится возможной, если связанное представление используется вместо последовательного. Предположим, что есть 2п+1 узлов {0,1,..., 2п}, причем каждый содержит поле LINK. Двоичный n-кортеж (ai,...,an) представляется следующим образом: LINK(0) = 1 +nai; LINK(j — 1 + naj-i) = j -h naj для 1 < j < n; LINK(n + nan) = 0, а другие поля n LINK могут иметь любые удобные значения.
42 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 17. [20] Хорошо известная конструкция, которая называется картой Карно [М. Karnaugh, Amer. Inst. Elect. Eng. Trans. 72, part I (1953), p.593-599], использует двоичный код Грэя в двух измерениях для отображения всех 4-битовых чисел в виде тора 4x4: ГОООО 0001 ООП 0010 0100 0101 0111 ОНО 1100 1101 1111 1110 [1000 1001 1011 1010 (Элементы тора "свертываются" слева и справа, а также сверху и снизу, как если бы они были частью мозаики, покрывающей плоскость.) Покажите, что аналогично можно упорядочить все 6-битовые числа в виде тора 8x8 так, что изменяется только одна координата при перемещении на север, юг, восток или запад из любой точки. ► 18. [20] Вес Ли вектора и — (и\,..., ип), где каждая компонента удовлетворяет условию 0 < щ < mj, определяется следующим соотношением: п vl(u) = ^ min(ttj, mj — щ), 3 = 1 а расстояние Ли между двумя такими векторами и и v определяется соотношением: db(u,v) = vl(u — v), где и — v — ((u\ — v\) mod mi,..., (un — vn) modmn). (Это минимальное количество шагов, которое необходимо для изменения и на и, если подгонять некоторые компоненты Uj на ±1 (по модулю mj) на каждом этапе.) Четверичный вектор имеет mj = 4 для 1 < j• < п, а двоичный вектор имеет все rrij = 2. Найдите простое взаимно-однозначное соответствие между четверичными векторами и = (щ,... ,ип) и двоичными векторами и' = (u'i,... ,и2п), которые обладают свойствами vl{u) = v(u') и db{u,v) — v(u' 0 v'). 19. [21] (Октакод.) Пусть д(х) = ж3 + 2х2 + х - 1. a) Используйте один из алгоритмов этого раздела для оценки суммы ^ ^ %uq %и \ %U2 Zv.4 %uq Zuoo по всем 256 многочленам (vo + v\x + v2x2 + Узх3)д(х) mod 4 = uo + u\x + u2x2 + u$x3 + u4x4 -f и$хь + uex6 для 0 < vo, vi, г>2, уз < 4, где и<х> выбирается так, что 0 < Uoo < 4 и (uo + и\ + u2 Ч- ггз + + ^5 4- uq 4- г^оо) mod 4 = 0. b) Создайте множество из 256 16-битовых чисел, которые отличаются друг от друга по крайней мере шестью разными положениями битов. (Первое такое множество было открыто Нордстромом и Робинсоном в [Information и Control 11 (1967), р.613-616] и является действительно уникальным.) 20. [М36] 16-битовые комбинации кода (кодовые слова) в предыдущем упр. можно использовать для передачи 8 битов информации с возможностями исправления ошибок передачи данных в одном или двух поврежденных битах. Более того, ошибки будут обнаружены (но необязательно исправлены), если любые три бита будут получены в искаженном состоянии. Предложите алгоритм, который либо находит ближайшее кодовое слово для заданного 16-битового числа г/, либо определяет, что по крайней мере три бита и' являются ошибочными. Как ваш алгоритм раскодирует число (1100100100001111)2? [Подсказка. Используйте то, что х7 = 1 (по модулю д(х) и 4) и что каждый четверичный многочлен степени меньше 3 сравним с xi + 2хк (по модулю д(х) и 4) для некоторых j, к е {0,1,2,3,4,5,6, оо}, где х°° = 0.]
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 43 21. [МЗО] t-подкуб n-куба можно представить в виде строки ** 10**0*, содержащей t звездочек и п — t указанных битов. Если все 2П двоичные n-кортежи записаны в лексикографическом порядке, то элемент, относящийся к такому подкубу, появится в 2*' кластерах последовательных элементов, где t' — это количество звездочек, которые находятся слева от самого правого указанного бита. (В данном примере га = 8, t = 5 и t' = 4.) Но если эти га-кортежи записаны в двоичном порядке Грэя, то количество кластеров можно сократить. Например, (га — 1)-подкубы * ... *0 и * ... *1 возникают только в 2п~2 +1 и 2п~2 кластерах, соответственно, когда используется двоичный порядок Грэя, а не в 2п~1 из них. a) Объясните, как можно было бы вычислить С(а), количество двоичных кластеров Грэя для подкуба, определенного строкой а из звездочек, 0s и 1. Чему равно С(**10**0*)? b) Докажите, что С (а) всегда лежит между 2*'-1 и 2*' включительно. c) Чему равно среднее значение С (а) по всем 2П~"*(™) возможным t-подкубам? 22. [22] Правильным называется такой подкуб, в котором все звездочки располагаются после указанных цифр, как, например, ОНО**. Любой двоичный луч (trie) (см. раздел 6.3) можно рассматривать как способ разбиения куба на непересекающиеся правильные подкубы (рис. 16,а). Если поменять местами левые и правые подлучи каждого правого подлуча, проходя от корня сверху вниз, то мы получим двоичный луч Грэя (см. рис. 16,6). Докажите, что если листья двоичного луча Грэя обходят в порядке слева направо, то последовательные листья соответствуют смежным подкубам. (Подкубы называются смежными, если они содержат смежные вершины. Например, 00** является смежным для 011*, поскольку первый содержит 0010, а второй — ОНО. Но 011* не является смежным для 10**.) 00** X И** 010* ОН* 100* 1010 1011 Рис. 16. (а) Нормальный двоичный луч, 00** 011* 010* 100* 1010 1011 (Ь) двоичный луч Грэя 23. [20] Допустим, что д(к)®23 = д(1). Предложите простой способ поиска / для заданных 3 и к. 24. [М21] Рассмотрим расширение двоичной функции Грэя д на все 2-адические целые числа (см. упр. 4.1-31). Какой будет соответствующая обратная функция <^-1^? ► 25. [М#5] Докажите, что если д(к) и д(1) отличаются t > 0 битами и если 0 < к,1 < 2П, то [2731 < \к-1\ < 2п - Г2*/31. 26. [25] (Фрэнк Раски.) Для каких целых чисел N можно генерировать все неотрицательные целые числа меньше N таким образом, чтобы на каждом этапе изменялся только один бит двоичного представления? ► 27. [20] Пусть So = {1} и Sn+i = 1/(2 4- Sn) U 1/(2 — Sn)) таким образом, например, S2={ 1 2 + 2 + 1 2 + 1 2 + 1 2 - 2-1 ) \7'3'5' J и Sn имеет 2n элементов, которые лежат между J и 1. Вычислите 1010-й наименьший элемент 5юо-
44 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 28. [М27] Медианой n-битовых строк {c*i,... , а*}, где otk имеет двоичное представление ak = a*;(n-i)... afco, является строка а — an_i...ao, биты clj которых для 0 < j < п согласуются с большинством битов a,kj для 1 < к < t. (Если t четно и биты akj наполовину равны 0 и наполовину равны 1, то медианный бит а-, может быть либо 0, либо 1.) Например, строки {0010, 0100, 0101,1110} имеют две медианы, 0100 иОНО, которые можно обозначить как 01*0. a) Найдите простой способ описания медиан Gt = {#(0),... ,g(t — 1)} первых двоичных строк Грэя £, когда 0 < t < 2п. b) Докажите, что если a = an_! .. .a0 является такой медианой и если 2п~1 < t < 2П, то строка /3, полученная из а дополнением произвольного бита а^, также является элементом Gt. 29. [М24 ] Если целочисленные значения к передаются как n-битовые двоичные коды Грэя д(к) и получаются с ошибками, описывемыми битовой структурой р = (рп-\ ...ро)2, то средняя численная ошибка равна 2п-1 к = 0 при условии, что равновероятны все значения к. Покажите, что эта сумма равна 2п-1 J2\(k®p)-k\/2n, к = 0 как если бы не использовался двоичный код Грэя, и оцените ее явно. 30. [М27] (Перестановка Грэя.) Предложите однопроходной алгоритм для замены элементов массива (Хо, Х\, Х2у..., X2^-i) (Хд(0^ Хд^, Хд(2),..., Х^(2п_!)), используя вспомогательное хранилище только постоянного объема. Подсказка: рассматривая функцию д(п) как перестановку всех неотрицательных целых чисел, покажите, что множество L = {0,1, (10)2, (100)2, (Ю0*)2, (100*0)2, (Ю0*0*)2,... } является множеством лидеров цикла (наименьших элементов циклов). 31. [НМ35] (Поле Грэя.) Пусть fn(x) = g(rn(x)) обозначает операцию обращения битов в п-битовой двоичной строке, как показано в упр. 5, с последующим преобразованием в двоичный код Грэя. Например, операция /з(#) имеет вид (001)2 ь-> (110)2 (010)2 (011)2 ■-»• (101)2 *->- (1Н)2 >-> (100)2 (001)2, поэтому все ненулевые возможности предстают в одном цикле. Следовательно, можно использовать /з для определения поля из 8 элементов с Ф в качестве оператора сложения и с умножением по правилу fij]w х yfa) = fij+k](i) = /8Ш(4Ч(1))- Функции /2, /5 и /б имеют такие же прекрасные свойства, а функция /4 — нет, поскольку /4((1011)2) = (1011)2- Найдите все п < 100, для которых /п определяет поле 2П элементов. 32. [М20] Истинно или ложно утверждение: функции Уолша удовлетворяют соотношению Wk(—x) = (—\)kWk(x). 33. [М20] Докажите закон Радемахера-Уолша (17). 34. [М21] Функция Пэйли Pk(x) определяется следующими соотношениями: Ро(*) = 1 и pfc(x) = (-l)L2a:JfcpLfc/2J(2a:). Покажите, что рк(х) имеет простое выражение на основе функции Пэйли, аналогичной (17), и свяжите функции Пэйли с функциями Уолша.
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ П-КОРТЕЖЕЙ 45 35. [НМ23] Матрица Пэйли Рп с размерами 271 х 2П получается на основе функции Пэйли так же, как матрица Уолша Wn получается на основе функции Уолша (см. (20)). Найдите соотношения между Pn, Wn и матрицей Адамара Нп. Докажите, что все три матрицы являются симметричными. 36. [21] Подробно опишите эффективный алгоритм вычисления преобразования Уолша (жо, • • •, #2n-i) для заданного вектора (Хо,..., A^-i). 37. [НМ23] Пусть гы обозначает положение 1-го изменения знака в Wk(x) для 1 < I < к и 0 < гы < 1. Докажите, что \zki - l/(k + 1)| = 0((logk)/k). 38. [М25] Придумайте третичное обобщение функции Уолша. 39. [НМЗО] (Дж. Дж. Сильвестер.) Строки матрицы (£ _ьа) являются ортогональными друг другу и имеют одинаковую величину. Следовательно, матричное тождество (АВ)(а2 + Ъ2 0 \(А\_(АВ)(а Ь\(а Ъ \ (А\ \ 0 а2 + Ъ2)\в)- \Ь -а)\Ь -а) \В) = (Аа + ВЪАЪ-Ва)(аА + ЪВ\ \ЪА-аВ) подразумевает тождество суммы двух квадратов (а2+Ь2)(А2+В2) = (аА+ЬВ)2+(ЬА—аВ)2. Аналогично, матрица /а Ъ с d \ Ь —a d —с d с —Ь —а \ с —d —а Ъ ) приводит к тождеству суммы четырех квадратов: (а2 + Ъ2 + с2 + d2)(A2 + В2 + С2 + D2) = (аА + ЪВ + сС + dD)2 + (ЪА - аВ + dC - cD)2 + (dA + сВ-ЪС- aD)2 + (сА - dB - аС + bD)2. a) Присвойте знаки матрицы Щ в (21) символам {а, Ь, с, d, е, /,^, /г}, получая матрицу с ортогональными строками, и тождеству суммы восьми квадратов. b) Обобщите этот принцип до На и матриц более высокого порядка. 40. [21] Будет ли схема вычисления на основе пятибуквенных слов давать правильный ответ, если маски на этапе W2 были вычислены в виде rrij = x&c(25j — 1) для 0 < j < 5? 41. [25] Ограничим задачу с пятибуквенными словами только наиболее распространенными 3000 словами, таким образом, исключая ducky, duces, dunks, dinks, dinky, dices, dicey, dicky, dicks, picky, pinky, punky и pucks из (23). Сколько корректных слов можно будет генерировать на основе одной пары? 42. [35] (М. Л. Фредман.) В алгоритме L используется G(nlogn) бит вспомогательной памяти для указателей фокуса, используемых для определения того двоичного бита Грэя а-/, который должен быть дополнен следующим. На каждом этапе L3 алгоритм проверяет O(logra) вспомогательных битов и изменяет ^(logn) из них. Покажите, что с теоретической точки зрения можно было бы достичь большего: га-битовый двоичный код Грэя можно было бы генерировать, изменяя самое большее два вспомогательных бита между посещениями. (Все еще предполагается, что 0(log га) вспомогательных битов проверяется на каждом этапе так, чтобы было ясно, какие их них следовало бы изменить.) 43. [47] Определите d(6), т.е. количество 6-битовых циклов Грэя.
46 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 44. [М#7] Покажите, что произвольные дельта-последовательности для цикла Грэя на п — 1 или п — 2 битах могут использоваться для создания большого числа дельта-последовательностей для n-битовых циклов Грэя со следующими свойствами: (а) строго одно или (Ь) строго два имени координат встречаются только дважды. 45. [М25] Докажите, что последовательность d(n) характеризуется дважды экспоненциальным ростом: существует такая константа А > 1, что d(n) = ЩА2*1). 46. [НМ48] Определите асимптотическое поведение d(n)1^2 при п -» оо. 47. [М46] (Сильверман, Виккерс и Сэмпсон.) Пусть Sk — {<?(0),... ,д(к — 1)} образуют первые к элементов стандартного двоичного кода Грэя, а Н(к, v) — это количество путей Гамильтона в Sk, которые начинаются с 0 и заканчиваются v. Докажите или опровергните: H(k,v) < Н(к,д(к — 1)) для всех v Е Sk, которые будут смежными для д(к). 48. [36] Докажите, что d{n) < 4(п/2)2П, если предположение из предыдущего упражнения истинно. [Подсказка: пусть d(n, к) — это количесвто п-битовых циклов Грэя, которые начинаются с д(0)... g(k — 1). Это предположение подразумевает, что d(n) < cni ... Cn(k-i)d(n, к), где спк — количество вершин, смежных с д(к — 1) в n-кубе, но не в Sk-] 49. [20] Докажите, что для всех п > 1 существует 2п-битовый цикл Грэя, в котором vfc+22n-1 является дополнением Vk для всех к > 0. ► 50. [21] Найдите конструкцию, подобную той, которая используется в теореме D, но с четным I. 51. [М24] Завершите доказательство следствия В из теоремы D. 52. [М20] Докажите, что если числа логических переходов n-битового цикла Грэя удовлетворяют условию со < с\ < • • • < Cn_i, то со + • • • -I- Cj-i >2J,a равенство достигается при j = п. 53. [М46] Если числа (со,..., cn-i) четные и удовлетворяют условию из предыдущего упражнения, то всегда ли существует n-битовый цикл Грэя с такими числами логических переходов? 54. [М20] (X. С. Шапиро, 1953.) Покажите, что если последовательность целых чисел (ai,... ,a2*0 содержит только п разных значений, то существует подпоследовательность, произведение ак+\а>к+2 • - -Q>i которой является квадратом простого числа для некоторого 0 < к < I < 2п. Однако это утверждение может быть неверным, если отменить случай 1 = 2п. 55. [47] (Ф. Раски и К. Сэвидж, 1993.) Если (vo,..., ^-i) является n-битовым циклом Грэя, то пары { {v2k, V2k+i) I 0 < к < 2n_1 } образуют совершенное сочетание между вершинами с четностью и нечетностью в n-кубе. Каждое ли такое совершенное сочетание возникает как "половина" некоторого n-битового цикла Грэя? 56. [МЗО] (Э. Н. Гильберт, 1958.) Назовем два цикла Грэя эквивалентными, если их дельта-последовательности можно сделать равными за счет перестановки имен координат либо за счет обращения цикла и/или начала цикла в другом месте. Покажите, что 2688 разных 4-битовых циклов Грэя попадают только в 9 классов эквивалентности. 57. [32] Рассмотрим граф, вершины которого являются 2688 возможными 4-битовыми циклами Грэя, где два таких цикла являются смежными, если они связаны одним из
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ п-КОРТЕЖЕЙ 47 До После типа 1 После типа 2 После типа 3 После типа 4 (Изменение типа 1 возникает, когда цикл можно разбить на две части с обращением одной части. Типы 2-4 возникают, когда цикл можно разбить на три части с обращением 0, 1 или 2 частей. Части могут быть разного размера. Такие преобразования часто выполняются с циклами Гамильтона.) Создайте программу, способную определить 4-битовые циклы Грэя, которые можно трансформировать друг в друга, на основе поиска связанных компонентов графа. Ограничьтесь только одним из четырех типов преобразования. ► 58. [21] Пусть а является дельта-последовательностью га-битового цикла Грэя, а (3 получается из а за счет изменения q появлений от 0 до га, где q является нечетным. Докажите, что /3/3 является дельта-последовательностью (га + 1)-битового цикла Грэя. 59. [22] 5-битовый цикл Грэя из (30) является нелокальным в том смысле, что никакие 2* последовательных элемента не относятся к одному t-подкубу для 1 < t < га. Докажите, что нелокальный га-битовый цикл Грэя существует для всех га > 5. [Подсказка. См. предыдущее упражнение.] 60. [20] Покажите, что функция с ограничением длины прохода удовлетворяет условию r(ra + 1) > г(га). 61. [МЗО] Покажите, что г (гаг + га) > г (гаг) + г (га) — 1, если (а) гаг = 2 и 2 < г (га) < 8 или если (Ь) гаг < га и г (га) < 2т"3. 62. [46] Верно ли, что г(8) = б? 63. [30] (Л. Годин.) Докажите, что г(10) > 8. ► 64. [НМ35] (Л. Годин и П. Гвоздяк.) га-битовым потоком Грэя называют последовательность перестановок (его, с*\,..., сг-i), где каждое егк является перестановкой вершин га-куба, перемещающей каждую вершину к одному из ее соседей. a) Предположим, что (гго,... ,w2m-i) является гаг-битовым циклом Грэя и (сто,cri,..., (72^-i) является га-битовым потоком Грэя. Пусть vo = 0...0 и Vk+i = Vkcrk, где crfc = &k mod 2m, если к > 2m. При каких условиях последовательность W — (UOVQ, UqV\, U\V\) UlV2, • • • , U2m+n-l_iV2m+n-l_i, U2m+n-l _iV2m+n-l ) является (гаг -|- побитовым циклом Грэя? b) Покажите, что если гаг является достаточно большим, то существует га-битовый поток Грэя, удовлетворяющий условиям (а), для которого все длины серий из последовательности (г>о, vi,...) удовлетворяют условию > га — 2. c) Примените эти результаты для доказательства того факта, что г (га) > га — О (log га). 65. [30] (Бретт Стивене.) Пьеса Сэмюэля Беккета Четверка (Quad) начинается и заканчивается пустой сценой, га актеров появляются и выходят за один раз, пробегая все 2п возможных подмножества, а актер, который покидает сцену, всегда является именно тем актером, который появился раньше других присутствующих на сцене актеров. Если га = 4, как в этой пьесе, то некоторые подмножества обязательно повторяются. Покажите, однако, что существует совершенная структура точно с 2П входами и выходами при га = 5. 66. [40] Существует ли совершенная структура Беккета-Грэя для восьми актеров? следующих простых преобразований:
48 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 67. [20] Иногда нужно пройти все n-битовые двоичные строки, изменяя столько битов, сколько возможно при переходе от одного этапа к следующему этапу, например, при проверке стабильности работы физической цепи в наихудших условиях. Объясните, как обойти все двоичные п-кортежи таким образом, чтобы на каждом этапе изменялось п или п — 1 битов попеременно. 68. [21] Руфус К. Перверзе (R. Q. Perverse) предложил создать троичный код анти-Грэя, в котором каждое n-тритовое число отличается от своих соседей в положении каждой цифры. Возможен ли такой код для всех п?* 69. [М25] Измените определение двоичного кода Грэя (7), допуская, что h(k) = (... (бе е 65)(65 е ьа){Ьа е 63 е б2 е 60)(63 е б0)(б2 е 6i е 60)6i)2, когда к = (... 6564636261 60)2. a) Покажите, что последовательность /i(0), h(l), h(2n — 1) пробегает через все n-битовые числа таким образом, чтобы каждый раз изменялись точно 3 бита, когда п > 3. b) Обобщите это правило для получения последовательностей, в которых на каждом этапе изменялись точно t бита, когда t нечетно и п > t. 70. [21] Сколько монотонных n-битовых кодов Грэя существует для п = 5 и п = 6? 71. [М22] Выведите (45), т.е. рекуррентное соотношение, которое определяет перестановки Сэвидж-Винклера. 72. [20] Как выглядит код Сэвидж-Винклера для перехода от 00000 к 11111? 73. [32] Предложите эффективный алгоритм для содания дельта-последовательности n-битового монотонного кода Грэя. 74. [М#5] (Сэвидж и Винклер.) Насколько далеко друг от друга могут находиться смежные вершины n-куба в монотонном коде Грэя? 75. [32] Найдите все 5-битовые пути Грэя vo, ..., ^31 без тренда, в том смысле, что SfeLo l)Ufcj = 0 в каждой координате j. 76. [М25] Докажите, что n-битовый код Грэя без тренда существует для всех п > 5. 77. [21] Измените алгоритм Н так, чтобы можно было обойти n-кортежи со смешанным основанием в модулярном порядке Грэя. 78. [М##] Докажите формулы преобразования (50) и (51) для рефлексного кода Грэя со смешанным основанием и выведите аналогичные формулы для модулярного случая. 79. [М22] Когда последний n-кортеж (а) отраженного (рефлексивного) (Ь) модулярного кода Грэя со смешанным основанием является смежным для первого? 80. [М20] Объясните, как пройти все делители числа, при условии, что дано его разложение на простые множители р\1 ... р\1, повторно умножая или деля на одно простое число на каждом этапе. 81. [М21] Пусть (ао, 6о), {а\, 61), ..., (ат2_1, bm2_i) является 2-значным m-м модулярным кодом Грэя. Покажите, что если т > 2, то каждое ребро (х, у) — (х,(у + 1) modm) и (х, у) — ((х + 1) mod m, у) присутствует в одном из двух циклов: (ао, 60) — (oi, 61) (ат2-1»&m2-i) — («о, 60), (6о, ао) — (61, ai) №m2-bam2-i) — (Ьо, ао). * Здесь термин "тритовый" для троичных чисел образован по аналогии с термином "битовый" для двоичных чисел. — Примеч. ред.
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ п-КОРТЕЖЕЙ 49 82. [М#5] (Дж. Рингель, 1956.) Используйте предыдущее упр. для вывода того факта, что существует четыре 8-битовых цикла Грэя, таких, что вместе они покрывают все ребра 8-куба. 83. [41] Могут ли четыре сбалансированных 8-битовых цикла Грэя покрыть все ребра 8-куба? 84. [25] (Ховард Л. Дыкман.) На рис. 17 показана замечательная головоломка "сумасшедшая петля" (или "гордиев узел"), в которой нужно снять гибкую веревку с жестких петель, которые окружают ее. Покажите, что решение этой головоломки тесно связано с отраженным третичным кодом Грэя. 85. [М25] (Дана Ричарде.) Если Г = (а0,..., qjt-i) является произвольной последовательностью t строк и Г' = (о:0,..., a4'_i) является произвольной последовательностью t' строк, то зигзаговым произведением (boustrophedon product) Г I Г' называется последовательность из tt' строк, которая начинается с и заканчивается at_ia'0, если t четно, либо а*_1с4'_1, если t нечетно. Например, основное определение двоичного кода Грэя в (5) можно выразить с помощью данного обозначения следующим образом: Гп = (0,1) I Гп-1 для п > 0. Докажите, что операция I ассоциативна, 86. [26] Определите неограниченный код Грэя, который проходит все возможные неотрицательные целочисленные n-кортежи (сц,..., ап) таким образом, что max(ai,... , an) < max(a,1,..., an), когда за (ах,..., ап) следует (а[,..., а'п). 87. [27] В продолжение предыдущего упражнения определите неограниченный код Грэя, который проходит все целочисленные n-кортежи (oi,...,on) таким образом, что maxdaj,..., \ап\) < maxflai |,..., |a'n|), когда за (ab...,an) следует (ai,..., a'n). 88. [25] Что произойдет после завершения алгоритма К на этапе К4, если сразу же перезапустить его на этапе К2? 89. [25] (Код Грэя для кода Морзе.) Слова кода Морзе длины га (упр. 4.5.3-32) представляют собой строки из точек и тире, где п — это количество точек плюс удвоенное количество тире. a) Покажите, что можно генерировать все слова кода Морзе длины га за счет последовательного изменения тире на две точки или наоборот. Например, путь для га = 3 будет иметь вид • —, • • •, — • или наоборот. b) Какая строка идет за • •• • — • в такой последовательности для га = 15? 90. [26] Для каких га можно упорядочить слова кода Морзе в цикле для основных правил упр. 89? [Подсказка: количество слов кода равно Fn+i.] 91. [34] Предложите бесцикловый алгоритм посещения всех таких двоичных га-кортежей (ai,...,an), что ai < а2 > аз < > • • •. [Число таких га-кортежей равно Fn+2-] Рис. 17. Головоломка "сумасшедшая петля' т.е. Г, m+n
50 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 92. [М#0] Существует ли неограниченная последовательность Фп, первый элемент которой тп образует га-й цикл де Бруийна для всех га? [Случай п = 2 решен в (54).] 93. [М28] Докажите, что алгоритм R выводит цикл де Бруийна. 94. [22] Каким будет результат алгоритма D для га = 5,п = 1иг = 3, если сопрограммы /() и /'() генерируют тривиальные циклы 01234 01234 01...? 95. [М£?] Представим, что неограниченная последовательность аоздаг... с периодом р перемежается с неограниченной последовательностью &obi&2 • • • с периодом q с образованием неограниченной циклической последовательности С0С1С2С3С4С5 ... = aoboaibia2b2 .... a) При каких условиях С0С1С2... имеет период pql (Периодом последовательности aoaia2... в данном упражнении называется такое наименьшее целое число р > 0, для которого dk = afc+P для всех к > 0.) b) Какие 2п-кортежи будут возникать в последовательных выходах алгоритма D, если этап D6 заменить следующим: "если t' = п и х' < г, то перейти к D4"? c) Докажите, что алгоритм D выводит цикл де Бруийна. 96. [М23] Предположим, что имеется семейство сопрограмм для генерации циклов де Бруийна длины тп с использованием алгоритмов R и D, основанных на рекурсии простых сопрограмм для основного случая п = 2, как в алгоритме S. a) Сколько может быть сопрограмм каждого типа Rn■> Dn и *Sn? b) Какое максимальное количество активизаций сопрограмм необходимо для получения вывода одной цифры высокого уровня? 97. [М29] Цель этого упражнения — проанализировать циклы де Бруийна, созданные с помощью алгоритмов R и D в важном особом случае т = 2. Пусть /п(к) является таким (к + 1)-м битом 2п-цикла, что fn(k) = 0 для 0 < к < п. Также допустим, что jn является таким индексом, что 0 < jn < 2п и fn(k) = 1 для jn < к < jn + п. a) Запишите циклы (/п(0)... fn(2n— 1)) для п — 2, 3, 4 и 5. b) Докажите, что для всех четных значений п существует такое число 8п = ±1, что f (к) = 1 если 0 < к - jn или 2П+ jn <к- 2П+1; Ц j"\l + £/n(fc + (5n), если jn< к <2n + jn, где сравнение выполняется по модулю 2. (В этой этой формуле Е/ обозначает функцию суммирования S/(fc) = Yl^Zo fU)-) Следовательно, jn+i = 2п—6п, когда n четно. c) Пусть (cn(O)cn(l)... cn(22n — 5)) является циклом, созданным с помощью упрощенной версии алгоритма D в упражнении 95(b), примененного для /п(). Где в таком цикле возникают (2п — 1)-кортежи i2n_1 и (01)п_10? d) Используйте результаты (с) для выражения f2n(k) на основе /п(). e) Найдите (в некоторой степени) простую формулу для jni как функцию п. 98. [М34] В продолжение предыдущего упражнения предложите эффективный алгоритм вычисления fn(k) для заданных п > 2 и к > 0. 99. [М23] Примените технологию из предыдущего упражнения для проектирования эффективного алгоритма поиска любой заданной n-битовой строки в цикле (/п(0)/п(1). •. /п(2п-1)). 100. [40] Является ли цикл де Бруийна из упр. 97 полезным источником псевдослучайных битов при достаточно больших значениях п?
7.2.1.1 ГЕНЕРАЦИЯ ВСЕХ п-КОРТЕЖЕЙ 51 ► 101. [МЗО] (Уникальное разложение строки на простые неувеличивающиеся строки.) a) Докажите, что если Л и Л7 просты, то А А' является простой, если Л < Л'. b) Следовательно, каждую строку а можно записать в виде а = Л1Л2 ... At, Ai > Л2 > • • • > At, где каждое Aj — простое число. c) На самом деле возможно только одно такое разложение. [Подсказка. Покажите, что At должно быть лексикографически наименьшим непустым суффиксом а.] d) Истинно или ложно утверждение: Ai является самым длинным простым префиксом а. e) Найдите простые строки для следующей строки: 3141592653589793238462643383279502884197? 102. [НМ28] Выведите количество га-х простых строк длины п на основании теоремы об однозначном разложении на простые множители в предыдущем упражнении. 103. [М20] Используйте (59) для доказательства малой теоремы Ферма о том, что тр = т (по модулю р). 104. [17] Согласно формуле (60), приблизительно 1/п всех n-буквенных слов являются простыми. Сколько из 5757 пятибуквенных слов GraphBase являются простыми строками? Какое из них является наименьшей непростой строкой? А какое является наибольшей простой строкой? 105. [М31] Пусть а является предпростой строкой длины п в неограниченном алфавите. a) Покажите, что если увеличить последнюю букву а, то полученная строка будет простой строкой. b) Покажите, что если а разложена на простые строки, как в упр. 101, то она является n-расширением Аь c) Более того, а не может быть n-расширением двух разных простых строк. ► 106. [МЗО] С помощью обратной реконструкции алгоритма F создайте алгоритм, который посещает все га-е простые и предпростые строки в порядке убывания. 107. [НМЗО] Оцените время выполнения алгоритма F. 108. [М35] Пусть Ai < • • • < At являются m-ми простыми строками, длины которых являются множителями п, и пусть а\ ... ап является произвольной m-й строкой. Цель этого упражнения заключается в доказательстве того, что сы ...ап появляется в Ai... AtAiA2; следовательно, Ai... А* является циклом де Бруийна (поскольку он имеет длину тп). Для удобства предположим, что га = 10 и строки соответствуют десятичным числам; такие же аргументы применимы для произвольного га > 2. a) Покажите, что если а\ ... ап = а(3 отличается от всех его циклических сдвигов и если /За — Afc — простая строка, то а(3 является подстрокой AfcAfc+i, пока не выполняется условие а = 9J для некоторого j > 1. b) Где появятся а/3 в Ai ... At, если /За является простой строкой и а состоит из всех девяток? [Подсказка. Покажите, что если an+i-i - • an = 91 на этапе F2 для некоторого I > 0 и если j не является делителем п, то на предыдущем этапе F2 имеем an-i... ап = 9i+1.] c) Теперь рассмотрим п-кортежи вида (a/3)d, где d > 1 является делителем п и Ра = \к является простой строкой. d) Где появятся 899135, 997879, 913131, 090909, 909090 и 911911 при п = 6? e) Является ли Ai ... At лексикографически наименьшим га-м циклом де Бруийна длины гап?
52 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.1 109. [М22] га-й тор де Бруийна с размерами га2 х га2 для окон 2x2 — такая матрица га-х цифр dij, что каждая из га4 подматриц отлична от другой, а индексы свертываются по модулю га2. Таким образом, любая возможная га-я 2 х 2 подматрица возникает только один раз. Й. Стюарт назвал этот объект га-м ауротором [Ian Stewart, Game, Set, and Math (Oxford: Blackwell, 1989), Chapter 4]. Например, /0 0 1 0\ 0 0 0 1 0 111 \1 0 1 1/ является двоичным ауротором. Действительно, это единственная такая матрица для га = 2, если исключить сдвиг и/или транспозицию. Рассмотрим бесконечную матрицу D, элемент которой в строке г — (... «220100)2 и столбце j = (... 626160)2 is dij = (... 020100)2, где со = (a0 0 60)(ai 0 61) 0 61; Ck = (o2fca0 0 62fc)60 0 (a2A;+iao 0 62fc+i)(60 0 1) для к > 0. Покажите, что верхняя левая подматрица 22n х 22п матрицы D является 2п-м ауротором для всех п > 0. 110. [М25] В продолжение предыдущего упражнения создайте га-е ауроторы для всех га. 111. [20] Число 100 можно получить 12 способами за счет вставки знаков + и — в последовательность 123456789; например, 100 = 1 + 23 - 4 + 5 + 6 + 78 - 9 = 123 - 45 - 67 + 89 = -1 4-2-3 + 4 + 5 + 6 + 78 + 9. a) Какое наименьшее положительное целое число нельзя представить таким образом? b) Рассмотрите также вставку знаков в последовательность из десяти цифр — 9876543210. ► 112. [25] В продолжение предыдущего упражнения: как далеко можно зайти, вставляя знаки среди цифр 12345678987654321? Например, 100 = -1234-5-6+7898-7-6543-2-1. 0 < i,j < га2 Тин тан дин дан 6им бам бом бо — тан тин дин дан бам бим бо бом — тин тан дан дин бим бам бом бо — тан тин дан дин бам бим бо бом — тан дан тин бам дин бо бим бом — .... Тин тан дин дан бим бам бом бо. — ДОРОТИ Л. СЭЙЕРС (DOROTHY L. SAYERS), Девять портных (The Nine Tailors) (1934)
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 53 Перестановка десяти десятичных цифр — это просто десятичное число из 10 цифр, в котором все цифры различны. Следовательно, достаточно сгенерировать все числа из 10 цифр и выбрать только те, цифры которых являются различными. Разве не прекрасно, что высокоскоростные вычисления спасают нас от тяжелых размышлений! Достаточно просто запрограммировать к + 1 —> к и проверить цифры к на наличие нежелательных совпадений цифр. Причем этот способ дает нам все перестановки в лексикографическом порядке! По зрелом размышлении ... нам не нужно задумываться о чем-то другом. — Д. X. ЛЕМЕР (D. Н. LEHMER) (1957) 7.2.1.2. Генерация всех перестановок. После n-кортежей следующим наиболее важным элементом в перечне пожеланий практически любого специалиста в области комбинаторной генерации является задача посещения (т.е. перебора) всех перестановок заданного множества или мультимножества. Для решения этой задачи придумано много разных способов. Действительно, ведь для несортированного расположения элементов множества опубликовано практически такое же количество алгоритмов, как и для сортированного! В этом разделе рассматриваются наиболее важные генераторы перестановок, начиная со следующего простого и гибкого классического метода. Алгоритм L (генерация лексикографической перестановки). Для заданной последовательности п элементов а\а2... ап, в исходном состоянии отсортированных так, что di < а2 < • • • < ап, (1) этот алгоритм генерирует все перестановки {ai,a2,... ,an}, посещая их в лексикографическом порядке. (Например, перестановки множества {1,2,2,3} имеют такой лексикографический порядок: 1223, 1232, 1322, 2123, 2132, 2213, 2231, 2312, 2321, 3122, 3212, 3221.) Предполагается, что для удобства используется вспомогательный элемент ао, который должен быть меньше, чем самый большой элемент ап. L1. [Посетить.] Посетить перестановку а\а2 ... an. L2. [Найти j.] Установить j; <— п — 1. Если ctj > aJ+i, уменьшать j на 1 повторно, пока не выполняется условие aj < clj+\. Завершить алгоритм, если j — 0. (В этом месте j является наименьшим индексом, для которого были посещены все перестановки, начиная с a\...aj. Следовательно, лексикографически следующая перестановка увеличит значение aj.) L3. [Увеличить aj] Установить I <— п. Если aj > а/, уменьшать I на 1 повторно, пока не выполняется условие aj < а/. Затем поменять местами aj а/. (Поскольку aj+i > • • • > ап, элемент а\ является наименьшим элементом больше aj5 который может следовать за а\.. .aj-i в перестановке. Перед заменой мы имели Gj+i > • • • > ai-i > ai > aj > a/+i > • • • > an; а после замены имеем «Я-i > • • • > ai-i > a>j > Q>i > > • • • > an.) L4. [Обратить aJ+i ...an.\ Установить k <— j + 1 и / <— п. Затем, если k < /, поменять местами «-» а/, установить fc<—fc + 1,/*—/ — 1и повторять, пока не выполнится условие k > I. Вернуться к LI. |
54 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Этот алгоритм придуман Пандита Нарайана еще в XIV веке в Индии (см. раздел 7.2.1.7). Он также упоминается в предисловии К. Ф. Гинденбурга (С. F. Hindenburg) к работе К. Ф. Рудигера (С. F. Rudiger) Specimen Analyticum de Lineis Curvis Secundi Ordinis, C. F. Rudiger (Leipzig, 1784), xlvi-xlvii. Он часто переоткрывался с того времени. Принцип его работы описывается в комментариях в скобках на этапах L2 иЬЗ. Вообще говоря, лексикографического наследника любого комбинаторного объекта а\... ап можно получить с помощью трехэтапной процедуры. 1) Найти такое наибольшее значение j, для которого aj может быть увеличено. 2) Увеличить aj на наименьшее допустимое значение. 3) Найти лексикографически наименьший путь для расширения нового объекта а\... aj до полного объекта. Алгоритм L использует эту общую процедуру в случае генерации перестановки, точно так же, как алгоритм 7.2.1.1М использует ее в случае генерации n-кортежа. При изучении других комбинаторных объектов мы представим другие разнообразные примеры. Обратите внимание на то, что в начале этапа L4 имеем aj+i > • • • > ап. Следовательно, первая перестановка, начинаясь с текущего префикса а\ ... , имеет вид ai.. .ajan ... a^+i, а этап L4 создает ее за счет [{п — j)/2\ замен (транспозиций). На практике этап L2 находит j = п — 1 за вдвое меньшее время, если элементы различны, поскольку точно для п\/2 из п! перестановок выполняется an_i < ап. Следовательно, алгоритм L можно ускорить, распознавая этот особый случай, без значительного усложнения (см. упр. 1). Аналогично, вероятность того, что j <n — t, равна всего 1/£!, если а различны. Следовательно, циклы на этапах L2- L4 обычно выполняются очень быстро. В упр. 6 время выполнения анализируется в общем случае и показывается, что алгоритм L обладает сравнительно высокой эффективностью, когда присутствуют равные элементы, если только некоторые значения не появляются чаще других в мультимножестве {ai,a2,...,an}. Смежные замены. В разделе 7.2.1.1 показано, что коды Грэя эффективны для генерации n-кортежей, но аналогичные рассуждения применимы и для генерации перестановок. Простейшее возможное изменение перестановки заключается в замене смежных элементов, а из главы 5 известно, что любая перестановка может быть упорядочена, если подобрать подходящую последовательность таких замен. (Например, алгоритм 5.2.2В работает таким образом.) Следовательно, можно пойти обратным путем и получить любую нужную перестановку, начиная со всех упорядоченных элементов и заменяя соответствующие пары смежных элементов. Естественным образом возникает вопрос: можно ли получить все перестановки заданного мультимножества таким образом, что на каждом этапе происходит замена (транспозиция) только двух смежных элементов? Если да, то общая программа проверки всех перестановок может во многих случаях быть проще и быстрее, поскольку ей потребуется только вычислить результат замены вместо повторной обработки всего нового массива а\... ап. Увы, если мультимножество содержит повторяющиеся элементы, то не всегда можно найти такую последовательность, подобную коду Грэя. Например, шесть перестановок множества {1,1,2,2} связаны друг с другом следующим образом за-
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 55 менами смежных элементов: ^ 2112 ^ 1122 1212 ZZ 2121 2211; (2) ^ 1221 ^ причем этот граф не имеет гамильтонова пути. В большинстве приложений приходится иметь дело с перестановками различных элементов, а в этом случае есть один простой алгоритм, который способен генерировать все п! перестановок за счет всего п! — 1 замен смежных элементов. Более того, еще одна такая замена возвращает множество в исходное состояние так, что имеем гамильтонов цикл, аналогичный двоичному коду Грэя. Идея заключается в том, чтобы взять такую последовательность для {1,..., п — 1} и вставить число п во все возможные перестановки, выполненные таким образом. Например, если п = 4, то последовательность (123,132,312,321,231,213) приводит к массиву с такими столбцами: 1234 1324 3124 3214 2314 2134 1243 1342 3142 3241 2341 2143 1423 1432 3412 3421 2431 2413 4123 4132 4312 4321 4231 4213 (3) где число 4 вставлено во все четыре возможные позиции. Теперь мы получим нужную последовательность, считывая вниз первый столбец, потом вверх — второй, вниз — третий, вверх — последний: (1234,1243,1423,4123,4132,1432, 1342,1324,3124,3142,..., 2143,2134). В разделе 5.1.1 рассматриваются инверсии перестановки, а именно неупорядоченные пары элементов (не обязательно смежных). Каждая замена смежных элементов изменяет общее число инверсий на ±1. Действительно, если рассмотреть так называемую таблицу инверсии с\... сп из упр. 5.1.1-7, где Cj — это количество элементов, лежащих справа от j, которые меньше, чем j, то можно обнаружить, что перестановки в (3) имеют следующую таблицу инверсии: 0000 0010 0020 0120 ОНО 0100 0001 ООП 0021 0121 0111 0101 0002 0012 0022 0122 0112 0102 0003 0013 0023 0123 0113 0103 (4) А если считать эти столбцы попеременно вниз и вверх, как прежде, то получим точно отраженный код Грэя для смешанного основания (1,2,3,4), как в уравнениях (4б)-(51) в разделе 7.2.1.1. Такое же свойство справедливо для всех п, как заметил Э. В. Дейкстра (Е. W. Dijkstra) [Acta Informatica 6 (1976), р.357-359], и оно приводит нас к следующей формулировке. Алгоритм Р (простые изменения). Для заданной последовательности а\а2 .. .апп различных элементов этот алгоритм генерирует все их перестановки за счет повторных замен среди смежных пар. Он использует вспомогательный массив с1с2 ... сп, который представляет инверсии, как описано выше, проходя все последовательности целых чисел, таких, что 0 < сj < j для 1 < j < п. (5)
56 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Другой массив, 01о2 ... оп, отвечает за направления, в которых меняются элементы Cj. PI. [Инициализировать.] Установить с3■, <— 0 и Oj <— 1 для 1 < j < п. Р2. [Посетить.] Посетить перестановку а\а^ • • . ап. РЗ. [Приготовиться к изменению.] Установить j <— п и s <— 0. (На следующих этапах определяется координата j, для которой меняется Cj, сохраняя (5); переменная s содержит количество таких индексов к > j, что с& = к — 1.) Р4. [Готовность к изменению?] Установить q <— Cj + о^. Если g < 0, перейти к Р7; если q = j, перейти к Р6. Р5. [Изменить.] Заменить aj_c.+e <-» aj_9+s. Затем установить сj <— 5 и вернуться к Р2. Р6. [Увеличить s.] Завершить, если j = 1, в противном случае установить 5 «е- s + l. Р7. [Переключить направление.] Установить Oj < Oj, j <— j — 1, а, потом вернуться к Р4. | Этот алгоритм, который очевидно работает для всех п > 1, обнаружен в XVII веке в Англии, когда звонари придумали обычай перезвона множества колоколов во всех возможных перестановках. Они назвали алгоритм Р методом простых изменений. На рис. 18,а показана неупорядоченная особая последовательность "Кембридж 48" из 48 перестановок 5 колоколов, которая использовалась в начале XVI века еще до того, как согласно принципу простых изменений был обнаружен способ перебора всех 5! = 120 вариантов. Почтенная история алгоритма Р прослежена до рукописи Питера Мунди, которая хранится в Библиотеке имени Бодлея при Оксфордском университете. Она была переписана приблизительно в 1653 году и транскрибирована Эрнестом Моррисом (Ernest Morris) в книге The History and Art of Change Ringing (1931), p.29-30. Немного позже, в 1668 году, была анонимно напечатана знаменитая книга Tintinnalogia (Тинтинналогия, или Искусство колокольного звона), авторами которой (как выяснилось теперь) были Ричард Дакворт (Richard Duckworth) и Фабиан Стедман (Fabian Stedman), посвятившие первые 60 страниц подробному описанию простых изменений, начиная с п — 3 и до произвольно большого п. Последовательность "Кембридж 48" в течение многих лет была величайшим Перезвоном, который когда-либо звонил или был изобретен; но теперь, ни "48", ни "100", ни "720", ни любое другое число не может сдержать нас; ведь мы открыли алгоритм изменения звона колоколов до бесконечности. ... Для четырех колоколов существует 24 варианта Перезвона, причем один колокол называется "Охота", а три другие — "Экстремальные Колокола"; "Охота" сдвигается, и постоянно охотится вверх и вниз два из "Экстремальных колоколов" образуют изменение каждый раз, когда "Охота" возникает перед ними или после них. — РИЧАРД ДАКВОРТ и ФАБИАН СТЕДМАН, Tintinnalogia (Тинтинналогия, или Искусство колокольного звона) (1668) Британские энтузиасты колокольного звона вскоре придумали более сложные схемы, в которых две или более пары колоколов одновременно меняются местами. Например, они придумали последовательность (рис. 18,с), известную как "дедовская
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 57 сдвоенная", "наилучший и наиболее искусный Перезвон, когда-либо придуманный для пяти колоколов" [Tintinnalogia, р. 95]. Такие методы более интересны, чем алгоритм Р, с музыкальной или математической точки зрения, но они менее полезны в компьютерных приложениях, а потому мы не будем подробно рассматривать их. Заинтересованные читатели могут ознакомиться с ними в книге В. Г. Вилсона (W. G. Wilson) Change Ringing (1965); см. также работу А. Т. Байта (А. Т. White), опубликованную в АММ 103 (1996), р.771-778. (незавершено) (а) Последовательность "Кембридж 48" (Ь) Последовательность "простые изменения" (c) Последовательность "дедовская сдвоенная" (d) Последовательность "Стедмана сдвоенная" Рис. 18. Четыре последовательности, которые использовались в XVII-м веке в Англии для перестановки пяти разных церковных колоколов. Объект (Ь) соответствует алгоритму Р X. Ф. Троттер (Н. F. Trotter) опубликовал первую компьютерную реализацию простых изменений [САСЫ 5 (1962), р.434-435]. Этот алгоритм достаточно эффективный, особенно если он отлажен, как в упр. 16, поскольку п — 1 из каждых п перестановок генерируются без использования этапов Р6 и Р7. Алгоритм L, наоборот, находится в наилучшем состоянии только в половине случаев. Тот факт, что алгоритм Р выполняет точно одну замену за одно посещение, означает, что генерируемые им перестановки попеременно четны и нечетны (см. упр. 5.1.1-13). Следовательно, можно генерировать все четные перестановки, пропуская нечетные. Действительно, таблицы с и о упрощают слежение за текущим общим количеством инверсий, с\ + • • • + сп. Во многих программах требуется повторно генерировать одинаковые перестановки и в таких случаях не нужно каждый раз проходить все этапы алгоритма Р. Можно просто подготовить список подходящих переходов, используя следующий метод. Алгоритм Т (переходы простых изменений). Этот алгоритм вычисляет такую таблицу t[l], t[2], ..., t[n\ — 1], что действия алгоритма Р эквивалентны последовательным обменам ащ а*[к]+1 для 1 < к < п\. Предполагаем, что п > 2. Т1. [Инициализировать.] Установить N <— n!, d <— N/2, t[d] <— 1 и га «— 2.
58 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Т2. [Цикл для га.] Завершить, если га = п. В противном случае установить га <— га + 1, d <— d/ra и /с <— 0. (Придерживаемся условия d = n!/m!.) ТЗ. [Охотиться вниз.] Установить к <— к + d и j <r- га — 1. Пока j > 0, установить £[&] <— j, j <— j — 1 и А; <— & + d, пока не выполняется условие j = 0. Т4. [Отступ.] Установить ОД «— t[k] + 1 и <— к + d. Т5. [Охотиться вверх.] Пока j < га — 1, установить j <— j + 1, £[fc] <— j и A: <— A; + d. Вернуться к ТЗ, если к < TV, в противном случае вернуться к Т2. | Например, если п — 4, то получим таблицу (£[1], t[2],..., £[23]) = (3,2,1,3,1,2,3,1, 3,2,1,3,1,2,3,1,3,2,1,3,1,2,3). Буквометика. Рассмотрим простую загадку, в которой полезно использовать перестановки: как разгадать загадку суммирования зашифрованных чисел SEND •f MORE (6) MONEY, где каждый символ обозначает какую-то десятичную цифру? [Н. Е. Dudeney, Strand 68 (1924), 97, p.214.] Такие загадки часто называют словом "буквометика" ("alpha- metics"), которое придумал Дж. Э. X. Хантер [Globe and Mail (Toronto: 27 October 1955), 27]. Другой термин, "криптаритм (cryptarithm)", предложил С. Ватриквант [Sphinx 1 (May 1931), р.50]. Классическую буквометику (6) можно легко решить вручную (см. упр. 21). Но допустим, имеется большой набор сложных буквометик, причем одни из них могут не иметь решения, а другие могут иметь десятки решений. Тогда для экономии времени можно было бы написать компьютерную программу, которая попробует перебрать все перестановки цифр, соответствующих данной загадке, и найти те перестановки, которые дают правильную сумму. (Компьютерная программа для решения буквометик была предложена Джоном Бейдлером [Creative Computing 4,6 (November-December 1978), р.110-113].) Если отойти от частностей и рассмотреть более общий тип задач аддитивных буквометрик, то можно заметить не только простые суммы, как (6), но и другие примеры типа VIOLIN + VIOLIN + VIOLA = TRIO + SONATA. Эта задача эквивалентна следующей: 2(VI0LIN) + VIOLA - TRIO - SONATA = 0, (7) где фигурирует сумма членов с целочисленными коэффициентами, которая в итоге равна нулю, если вместо различных букв подставить различные десятичные цифры. Каждая буква в такой задаче имеет сигнатуру, которая получается путем подстановки 1 для данной буквы и подстановки 0 для других букв. Например, сигнатура для I в (7) имеет вид 2(010010) + 01000 - 0010 - 000000,
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 59 а именно 21010. Если произвольно присвоить коды (1,2,..., 10) буквам (V, 1,0, L, N, А, Т, R, S, X), то соответствующие сигнатуры для (7) имеют вид 5i = 210000, 52 = 21010, 53 = -7901, 54 = 210, 55 = -998, ( . 56 = -100, 57 = -1010, 58 = -100, 59 = -100000, 8г0 = 0. W (Дополнительная буква X добавлена, поскольку нужно десять букв.) Задача теперь сводится к поиску всех таких перестановок а\... аю для {0,1,..., 9}, что ю 3=1 Дополнительное условие заключается в том, что числа в буквометике не могут начинаться с цифры 0. Например, суммы 7316 5731 6524 2817 + 0823 и +0647 и +0735 и +0368 08139 06378 07259 03185 и многие другие не считаются корректными решениями (6). Вообще, существует множество F таких первых букв, что aj ф 0 для всех j е F; (10) множество F, соответствующее (7) и (8), имеет вид {1,7,9}. Один из способов обработки аддитивных буквометик состоит в использовании алгоритма Т для подготовки таблицы 10! — 1 переходов t[k]. Тогда для каждой задачи, заданной последовательностью сигнатур (si,..., 5ю) и множеством первых букв F, решение можно искать следующим образом. А1. [Инициализировать.] Установить а\а2 ... аю <— 01...9, v <— Yl)=iU~~i)sji к <— 1 и Sj <— Sj+i — Sj для 1 < j < 10. А2. [Проверить.] Если v = 0 и если справедливо (10), вывести решение а\... аю- A3. [Обмен.] Остановить, если к — 10!. В противном случае установить j <— t[k], v <r— v — (eij+i — aj)Sj, aJ+i <-> a^, к <— к + 1 и вернуться к А2. | Этап A3 оправдан тем, что транспозиция aj и a^+i просто уменьшает а - 5 на (a^+i — aj)(sj+i — Sj). Хотя 10! равно 3 628 800 и представляет собой достаточно большое число, но операции на этапе A3 так просты, что для их выполнения потребуется всего доля секунды работы современного компьютера. Буквометика называется чистой, если она имеет единственное решение. К сожалению, буквометика (7) не является чистой. Перестановки 1764802539 и 3546281970 удовлетворяют (9) и (10), следовательно, имеем два решения: 176478 + 176478 + 17640 = 2576 + 368020; и 354652 + 354652 + 35468 = 1954 + 742818. Более того, sq = sg в (8), так что можно получить еще два решения за счет обмена цифрами для букв А и R. С другой стороны, буквометика (6) является чистой, хотя данный метод дает две разные перестановки для ее решения. Дело в том, что (6) включает только
60 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 восемь различных букв, следовательно, для поиска решения используются две подстановочные сигнатуры 59 = «ю = 0. В общем случае буквометика с т различными буквами имеет 10 — т подстановочных сигнатур sm+\ = -.- = s10 = 0,a каждое решение будет найдено (10 — ш)! раз, если не использовать условие am+i < • • • < аю- Общая структура. Очень много алгоритмов было предложено для генерации перестановок различных объектов, и наилучший способ их изучения состоит в применении мультипликативных свойств перестановок, изученных в разделе 1.3.3. Для этого нужно слегка изменить систему обозначений, используя индексирование с началом в нуле и запись а$а\... ап-\ для перестановок {0,1,..., п — 1} вместо записи aia2...an для перестановок {1,2, ...,п}. Что еще более важно, так это то, что мы будем использовать схемы генерации перестановок, в которых большинство действий происходит слева так, что все перестановки {0,1,...,А; — 1} генерируются во время первых А:! этапов для 1 < к < п. Например, одна такая схема для п = 4 имеет вид 0123,1023,0213, 2013,1203, 2103,0132,1032, 0312,3012,1302,3102, 0231, 2031,0321, 3021, 2301, 3201,1230, 2130,1320,3120, 2310,3210; [ } который называется обратным колексикографическим порядком, поскольку, если отразить строки справа налево, получим 3210, 3201, 3120, ..., 0123, т.е. обратный лексикографический порядок. Другой способ представления (11) состоит в просмотре элементов в виде (п—ап)... (п—а2)(п—ai), где а\а2 •.. ап в лексикографическом порядке проходит через перестановки {1,2,...,п}. Напомним из раздела 1.3.3, что перестановку типа а = 250143 можно записать либо в форме двух строк: _ /0123454 а~ 1250143;' либо в более компактной циклической форме: а = (0 2)(1 5 3). Это означает, что в а имеют место 0 ь-» 2, 1 ^ 5, 2 и 0, 3 ь> 1, 4 ^ 4 и 5 ^ 3. Одноэлементный цикл ' (4)' указывать не нужно. Поскольку цифра 4 является фиксированной точкой этой перестановки, то можно сказать, что "а фиксирует 4". Запишем 0а = 2, 1а = 5 и т.д., т.е. ja является образом j от а. Произведение перестановок, как, например, а и /?, где (3 = 543210, можно записать либо в двухстрочной форме: /0123454 /0123454 _ /0123454 /2501434 _ /0123454 V250143/ Ч543210У ~ V250143Д3054Ш ~ V305412/ либо в циклической форме: а(3 = (0 2)(1 5 3) • (0 5)(1 4)(2 3) - (0 3 4 1)(2 5). Обратите внимание, что образом 1 от а(3 является 1(а(3) = (1а) (3 — 5(3 = 0 и т.д. Предупреждение. Почти в половине всех книг о перестановках их умножают иначе (справа налево), предполагая, что ар означает сначала применение /3, а потом — а. Дело в том, что традиционная функциональная запись а(1) =5 вполне естественно наводит на мысль, что аР(1) означает а(Р(1)) = а(4) = 4. Однако в данной книге
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 61 используется другая философия, и в ней перестановки всегда умножаются слева направо. Порядок умножения нужно учитывать очень внимательно, когда перестановки представлены массивами чисел. Например, если "применить" отражение /3 = 543210 к перестановке а — 250143, то результатом 341052 будет не а(3, а Ра. Вообще говоря, операция замены перестановки а = а^а\ .. .ап-\ некоторым переупорядочением «оу9^1/з •. • й(п-1)/з дает к i—> dkp = к/За. Перестановка положения с помощью /3 соответствует предумножению (premultiplication) на /3, иначе говоря, умножению в обратном порядке или умножению начиная слева, т.е. замене а на /За; а перестановка значений с помощью /3 соответствует умножению в обычном порядке на /?, иначе говоря, постумножению (postmultiplication) или умножению начиная справа, т.е. замене а на а/3. Таким образом, например, генератор перестановок, который обменивает а\ <-> а2, предумножает текущую перестановку на (1 2), постумножает ее на (ai а2). Следующее предложение сделано Эваристом Галуа (Evariste Galois) в 1830 году: непустое множество G перестановок образует группу, если оно замкнуто на операции умножения, т.е. если произведение а(3 принадлежит G, когда а и (3 являются элементами G [см. Ecrits et Memoires Mathematiques d'Evariste Galois (Paris, 1962), р.47]. Рассмотрим 4-куб, представленный в виде тора 4x4 как в упр. 7.2.1.1-17, и пусть G является множеством всех перестановок вершин {0,l,...,f}, для которых сохраняется соседство: перестановка а принадлежит G тогда и только тогда, когда и — v подразумевает иа — va в 4-кубе. (Здесь используются шестнадцатеричные цифры (0,1,..., f) для обозначения целых чисел (0,1,..., 15). Метки в (12) выбраны так, что и — v тогда и только тогда, когда и и v отличаются только одним положением бита.) Множество G очевидно является группой, а его элементы называются симметриями или автоморфизмами 4-куба. Группы перестановок G можно очень эффективно представить в компьютере с помощью таблицы Симса, предложенной Чарльзом К. Симсом (Charles С. Sims) [Computational Methods in Abstract Algebra (Oxford: Pergamon, 1970), p.169-183]. Она является семейством подмножеств Si, S2, ... множества G, обладающих следующим свойством: Sk содержит только одну перестановку о^, которая принимает к »-» j и фиксирует значения всех элементов больше к, всякий раз, когда G содержит такую перестановку, а^к является тождественной перестановкой, которая всегда присутствует в G. Если 0 < j < к, то любая подходящая перестановка может быть выбрана для того, чтобы сыграть роль ощ. Основным преимуществом таблицы Симса является ее способность удобного представления целой группы. Лемма S. Пусть Si, S2, ..., Sn-i является таблицей Симса для группы G перестановок {0,1,...,п — 1}. Тогда каждый элемент а группы G имеет единственное представление: |0 Г 3 21 J4 5 7 б| |с d f el (12) а = GiG2 . . .<7n_i, где сг/е G Sk для 1 < к < п. (13)
62 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Доказательство. Если а имеет такое представление и если оп-\ является перестановкой G(n-\)j Е 5п-ъ то а принимает значение п — 1 i—► j, поскольку все элементы S\ U • • • U 5П_2 фиксируют значение п — 1. Наоборот, если а принимает значение п — 11—► j, то имеем а = aV(n_i)j, где о! — olgT , ч • (n-l)j является перестановкой G, которая фиксирует п — 1. (Как в разделе 1.3.3, <т~ обозначает инверсию а.) Множество G' всех таких перестановок является группой, a Si, ..., Sn-2 — таблицей Симса для G'. Таким образом, результат следует отсюда по индукции п. | Например, вычисления показывают, что одной возможной таблицей Симса для автоморфизма группы 4-куба является S, = {(), (01)(23)(45)(67)(89)(ab)(cd)(ef), (0f)(le)(2d)(3c)(4b)(5a)(69)(78)}; Se = {(), (12)(56)(9a)(de), (14)(36)(9c)(be), (18)(3a)(5c)(7e)}; 5d = {(), (24)(35)(ac)(bd), (28)(39)(6c)(7d)}; (14) 5c = {()}; 5b = {(), (48)(59)(6a)(7b)}; 5a = 59 = --- = 51 = {()}. Здесь Sf содержит 16 перестановок afj для 0 < j < 15, которые соответственно принимают гь->г0(15 — j) для 0 < г < 15. Множество Se содержит только четыре перестановки, поскольку автоморфизм, который фиксирует f, должен перемещать е по соседству с f. Таким образом, е будет либо е, либо d, либо Ь, либо 7. Множество Sc содержит только тождественную перестановку, так как автоморфизм, который фиксирует f, end, должен также фиксировать с. Большинство групп имеют Sk = {()} для всех малых значений к, как в этом примере. Следовательно, таблица Симса обычно содержит только небольшое количество перестановок, хотя сама группа может быть очень большой. Представление Симса (13) упрощает проверку наличия перестановки а в G. Сначала определим оп-\ — сг(п_1)^, где а принимает п — 1 i—► j, и предположим а' = oto~_x. Затем определим <тп_2 = cr(n_2)j', где а' принимает п — 2 н-> j\ и предположим а" = а'<7~_2; и т.д. Если на любом этапе требуемая перестановка ощ не существует в 5^, то исходная перестановка а не относится к G. В случае (14) этот процесс сводит а к тождеству после обнаружения а±, <тв, 0"d? ас и аь. Например, пусть а является перестановкой (14)(28)(3c)(69)(7d)(be), которая соответствует транспозиции (12) относительно основной диагонали {0,5,f,a}. Поскольку а фиксирует f, то а± будет тождественной перестановкой (), а а' = а. Тогда ав является членом 5в, который принимает е н-► Ь, а именно (14)(36)(9с)(be), и находим а" — (28) (39) (6с) (7d). Эта перестановка относится к Sd, так что а действительно является автоморфизмом 4-куба. Наоборот, (13) также упрощает генерацию всех элементов соответствующей группы. Просто нужно пройти все перестановки вида <т(1, ci)cr(2, с2)... сг(п - 1, cn_i),
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 63 где а(к,Ск) является (ск + 1)-м элементом Sk для 0 < Ск < Sk = \Sk\ и 1 < к < п, с помощью любого алгоритма из раздела 7.2.1.1, который проходит (п — 1)-кортежи (ci,..., cn_i) для соответствующих оснований (si,..., sn-i)- Применение общей структуры. Основной интерес вызывает группа всех перестановок {0,1,..., п — 1}, а в этом случае каждое множество Sk таблицы Симса будет содержать к + 1 элементов {ст(к,0),а(к, 1),... ,сг(к, к)}, где а(к,0) является тождественной перестановкой и другие принимают к для {(),...,& — 1} в некотором порядке. (Перестановка а(к, j) не должна быть такой же, как ощ, и обычно она другая.) Каждая такая таблица Симса приводит к генератору перестановок, согласно следующей схеме. Алгоритм G (общий генератор перестановок). Для заданной таблицы Симса (.Si, S2, • • •, Sn-i), где каждое множество Sk имеет k + 1 элементов cr(fc,j), этот алгоритм генерирует все перестановки а$а\...ап-\ для {0,1,...,п — 1}, используя вспомогательную таблицу сп ... с2 с\. G1. [Инициализировать.] Установить aj <— j и cJ+i <— 0 для 0 < j < п. G2. [Посетить.] (В этом месте число со смешанным основанием f0^1' с32' с2 \ является количеством перестановок, посещенных до сих пор.) Посетить перестановку аоа\... ап-\. G3. [Прибавить 1 к сп... c2ci.] Установить к <— 1. Если Ск — к, установить Ск <— 0, то к *— к + 1 и повторять, пока не выполняется условие Ск < к. Завершить алгоритм, если к = щ в противном случае установить Ск <— Ск + 1. G4. [Переставить.] Применить перестановку т(к,Ск)ш(к — 1)~ к а$а\ ...an_i, как объясняется ниже, и вернуться к G2. | Применение перестановки 7г к а^а\... an_i означает замену aj на ajn для 0 < j < п. Это соответствует умножению в обратном порядке (начиная со старшего разряда) на 7г, как уже объяснялось ранее. Определим т(к, j) = (i(kj)o-(kj - l)~ для 1 < j < к; (15) и(к) = <т(1,1)...а(к,к). (16) Тогда на этапах G3 и G4 сохраняется следующее свойство: aofli... ап-\ является перестановкой a(l, ci)a(2, с2)... а(п — 1, cn_i), (17) и лемма S доказывает, что каждая перестановка посещается строго один раз. Рис. 19. Алгоритм G неявно обходит это дерево для п = 4
64 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Дерево на рис. 19 иллюстрирует алгоритм G для случая п = 4. Согласно (17), каждая перестановка аоа^а^ of {0,1,2,3} соответствует трехцифровой контрольной строке c3c2ci с 0 < с3 < 3, 0 < с2 < 2 и 0 < с\ < 1. Некоторые узлы дерева отмечены только одной цифрой с3. Они соответствуют перестановкам <т(3, сз) используемой таблицы Симса. Другие узлы, отмеченные двумя цифрами С3С2, соответствуют перестановкам сг(2,С2)сг(3,Сз). Жирная линия соединяет узел сз с узлом С3О и узел С3С2 — с узлом С3С2О, поскольку сг(2,0) и сг(1,0) являются тождественными перестановками и эти узлы, по сути, эквивалентны. Добавление 1 к числу со смешанным основанием С3С2С1 на этапе G3 соответствует переходу от одного узла на рис. 19 к его наследнику в прямом порядке обхода, а преобразование на этапе G4 соответственно изменяет перестановки. Например, для С3С2С1 происходит изменение 121 на 200, на этапе G4 происходит умножение в обратном порядке текущей перестановки на т(3,2М2)" = т(3,2) (7(2,2)-<т(1,1)~. Умножение в обратном порядке на сг(1,1)~ дает переход от узла 121 к узлу 12, умножение в обратном порядке на <т(2,2)~ — переход от узла 12 к узлу 1, а умножение в обратном порядке на т(3,2) = сг(3,2)сг(3,1)~~ — переход от узла 1 к узлу 2 = 200, который является наследником узла в прямом порядке обхода 121. Иначе говоря, умножение в обратном порядке на т(3,2)о;(2)~ — это именно то, что нужно для изменения а(1,1)сг(2,2)<т(3,1) на сг(1,0)<т(2,0)сг(3,2) с соблюдением (17). Алгоритм G определяет огромное количество генераторов перестановок (см. упр. 37), потому неудивительно, что в литературе встречается множество его вариантов. Конечно, некоторые из них более эффективны, чем другие. Рассмотрим примеры наиболее эффективного соответствия операций используемого компьютера. Например, можно получить перестановки в обратном колексикографическом порядке, как в особом случае алгоритма G (см. (11)), допуская, что cr(k,j) является (j + 1)-циклом: a(k,j) = (k-j fc-j+1 ... к). (18) Дело в том, что cr(k,j) должна быть перестановкой, которая соответстует сп.. .с\ в обратном колексикографическом порядке для Ск = j и с% = 0 для г ф к, и эта перестановка а^а\.. .an_i имеет вид 01... (к— j—l)(fc—j+l) •.. (k)(k—j)(k+\).. • (n—1). Например, для n = 8 и cn ... ci = 00030000 соответствующая перестановка в обратном колексикографическом порядке имеет вид 01345267, или (2 34 5) в циклической форме. Для cr(k,j) в виде (18) уравнения (15) и (16) приводят к формулам r(kj) = (k-j к); (19) ш(к) = (01) (012)... (01 ... к) = (0 к) (1 fc-1) (2 fc-2)... = ф(к), (20) где ф(к) — это "(/с 4-1)-переворот", который заменяет ао • • • «fc на ак • •.«о- В этом случае и(к) оказывается равной и(к)~, поскольку ф(к)2 = (). Уравнения (19) и (20) неявно присутствуют за кулисами алгоритма L и в его эквиваленте в обратном лексикографическом порядке (см. упр. 2), где на этапе L3 применяется транспозиция, а на этапе L4 — переворот. На этапе G4 сначала выполняется переворот, но тождество {к-зк)ф{к-\) = ф(к- i)(j-i к) (21)
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 65 показывает, что переворот и транспозиция эквивалентны (другой) транспозиции и перевороту. Действительно, уравнение (21) является особым случаем важного тождества 7Г"(Л 32 ... jt)7T = O'lTT J27T ... jt7r), (22) которое справедливо для любой перестановки 7г и любого t-цикла (ji j2 ... jt)- В левой части (22) имеем, например, j\7r •—> ji ь-* j2 ь-► j2tt, в соответствии с циклом справа. Следовательно, если а и тг являются произвольными перестановками, то перестановка 7г~а7г (которая называется сопряжением а и тг) имеет точно такую же циклическую структуру, как и а. Мы просто заменяем каждый элемент j в каждом цикле jn. Еще один важный особый случай алгоритма G рассмотрен Р. Дж. Орд-Смитом (R. J. Ord-Smith) [САСМ 10 (1967), 452; 12 (1969), р.638; см. также Сотр. J. 14 (1971), р. 136-139], который получается подстановкой <r(k,j) = {k ... 10У. (23) Теперь из (15) ясно, что r(k,j) = (k ... 10); (24) и снова имеем: ш(к) = (0 fc)(l Л-1)(2 к-2)... = ф(к), (25) поскольку перестановка а(к, к) = (0 1 ... к) точно такая же, как и прежде. Интересно в этом методе то, что перестановка, необходимая на этапе G4, а именно r(k,Ck)u{k — 1)~, не зависит от с&: r(kj)uj(k - 1)~ = (к ... 1 0)ф(к - 1)" = ф(к). (26) Таким образом, алгоритм Орд-Смита является особым случаем алгоритма G, в котором на этапе G4 происходит замена ао <-> а\ <-> а^_1, Эта операция обычно выполняется очень быстро, поскольку к мало, и это экономит часть работы алгоритма L. (См. упр. 38 и ссылку на Дж. С. Клюгеля (G. S. Klugel) в разделе 7.2.1.7.) Можно добиться большего, поступая так, чтобы на этапе G4 каждый раз требовалось делать только одну транспозицию, почти как в алгоритме Р, но не обязательно со смежными элементами. Имеется несколько схем реализации этого плана. Самый лучший, вероятно, заключается в следующем: ч , ч Г (к 0), если к четно; , ч T(k,j)w{k-l)-= , (27) {(к если к нечетно; как предложил Б. Р. Хип (В. R. Heap) [Сотр. J. 6 (1963), р.293-294]. Обратите внимание, что в методе Хипа транспозиция а& <-> ао происходит всегда, за исключением случаев, когда к = 3, 5, ..., а значение к в пяти случаях на каждых 6 этапах равно 1 или 2. В упр. 40 доказывается, что метод Хипа действительно генерирует все перестановки. Пропуск нежелательных блоков. Одним важным преимуществом алгоритма G является то, что он обходит все перестановки ао ... ak-i до достижения а&. Затем он выполняет еще к\ циклов перед сменой а& и т.д. Следовательно, если в произвольный момент времени мы дойдем до заключительных элементов а& ... an_i, которые
66 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 не имеют большого значения для решаемой задачи, то можно быстро пропустить все перестановки, которые заканчиваются неинтересующими нас суффиксами. Точнее говоря, можно заменить этап G2 следующими подчиненными этапами. G2.0. [Нужно?] Если а к ... an_i является ненужным нам суффиксом, то перейти к G2.1. В противном случае установить к <— к — 1. Тогда, если к > 0, то повторить этот этап; если к — 0, то перейти к G2.2. G2.1. [Пропустить этот суффикс] Если с* = fc, применить а(к,к)~ к ao...an_i, установить Ск <— О, А; <— А; +1 и повторять, пока не будет выполняться условие Ck < к. Завершить, если к = п, в противном случае установить ck <— Ск + 1, применить т(к, Ск) к ао • • • ^n-i и вернуться к G2.0. G2.2. [Посетить.] Посетить перестановку а0 ... an-i- I На этапе G1 следует также установить к <— п — 1. Обратите внимание на то, что на новых этапах тщательно выполняется условие (17). Этот алгоритм усложнился, поскольку теперь нужно знать перестановки r(k,j) и а(к,к), помимо перестановок r(k,j)u(k — 1)~, которые появляются на этапе G4. Но дополнительные усложнения часто оправдываются, поскольку полученная в результате программа можеть выполняться быстрее. Рис. 20. Нежелательные ветви дерева с рис. 19 можно обрезать, если расширить алгоритм G Например, на рис. 20 показано, что произойдет с деревом, приведенным на рис. 19, если не учитывать суффиксы аоа^аз, которые соответствуют узлам 00, 11, 121 и 2, не представляющим для нас интереса. (Каждый суффикс а& ... an_i перестановки а0 ... an_i соответствует префиксу сп ... контрольной строки сп ... ci, поскольку перестановки <т(1, с\)... сг(к — 1,Ск-\) не влияют на а& ... ап-\.) На этапе G2.1 происходит умножение в обратном порядке на r(k,j) для перехода от узла cn_i... 1 j к его правому "собрату" cn_i... Ck+i (j+1) и умножение в обратном порядке на а (к, к)~ для перехода от узла cn_i... c^+i к к его родителю cn_i... c^+i. Таким образом, чтобы перейти от ненужного префикса 121 к его наследнику в прямом порядке обхода, алгоритм выполняет умножение в обратном порядке на сг(1,1)~, сг(2,2)~ и т(3,2), что приводит к переходу от узла 121 к узлу 12, к узлу 1 и 2. (Это, в некоторой степени, исключительный случай, поскольку префикс с к = 1 отвергается, только если не нужно посещать единственную перестановку aoai... an_i с суффиксом а\... an_i.) После исключения узла 2 т(3,3) переводит к узлу 3 и т.д. Обратите внимание на то, что пропуск суффикса а& ... an_i в этом расширении алгоритма G , по сути, то же самое, что и пропуск префикса а\.. .aj в исходном обозначении, если вернуться к идее о генерации перестановок а\... ап для {1,..., п} и выполнять большую часть работы с правого конца. Наше исходное обозначение соответствует сначала выбору ai, затем — а2, потом — ап. В обозначениях 00
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 67 алгоритма G сначала выбирается an_i, затем an_2, ..., потом ао- Система обозначений в алгоритме G имеет обратный порядок, но она значительно упрощает формулы для таблицы Симса. Опытный программист быстро и без особого труда научится переходить от одной точки зрения к другой. Эти идеи можно применить к буквометике, поскольку, например, ясно, что большая часть вариантов для букв D, Е и Y для сложения SEND и MORE не даст в сумме MONEY. Необходимо, чтобы в этой задаче (D + Е — Y) mod 10 = 0. Следовательно, многие перестановки можно сразу исключить из рассмотрения. Вообще, если rk является максимальной степенью 10, которая делит значение сигнатуры Sk, то можно отсортировать буквы и присвоить коды {0,1,...,9} так, что г0 > ri > ••• > г9. Например, для решения задачи "TRI0+S0NATA" в (7) можно было бы использовать (0,1,..., 9) для (X, S, V, A, R, I, L, Т, 0, N) соответственно, получая сигнатуры s0 = 0, sx = -100000, s2 = 210000, s3 = -100, s4 = -100, 55 = 21010, s6 = 210, s7 = -1010, 58 = -7901, s9 = -998. Следовательно, (ro,..., rg) = (oo, 5,4,2,2,1,1,1,0,0). Теперь, если обратиться к этапу G2.0 для значения к с т>_1 ф г&, то можно сказать, что суффикс а& ... ад не нужен в том смысле, что его можно пропустить, пока akSk + • • • 4- agSg не кратно 10rfc_1. Кроме того, из (10) следует, что суффикс а&... ag не нужен, если = 0 и к € F. Множество первых букв F теперь имеет вид {1,2,7}. Предыдущий подход для решения буквометик на этапах Al-АЗ использовал метод "грубой силы" для перебора 10! вариантов. В определенных условиях он может работать очень быстро, поскольку метод перестановок смежных элементов функционирует только с шестью ссылками на память для одной перестановки. Однако 10! равняется 3 628 800, так что для всего процесса потребуется почти 22 мегамемса независимо от типа буквометики. Наоборот, расширенный алгоритм G на основе метода Хипа с только что описанными пропусками найдет все четыре решения (7) меньше чем за 128 ?шломемса! Таким образом, метод пропуска суффикса работает в 170 раз быстрее, чем предыдущий метод, который слепо перебирает все варианты. Большая часть из 128 киломемсов в новом подходе тратятся на применение r(fc, Ck) на этапе G2.1. Другие обращения к памяти связаны с применением а(к, к)~ на этом этапе, но г требуется 7812 раз, тогда как а~ требуется только 2162 раза. Причину такого поведения легко понять из рис. 20, поскольку "ускоренное движение" r(k,Ck)uj(k — 1)~ на этапе G4 вряд ли когда возникает. В этом случае оно используется только четыре раза, т.е. по одному разу для каждого решения. Таким образом, обход дерева в прямом порядке выполняется практически полностью за т шагов вправо и о~~ шагов вверх, т шагов доминируют в данной задаче, где посещается очень мало перестановок, поскольку каждый этап а (к, к)~ предваряется к этапами г (к, 1), т(к, 2), ..., т(/с, к). Благодаря этому анализу стало ясно, что метод Хипа, который увеличивается при оптимизации перестановок r(k,j)oj(k — 1)~ так, что каждый переход на G4 является простой транспозицией, не очень хорош для расширенного алгоритма G, если на этапе G2.0 не пропускается сравнительно немного суффиксов. Более простой обратный колексикографический порядок, для которого r(k,j) всегда является простой транспозицией, теперь гораздо привлекательнее (см. (19)). Действительно,
68 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 алгоритм G с обратным колексикографическим порядком находит решение букво- метики (7) всего за 97 киломемса. Аналогичные результаты можно получить при решении других задач с букво- метиками. Например, если применить расширенный алгоритм G для буквометики в пунктах (a)-(h) упр. 24, то для вычислений потребуется (551, 110, 14, 8, 350, 84, 153, 1598) киломемс с методом Хипа; (429, 84, 10, 5, 256, 63, 117, 1189) киломемс с обратным (28) колексикографическим порядком. Коэффициент ускорения для обратного колексикографического порядка в этих примерах, по сравнению с методом "грубой силы" в алгоритме Т, находится в пределах от 18 в пункте (h) до 4200 в пункте (d) и в среднем равняется 80. А коэффициент ускорения для метода Хипа в среднем составляет около 60. Из алгоритма L известно, однако, что лексикографический порядок легко обрабатывается без усложнения контрольной таблицы сп ... с\, используемой в алгоритме G. Более внимательное изучение алгоритма L показывает, что его поведение можно улучшить, когда перестановки часто пропускаются, с помощью связанного списка вместо последовательного массива. Улучшенный алгоритм прекрасно подходит для широкого спектра алгоритмов генерации ограниченных классов перестановок. Алгоритм X (лексикографические перестановки с ограниченными префиксами). Этот алгоритм генерирует все перестановки а\а2 ...ап для {1,2,... ,п}, которые удовлетворяют заданной последовательности проверок *i(ai), ^2(^1, а2), tn(ai,a2,... ,ап), посещая их в лексикографическом порядке. В нем используется вспомогательная таблица связей lo, h, — - , 1п для поддержания циклического списка неиспользуемых элементов, так что для текущих доступных элементов {l,...,n} \ {ab...,afe} = {6i,...,6n_fc}, где 61 < ••• < bn_fc, (29) имеем: lo = h, hj=bj+i для 1 <j<n-k и kn_k = 0. (30) Здесь используется вспомогательная таблица щ ... ип для отмены операций, которые были выполнены для массива I. XI. [Инициализировать.] Установить <— к + 1 для 0<^<пи/п<-0. Затем установить к <— 1. Х2. [Перейти на уровень к.] Установить р <— 0, q <— /о- ХЗ. [Проверить а\.. .ak] Установить ak <— q. Если tk(a\,... ,а&) ложно, перейти к Х5. В противном случае, если к = п, посетить а\... ап и перейти к Х6. Х4. [Увеличить к.] Установить Uk <— р, lp <— lq, к <— к 4-1 и вернуться к Х2. Х5. [Увеличить ak-] Установить р <— 0, q <— lp. Если q ф 0, вернуться к ХЗ. Х6. [Уменьшить к.] Установить к <— к — 1 и завершить, если к = 0. В противном случае установить р <— Uk, q «— ak, lp *— q и перейти к X5. |
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 69 Основная идея этого элегантного алгоритма принадлежит М. Ч. Эру (М. С. Ег) [Сотр. J. 30 (1987), р.282]. Его можно применить к буквометике, слегка изменяя систему обозначений, получая перестановки ао ... ад of {0,..., 9} и допуская, что /ю играет прежнюю роль /о- Полученный алгоритм затратит только 49 киломемс для решения задачи "TRI0+SQNATA" в (7), а буквометики из пунктов (a)-(h) упр. 24 решаются соответственно за (248, 38, 4, 3, 122, 30, 55, 553) киломемс. (31) Таким образом, он работает почти в 165 раз быстрее, чем метод "грубой силы". Еще один способ применения алгоритма X для решения буквометик часто выполняется еще быстрее (см. упр. 49). Рис. 21. Дерево, которое неявно проходится в алгоритме X для п = 4, если посещаются все перестановки, за исключением тех, которые начинаются с 132, 14, 2, 314 или 4312 Дуальные методы. Если Si, Sn-i является таблицей Симса для группы перестановок G, то, как известно из леммы S, каждый элемент G можно выразить единственным образом в виде произведения о\.. . сгп-ъ где а к Е см. (13). В упр. 50 показано, что каждый элемент а можно выразить единственным образом в дуальной форме: а = а~_х ...a^Vi, гДе ак € Sk для 1 < к < п, (32) и этот факт приводит к другому большому семейству генераторов перестановок. В частности, когда G является группой всех п! перестановок, каждую перестановку можно записать в виде а(п - 1, cn_i)~ ... <т(2, с2)~сг(1, ci)~, (33) где 0 < Ск < к для 1 < к < п и перестановки cr(k,j) те же, что и в алгоритме G. Теперь, однако, желательно быстрее варьировать cn_i и быстрее варьировать ci, и поэтому получаем алгоритм другого типа. Алгоритм Н (дуальный генератор перестановок). Для заданной таблицы Симса, как и в алгоритме G, этот алгоритм генерирует все перестановки ао... an_i из {0,..., п — 1} с помощью вспомогательной таблицы со ... сп-\. HI. [Инициализировать.] Установить aj <— j и с3; <— 0 для 0 < j < п. Н2. [Посетить.] (В этом месте число со смешанным основанием [С2Ь с32' Сп~1] является количеством посещенных до сих пор перестановок.) Посетить перестановку aoai... an_i. НЗ. [Добавить 1 к coci.. .cn_i.] Установить к <— п — 1. Если Ск — к, установить Ск <— 0, к +— к — 1 и повторять, пока не выполняется условие к = 0 или условие
70 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Ck < к. Завершить алгоритм, если к = 0; в противном случае установить Ск <- ск + 1. Н4. [Переставить.] Применить перестановку т(к,Ск)ш(к + 1)" к ao^i.. . an_i, как описано ниже, и вернуться к Н2. | Хотя этот алгоритм кажется практически идентичным алгоритму G, перестановки г и о;, которые необходимы на этапе Н4, существенно отличаются от перестановок, которые необходимы на этапе G4. Новые правила, которые заменяют (15) и (16), имеют следующий вид: Количество вариантов так же велико, как и для алгоритма G, поэтому ограничимся здесь несколькими случаями, которые обладают особыми преимуществами. Один естественный случай, конечно, связан с таблицей Симса, которая в алгоритме G приводит к созданию обратного колексикографического порядка, а именно как в (18). Полученный генератор перестановок очень похож на метод простых изменений. Поэтому можно сказать, что алгоритмы L и Р по сути дуальны по отношению друг к другу (см. упр. 52). Другая естественная идея состоит в создании таблицы Симса, для которой этап Н4 всегда выполняет одну транспозицию двух элементов, по аналогии с конструкцией (27), которая достигает максимальной эффективности на этапе G4. Но такая миссия оказывется невозможной: ее нельзя выполнить даже для п = 4. Если начать с тождественной перестановки ао а^аз = 0123, то переходы от контрольной таблицы coCic2c3 = 0000 к 0001, и к 0002, и к 0003 должны переместить 3. Итак, если они являются транспозициями, то они должны быть (За), (аЪ) и (be) для некоторой перестановки аЬс множества {0,1,2}. Перестановка, соответствующая С0С1С2С3 = 0003, теперь имеет вид сг(3,3)~ = (Ъс)(аЪ)(За) = (За6с); а следующая перестановка, соответствующая cqc^cs = 0010, имеет вид а(2,1)~, что должно зафиксировать элемент 3. Единственная пригодная транспозиция имеет вид (Зс), следовательно, а(2,1)~ должна иметь вид (3с)(Заbe) — (abe). Аналогично находим, что сг(2,2)~ должна иметь вид (а с о), а перестановка, соответствующая coCic2c3 = 0023, будет иметь вид (3abс)(асЬ) = (Зс). На этапе Н4 она преобразуется в перестановку сг(1,1)~~, которая соответствует контрольной таблице 0100, которая следует за 0023. Но единственная транспозиция, преобразующая (Зс) в перестановку, которая фиксирует 2 и 3, имеет вид (Зс); а полученная в результате перестановка также фиксирует 1, поэтому ею не может быть <т(1,1)~. Из доказательства в предыдущем абзаце следует, что алгоритм Н нельзя использовать для генерации всех перестановок с минимальным числом транспозиций. Но из него также следует простая схема генерации, которая очень близка к этому минимуму, а полученный в результате алгоритм очень привлекателен, поскольку он выполняет дополнительную работу только один раз каждые п(п — 1) этапов (см. упр. 53). r(kj) = a(k,j) a(kj - 1) для 1 < j < к, uj(k) — о~(п — l,n — 1)~а(п — 2,n — 2)~ .. .а(к,к)~. (34) (35) a(k,j) = (k-j k-j+1 ... к), (36)
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 71 Наконец, рассмотрим дуальный вариант метода Орд-Смита, когда a(k,j) = (k ... 10У, (37) как в (23). Зачение r(k,j) снова не зависит от j: T(k,j) = (0 1 ... к), (38) и это вносит особые преимущества в алгоритме Н, поскольку он позволяет избавиться от контрольной таблицы coCi... cn_i. Дело в том, что сп-\ = 0 на этапе НЗ тогда и только тогда, когда an_i = п — 1 вследствие (32). Действительно, когда Cj = 0 для к < j < п на этапе НЗ, имеем о- = 0 тогда и только тогда, когда ak = к. Следовательно, этот вариант алгоритма Н можно переформулировать описанным ниже способом. Алгоритм С (генерация перестановок с помощью циклических сдвигов). Этот алгоритм посещает все перестановки а\... ап различных элементов {#1,..., хп}. С1. [Инициализировать.] Установить aj <— Xj для 1 < j < п. С2. [Посетить.] Посетить перестановку а\... ап и установить к <— п. СЗ. [Сдвиг.] Заменить а\а2 .. .ak за счет циклического сдвига на а2 ...а^а\ и вернуться к С2, если ak ф Xk- С4. [Уменьшить к.] Установить к <— к — 1 и вернуться к СЗ, если к > 1. | Например, последовательные перестановки {1,2,3,4}, сгенерированные для п = 4, имеют вид 1234, 2341, 3412, 4123, (1234), 2314, 3142, 1423, 4231, (2314), 3124, 1243, 2431, 4312, (3124), (1234), 2134, 1342, 3421, 4213, (2134), 1324, 3241, 2413, 4132, (1324), 3214, 2143, 1432, 4321, (3214), (2134), (1234), где непосещенные промежуточные перестановки показаны в скобках. Этот алгоритм может быть простейшим генератором перестановок, с точки зрения минимальности размера кода программы. Его предложил Дж. Дж. Лангдон-мл. (G. G. Jr. Langdon) [см. С ACM 10 (1967), р.298-299; 11 (1968), р.392]. Аналогичные методы были опубликованы ранее Ч. Томпкинсом (С. Tompkins) [см. Proc. Symp. Applied Math. 6 (1956), р.202-205] и более явно Р. Зайтцем (R. Seitz) [см. Unternehmensforschung 6 (1962), р.2-15]. Эта процедура особенно хороша для приложений, в которых эффективна операция циклического сдвига, например, когда последовательные перестановки хранятся в регистре компьютера, а не в массиве. Основной недостаток дуальных методов заключается в том, что они обычно плохо адаптируются к ситуациям, когда нужно пропустить большие блоки перестановок, поскольку множество всех перестановок с заданным значением первых контрольных элементов соС\... Ck-i обычно не имеет большого значения. Однако особый случай (36) иногда является исключением, поскольку п\/к\ перестановок с элементами coC\...Ck-\ = 00...0 в таком случае являются точно такими аоа\... an_i, в которых 0 предшествует 1, 1 — 2, ..., a fc — 2 — А; — 1.
72 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 * Метод обмена Эр лиха. Эрлих открыл совершенно иной подход для генерации перестановок на основе еще одного способа использования контрольной таблицы с\.. .cn_i. В его методе каждая перестановка получается из предыдущей за счет обмена самого левого элемента с другим элементом. Алгоритм Е (обмены Эрлиха). Этот алгоритм генерирует все перестановки различных элементов ао .. .ап-\ с помощью вспомогательной таблицы bo ...Ьп-\ и с\...сп. Е1. [Инициализировать.] Установить bj <— j и cJ+i <— 0 для 0 < j < п. Е2. [Посетить.] Посетить перестановку ао ... ап-\. ЕЗ. [Найти к] Установить к <— 1. Затем, если с& = к, установить с* <— 0, к <— к + 1 и повторять, пока не выполняется условие Ck < к. Завершить, если А: = п, в противном случае установить Ck <— Cfc + 1. Е4. [Обменять.] Заменить ао <-* abfc. Е5. [Перевернуть.] Установить j <— 1, А: <— fe — 1. Если j < к, поменять bj <-* bfc, установить j <— j + l,k<— к — 1и повторять, пока не выполняется условие j > к. Вернуться к Е2. | Обратите внимание на то, что этапы Е2 и ЕЗ идентичны этапам G2 и G3 алгоритма G. Наиболее изумительный момент в этом алгоритме, о котором Эрлих сообщил Мартину Гарднеру (Martin Gardner) в 1987 году, заключается в том, что он работает (доказательство см. в упр. 55). Аналогичный метод, который упрощает операции на этапе Е5, можно обосновать таким же образом (см. упр. 56). Среднее число замен на этапе Е5 меньше 0,18 (см. упр. 57). Алгоритм Е не быстрее, чем другие упомянутые выше методы. Но он обладает тем прекрасным свойством, что изменяет каждую перестановку минимальным образом, т.е. с использованием только п — 1 разных видов транспозиций. Тогда как в алгоритме Р используются смежные замены, at-i а*, в алгоритме Е используются обмены первых элементов, ао <-» а*, которые также называются звездными транспозициями, для некоторой отобранной последовательности индексов £[1], t[2], ..., t[n\ — 1]. И если нужно повторно генерировать перестановки для такого же очень небольшого значения п, то можно предварительно вычислить эту последовательность, как это делалось в алгоритме Т для последовательности индексов алгоритма Р. Звездные транспозиции обладают преимуществом по сравнению со смежными заменами, поскольку нам всегда известно значение ао из предыдущего обмена, т.е. его не нужно считывать из памяти. Пусть Еп является последовательностью n! —1 таких индексов t, что алгоритм Е обменивает ао на at на этапе Е4. Поскольку Еп+\ начинается с Еп, то можно рассматривать Еп как первые п! — 1 элементов бесконечной последовательности: Еоо = 121213212123121213212124313132131312.... (39) Например, если п = 4 и ао 010203 = 1234, то перестановки, посещенные алгоритмом Е, имеют вид 1234, 2134, 3124, 1324, 2314, 3214, 4213, 1243, 2143, 4123, 1423, 2413, 3412, 4312, 1342, 3142, 4132, 1432, ( ' 2431, 3421, 4321, 2341, 3241, 4231.
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 73 *Малые генераторы перестановок. После знакомства с алгоритмами Р и Е вполне естественно было бы спросить: а нельзя ли все перестановки получить за счет только двух основных операций вместо п—1? Например, А. Нийенхуйс (A. Nijenhuis) и Г. С. Вильф (Н. S. Wilf) [см. Combinatorial Алгоритмы (1975), exercise 6] заметили, что все перестановки можно генерировать для п = 4, если заменять а\а2а$ ... ап на каждом этапе либо на а2а^...апа\ либо на а2а\а$.. .ап. Они заинтересовались вопросом: есть ли такой же метод для всех п? Вообще, если G является произвольной группой перестановок и если а\, ..., а& являются элементами G, то граф Кэли для G с генераторами (ai,... ,a^) является ориентированным графом, вершины которого являются 7г-перестановками группы G и ребра которого идут от 7г к а\тс, ..., а&7г. [Arthur Cayley, American J. Math. 1 (1878), p.174-176.] Вопрос Нийенхуйса и Вильфа эквивалентен вопросу: имеется ли гамильтонов путь для графа Кэли для всех перестановок {1,2,..., п} с генераторами а и т, где а является циклической перестановкой (12 ... п) и г является транспозицией (12). Согласно основной теореме Р. А. Ранкина (R. A. Rankin) [см. Proc. Cambridge Philos. Soc. 44 (1948), p. 17-25], можно сделать вывод, что во многих случаях графы Кэли с двумя генераторами не имеют гамильтонова цикла. Теорема R. Пусть G является группой из д перестановок. Если граф Кэли для G с генераторами (а, /3) имеет гамильтонов цикл и если перестановки (с*, /3, а/3~) имеют соответственно порядок (а, Ь, с), то либо с четно, либо д/а и д/Ь нечетны. (Порядком перестановки а называется такое наименьшее положительное целое число а, что аа является тождественной перестановкой.) Доказательство. См. упр. 73. | В частности, когда а = а и /3 = г, как указано выше, то имеем д — п!, а = п, Ь — 2 и с = п — 1, поскольку ат~ = (2 ... п). Следовательно, можно заключить, что гамильтонов цикл невозможен для четных п > 4. Однако гамильтонов путь можно легко создать для п = 4, так как можно объединить 12-этапные циклы: начиная с 2341, переходя от 1234 к 2134 и заканчивая 4213. Ф. Раски (F. Ruskey), М. Джиянг (М. Jiang) и А. Вестон (A. Weston) [см. Discrete Applied Math. 57 (1995), p.75-83] досконально исследовали граф а-т для п = 5 и обнаружили, что он имеет пять существенно различных гамильтоновых циклов, один из которых ("наиболее прекрасный") показан на рис. 22,а. Они также обнаружили гамильтонов путь для п = 6, что потребовало неимоверных усилий, поскольку для поиска необходима была бинарная древовидная схема принятия решений с 720 этапами. К сожалению, найденное решение не имеет очевидной логической структуры. Чуть менее сложный путь описывается в упр. 70, но даже этот путь нельзя назвать простым. Следовательно, подход на основе графа а-т, вероятно, не будет иметь практического интереса для более крупных значений п, если не будет открыта новая конструкция. Р. К. Комптон (R. С. Compton) и С. Дж. Вильямсон (S. G. Williamson) 1234 -> 2341 -> 3412 4312 -> 3124 -+ 1243 2431 -> 4231 -> 2314 -> 3142 -> 1423 — 4123 -> 1234, 2134 -> 1342 — 3421 — 4321 — 3214 — 2143 1432 — 4132 -> 1324 -> 3241 -> 2413 -+ 4213 -> 2134, (41)
74 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 [см. Linear and Multilinear Algebra 35 (1993), p.237-293] доказали, что гамильтонов цикл существует для всех п, если допустить три генератора сг, о~ и г вместо двух генераторов а и т. Их циклы обладают интересным свойством, что каждая п-я трансформация является т-генератором, а все промежуточные п — 1 трансформации являются либо только сг-генераторами, либо только а "-генераторами. Но их метод очень сложен, чтобы для него можно было дать достаточно краткое объяснение. В упр. 69 описывается общий алгоритм перестановок, который достаточно прост и требует только трех генераторов порядка 2. На рис. 22,6 этот метод иллюстрируется для п = 5, мотивом для которого были упоминавшиеся ранее примеры алгоритмов перезвона колоколов. Только на основе переходов (1234 5) и (12) а) Только на основе переходов (1 2) (3 4), (2 3) (4 5) и (3 4) ШШШШШ)0«Ш^ Ь) Рис. 22. Гамильтоновы циклы для 5! перестановок Быстрее, еще быстрее. Каков самый быстрый способ генерации перестановок? Этот вопрос часто возникает в публикациях, посвященных информатике, поскольку для перебора всех п\ вариантов желательно максимально сократить время перебора. Ответы всегда давались крайне противоречивые; поскольку существует множество разных формулировок этого вопроса, попробуем разобраться с ними, изучая механизм скорейшей генерации перестановок на компьютере MMIX. Сначала допустим, что наша цель заключается в создании перестановок в массиве п последовательно расположенных слов памяти (октабайт). Самым быстрым способом достижения этой цели среди всех рассмотренных в данном разделе является оптимизированный метод Хипа в (27), предложенный Р. Седжвиком (R. Sedgewick) [cM.Computing Surveys 9 (1977), р.157-160]. Ключевая идея заключается в оптимизации кода для наиболее распространенных случаев на этапах G2 и G3, а именно случаев, в которых вся деятельность происходит в начале массива. Если регистры u, v и w содержат первые три слова и если следующие генерируемые шесть перестановок включают перестановку этих слов всеми шестью возможными способами, то можно выполнить эту работу следующим образом: PUSHJ 0,Visit STO v,A0 STO w,A0 STO u,A0 STO v,A0 STO w,AO STO u,Al; PUSHJ 0,Visit STO v,A2; PUSHJ 0,Visit ( . STO w,Al; PUSHJ 0,Visit ^ ' STO u,A2; PUSHJ 0,Visit STO v,Al; PUSHJ 0,Visit (где AO —это адрес октабайта ao и т.д.). Полная программа перестановки, которая следит за правильным размещением в регистрах u, v и w, приводится в упр. 77.
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 75 Другие инструкции менее важны, поскольку они выполняются только ^ часть всего времени. Общие затраты на перестановку, не считая 4г>, необходимые для выполнения операций PUSHJ и POP для каждого вызова-посещения Visit, равны приблизительно 2,77/х + 5,69г> в этом подходе. Если использовать четыре регистра, и, v, W, х и расширить (42) до 24 вызовов-посещений Visit, то время выполнения на одну перестановку уменьшается до 2,19/i + 3,07*;. А с регистром гиг! вызовами- посещениями Visit, как показано в упр. 78, затраты равняются (2 + 0(l/r\))(/j, + v), что очень близко к затратам на две инструкции ST0. Последнее значение, конечно, является минимальным возможным временем для любого метода, который генерирует все перестановки в последовательном массиве. ... Не так ли? Ранее предполагалось, что в процедуре посещения необходимо просматривать все перестановки в последовательных положениях, но, возможно, эта процедура способна считывать перестановки из разных начальных положений. Тогда можно организовать работу так, чтобы зафиксировать an_i и хранить поблизости две копии других элементов: aodi... an_2an_iaoai...an_2- (43) Если теперь рассмотреть (п — 1)! перестановок а^а\...an-2, то, всегда изменяя одновременно обе копии с помощью двух команд ST0 вместо одной, можно допустить, что каждый вызов Visit связан с п перестановками a0ai...an_i, ai...an_ia0, ..., an_ia0... an-2> (44) которые появляются последовательно. Затраты на одну перестановку сокращаются до затрат на три простые инструкции ADD, CMP, PBNZ плюс 0(1/п). [См. работу Я. Л. Вароля (Y. L. Varol) и Д. Ротема (Rotem, D.) Сотр. J. 24 (1981), р.173-176.] Более того, можно вовсе не тратить время на сохранение перестановок в памяти. Допустим, например, что наша цель заключается в генерации всех перестановок {0,1,...,п — 1}. Значение п, вероятно, будет не более 16, поскольку 16! = 20 922 789 888000 и 17! = 355 687 428 096000. Следовательно, вся перестановка поместится в 16 ниблах октабайта и ее можно сохранить в одном регистре. Это будет полезно, только если процедуре посещения не потребуется распаковывать отдельные ниблы. Предположим, что это не потребуется. Как можно быстро генерировать перестановки в ниблах 64-разрядного регистра? Одна идея, предложенная А. Дж. Голдстейном (A. J. Goldstein) [см. U. S. Patent 3383661 (14 May 1968)], заключается в предварительном вычислении таблицы (£[1], • •., £[5039]) переходов типа "простые изменения" для семи элементов с помощью алгоритма Т. Эти числа t[k] лежат между 1 и 6, так что можно упаковать 20 из них в 64-разрядное слово. Число Xjfc=i 23fe-1£[20j + к] было бы удобно поместить в j-e слово вспомогательной таблицы для 0 < j < 252, где £[5040] = 1. Например, таблица начинается с кодового слова 00001010011100101110100 ПО 101100011010001110001010011100101110Ю0.
76 КОМБИНАТОРНЫЙ поиск 7.2.1.2 Следующая программа способна эффективно считывать такие коды: Perm (Установить регистр а в первую перестановку.) ОН LDA р, Т р <— адрес первого кодового слова. JMP 3F 1Н (Посетить перестановку в регистре а.) (Обменять ниблы а, которые лежат в t битах справа.) SRU с,с,3 с<-с>3. /4-ч 2Н И t,c,#lc t <- с&(11100)2. ^ ' PBNZ t, 1В Условный переход, если t ф 0. ADD р,р,8 ЗН LD0 с, р, 0 с «— следующее кодовое слово. PBNZ с,2В (За последним кодовым словом идет 0.) (Если не выполнено, то продвинуть ведущие п — 7 ниблов и вернуться к 0В.) В упр. 79 показано, как выполняется операция (Обменять ниблы ... ) за счет семи инструкций с помощью манипуляций с битами, которые предусмотрены на большинстве компьютеров. Следовательно, затраты на одну перестановку будут чуть больше 10v. (Затраты на выполнение инструкций, которые извлекают новые кодовые слова, равны всего (а + 5г;)/20, а на выполнение инструкций, которые продвигают ведущие п — 7 ниблов, еще более пренебрежимо малы, поскольку меньше в 5040 раз.) Обратите внимание на то, что теперь нет необходимости в использовании операций PUSHJ и POP, которые применялись в (42) с затратами 4v. Однако можно повысить эффективность еще больше, адаптируя метод Ланг- дона с циклическим сдвигом, т.е. алгоритм С. Допустим, что в начале имеется лексикографически самая крупная перестановка и тогда нужно сделать следующее: GREG @ ОН ОСТА #fedcba9876543210&(l«(4*N)-l) Perm LDOU а,OB Установить а <- # ... 3210. JMP 2F 1Н SRU a,a,4*(16-N) а <- [а/1616_п]. OR a,a,t a<r-a\t. (46) 2Н (Посетить перестановку в регистре а.) SRU t,a,4*(N-l) t<- [a/16n-l\. SLU a,a,4*(17-N) a <- 1617-nomod 1616. PBNZ t, IB To IB, если t ф 0. (Продолжить работу методом Лангдона.) Время выполнения на одну перестановку теперь равно всего bv + 0(1/п), опять- таки без необходимости использования инструкций PUSHJ и POP. (См. упр. 81 с описанием интересного способа расширения (46) до полной программы с получением очень короткой и быстрой процедуры.) Быстрые генераторы перестановок занимательны, но на практике можно сэкономить больше времени, оптимизируя процедуру посещений, а не ускоряя генератор. Топологическая сортировка. Вместо обработки всех п! перестановок of {1,..., п} часто требуется обратить внимание только на перестановки, которые удовлетворяют определенным ограничениям. Например, нас могут интересовать только те перестановки, в которых 1 предшествует 3,2 — 3 и 2 — 4. Для множества {1,2,3,4}
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 77 существует пять таких перестановок, а именно: 1234, 1243, 2134, 2143, 2413. (47) Задача топологической сортировки, которая рассматривается в разделе 2.2.3 как первый пример нетривиальных структур данных, является общей задачей поиска перестановок, которые удовлетворяют га условиям х\ -< у\, ..., хш -< уш, где х -< у означает, что х предшествует у в перестановке. Эта задача часто возникала на практике, а поэтому успела получить несколько разных названий. Например, она часто называется задачей линейного вложения, поскольку объекты нужно упорядочить на одной линии с сохранением определенного порядка связей. Ее также называют задачей расширения частичного упорядочения до полного упорядочения (см. упр. Целью раздела 2.2.3 был поиск одной перестановки, которая удовлетворяла бы заданным связям. А теперь нужно найти все такие перестановки, т.е. все топологические сортировки. Действительно, в данном разделе предполагается, что элементы х и у, для которых определены связи, являются целыми числами между 1 и п, причем х < у всякий раз, когда х -< у. Следовательно, перестановка 12... п всегда топологически корректна. (Если это упрощенное предположение не удовлетворяется, то можно предварительно обработать данные с помощью алгоритма 2.2.3Т, чтобы переименовать объекты соответствующим образом.) Многие важные классы перестановок являются особыми случаями этой задачи топологического упорядочения. Например, перестановки множества {1,...,8} со связями эквивалентны перестановкам мультимножества {1,1,1,1,2,3,3,3}, поскольку можно использовать отображения {1,2,3,4} »-> 1, 5 2 и {6,7,8} ь-> 3. Нам уже известно, как генерировать перестановки мультимножества с помощью алгоритма L, но сейчас мы рассмотрим другой способ. Обратите внимание на то, что х предшествует у в перестановке аг.. .ап тогда и только тогда, когда а'х < а'у в обратной перестановке а[ ...а'п. Следовательно, рассматриваемый нами алгоритм также найдет все такие перестановки а[.. .а'п, что a'j < a!k всякий раз, когда j -< к. Например, из раздела 5.1.4 нам известно, что таблица Юнга является таким упорядочением {1,..., п} по строкам и столбцам, что каждая строка возрастает слева направо и каждый столбец возрастает сверху вниз. Следовательно, задача генерации всех таблиц Юнга 3x3 эквивалентна генерации всех таких а[.. .а'9, что и представляет собой особый случай топологической сортировки. Можно было также найти все сочетания 2п элементов, а именно все варианты разбиения {1,..., 2п} на п пар. Существует (2п - 1)(2п - 3)... (1) = (2n)!/(2nn!) способов сделать это, и они соответствуют перестановкам, которые удовлетворяют условиям 2.2.3-14). 1^2, 2^:3, 3^4, б-<7, 7^8 а[ < а2 < а'3, а'4 < а'ъ < а'6, а'7 < а'8 < а'9, а[ < а'А < а'7, а'2 < а'ъ < а'8, а'3 < а'6 < а'9, (48) а1 ^ а2 а2п-1 < а2п а1 < а3 < < а2п-1- (49)
78 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 Элегантный алгоритм для исчерпывающей топологической сортировки был предложен Варолем и Ротемом [см. Сотр. J. 24 (1981), р.83-84], которые сообразили, что можно использовать метод, аналогичный методу простых изменений (алгоритм Р). Предположим, что найден способ такого топологического упорядочения {1,...,п — 1}, что а\...ап-\ удовлетворяет всем условиям, которые не включают п. Тогда легко можно записать все допустимые способы вставки последнего элемента п без изменения относительного порядка а\... ап-\. Нужно просто начать с а\... an-i п, затем сдвигать п влево на один шаг за один раз до тех пор, пока нельзя будет сдвигать дальше. Применяя эту идею рекурсивно, получим следующую прямую процедуру. Алгоритм V (все топологические сортировки). Для заданного отношения -< на множестве {1,..., п}, которое обладает следующим свойством, что х -< у обозначает х < этот алгоритм генерирует все перестановки ах.. .ап и обратные им перестановки а'г.. .а'п, где a'j < a!k всякий раз, когда j -< к. Предположим для удобства, что ао = 0 и 0 -< к для 1 < к < п. VI. [Инициализировать.] Установить *— j и <— j для 0 < j < п. V2. [Посетить.] Посетить перестановку а1...ап и обратную ей а^.-.а^. Затем установить к <— п. V3. [Можно ли к переместить влево?] Установить j <— а'к и I <— а3_г. Если I -< к, перейти к V5. V4. [Если да, переместить.] Установить а •_]_ <— к, aj <— /, а'к *— j — 1 и а\ <— j. Перейти к V2. V5. [Если нет, вернуть к назад.] Пока j < к, установить / <— а +1, а <— /, а\ <— j, и j *~~ j + 1- Затем установить ак к V3, если к > 0. | к. Уменьшить А; на 1 и вернуться Например, согласно теореме 5.1.4Н, существует точно 42 таблицы Юнга с размерами 3x3. Если применить алгоритм V для связей (48) и записать обратную перестановку в виде массива а'2 а'ъ < «в а'7 а'8 «9 (50) то получим следующие 42 результата: 123 456 789 123 457 689 123 458 679 123 467 589 123 468 579 124 356 789 124 357 689 124 358 679 124 367 589 124 368 579 125 367 489 125 368 479 125 346 789 125 347 689 125 348 679 126 347 589 126 348 579 127 348 569 126 357 489 126 358 479 127 358 469 134 256 789 134 257 689 134 258 679 134 267 589 134 268 579 135 267 489 135 268 479 145 267 389 145 268 379 135 246 789 135 247 689 135 248 679 136 247 589 136 248 579 137 248 569 136 257 489 136 258 479 137 258 469 146 257 389 146 258 379 147 258 369
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 79 Пусть tr является количеством топологических сортировок, для которых последние и — г элементы находятся в их исходном положении aj — j для г < j < п. Эквивалентно, tr является количеством топологических сортировок а\... ат для {1,...,г}, если игнорировать связи, включающие элементы больше г. Тогда рекурсивный механизм алгоритма V показывает, что этап V2 выполняется N раз, а этап V3 выполняется М раз, где М = tn+ ••• + *! и N = tn. (51) Кроме того, этап V4 и операции организации цикла V5 выполняются N — 1 раз, а остальные операции этапа V5 выполняются М — N + 1 раз. Следовательно, общее время выполнения алгоритма является линейной комбинацией М, N и п. Если индексы элементов выбраны плохо, то М может оказаться больше N. Например, если для алгоритма V используются ограничения 2 ^ 3, 3 -< 4, ..., п - 1 -< п, (52) то tj = j для 1 < j < п и имеем М = |(n2 +п), N = п. Но эти ограничения также эквивалентны 1-<2, 2^3, п-2чп-1, (53) после переименования элементов, и тогда М сводится к случаю 2п — 1 = 27V — 1. В упр. 89 показано, что на простом этапе предварительной обработки можно найти такие метки элементов, что небольшая модификация алгоритма V способна генерировать все топологические сортировки за 0(N + п) этапов. Таким образом, топологическую сортировку всегда можно выполнить достаточно эффективно. Семь раз отмерь, потом переставляй. В этом разделе мы ознакомились с несколькими привлекательными алгоритмами для генерации перестановок. Однако известно множество алгоритмов, которые способны генерировать оптимальные перестановки для отдельных задач без перебора всех вариантов. Например, в теореме 6.1S показано, что можно найти самый лучший способ упорядочения записей в последовательном хранилище, сортируя их в соответствии с определенными критериями затрат, и для этого требуется всего 0(п log п) этапов. В разделе 7.5.2 будет рассматриваться задача о назначениях, или задача о присваиваниях, в которой нужно найти такой способ перестановки столбцов квадратной матрицы, чтобы сумма диагональных элементов была максимальна. Эту задачу можно решить не более чем за 0(п3) операций, поэтому было бы глупо использовать метод порядка п\, если п не является очень малым. Даже в таких случаях, как в задаче коммивояжера, когда неизвестен эффективный алгоритм, обычно можно найти более эффективный подход, чем простой перебор всех возможных решений. Генерацию перестановок лучше всего использовать в тех случаях, когда есть основательная причина взглянуть на каждую перестановку отдельно. УПРАЖНЕНИЯ 1. [20] Объясните, как ускорить алгоритм L, оптимизируя операции, когда значение j близко к п? 2. [20] Перепишите алгоритм L так, чтобы он генерировал все перестановки а\... ап в обратном колексикографическом порядке. (Иначе говоря, значения отражений ап ... а\
80 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 должны лексикографически уменьшаться, как в (11). Эта форма алгоритма часто проще и быстрее, чем исходная, поскольку меньшее количество вычислений зависит от значения п.) 3. [М21 ] Рангом комбинаторного упорядочения X по отношению к алгоритму генерации называется количество других упорядочений, которые алгоритм посещает до X. Как вычислить ранг заданной перестановки а\... ап по отношению к алгоритму L, если {ai,..., ап} = {1,..., п}? Чему равен ранг 314592687? 4. [М#3] Обобщая упр. 3, объясните, как вычислить ранг а\... ап по отношению к алгоритму L, когда {ai,...,an} является мультимножеством {п\ • Ж1,...,п* • я*}? Здесь щ + • • • + n* = п и х\ < •-• < xt. (Общее количество перестановок равно, конечно, полиномиальному коэффициенту (п \ _ п\ п\,... ,nt / ni!...nt!' см. уравнение 5.1.2-(3).) Чему равен ранг 314159265? 5. [НМ25] Вычислите среднее и дисперсию количества сравнений, выполняемых алгоритмом L на (а) этапе L2 и (Ь) этапе L3, когда элементы {ai,...,ап} различны. 6. [НМ34] Выведите производящую функцию для среднего числа сравнений, выполняемых алгоритмом L на (а) этапе L2 и (Ь) этапе L3, когда {ai,...,an} является общим мультимножеством, как в упр. 4. Также представьте результаты в замкнутой форме, когда {ai,..., ап} является двоичным мультимножеством {s • 0, (n — s) • 1}. 7. [НМ35] При t —У со чему равно предельное среднее число сравнений на одну перестановку на этапе L2, если алгоритм L применяется к мультимножеству (а) {2 • 1, 2 • 2, ..., 2 • *}? (Ъ) {1 • 1, 2 • 2, ..., t • t}? (с) {2 • 1, 4 • 2, ..., 2* • t}? 8. [21] Вариациями мультимножества называют перестановки всех его подчиненных мультимножеств. Например, вариациями {1,2,2,3} являются б, 1, 12, 122, 1223, 123, 1232, 13, 132, 1322, 2, 21, 212, 2123, 213, 2132, 22, 221, 2213, 223, 2231, 23, 231, 2312, 232, 2321, 3, 31, 312, 3122, 32, 321, 3212, 322, 3221. Покажите, что простые изменения алгоритма L позволяют генерировать все вариации заданного мультимножества {ai, аг,..., an}. 9. [22] В продолжение предыдущего упражнения создайте алгоритм генерации всех r-вариаций заданного мультимножества {ai,a2,... ,an}, которые также называются его r-перестановками, а именно все перестановки его r-элементных подчиненных мультимножеств. (Например, решение буквометики с г различными буквами является г-вариацией {0,1,..., 9}.) 10. [20] Чему будут равны а\а,2 ... an, С1С2 ... сп, и o\Oi... оп в конце алгоритма Р, если в начале а\а,2 ... ап = 12 ... п? 11. [М22] Сколько раз выполняется каждый этап алгоритма Р? (Допустим, что п > 2.) 12. [М23] Какой будет 1000000-я перестановка, посещенная (а) алгоритмом L, (Ь) алгоритмом Р, (с) алгоритмом С, если {ai,...,an} = {0, ...,9}? Подсказка, в системе обозначений со смешанным основанием имеем: 1000000 : 2, 6, 6, 2, 5, 1, 2, 2, 0, 0 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1 0, 0, 1, 2, 3, 0, 2, 7, 1, 0 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 81 13. [М21] (Мартин Гарднер (Martin Gardner), 1974.) Истинно или ложно: если а\а2 ... ап в исходном состоянии имеет вид 12... п, то алгоритм Р начинается с посещения всех п!/2 перестановок, в которых 1 предшествует 2; тогда следующей перестановкой является п...21? 14. [М22] Истинно или ложно: если a\a<i... ап в исходном состоянии имеет вид Х1Х2 ... хп в алгоритме Р, то всегда aj-Cj+s = Xj в начале этапа Р5? 15. [М23] (Селмер Джонсон (Selmer Johnson), 1963.) Покажите, что переменная отступа s никогда не превышает 2 в алгоритме Р. 16. [21] Как ускорить алгоритм Р, оптимизируя его операции, когда значение j близко к п? (Эта задача аналогична упр. 1.) 17. [20] Расширьте алгоритм Р так, чтобы обратная перестановка а[...а'п была доступна для обработки, когда а\... ап посещается на этапе Р2. (Обратная перестановка удовлетворяет условию a'k — j тогда и только тогда, когда aj = к.) 18. [21] (Четочные перестановки.) Найдите эффективный способ генерации перестановок (п — 1)!/2, которые представляют все возможные неориентированные циклы на вершинах {1,..., п}; т.е. циклический сдвиг а\... ап или ап.. .а\ не генерируется, если генерируется а\ ...ап. Перестановки (1234, 1324, 3124) могут, например, использоваться, когда п = 4. 19. [25] Создайте алгоритм, который генерирует все перестановки п различных элементов без циклов в духе алгоритма 7.2.1.1L. 20. [20] п-куб имеет 2птг! симметрии, по одной для каждого способа перестановки и/или дополнения координат. Такую симметрию удобно представить в виде перестановки со знаком, а именно перестановки со вспомогательными знаками, связанными с элементами. Например, 231 является перестановкой со знаком, которая преобразует вершины 3-куба с помощью замены х\Х2Хг на х^х^хх так, что ООО н-> 001, 001 011, ..., 111 »-» 110. Предложите простой алгоритм, который генерирует все перестановки со знаками для {1,2,..., тг}, где на каждом этапе происходит либо замена двух смежных элементов, либо отрицание первого элемента. 21. [М21] (Э. П. Мак-Крэйви (Е. P. McCravy), 1971.) Сколько решений имеет буквометика (6) с основанием 6? 22. [Mi 5] Истинно или ложно: если буквометика имеет решение для основания 6, то она имеет решение для основания Ь + 1? 23. [М20] Истинно или ложно: чистая буквометика не может иметь две идентичные сигнатуры Sj = Sk ф 0 для j ф к? 24. [25] Решите следующие буквометики вручную или с помощью компьютера: a) SEND + А + TAD + MORE = MONEY. b) ZEROES + ONES = BINARY. (Питер Мак-Дональд (Peter MacDonald), 1977) c) DCLIX + DLXVI = MCCXXV. (Вилли Энгрен (Willy Enggren), 1972) d) COUPLE + COUPLE = QUARTET. (Майкл Бакли (Michael Buckley), 1977) e) FISH 4- N + CHIPS = SUPPER. (Роберт Винникомб (Robert Vinnicombe), 1978) f) SATURN + URANUS + NEPTUNE + PLUTO = PLANETS. (Вилли Энгрен, 1968) g) EARTH + AIR + FIRE + WATER = NATURE. (Герман Нийон (Herman Nijon), 1977) h) AN-hACCELERATING-hINFERENTIAL+ENGINEERING4-TALE+ELITE-|-GRANT+FEE-hET+CETERA = ARTIFICIAL + INTELLIGENCE. i) HARDY + NESTS = NASTY + HERDS. 25. [M21 ] Предложите быстрый способ вычисления min(a • s) и max(a • s) для всех допустимых перестановок а\.. .аю для {0,...,9}, если для буквометики задан вектор сигнатуры
82 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 s = (si,..., sio) и множество F первых букв. (Такая процедура делает возможным быстрое исключение многих случаев при решении большого количества буквометик, как в нескольких следующих упражнениях, поскольку решение может существовать только тогда, когда min(a • s) < 0 < max(a • s).) 26. [25] Найдите единственное решение буквометики NIIHAU ± KAUAI ± OAHU ± M0L0KAI ± LANAI ± MAUI ± HAWAII = О? 27. [30] Создайте чистую буквометику сложения, в которой все слова имеют пять букв. 28. [М25] Разбиением целого числа п называется выражение п = п\ + • • • + nt, где т > - — > nt > 0. Разбиение называется дважды истинным, если а(п) = a(ni)-| Ьа(п*) также является чистой буквометикой, где a(n) является "именем" п на некотором языке. Дважды истинные буквометики были введены Аланом Уэйном (Alan Wayne) в работе [АММ 54 (1947), 38, р.412-414], в которой он предложил решение для TWENTY = SEVEN + SEVEN 4- SIX и нескольких других буквометик. a) Найдите все разбиения, которые являются дважды истинными на английском языке для 1 < п < 20. b) Уэйн также предложил пример EIGHTY = FIFTY + TWENTY + NINE + ONE. С помощью имен ONE, TWO, ..., NINETYNINE, ONEHUNDRED найдите все дважды истинные разбиения для 1 < п < 100 с различными слагаемыми. 29. [М£5] В продолжение предыдущего упражнения найдите все уравнения вида щ Н h nt = n'i -\ h n't,, которые истинны математически и буквометически на английском языке, если {щ,..., nt, n'i,..., nft,} являются различными положительными целыми числами меньше 20. Например: TWELVE + NINE + TWO = ELEVEN + SEVEN + FIVE. Все буквометики должны быть чистыми. 30. [25] Решите эти буквометики на умножение вручную или с помощью компьютера: a) TWO х TWO = SQUARE. (Генри Дьюдени (Henry Dudeney), 1929) b) HIP x HIP = HURRAY. (Вилли Энгрен, 1970) c) PI x R x R = AREA. (Брайан Барвелл (Brian Barwell), 1981) d) NORTH/SOUTH = EAST/WEST. (Ноб Йошигахара (Nob Yoshigahara), 1995) e) NAUGHT x NAUGHT = ZERO x ZERO x ZERO. (Алан Уэйн (Alan Wayne), 2003) 31. [M22] (Ноб Йошигахара.) Найдите единственное решение для А/ВС + D/EF + G/HI = 1, если {А,...,1} = {1,...,9}? 32. [М25] (Генри Дьюдени, 1901.) Найдите все способы представления числа 100 с использованием плюса и дроби в перестановках цифр {1,..., 9}. Например, 100 = 91 -1- 5742/638. Учтите, что плюс всегда должен предшествовать дроби. 33. [25] В продолжение предыдущего упражнения найдите все положительные целые числа меньше 150, которые (а) нельзя представить указанным образом; (Ь) имеют единственное представление. 34. [М26] Сделайте уравнение EVEN + ODD + PRIME = х дважды истинным, когда (а) х является совершенной 5-й степенью; (b) х является совершенной 7-й степенью. 35. [М20] Автоморфизмы 4-куба имеют много разных таблиц Симса, а в (14) показана только одна из них. Сколько разных таблиц Симса может быть, если вершины пронумерованы, как в (12)?
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 83 36. [М23] Найдите таблицу Симса для группы всех автоморфизмов доски 4x4 для игры в крестики-нолики: 0 12 3 4 5 6 7 8 9 а Ъ с d е f т.е. найдите перестановки, которые переводят линию в линию, где под линией подразумевается множество четырех элементов в ряду, в столбце или на диагонали. 37. [НМ22] Сколько таблиц Симса можно использовать с алгоритмом G или Н? Оцените логарифм этого количества для п —> оо. 38. [НМ21] Докажите, что среднее число транспозиций на одну перестановку при использовании алгоритма Орд-Смита (26) приблизительно равно sinhl « 1,175. 39. [16] Запишите 24 перестановки, генерируемые для п = 4 (а) по методу Орд-Смита (26); (Ь) по методу Хипа (27). 40. [М23] Покажите, что метод Хипа (27) соответствует таблице Симса. 41. [МЗЗ] Придумайте алгоритм, который генерирует все г-вариации {0,1,..., п — 1} заменой только двух элементов при переходе от одной вариации к следующей (см. упр. 9). Подсказка. Обобщите метод Хипа (27), получая результаты в позициях ап-г • • • an-i множества ао ... ап-\. Например, в одном решении для п = 5 и г = 2 используются последние два элемента соответствующих перестановок 01234, 31204, 30214, 30124, 40123, 20143, 24103, 24013, 34012, 14032, 13042, 13402, 23401, 03421, 02431, 02341, 12340, 42310, 41320, 41230. 42. [М20] Создайте таблицу Симса для всех перестановок, в которых каждая cr(k,j) и каждая r(k,j) для 1 < j < к является циклом с длиной < 3. 43. [М24] Создайте таблицу Симса для всех перестановок, в которых каждая а(к, к), и(к) и r(k,j)u)(k — 1)" для 1 < j < к является циклом с длиной < 3. 44. [20] Если блоки ненужных перестановок пропускаются расширенным алгоритмом G, то будет ли таблица Симса в методе Орд-Смита (23) лучше таблицы Симса в методе для обратного колексикографического порядка? 45. [20] (а) Чему равны индексы u\...ug, когда алгоритм X посещает перестановку 314592687? (Ь) Какая перестановка посещается, когда m ... itg = 314157700? 46. [20] Истинно или ложно: когда алгоритм X посещает а\... ап, имеем ик > Uk+i тогда и только тогда, когда ак > а,к+\ для 1 < к < п. 47. [M#i] Подсчитайте количество выполнений каждого этапа алгоритма X и выразите их с помощью чисел No, Ni, ..., АГП, где Nk — количество префиксов а\ .. .а^, которые удовлетворяют tj(a\,..., aj) для 1 < j < к. 48. [М25] Сравните время выполнения алгоритма X и алгоритма L в случаях, когда проверки ti(ai), £2(^1,02), .. •, tn(ai, аг,..., an) всегда дают истинный результат. 49. [28] Предложенный в этом разделе метод решения буквометик сложения с помощью алгоритма X по сути выбирает цифры справа налево. Иначе говоря, он присваивает пробные значения наименее значимым цифрам до рассмотрения цифр, которые соответствуют более высоким степеням 10. Исследуйте альтернативный подход, в котором цифры выбираются слева направо. Например, с помощью такого метода можно сразу определить, что М = 1 в буквометике SEND + MORE = MONEY. Подсказка: см. упр. 25. 50. [Ml5] Объясните, почему двойственная формула (32) следует из (13)?
84 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 51. [Mi£] Истинно или ложно: если множества Sk = {&(к, 0),..., сг(к, к)} образуют таблицу Симса для группы всех перестановок, то также ведут себя множества Sk = {о~(к, 0)~,..., ► 52. [М22] Какие перестановки r(k,j) и ш(к) возникают, когда алгоритм Н используется с таблицей Симса (36)? Сравните полученный генератор с алгоритмом Р. ► 53. [М26] (Ф. М. Иве (F. М. Ives).) Создайте таблицу Симса, для которой алгоритм Н генерирует все перестановки за счет всего п! + 0((п - 2)!) транспозиций. 54. [20] Будет ли алгоритм С работать, если на этапе СЗ выполнить правый циклический сдвиг, задавая а\... ак-хськ «— а>кО>1 - - • Q>k-\ вместо левого циклического сдвига? 55. [М27] Рассмотрим факториалъную масштабную функцию pi (m) = max {/с | т mod к\ = 0}. Пусть а к и Тк являются перестановками таких неотрицательных целых чисел, что o~jTk = Tkdj для j < к. Пусть ао и Д> являются тождественными перестановками, а для га > 0 определим &m — Рт-1 Тр\ (гп) An-1 C*m-1, /Зщ — ^гр,(т)Рт-1 ■ Например, если егк является операцией переворота (1 к—1)(2 к—2)... = (0 к)ф(к) и если = (0 к), и если алгоритм Е начинается с aj = j для 0 < j < п, тогда am и (Зт образуют содержимое ао ... an-i и bo ... bn-i после выполнения т раз этапа Е5. a) Докажите, что /?(п+1)|о(п+1)! = (Тп+1а~тп+1г~(^n!an!)n+1. b) Используйте результат (а), чтобы установить истинность алгоритма Е. 56. [М22] Докажите, что алгоритм Е остается истинным, если этап Е5 заменить следующим. Е5'. [Транспонировать пары.] Если к > 2, заменить 6j+i bj для j = к — 2, к — 4, (2 или 1). Вернуться к Е2. | 57. [НМ22] Чему равно среднее количество замен на этапе Е5? 58. [M#i] Истинно или ложно: если алгоритм Е начинается с ao.. .an-i = х\.. .жп, то последняя посещаемая перестановка начинается с ао = хп. 59. [М20] Некоторые авторы определяют ребра графа Кэли от 7г к 7гау, а не от 7г к а^7г. Насколько сильно отличаются эти два определения? ► 60. [21] Циклом Грэя для перестановок называется цикл (7Г0,7Ti,..., 7rni_i), который включает каждую перестановку {1,2,..., п} и обладает таким свойством, что тгк отличается от 7T(fc+i) mod п!- Он также может быть описан как гамилтьтонов цикл на графе Кэли для группы всех перестановок для {1,2,..., п} с п — 1 генераторами ((1 2), (2 3),..., (n—1 п)). Дельта-последовательностью такого цикла Грэя является такая последовательность целых чисел £о#1 .. • <5n!-i, что 7T(fc+l)modn' = (Sk £fc + l)7Tfc. (См. 7.2.1.1-(24), где описывается аналогичная ситуация для двоичных n-кортежей.) Например, на рис. 23 показан цикл Грэя, заданный простыми изменениями для п = 4. Его дельта-последовательность имеет вид (32131231)3. a) Найдите все циклы Грэя для перестановок {1,2,3,4}. b) Два цикла Грэя считаются эквивалентными, если их дельта-последовательности можно получить друг из друга циклическим сдвигом (Sk •.. (5n'-i^o • • • £fc-i), и/или обращением (Sn\-\ ... SiSo), и/или дополнением ((n—So)(n—Si)... (n—<5n»-i)). Какие циклы Грэя в (а) эквивалентны друг другу?
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 85 1234 Рис. 23. Алгоритм Р проходит этот гамильтонов цикл на усеченном октаэдре с рис. 5-1 4321 61. [21] В продолжение предыдущего упражнения код Грэя для перестановок аналогичен циклу Грэя, за исключением того, что последняя перестановка 7rn!_i необязательно должна быть смежной для исходной перестановки 7Го. Изучите множество всех кодов Грэя для п = 4, которые начинаются с 1234. 62. [М23] Какие перестановки могут быть последним элементом кода Грэя, который начинается с 12... п? 63. [М25] Оцените общее количество циклов Грэя для перестановок {1,2,3,4,5}. 64. [23] Дважды кодом Грэя для перестановок называется цикл Грэя с дополнительным свойством, что Jfc+i = Sk ± 1 для всех к. Р. К. Комптон и С. Дж. Вильямсон доказали, что такие коды существуют для всех п > 3. Сколько дважды кодов Грэя существует для 71 = 5? 65. [М25] Для каких целочисленных N существует путь Грэя по N лексикографически наименьшим перестановкам {1,...,п}? (В упр. 7.2.1.1-26 решается аналогичная задача для двоичных п-кортежей.) 66. [22] Из метода обмена Эрлиха следует другой тип цикла Грэя для перестановок, в котором 71 — 1 генераторов являются звездными транспозициями (1 2), (1 3), ..., (1 тг). Например, на рис. 24 показан соответствующий граф для тг = 4. Проанализируйте гамиль- тоновы циклы этого графа. 12314 11234 12431 [1423 12X43 3142 4312 3214 4231 3421 4123 3142 4132 3412 4213 3241 4321 3124 ■1132 2134 1432 2413 1243 2341 1324 2134 1234 2431 1423 2143 1342 2314 1234 4231 3421! 4.1.23! 4312! 32141 Рис. 24. Граф Кэли для перестановок {1,2,3,4}, генерированный звездными транспозициями (12), (13) и (14), изображенными в виде скрученного тора 67. [26] В продолжение предыдущего упражнения найдите цикл Грэя с обменом первыми элементами для п = 5, в котором каждая звездная транспозиция (1 j) происходит 30 раз для 2 < j < 5.
86 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 68. [МЗО] (В. Л. Компельмахер и В. А. Лисковец, 1975.) Пусть G является графом Кэли для всех перестановок {1,...,п} с генераторами (ai,...,afc), где каждый генератор aj является транспозицией (щ Vj). Также пусть А является графом с вершинами {1,... , п} и ребрами Uj — Vj для 1 < j < к. Докажите, что G имеет гамильтонов цикл тогда и только тогда, когда А является связным. (На рис. 23 показан особый случай, когда А является путем, а на рис. 24 показан особый случай, когда А является звездным графом.) ► 69. [28] Если п > 4, то следующий алгоритм генерирует все перестановки А\А2А3 ... Ап of {1,2,3,..., п} с помощью только трех преобразований: р = (12)(34)(56)..., <т = (23)(45)(67)..., г = (34)(5 6)(78)..., причем р и г никогда не применяются вслед друг за другом. Объясните принцип работы этого алгоритма. Z1. [Инициализировать.] Установить Aj «— j для 1 < j < п. Также установить aj «— 2j для j < п/2 и an-j <— 2j + 1 для j < п/2. Затем вызвать алгоритм Р, но с параметром п — 1 вместо п. Рассмотрим этот алгоритм как сопрограмму, которая должна возвращать управление всякий раз при посещении а\... an-i на этапе Р2. В нем используются те же переменные, за исключением п. Z2. [Установить х и у.] Снова вызвать алгоритм Р, получая новую перестановку а\... an-i и новое значение j. Если j = 2, заменить ai+s «-» a2+s (таким образом отменяя результат этапа Р5) и повторить этот этап. В этом случае мы находимся посередине алгоритма Р. Если j = 1 (так, что алгоритм Р завершает работу), установить xf-t/f-Ои перейти к Z3. В противном случае установить х <- aj-Cj+s+[0j=-i), у <- aj-Cj+s-[0j=+iy, именно эти два элемента заменяются наиболее часто на этапе Р5. Z3. [Посетить.] Посетить перестановку А\... Ап. Затем перейти к Z5, если А\ — х и А2 = у. Z4. [Применить потом ст.] Заменить А\ «-> Л2, Аз «-»• А*, Л5 н Лб, .... Посетить А\...Ап. Потом заменить Л2 О A3, А* <-»• -А5, Лб «-> Л7, Завершить, если А\... Ап = 1... п, в противном случае вернуться к Z3. Z5. [Применить т, потом а.] Заменить A3 н А4, «-» Аб, А7 «-»• As, Посетить Ai... Ап. Потом заменить А2 о A3, А4 «-> А5, Ав А7, ..., и вернуться к Z2. | Подсказка: сначала покажите, что алгоритм работает, если он изменен так, что Aj <— п + 1 — j и aj «— j на этапе Z1, и если перестановки "переброса11 р = (1 п)(2 п-1)..., сг' = (2 п)(3 п-1)..., т = (2 п-1)(3 п-2)... используются вместо р, а, т на этапах Z4 и Z5. В этой модификации на этапе Z3 происходит переход к этапу Z5, если Ai = х и Ап = у. ► 70. [МЗЗ] Два 12-цикла (41) можно рассматривать как циклы а-т для 12 перестановок {1,1,3,4}: 1134 -> 1341 3411 -> 4311 -> 3114 -> 1143 -> 1431 4131 -> 1314 ^ 3141 1413 4113 1134. Заменяя {1,1} на {1,2}, получим непересекающиеся циклы, а с помощью перехода от одного к другому — также гамильтонов путь. Можно ли аналогичным образом получить путь а-т для всех перестановок шести элементов на основе 360-цикла для перестановок {1,1,3,4,5,6}? 71. [48] Будет ли граф Кэли с генераторами <7 = (12 ...п)иг = (12) иметь гамильтонов цикл для нечетных п > 3?
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 87 72. [М21] Для графа Кэли с генераторами (c*i,... ,ock) предположим, что каждый генератор aj преобразует (Например, а и т в упр. 71 преобразуют 1 н» 2.) Докажите, что любой гамильтонов путь, начинающийся с 12 ... п в G, должен заканчиваться перестановкой, которая преобразует у »-> х. ► 73. [МЗО] Пусть а, /3 и а являются перестановками множества X, где X = A U В. Допустим, что ха = т, когда х £ А, и ха = ж/?, когда ж Е В, а порядок а/?- нечетный. a) Докажите, что все три перестановки, а, /?, сг, имеют одинаковый знак, т.е. все они четны или все нечетны. Подсказка. Перестановка имеет нечетный порядок тогда и только тогда, когда все ее циклы имеют нечетную длину. b) Выведите теорему R из (а). 74. [МЗО] (Р. А. Ранкин.) Предполагая, что а/3 = /За в теореме R, докажите, что гамильтонов цикл существует тогда и только тогда, когда существует такое число /с, что 0<к<д/сиЬ + к±.с, где /Зд^с = 7*, 7 = а/3~. Подсказка. Представьте элементы группы в форме /3J7fc. 75. [М25] Ориентированный тор От х Оп имеет ran вершин (х,у) для 0 < х < га, 0 < у < п и ребра (х,у) -> (ж,2/)а = ((ж + 1) mod га, у), (ж, 2/) (х,у)/3 = (ж, (j/ + 1) mod n). Докажите, что если m > 1 и n > 1, то количество гамильтоновых циклов этого диграфа равно: f J [gcd((d — fc)m, /сп) = d], d = gcd(m, n). 76. [ЛШ] Клетки, пронумерованные числами О, 1, ..., 63 на рис. 25, иллюстрируют северовосточный проход конем на торе 8x8: если к находится в клетке {хк,Ук), то (хк+\,Ук+\) = (хк + 2, ук + 1) или (rcfc + 1,+ 2) по модулю 8, а (#64,2/64) = (#о,2/о). Сколько таких проходов может быть нашхп торе, для m,п > 3? Рис. 25. Северо-восточный проход конем 29 24 19 14 49 44 39 34 58 53 48 43 38 9 4 63 23 18 13 8 3 62 33 28 52 47 42 37 32 27 22 57 17 12 7 2 61 56 51 46 6 41 36 31 26 21 16 11 35 30 1 60 55 50 45 40 0 59 54 25 20 15 10 5 ► 77. [22] Создайте полную программу MMIX, внутренний цикл которой представлен в (42) с помощью метода Хипа (27). 78. [М23] Проанализируйте время выполнения программы в упр. 77, обобщая ее так, чтобы во внутреннем цикле выполнялось г! посещений (с ао ... аг-\ в глобальных регистрах). 79. [20] Какие семь инструкций MMIX реализуют этап (Обменять ниблы ... ) в (45)? Например, если регистр t содержит значение 4 и регистр а содержит ниблы # 12345678, то регистр а должен измениться на # 12345687. 80. [21 ] Решите предыдущее упражнение с помощью только пяти MMIX инструкций. Подсказка. Используйте MX0R. ► 81. [22] Завершите программу MMIX для (46), предлагая способ выполнения последнего этапа (Продолжить работу методом Лангдона.). 82. [M#i] Проанализируйте время выполнения программы в упр. 81. 83. [22] Используйте путь а-т из упр. 70 для создания процедуры MMIX, аналогичной (42), которая генерирует все перестановки # 123456 в регистре а.
88 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 84. [20] Предложите способ генерации всех п! перестановок {1, ...,п}, выполняемых р процессорами в параллельном режиме работы. . 85. [25] Допустим, что значение п настолько мало, что п! помещается в рамках компьютерного слова. Предложите эффективный способ преобразования заданной перестановки а = а\... ап множества {1,..., п) в целочисленную функцию к = г (а) в диапазоне 0 < к < п!? Обе функции, к = г (а) и а = г^~1\к), должны вычисляться всего за 0(п) этапов. 86. [20] Отношение частичного порядка предполагается транзитивным, т.е. из х -< у и у -< z следует х -< z. Но для удовлетворения этого условия в алгоритме V не требуется этого исходного отношения. Покажите, что если i -< j/ и j/ ^ 2, то алгоритм V дает идентичные результаты, независимо от того, выполняется ли условие х -< z или нет. 87. [20] (Ф. Раски (F. Ruskey).) Рассмотрим таблицы инверсии ci...cn перестановок, посещенных алгоритмом V. Каким замечательным свойством они обладают? (Сравните с таблицами инверсии из (4) в алгоритме Р.) 88. [21] Покажите, что алгоритм V можно использовать для генерации всех способов разбиения цифр {0,1,..., 9} на два 3-элементных и два 2-элементных множества. 89. [МЗО] Рассмотрим числа to, ti, ..., tn в (51). Ясно, что to = t\ = 1. a) Назовем индекс j тривиальным, если tj = tj-i. Например, 9 является тривиальным для отношений в таблице Юнга (48). Как можно было бы изменить алгоритм V, чтобы переменная к принимала только нетривиальные значения. b) Проанализируйте время выполнения модифицированного алгоритма. Какие формулы заменят (51)? c) Скажем, что интервал [j.. к] не является цепью, если не выполняется I -< I + 1 для j < I < к. Докажите, что в таком случае tk > 2tj-i. d) Каждая обратная топологическая сортировка а[ ... о!и задает маркировку, которая соответствует отношениям -< a'kl, ..., a'jm -< а'кт, эквивалентным исходным отношениям ji -< ..., jm ~< кт. Объясните, как найти такую маркировку, что [j .. к] не является цепью, когда j и к являются последовательными нетривиальными индексами. e) Докажите, что с помощью такой маркировки М < 4N в формулах из п. (Ь). 90. [М21] Алгоритм V можно использовать для генерации всех перестановок, которые /i-упорядочены для всех h в заданном множестве, а именно для всех таких а[ ... ап, что a'j < a'j+h Для 1 ^ j < п — h (см- раздел 5.2.1). Проанализируйте время выполнения алгоритма V, когда он генерирует все перестановки, которые одновременно 2-упорядочены и 3-упорядочены. 91. [НМ21] Пронализируйте время выполнения алгоритма V, когда он используется с условиями (49) для поиска сочетаний. 92. [М18] Сколько перестановок вероятно посетит алгоритм V "случайным" образом? Пусть Рп является количеством частичных упорядочений {1,..., п}, а именно количеством рефлексивных, антисимметричных и транзитивных отношений. Пусть Qn является количеством таких отношений с дополнительным свойством j < к для j < к. На основе Рп и Qn выразите ожидаемое количество способов топологической сортировки п элементов, усредненное по всем частичным упорядочениям. 93. [35] Докажите, что все топологические сортировки можно генерировать таким образом, что только одна или две смежные транспозиции выполняются на каждом этапе. (Пример 1 -< 2, 3 -< 4 показывает, что одна транспозиция на этап не всегда может быть достигнута, даже если допустить несмежные обмены, поскольку только две из шести подходящих перестановок являются нечетными.)
7.2.1.2 ГЕНЕРАЦИЯ ВСЕХ ПЕРЕСТАНОВОК 89 ► 94. [25] Покажите, что в случае с сочетаниями с помощью отношений в (49) все топологические сортировки можно генерировать всего с одной транспозицией на каждом этапе. 95. [21] Как генерировать все перестановки вверх-вниз {1,... ,п}, т.е. такие перестановки ai... an, в которых а\ < аг > аз < а± > • • •. 96. [21] Как генерировать все циклические перестановки {1,...,п}, т.е. такие перестановки ai... On, циклическое представление которых состоит из одного п-цикла. 97. [21] Как генерировать все неупорядочения {1,..., п}, т.е. такие перестановки а\... an, для которых а\ ф 1, a<i ф 2, аз Ф 3, .... 98. [НМ23] Проанализируйте асимптотическое время выполнения метода из предыдущего упражнения. 99. [МЗО] Для заданного п > 3 покажите, что все неупорядочения {1,...,п} можно генерировать, выполняя не больше двух транспозиций между посещениями. 100. [21] Как генерировать все неразложимые перестановки {1,... , п}, т.е. такие перестановки ai ... an, что {ai,..., aj} ф {1,..., j} для 1 < j < п. 101. [21] Как генерировать все инволюции {1,... ,п}, т.е. такие перестановки а\... an, для которых aai . • • aan = 1... п. 102. [МЗО] Покажите, что все инволюции {1,..., п} можно генерировать за счет не более двух транспозиций между посещениями. 103. [М##] Покажите, что все четные перестановки {1,..., п) можно генерировать последовательными поворотами трех последовательных элементов. ► 104. [М22] Перестановка а\... ап of {1,..., п) называется хорошо сбалансированной, если Например, 3142 является хорошо сбалансированной для п = 4. a) Докажите, что ни одна перестановка не может быть хорошо сбалансированной для п mod 4 = 2. b) Докажите, что если а\... ап является хорошо сбалансированной, то таковыми являются обратная ей перестановка ап ... ai, ее дополнение (п+1—а\)... (п+1—ап) и инверсная ей перестановка а[ .. .а'п. c) Определите количество хорошо сбалансированных перестановок для малых значений п. ► 105. [26] Слабым порядком называется отношение <, которое является транзитивным (ж ^ у и у •< z подразумевает х •< z) и полным (всегда выполняется х •< у или у •< ж). Можно записать ж = у, если х -<у к у -< х\ х •< у, если ж •< у и у ж. Для трех элементов {1,2,3} существует 13 слабых порядков, а именно: 1 = 2 = 3, 1 = 2^3, 1^2 = 3, 1 2 X 3, 1 = 3^2, 1^3^ 2, 2^1 = 3, 2-П^З, 2 = 3^1, 2X3^1, 341 = 2, 3 ^ И 2, 3^2x1. a) Как систематично генерировать все слабые порядки {1,...,п}, как последовательности цифр, разделенных символом = или X. b) Слабый порядок можно также представить в виде последовательности а\.. .an, где aj = к, если j предшествуют к знаков X. Например, 13 слабых порядков {1,2,3} равны соответственно ООО, 001, 011, 012, 010, 021, 101, 102, 100, 201, ПО, 120, 210 в этой форме. Найдите простой способ генерации всех таких последовательностей длины п. п п
90 КОМБИНАТОРНЫЙ ПОИСК 7.2.1.2 106. [М40] Можно ли решить упр. 105,6 с помощью кода, подобного коду Грэя? ► 107. [30] (Джон X. Конвэй, 1973.) Пасьянс "топсвопс" начинается с тасовки колоды из га карт, помеченных {1,... ,п}, и размещения их лицевой стороной вверх. Тогда, если верхняя карта к > 1, снять верхние к карт по одной и положить их снова наверх колоды, таким образом заменяя перестановку а\... ап перестановкой а,к ... a\a,k+i... ап. Продолжать, пока верхней картой не будет 1. Например, 7-этапная последовательность 31452 41352 -+ 53142 -+ 24135 -+ 42135 -+ 31245 21345 12345 может произойти при га = 5. Какой будет самая длинная возможная последовательность для га — 13? 108. [М27] Докажите, что если самый длинный розыгрыш пасьянса "топсвопс" с га картами имеет длину /(п), то /(га) < Fn+i — 1. 109. [М^7] Найдите верхнюю и нижнюю границы для функции /(га) в пасьянсе "топсвопс" . ► 110. [25] Найдите все такие перестановки ао .. • ag of {0,..., 9}, что Также предложите алгоритм для решения более крупных задач этого типа. ► 111. [М25] Известно несколько аналогов цикла де Бруийна, которые ориентированы на перестановки. Самый простой и самый красивый из них называется универсальным циклом перестановок и был предложен Б. В. Джексоном в Discrete Math. 117 (1993), p.141-150. Он представляет собой цикл из га! таких цифр, что каждая перестановка {1,... ,га} возникает лишь однажды в виде блока га — 1 последовательных цифр (с избыточным финальным элементом). Например, (121323) является универсальным циклом перестановок для га = 3, причем единственным таким циклом. Найдите универсальный цикл перестановок для га = 4 и докажите, что такие циклы существуют для всех га > 2. ► 112. [НМ43] Сколько существует универсальных циклов для перестановок <9 объектов? {ао,а2,аз,а7} {ai, а4, аъ} {ai,a3,a7,as} {ао,аз,а4} {2,5,7,8}, {0,3,6}, {3,4,5,7}, {0,7,8}.
ОТВЕТЫ К УПРАЖНЕНИЯМ РАЗДЕЛ 7.2.1.1 1. Пусть rrij = Uj — lj + 1, и посетим (а\ -Hi,...,an+/n) вместо (ai,..., an) в алгоритме М. Или заменим 'aj <— 0' на 'aj «— lj' и 'а? = mj — 1' на 'aj = tij' в этом алгоритме и установим /о 4— 0, г£о <— 1 на этапе Ml. 2. (0,0,1,2,3,0,2,7,0,9). 3. Этап М4 выполняется m\rri2 .. .т^ раз, если j = fc; следовательно, общее количество равно Х^!с=о П^=1 тз = 1711 • • • mn(l + l/mn + l/mnmn-i Ч + 1/гап ... mi). Если все mj равны или больше 2, то оно меньше 2mi .. .гап. (Таким образом, следует иметь в виду, что необычные методы на основе кода Грэя, которые изменяют только одну цифру за посещение, фактически сокращают общее число изменений цифр, но максимум в два раза.) 4. N1. [Инициализировать.] Установить aj <— rrij — 1 для 0 < j < п, где mo = 2. N2. [Посетить.] Посетить п-кортеж (ai,..., an). N3. [Подготовить к вычитанию единицы.] Установить j «— п. N4. [Заем в случае необходимости.] Если aj = 0, то установить aj «— rrij — «— j — 1, а потом повторить этот этап. N5. [Уменьшить, если это еще не сделано.] Если j = 0, то завершить этот алгоритм. В противном случае установить aj «— aj — 1 и вернуться к этапу N2. | 5. Обращение битов легко выполняется на компьютерах типа MMIX, но на других компьютерах можно поступить следующим образом: R1. [Инициализировать.] Установить j «— к <— 0. R2. [Переставить.] Поменять A[j + 1] <->• А[к + 2П_1]. Также, если j < к, поменять A[j] А[к] и АЦ + 271"1 + 1] <г> А[к + 271"1 + 1]. R3. [Продвинуть к.] Установить к «— к + 2 и завершить, если > 2n_1. R4. [Продвинуть j.] Установить h «— 2П~2. Если j > h, повторно устанавливать j <- j — h и h 4- h/2 до тех пор, пока не будет выполняться условие j < h. Затем установить j «— j + h. (Теперь j = (bo ... 6n-i)2, если /с = (bn-i... 60)2.) Вернуться к этапу R2. | 6. _Если g((0bn-i ... 6160)2) = (0(6n-i_). ^(62 0 6i)(6i е 60))2, то g((lbn-i... 6160)2) = 2П + р((0бп_1... 6160)2) = (i(6n-i)... (б2 е 6i)(6i е б0))2, где б = б е 1.
92 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 7. Для 2г секторов можно использовать д(к) для 2П — г < к < 2п + г, где га = fig г], поскольку р(2п - г) е о(2п + г - 1) = 2n by (5). [G. С. Tootill, Ртос. IEE 103, Part В Supplement (1956), р.434.] См. также упр. 26. 8. Используйте алгоритм G с га «— га — 1 и включите бит четности а<х> справа. (Таким образом, можно получить д(0), д(2), р(4), ....) 9. Замените самое правое кольцо, поскольку 1/(1011000) нечетно. 10. Ап + Вп = д[~1](2п - 1) = [2n+1/3j иАп = Вп + п. Следовательно, Ап = |_2та/3 + п/2\ иВп = [2п/3-п/2\. Историческое замечание. Японский математик Йориюки Арима (1714-1783) рассмотрел эту задачу [см. Shuki Sanpo (1769), Problem 44], заметив, что головоломка с п-кольцами сводится к головоломке с (п — 1)-кольцами после некоторго числа шагов. Пусть Сп = Ап — Ап-1 = Вп — Вп-1 + 1 является числом колец, снятых во время этого упрощения задачи. Арима заметил, что Сп = 2Cn-i — [га четно]. Таким образом, он мог бы вычислить Ап — С\+СъЛ V Сп для п = 9, фактически не зная формулы Сп — [2П_1/3~|. Больше чем двести лет назад Кардан уже упоминал "complicate annuli" [De Subtilitate Libri XXI (Nuremberg: 1550), Book 15]. Он считал их "бесполезными и даже поразительно неуловимыми", ошибочно заявляя, что достаточно 95 шагов для снятия семи колец и еще 95 для их возврата в исходное положение. Джон Валлис (John Wallis) посвятил этой головоломке семь страниц в латинском издании своей книги Algebra 2 (Oxford: 1693), Chapter 111. Он представил весьма подробное описание не очень эффективного метода для случая с 9 кольцами. Он включил операции сдвига кольца по стержню, а также снятие и одевание колец и намекнул, что возможны более эффективные методы, но не предлагал их. 11. Решение имеет вид Sn = 5п-2+1+5^-2+5^-1, если Si = S2 = 1 is Sn = 2п~1—[п четно]. [Math. Quest. Educational Times 3 (1865), p.66-67.] 12. (а) Согласно теории, га — 1 двоичный код Грэя позволяет получить композиции в удобном порядке (4, 31, 211, 22, 112, 1111, 121, 13): А1. [Инициализировать.] Установить t <— 0, j' «— 1, si <— га. (Предполагается, что га> 1.) А2. [Посетить.] Посетить si... Sj. Затем установить t «— 1 — t и перейти к А4, если t = 0. A3. [Нечетный этап.] Если Sj > 1, то установить Sj 4- Sj — 1, Sj+i <— 1, j• «— j + 1, в противном случае установить j 4— j• — 1 и Sj «— + 1. Вернуться к А2. А4. [Четный этап.] Если Sj-i > 1, то установить Sj-i 4- Sj-i — 1, Sj+i ч— Sj, Sj <— 1, j «- j + 1. В противном случае установить j <- j — 1, Sj «- Sj-i <- Sj-i + 1 (но завершить, если j — 1 = 0). Вернуться к A2. | (b) Теперь </i, ..., qt-i представляют кольца на стержне. 81. [Инициализировать.] Установить t <- 1, </о <~ п. (Предполагается, что га > 1.) 82. [Посетить.] Установить qt Ч- 0 и посетить (qo — qi)... (^t-i — qt)- Перейти к В4, если t четно. 83. [Нечетный этап.] Если qt-i = 1, то установить t <- t — 1. В противном случае установить ф4-1и£4-$ + 1. Вернуться к этапу В2. 84. [Четный этап.] Если qt-2 = qt-i + 1, то установить qt-2 <— qt-i и t <— t — 1 (но завершить, если t = 2), в противном случае установить qt <— qt-i, qt-i 4- qt + 1, t<-t + l. Вернуться к B2. | Эти алгоритмы [см. J. Misra, ACM Trans. Math. Software 1 (1975), p.285] являются бесцикловыми даже на этапах инициализации.
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 93 13. На этапе А1 также установить С «— 1. На этапе A3 установить С «— SjC, если Sj > 1, в противном случае — С «— C/(sj-\ +1). На этапе А4 установить С <- Sj-\C if Sj-i > 1, в противном случае — С <— C/(sj;_2 + 1). Аналогичные модификации применимы к этапам Bl, ВЗ и В4. Достаточная точность необходима для подгонки к значению С = п\ для композиции 1... 1. Расширим определение бесцикловости, предполагая, что для выполнения арифметической операции требуется единица времени. 14. S1. [Инициализировать.] Установить j 4— 0. 52. [Посетить.] Посетить строки oi ... aj. 53. [Удлинить.] Если j < п, то установить j <— j 4- 1, а3 <— 0 и вернуться к S2. 54. [Увеличить.] Если aj < rrij — 1, то установить aj «— aj + 1 и вернуться к S2. 55. [Сократить.] Установить j «— j; — 1 и вернуться к S4, если j > 0. | 15. Т1. [Инициализировать.] Установить j <— 0. Т2. [Четное посещение.] Если j четно, то в таком случае посетить строку а\... aj. ТЗ. [Удлинить.] Если j < п, то установить j• «— j + 1, а3; «— 0 и вернуться к Т2. Т4. [Нечетное посещение.] Если j нечетно, то посетить строку а\... aj. Т5. [Увеличить.] Если aj < rrij — 1, то установить aj <— aj + 1 и вернуться к Т2. Т6. [Сократить.] Установить j <— j — 1 и вернуться к Т4, если j > 0. | Этот алгоритм является бесцикловым, хотя на первый взгляд может показаться, что он содержит циклы. Не более четырех шагов отделяют последовательные посещения. Основная идея связана с результатами упражнения 2.3.1-5 и алгоритмом предпостпорядкового обхода ("prepostorder") (алгоритм 7.2.1.6Q). 16. Предположим, что LINK(j — 1) = j 4- пЬэ для 1 < j < п и LINK(j — 1 + п) = j 4- n(l — bj) для 1 < j < п. Эти поля связи представляют (ai,...,an) тогда и только тогда, когда g(bi... bn) = ai... an, так что мы можем использовать бесцикловый генератор двоичного кода Грэя для достижения нужного результата. 17. Поместите конкатенацию 3-битовых кодов (g{j),g(k)) в ряду j и столбце к для 0 < j, к < 8. [Нетрудно доказать, что это, по сути, единственное решение, за исключением перестановок, и/или дополнения координат, и/или вращения строк, поскольку изменяемая координата при движении на север или на юг зависит только от строки, и аналогичное утверждение применимо к столбцам. Об изоморфизме Карно между 4-кубом и тором 4x4 можно прочесть в The Design of Switching Circuits, W. Keister, A. E. Ritchie и S. H. Washburn (1951), p. 174. Между прочим, Кайстер придумал остроумный вариант китайской головоломки с кольцами, который называется SpinOut, и ее обобщение Hexadecimal Puzzle [U.S. Patents 3637215-3637216 (1972).] 18. Используйте 2-битовый код Грэя для представления цифр Uj — (0,1,2,3) соответственно как битовые пары u'2j-\u'2j = (00,01,11,10). [К. И. Ли предложил свой вариант в IEEE Trans. IT-4 (1958), p.77-82. Аналогичная m/2-битовая кодировка работает для четных значений т. Например, если т = 8, то можно представить (0,1,2,3,4,5,6,7) в виде (0000,0001,0011,0111,1111,1110,1100,1000). Но такая схема оставляет в стороне некоторые из двоичных структур при т > 4.] 19. (а) Модулярный четверичный алгоритм Грэя требует чуть меньше вычислений, чем алгоритм М, но это не важно, поскольку число 256 невелико. Результат имеет вид 2q + zf + г\ + г\ + 14(44 + zUi) + bbzQziz2zz{zl + z\){z\ 4- z\). (b) Замена lz0,zi,z2,z3) на (l,z,z2,z) дает 1 4- 112z6 + 30z8 + 1Ш10 + z16. Таким образом, все ненулевые веса Ли > 6. Теперь примените эту конструкцию в предыдущем упражнении для преобразования каждого вектора (uo, и\, и2, U3,U4,U5,uq, и<х>) в 16-битовое число.
94 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 20. Восстановите четверичный вектор (ио, и\, v>2, из, и±, и&, uq,Uoo) из и' и используйте алгоритм 4.6.1D для поиска остатка от деления ио+и\х-\ \-uqxq на д(х) по модулю 4. Этот алгоритм может быть использован, несмотря на то, что эти коэффициенты не относятся к полю, поскольку многочлен д(х) является нормированным. Выразим остаток в виде х-7 + 2хк (по модулю д(х) и 4) и предположим, что d = (k—j) mod 7, s = (г*оН \-U6+u<x>) mod 4. Случай 1, s = 1: если к = оо, то ошибка равна хК Иначе говоря, правильный вектор имеет Uj «— (щ — 1) mod 4), а в противном случае будет три или более ошибки. Случай 2, s = 3: если j = к, ошибка равна — xJ, в противном случае будет три или более ошибки. Случай 3, s — 0: если j = к = оо, ошибок не будет; если j = оо и к < оо, то по крайней мере будет четыре ошибки. В противном случае ошибки будут иметь вид ха — хъ, где а — (j + (оо,6,5,2,3,1,4,0)) mod 7 и соответственно d = (0,1,2,3,4,5,6, оо) и Ь = 0'+2d) mod 7. Случай 4, s = 2: если j = оо, то ошибки будут иметь вид 2хк. В противном случае ошибки будут иметь вид xj + х°°, если к = оо; —xJ — х°°, если d = 0; ха 4- х6, если d G {1, 2,4}, а = (j - 3d) mod 7, 6 = (j - 2d) mod 7; -x° - хь, если d G {3,5,6}, а = (j - 3d) mod 7, 6 = (j - d) mod 7. Для заданного = (1100100100001111)2 имеем: и = (2,0,3,1,0,0,2,2) и 2 + Зх2 + х3 + 2х6 = 1 + Зх + Зх2 = х5 + 2х6; также s = 2. Таким образом, ошибки будут иметь вид х2 + х3, а ближайшее безошибочное кодовое слово имеет вид (2,0,2,0,0,0,2,2). Согласно алгоритму 4.6.Ш, 2 + 2х2 + 2х6 = (2 -f 2х + 2х3)д(х) (по модулю 4). Поэтому восемь информационных битов соответствуют (г>о,ш,г;2,г;з) = (2,2,0,2). (Более "умный" алгоритм мог бы заметить: "Ага, ведь это первые 16 битов числа 7г".) Об обобщениях других эффективных схем кодирования на основе четверичных векторов см. в классической работе A. R. Hammons, P. V. Kumar, A. R. Calderbank, N. J. А. Sloane, P. Sole, IEEE Trans. IT-40 (1994), p.301-319. 21. (a) C(c) = 1, С(0о:) = C(la) = С (а) и C(*a) = 2C(a)-[10 ... 0 G а]. Итерирование этой последовательности дает С (а) — 21 — 2*_1е* — 2t_2et_i — ... — 2°ei, где ej = [10... 0 G aj] и aj является суффиксом а, следующим за j-й звездочкой. В данном примере имеем а\ = *10**0*, аг = 10**0*, ..., аь = е. Таким образом, е\ — 0, ег = 1, ез = 1, в4 = 0 и еъ = 1 (по соглашению), следовательно, С(**10**0*) = 25 — 24 — 22 — 21 = 10. (b) Можно было бы удалить концевые звездочки, чтобы t = t'. Тогда et = 1 подразумевает et-i = • • • = ei =0. (Случай С (а) = 21' ~1 возникает тогда и только тогда, когда а заканчивается 10J*fc.) (c) При вычислении суммы С (а) по всем i-подкубам обратите внимание на то, что (?) кластеров начинаются с п-кортежа 0... 0, а (n7X) кластеров — с последующего п-кортежа (а именно по одному кластеру для каждого £-подкуба, содержащего этот n-кортеж и измененный бит). Таким образом, среднее равно ((?) + (2n - l)(n71))/2n"t(?) = 2*(1 - t/n) + 2t-n(£/n). (Формулы в (с) справедливы для любого n-битового пути Грэя, а формулы в (а) и (Ь) характерны для отраженного двоичного кода Грэя. Эти результаты опубликованы в работе К. Фалутсоса (С. Faloutsos) [IEEE Trans. SE-14 (1988), p.1381-1393].) 22. Пусть a*J и /3*к являются последовательными листьями двоичного луча Грэя, где а и /3 являются двоичными строками и j < к. Тогда последние k — j битов а являются такой строкой а'что а и /За' являются последовательными элементами двоичного кода Грэя, следовательно, смежными. (Интересные применения этого свойства к кубически
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 95 связанным (cube-connected) параллельным компьютерам со связью путем передачи сообщений рассматриваются в работе Вильяма Дж. Делли (W. J. Dally) A VLSI Architecture для Concurrent Data Structures (Kluwer, 1987), Chapter 3.) 23. V = g(k) 0 g(l) = g(k 0 0 подразумевает, что I =_k 0 gl~1](2j) = к 0 (2i+1 - 1). Иначе говоря, если к = (bn-i ... 60)2 имеем I = (6n-i ... bj+ibj ... 60)2- 24. Определяя g(k) = к 0 \ k/2\ как обычно, находим g(k) = g(—l — к). Следовательно, существуют два таких 2-адических целых числа к, что д(к) имеет заданное 2-адическое значение I. Одно из них четное, а другое — нечетное. Было бы удобно определить, что <^_11 является четным решением. Тогда (8) заменяется на bj = uj-i 0 • • 0 ао для j > 0. Например, д^~г\1) = —2 по этому определению; если / является целым числом, то "знак" ^^(0 — четностью /. 25. Пусть р = к 0 /; из упражнения 7.1.3-3 известно, что 2UgpJ+i -р<\к-1\<р. Имеем и(9(р)) = Ф #(0) == ^ тогда и только тогда, когда существуют положительные целые числа ji, ..., jt, такие, что р = (i^oJ'2lJ'3 ... (0 или 1)л)2- Наибольшее возможное число р < 2п появляется, когда ji — п 4- 1 — t и J2 = • • • = jt = 1, достигая р = 2П — Г^/З]. Наименьшее возможное число 2'-lgp^+1 — р = (Р2(Н3 ... (1 или 0)Jt)2 4- 1 возникает, если j2 = ... = jt = 1, достигая р = f2*/3l [см. С. К. Yuen, IEEE Trans. IT-20 (1974), p.668; S. R. Cavior, IEEE Trans. IT-21 (1975), p.596]. 26. Пусть N = 2nt 4 1- 2ni, где nt > • • • > ni > 0. Также предположим, что Гп является произвольным кодом Грэя для {0,1,..., 2п— 1}, который начинается с 0 и заканчивается 1, за исключением того, что Го просто 0. Используйте Г£, 2n*4-rnt_15 2nt+--- + 2n3+r£, 2П*+--- + 2П2+ГП1, если t четно; Tnt, 2П*+Г£_1Э 2п*+... + 2пз4-Г^2, 2nt-h----h2n2+rni, если t нечетно. 27. Вообще, если к — (fen-i... ^0)2, то (к И- 1)-й наибольший элемент Sn равен 1/(2 - (-1)--'/(2 - • • • /(2 - (-1)°V(2 - (-1D) • •.)), со структурой знаков д(к) = (an-i... ао)г- Таким образом, можно вычислить любой элемент Sn за О(п) шагов, зная его ранг. Задавая к = 2100 — 1010 и п = 100, получим ответ 373065177/1113604409. (Всякий раз, когда /(ж) является положительной и монотонной функцией, 2П элементов /(±/(... ±f(±x)...)) упорядочены согласно двоичному коду Грэя, как показал X. Э. Зальцер в своей работе [САСЫ 16 (1973), р. 180]. В этом частном случае, однако, существует другой способ получения ответа, поскольку мы также имеем Sn = //2, ±2,..., ±2, ±1//, используя представление из раздела 4.5.3. Непрерывная дробь в этом виде упорядочена дополняющими противоположными битами к.) 28. (а) Поскольку t = 1, 2, ..., бит aj медианы (Gt) пробегает периодическую последовательность 0,...,0,*,1,...,1,*,0,...,0,*,... со звездочками на каждом 21+j-m этапе. Таким образом, строки, соответствующие двоичному представлению [(t — l)/2j и [£/2j, являются медианами. И эти строки действительно являются экстремальными случаями в том смысле, что все медианы согласуются с общими битами l(t — l)/2j и |_t/2j, следовательно, звездочки встречаются там, где согласования нет. Например, если t = 100 = (01100100)2 и п = 8, имеем медиану (<Зюо) = 001100**. (Ь) Поскольку G2t = 2Gt U (2Gt 4-1), можно предположить, что t = (an-2... aiaol)2 является нечетным. Если а равно д(р) и /3 равно g(q) в двоичном коде Грэя, то имеем р = (pn-i ...ро)2, q — {pn-i..-Pj+ip3 ...РоЬ и ап-\ап-2 = 01 = pn-iPn-2. Здесь не выполняется р < t < 0, поскольку подразумевается, что j = п — 1 и рп-з = Рп-4 =
96 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 • • • = ро = 1 [см. A. J. Bernstein, К. Steiglitz, J. Е. Hopcroft, IEEE Trans. IT-12 (1966), р.425-430]. 29. Предположим, что р # 0, let I = [lgpj и Sa = {s \ 2la < s < 2z(a +1)} для 0 < a < 2n~l. Тогда (кфр) — к имеет постоянный знак для всех к € 5a, а ^2 (к®р)-к =2'|Sa| = 22'. k£Sa Кроме того, д^~^(д(к) 0р) = к 0 <^~1](р), и llg^~^(p)J = UgPj- Следовательно, fc=0 a=0 fc€5a a=0 [см. Morgan M. Buchner, Jr., Beii System Tech. J. 48 (1969), p.3113-3130.] 30. Цикл с к > 1 имеет длину 2Llglgfc-l+1, поскольку легко показать из уравнения (7), что если к = (&n-i • • • &оЬ то имеем: g[2l](k) = (cn-i... со)2, где с-,- = bj 0 fci+2i. Чтобы переставить все элементы к, такие, что [lg к\ = £, есть два варианта: если t является степенью 2, то цикл, содержащий 2[fc/2j, также содержит 2[fc/2j +1. Поэтому необходимо удвоить лидеров циклов для t — 1. В противном случае цикл, содержащий 2[fc/2j, является непересекающимся с циклом, содержащим 2|_fc/2j +1, а значит, Lt = (2Lt-i)U(2Lt-i 4-1) = (Lt-i*)2. Этот аргумент, обнаруженный Йоргом Арндтом в 2001 году, дает подсказку и приводит к следующему алгоритму: Р1. [Инициализировать.] Установить t «— 1, га «— 0. (Можно предположить, что п > 2.) Р2. [Цикл по лидерам.] Установить г «— га. Выполнить алгоритм Q с к = 2* +г, тогда если г > 0, то установить г <— (г — 1)&га и повторять до тех пор, пока не будет выполнено условие г = 0 (см. упр. 7.1.3-79). РЗ. [Увеличить lg к.] Установить t «— t + 1. Завершить, если t равно п. В противном случае установить га <— 2т + [t&c(t — 1)^0] и вернуться к Р2. | Q1. [Начать цикл.] Установить s «— Хк, I «— к, j <- I 0 LZ/2J. Q2. [Выполнить цикл.] Если j ф к, то установить Xi «— Xj, I «- j, j f- /0 [Z/2J и повторять до тех пор, пока не будет выполнено условие j = fc. Затем установить Xi<-e. I 31. Поле на основе операции fn можно получить тогда и только тогда, когда можно получить поле на основе операции fn \ которая переводит (an-i... ао)г в ((on-i 0fln-2)(fln-i 0 ап-з)(ап-2 0 ап-4) • • • («2 0 ao)(ai))2. Пусть сп(ж) является характеристическим многочленом матрицы А, определяющей это преобразование, по модулю 2. Тогда с\(х) = х + 1, с2(х) = ж2 + х + 1 и Cj+i(x) = же,(ж) 4- Cj_i(x). Поскольку Сп(А) является нулевой матрицей по теореме Кэли-Гамильтона, то поле получается тогда и только тогда, когда Сп(х) является примитивным многочленом, а это условие можно проверить, как в разделе 3.2.2. Первыми такими величинами п являются 1, 2, 3, 5, 6, 9, 11, 14, 23, 26, 29, 30, 33, 35, 39, 41, 51, 53, 65, 69, 74, 81, 83, 86, 89, 90, 95. (Прокручивая эту последовательность назад, можно показать, что c-j-i(x) = Cj(x), следовательно, Cj(x) делит C(2j+i)fc+j(x), например, csk+i(x) всегда кратно ж4-1. Следовательно, все числа п вида 2jk + j 4- к исключаются, когда j > 0 и к > 0. Многочлены cis(x), С5о(ж), С9в(ж) и сдд(х) являются неприводимыми, но не примитивными.)
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 97 32. Почти всегда истинно, но ложно в точках, где Wk(x) изменяет знак. (Уолш сначала предположил, что фунцкия Wk(x) должна быть равна нулю в таких точках, но принятое здесь соглашение лучше, поскольку делает более простые формулы, как (15)—(19), верными для всех х.) 33. По индукции для к имеем: wk(x) = wW2i(2x) = n(2x)bl+b2r2(2x)b2+b3 ... = r,(x)b°+blr2(x)6l+62r3(x)b2+63 ... для 0 < х < 2, поскольку rj(2x) = rj+i(x) и ri (х) = 1 в этом диапазоне. И когда \ < х < 1, ti7fc(x) = (-l)rfc/2%fc/2J (2х - 1) = Г1(х)Ьо+б1п(2х - l)6l+b2r2(2x - 1)Ь2+б3 ... = ri(x)6o+blr2(x)6l+62r3(x)b2+b3 поскольку \к/2] = 6о + 6i (по модулю 2) и rj(2x — 1) = rj+i(x — \) — rj+\(x) для j > 1. 34. рк(х) = Ylj>o r%i(x)\ следовательно, wk(x) = Рк{х)рук/2\{х) - рд(к)(х) [см. R. Е. А. С. Paley, Proc. London Math. Soc. (2) 34 (1932), р.241-279]. 35. Если j = (an-i . • .«0)2 и к = (6n-i .. -60)2, то элемент в строке j и столбце к равен (—1У^'к\ где f(j,k) является суммой всех ar6s, таких, что г — s (матрица Адамара); г 4- s = п — 1 (матрица Пэйли); г + s = п или п — 1 (матрица Уолша). Пусть Rn, Fn и Gn являются матрицами перестановок от j = (an-i ... «0)2 к к = (a0 .. .an_i)2, к - 2п - 1 - j = (an-i .. .ао)г, и к = g[~1](j) = ((an_i)... (an-i 0 • • ■ Ф а0))2 соответственно. Тогда, используя произведение матриц, получим рекурсивные формулы: /A,®(10)\ р „ JO l\ r _/G„ 0 \ тт ъ(1 Х\ Р {Рп®(11)\ ш ( W„®(11) \ Я„®^ TJ, ^+l=(pn0(lT)J. W^={FnWn®(ll))- Таким образом, W„ = GTnPn = P„Gn; Яп = PnRn = RnPn; и Pn = WnGn = GnVKn = HnRn ~~ RnHn. 36. Wl. [Преобразование Адамара.] Для к = 0, 1, ...,n — 1, замените пару (Xj,Xj+2fc) парой (Xj 4- Xj+2fc,Xj — Xj+2k) для всех j с четными \J/2k\, 0 < j < 2п. (Эти операции эффективно выполняют преобразование Хт «— НпХт.) W2. [Обращение битов.] Примените алгоритм из упражнения 5 для вектора X. (Эти операции эффективно выполняют преобразование Хт «— RnXJ в системе обозначений из упр. 35.) W3. [Двоичная перестановка Грэя.] Примените алгоритм из упр. 30 к вектору X. (Эти операции эффективно выполняют преобразование Хт <— G^XT.) \ Если п имеет одно из особых значений из упражнения 31, то эффективнее объединить этапы W2 и W3 в одном этапе перестановки. 37. Если к = 2ei -I Ь2е* с е\ > • • • > е* > 0, то изменение знака происходит в Sei U- • -U5et, *-{£}• МИ} s.-.{^\o<_,<r}. Следовательно, количество изменений знака в (0.. х) равно Y?j=i |_2ejx + sJ- Подстановка х = I/(к 4- 1) дает / 4- 0(t) изменений, т.е. Z-e изменение происходит самое большее на расстоянии 0(i/(fc))/2LlgfcJ от l/(k 4- 1). (Этот аргумент позволяет утверждать, что существует бесконечно много пар (&,/) с \zki — //(& 4-1)| = £2 ((log к)/к). Но пока не видно явной конструкции для таких "плохих" пар.) Rn+i = Hn+i =
98 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 38. Пусть t0(x) = 1 и tk(x) = a;L3xjr2A:/3ltLfc/3j(3x), где и = е2™/3. Тогда tk(x) обращается вокруг начала раз при увеличении х от 0 до 1. Если Sk(x) = a;L3fcxJ является третичным аналогом функции Радемахера гк(х), то имеем tk(x) — Ylj>0 Sj+i(x)bj~bj+1, когда к = (6n_i... 6о)з, как в модулярном третичном коде Грэя. 39. (а) Воспользуемся символами {хо, х\,..., Х7} вместо {а, 6, с, d, е, /, д, h}. Нам нужно найти такую перестановку р of {0,1,...,7}, что матрица с (—1)J' kxp(j)®k в строке j и столбце к имеет ортогональные строки. Это условие эквивалентно требованию, что U + з) • Ыз) + p(f)) = 1 (п0 модулю 2) для 0 < j < f < 8. Одно решение имеет вид р(0)...р(7) = 01725634, что дает (а2 + Ь2 + с2 4- d2 4- е2 4- /2 + / + ^)(А2 + Б2+С2+^2+^2 + ^2+С2+я2)=Д2+Б2+С2+р2+52+:Г2+д2+н25 где 1 а Ь с d е / д h ч в Ъ —а d —с f —е h -д В с h 9 -f —е d с -ъ —а С V с -d —а Ь д -h —е f D е = f е h д -ь —а -d —с Е F 9 -h е -/ —с d —а Ь F Q d с -Ъ —о -h -д f е G \ е -/ -д h —а Ь с -d ) \н) (Это тождество было открыто К. Ф. Дегеном [см. Memoires de Г Acad. Sci. St. Petersbourg (5) 8 (1818), p.207-219]. Связанные октонионы рассматриваются в интересном обзоре Дж. К. Баец [см. Bull. Amer. Math. Soc. 39 (2002), p. 145-205; 42 (2005), р.213, р.229- 243]. Кватернионы и октонионы рассматриваются также в книге Дж. X. Конвэя и Д. Э. Смита, [J. Н. Conway, D. A. Smith, On Quaternions and Octonions (2003)]. (b) Решения для 16 x 16 не существует. Ближайшее решение имеет вид р(0) . . . р(15) = 0 1 11 2 14 15 13 4 9 10 7 12 5 6 3 8, которое нарушается тогда и только тогда, когда j ф f = 5. (Дж. Дж. Сильвестр (J. J. Sylvester) в §9-11,13 своей статьи [Philos. Mag. 34 (1867), р.461-475] доказал основные результаты, которые теперь известны как преобразование Адамара, хотя сам Дж. С. Ада- мар ссылается на Сильвестра [Bull, des Sciences Mathematiques (2) 17 (1893), p.240-246]. Более того, Сильвестр вводит преобразование тп элементов в §14, используя т-е корни единицы.) 40. Да; это изменение действительно проходило бы через переставленные подмножества в лексикографическом двоичном порядке, а не в двоичном порядке Грэя. (Любая матрица 5 х 5 из 0 и 1, которая не является сингулярной по модулю 2, будет генерировать все 32 варианта при обходе всех линейных комбинаций ее строк.) Наиболее важным аспектом является внешний вид масштабной функции или некоторой другой дельта-последовательности кода Грэя, а не тот факт, что только один элемент aj изменяется на каждом этапе, в таких случаях, как здесь, когда любое количество aj может меняться одновременно при тех же затратах. 41. Самое большее 16, например fired, fires, finds, fines, fined, fares, fared, wares, wards, wands, wanes, waned, wines, winds, wires, wired. Точно так же 16 слов можно получить на основе paced/links и paled/mints и, возможно, на основе смешения слова с несловом-антиподом. 42. Предположим, что n<22r+r + lHS = 2r. Используем вспомогательную таблицу 2r+s битов fjk для 0 < j < 2s и 0 < < s, представляющую указатели фокуса, как в алгоритме L, вместе со вспомогательным s-битовым регистром j = (js-i •. - job и (г 4- 2)-битовым
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 99 счетчиком программы р = (pr+i .. - РоЬ- На каждом этапе проверяем счетчик программы и, возможно, j-ft регистр и один из / битов. Затем на основе просмотренных битов дополняем бит кода Грэя, дополняем бит счетчика программы и, возможно, изменяем j или / бит, таким образом, эмулируя этап L3 по отношению к наиболее значимым п — г — 2 битам. Например, существует конструкция для г = 1: p2p1p0 Изменить Установить p2p1p0 Изменить Установить ООО а0,ро jo <г- /00 \ . ^_ f 110 а0,ро fjo <- /0+1)0 0 0 1 ai,pi jo «- /00 \ . r 110 a0,po fjo <- /0+1)0 \ f , r ji <- /01 J ' <" /0 HI ai.pi /я 4- / +- Л+1 Oil a0,po /00 <- 0 1 f ft 101 a0,po /0+1)0 <- 0+l)o 1 f . , 0 1 0 a2,p2 /01 *- 0 J 70 *~ U 10 0 a,+3,P2 /0+i)i +- (jH-l)i J ^ Этот процесс прекращается, когда предпринимается попытка изменить бит ап. (На самом деле нужно изменить только один вспомогательный бит за этап, если допустить проверку только некоторых двоичных битов Грэя и вспомогательных битов, поскольку рг .. .ро = ar ... ао, и можно установить /о 4- 0 более эффективным способом, когда j еще не принимает свое итоговое значение 2s — 1. Эта конструкция, предложенная М. Л. Фредманом (М. L. Predman) в 2001 году, лучше предложенной им же ранее [см. SICOMP 7 (1978), р. 134-146.] С помощью улучшенной конструкции можно сократить количество вспомогательных битов до 0{п).) 43. Это количество было оценено Дж. Сильверманом, В. Э. Виккерсом и Дж. Л. Сэмпсоном [IEEE Trans. IT-29 (1983), р.894-901] и оказалось равным 7 х 1022. Можно выполнить и точное вычисление, поскольку каждый 6-битовый цикл Грэя имеет только пять или менее сегментов, которые лежат в 5-кубе, соответствующем по крайней мере одной из шести координат. (В своей неопубликованной работе Стив Винкер использовал аналогичную идею для оценки d(5) за менее чем 15 минут на типичном компьютере в 1972 году.) 44. Все (п+1)-битовые дельта-последовательности только с двумя случаями координаты j получаются с помощью следующей конструкции: пусть 6\ ... S2^-i и е\ ... £2n-i являются n-битовыми дельта-последовательностями для путей Грэя с 2dl 0 • • • 0 2(52n_1 = 2£1 0 • • • 0 2^2^-1 Создайте цикл 5k+l • . • 62™-! Tl£i . . . €2п-1 п5\ ... Sk для некоторых к с 0 < к < 2П, затем поменяйте п j. Все (п + 2)-битовые дельта-последовательности только с двумя случаями координат h и j (с h перед j) аналогично получаются на основе четырех n-битовых последовательностей Si.. • •., г)1 • • -v2n-i, где 2Sl 0 • • • 0 277271-1 = 0 заменой n^/inn + l^JB 6k+i • •. <fen-iraei ... £2»-i(n+l)Ci • • • С2п-1пг}1 ... 772^-1 (n+l)£i ... Sk. Пусть а(п) и b(n) являются количествами n-битовых циклов, определенных в пунктах (а) и (Ъ); тогда (о(1),..., а(5)) = (1,0,0,1920,318996480) и (6(1),..., 6(5)) = (0,2,12,384, 4200960). Приведенные выше конструкции доказывают, что а(п 4- 1) 4- 2o(n 4- 1) = 2п(п + 1)Л(п) и 6(п + 2) = 2п(п 4- 2)(n -I- 1)В(п), если существуют способы Л(п) и В(п) выбрать соответствующие последовательности S, е, С и Если ограничиться случаями, где пути Грэя расширяются до циклов Грэя с So = so = Со = Щ, то получим последовательности o'(n + 1) и Ь'(п 4- 2), где а'(п 4-1) 4- 26'(™ + 1) = 2n(n 4- l)d(n)2/n и 6'(п 4- 2) = 2п(п + 2)(п 4- l)d(n)4/n3. 45. Имеем d(n4-1) > 2nd(n)2/n, поскольку 2nd(n)2/n является более низкой границей для количества (п+1)-битовых дельта-последовательностей с точно двумя появлениями 0. Следовательно, din + iy/*71*1 > d(n)!/2n; а d(n) > ^а2*1 для п > 5, где а = (^d(5))1/32 « 2,06.
100 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 На самом деле можно обнаружить еще более быстрый рост, используя предыдущее упражнение, поскольку d(n + 1) > а!(п 4- 1) + Ъ'(п + 1) и b'(n + 1) < §§(n + l)d(n)2/n для п > 5. Следовательно, d(n + 1) > (2n — §f )(n 4- l)rf(n)2/n для га > 5, а итерация этого отношения дает 00 / oc;\l/2n+1 I i\l/2n+1 lim d(n)1/2" > d(5)1/32 nf2"-i) f ^) « 2,3606. n=5 [Cm. R. J. Douglas, Disc. Math. 17 (1977), p.143-146; M. Mollard, European J. Comb. 9 (1988), p.49-52.] Истинное значение этого предела, вероятно, равно оо. 46. Лео Мозер (неопубликованный результат) предположил, что асимптотика имеет вид ~ п/е. До сих пор установлена только верхняя граница около га/\/2; см. ссылку в ответе к предыдущему упражнению. 48. Если d(n, к, v) циклов начинаются с д(0)... g(k — l)vy то это предположение подразумевает, что d(n, к, v) < d(n, к, д(к)), поскольку обратный цикл для цикла Грэя также является циклом Грэя. Таким образом, подсказка следует из d(n) = d(n, 1) и d(ra, к) = б^п' ^'v) I v — ~~ v & ^к } — cnkd(n, к,д(к)) = d(n, к 4- 1). Наконец, d(ra, 2n) = 1, следовательно, d(n) < Y^S^ спк = П£=1 = nilfc=i(^(n _ к))&)/2 < n]\lz\{n/2)&) = п(п/2)2П~2 [см. IEEE Trans. IT-29 (1983), р.894-901]. 49. Возьмите любой путь Гамильтона Р от 0... 0 до 1... 1 в (2п — 1)-кубе, например, как в коде Сэвидж-Винклера, и используйте OP, IP. (Все такие циклы получаются с помощью такой конструкции, когда п = 1 или п = 2, но гораздо больше возможностей существует, когда п > 2.) 50. a1(n+l)a?na1j1a2na2(n+l)a2 • • • 3i-iaino4 (n+])oiin&f 3i-i • • • 3\а\ n- 51. Можно предположить, что п > 3 и имеется га-битовый цикл Грэя с количеством переходов Cj = 2|_(2n_1 4- j)/n\. Нужно создать (га + 2)-битовый цикл с количеством переходов c'j = 2|_(2n+1 + j)/(n + 2)J. Если 2n+1 mod (n + 2) > 2, то можно применить теорему D с / = 2[2п+1/(п + 2)J + 1) подчеркивая bj копий из j, где bj = 4|_(2n_1 + j)/n\ — L(2n+1 4- j)/(n + 2)J — [j = 0], и размещая подчеркнутый 0 последним. Это всегда просто сделать, поскольку \bj — 2n+2/ra(n 4- 2)| < 5. Аналогичная конструкция работает, если 2n+1 mod (га 4- 2) < га, с I = 2[2n+1/(n 4- 2)J - 1 и = 4[(27г~1 4- j)/n\ - [(2n+1 4- j 4- 2)/(n 4- 2)J ~ [i = 0]. Действительно, 2n+1 mod (n 4- 2) всегда < га [см. К. Kedlaya, Electronic J. Combinatorics 3 (1996), комментарий к #R25 (9 апреля 1997 года)]. Основная идея этого доказательства принадлежит Дж. П. Робинсону и М. Кону [см. IEEE Trans. С-30 (1981), р.17-23]. 52. Количество разных конструкций кода в наименьших положениях координаты j не более со Ч V Cj-\. 53. Обратите внимание на то, что в теореме D рождаются только циклы с Cj = Cj+\ для некоторого j, поэтому не могут возникать числа (2,4,6,8,12). Расширение упр. 50 дает также Cj = с7+1 — 2, но оно не приводит к (6,10,14,18,22,26,32). Наборы чисел, удовлетворяющие условиям упр.52, — точно такие, которые получаются, начиная с {2, 2,4,..., 2П_1}, с повторной заменой некоторой пары {cj,Ck} с Cj < Ск парой {с31 Ч- 2, ск — 2}. 54. Возьмем значения {pi,... ,рп} и допустим, что Xjk является количеством раз, когда Pj встречается в (ai,..., ак). Получим (xik,..., хпк) = (хц,..., xni) (по модулю 2) для некоторого к < I. Но если р являются простыми числами, варьирующимися как дельта- последовательность п-битового цикла Грэя, то единственным решением является к = 0 и I = 2п [см. АММ 60 (1953), 418; 83 (1976), р.54].
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 101 56. [Bell System Tech. J. 37 (1958), p.815-826.] 112 канонических дельта-последовательностей дают следующее. Класс Пример t Класс Пример t Класс Пример t А 0102101302012023 2 D 0102013201020132 4 G 0102030201020302 8 В 0102303132101232 2 Е 0102032021202302 4 Н 0102101301021013 8 С 0102030130321013 2 F 0102013102010232 4 / 0102013121012132 1 Здесь В является сбалансированным кодом (рис. 13,6), G является стандартным двоичным кодом Грэя (рис. 10,6), а Н — дополняющим кодом (рис. 13,а). Класс Н также является эквивалентным модулярному (4,4) коду Грэя в соответствии с упр. 18. Класс с t автоморфизмами соответствует 32 х 24/t из 2688 разных дельта-последовательностей SoSi ... £15. Аналогично (см. упр. 7.2.3-00) 5-битовый цикл Грэя относится к 237 675 разным классам эквивалентности. 57. Только для типа 1 изолированными являются 480 вершин, а именно вершины классов D, F, G в предыдущем ответе. Только для типа 2 граф имеет 384 компонента, 288 из которых являются изолированными вершинами классов F и G. Есть 64 компонента размера 9, каждый из которых содержит 3 вершины из Е и б — из Л; 16 компонентов размера 30, каждый из которых содержит 6 вершины из Н и 24 — из С; 16 компонентов размера 84, каждый из которых содержит 12 вершины из D, 24 — из В, 48 — из /. Только для типа 3 (или типа 4) весь граф является связным. (Аналогично все 91 392 4-битовых путей Грэя являются связанными, если путь ар считается смежным для пути aR/3. В. Э. Виккерси Дж. Сильверман [IEEE Trans. С-29 (1980), р.329-331] предположили, что изменения типа 3 достаточно для связывания графа n-битовых циклов Грэя для всех п > 3.) 58. Если некоторая непустая подстрока РР включает каждую координату четное количество раз, то такая подстрока не может иметь длину \(3\, поэтому некоторый циклический сдвиг /3 имеет префикс 7 с тем же свойством четности. Но тогда а не определяет цикл Грэя, поскольку можно обращать в 0 каждое значение п из 7. 59. Если а является нелокальным в упр. 58, то нелокальным является и /3/3 при условии, что q > 1 и 0 возникает больше чем q 4-1 раз в а. Следовательно, начиная с а из (30), но с 0 и 1, которые поменялись местами, получим нелокальные циклы для п > 5, в которых координата 0 изменяется точно шесть раз [см. Mark Ramras, Discrete Math. 85 (1990), р.329-331]. С другой стороны, 4-битовый цикл Грэя не может быть нелокальным, поскольку он всегда имеет проход длины 2; если Sk = Sk+2, то элементы {vk-i, Vk, Vk+i, ^fc+2} образуют 2-подкуб. 60. Используйте конструкцию из упр. 58 с q = 1. 61. Идея состоит в том, чтобы перемежать га-битовый цикл U = (uo, ui, U2,...) с n-битовым циклом V = (vo, vi,V2,...) с образованием конкатенации W = (ui0v-,0, m1Vj1, ui2Vj2, ...), ik = ао -\ hafc-i, jk = ао H hafc-i, где aoaia2... является периодической строкой управляющих битов ааа Если ак = 0, то продвигаемся к следующему элементу С/, в противном случае — к следующему элементу V. Если а является любой строкой длины 2т < 2П, содержащей s бит из 0 и t = 2m — s бит из 1, то W будет (га 4- побитовым циклом Грэя, если s nt являются нечетными. Имеем ik+i = ik (по модулю 2т) и jk+i = jk (по модулю 2П), только если / кратно 2т, так как ik 4- jk = к. Допустим, что Z = 2тс, тогда jk+i = jk + tc, так что с кратно 2п. (а) Пусть а = 0111; тогда серии длины 8 возникают в левых 2 битах, а серии длины > [|r*(n)J — в правых п битах.
102 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 (Ь) Пусть s является самым крупным нечетным числом < 2rnr(m)/(r(m) + г(п)). Предположим, что t = 2m - s и ак = [(к + l)t/2m\ - \kt/2rn\, так что гк = \кз/2т] и jk = [kt/2rn\. Если серия длины / возникает в левых т битах, то имеем ik+i+i > ik 4- r(m) 4-1, следовательно, I 4-1 > 2rnr(m)/s > r(m) 4- r(n). А если она возникает в правых п битах, то имеем jfc+j+i > jk + f{n) 4- 1, следовательно, Z + 1 > 2mr(n)/* > 2mr(n)/(2mr(n)/(r(m) 4- r(n)) 4- 2) / \ . / \ 2(r(m) 4- r(n))2 ^ / \ , / ч 1 = r(m) 4- r(n) — / \ L, /\ / чч > rim) 4- r(n) — 1, v f y ' 2mr(n) 4- 2(r(m) 4- r(n)) v ; v ' поскольку r(m) < r(n). Эта конструкция часто работает также в менее ограниченных случаях. Более подробно серии в коде Грэя рассмотрены Л. Годдином (L. Goddyn), Дж. М. Лоуренсом (G. М. Lawrence) и Э. Немет (Е. Nemeth) [Utilitas Math. 34 (1988), р.179-192]. 63. Установить ак «— к mod 4 для 0 < к < 210, за исключением того, что ак = 4, если /с mod 16 = 15, или к mod 64 = 42, или к mod 256 = 133. Также установить (joJji,J2,ja,J4) «— (0,2,4,6,8). Затем для к = 0, 1, ..., 1023 установить Jfc «— jafc и jafc «—14- 4afc — jak. (Эта конструкция обобщает метод из упр. 61.) 64. (а) Каждый элемент ик появляется вместе с {vk,Vk+2™,...,^fe+2m(2n-1-i)} и {^fc+i, ^fc+i+2m,..., Vk+i+2rn(2n-1-i)}- Таким образом, перестановка ао ... cr2m-i должна быть 2п~1 -циклом n-битовых четных вершин, который умножен на произвольную перестановку других вершин. Это условие является достаточным. (b) Пусть Tj является такой перестановкой, что v i-4 v 0 2J, и пусть ttj(u,w) является перестановкой (uw)tj . Если и 0 ги = 2г 4- 2J1, то 7Г/ (г/, ги) принимает н->> 0 2г и ги ги 0 2г, тогда как г; i->- v®2J для всех других вершин v, что переводит каждую вершину в соседнюю. Если S является произвольным множеством С {0,...,n — 1}, то пусть cr(S) является потоком всех перестановок tj для всех j € {0,... ,п — 1} \ 5, в порядке возрастания j, повторенном дважды. Например, если п = 5, то имеем: <т({1,2}) = т0т3т4т0т3т4. Тогда поток Грэя E(t,j,u) = cr({t, Л)7г,-(и,1*е2*02^а({«,Л)г^Ш}) состоит из 6п—8 перестановок, произведение которых является транспозицией (и w02*02J). Более того, если этот поток применяется к любой n-битовой вершине г>, то все его серии имеют длину п — 2 или больше. Можно предположить, что п > 5. Пусть 6о • • .<bn-i является дельта-последовательностью для n-битового цикла Грэя (г?о, v\,..., V2n-i) со всеми сериями длины 3 или больше. Тогда произведение всех перестановок в 2тг-1_1 Е = JJ (S(^2fc-l,^2fc,^2fc-l) E($2fc,<$2fc+bv2fc)) fc=l имеет вид (v\ г>з)(г>2 va) ... (г>2™-з ^2^-0(^2^-2 г;о) = (г>2*-1 . •. ^i)(v2"-2 ... vo), т.е. удовлетворяет условию цикла (а). Более того, все степени (<т(0)Е)* порождают серии длины > п — 2, когда применяются к любой вершине v. Повторяя отдельные множители сг({г, j}) или cr({j}) в Е столько, сколько нужно, можно настроить длину <т(0)£, получая 2п4-(2п-1 — 1)(12п—16)Ч-2(п—2)а+ 2(п —1)6 для любых целых чисел а, 6 > 0. Таким образом, можно точно увеличить ее длину до 2т, при условии, что 2т > 2n4-(2n_1— 1)(12гг— 16)4-2(гг2 — 5п-Ьб), согласно упражнению 5.2.1- 21. (c) Ограничение r(n) > п — 41gn + 8 может быть доказано для п > 5 следующим образом. Сначала заметим, что оно справедливо для 5 < п < 33, согласно методу из
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 103 упр. 60-63. Затем можно заметить, что каждое целое число N > 33 можно записать в виде N = т 4- га или N = т 4- га 4- 1 для некоторого т > 20, где га = т — |_4 lg rraj 4-10. Если т > 20, то 2т является достаточно большим, чтобы была верна конструкция в п. (Ь). Следовательно, r(N) > r(m + n) > 2min(r(rra),ra - 2) > 2(тта - |_41gmJ +8) = га 4- га 4- 1 - |_41g(m + га) - 1 4- е\ + 8 > iV-41g7V + 8, где б = 41g(2m/(m + n)) < 1 [см. Electronic Journal of Combinatorics 10 (2003), #R27, p.1-10]. Действительно, рекурсивное применение (b) дает r(1024) > 1000. 65. Компьютерный поиск дает восемь существенно разных возможных структур (и их обратные структуры). Одна из них имеет дельта-последовательность 0102031420302404 1234214103234103 и достаточно близка к двум другим. 66. (Решение Марка Кука) Одной такой дельта-последовательностью является 01234560 701213243565760710213534626701537412362567017314262065701342146560573102464 537571020435376140736304642737035640271327505412102756415024036542501360254 161560431257603257204315762432176045204175163547670356475706254372421326241 61523417514367143164314. (Решения для п > 8 все еще неизвестны.) 67. Пусть V2k+i = V2k и V2k = Oiifc, где (uo,ui,... ,U2"-i) является произвольным (п — 1)- битовым циклом Грэя [см. J. P. Robinson, М. Cohn, IEEE Trans. С-30 (1981), р.17-23]. 68. Да. Простейший способ, вероятно, состоит в том, чтобы взять (га — 1)-тритовое число и добавить 0...0, 1...1, 2. ..2 в каждую строку (по модулю 3). Например, для п = 3 код имеет вид 000, 111, 222, 001, 112, 220, 002, ПО, 221, 012, 120, 201, ..., 020, 101, 212. 69. (а) Необходимо проверить только те изменения в /г, когда биты b^-i .. .bo являются одновременно дополненными для j = 1, 2, И такими изменениями являются соответственно (Ш0)2, (П01)2, (0111)2, (Ю11)2, (10011)2, (100011)2, .... Для доказательства того, что возникает каждый п-кортеж, заметим, что 0 < h(k) < 2П, где 0 < к < 2п и п > 3. Кроме того, hl~l\(an-i ... ао)г) = (bn-i . •. ^0)2, где бо = ао 0oi 0аг 0 • • •, Ь\ — ао, 62 = CL2 0 аз 0 а4 0 • • •, &з = ао 0 а\ 0 аз 0 • • • и bj = aj 0 а^+i 0 • • • для j > 4. (b) Пусть h(k) = (... а2а1ао)2, где а-, = bj 0 fy+i 0 bo[j < t] 0 bt-i[t — 1 < j < t]. 70. Как в (32) и (33), можно удалить п!, предполагая, что строки с весом 1 упорядочены. Тогда есть 14 решений для п = 5, начинающихся с 00000, и 21 решение, начинающееся с 00001. Для п = 6 существует 46 935 решений каждого типа (связанных обращением и дополнением). Для п = 7 количество решений очень велико, гораздо больше, но очень мало по сравнению с общим числом 7-битовых кодов Грэя. 71. Допустим, что an(J_(_1) отличается от anj в координате tj для 0 < j < п — 1. Тогда tj = J7rn, согласно (44) и (38). Теперь (34) означает, что to = га — 1. И если 0 < j < га — 1, то имеем: tj — ((j — l)7rn-i)7rn_i согласно (40). Таким образом, tj = j<yn^n-i для 0 < j < га—1, а значение (га — 1)тгп определяется тем, что осталось. (Обозначения этих перестановок чрезвычайно сложные, поэтому рекомендуется всегда тщательно проверять их на простых случаях.) 72. Дельта-последовательность имеет вид 0102132430201234012313041021323.
104 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 73. Пусть Qnj = Pnj, и обозначим (41) и (42) как Sn и Тп. Таким образом, Sn = PnoQn\Pn2 ... и Тп = QnoPniQn2 ..., если опустить запятые. Тогда имеем: Sn+i = ОРпо 0Qnl IQlo 1Р£ 0Pn2 0Qn3 lQn2 lP^ 0Pn4 ..., Tn+i = 0QnO 1P%> 0Pnl 0Qn2 1P;2 0Pn3 0Qn4 1QZ8 . • •, где 7г = 7гп, которые демонстрируют сравнительно простую совместную рекурсию между дельта-последовательностями Ап и £п из 5П и Гп. А именно, если записать An = Ф\ сь\ ф2 cl2 • • . фп-1 cln-1 Фп, Еп = ф\ °1 фг 62 . . . &п-1 фп, где все 0j и ф3 являются строками длины 2(™Z\) — 1, то следующие последовательности имеют вид Дп+1 = Ф\ 0>1 ф2 П фхТГ &17Г 1/>27Г 71 фз аз 04 п г^зтт бзтг -047Г n . . . #п+1 = ф\ П П "02 Ь2 П 027Г а27Г фзТГ П Фа 64 ч/?5 П 047Г а47Г 057Г П . . . Например, имеем: Аз = 0102101 и Ез = 0212021, если подчеркнуть а и 6, чтобы отличить их от </> и ф; и А4 = 010213 07г27г17г27г0тг 313 1тг = 01021321012313 0, Е4 = 03 Отг 3120213 07г2тг17г07г17г = 03231202132102 0; где аз Фа и 63^4 — пустые. Элементы подчеркнуты для следующего этапа. Таким образом, дельта-последовательности можно подсчитать следующим образом. Здесь p[j] = j7tn для 1 < j < n; sk = 6k, tk = ek и uk = [Sk и ек подчеркнуты] — для 0 < к < 2п- 1. R1. [Инициализировать.] Установить п «- 1, р[0] 0, so <— to <— uq «— 0. R2. [Продвинуть п.] Выполнить алгоритм S, приведенный ниже, который вычисляет массивы s', t' и г/ для следующего п. Затем установить n «— n И-1. R3. [Готово?] Если п достаточно велико, нужная дельта-последовательность Ап находится в массиве s'\ завершить. В противном случае продолжить выполнение. R4. [Вычислить тсп.\ Установить р'[0] = п — 1 и p'[j] = p\p[j — 1]] для 1 < j < п. R5. [Подготовиться к продвижению.] Установить p[j] <- p'[j] для 0 < j < п; установить sk <— £fc «— и <— u'k для 0 < & < 2n — 1. Вернуться к R2. | На следующих этапах выражение "Передавать нечто(/, j), пока щ = 0" означает: "Если щ; = 0, повторно выполнять He4To(/,j), / «— Z 4- 1, j <— j 4-1, пока не выполняется условие 51. [Подготовиться к вычислению Ап+ь] Установить j <— /с <— / «— 0 и гх2п_х « 1. 52. [Продвинуть j.] Передавать s\ <— s3 и u\ «— 0, пока u3 = 0. Затем перейти к S5, если и3 < 0. 53. [Продвинуть j и к.] Установить s'i <— Sj, u\ i— 1, I <— I 4- 1, j «— j'4- 1. Затем передавать s'j «— Sj и гл^ «— 0, пока Uj = 0. Затем установить s\ «- п, <— 0, / «— / 4- 1. Затем передавать s\ <— p[tk] и u\ «— 0, пока uk = 0. Затем установить s\ <- p[tk], u\ «— 1, / «- I 4- 1, к «— к + 1. И еще раз передавать s\ «— p[ifc] и гг^ <— 0, пока Uk = 0. 54. [Готово с Дп+1?] Если Wfc < 0, то перейти к S6. В противном случае установить s'i «— n, ttj «— 0, / <— / 4-1, j <— j 4-1, к «— /с 4-1 и вернуться к S2. 55. [Завершить Ап+ь] Установить ^— гг, гл'| 1, / <— I 4- 1. Затем передавать s'j р[^[А;]] и и\ <— 0, пока life = 0.
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 105 56. [Подготовиться к вычислению En+i.] Установить j <— к <— I 4— 0. Передавать t\ *~ tk, пока Uk = 0. Затем установить t\ <— n, I <— I + 1. 57. [Продвинуть j.] Передавать ij «— p[sj], пока % = 0. Завершить, если щ < 0. В противном случае установить t\ «— п, I / + 1, j <- j + 1, <— А; + 1. 58. [Продвинуть /е.] Передавать t\ «- £fc, пока ик = 0. Затем перейти к S10, если ик < 0. 59. [Продвинуть к и j.] Установить t\ <— tk, I <- I + 1, /с «— /с -Ь 1. Затем передавать 4- tk, пока itfc = 0. Затем установить t\ «— га, / <— I + 1. Затем передавать i'z ^— p[5j]j пока ti-, = 0. Затем установить t\ <— p[sj], I <— I + 1, j «— j + 1. Вернуться к S7. S10. [Завершить En+i-] Установить t\ «— n, / <— Z-f-1. Затем передавать «— p[sj], пока = 0. I Для генерации монотонного кода Сэвидж-Винклера для достаточно больших га можно сначала сгенерировать Дю и Ею или даже Д20 и Е2о- С помощью этих таблиц подходящая рекурсивная процедура сможет достигнуть высоких значений га с очень малыми вычислительными накладными расходами в среднем на один этап. 74. Если монотонный путь имеет вид vo> ..., i^-i и если vk имеет вес j, то имеем: 2 Е ( л "о,) + (0' + "Ы) mod 2) < * < 2 £ ( " ) + ((j + i/(t*)) mod 2) - 2. Следовательно, максимальное расстояние между вершинами весов j и j + 1 равно 2((™rJ) + (п71) + (7+1)) - 1. Максимальное значение, приблизительно равное 3 • 2п/\/27гп, возникает, если j приблизительно равно п/2. (Оно всего в три раза больше наименьшего значения, достижимого в произвольном упорядочении вершин, которое равно S"=o (b/2j) согласно упр. 7.10-00). 75. Есть только пять существенно различных решений, все из которых действительно являются циклами Грэя. Эти дельта-последовательности имеют вид 0123012421032101210321040123012(1) 0123012421032101301230141032103(1) 0123012421032102032103242301230(2) 0123012423012302012301242301230(2) 0123410121030143210301410123410(3) 76. Если г>о, • • •, У2"-1 не имеет тренда, то не имеет тренда (га -I- 1)-битовый цикл 0vo, lvo, Ivi, Ovi, 0v2, 1г>2, ..., lv2«-i, 0г>2п-ь На рис. 14,д показана более интересная конструкция, которая обобщает первое решение упр. 75 до (га + 2)-битового цикла: 00Г"Я, 01Г,Я, ИГ', ЮГ", ЮГ, ИГ'", 01Г"'Я, 00ГЯ, где Г является n-битовой последовательностью д(1), д(2п~1) и Г' = Г 0 р(1), Г" = Г0<7(2П-1), Г"' = Г0р(2п_1-|-1). (n-битовая структура без тренда, которая почти является кодом Грэя, имеющая только четыре этапа, на которых v(vk®Vk+\) = 2, была найдена для всех п > 3 К. С. Ченгом [см. Proc. Berkeley Conf. Neyman and Kiefer 2 (Hayward, Calif.: Inst, of Math. Statistics, 1985), p.619-633].) 77. Замените массив (on-i, • •., 00) массивом сигнальных значений (sn-i, • • •, so) с Sj <— mj — 1 на этапе HI. Установите aj <— (aj + 1) mod mj на этапе H4. Если aj — Sj на этапе Н5, то установите Sj «— (sj — 1) mod mj, fj <- fj+i, fj+\ <— j + 1.
106 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 78. Обратите внимание на то, что Bj+\ в (50) является количеством отражений (рефлексий) в координате j, поскольку координата j пропускается на этапах, кратных rrij .. .то. Следовательно, если bj < mj, то увеличение bj на 1 приводит aj к увеличению или уменьшению на 1. Более того, если bi = ra« — 1 для 0 < г < j, то замена все этих Ьг на 0 при увеличении на 1 bj приведет к увеличению каждого Во, ..., Bj на 1, оставляя таким образом значения ао, ..., aj-i неизменными в (50). Обратите внимание на то, что в (51) выполняется Bj = mjBj+i+bj = mjBj+i+aj + (mj — l)Bj+i = aj + Bj+i (по модулю 2). Следовательно, Bj = aj + aj+i + • • •, и (51) очевидно эквивалентны (50). В модулярном коде Грэя для общего основания (ran-i,..., mo) допустим дПЛ _ ап-1> • • • , &2, а1> а0 1 Lran-i, . •., тг, mi, raoJ' когда к определяется (46). Тогда aj = (bj — Bj+i) modmj, поскольку координата j увеличена по модулю mj точно Bj — Bj+\ раз, если начать с (0,... ,0). Обратная функция, которая определяет b на основании модулярного кода Грэя а, имеет вид bj = (aj + oj+i + а^+2 Н ) mod mj в особом случае, когда каждое mj является делителем т3+\ (например, если все mj равны). Но в общем случае обратная функция не имеет простоого вида. Ее можно вычислить с помощью рекуррентных соотношений bj = (aj + Bj+i) mod mj, Bj = mjBj+i + bj для j = n — 1, ..., 0, начиная с Bn = 0. (Отраженный (рефлексивный) код Грэя для основания т > 2 предложен Иваном Флоресом [см. IRE Trans. ЕС-5 (1956), р.79-82]. Он вывел (50) и (51) для случая, когда все mj равны. Модулярный код Грэя с общим смешанным основанием неявно обсуждался Джозефом Розенбаумом [см. АММ 45 (1938), р.694-696], но без формул преобразования. Формулы преобразования для всех mj, имеющих общее значение т, опубликованы Мартином Коном [см. Info, и Control 6 (1963), р.70-78].) 79. (а) Для последнего п-кортежа всегда выполняется ап-\ = mn-i — 1, поэтому он находится на расстоянии одного шага от (0,... ,0), только если тп-\ = 2. А это условие является достаточным для финального п- кортежа (1,0, ...,0). (Аналогично финальный подлее из вывода алгоритма К является смежным к исходному тогда и только тогда, когда самое левое дерево является изолированной вершиной.) (Ь) Последний п-кортеж имеет вид (mn-i — 1,0,..., 0) тогда и только тогда, когда mn_i ... mj+i mod rrij = 0 для 0 < j < n — 1, поскольку bj — m0 — 1 и Bj — mn_i ... m3\ — 1. 80. Пройдите все p"1 .. с помощью отраженного кода Грэя с основаниями mj = е3; +1. 81. Первый цикл содержит ребро от (х, у) до (х, (у 4-1) mod т) тогда и только тогда, когда (х + у) mod т ф т — \, тогда и только тогда, когда второй цикл содержит ребро от (х, у) до ((ж + 1) mod га, г/). 82. Существуют два 4-битовых цикла Грэя (uo,..., г^б) и (г>о,..., vib), которые покрывают все ребра 4-куба. (Действительно, неребра классов А, В, D, Н и I в упр. 56 образуют циклы Грэя в тех же классах, что и их дополнения.) Следовательно, с помощью 16-го модулярного кода Грэя можно образовать четыре искомых цикла: (uouo, uqUi, ..., uoUi5,uiUi5,..., U15U0), (u0Uo,UiUo, . . . ,Ui5U0,Ui5Ui, . . . ,UoUi5), (v0Vo, • • . , V15V0), (v0vo,.. • ,VoVi5). Аналогичным образом можно показать, что существует п/2 n-битовых цикла Грэя типа "ребро-непересечение" для п is 16, 32, 64 и т.д. [см. Abhandlungen Math. Sem. Hamburg 20 (1956), p.13-16.] Дж. Оберт и Б. Шнайдер доказали [см. Discrete Math. 38 (1982), р.7- 16], что аналогичными свойствами обладают все четные значения п > 4, но ни одной простой конструкции неизвестно.
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 107 83. Марк Кук нашел следующее абсолютно несимметричное решение в декабре 2002 года: (1) 2737465057320265612316546743610525106052042416314372145101421737 2506246064173213107351607103156205713172463452102434643207054702 4147356146737625047350745130620656415073123731427376432561240264 3016735467532402524637475217640270736065105215106073575463253105; (2) 0616713417232175171671540460247164742473202531621673531632736052 6710141503047313570615453627623241426465272021632075363710750740 3157674761545652756510451024023107353424651230406545306213710537 2620501752453406703437343531502602463045627674152752406021610434; (3) 3701063751507131236243765735103012042353747207410473621617247324 6505132565057121565024570473247421427640231034362703262764130574 0560620341745613151756314702721725205613212604053506260460173642 6717641743513401245360241730636545061563027414535676432625745051; (4) 6706546435672147236210405432054510737405170532145431636430504673 4560621206416201320742373627204506473140171020514126107452343672 1320452752353410515426370601363567307105420163151210535061731236 4272537165617217542510760215462375452674257037346403647376271657. (Каждая из этих дельта-последовательностей должна начинаться с той же вершины куба.) Существует ли симметричное решение этого упражнения? 84. Если обозначить исходное положение как (2,2), то решение из 8 этапов будет выглядеть, как показано на рис. А-1, т.е. как последовательность, прогрессирующая до (0,0). На первом этапе, например, передняя половина веревки обходит правую расческу и располагается под ней, потом обходит большую правую петлю. Среднюю линию нужно считывать справа налево. Обобщение до п пар петель, аналогично, требует Зп — 1 этапов. Рис. А-1.
108 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 [Откуда взялась эта замечательная головоломка, не очень ясно. В книге Джерри Слокама и Джека Ботерманса The Book of Ingenious & Diabolical Puzzles (1994) приведена 2-петлевая версия, вырезанная из рога, вероятно, сделанная в Китае приблизительно в 1850 году [р. 101], а также современная б-петлевая версия, сделанная в Малайзии в 1988 году [р. 93]. У Слокама также есть 4-петлевая версия, сделанная из бамбука в Англии в 1884 году. Он нашел ее в книгах Генри Новра [см. Catalogue of Conjuring Tricks и Puzzles (1858 или 1859)] и В. X. Кремера [см. Games, Amusements, Pastimes и Magic, 1867], а также в каталоге В. Хамли 1895 года под названием головоломка "удивительное каноэ". [См. также Патенты США 2091191 (1937), D172310 (1954), 3758114 (1973), D406866 (1999).] Дыкман заметил ее связь с отраженным третичным кодом Грэя в письме к Мартину Гарднеру от 2 августа 1972 года.) 85. Согласно (50), элемент [ J' \> ] произведения Г{Г' имеет вид осаоса,, если д([ J' \, ]) = ["' at, ] в отраженном коде Грэя для оснований (t,tr). Можно показать, что элемент [JjJ/'t"] произведений (Г I Г') J Г" и Г J (Г' I Г") является ааа'а,а^„, если д([\\ = [?; ?"] в отраженном коде Грэя для оснований (t, t', t"). См. упр. 4.1-10 и обратите внимание также на закон смешанного основания: mi... mn — 1 — mi , . . . , Хп 1 _ Г7711 — 1 — Х\, ..., гап — 1 — хп 1 , ..., ran J L rai, • •., ran J В общем, отраженный код Грэя для оснований (mi,...,гап) имеет вид (0,...,mi — 1) \ • • -\ (0,... ,гап - 1) [см. Information Processing Letters 22 (1986), р.201-205]. 86. Пусть Ymn является отраженным га-м кодом Грэя, который определяется Гто = е, и Гт(п+1) = (0,1,..., т - 1) I Гтп, тг > 0. Этот путь проходит от (0,0,..., 0) до (га — 1,0,..., 0) для четного га. Рассмотрим путь Грэя Птп, заданный Пто = 0 и п _/(о,1,— Пт("+1)_ 1(0,1,... m-l)l Птп, тГ(т+1)п, если га нечетно; га) I Птп, гаГ^п, если га четно. Этот путь проходит все (га + 1)п — гап неотрицательные целые тг-кортежи, для которых max(ai,..., an) = га, начинаясь с (0,..., 0, га) и заканчиваясь (га, 0,..., 0). Искомый неограниченный путь Грэя имеет вид П0п) П^, П2п, П^, .... 87. Это невозможно для нечетных тг, поскольку тг-кортежи с max(|ai|,..., |an|) = 1 содержат s(3n + 1) для нечетных и ^(Зп — 3) — для четных. Если тг = 2, то можно использовать спираль Ео, Si, Е2, ..., где Ет закручивается против часовой стрелки от (га, 1 — га) до (га, —га), когда га > 0. Для четных значений тг > 2, если Тт является путем тг-кортежей от (га, 1—га,га—1,1—га,..., га—1,1—га) до (га, —га,га, —га,... ,га, —га), то можно использовать Em I (То,..., Tm_i), (Ео, • • •, Ет)л I Тт для (тг + 2)-кортежей с теми же свойствами, где I является дуальным зигзаговым произведением (dual boustrophedon product): Г У Г' = (а0а'0,... ,at_ia0, at_ia'b ..., a0ai, а0а'2,..., at_ia2, at_ia3,...). (Неограниченные тг-мерные коды Грэя без ограничения величины впервые были получены в работе Э. Вазони [см. Acta Litter arum ас Scientiarum, sectio Scientiarum Mathema- ticarum 9 (Szeged: 1938), p.163-173].) 88. Он снова посетит все подлеса, но в обратном порядке, заканчивая (0,..., 0) и возвращаясь к состоянию, которое было после инициализации на этапе К1. (Этот принцип отражения действительно является ключом к пониманию работы алгоритма К.)
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 109 89. (а) Пусть Mo = е, Mi = •, и Мп+2 = «М^+ь —M„. Эта конструкция работает, поскольку последний элемент Mn+i является первым элементом Mn+i, а именно точкой, вслед за которой идет первый элемент Мя. (Ь) Для заданной строки d\ .. .di, где каждый элемент dj является точкой (•) или тире ( —), можно найти следующий элемент, предполагая к = / — [di = •] и поступая следующим образом: если к нечетно и4 = *, заменить dkdk+i на —; если к четно и dk = —, заменить dfc на • •; в противном случае уменьшить к на 1 и повторять до тех пор, пока не происходят изменения или не достигнуто значение к = 0. Следующей строкой для заданной будет • — — • • • • — • — • _ 90. Цикл может существовать, только если количество слов кода четно, поскольку количество тире изменяется на ±1 на каждом этапе. Таким образом, nmod3 = 2. Пути Грэя Мп из упр. 89 не годятся; они начинаются с (. — )Ln/3-l .n mod3 и заканчиваются (- •)Ln/3J •[n mod 3=1] -[п mod 3=2]. Но Мзк+1 •, M3Rk - является гамильтоновым циклом (Hamiltonian cycle) в графе кода Морзе для п = Зк 4- 2. 91. Эквивалентно п-кортежи (цагазсЦ ... не содержат двух последовательных единиц. Такие п-кортежи соответствуют последовательностям кода Морзе длины п 4- 1, если присоединить 0 и затем представить • и — соответственно элементами 0 и 10. В таком случае можно преобразовать путь Mn+i из упр. 89 в процедуру типа алгоритма К с "каймой" индексов, обозначающими, где начинается каждая точка или тире (за исключением финальной точки). Q1. [Инициализировать.] Установить aj <— — 1) mod6)/3j и fj <— j для 1 < j < п. Также установить /о «— 0, г о «- 1, 1\ <- 0, r3, <— j 4- (j mod 3) и mod 3) «— j для 1 < j < гг, а если j 4- (.7 mod3) > n, то установить r3 <— 0 и lo «— j. ("Кайма" теперь содержит 1, 2, 4, 5, 7, 8, ....) Q2. [Посетить.] Посетить п-кортеж (01,..., ап). Q3. [Выбрать р.] Установить q ч— /о, р <— fq, fq <- q- Q4. [Проверить ар.} Завершить алгоритм, если р = 0. В противном случае установить ар <— 1 — ар и перейти к Q6, если ар 4- р четно. Q5. [Вставить р + 1.] Если р < п, установить g <<— rp, lq <r- р + 1, rp+i ^— g, rp р + 1, /р+1 р. Перейти к Q7. Q6. [Удалить р+1.] Если р < п, установить g «— rp_|-i, rp <- q, lq <— p. Q7. [Сделать p пассивным.] Установить /р «— /zp и ч— /р. Вернуться к Q2. | Этот алгоритм также можно вывести как особый случай значительно большего общего метода Ганга Ли, Фрэнка Раски и Дональда Кнута, который расширяет алгоритм К, позволяя пользователю указать либо ар > ач, либо ар < aq для каждой пары (р, q) типа (родительский, дочерний) [см. книгу Кнута и Раски, Lecture Notes в Computer Science 2635 (2004), p. 183-204]. Обобщение в другом направлении, которое порождает все строки длины п, которые не содержат некоторых подстрок, было открыто М. Б. Сквайром [Electronic J. Combinatorics 3 (1996), #R17, р.1-29]. Забавно, что отображение к к4 д(к)/2 является взаимнооднозначным соответствием между всеми двоичными n-кортежами без серий единиц нечетной длины и всеми двоичными n-кортежами без серий единиц длины 2. 92. Да, поскольку диграф всех (п — 1)-кортежей (sci,..., хп-\) с xi,..., xn-i < m и с дугами (xi,..., Xn-i) —> (#2, • • • > хп) всякий раз, когда max(xi,..., хп) = т является связным и салансированным; см. теорему 2.3.4.2G. Действительно, такая последовательность получается из алгоритма F, если заметить, что финальные элементы кп простых строк длины, делящей п, при вычитании из т — 1 одинаковы для всех т > к. Если п = 4, например,
ПО ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 то первая 81 цифра последовательности Ф4 имеет вид 2 — а = 00001010011..., где а является строкой (62). (Существуют также неограниченные т-е последовательности, первые тп элементов которых являются циклами де Бруийна для всех п, для произвольного фиксированного т > 3 [см. работу Л. Дж. Каммингса и Д. Видемана Cong. Numerantium 53 (1986), р.155-160].) 93. Цикл, генерированный /(), является циклической перестановкой al, где а имеет длину тп — 1 и завершается ln_1. Цикл, генерированный алгоритмом R, является циклической перестановкой 7 = со ... cmn+i_i, где ск = (со + bo + • • • + bk-i) mod т и bo ... bmn+i_1 = Р = amlm. Если жо ... жп возникает в 7, скажем, х3 = ск+3 для 0 < j < п, тогда у3 = Ьк+3 для 0 < j < га, где у3 — (xj+i — х3) modm. (Это связь с модулярным га-м кодом Грэя; см. упр. 78.) Теперь, если уо ... уп-\ = 1п, то имеем: mn+1 — т — п < к < тп+1 — га; в противном случае существует такой индекс к', что —п<к'< тп — п и уо . •. Уп-i возникает в 0 в положениях /с = (/с'+г(гап — 1)) mod rran+1 для 0 < г < т. В обоих случаях т вариантов выбора к имеют разные значения хо, поскольку сумма всех элементов в а равна т — 1 (по модулю т) для га > 2. (Алгоритм R справедлив также для п = 1, если т mod 4^2, поскольку rra _L a в этом случае.) 94. 0010203041121314223243344. (Подчеркнутые цифры вставлены в перемежающиеся строки 00112234 и 34. Алгоритм D можно использовать в общем случае для га = 1 и г = т — 2 > 0; но это бессмысленно делать в связи с (54).) 95. (а) Пусть соС\С2 ... имеет период г. Если г нечетно, то имеем р = q — г, так что г = pq только в тривиальном случае, когда р = q = 1 и ао = bo. В противном случае г/2 = lcm(p, g) = pq/gcd(p,q) согласно 4.5.2-(10), следовательно, gcd(p, q) = 2. В последнем случае 2п-кортежи cici+i ... c/+2n-i будут иметь вид а3Ьк ... a,j+n-ibk+n-i для 0 < j < р, 0 < к < д, j = к (по модулю 2), а Ька3 ... bk+n-ia3+n-i для 0 < j < р, 0 < к < д, j ф к (по модулю 2). (b) В выводе будут перемежаться две последовательности, аоа\ ... и bob\ ..., периоды которых соответственно равны тп + г и mn — г. Последовательность из а образует цикл /() с хп, замененными на хп+1, и последовательность из b образует цикл /' () с хп, замененными на хп~1 для 0 < х < г. Согласно (58) и пункту (а), период имеет длину т2п — г2, а каждый 2п-кортеж возникает с исключением (ху)п для 0 < ж, у < г. (c) Реальный этап D6 изменяет поведение (Ь) на переход к D3, когда t > п, t' = п и 0 < х' = х < г. Это изменение приводит к выводу дополнительного х сразу после вывода х2п~х и перед выводом цифры 6, которая выводится вслед за хп в цикле. D6 также позволяет передать управление D7 и затем D3 с t' = п в случае, когда t>nnx<x' <г. При таком поведении дополнительное х'х выводится сразу после вывода (хх')п~1х и перед выводом Ь. Эти дополнительные г2 цифр дают г2 недостающих 2п-кортежей из (Ь). 96. (а) Рекуррентные соотношения 52 = 1, 52n+i = = 25n, R2 = 0, -R2n+i = 1 + #2n, R2n = 2i?n, D2 = 0, D2n+\ = £>2n = 1 + 2Dn приводят к решению Sn — 2'-Ign-'-1, Rn = n — 2Sn, Dn = Sn — 1. Таким образом, имеем: Sn + Rn + Dn — n — 1. (b) Каждый вывод высокого уровня обычно включает [lg nj — 1 D-активизаций и v(ri) — 1 R-активизаций плюс одна базовая активизация на нижнем уровне. Но со следующим исключением: алгоритм R может вызывать свою сопрограмму /() дважды, если первая активизация завершается последовательностью 1п, а иногда алгоритму R не требуется вызывать /() вовсе. Алгоритм D может вызывать свою сопрограмму /'() дважды, если первая активизация завершается последовательностью (х')п, а иногда алгоритму D не требуется вызывать /() или /;(). Алгоритм R завершает последовательность xn+l тогда и только тогда, когда его дочерняя сопрограмма /() только что завершила последовательность 0П. Алгоритм D завершает
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 111 t+(k\ _ / Mk-l), если 0 < А; < j„+l; _ Г . /n W ~ I /»(*-2), если jn + l <к< 2"+2; In W ~ \ . последовательность х2п для ж < г тогда и только тогда, когда только что совершен переход от D6 к D3 без вызова любой дочерней сопрограммой. На основании этих наблюдений можно заключить, что по крайней мере [lg nj + i/(n) 4-1 активизаций возможно на каждый вывод высокого уровня, если г > 1. Такой случай возникает, когда алгоритм D для п = 6 переходит от D6 к D4. Но для г = 1 можно получить 2[lgnJ 4- 3 активизаций, например, когда алгоритм R для п = 25 переходит от R4 к R2. 97. (а) (ООН), (00011101), (0000101001111011)и(00000110001011011111001110101001). Таким образом, J2 = 2, j$ = 3, j\ — 9, jb = 15. (b) Очевидно, имеем: fn+i(k) = Е/п(/г) mod 2 для 0 < к < jn+n. Следующее значение, /п+i O'n+w), зависит от того, происходит ли переход с этапа R4 на этап R2 после вычисления У — fn(jn+n— 1). Если происходит (а именно, если fn+i(jn+n—1) ф 0), то имеем: fn+\{k) = 1 4- E(fc 4- 1) для jn 4- п < к < 2n + jn 4- п; в противном случае имеем /n+i (к) = 1 4- Е(/с — 1) для таких значений В частности, /n+i(fc) = 1, когда 2п < к + 6п < 2п4-п. Предложенная формула, которая имеет более простые диапазоны для индекса к, справедлива, поскольку 1 4- Я(к ± 1) = E(fc) для jn < к < jn 4- п или 2n + jn < к < 2n+jn 4- п. (c) Перемежаемый цикл имеет Сп (2к) = /+(к) и сп(2/с + 1) = /п (fc), где ' /п(&+1), если 0 < к < jn\ . /n(fc+2), если jn<k< 2n-2; /+(А;) = /„(/с mod (2п 4- 2)), fn(k) = /~(/с mod (2п — 2)). Следовательно, подпоследовательность l2n_1 начинается с положения кп = (2n_1 — 2)(2П+ 2) 4- 2jn 4- 2 в цикле сп; это означает, что J2n нечетно. Подпоследовательность (01)п_10 начинается с положения 1п — (2n_1 4- l)(jn — 1), если jn mod 4 = 1, с положения ln = (2n_1 4- l)(2n4- jn — 3), если jn mod 4 = 3. Также k2 = 6, h — 2. (d) Алгоритм D вставляет четыре элемента в цикл сп. Следовательно, когда jn mod 4 < 3 (ln < кп): когда jn mod 4=3 (кп < In): (Сп(к—1), если 0<fc</n4-2; f Cn(fc—1), если 0<fc</cn +1; Cn(&—3), если Zn+2<A;<A;n+3; =< cn(k—2), если fcn + l<fc</n4-3; Cn(A:-4), если fcn4-3<fc<22n; I Cn(fc-4), если Zn 4-3 <fc<22n. (e) Следовательно, j^n = fcn 4- 1 4- 2[jn mod4<3]. Действительно, элемент, предшествующий l2n, состоит из 2n-2 — 1 полных периодов /^~(), перемежаемых 2П_2 полными периодами f„ (), с одним вставленным элементом 0 и одним вставленным элементом 10, если 1п < кп, за которым следует /п(1)/п(1)/п(2)/п(2)... fn(jn - l)fn(jn - 1). Сумма всех этих элементов нечетна, если не выполняется условие 1п < кп\ следовательно, б2п = l-2[jn mod 4 = 3]. Пусть п = 2*д, где q нечетно и п > 2. Эти рекуррентные последовательности подразумевают, что если q — 1, то имеем jn — 2П-1 4- 6t, где bt = 2*/3 — (—1)*/3. И если q > 1, то имеем jn = 2n_1 ± bt+2, где знак 4- выбирается тогда и только тогда, когда [lg4- [|4g/2Llg9jJ =5] четно. 98. Если f(k) = д(к), когда к лежит в определенном диапазоне, то существует такая константа С, что Е/(А;) = С 4- Ер(/с) для /с в этом диапазоне. Следовательно, можно продолжить и легко вывести дополнительные следствия: если п > 1, то £/2п(А;), когда jn mod 4 < 3 (Zn < кп): когда jn mod 4 = 3 (fcn < In): iEcn(fc-l), если 0 < к < Zn+2; Г Ecn(fc-1), если 0 < /с < fcn + l; l+Ecn(A;-3), если Zn+2 <k< kn+3; = < l + Ecn(fc-2), если fcn + l < < Zn+3; Ecn(fc-4), если fcn4-3 < A; < 22n; I Ecn(/c-4), если Zn+3 < к < 22n.
112 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 Есп(к) = Е/+(Г*/21) + E/-(Lfc/2j). если 0<k<jn\ если jn<k<2n-2; E/±(fc) = [к/(2п ±2)J + E/±(*mod(2n ±2)); Е/„(*) = Е/„(* mod 2n). Zf+(k) = l S/-(A:-1)' если 0<*<in + l; ъг(к) = 1 Vfn(k+1), Jn{ j~\l+E/n(A:-2), если in + KK2n+2; /n 1 ;"\l+E/n(AH-2), E f ГА,л = / EE/2n(fc), если 0 < к < j2n или 22n + j2n < к < 22n+1; /2п+ц |1 + A. + ss/2n(fc + (52n)5 если j2n <fc<22n+J2n. EE/2n(fc), когда jn mod4<3 (1п<кп): когда jn mod4=3 (kn<ln): {EEcn(fc-l), если 0<fc</n+2; ( EEcn(fc-l), если 0<fc<fcn + l; l+fc+EEcn(fc-3), если /n+2<fc<fcn+3; =< l+fc+EEcn(fc-2), если кп + Kfc<Zn+3; EEcn(A;-4), если fcn+3<fc<22n; { l+EEcn(fc-4), если /n+3<fc<22n. EE/2n(A0 = [jn mod4 < 3p/22nJ + EE/2n(fcmod22n). И тогда существует замыкание: EEcn(2A0 = E/+(fc), EEcn(2fc + l) = E/"(fc). Если n = 2*g, когда q нечетно, то время вычисления fn(k) этим методом с использованием рекуррентной формулы равно 0(t + 5(g)), где 5(1) = 1, S(2k) = 1 + 2S(k), и 5(2fc + 1) = 1 + 5(/с). Ясно, что S(k) < 2к, поэтому вычисления содержат не более 0(п) простых операций с га-битовыми числами. На самом деле этот метод часто значительно быстрее. Если усреднить S(k) по всем к с [lgfcj = s, то получим (3S+1 — 2S+1)/2S, который меньше 3fclg(3/2) < Зк° 59. (Между прочим, если к = 2S+1 - 1 - (2s~ei + 2s"62 + • • • + 2s"et), то имеем: S(k) = s +1 + et + 2et-i + 4et-2 H h 2*ei.) 99. Строка, которая начинается с места к, в /п() начинается с места к+ = к + I + [к > jn] в fnO и с места А;- = /г — 1 — [к > jn] в /~(), за исключением того, что 0П и 1п встречаются дважды в fn(), но их нет совсем в /~ (). Чтобы найти 7 = ао&о ... an-ibn-i в цикле /2п(), допустим, что а = ао ... an-i и /3 = bo...bn-i. Допустим, что а начинается с места j, а /3 — с места к в /п(). Предположим, что ни а, ни (3 не равно 0П или 1п. Если j+ = к+ (по модулю 2), предположим, что 1/2 является решением уравнения j* + (2n+2)x = к~ + (2п— 2)у. Можно получить 1/2 — к+(2п— 2)(2n~3(j - к) mod (2n_1 + 1)), если j > к, а в противном случае 1/2 =j + (2П+ 2)(2п~3(к - j) mod (2n_1 -1)). В противном случае допустим, что (/-1)/2 = к+ + (2n+ 2)х = + (2П- 2)2/. Тогда 7 начинается с места / в цикле сп(), т.е. с положения / + 1 + [I > кп] + 2[1 > 1п] в цикле /2п()- Аналогичные формулы справедливы, когда справедливо a £ {0П,1П} или /3 € {0П, 1п} (но не оба сразу). Наконец, 02п, 12п, (01)п и (10)п начинаются соответственно с мест 0, J2ny In + 1 + [кп < In], и ln + 2 + [кп < 1п]. Чтобы найти /3 = bobi .. .bn в /n+i(), когда га четно, допустим, что га-битовая строка (bo Ф 6i)...(6n-i 0 bn) начинается с места j в /п(). Тогда /3 начинается с места к = j — Un[j > jn] + 2n[j = jn][Sn — 1], если /п+i(к) = 6о; в противном случае в месте кН- (2n— Jn, £n,2n + Sn), согласно (j<jn,j=jnj>jn). Время выполнения этой рекурсии равно Т(п) = 0(п) + 2T([ra/2j), т.е. оно порядка O(ralogra). (Упр. 97-99 основаны на работе Дж. Тулиани, который также развил методы для некоторых больших значений га [см. Discrete Math. 226 (2001), р.313-336].) 100. Здесь нет очевидных дефектов; прежде чем рекомендовать любую последовательность, все равно необходима тщательная проверка. Наоборот, цикл де Бруийна, который создается неявно в алгоритме F, является неудачным источником предположительно случайных битов, даже если он имеет га-распределение в смысле определения 3.5D, поскольку 0s доминирует в начале. Действительно, если га простое число, то биты tn + 1 этой последовательности являются нулями для 0 < t < (2п— 2)/га.
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 113 101. (а) Пусть /3 является суффиксом АА' с 0 < XX'. Либо 0 является суффиксом А', откуда X < X' < /3 либо /3 = аА', и имеем Л < а < /3. Теперь Л < /3 < XX' подразумевает, что /3 = Л7 для некоторых 7 < А'. Но 7 является суффиксом /3 с 1 < |7| = \/3\ — |А| < |А'|; следовательно, 7 является суффиксом А' и А' < 7. Противоречие. (b) Произвольная строка длины 1 является простой. Комбинируем смежные простые строки, согласно (а), в произвольном порядке, пока нельзя будет получить никакой другой комбинации. [См. описание более общих результатов в работе М. П. Шутценбергера; Ргос. Amer. Math. Soc. 16 (1965), р.21-24.] (c) Если t ф 0, то пусть А является наименьшим суффиксом Ai ... At. Тогда А является простой строкой по определению и имеет вид /З7, где /3 является непустым суффиксом некоторой строки Xj. Следовательно, Xt < Х3 < /3 < f3j = X < At, так что получим А = At. Удалим At и будем повторять до тех пор, пока не будет выполняться условие t = 0. (d) Истинно. Если а = Х/З для некоторой простой строки Ас |А| > |Ai|, то можно было бы присоединить множители /3 для получения другого разложения на простые множители а. (e) 3 • 1415926535897932384626433832795 • 02884197. (Эффективный алгоритм представлен в упр. 106. Знание большего числа цифр 7г не меняет первые два множителя. Бесконечное разложение на десятичные дроби любого числа, которое является "нормальным" в смысле Э. Бореля (см. раздел 3.5), дает простые числа ограниченной длины.) 102. Имеем: 1/(1 - mz) = l/]l£Li(l ~ zn)Lm(n). Это подразумевает (60), как в упр. 4.6.2-4. 103. Если n = р — простое, то из (59) следует, что Lm(l) + pLm(p) = тр, и имеем: Ьт(1) = т. (Это комбинаторное доказательство забавно контрастирует с традиционным алгебраическим доказательством теоремы 1.2.4F.) 104. 4483 непростыми строками являются abaca, agora, ahead, ...; 1274 простыми строками являются ..., rusts, rusty, rutty. (Поскольку строка prime (простая) не является простой, то, вероятно, правильнее было бы называть простую строку термином lowly (скромная).) 105. (а) Пусть о! является а с увеличенной последней буквой, и предположим, что а' — f3j', где а = (3~/ и /3 ф е, 7 ф е. Пусть в является префиксом а, причем |0| = |. Согласно предположению, существует такая строка и>, что аи является простой. Следовательно, О < аш < 70;, так что имеем в < 7. Далее в < 7', и имеем а' < 7'. (b) Пусть а = Х\(3 = а\...ап, где Х\(3и является простой. Условие Х\(3и < /Зш подразумевает, что aj < aj+r для 1 < j < п — г, где г = |Ai|. Но не может быть aj < aj+r, в противном случае а начиналась бы с простой строки длиннее Ai, что противоречит упр. 101(d). (c) Если а является n-расширением обеих строк А и А', где |А| > |А'|, то получим А = (А')90, где 0 является непустым префиксом А'. Но тогда в < X' < X < в. 106. В1. [Инициализировать.] Установить а\ «- • • • «— ап <— гп — 1, an+i < 1, и j <- 1. 82. [Посетить.] Посетить (ai,...,ап) с индексом j. 83. [Вычесть единицу.] Завершить, если aj = 0. В противном случае установить аз *~ аз ~ 1 и ак 4- тп — 1 для j < к < п. 84. [Подготовиться к разложению.] (Согласно упр. 105(b), нужно найти первый простой множитель Ai of а\ ... an) Установить j i- 1 и к <— 2. 85. [Найти новое j.] (Теперь а\ ... ak-i является (к — 1)-расширением простой строки ai ... aj.) Если ak-j > ак, то вернуться к В2. В противном случае, если ak-j < a/e, то установить j <— к. Затем увеличить /с на 1 и повторить этот этап. |
114 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 Эффективный алгоритм разложения на простые множители на этапах В4 и В5 принадлежит Дж. П. Дювалю [см. J. Algorithms 4 (1983), р.363-381]. Более подробную информацию можно найти в работе Каттелла, Раски, Савада, Серра и Миерса [см. J. Algorithms 37 (2000), р.267-282]. 107. Количество посещенных п-кортежей равно: Ргп(п) = ^™=1 Lm(j). Поскольку Lrn(n) = ^тп + 0(тП//2/п), то имеем: Рт(п) = Q(m,n) 4- 0(Q(yjm,n)), где 71 к п Q(m, п) = ^ — = — R(m, п); Д(т,п) = V = V + 0(пт-п/2) v/ ^ 1 - &/п ^ 1 - к/п 4 ' fc=0 ' Ас—0 ' = ^ггт Е ^ Е {'} (^zif+°(n_t)- Таким образом, Ртп(п) ~ mn+l/((m — 1)п). Основной вклад во время выполнения дают циклы на этапах F3 и F5, затраты на которые равны п — j для каждой простой строки длины j, следовательно, общее время выполнения равно: nPm(n) — ]Cj=i JLmij) — mn+1(l/((m — l)2n) 4- 0(l/(mn2))). Это меньше, чем время, необходимое для вывода отдельных цифр га71 цикла де Бруийна. 108. (а) Если а ф 9...9, то имеем Afc+i < /З9'а', поскольку последняя строка является простой. (b) Предположим, что /3 состоит не только из нулей, поскольку 9j0n~j является подстрокой At-iAtAiA2 = 89n0nl. Пусть значение к минимально для /3 < Хк, тогда Хк < (За, поэтому /3 является префиксом Afc. Поскольку 0 является предпростой строкой, то она является \/3\-расширением некоторой простой строки /3' < J3. Предпростая строка, посещенная в алгоритме F сразу перед (3', имеет вид ((3' — 1)9П~'/3 ', согласно упр. 106, где /3' — 1 обозначает десятичное число, которое на единицу меньше /3'. Таким образом, если /3' не является Afc_i, то подсказка (которая также следует из упр. 106) состоит в том, что Afc-i заканчивается по крайней мере строкой п — \(3'\ >п — \/3\ 9s, а а является суффиксом Afc_i. С другой стороны, если 0 — \к-\, то а является суффиксом \к-2 и (3 является суффиксом Afc_iAfc. (c) Если а ф 9...9, то имеем: Afc+i < (/fo)d-1/39'a', поскольку последняя строка является простой. В противном случае A^-i заканчивается по крайней мере строкой (d- l)\/3a\ 9s, и Afc+i < ((3a)d~19l0a], а (af3)d является подстрокой of \k-i\k\k+i. (d) Внутри простых строк 135899135914, 787899787979, 12999913131314, 09090911, 089999 09090911, 118999119119122. (e) Да. Во всех случаях положение а\... ап предшествует положению подстроки а\... an_i (an+l), если 0 < ап < 9 (и если предположить, что строки like 9j0n~j появляются в начале). Более того, 9J'0n~J'_1 возникает только после того, как 9j~10n~ja появится для 1 < о» < 9, поэтому не нужно располагать 0 после 9J'0n"J'_1. 109. Предположим, что нужно найти подматрицу / (wn-i . . . wiwq)2 (Xn-1 • • . XiX0)2 V (Уп-i ... 2/12/0)2 (zn-i.. • Ziz0)2 Двоичный случай n = 1 уже рассмотрен в условии, а если п > 1, то по индукции можно предположить, что необходимо только определить ведущие биты a2n-i, a2n-2, b2n-i j '
7.2.1.1 ОТВЕТЫ К УПРАЖНЕНИЯМ 115 и &2п-2- Случай п = 3 является типичным: нужно решить следующую систему уравнений: b5 = W2, 64 = Х2, а5 Ф Ьъ = 2/2, а4 ф о4 = Z2, если ао = 0, бо = 0; 64 = г^2, 6'5 = #2, а4 ф Ь4 = ?/2, а5 Ф Ь'5 = ^2, если ао = 0, bo = 1; а5 ф 65 — W2, а4 ф Ь4 = ^2, 05 = 2/2, &4 = ^2, если ао = 1, бо = 0; а4 ф 64 = г^2, а5 ф 6'5 = Х2, б4 = 2/2, 65 = 22, если ао = 1, bo = 1; здесь 65 = 65 Ф 646з^2&1 учитывает перенос, когда j становится равным j + 1. 110. Пусть а0а: ... атп2_1 является таким га-м циклом де Бруийна, как первые тп2 элементов (54). Если тп нечетно, пусть йц = aj, когда г четно, a aV, = а^+^_1у2) modm2> когда г нечетно. (Первым среди многих людей, открывших эту конструкцию, похоже, был Джон К. Кок, который также создал торы де Бруийна других форм и размеров [Discrete Math. 70 (1988), р.209-210].) Если тп — тп'тп", где тп' _L тп", используем китайскую теорему об остатках для определения dij = d[j (по модулю гп) и dij = d"3 (по модулю т") на основе матриц, которые решили эту задачу для т! и тп". Таким образом, предыдущее упр. приводит к решению для произвольного тп. Другое интересное решение для четных тп было найдено Анталом Ивани и Золтаном Тотом [см. 2nd Conf. Automata, Languages, and Programming Systems (1988), p.165-172; а также работу Херльберта и Айзека, Contemp. Math. 178 (1994), p. 153-160]. Первые тп2 элементов aj бесконечной последовательности ООН 021331203223 04152435534251405445 0617263746577564 ... 0766708 ... определяют цикл де Бруийна с тем свойством, всегда четно. Затем можно допустить, что dij нечетно. Например, когда m = 4, имеем: /0010021220302232\ 0001020320212223 0111031321312333 1011121330313233 0010021220302232 0203000122232021 0111031321312333 1213101132333031 0010021220302232 2021222300010203 0111031321312333 3031323310111213 0010021220302232 2223202102030001 0111031321312333 V3233303112131011/ что расстояние между появлениями ab и Ьа = aj, если г + j четно, а dij = ai, если г 4- j (упр. 109); /00100 00010 01110 10111 00100 2021 2 OHIO 30313 03130 10111 02120 00010 03130 20212 02120 \30313 01030 20301 11131 21311 01030 22321 11131 23331 31333 21311 21232 20301 31333 2232 1 21232 23331 203020\ 000203 213121 101213 203020 202223 213121 303233 233323 101213 223222 000203 233323 202223 223222 303233/ (Тот). 111. (а) Пусть dj; = j и 0 < aj < 3 для 1 < j < 9, ag ф 0. Образуем последовательности Sj, tj по правилам si — 0, ti = di; tj+\ = dj+\ 4- 10tj[aj = 0] для 1 < j < 9; s^+i = Sj + (0,tj, —tj) для aj = (0,1, 2) и 1 < j < 9. Тогда sio является возможным результатом, и нам нужно только запомнить наименьшие значения, которые возникают. Более половины работы можно сэкономить, допуская ак = 2, когда sk = 0, используя |sio| вместо sw.
116 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.1 Поскольку нужно проверить меньше З8 = 6561 возможностей, то здесь разумно было бы применить грубую силу на основе третичной версии алгоритма М. Потребуется меньше 24 ООО мемсов и 1600 умножений для вывода результата, что так можно представить все целые числа меньше 211, но не 211. Другой подход на основе использования кода Грэя для варьирования знаками после разбиения цифр на блоки 28 возможными способами сокращает количество умножений до 255, но за счет 500 дополнительных мемсов. Следовательно, код Грэя не дает преимущества в этом примере. (Ь) В этом случае (за счет 73 ООО мемсов и 4900 умножений) таким образом можно представить все числа меньше 241, но не 241. Есть 46 способов представления 100, включая замечательный способ 9 — 87-1-6 + 5 — 43-1-210. (Впервые эту "задачу века" сформулировал Г. Э. Дьюдени [The Weekly Dispatch (4 and 18 June 1899)]; см. также работы Мартина Гарднера [The Numerology of Dr. Matrix, Chapter 6] и Стивена Каана [J. Recreational Math. 23 (1991), p. 19-25].) 112. Для выполнения метода из упр. Ill теперь потребуется больше 167 миллионов мемсов и 10 миллионов умножений, поскольку З16 гораздо больше З8. Этот метод можно значительно улучшить (до 10,4 миллиона мемсов и 1100 умножений), табулируя возможности, полученные для первых к и последних к цифр, для 1 < к < 9, а затем рассматривая все блоки цифр, в которых используется 9. Всего существует 60318 способов представления 100, а первым числом, для которого нельзя найти такое представление, является число 16040.
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 117 РАЗДЕЛ 7.2.1.2 1. (Дж. П. Н. Филипс.) [J. Р. N. Phillips, Сотр. J. 10 (1967), р.311.] Предполагая, что п > 3, можно заменить этапы L2-L4 следующими. L2'. [Простейший случай?] Установить у «- an-i и z «— ап. Если у < z, то установить an-i <— z, ап <— у и вернуться к L1. L2.1'. [Следующий простейший случай?] Установить х <— ап-2. Если х > у, то перейти к этапу L2.2'. В противном случае установить (ап-2, an-i, ап) (г, ж, г/), если х < г, либо (ап_2,an_i,ап) ^— (у, г, я), если х > z. Вернуться к L1. L2.2'. [Найти j.] Установить j <— п — 3 и у <— aj. Если у > ж, то установить j +- j — 1, х *~ У) У aj и повторять, пока не будет выполняться условие у < х. Завершить, если j — 0. L3'. [Легко увеличить?] Если 2/ < z, то установить а? <— z, aj+\ «— ап <— х и перейти к L4.1'. L3.1'. [Увеличить а-,.] Установить Z «— п — 1; если у > ai, повторно уменьшить / на 1, пока не будет выполняться условие у < сц. Затем установить а3 «— ai и а/ <- у. L4'. [Начать в обратную сторону.] Установить ап «— a^+i и a^+i «— 2;. L4.1'. [Обратить а^+г • • -an_i.] Установить k*-j + 2,l<— п — 1. Затем, если к < I, поменять afc О ai, установить /г «— /с + 1, I f- Z — 1 и повторять, пока не будет выполняться условие к > I. Вернуться к LI. | Программа может выполняться еще быстрее, если at хранить в памяти по адресу к[п — t] для 0 < t < п или если использовать обратный колексикографический порядок, как в следующем упражнении. 2. Снова предположим, что в исходном состоянии а\ < a 2 < • • • < ап. Однако перестановки, генерированные из {1,2,2,3}, будут иметь вид 1223, 2123, 2213, 2321, 3221. Пусть an+i является вспомогательным элементом, который больше, чем ап. L1. [Посетить.] Посетить перестановку а\а2 ... ап. L2. [Найти j,] Установить j 4- 2. Если aj-\ > aj, то увеличить j на 1, пока не будет выполняться условие a^-i < aj. Завершить, если j > п. L3. [Уменьшить aj.] Установить I <— 1. Если ai > aj, то увеличить /, пока не будет выполняться условие ai < aj. Затем обменять местами ai «-»• aj. L4. [Обратить а\ ... aj-\.] Установить к <— 1 и I f- j — 1. Затем, если к < I, обменять ак ai, установить к <— к + I, I <— I — 1 и повторять, пока не будет выполняться условие к > I. Вернуться к LI. | 3. Пусть С\ ... Сп = cai ... cari является таблицей обратного преобразования, как в упр. 5.1.1-7. Тогда рангом rank(ai ... ап) является число со смешанным основанием [сп\ Сп2~1' С\\- [См. работу X. А. Роте (Н. A. Rothe) Sammlungcombinatorisch-analytischer Abhandlungen 2 (1800), p.263-264, а также пионерскую работу Пандита Нарайана (Pandita Narayana), ссылки на которую приводились в разделе 7.2.1.7.] Например, 314592687 имеет ранг [jj; J; J; J; °; \> ? ] = 2 • 8! + 6! + 5! + 4 • 4! + 1! = 81577; это факториальная система счисления, представленная в уравнении 4.1—(10). 4. Используйте рекуррентное соотношение rank(ai... ап) = ^ Sj=i пАхз < ai] (ni ,n ,nt) + rank(a2 .. .an). Например, rank(314159265) равен: § (2,1,1,1,2,1,1) + 0 + ? (i,i,i!2,i,i) + 0 + * (i,25i,i) +1 (1,1 дд) + о + \ (Д) = 30991. 5. (а) Этап L2 выполняется n! раз. Вероятность того, что выполняется точно к сравнений, равна qk — qk+i, где qt —это вероятность того, что an-t+i > • • • > ап, а именно [t <n]/t\.
118 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 Следовательно, среднее равно k(qk — qk+i) = qi Ч h qn = Ln- ej/n! — 1 « e — 1 « 1,718, а дисперсия равна: fc2(gfc - qk+i) - среднее2 = gi 4- 3g2 4 h (2n - l)an - (gi 4 h qn)2 « e(3 - e) и 0,766. (О более высоких моментах, см. работу Р. Кемпа [Acta Informatica 35 (1998), p. 17-89, Theorem 4].) Кстати, отсюда следует, что среднее число операций замены на этапе L4 равно: Y,[k/2\(qk - qk+i) — <?2 4- 04 Ч « coshl -1 = (е + е_1-2)/2й 0.543. Этот результат принадлежит Р. Дж. Орд-Смиту (R. J. Ord-Smith) [см. Сотр. J. 13 (1970), р.152-155]. (Ь) Этап L3 выполняется только п! — 1 раз, но предположим для удобства, что он выполняется на один раз больше (без сравнений). Тогда вероятность того, что выполняется точно к сравнений, равна S"=fc+1 1/j! для 1 < к < п и 1/п! — для к = 0. Следовательно, среднее равно: \ Y^jZo V.7- ~ е/2 « 1,359; согласно упр. 1, это число сокращается на §. Дисперсия равна: £ Ч- \ Т,"=о " среднее2 и §е - ^е2 и 0,418. 6. (а) Пусть en(z) = 2fc=0 ^V^-i тогДа количество разных префиксов a\...aj равно: j\ [zj] eni(z).. .ent(z). Это в N = (ni,n,nt) Р33 больше вероятности gn_j того, что по крайней мере п — j сравнений выполняются на этапе L2. Следовательно, среднее равно: jrw(eni(z)... ent(z)) - 1, где w(Y2 xkzh/k\) = Ylxk- В двоичном случае среднее равно: Af/CO-l, гдеМ = Е?=о££|'+' (?) = £?=о ("7++/+1) = G!i2)-1 = («)(2+^+^)-1. (b) Если {ai,...,aj} = {ni • xi,...,nj • я*}, то префикс ai...aj дает вклад ^2i<k<i<t(nk~n'k)[ni > nJ] в общее количество сравнений, выполняемых на этапе L3. Таким образом, среднее равно: ^ Y^i<k<i<t w{fai(z)), где fki(z) = ( П enm(2;)>j (j2(nk - r)^\eni-i(z) l<m<t тфк, тф1 = eni(z)...€nt(z)(nk - zrk(z))n{z), где rk(z) = £2*zlM. enfc(2j В двузначном случае эта формула сводится к ^w((ses(z)—zes_i(2))en-s-i(2)) = ;jv((s+i) — i) - манн' - +1) = *(-« -1+с?1)) = н^йг - ^. 7. В обозначениях ответа к предыдущему упражнению j^u)(eni (z)... ent (г)) — 1 равно: п\ Ч h nt (пщ2 Ч- П1П3 Ч h nt-mt) Ч- ni(ni—1) Ч h nt(ru-l) n n(n — 1) Используя уравнение 1.2.9-(38), можно показать, что предел равен: —14- exp^fc>1 гк/к, где rk = limt_).oo(ni Ч- • • • Ч- пк)/(гы Ч- • • • Ч- nt)k. В случаях (а) и (Ь) имеем rk = [к = 1], поэтому предел равен: е — 1 « 1,71828. В случае (с) имеем rk = 1/(2к — 1), поэтому предел равен -1 + exp^fc>1 l/(fc(2fc - 1)) » 2,46275. 8. Допустим, что j в исходном состоянии равно нулю, и заменим этап L1 на L1'. [Посетить.] Посетить вариацию ai ...aj. Если j < п, то установить j 4— j + 1 и повторить этот этап. | Этот алгоритм предложен Л. Дж. Фишером (L. J. Fischer) и К. К. Краузе (К. С. Krause) [см. Lehrbucb der Combinationslebre und der Aritbmetik (Dresden, 1812), p.55-57]. Кстати, общее число вариаций равно w(eni (z)... ent (z)) в обозначениях ответа к упр. 6. Эта задача была впервые рассмотрена Джеймсом Бернулли (J. Bernoulli) [Ars Conjectandi (1713), Part 2, Chapter 9].
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 119 9. Предположим, что г > 0 и начнем с ао < а\ < а2 < • • • < ап. R1. [Посетить.] Посетить вариацию а\ ... аг. (В этом месте аг+\ < • • • < ап.) R2. [Простой случай?] Если аг < ап, то заменить ar а-,, где j является таким наименьшим индексом, что j > г и aj > аг, и вернуться к R1. R3. [Обратить.] Установить (ar+i,..., an) «— (an,..., ar+i), как на этапе L4. R4. [Найти j.] Установить j «— г — 1. Если a-, > a-/+i, то уменьшить j на 1 повторно, пока не будет выполняться условие aj < o^+i. Завершить, если j = 0. R5. [Увеличить о^.] Установить Z <— п. Если а.,- > а*, то уменьшить / на 1 повторно, пока не будет выполняться условие aj < aj. Потом заменить aj ai. R6. [Снова обратить.] Установить (a^+i,..., an) ч— (an, •. •, Q>j+i), как на этапе L4, и вернуться к Rl. | Количество вариации равно v. \z J вщ (z)... ent(z). Конечно, если элементы различны, то оно равно пг. 10. aia2 ... ап = 213 ... n, С1С2 ... сп = 010 ... 0, о\о2 ... on = 1 (—1)1... 1, если п > 2. 11. Этап (Р1, ..., Р7) выполняется (1, n!,n!,n!+xn,n!, (хп+3)/2, хп) раз, где хп = Y^k=l поскольку Р7 выполняется — 1)! раз, если 2 < j < п. 12. Нужно найти перестановку с рангом 999999. Вот ответы: (а) 2783915460, согласно упр. 3; (Ь) 8750426319, поскольку отраженным числом со смешанным основанием для ГО, 0, 1, 2, 3, 0, 2, 7, 0, 9 I якггяРтГЯ ГО, 0, 1, 3-2, 3, 5-0, 2, 7, 8-0, 9-9] гоггтягнп 7 О 1 1_^OV L 1, 2, 3, 4, 5, 6, 7, 8, 9, Ю J ЯВЛЯвТСЯ [ i? 2, 3, 4, 5, 6, 7,8, 9, 10 J? СОГЛаСНО (.Z.L.L (с) произведение (0 1 ... 9)9(0 1 ... 8)°(0 1 ... 7)7(0 1 ... б)2 ... (0 1 2)1, а именно 9703156248. 13. Первое утверждение истинно для всех п > 2. Но когда 2 пересекает 1, а именно когда С2 изменяется с 0 на 1, то имеем: сз = 2, С4 = 3, с$ = • • • = сп =0, а следующей перестановкой для п > 5 является 432156 .. .п [см. Time Travel (1988), p. 74]. 14. Истинно в начале этапов Р4-Р6, поскольку точно j — 1 — с3\ + s элементов лежат слева от Xjy а именно j — 1 — Cj из {xi,..., Xj-i} и s из {xj+i,..., хп}. (В некотором смысле эта формула является сутью алгоритма Р.) 15. Если [^f1' bn ] соответствует отраженному коду Грэя [с}' с£], то переходим к этапу Р6 тогда и только тогда, когда Ьк = к — 1 для j < к < п и Bn-j+i четно, согласно 7.2.1.1-(50). Но Ьп-к — к — 1 для j < к < п подразумевает, что Bn-k нечетно для j < к <тп. Следовательно, $ = =j] + [с^+2 = j + 1] = [oj+i < 0] + [oj+2 < 0] на этапе Р5 [см. Math. Сотр. 17 (1963), р.282-285]. 16. Р1г. [Инициализировать.] Установить Cj <— j и оj «— —1 для 1 < j; < п; также установить г «— ап. Р27. [Посетить.] Посетить ai.. .ап. Затем перейти к Р3.5', если а\ = z. РЗ'. ["Охотиться" вниз.] Для j «— п — 1, п — 2, ..., 1 (в этом порядке) установить a-,+1 <— aj, aj <— z и посетить ai ...an. Затем установить j <— п — 1, s<— 1 и перейти к Р4'. Р3.5'. ["Охотиться" вверх.] Для j <— 1, 2, ..., п — 1 (в этом порядке) установить aj <— aj+i, a-j+i <— z и посетить ai... an. Затем установить j «— n — 1, s <— 0. P4;. [Готовы к изменению?] Установить g <— с3; + о^. Если g = 0, то перейти к Р6'; если q > j, перейти к Р7;. Р5'. [Изменить.] Заменить aCj+s <-> a9_|_s. Затем установить с3q и вернуться к Р27. Р6'. [Увеличить s.] Завершить, если j = 1; в противном случае установить sf-s + 1. Р7'. [Переключить направление.] Установить Oj < Oj, j 4— j — 1 и перейти назад к Р4'. |
120 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 17. В исходном состоянии aj 4— a'j 4— j для l < j < п. На этапе Р5 следует установить t 4— j — Cj; + s, и 4— j — q 4- s, v 4— au, at 4- v, a'v 4— t, au 4— a'j 4— u, Cj 4— q (см. упр. 14). С помощью требуемой и доступной обратной перестановки можно значительно упростить алгоритм, избегая использования переменной отступа s и позволяя контрольной таблице ci ... Сп отсчитывать только убывания, как заметил Г. Эр лих (G. Ehrlich) [см. JACM 20 (1973), р.505-506]. Q1. [Инициализировать.] Установить aj 4- a'j 4— j, Cj 4- j — 1 и Oj < 1 для 1 < j < п. Также установить со = — 1. Q2. [Посетить.] Посетить перестановку ах.. .ап и обратную ей перестановку а[ ... а'п. Q3. [Найти к.] Установить к 4— п. Затем, если ск = 0, установить ск 4- к—1, ок < ок, к 4— к — 1 и повторять, пока не будет выполняться условие ск ф 0. Завершить, если к — 0. Q4. [Изменить.] Установить ск 4— ск — 1, j 4— а'к, и г = j Н-о^. Затем установить t 4— ai? ai 4- к, aj 4— t, a't 4— jf, a'k 4- i и вернуться к Q2. | 18. Установить an 4- n и использовать (n — l)!/2 итераций алгоритма P для генерации всех таких перестановок {l,...,n — 1}, что 1 предшествует 2 [см. М. К. Roy, С ACM 16 (1973), р.312-313, а также упр. 13]. 19. Например, можно вспользоваться идеей алгоритма Р с n-кортежами с\... сп, изменяющимися, как в алгоритме 7.2.1.1Н, по отношению к основаниям (1,2,..., п). Этот алгоритм корректно поддерживает направления, хотя имеет другю нумерацию индексов. Отступ 5, необходимый для алгоритма Р, можно вычислить, как в ответе к упр. 15; обратную перестановку можно выполнить, как в упр. 17 [см. работу Г. Эрлиха в САСМ 16 (1973), р.690-691]. Другие алгоритмы, как метод Хипа, также могут быть реализованы без циклов. (Замечание. В большинстве приложений генерации перестановок важно сократить до минимума общее время выполнения, а не максимальное время между последовательными посещениями. С этой точки зрения отсутствие циклов обычно не требуется, за исключением счета на параллельном компьютере. Хотя остается интеллектуальное удовлетворение от осознания того факта, что существует бесцикловый алгоритм, независимо от его практической необходимости.) 20. Например, для п = 3 начинаем с 123, 132, 312, 312, 132, 123, 213, ..., 213, 213, .... Если дельта-последовательность для п имеет вид (6182 .. .(b^nO, то соответствующая последовательность для п + 1 имеет вид (AnS\ Ап^2 •.. An<bnn!), где Дп является последовательностью 2п 4-1 операций п п—1 ... 1 — 1 ... п—1 п. Здесь 6к = j означает aj о aj+i и 6к = — означает а\ < а\. (Перестановки со знаком предстают в другом виде в упр. 5.1.4-43 и 44. Множество всех перестановок со знаками называется группой октаэдра.) 21. Очевидно, что М = 1, следовательно, 0 должно быть равно 0 и S должно быть равно 6—1. Тогда N = Е+1, R = 6—2, и D+E = &+Y. Это дает точно тах(0, b—7—k) вариантов для Е, когда Y = к > 2, следовательно, общее количество решений равно: Yl^Z^i0 — 7 — к) = (Ь28) для b > 8 [см. Math. Mag. 45 (1972), р.48-49]. Кстати, Д. Эпштейн (D. Eppstein) доказал, что задача решения буквометики с заданным основанием является NP-полной [см. SIGACT News 18,3 (1987), р.38-40]. 22. (ХУ)ь + (XX)ь = (ХУХ)ь разрешима только для 6 = 2. 23. Почти истинно, поскольку количество решений четно, если только не выполняется условие [j е F] ф [k £ F]. (Рассмотрим третичную буквометику X + (ХХ)з + (YY)3 + (XZ)3 = (XYX)3.)
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 121 24. (а) 9283 + 7+473 + 1062 = 10825. (Ъ) 698392+3192 = 701584. (с) 63952 + 69275 = 133227. (d) 653924 + 653924 = 1307848. (е) 5718 + 3 + 98741 = 104462. (f) 127503 + 502351 + 3947539 + 46578 = 4623971. (g) 67432 + 704 + 8046 + 97364 = 173546. (h) 59 + 577404251698 + 69342491650 + 49869442698 + 1504 + 40614 + 82591 + 344 + 41 + 741425 = 5216367650 + 691400684974. (Все решения единственны. [См. в отношении (b)-(g): J. Recreational Math. 10 (1977), p.115; 5 (1972), p.296; 10 (1977), p.41; 10 (1978), p.274; 12 (1979), p.133-134; 9 (1977), p.207.]) (i) В этом случае существует ^jlO! = 2903040 решений, поскольку годится каждая перестановка {0,1,...,9}, за исключением тех, в которых буква Н или N присваивается 0. (Тщательно продуманная программа решения общих буквометик сложения должна сокращать объем выводимых данных в таких случаях.) 25. Допустим, что s\ < • • • < 5ю. Пусть i является наименьшим индексом ^ F, установим ai <— 0, а потом расположим остальные элементы aj в порядке возрастания j. Доказательство, аналогичное доказательству теоремы 6.1S, показывает, что эта процедура максимизирует а • s. Аналогичная процедура достигает минимума, поскольку min(a • s) = — max (a • (—s)). 26. 400739 + 63930 - 2379 - 1252630 + 53430 - 1390 + 738300. 27. Смогут ли читатели улучшить следующие примеры: BLOOD + SWEAT + TEARS = LATER; EARTH + WATER + WRATH = HELLO + WORLD; AWAIT + ROBOT + ERROR = SOBER + WORDS; CHILD + THEME+PEACE+ETHIC = IDEAL+ALPHA+METIC (Это упражнение возникло после знакомства с буквометикой WHERE + SEDGE + GRASS + GROWS = MARSH [см. A. W. Jr. Johnson, J. Recr. Math. 15 (1982), p.51], которая была бы изумительно чистой, за исключением того, что D и 0 имеют одинаковые сигнатуры.) 28. (а) 11 = 3+3 + 2 + 2 + 1, 20 = 11+3+3 + 3, 20 = 11+3+3+2 + 1, 20 = 11+3+3 + 1 + 1 + 1, 20 = 8 + 8 + 2 + 1 + 1, 20 = 7 + 7 +6, 20 = 7 + 7 + 2 + 2 + 2, 20 = 7 + 7 + 2 + 1 + 1 + 1 + 1, 20 = 7 + 5 + 5 + 2 + 1, 20 = 7 + 5 + 2 + 2 + 2 + 1 + 1, 20 = 7 + 5 + 2 + 2 + 1 + 1 + 1 + 1, 20 = 7+3+3+2+2+1 + 1 + 1, 20 = 7+3+3+1 + 1 + 1 + 1 + 1 + 1 + 1, 20 = 5+3+3+3+3+3. (Эти четырнадцать решений были впервые получены Роем Чайлдсом (Roy Childs) в 1999 году. Следующие дважды разбиваемые значения п: 30 (в 20 вариантах), 40 (в 94 вариантах), 41 (в 67), 42 (в 57), 50 (в 190 вариантах, включая 50 = 2 + 2 + h 2) и т.д.) (Ъ) 51 = 20 + 15 + 14 + 2, 51 = 15 + 14 + 10 + 9 + 3, 61 = 19 + 16 + 11 + 9 + 6, 65 = 17 + 16 + 15 + 9 + 7 + 1, 66 = 20 + 19 + 16 + 6 + 5, 69 = 18 + 17 + 16 + 10 + 8, 70 = 30 + 20 + 10 + 7 + 3, 70 = 20 + 16 + 12 + 9 + 7 + 6, 70 = 20 + 15 + 12 + 11 + 7 + 5, 80 = 50 + 20 + 9 + 1, 90 = 50 + 12 + 11 + 9 + 5 + 2 + 1, 91 = 45 + 19 + 11 + 10 + 5 + 1. (Два варианта с числом 51 получены Стивеном Кааном (Steven Kahan); [см. Have Some Sums To Solve (Farmingdale, New York: Baywood, 1978), р.36-37,84,112]. Изумительные примеры с 17 различными слагаемыми на итальянском языке и 58 различными слагаемыми в виде чисел с римскими цифрами получены Джулио Чезаре (Giulio Cesare) [см. J. Recr. Math. 30 (1999), р.63]. Замечание. Прекрасный пример THREE = TWO + ONE + ZERO [см. [Richard L. Breisch, Recreational Math. Magazine 12 (December 1962), p.24], к сожалению, не отвечает нашим соглашениям. Общее число дважды истинных разбиений на различные части, вероятно, конечно на английском языке, хотя номенклатура для произвольно больших целых чисел не является стандартной. Существует ли пример больше следующего (предложенного Гонсалесом-Моррисом (G. Gonzalez-Morris)) примера NINETYNINEN0NILLI0NNINETYNINESEXTILLI0NSIXTY0NE = NINETYNINEN0NILLI0NNINETYNINESEXTILLI0NNINETEEN + SIXTEEN + ELEVEN + NINE + SIX? 29. 10 + 7 + 1 = 9 + 6 + 3, 11 + 10 = 8 + 7 + 6, 12 + 7 + 6 + 5 = 11 + 10 + 9, 19 + 10 + 3 = 14 + 13 + 4 + 1 (всего 31 пример).
122 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 30. (а) 5672 = 321489, 8072 = 651249 или 8542 = 729316. (Ъ) 9582 = 917764. (с) 96 х 72 = 4704. (d) 51304/61904 = 7260/8760. (е) 3285092 = 47613 [см. Strand 78 (1929), 91, р.208; J. Recr. Math 3 (1970), р.43; 13 (1981), р.212; 27 (1995), р.137; 31 (2003), р.133]. Решения (Ь), (с), (d) и (е) являются единственными. С помощью подхода справа налево на основе алгоритма X эти ответы можно найти за (14, 13, 11, 3423, 42) киломемс соответственно. Ноб Йошигахара также заметил, что NORTH/SOUTH = WEST/EAST имеет единственное решение: 67104/27504 = 9320/3820. 31. 5/34-f7/68+ 9/12(1). Единственность можно проверить с помощью алгоритма X, используя дополнительное условие А < D < G приблизительно за 265 Ки [см. Quark Visual Science Magazine, No. 136 (Tokyo: Kodansha, October 1993)]. Забавно, что очень похожая головоломка также имеет единственное решение: 1/(3 х б) + 5/(8 х 9) + 7/(2 х 4) = 1 [см. работу С. Морриса в Omni 17,4 (January 1995), p.97]. 32. Существует 11 способов, из которых наиболее удивительным является 3 4- 69258/714 [см. The Weekly Dispatch (9 и 23 June 1901); Amusements в Mathematics (1917), р.158-159]. 33. (a) 1, 2, 3, 4, 15, 18, 118, 146. (b) 6, 9, 16, 20, 27, 126, 127, 129, 136, 145 [см. The Weekly Dispatch (11 and 30 November, 1902); Amusements в Math. (1917), p.159]. В этом случае одна приемлемая стратегия заключается в поиске всех вариаций, в которых a,k .. .cn-i/ai.. .ад является целым числом, и записи решений для всех перестановок а\ ... ak-i. Существует точно 164959 целых чисел с единственным решением, причем самое большое равно 9876533. Существуют решения для всех годов XXI века, за исключением 2091. Наибольшее количество решений (125) найдено для п — 6443. Самый длинный диапазон представимых п найден для 5109 < п < 7060. Дьюдени смог получить правильные ответы вручную для малых п, "отбрасывая девятки". 34. (а) х = 105, 7378 + 155 4- 92467 = 7178 + 355 + 92467 = 1016 4- 733 + 98251 = 100000. (Ь) х = 47, 3036 4- 455 4- 12893 = 16384 является единственным решением. Скорейший способ решения этой задачи, вероятно, заключается в том, чтобы начать со списка 2529 простых чисел, которые состоят из пяти различных цифр (а именно 10243, 10247, ..., 98731), и переставлять пять оставшихся цифр. Кстати, неограниченная буквометика EVEN 4- ODD = PRIME имеет десять решений; причем ODD и PRIME являются простыми только в одном из них [см. статью М. Арисава в J. Recr. Math. 8 (1975), р.153]. 35. Вообще, если Sk = \Sk \ для 1 < к < п, то существует s\ ... Sk-i способов выбора каждого нетождественного элемента из 5^. Следовательно, ответ имеет вид П£=1 (П^=1 5jfe_1)> т.е. в данном случае 22 • б3 • 2415 = 436196692474023836123136. (Но если перенумеровать вершины, то значения sk могут измениться. Например, если вершины (0,3,5) of (12) меняются с (e,d, с), то имеем su = 1, S13 = 6, S12 = 4, 5ц = 1 и 45 • 2415 таблиц Симса.) 36. Поскольку каждый из элементов {0,3,5,6,9, а, с, f} располагается на трех линиях, но каждый из остальных элементов располагается только на двух линиях, то ясно, что можно допустить Sf = {(),сг, сг2,сг3,а,а<7, аа2,аа3}, где а = (03fc)(17e4)(2bd4)(56a9) является поворотом на 90°, а а = (05) (14) (27) (36) (8d) (9с) (af) (be) является кручением изнутри наружу. Кроме того, Se = {(),/^,7,/?7}, где /3 = (14)(28)(3c)(69)(be) является транспозицией и 7 = (12)(48)(5a)(69)(7b)(de) является другим кручением; S& = • • • = Si = {()}. (Всего 47 — 1 альтернативных ответов.) 37. Множество Sk можно выбрать fc!fc_1 способами (см. упр. 35), а его нетождественные элементы можно присвоить а(к, 1), ..., а(к, к), причем к\ способами. Поэтому ответ имеет
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 123 вид Ап = rifc=i Ык = пК2)/ГК=1 к®. Например, Аю « 6,256 х 10148. Имеем: 53 (£) ЫА: = \ f ф-1)^хах^°(п2^п) = ^п3\пп + 0(п3) fc=1 ^ по формуле суммирования Эйлера. Таким образом, In Ап = \п3тп + 0(п3). 38. Вероятность того, что ф(к) потребуется на этапе G4, равна 1/к\ — 1/(к + 1)! для 1 < к < п, но вероятность непопадания на этап G4 равна 1/п!. Поскольку ф(к) выполняет \к/2] транспозиций, то среднее равно: ^Zl(l/k\ - 1/(к + 1)\)\к/2] = ££li( 1^/21 - Г(* - 1)/21) А! - Г(п - l)/2l/n! = E.odd V*! + G(l/(n " 1)0- 39. (а) 0123, 1023, 2013, 0213, 1203, 2103, 3012, 0312, 1302, 3102, 0132, 1032, 2301, 3201, 0231, 2031, 3021, 0321, 1230, 2130, 3120, 1320, 2310, 3210; (Ъ) 0123, 1023, 2013, 0213, 1203, 2103, 3102, 1302, 0312, 3012, 1032, 0132, 0231, 2031, 3021, 0321, 2301, 3201, 3210, 2310, 1320, 3120, 2130, 1230. 40. По индукции находим <т(1,1) = (0 1), <т(2,2) = (0 1 2), 140 к)(к—1 к—2 ... 1), если к > 3 нечетно; I (0 Jfe-l к-2 1 ... А;-3 к), если к>4 четно, а также и(к) = (0 к), если к четно, и>(к) = (0 к—2 ... 1 к—1 к), если > 3 нечетно. Таким образом, если к > 3 нечетно, сг(/с, 1) = (/с к—1 0) и cr(k,j) принимает к у-> j — 1 для 1 < j < к; если > 4 четно, cr(k,j) = (0 к к—3 ... 1 А:—2 fc—I)-7 для 1 < j < к. Замечание. Первая схема, которая использует алгоритм G для генерации всех перестановок на основе одних транспозиций, была предложена Марком Уэллсом (Mark Wells) [см. Math. Сотр. 15 (1961), р. 192-195], но она была значительно более сложной. В. Липски- мл. (W. Jr. Lipski) изучал такие схемы в более общем случае и обнаружил несколько других методов [см. Computing 23 (1979), р.357-365]. 41. Предположим, что г < п. Алгоритм G будет генерировать r-вариации для произвольной таблицы Симса, если просто заменить ск <— Г на 'fc «- п — г' на этапе G3, при условии, что ш(к) переопределяется и равно а(п — г, п — г)... а(к, к), вместо использования (16). Если п — г нечетно, то метод (27) еще применим, хотя формулы в ответе к упр. 40 нужно исправить для к < п — г + 2. Новые формулы имеют вид cr(k,j) = (к j—1 ... 10) и и(к) = (к ... 10) для к = п — г; cr(k,j) = (к ... 1 0)^ для к = п — г -h 1. Если п — г четно, то можно использовать (27) с четными и нечетными обратными, если г < 3. Но для г > 4 потребуется более сложная схема, поскольку такая фиксированная транспозиция, как (к 0), может использоваться для нечетных к, только если и (к — 1) является fc-циклом, т.е. ш(к — 1) должна быть четной перестановкой; но и(к) нечетно для к >п - г + 2. Следующая схема работает, если п — г четно: пусть т(к,з)ш(к — \)~ = (к k—j) для l<j<k = n — г, а, для к > п — г используем (27). Затем, если к = п — г + 1, имеем ш(к — 1) = (0 1 ... к—1), следовательно, cr(k,j) принимает к (2j — 1) mod к для 1 < j < к, и <т{к,к) = (к к-1 к-3 ... 0 к—2 ... 1), и (к) = (к ... 10), <r(k + lj) = (fc+1 ... 0)j. 42. Еслисг(А;,^) = (к j-l), то имеем т(к, 1) = (kO)ur(kJ) = (к j—l)(k j—2) = (kj-lj-2) для 2 < j < к. 43. Конечно, с<;(1) = <т(1,1) = т(1,1) = (0 1). Следующая конструкция образует и(к) = (к-2 к-1 к) для всех к > 2: пусть a(k,j) = r(kj)u(k - 1)_, где а(2,1) = (2 0), а(2,2) = (2 0 1), а(3,1) = а(3,3) = (3 1), а(3,2) = (3 1 0); это дает <т(2,2) = (0 2), <т(3,3) = (0 3 1). Затем для к > 4 допустим, что a(k, 1) = (к к—4), а(ку j) = (к к—3—j к—2—j) для 1 < j <
124 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 к- 2 и к mod 3 = 0 к mod 3 = 1 к mod 3 = 2 а(к,к-2) = (к к—2 0), или (к к—3 0), или (к к-1 0); a(fc,fc-l) = (A; fc-2 fc-З), или (А: к—3), или (А; /с-1 fc-3); а(к,к) = (к к-2), или (/с fc-З fc-2), или (к к-2), . Это дает сг(/с, /с) = (к—3 к к—2), что и требовалось. 44. Нет, поскольку r(k,j) является (к 4- 1)-циклом, а не транспозицией (см. (19) и (24)). 45. (а) 202280070, поскольку uk = max ({0,1,..., ак — 1} \ {ai,...,ak-i}). (На самом деле ип никогда не устанавливается алгоритмом, но можно предположить, что он равен нулю.) (Ъ) 425368917. 46. Истинно (предполагая, что ип = 0). Если uk > uk+i или ак > ак+х, то получим ак > uk > ак+\ > ixfc+i. 47. Этапы (XI, Х2,..., Х6) выполняются соответственно (1, А, В, А — 1, В — Nn, А) раз, где А = No -\ Ь Nn-i и В = nNo 4- (n - l)Ni 4- • • • 4- Шп-ь 48. Этапы (Х2,ХЗ,Х4,Х5,Х6) выполняются соответственно Ап 4- (1,п!, 0,0,1) раз, где Ап = J2kZin~ = n'Sfe=i 1/^- ~ n! (е — 1). Предполагая, что затраты на них равны соответственно (1,1,3,1,3) мемсов, для операций с aj, lj или щ общие затраты равны около 9е — 8 « 16,46 мемса на перестановку. Алгоритм L затрачивает приблизительно (е, 2 4- е/2,2е 4- 2е-1 — 4) мемсов на перестановку на этапах (L2, L3, L4), а общие затраты равны 3,5е 4- 2е-1 — 2 « 8,25 (см. упр. 5). Алгоритм X можно оптимизировать в этом случае для значений к, близких к п. То же самое можно сделать и с алгоритмом L, как показано в упр. 1. 49. Упорядочьте сигнатуры так, чтобы |«о| > • • • > Приготовьте таблицы wo .. .wg, хо ... хд, уо ... уд так, чтобы для сигнатур {sk,..., sg} выполнялись условия wXk < - — < wVk. Например, для SEND4-MORE = MONEY имеем (s0,..., s9) = (-9000,1000, -900,91, -90,10, 1,-1,0,0) для соответствующих букв (M,S, 0,E,N,R,D, Y, А, В); (w0,..., wg) = (-9000,-900, -90, -1,0,0,1,10,91,1000) иж0...ж9 = 0112233344, у0...уд = 9988776554. Еще одна таблица /о... fg содержит fj = 1, если цифра, соответствующая Wj, не может быть нулем, и в этом случае /о ... fg = 1000000001. Эти таблицы упрощают вычисление самого крупного и самого малого значений для всех вариантов ак ... ад из остальных цифр с помощью метода из упр. 25, поскольку связи lj информируют нас об этих цифрах в порядке возрастания. Этот метод требует очень затратных вычислений в каждом узле дерева поиска, но зато он часто позволяет поддерживать малым размер дерева. Например, он разрешает первые восемь буквометик из упр. 24 всего за 7, 13, 7, 9, 5, 343, 44 и 89 киломемс. В случаях (а), (Ь), (е) и (h) наблюдается существенное улучшение, а в случае (f) — существенное ухудшение. Еще один неудачный пример связан с буквометикой 'CHILD' из упр. 27, где метод "слева направо" требует 2947 киломемс по сравнению с 588 киломемсами для метода "справа налево". Однако метод "слева направо" показывает более эффективную работу для BL00D 4-SWEAT 4-TEARS (73 по сравнению с 360) и HELLO 4- WORLD (340 по сравнению с 410). 50. Если а входит в группу перестановок, то в нее входят все ее степени а2, а3, включая am_1 = а~, где т является порядком а (наименьшее общее кратное длин ее циклов). А (32) эквивалентно а~ = <j\G2 ... <rn-i- 51. Ложно. Например, обе a(k,i)~ и a(k,j)~ могут принимать значения к н+ 0. skak 4- • • • 4- Sgag
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 125 52. r(k,j) = (к—j к—j+l) является смежной заменой, а ш(к) = (п-1 ... 0)(п-2 ... 0)... (к ... 0) = ф(п- 1)ф(к - 1) является /^-переворотом, за которым следует n-переворот. Перестановка, соответствующая контрольной таблице со ... cn-i в алгоритме Н, содержит Cj элементов справа от j, которые меньше j для 0 < j < п. Поэтому она точно такая же, как и перестановка, соответствующая d ... сп в алгоритме Р, за исключением того, что индексы сдвинуты на 1. Единственным существенным различием между алгоритмом Р и этой версией алгоритма Н является то, что алгоритм Р использует отраженный код Грэя для перебора всех вариантов своей контрольной таблицы, тогда как алгоритм Н перебирает числа со смешанным основанием в (лексикографическом) порядке возрастания. Действительно, код Грэя можно использовать вместе с любой таблицей Симса, изменяя алгоритм G или Н. Тогда все переходы на основе r(k,j) или r(k,j)~, а также перестановки ш(к) окажутся неуместными. 53. В этом разделе в доказательстве того факта, что п! — 1 транспозиций нельзя достичь для п = 4, также показано, что можно свести эту задачу от п к п — 2 за счет одной транспозиции (п—1 п—2), т.е. '(Зс)' в обозначениях данного доказательства. Таким образом, можно генерировать все перестановки с помощью следующих преобразований на этапе Н4: если к — п— 1 или к = п—2, то транспонировать aj mod n «-> a(j-i) mod n? где j = cn-i — 1. Если к = n — 3 или к = n — 4, то транспонировать an-i «-> ап-2 и ajmod(n-2) «->• a(j-i)mod(n-2), где j = Сп-з - 1. И вообще, если к = п - 2t - 1 или к = п — 2t — 2, то транспонировать an-2i+i dn-2i для 1 < г < t и также aj mod (n-2t) a(i-i)mod(n-2t), где j = cn-2t-i - 1 [см. САСМ 19 (1976), р.68-72]. Соответствующая таблица Симса для перестановок может быть записана следующим образом, хотя они не присутствуют явно в самом алгоритме: Г (0 1 ... j—1 /с), если п — к нечетно; a(k,j) = < t (0 1 ... к)3, если п — к четно. Значение aj mod (n-2t) будет равно п — 2t — 1 после замены. Для повышения эффективности можно также использовать тот факт, что значение к обычно равно п — 1. Общее число транспозиций равно Y^tl^ (n — 2t)\— \п/2\ — 1. 54. Да; это преобразование может быть любым /с-циклом по позициям {1,..., к}. 55. (а) Поскольку р\(т) = pi (га mod п!) для п > р«(га), то имеем р\(п\ + га) = р»(га) для 0 < га < п - п\ = (п + 1)! - п\. Следовательно, (Зп\+т = сгр,(п!+т)... crp,(n!+1)/3ni = 0>.(m)... <7p,(i)^n' = 0m0n\ для 0 < га < п - п!, и имеем, в частности, P(n+iy = 0*71+1/3(п+1)'-1 = ^n+l&i'-l/^n' = CTn+l^n /^n'+1' Аналогично, an!+m = /?~|am/5nian! для 0 < га < n • n!. Поскольку /3nt коммутирует с тп и rn+i, то находим ап\ = rnani_i, и a(n+l)! = rn+la(n+iy-l = Tn+lPn\a{n+l)\-l-nPni(Xn\ = = тп+1 Рй™ «n!-1 (/Ъ »п! )П = ftn_lrn+lTn (/Ъ0!п!)П+1 = crn+icr~Tn+1T~ (/3n,an,)n+1. (b) В этом случае сгп+\&п — (я- n—1 ... 1) и тп+1т~ = (п+1 п 0), и имеем /?(n+i)ia(n+i)! = (n+l п ... 0) по индукции. Следовательно, ajnl+m = /3~,эam(n ... О)-7 для 0 < j < п и 0 < m < п!. Все перестановки {0,... ,п} достигаются, поскольку f3~{3аш фиксирует п и (п ... 0)J принимает п*-¥ п — j.
126 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 56. Если установить ак = (к—1 к—2)(к—3 к—4)... в предыдущем упражнении, то по индукции можно найти, что f3n\ani является (п + 1)-циклом (0 п п—1 п—3 ... (2 или 1) (1 или 2) ... п-4 п-2). 57. Поступая, как в ответе к упр. 5, получим J2kZl[A;odd]/A;! — ([n/2j — l)/n! = sinhl — l-0(l/(n-l)!). 58. Истинно. По формулам из упр. 55 имеем о:п!_1 = (0 n)f3~r(n ... 0) и 0 и п - 1, поскольку /Зп\ фиксирует п. (Следовательно, алгоритм Е определит гамильтонов цикл на графе из упр. 66 тогда и только тогда, когда /Зп\ = (п—1 ... 2 1), и это выполняется тогда и только тогда, когда длина каждого цикла /?(п_!)! является делителем п. Последнее истинно для п = 2, 3, 4, 6, 12, 20 и 40, но не для других п < 250,000.) 59. Граф Кэли с генераторами (ai,...,afc) в определении в данном разделе изоморфен графу Кэли с генераторами (af,..., ) в альтернативном определении, поскольку тг —> otjii в первом определении тогда и только тогда, когда 7г~ -» 7г~а~ в последнем определении. 60. Имеется 88 дельта-последовательностей, которые сводятся к четырем классам: Р — (32131231)3 (простые изменения, представленные 8 разными дельта-последовательностями); Q = (32121232)3 (двойной вариант Грэя простых изменений с 8 представителями); R = (121232321232)2 (двойной код Грэя с 24 представителями); S = 2аЗая, а = 12321312121 (с 8 представителями). Классы Р и Q являются циклическими сдвигами их дополнений; классы Р, Q и 5 являются сдвигами их обращений; класс R является сдвинутым обращением своего дополнения [см. статью А. Л. Л. Сильвера (A. L. L Silver) Math. Gazette 48 (1964), р.1-16]. 61. Существует соответственно (26,36,20, 26, 28,40,40, 20,26, 28, 28, 26) путей, которые заканчиваются следующим образом: (1243,1324,1432, 2134,2341, 2413,3142, 3214,3421,4123, 4231,4312). 62. Есть только два пути для п = 3, которые заканчиваются перестановками 132 и 213. Но для п > 4 существуют коды Грэя, ведущие от 12... п к любой нечетной перестановке а\ач ... ап. В упр. 61 это доказано для п = 4, а здесь можно доказать это по индукции для п > 4 следующим образом. Пусть A(j) является множеством всех таких перестановок, которые начинаются с j, и пусть A(j, к) является множеством всех таких перестановок, которые начинаются с jk. Если (ao,ai,...,otn) — это такие нечетные перестановки, что сх3 G A(xj,Xj+i), тогда (12)aj является четной перестановкой в A(xj+i,Xj). Следовательно, если х\Х2...хп является перестановкой {1,2,... ,п}, то существует по крайней мере один гамильтонов путь вида (1 2)а0 а\ — (1 2)ai a2 (1 2)an-i an; а подчиненный путь от (1 2)а3-\ к а3 включает все элементы А(х3). Эта конструкция решает задачу по крайней мере (п—2)!n/2n_1 различными способами, если ai ф 1, поскольку можно принять ао = 21...П и ап = а\а,2 •. .ап. Есть (п — 2)! способов выбора X2 ...хп-\ и (п — 2)!/2 способов выбора каждой из ai, ..., an-i. Наконец, если а\ = 1, возьмем любой путь 12...П — ••• — aia2-..an, который проходит все А(1), и выберем произвольный этап a — а' с a Е A(l,j) и а € A(l,j') для некоторого j ф f. Заменим этот этап на a — (12)ai a2 (12)an-i an — a', используя конструкцию, как в показанном выше гамильтоновом пути, но теперь с ai = a, an = (12)a', xi = 1, X2 = j, xn = j'', и xn+i = 1. (В этом случае все перестановки ai, ..., an могут быть четными.)
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 127 63. Оценки по методу Монте-Карло с использованием технологий из раздела 7.2.3 дают для общего количества классов эквивалентности приблизительное значение 1,2 х 1021. Большая часть этих классов будет содержать 480 циклов Грэя. 64. Точно 2 005 200 дельта-последовательностей обладают свойством дважды кода Грэя. Они относятся к 4206 классам эквивалентности для циклического сдвига, обращения и/или дополнения. Девять классов, например, как код 2a2aR, где а = 12343234321232121232321232121234343212123432123432121232321, являются сдвигами их обращения; 48 классов состоят из повторяющихся 60-циклов. Один их наиболее интересных классов последнего типа имеет вид аа, где а = (32/34/34/3404, /3 = 32121232123. 65. Такой путь существует для произвольного заданного N <п\: пусть JV-я перестановка имеет вид а = а\ ... ап, a j = а\. Пусть Щ является множеством всех перестановок /3 = bi ... 6п, для которых &1 = к и (3 < а. По индукции для N существует путь Грэя Pi для Uj. Тогда можно создать пути Грэя Рк для П? 1Ш1 U • • • иЩ_1 для 2 < к < j, последовательно комбинируя Pk-i с циклом Грэя для Щ_1. (См. конструкцию "поглощение" в ответе к упр. 62. Действительно, Pj будет циклом Грэя, когда АГ кратно 6.) 66. Определяя дельта-последовательность с помощью правила K(k+i) mod п\ — (1 5k)nk, можно найти точно 36 таких последовательностей, которые являются циклическими сдвигами структуры типа (xyzyzyxzyzyz)2. (Следующий случай, п = 5, вероятно, имеет около 1018 решений, которые неэквивалентны по отношению к циклическому сдвигу, обращению и перестановке координат, т.е. около 6 х 1021 разных дельта-последовательностей.) Кстати, Игорь Пак (Igor Рак) показал, что в общем случае граф Кэли, генерированный звездными транспозициями, является (п — 2)-мерным тором. 67. Если предположить, что 7г эквивалентно 7г(12345), то получим сокращенный граф с 24 вершинами, который имеет 40768 гамильтоновых циклов, 240 из которых приводят к дельта-последовательностям вида а5, в которых а использует каждую транспозицию шесть раз (например, а — 354232534234532454352452). Общее количество решений этой задачи приблизительно равно 1016. 68. Если А не является связным, то и С не является связным. Если А является связным, то можно предположить, что он является свободным деревом. Более того, в этом случае можно доказать обобщение результата из упр. 62: для п > 4 существует гамильтонов путь в G от тождественной перестановки к произвольной нечетной перестановке. Можно предположить без утраты общности, что А содержит ребро 1 — 2, где 1 является листком дерева, а далее доказательство аналогично доказательству из упр. 62. [Эта элегантная конструкция предложена М. Тчуенте (М. Tchuente) [см. Ars Combina- toria 14 (1982), p.115-122]. Широкие обобщения рассмотрены Ф. Раски и К. Сэвидж [см. SIAM J. Discrete Math. 6 (1993), p.152-166]. См. также публикацию на русском языке [Кибернетика 11,3 (1975), р.17-25], или ее английский перевод [см. Cybernetics 11 (1975), р.362-366].
128 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 69. Согласно подсказке, модифицированный алгоритм будет вести себя, как ниже, при п = 5. 1234 1243 1423 4123 4132 1432 I t I t 24153 54123 14523 14325 35142 32145 32541 52341 32415 35412^-31452 51432 I 54321 12345 15342 23451 21543 34512 32154- t 24351 15342 12435 53421 51243 34215 ►35124 51423 21453-^25413 23415 53241 23541 23145 25143 14235 15324- 14532 ►12354 45123^-42153 42351 «-45321 43215 43512^-41532 41235 51234 21534-+23514 53214 I t I t 54132 52314 41325 45231- 13254< I 34152 32514< 41523- ►43251 -15234 t 1324 3124 t I 24513 54213 31542 31245 32451^-35421 1542312453 13245 13542 54231 24531 51324 21354- >42513 42315 45312< 43152-^45132 42135 25134^-23154 53124 I t I 1342 I 24315 51342 52431 13425 15243 34251 -31524 3142 t 14253 35241 31425 3412 I 14352 25341 21435 52413 53412 53142 52143 24135 ►25314 -41352 34125 35214- 41253ч 42531^-43521 13524-> 12534 t i показано 4312 t 54312 21345 25431 13452 12543 34521 +31254 -45213 43125 52134 t Здесь столбцы представляют множества перестановок, которые циклически поворачиваются и/или отражаются всеми 2п способами. Следовательно, каждый столбец содержит точно одну четочную перестановку (см. упр. 18). Алгоритм Р можно применить для систематического перебора всех четочных перестановок, зная, что пара ху появляется перед ух в его столбце, тогда т' вместо р' переводит нас вправо или влево. На этапе Z2 пропускается замена а\ «->• а2, таким образом приводя к повтору перестановок а\ .. .ап-\ в обратном направлении. (Здесь неявно используется тот факт, что t[k] = t[n\ — к] на выходе алгоритма Т.) Теперь, если заменить 1... п на 24... 31 и А\... Ап на A\AnA2An-i..., получим немодифицированный алгоритм, результат выполнения которого показан на рис. 22,6. Этот метод инспирирован (неконструктивной) теоремой Э. С. Рапопорта (Е. S. Rapo- port) [см. Scripta Math. 24 (1959), p.51-58]. Он иллюстрирует более общий факт, замеченный Карлой Сэвидж в 1989 году: граф Кэли для произвольной группы, генерированной тремя инволюциями р, сг, т, имеет гамильтонов цикл, когда рт = тр [вскоре будет опубликована посвященная этой теме работа И. Пака (I. Рак) и Р. Радойчича (R. Radoicic), "Hamiltonian paths in Cayley graphs" (Гамильтоновы пути на графах Кэли)]. 70. Нет. Самый длинный цикл в этом диграфе имеет длину 358. Но есть пары непересекающихся 180-циклов, на основе которых можно вывести гамильтонов путь длины 720. Например, рассмотрим циклы аа/За и 7<7сг, где 5532532552315553113211 а = та та та та та та та та та та та та та та та та та та та та та та ; о 352252311513553212311324 (3 = а та та та та та та та та та та та та та та та та та та та та та та та ; 5531132523515321231132 7 = ата та та та та та та та та та та та та та та та та та та та та та 55535252311513355152312 та та та та та та та та та та та та та та та та та та та та та та та . Если начать с 134526 и далее продолжить аа/Зт, то получим 163452; если далее продолжить 7сгт, то получим 126345; если далее продолжить а^т, то получим 152634; если далее продолжить (Заа, то в итоге получим 415263. 71. Брендан Мак-Кэй (Brendan McKay) и Фрэнк Раски (Prank Ruskey) нашли такие циклы с помощью компьютера для п = 7, 9 и 11, но какую-либо интересную структуру им обнаружить не удалось. 72. Любой гамильтонов путь включает (п — 1)! вершин, которые преобразуются у »->• ж, причем за каждой из вершин (если она не последняя) следует вершина, которая преобразуется х н» х. Одна вершина должна быть последней, а другие (п — 1)! + 1 вершин преобразуются и->ж.
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 129 73. (а) Сначала предположим, что (3 является тождественной перестановкой (). Тогда каждый цикл а, который содержит элемент А, лежит целиком внутри А. Следовательно, циклы а получаются за счет пропуска всех циклов а, которые не содержат элементов А. Все остальные циклы имеют нечетную длину, поэтому а является четной перестановкой. Если /3 не является четной перестановкой, то применим этот аргумент к а' = а/3~, 0 = () и а' = а(3~. Отсюда следует, что сг' является четной перестановкой. Таким образом, а и (3 имеют одинаковый знак. Аналогично а и а имеют одинаковый знак, поскольку /За~ = (ctf3~)~ имеют одинаковый порядок, как а/3~. (Ь) Пусть X является множеством вершин графа Кэли в теореме R, а а является перестановкой X, которая переводит вершину 7г в атх. Эта перестановка имеет д/а циклов длины а. Аналогично определим перестановку /3. Тогда а/3~ имеет д/с циклов длины с. Если с нечетно, то любой гамильтонов цикл в графе определяет цикл <т, который содержит все вершины и удовлетворяет гипотезе (а). Следовательно, а и /3 имеют нечетное число циклов, поскольку знак перестановки п элементов с г циклами равен (—1)п_г (см. упр. 5.2.2-2). (Это доказательство, согласно которому X не может быть объединением любого нечетного числа циклов, получено Р. А. Ранкином (R. A. Rankin) [Proc. Cambridge Phil. Soc. 62 (1966), p.15-16].) 74. Представление /33 jk единственно, если потребовать 0 < j < j/c и 0 < fe < с. Если имеем /З3 = 7fe для некоторого j с 0 < j < д/с, то группа будет иметь не более jc элементов. Отсюда следует, что /Зд^с = 7* для некоторого t. Пусть а является гамильтоновым циклом, как в ответе к предыдущему упражнению. Если тго~ = тга, то тт^а должно быть равно ivyct, поскольку ttj/З = тга. А если тга = тг(3, то 7Г7<т не может равняться тт^а, поскольку это подразумевало бы 7Г72сг = 7Г72а, ..., 7Г7ссг = 7Г7°а. Таким образом, все элементы Trjk имеют эквивалентное поведение по отношению к их наследникам в а. Обратите внимание на то, что если j > 0, то существует такое к < j, что тга3 = 7гакР3~к = 7r/?J7fc. Следовательно, тга9^с = 7гуь+к эквивалентно 7г, и такое же поведение повторится. Первый возврат к 7г за д этапов происходит тогда и только тогда, когда t + к является взаимно простым для с. 75. Примените результат из предыдущего упражнения для д = тп, а = т, b = п, с = mn/d. Значение t удовлетворяет условиям t = 0 (по модулю т) и t + d = 0 (по модулю п). Отсюда следует, что к + t J_ с тогда и только тогда, когда (d — k)m/d J_ kn/d. Замечание. Модулярный код Грэя из упр. 7.2.1.1-78 является гамильтоновым путем от (0,0) к (ш — 1, (—т) mod п). Он является гамильтоновым циклом тогда и только тогда, когда т кратно п. Естественно было бы сделать предположение (ложное), что существует по крайней мере один гамильтонов цикл для d > 1. Но П. Эрдеш (P. Erdos) и В. Т. Троттер (W. Т. Trotter) обнаружили [см. J. Graph Theory 2 (1978), р.137-142], что если р и 2р + 1 являются нечетными простыми числами, то нет подходящего к для т = р(2р + 1)(3р +1) и п = (Зр -h 1) U%i ^пР°стоеН^рИ<?*2Р+1] См. работу Дж. Э. Галлиана (J. A. Gallian) в Mathematical Intelligencer 13,3 (Summer 1991), р.40-43, где приводятся интересные факты о других типах циклов в Om х Оп. 76. Предположим, что проход начинается в нижнем левом углу. Для тип, кратных 3, нет решений, поскольку 2/3 клеток недостижимы в таком случае. В противном случае, допуская d = gcd(m,n) и поступая, как в предыдущем упражнении, но с (х,у)а =
130 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 ((х 4- 2) mod m, (у 4- 1) mod п) и (х, у)(3 = ((х 4- 1) mod га, (у 4- 2) mod п), находим ответ: d . ]Р [gcd((2d - fc)ra, (/с 4- d)n) = d или (mn 13и gcd((2d - к)т, (к 4- d)n) = 3d)]. 77. 01 * Генератор перестановок по типу Хипа. 02 N IS 10 Значение n (3 или больше, но не слишком) 03 t IS $255 04 j IS $0 05 k IS $1 Sk 06 ak IS $2 07 aj IS $3 08 LOC Data_Segment 09 a GREG 0 Базовый адрес для ао ... ап-ь 10 AO IS @ 11 AI IS 0+8 12 A2 IS 0+16 13 LOC 0+8*N Пространство для ао ... an-i. Ц с GREG 0-8*3 Положение 8со. 15 LOC 0-8*3+8*N 8сз ... 8cn_i, в исходном состоянии нуль. 16 ОСТА -1 8сп = — 1, удобная сигнальная метка. 17 u GREG 0 Содержимое ао, кроме внутреннего цикла. 18 v GREG 0 Содержимое а\, кроме внутреннего цикла. 19 w GREG 0 Содержимое аг, кроме внутреннего цикла. 20 LOC #100 21 1H STCO 0,c,k В — А ск <г- 0. 22 INCL k,8 В - A fc<-fc4-l. 23 OH LDO j,c,k В j<^ck. Ц CMP t, j,k В 25 BZ t,lB В Цикл, если = к. 26 BN j,Done А Завершить, если ск < 0 (к = п). 27 LDO ak,a,k А — 1 Извлечь ак. 28 ADD t,j,8 А-1 29 STO t ,c,k А-1 ск <- j + 1. 30 AND t,k,#8 А-1 31 CSZ j,t,0 А — 1 Установить j <— 0, если к четно. 32 LDO aj,a,j А — 1 Извлечь aj. 33 STO ak,a, j А — 1 Заменить на ак. 34 CSZ u,j,ak А — 1 Установить и 4- akj если j = 0. 35 SUB JO>8 А-1 j 4- j - 1. 36 CSZ v,j,ak А — 1 Установить v 4— ак, если j = 0. 37 SUB А-1 j<r-j-l. 38 CSZ w,j,ak А — 1 Установить w 4— ак, если j = 0. 39 STO aj,a,k А — 1 Заменить ак тем, что было aj. 40 Inner PUSHJ 0,Visit А (См. (42)) 55 PUSHJ 0,Visit А 56 SET t ,u А Обменять и 4-> w. 57 SET u,w А 58 SET w,t А
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 131 59 SET k,8*3 A 60 JMP OB A 61 Main LDO u,AO i—' 62 LDO v,Al 1 63 LDO w,A2 1 64 JMP Inner 1 fc<-3. I 78. Строки 31-38 дают 2r — 1 инструкций; строки 61-63 — г и строки 56-58 — 3 + (г — 2)[г четное] инструкций (см. us(r — 1) в ответе к упр. 40). Следовательно, общее время выполнения равно ((2г! + 2) А + 2В 4- г - 5)/х 4- ((2г! + 2г + 7 + (г - 2)[г четно]) Л + 7В - г - 4)г>, где А = п\/г\ и В = п!(1/г! 4- Ь 1/п!). 79. SLU u, [#f] ,t; SLU t,a,4; XOR t,t,a; И t,t,u; SRU u,t,4; OR t,t,u; XOR a,a,t. Здесь, как и в ответе к упр. 1.3.1'—34, '[#f]' обозначает регистр с константой #f. 80. SLU u,a,t; MXOR u,[#8844221188442211],u; И u,u,[#ff000000]; SRU u,u,t; XOR a,a,u. Это уловка, которая преобразует * 12345678 в # 13245678, когда t — 4, но (45) все еще работает. Даже более быстрое и хитроумное решение будет процедурой, аналогичной (42). Рассмотрим PUSHJ 0,Посетить; MXOR a,a,cl; PUSHJ 0,Посетить; ... MXOR а,а,с5; PUSHJ 0,Посетить где cl, с5 являются константами, с помощью которых * 12345678 последовательно преобразуется в * 12783456, # 12567834, * 12563478, # 12785634, # 12347856. Другие инструкции, выполняемые с относительной частотой только 1/6 или 1/24, могут позаботиться о перестановке ниблов внутри байтов и между ними. Остроумный способ, но он не лучше (46), в связи с накладными расходами на выполнение PUSHJ/P0P. 81. t IS $255 ;k IS $0 ;kk IS $1 ;c IS $2 ;d IS $3 SET k,l k+-l. 3H SRU d,a,60 d <— самый левый нибл. SLU a,a,4 a <- 16a mod 1616. CMP c,d,k SLU kk,k,2 SLU d,d,kk OR t,t,d t<^t+16kd. PBNZ с, IB Вернуться к основному циклу, если d^ к. INCL k,l к «- к Л- 1. PBNZ а,ЗВ Вернуться ко второму циклу, если к < п. | 82. fi + (5п! + НА — (п — 1)! 4- 6)v = ((5 + 10/n)v + 0(п~2))п\ плюс время посещения, где A = Ylk=i обозначает количество циклов на этапе ЗН. 83. С должной инициализацией и 13-октабайтовой таблицей потребуется всего несколько инструкций MMIX: magic GREG #8844221188442211 ОН (Посетить регистр а) PBN с, Sigma Таи MXOR t,magic,a; ANDNL t,#ffff; JMP IF Sigma SRU t,a,20; SLU a,a,4; ANDNML a,#f00 1H XOR a,a,t; SLU c,c,l 2H PBNZ c,0B; INCL p,8 3H LD0U c,p,0; PBNZ c,0B |
132 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 84. Предполагая, что все процессоры обладают одинаковой мощностью, допустим, что к-й процессор генерирует все перестановки ранга г для (к — 1)п\/р < г < кп\/р с помощью любого метода на основе контрольных таблиц с\... сп. Стартовая и конечная контрольные таблицы легко вычисляются за счет преобразования их рангов в систему обозначений со смешанным основанием (упр. 12). 85. Можно применить технологию, использованную в алгоритме 3.4.2Р. Чтобы вычислить к = г (а), сначала следует установить о!а. <— j для 1 < j < п (обратная перестановка). Затем установить к «— 0 и для j = п, п — 1, ..., 2 (в этом порядке) установить t «— oj, к «— kj +1 — 1, at <— aj, a!a. <— t. Чтобы вычислить И-1^), начнем с oi f- 1. Тогда для j = 2, ..., n — 1, n (в этом порядке) установить t <- (к modj) + 1, aj «— at, at <— к <— [fc/jj [см. статью С. Плещински (S. Pleszczynski) в Inf. Proc. Letters 3 (1975), p. 180-183; а также статью В. Мирвольда (W. Myrvold) и Ф. Раски в Inf. Proc. Letters 79 (2001), р.281-284]. Другой метод предпочтительнее, если нужно использовать ранжирование и неранжирование только для пт вариаций а\ ... am of {1,..., п}: чтобы вычислить к = r(ai ... am), начнем с bi ... bn «— b[ ... b'n «— 1... n; затем для j = 1, ..., m (в этом порядке) установить t 4— b'a., bt 4- bn+i-j и b'bt 4- t\ наконец установить к 4— 0 и для j = m, ..., 1 (в этом порядке) установить к «— к х (n + 1 — j) + b'a. — 1. Чтобы вычислить r^_1^(/u), начнем с bi ... bn 1... п; затем для j = 1, ..., т (в этом порядке) установить £ <— (к mod (п +1 — j)) Н-1, aj «— 6t, fet <— frn+i-j, к «— [^/(п-|-1 — j)J. (См. упр. 3.4.2-15 для случаев больших п и малых т.) 86. Если ж -< у и у -< 2, то алгоритм никогда не переместит ни у влево от ж, ни 2 влево от у, поэтому не удастся проверить х по отношению к z. 87. Они имеют лексикографический порядок, а в алгоритме Р используется отраженный порядок Грэя. 88. Создайте обратные перестановки с помощью а'0 < а[ < а'2, а'3 < а'4 < а;5, а'6 < а'7, а8 < а9, а0 < а3, а6 < а8. 89. (а) Пусть dk = тах{,7 | 0 < j < к и j является нетривиальным}, где 0 считается нетривиальным. Эта таблица легко предварительно вычисляется, поскольку j является тривиальным тогда и только тогда, когда он идет после {l,...,j — 1}. Установить к <- dn на этапе V2 и к <— dk-i — на этапе V5. (Предполагая dn > 0.) (b) Теперь М = 5Z7=i является нетривиальным]. (c) Есть по крайней мере две топологические сортировки a j ... ак множества {j,..., fc}, и любая из них может быть помещена после любой топологической сортировки a\...dj-\ of {l,...,j-l}. (d) алгоритм 2.2.3T повторно выводит минимальные элементы (элементы без предшествующих им элементов), удаляя их из графа отношений. Используем его в обратном порядке, повторно удаляя и присваивая высшие маркеры максимальным элементам (элементам без последующих элементов). Если существует только один максимальный элемент, то он является тривиальным. Если к и Z максимальны, то оба они выводятся перед любым элементом х с х ~< к или х -< /, поскольку на этапах Т5 и Т7 максимальные элементы хранятся в очереди (а не в стеке). Таким образом, если к является нетривиальным и выводится первым, то элемент / может стать тривиальным, но следующий нетривиальный элемент j не будет выводиться до /; а к не связан с I. (e) Пусть для нетривиального t выполняется s\ < S2 < • • • < sr = N. Тогда имеем sj ^ 2sj_2, согласно (с). Следовательно, М = S2 Н l-sr<Sr(l + ^ + ^H ) Ч- sr-i(l + ^ + ^ + ••0 <4sr. (На самом деле, как заметил М. Печарски (М. Peczarski), можно получить более точную оценку. Пусть so = 1, нетривиальными индексами являются 0 = кг < къ < • • • < кг,
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 133 и пусть kj = тгх{к | 1 < к < kj, к kj} для j > 1. Тогда kj > kj_i. Существует Sj топологических сортировок которые завершаются kj+i, и существует по крайней мере Sj-i топологических сортировок, которые завершаются А^+1, поскольку каждая из Sj-i топологических сортировок {1,..., kj — 1} может быть расширена. Следовательно, Sj+l > Sj + Sj-i для 1 < j < г. Теперь пусть у0 = 0, у\ = F2 + h Fr, и од = од_2 + - i^r+i для 1 < j < г. Тогда Fr+l(si Н 1- 5Г) + 5^2/j(5r+l-i — Sr-j - Sr-l-j) = (^2 Ч h Fr+i)sr, J=l и каждое значение од = Fr+i — 2F3; — (—l)JFr+i-j является неотрицательным. Следовательно^! Ч Ь sr < ((F2 Ч h Fr+^/Fr-j-^Sr « 2,6sr. В следующем упражнении показано, что это ограничение является наилучшим из возможных.) 90. Число N таких перестановок равно Fn+i, согласно упр. 5.2.1-25. Следовательно, М — Fn+1 Ч- • • • Ч- F2 = Fn+3 — 2 и 4>2N. Кстати, обратите внимание, что все такие перестановки удовлетворяют ai ... ап = а[ .. .а'п. Их можно упорядочить в виде пути Грэя (упр. 7.2.1.1-89). 91. Поскольку tj = (j - - 3)... (2 или 1), находим М = (1 Ч- 2/л/7гп Ч- 0{\/n))N. Замечание. Таблицы инверсии ci ... C2n для перестановок, удовлетворяющих условиям (49), характеризуются следующими условиями: с\ — 0, 0 < с2к < C2fc-i, 0 < с2к+\ < C2fc-1 + 1. 92. Общее число пар (Л, 5), где i? является частичным упорядочением, a S — линейным упорядочением, которое включает R, равно произведению Рп и ожидаемому числу топологических сортировок; оно также равно произведению Qn и п\. Отсюда следует ответ: n! Qn/Pn. Процесс вычисления Рп и Qn рассматривается в разделе 7.2.3. Для 1 < п < 12 ожидаемое число топологических сортировок приблизительно равно (1, 1.33, 2.21, 4.38, 10.1, 26.7, 79.3, 262, 950, 3760, 16200, 74800). Асимптотические значения для п —> оо были выведены Г. Р. Брайтвеллом (G. R. Brightwell), X. Ю. Промелем (Н. J. Promel) и А. Стегер (A. Steger) [см. J. Combinatorial Theory А73 (1996), p. 193-206], но асимптотическое поведение очень отличается от поведения п в диапазонах, которые встречаются на практике. Значения Qn впервые были определены Ш. П. Аванном (S. P. Avann) для п < 5 [см. JEquationes Math. 8 (1972), р.95-102]. 93. Основная идея заключается в введении подстановочных элементов п Ч- 1 и п Ч- 2 с j -< n + 1 и j -<пЧ-2 для 1 < j < п и поиске всех топологических сортировок такого расширенного отношения с помощью смежных замен. Затем нужно взять каждую вторую перестановку, игнорируя подстановочные элементы. Для этого можно использовать алгоритм, аналогичный алгоритму V, но с рекурсией, которая сводит п к п — 2 за счет вставки п— 1 и п среди а\ ... ап-2 всеми возможными способами, предполагая, что п — 1 / п, иногда обменивая п 4-1 с п Ч- 2. [См. статью Г. Пруссе и Ф. Раски в SICOMP 23 (1994), р.373-386. Бесцикловая реализация описана Э. Р. Канфилдом и С. Дж. Вильямсоном в Order 12 (1995), р.57-75.] 94. Случай п = 3 иллюстрирует общую идею структуры, которая начинается с 1... (2п) и заканчивается 1(2п)2(2п-1)... п(пЧ-1): 123456, 123546, 123645, 132645, 132546, 132456, 142356, 142536, 142635, 152634, 152436, 152346, 162345, 162435, 162534. Сочетания можно рассматривать как инволюции {1,..., 2п}, которые содержат п циклов. В таком представлении эта структура использует две транспозиции на один этап.
134 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 Обратите внимание на то, что таблицы инверсии С только что перечисленных перестановок имеют следующий вид: 000000, 000100, 000200, 010200, 010100, 010000, 020000, 020100, 020200, 030200, 030100, 030000, 040000, 040100, 040200. Вообще, d = С3 = • • • = с2п-1 = 0, и п-кортежи (Сг,С4,... ,Сгп) проходят отраженный код Грэя на основаниях (2п — 1,2п — 3,..., 1). Таким образом, процесс генерации может легко стать бесцикловым, если это потребуется [см. статью Т. Уолша (Т. Walsh) в J. Combinatorial Math, and Combinatorial Computing 36 (2001), p.95-118, Section 1]. Замечание. Алгоритмы генерации всех сочетаний восходят еще к Й. Ф. Пфаффу [см. Abhandlungen Akad. Wissenschaften (Berlin: 1814-1815), p. 124-125], который описал две такие процедуры. Первый метод является лексикографическим, который также соответствует лексикографическому порядку таблиц инверсии С. Его второй метод соответствует колексикографическому порядку этих таблиц. Четная и нечетная перестановки меняются в обоих случаях. 95. Нужно генерировать обратные перестановки с ai < а'п > а'2 < а^_х > • • •, используя алгоритм V. (О количестве решений см. упр. 5.1.4-23.) 96. Например, можно начать с а\ ... ап-\ап = 2 ... nl и 6162 • •. bnbn+i = 12 ... nl и использовать алгоритм Р для генерации (п — 1)! перестановок 62 ... Ьп для {2,..., п}. Сразу после этого алгоритм выполняет bi «-»• &г+1, затем аь1_1 <— bi, a&i «— Ьг+i, пъ1+1 <— Ьг+2 и посещает а\ ... ап. 97. Используйте алгоритм X с tk(ai,..., ак) = 1ак Ф к\ 98. С помощью обозначений из упр. 47 имеем: Nk = ]Г (к)(—l)j(n — j)— по методу (упр. 1.3.3-26). Если к = O(logn), тогда Nn-k = (n!e_1/A;!)(l + 0(log n)2/n); следовательно, А/п\ « (е — 1)/е и В/п\ и 1. Количество ссылок на память, согласно условиям упр. 48, следовательно, равно & А + В + ЗА + В — Nn + ЗА» п! (9 — |) » 6,06п!, т.е. приблизительно 16,5 на одно неупорядочение. [См. описание аналогичного метода в работе С. Дж. Акля (S. G. Akl), BIT 20 (1980), р.2-7.] 99. Допустим, что Ln генерирует Dn U Dn-\, начиная с (1 2 ... п), затем (2 1 ... п), и заканчивая (1 ... п—1); например, l3 = (1 2 3), (2 1 3), (1 2). Тогда можно генерировать Dn+i как Кпп, ..., Кп2, Kni, где Knk = (12 ... ri)~k(n n-hl)Ln(l 2 ... n)k; например, Da имеет вид (1 2 3 4), (2 1 3 4), (1 2)(3 4), (3 1 2 4), (1 3 2 4), (3 1)(2 4), (2 3 14), (3 2 14), (2 3)(14). Обратите внимание на то, что Knk начинается с цикла (fc+1 ... n 1 ... к п+1) и заканчивается (&+1 ... nl ... к—1)(к п+1), поэтому умножение в обратном порядке на (&—1 к) переводит нас от Кпк к ifn(fc-i)- Кроме того, умножение в обратном порядке на (1 п) возвращает нас от последнего элемента Dn+\ к первому. Умножение в обратном порядке на (1 2 n-fl) возвращает нас от последнего элемента Dn+i к элементу (2 13 ... п), с которого можно вернуться к элементу (12 ... п), следуя за циклом для Dn в обратном направлении, таким образом, завершая список Ln+i, как и требовалось. 100. Используйте алгоритм X с tk(a\,..., ак) = 1р > 0 или l\q] ф к + V. Замечание. Количество неразложимых перестановок равно: [zn] (l — 1/X^fcLo k\zk)\ см. работу Л. Комтета (L. Comtet) в Comptes Rendus Acad. Sci. A275 (Paris, 1972), p.569- 572. А. Д. Кинг (A. D. King) [Discrete Math. 306 (2006), 508-516] показал, что неразложимые перестановки можно эффективно генерировать, делая только одну транспозицию на каждом этапе. Действительно, для этого достаточно смежных транспозиций. Например, для п = 4 неразложимыми перестановками являются 3142, 3412, 3421, 3241, 2341, 2431, 4231, 4321, 4312, 4132, 4123, 4213, 2413. 101. В данном случае генератор лексикографических инволютивных перестановок аналогичен алгоритму X.
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 135 Y1. [Инициализировать.] Установить ак <— к и lk-i 4— к для 1 < к < п. Затем установить 1п <— О, к <— 1. Y2. [Перейти на уровень к.] Если к > п, посетить а\ ... ап и перейти к Y3. В противном случае установить р <— /о, Uk «— р, /о ^— 1р, к «— fc + 1 и повторить этот этап. (Предполагается, что ар = р.) Y3. [Уменьшить к.] Установить к «— А: — 1 и завершить, если /г = 0. В противном случае установить q <— Uk и р «— aq. Если р = а, установить /о a, g «— 0, г <- 1Р и А; <- А; 4- 1 (подготовка к ар > р). В противном случае установить 1ик_г <- q, г <- lq (подготовка к ар > q). Y4. [Увеличить ар.] Если г = 0, то перейти к Y5. В противном случае установить lq 4г- Zr, Uk-\ 4- q, Uk <— г, ар <- г, aq <— q, ar <- р, к <— к + 1 и перейти к Y2. Y5. [Восстановить ар] Установить lo <— р, ар «— р, aq <— о, «— к — 1 и вернуться к Y3. I Пусть £п+1 = tn 4- ntn-i, an+i = 1 4- an + nan-i, to = £i = 1, Q>o = 0, a\ = 1 (см. уравнения 5.1.4-(40)). Этап Y2 выполняется tn раз с /с > п и an раз с к < п. Этап Y3 выполняется ап раз с р = g и всего ап 4- tn раз. Этап Y4 выполняется tn — 1 раз, а этап Y5 — ап раз. Общее число мемсов для всех tn выводов, следовательно, равно llan 4- 12in, где ап < 1.25331414tn. (Конечно, этот алгоритм можно оптимизировать в случае необходимости.) 102. Создадим список Ln, который начинается с () и заканчивается (n—1 п), начиная с Ьз = (), (1 2), (1 3), (2 3). Если п нечетно, то Ln+i имеет вид Ln, К^и Кп2, ..., К*п, где Кпк = (к ... п)~~Ln-i(к п+1). Например: U = (), (1 2), (1 3), (2 3), (2 3)(1 4), (1 4), (2 4), (1 3)(2 4), (1 2)(3 4), (3 4). Если п четно, то Ln+i имеет вид Ln, #n(n-i)> Кп(п-2)^ • • •» ^ш, (1 ri-2)Ln-i (1 n-2)(n n+1). Более подробно эта тема рассматривается в работе Т. Уолша (см. в ответе к упр. 94). 103. Следующее элегантное решение предложено К. Сэвидж. Требуется всего п—2 разных операций pj для 1 < j < тг, где заменяет а3-\а3а3+\ на Oj+iOj-iaj, если j четно, a3a3+\a3-i, если j нечетно. Предположим, что п > 4; пусть >Ц = (рзР2р2рз)3- Вообще, Лп начинается и заканчивается рп-г и содержит 2п—2 появлений рп-ь Чтобы получить An+i, заменим к-ю операцию pn-i в Лп на рпА'прп, где /с = 1, 2, 4, ..., 2п—2, если п четно, и к = 1, 3, ..., 2п—3, 2п—2, если п нечетно, и где А'п равно Ап с удаленными первым или последним элементом. Тогда, если начать с а\... ап — 1... п, операции рп-\ в Ап приведут к тому, что ап будет проходить последовательные значения п —> pi п —> рг —► • • • —> рп-\ —У п, где pi.. .pn-i = (n—1 —[пчетное])... 4213 ... (n—1 —[nнечетное]); финальная перестановка снова будет иметь вид 1... п. 104. (а) Для хорошо сбалансированной перестановки 5^fc_i как = п(п 4-1)2/4- (b) Замените А; на ак при суммировании по к. (c) Достаточно быстрый способ подсчета, когда п не очень велико, можно предложить на основе оптимизированного алгоритма простых изменений из упр. 16, поскольку величина ^2 как изменяется простым способом с каждой смежной заменой и поскольку п — 1 из каждых п этапов являются "охотами", которые могут быть выполнены очень быстро. Работу можно сократить вдвое, рассматривая только перестановки, в которых 1 предшествует 2. Значения для 1 < п < 15 равны 0, 0, 0, 2, 6, 0, 184, 936, 6688, 0, 420480, 4298664, 44405142, 0, 6732621476. 105. (а) Для каждой перестановки а\... an, вставьте ^< между а3 и aj+i, если а3 > aj+i; вставьте между ними либо =, либо если aj < a^+i. (Следовательно, перестановка с к "восхождениями" достигает 2к слабых порядков. Слабый порядок иногда называется
136 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 "предпочтительным упорядочением"; в упр. 5.3.1-4 показано, что их существует приблизительно n!/(2(ln 2)n+1.) Код Грэя для слабого порядка, в котором на каждом этапе меняется -<«-> = и/или aj <-> cij+1, можно получить, комбинируя алгоритм Р с двоичным кодом Грэя на восхождениях. (Ь) Начнем с а\... anan+\ = 0 ... 00 и ао = — 1. Будем выполнять алгоритм L, пока он не остановится с j = 0. Далее нужно найти такое что а\ > • • • > ак = afc+i, и завершить, если к = п. В противном случае установить ai «— ак+\ + 1 для 1 < / < к и перейти к этапу L4. (См. работу М. Мора (М. Мог) и А. С. Френкеля (A. S. Praenkel) в Discrete Math. 48 (1984), р.101-112. Слабо упорядоченные последовательности характеризуются тем, что если появляется к и к > 0, то появляется и к — 1.) 106. Все слабо упорядоченные последовательности можно получить с помощью последовательности элементарных операций ai «-» aj или ai «— aj. (Возможно, можно было бы сильнее ограничить эти преобразования, допуская только aj a^+i или aj «— a^+i для 1 < j < п.) 107. На каждом этапе величина J2k=i 2к[ак = к] растет, как заметил X. С. Вильф, поэтому игра должна завершиться. Можно применить по крайней мере три подхода для решения: один плохой, один хороший и один еще лучше. Плохой заключается в розыгрыше всех 13! тасовок и записи самой длинной. Этот метод дает правильный ответ, но 13! равно 6 227 020 800, и в среднем игра продолжается приблизительно 8,728 этапа. Хороший способ [см. Э. Пеппердайн (A. Pepperdine), Math. Gazette 73 (1989), р.131- 133] заключается в розыгрыше в обратном порядке, начиная с последней позиции 1* ... *, где * обозначает карту, повернутую лицевой стороной вниз. Карта переворачивается, только если она имеет существенное значение. Для продвижения назад от заданной позиции а\ .. .ап рассмотрим все такие к > 1, что либо ак = /с, либо ак = * и к еще не были перевернуты вверх. Таким образом, следующими для последней позиции являются 21* ... *, 3*1* ... *, ..., п* ... *1. Некоторые позиции (как 6**213 для п = 6) не имеют предшественников, даже если не все карты повернуты вверх. Легко систематически исследовать дерево потенциальных обратных игр и действительно показать, что количество узлов с t символами * точно равно (n—\)\/t\. Следовательно, общее число рассматриваемых узлов точно равно [(п — 1)! е\. Для п = 13 оно равно 1,302,061,345. Но значительно лучший способ заключается в розыгрыше в прямом порядке, начиная с исходной позиции *... * и переворачивая верхнюю карту, если она повернута лицевой стороной вниз, пробегая все (п — 1)! перестановок {2,...,п} по мере переворачивания карт. Если известно, что нижние п — т карт равны (га+1)(га-|-2)... п в этом порядке, то возможно не больше /(га) дальнейших действий. Таким образом, не нужно дальше прослеживать линию игры, если она не будет продолжаться достаточно долго, чтобы это было интересно. Генератор перестановок, как алгоритм X, позволяет использовать одно вычисление для всех перестановок с одинаковым префиксом и отвергнуть не имеющие большого значения префиксы. Карта в позиции j необязательно должна принимать значение j, когда она переворачивается. Для п = 13 в этом методе необходимо рассмотреть только (1,11,940,6960,44745,245083,1118216,4112676,11798207,26541611, 44380227, 37417359) ветвей на уровнях (1,2,..., 12) и выполнить в общем только 482 663 902 действия вперед. Хотя он повторяет некоторые линии игры, но раннее обрезание невыгодных ветвей ускоряет вычисления в 11 раз по сравнению с обратным методом для п = 13. Единственный способ достижения длины 80 заключается в том, чтобы начать с 2 9 4 5 11 12 10 1 8 13 3 6 7. 108. Этот результат верен для любой игры, в которой а\ ... ап —У a>kO,p(ki2) • • • aP(fc,fc-i)Ciiafc+i... ап
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 137 для а\ = к, где р(к, 2).. .р(к, к — 1) является произвольной перестановкой {2,..., к — 1}. Допустим, а\ принимает точно т различных значений d(l) < • • • < d(ra) во время игры. Докажем, что при этом произойдет не более Fm+i перестановок, включая исходную тасовку. Это утверждение очевидно для т = 1. Пусть d(j) является исходным значением a<i(m), где j < га, и допустим, что а^т) изменяется на этапе г. Если d(j) = 1, то количество перестановок равно г + 1 < Fm + 1 < Fm+i. В противном случае г < Fm_i и не более Fm дальнейших перестановок последуют за этапом г [см. SIAM Review 19 (1977), р.739-741]. Значения /(п) для 1 < п < 16 имеют вид (0, 1, 2, 4, 7, 10, 16, 22, 30, 38, 51, 65, 80, 101, 113, 139) и достижимы за (1, 1, 2, 2, 1, 5, 2, 1, 1, 1, 1, 1, 1, 4, 6, 1) способов соответственно. Единственная самая длинная перестановка для п = 16 имеет вид 9 12 6 7 2 14 8 1 11 13 5 4 15 16 10 3. 109. Согласно прямому методу из ответа к упр. 107, функция /(п) растет с интенсивностью, по крайней мере равной п log п (по сравнению с процедурой раскладывания (coupon collecting)). 110. Для 0 < j < 9 создадим битовые векторы Aj — [а3£ Si ]... [aj eSm]n Bj = [j G Si ]... [ j £ Sm]. Тогда количество j, таких, что Aj = v, должно равняться количеству к, таких, что Bk — v, для всех битовых векторов v. И в таком случае значения {aj \ А3 = v} следует присвоить перестановкам {к \ Bk = v} всеми возможными способами. Например, битовые векторы в данной задаче имеют вид (Ао, ...,А9) = (9,6,8, Ъ, 5,4,0, а, 2,0), (Б0,..., В9) = (5,0,8,6,2, а, 4, Ъ, 9,0), в шестнадцатеричной системе счисления Следовательно, ао.. .ад = 8327061549 или 8327069541. В более крупной задаче битовые векторы следовало бы разместить в хеш-таблице. Было бы лучше дать этот ответ на основе классов эквивалентности, а не перестановок. Действительно, эта задача имеет мало общего с перестановками. 111. В ориентированном графе с гс!/2 вершинами ai.. .an-2 и тг! ребрами ai.. .an-2 —► аг .. .an-i (по одному для каждой перестановки ai .. .ап) каждая вершина имеет полустепень входа 2 и полустепень выхода 2. Более того, анализируя пути а\ ...ап-2 —► аг ... an_i —У аз ... ап —> а\ ... аиа2 —> а*>... ana2ai —>•••—>• a2aias ... ап~2, можно прийти к выводу, что любая вершина достижима из другой. Следовательно, по теореме 2.3.4.2G, существует контур Эйлера или эйлеров контур (Eulerian trail), причем этот контур эквивалентен универсальному циклу перестановок. Лексикографически наименьшим примером для п = 4 является (123124132134214324314234). (Г. Херлберт (G. Hurlbert) и Г. Айзек (G. Isaak) [см. Discrete Math. 149 (1996), р.123- 129] предложили другой привлекательный подход: назовем модулярным универсальным циклом перестановок такой цикл из п! цифр {0, ...,п}, который обладает следующим свойством: каждая перестановка а\...ап of {1,... ,п} возникает из последовательных цифр ui .. .ип с допущением aj = (щ — с) mod (n -h 1), где с является "отсутствующей" цифрой в {ui,... ,ип}. Например, модулярный универсальный цикл (012032) является существенно единственным для п = 3, а лексикографически наименьшим для п = 4 является (012301420132014321430243). Если вершины аг... ап_2 и а[ ... а'п_2 в диграфе (т.е. ориентированном графе) из предыдущего абзаца считаются эквивалентными для аг — a'i = • • • = ап_2 — а'п_2 (по модулю п), то получим ориентированный граф с (п — 1)!/2 вершинами, контуры Эйлера которого соответствуют модулярным универсальным циклам перестановок для {1,..., п — 1}.)
138 ОТВЕТЫ К УПРАЖНЕНИЯМ 7.2.1.2 112. Согласно упр. 2.3.4.2-22, достаточно подсчитать ориентированные деревья с корнями в местах 12...(п—2) диграфа из ответа к предыдущему упражнению. И эти деревья можно подсчитать, как в упр. 2.3.4.2-19. Для п < 6 числа Un оказываются соблазнительно простыми: U2 = 1, U3 = 3, UA = 27 • 3, U5 = 233 • З8 • 53, U6 = 2190 • З49 • 533. (Здесь (121323) считается таким же циклом, как и (213231), но отличным от (131232).) Марк Кук (Mark Cooke) обнаружил следующий поучительный и эффективный способ вычисления этих значений. Сначала обратим внимание на то, что универсальный цикл перестановок также эквивалентен гамильтонову циклу на графе Кэли с генераторами сг = (1 2 ... п) и р = (1 2 ... п—1). Например, цикл в ответе к предыдущему упр. для п = 4 соответствует циклу <j3p2apa2p2a3pa2p2crpa2p. Теперь рассмотрим матрицу М — 21 — R—Sc размерами n! х п!, где R^' — [я"' = 7гр] и Sn*' = [к' = 7г<т]. Существует такая матрица if, что Н~ RH и Н~ SH имеют диагональный блок, состоящий из к\ копий к\ х к\ матриц R\ и S\ для каждого разбиения Л из п, где к\ является п!, деленным на произведение длин уголков формы Л (теорема 5.1.4Н), и где R\ и S\ являются матричными представлениями р и сг на основе диаграммы Юнга. (Доказательство можно найти в книге Брюса Сагана [Bruce Sagan, The Symmetric Group (Pacific Grove, Calif.: Wadsworth &; Brooks/Cole, 1991)].) Например, для n = 3 имеем: 1 1-11 0 \ 1-10 0-1 10 1-11 -1-110 1 ' -11 0 1-1 -10-1-10/ /0 0 0 1 0 0\ 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 \0 1 о о о о/ /0 1 0 0 0 0\ / 0 0 1 0 0 0 | 1 0 0 0 0 0 0 0 0 0 1 0 ' 0 0 0 0 0 11 \0 0 0 1 о о/ \ Н~ RH (1 о о о о Vo о -1 о о о о 0 0 0 0\ 0 0 0 0 0 10 0 10 0 0 0 0 0 1 0 0 1 о/ /10 0 ' 0 1 о H'SH . 0 0 0 -1 0 0 0 1-10 0 0 0 \о о о о о о о -1 -1/ где строки и столбцы индексируются соответствующими перестановками 1, сг, сг2, р, р<т, per2; здесь /сз = /сш = 1 и fei =2. Следовательно, собственные значения М являются объединением к\-кратных повторяющихся собственных значений для к\ х к\ матриц 21 — R\ — S\. В этом примере собственными значениями (0), (2) и двух (_22 з) являются {0}, {2} и два {2,3}. Собственные значения М непосредственно связаны с собственными значениями матрицы А в упр. 2.3.4.2-19. Действительно, каждый собственный вектор А дает собственный вектор М, если приравнять компоненты для перестановок 7г и 7грсг~, поскольку строки тг и 7грсг_ матриц R + S равны. Например: имеет собственные векторы для собственных значений 0, 3, 3, что дает собственные векторы (1,1,1,1,1,1)т, (1,-1,0,0,-1,1)т, (1,0,-1,-1,0,1)т матрицы М для тех же собственных значений. Матрица М имеет п!/2 дополнительных собственных вектора со всеми нулевыми компонентами, за исключением тех, которые индексированы 7г и 7гсг_р для некоторой 7г, поскольку только строки 7гр~ и 7Г(7~ матрицы R+S имеют ненулевые элементы в столбцах 7г и тгсг~р. Такие векторы дают п!/2 дополнительных собственных значений, равных 2.
7.2.1.2 ОТВЕТЫ К УПРАЖНЕНИЯМ 139 Следовательно, значение Un, т.е. произведение 2/п! и ненулевых собственных значений А, равно 21-п!/2/п! произведению ненулевых собственных значений М. К сожалению, удивительная закономерность малых простых чисел-множителей прекращается: U7 равно 2121731235119751128 4335 7320 792110935, a U9 кратно 59229013196333168. По крайней мере один из этих циклов почти наверняка должен просто описываться и вычисляться, как это было для циклов де Бруийна в разделе 7.2.1.1. Однако ни одной простой конструкции пока не найдено.
ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ Если какой-либо элемент предметно-именного указателя указывает на страницу с упражнением, обязательно просмотрите ответ к этому пражнению. Там может содержаться полезная информация по искомой вами теме. Страница ответа указывается здесь только в том случае, если в ответе есть ссылка на тему, не включенную в формулировку упражнения. р(/с), 17. 4-куб, 61, 93, 106. 8-куб, 29, 49. /г-упорядочение, 88. К/л: киломемс, 67. Мд: мегамемс, 67. MMIX, 8, 74, 87. MX0R, 87. п-кортеж: последовательность или строка длиной п, 12. п-куб, 61, 81. тг, 83, 89. г-перестановка, 80, 83. X0R, 131. Аванн, Ш. П. (Avann, S. Р.), 133. Автоморфизм, 61, 81, 83, 101. Адамар, Дж. С. (Hadamard, J. S.), 98. Айзек, Г. Т. (Isaak, G. Т.), 115 137. Акль, С. Дж. (Akl, S. G.), 134. Алгоритм анализ, 79, 84, 87. безцикловый, 21, 41, 42. модулярный четверичный Грэя, 93. Орд-Смита, 65, 83. перезвона колоколов, 56, 74. простых изменений, 135. разложения на простые множители, 114. Арима, Йориюки (Arima, Yoriyuki, ътжш), 92. Арисава, М. (Arisawa, Makoto, ^^iS), 122. Арифметика, битовая, 15. Арндт, Й. (Arndt, J.), 96. Ауротор, 52. Афоризм, военный, 12. Баец, Дж. К. (Baez, J. С), 98. Бакли, М. Р. В. (Buckley, М. R. W.), 81. Барвелл, Б. (Barwell, В.), 82. Бейдлер, Дж. (Beidler, J.), 58. Беккет, С. (Beckett, S.), 48. Беннет, В. P. (Bennett, W. R.), 16. Бернстайн, А. Дж. (Bernstein, A. J.), 96. Бернулли, Дж. (Bernoulli, J.), 118. Бесцикловость, 93. Бит обращение, 41, 45. псевдослучайный, 51. четности, 17. Бод, 16. Бодо, Эмиль (Baudot, Emile), 16. Борель, Э. (Borel, Е.), 113. Ботерманс, Дж. (Botermans, J.), 108. Брайтвелл, Г. P. (Brightwell, G. R.), 133. Брайш, Р. Л. (Breisch, R. L.), 121. Буквометика, 58, 67, 83. HAWAII, 82. аддитивная, 58. на умножение, 82. сигнатура, 58. чистая, 59, 81, 82. Бучнер, М. М. мл. (Buchner, М. М. Jr.), 96. Вазони, Э. (Vazsonyi, Е.), 108. Байт, А. Т. (White, А. Т.), 57. Валлис, Джон (Wallis, John), 92. Ванг, Т. М. Й. (Wang, Т. М. Y., ЗЕЭШ), 40. Вариация, 80, 83, 122, 132. Вароль, Я. Л. (Varol, Y. L., tnn y\vb ПРУ>), 75, 78. Ватриквант, С. (Vatriquant, S.), 58. Вестон, A. (Weston, A.), 73. Видеман, Д. (Wiedemann, D.), 110. Виккерс, В. Э. (Vickers, V. E.), 46, 99, 101. Вилсон, В. Г. (Wilson, W. G.), 57. Вильф, Г. С. (Wilf, Н. S.), 73, 136. Вильямсон, С. Дж. (Williamson, S. G.), 74, 85, 133. Винкер, С. (Winker, S.), 99. Винклер, П. (Winkler, Р.), 29, 30, 48, 100, 105. Винникомб, Б. (Vinnicombe, В.), 81. Включение-исключение, 18. Вложение, линейное, 77. Восхождение, 135. Вошберн, С. X. (Washburn, S. Н.), 93. Вычисления, параллельные, 88. Галлиан, Дж. Э. (Gallian, J. А.), 129. Галуа, Э. (Galois, Ё.), 61. Гарднер, М. (Gardner, М.), 72, 81, 108, 116. Гвоздяк, П. (Gvozdjak, Р.), 47. Генерация, 12. без циклов, 32. перестановок без циклов, 134. дуальных, 69. лексикографическая, 64, 79. лексикографическая инволютивная, 134. общая, 74. случайных чисел, 51. Гильберт, Уильям С. (Gilbert, William S.), 12. Гильберт, Э. Н. (Gilbert, Е. N.), 47. Гинденбург, К. Ф. (Hindenburg, С. F.), 54. Годин, Л. (Goddyn, L.), 47, 102. Голдстейн, А. Дж. (Goldstein, A. J.), 75.
ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ 141 Головоломка, 8. Hexadecimal Puzzle, 93. SpinOut, 93. гордиев узел, 49. китайская с кольцами, 16, 18, 41, 92, 93. общецифровая, 52. полностью численная, 82. сумасшедшая петля, 49. удивительное каноэ, 108. утомительные железки, 16. Гомес, Петер Дж.(Сотев, Peter J.) 7. Гонсалее-Моррис, Г. (Gonzalez-Morris, G.), 121. Граф звездный, 86. Кэли, 73, 84, 128, 138. ориентированный, 137. преобразование, 48. Грос, Луи (Gros, Louis), 16. Группа, 61, 73. знакопеременная, 57. октаэдра, 120. Грэй, Фрэнк (Gray, Prank), 16. Грэй, Элиша (Gray, Elisha), 16. Дакворт, P. (Duckworth, R.), 5, 56. де Бруийн, Н. Г. (de Bruijn, N. G.), 35. Деген К. Ф. (Degen, С. F.), 98. Дейкстра, Э. В. (Dijkstra, Е. W.), 55. Делитель, 49. Дельта-последовательность, 24, 84. каноническая, 25, 101. Джексон, Б. В. (Jackson, В. W.), 90. Джиянг, М. (Jiang, М., ЩЩ), 73. Джонсон, А. В. (мл.) (Johnson, A. W., Jr.), 121. Джонсон, С. (Johnson, S.), 81. Диаграмма, Юнга, 138. Длина прохода, 47. серии, 27, 29, 109. нечетная, 109. уголка, 138. Дополнение, 29. Дуглас, Р. Дж. (Douglas, R. J.), 100. Дыкман, X. Л. (Dyckman, Н. L.), 49, 108. Дьюдени, Г. Э. (Dudeney, Н. Е.), 17, 58, 82, 116, 122. Дэлли, В. Дж. (Dally, W. J.), 95. Дювалю, Дж. П. (Duval, J. P.), 114. Ерлих, Гидеон (Ehrlich, Gideon), 21. Заворачивание, 31. Задача NP-полная, 120. коммивояжера, 79. о назначениях, 79. Зайтц, P. (Seitz, R.), 71. Закон, смешанного основания, 108. Зальцер, X. Э. (Salzer, Н. Е.), 95. Замена, смежная, 54-59, 135. Значение, собственное, 138. Ивани, Антал (Ivanyi, Antal), 115. Иве, Ф. М. (Ives, F. М.), 84. Игра, крестики-нолики, 83. Изменение, простое, 55, 70, 75, 78, 80. ИЛИ, исключительное, 131. Инверсия, 55, 57. Инволюция, 89, 128, 133. Индексирование, с началом в нуле, 60. Интеллект, искусственный, 94. Итерация, функции, 45. Йошигахара, Н. (Yoshigahara, N., Р У Ш$£), 82, 122. Каан, С. (Kahan, S.), 116, 121. Кавиор, С. P. (Cavior, S. R.), 95. Кайма, 109. Кайстер, В. (Keister, W.), 93. Кальдербанк, А. P. (Calderbank, A. R.), 94. Каммингс, Л. Дж. (Cummings, L. J.), 110. Канфилд, Э. P. (Canfield, Е. R.), 133. Кардан, Дж. (Cardano, G.), 92. Карно, М. (Karnaugh, М.), 42. Карта Карно, 42. Кастаун, Рудольф (Castown, Rudolph), 22. Каттелл, К. М. (Cattell, К. М.), 114. Кахан, С. (Kahan, S.), 121. Кватернион, 45. Кедлайя, К. (Kedlaya, К.), 100. Кемп, P. (Kemp, R.), 118. Киломемс: тысяча обращений к памяти, 67. Кинг, А. Д. (King, A. D.), 134. Клюгель, Дж. С. (Klugel, G. S.), 65. Кнут Д. Э. (Knuth, Donald Ervin, ЩШШ), 2, 4, 9, 109. Код анти-Грэя троичный, 48. Грэя, 27, 116. двоичный, 14, 24-29, 41-46, 46, 49, 55, 85, 109. безтрендовый, 29. длинносерийный, 29. дополняющий, 25. другие варианты, 24. монотонный, 29. нелокальный, 29. сбалансированный, 25, 27, 29. стандартный, 29. десятичный, модульный, 31. отраженный, 31. для п-кортежа, недвоичный, 30. для перестановок, 85. для слабого порядка, 136. дополнительный, 46. модулярный, 101, 106, 129. т-ный, 36, 110. третичный, 98. недвоичный, 48. отраженный, 33, 108, 125, 134. для смешанного основания, 55. отраженный, третичный, 49. рефлексный, 48.
142 ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ троичный, 32. эквивалентный, 47. дополняющий, 101. исправления ошибок, 42. монотонный, 48. Морзе, 50, 109. сбалансированный, 101. Кода, И. (Koda, Y., Й Ш&Ю, 32, 33. Кок, Дж. К. (Cock, J. С), 115. Колокольный звон, 56. Компельмахер, В. Л., 86. Композиция, 41. Компонент, связанный, 47. Комптон, Р. К. (Compton, R. С), 73, 85. Компьютер, параллельный, 120. кубически связанный, 95. Комтет, Л. (Comtet, L.), 134. Кон, М. (Cohn, М.), 100, 103, 106. Конвэй, J. Н. (Conway, Дж. X.), 90. Конкатенация, 38. Контур Эйлера, 137. Координаты, 25. Коэффициент многочлена, 41. полиномиальный, 80. Краузе, К. К. (Krause, К. С), 118. Кремер, В. X. (Cremer, W. Н.), 108. Криптаритм, 58. Куб, пропускная способность, 48. Кук, М. (Cooke, М.), 103, 107, 138. Кума, П. В. (Kumar, P. V., tez-Srv Эез&> <к>3г6), 94. Кэли" A. (Cayley, А.), 73. Лангдон, Дж. Дж. (мл.) (Langdon, G. G. Jr.), 71, 87. Ларриви, Дж. Э. (Larrivee, J. А.), 18. Лемер, Д. X. (Lehmer, D. Н.), 53. Лемпель, Абрахам (Lempel, Abraham, ЪысЬ олчпк), 38. Лес, 32. Ли, Г. (Li, G., $#§), 109. Ли, К. Й. (Lee, С. Y., ^МтШ = Chi Lee ($»)), 93. вес, 42. Линдон, Р. К. (Lyndon, R. С), 38. Липски, В. (мл.) (Lipski, W., Jr.), 123. Лисковец, В. А., 86. Лист, 43. Лойд, Сэм (Loyd, Samuel), 8. Лоуренс, Дж. М. (Lawrence, G. М.), 27, 102. Луч, 43. двоичный, 43. Грэя, 43. Майорана, Джеймс (Maiorana, James), 39, 40. Мак-Дональд, П. (MacDonald, Р.), 81. Мак-Клинток, В. Э. (McClintock, W. Е.), 27. Мак-Крэйви, Э. П. (McCravy, Е. Р.), 81. Мак-Кэй, Б. (McKay, В.), 128. Макромандное расширение, 23. Макропроцессор, 23. Мантель, Биллем (Mantel, Willem), 35. Мартин, М. X. (Martin, М. Н.), 40. Мегамемс: миллион обращений к памяти, 67. Медиана, 44. Метод включения и исключения, 134. Лангдона, 76. Монте-Карло, 127. на основе кода Грэя, 91. обмена Эрлиха, 72, 84, 85. Орд-Смита, 65, 71, 83. отбрасывания девяток, 122. простых изменений, 78, 86. Хипа, 65, 67, 74, 83, 87, 120. Миерс, Ч. P. (Miers, Ch. R.), 114. Мизра, Дж. (Misra, J., АЦ), 92. Мирвольд, В. (Myrvold, W.), 132. Митчел, К. Дж. (Mitchell, С. J.), 38. Многочлен коэффициент, 41. нормированный, 94. примитивный, 35, 96. характеристический, 96. Модулярность, 48. Модуляция, кодово-импульсная, 16. Мозер, Л. (Moser, L.), 100. Моллард, М. (Mollard, М.), 100. Мор, М. (Мог, М., 110 ТОО), 136. Моррис, С. (Morris, S.), 122. Моррис, Э. (Morris, Е.), 56. Мультимножество, 53, 54, 80. перестановки, 77. Мунди, П. (Mundy, Р.), 56. Нарайана, Пандита (Narayana, Pandita son of Nrsirhha 4ft^d, ^f^PT^:)), 54, 117. Наследник, лексикографический, 54. Немет, Э. (Nemeth, Е.), 102. Неранжирование, 14, 31, 41, 48, 88, 132. Неупорядочение, 89. Нибл, 75. Нийенхуйс, A. (Nijenhuis, А.), 73. Нийон, Г. (Nijon, Н.), 81. Новра, Г. (Novra, Н.), 108. Нордстром, А. В. (Nordstrom, A. W.), 43. Оберт, Дж. (Aubert, J.), 106. Обмен первыми элементами, 72, 85. Эрлиха, 84. Образ, 60. Обращение, 53, 117, 119. Обход, 12. блоков перестановок, 65. в прямом порядке, 64, 66. предпостпорядковый, 93. Октонион, 98. Орд-Смит, Р. Дж. (Ord-Smith, R. J.), 65, 83, 118. Основание, смешанное, 48, 106. Основной подлее, 32.
ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ Отмена, 68, 134. Оценка, по методу Монте-Карло, 127. Очередь, 132. Пак, И. (Рак, I.), 127, 128. Патерсон, К. Г. (Paterson, К. С), 38. Пеппердайн, Э. (Pepperdine, А.), 136. Перверзе, Р. К. (Perverse, R. Q.), 48. Перебор, 12. Переброс, 86, 90, 125. Переворот, 64, 84. Перемежаемость, 50, 115. Перемежение, 101. Перенос, 13, 115. Перестановка г, 80, 83. ф(к), 64, 84. in situ, 41, 44. вверх-вниз, 89. генерация, 79. без циклов, 81, 120. Грэя, 44. знак, 57. неразложимая, 89. нечетная, 57, 126. обратная, 77, 81, 132. порядок, 73. применение, 61. произведение, 60. скорейшая генерация, 74. со знаком, 81. тождественная, 61. хорошо сбалансированная, 89. обратная, 89. циклическая, 89. четная, 57, 89. четочная, 81, 128. Переход, логический, число, 26. Перечисление, 12. весовое, 93. Перкис, X. Дж. (Purkiss, Н. J.), 41. Печарски, М. (Peczarski, М.), 132. Плещински, С. (Pleszczynski, S.), 132. Подкуб, 43. правильный, 43. Подлее, 32, 49. Подмножество, 12. Поле, 45. Грэя, 45. Полнота, 89. Полоса, текущая, 33. Порядок, 124. h, 88. колексикографический, 60, 134. лексикографический, 14, 38, 41, 53, 60, 68, 98. обратный колексикографический, 60, 64, 68, 70, 79, 83, 117. органных труб, 128, 135. слабый, 89. функции Уолша, 18. частичный, 88. Посещение, 12. Последовательность, восходящая, 50. "дедовская сдвоенная", 57. дельта, 24, 84. Кембридж 48, 56. монотонная-Ы-+, 27. сдвигового регистра, 50. со сдвигом регистра, 34-40. "Стедмана сдвоенная", 57. стандартная, 38. Постумножение, 61. Поток, Грэя, 47. Предпостпорядок, 93. Представление, связанное, 42. Предумножение, 61. Преобразование, Адамара, 20, 97, 98. вложенного графа, 48. на месте, 21. Уолша, 20, 45. быстрое, 45. Фурье, быстрое, 41. дискретное, 20, 41, 98. Префикс, 38. собственный, 38. Произведение зигзаговое, 49, 108. дуальное, 108. Кронекера, 97. Промель, X. Ю. (Promel, Н. J.), 133. Пропуск, 83. блоков перестановок, 65, 134. Проход, длина, 47, 101. Процедура, раскладывания, 137. Пруссе, Г. (Pruesse, G.), 133. Путь, <7-т, 73, 86. Гамильтона, 27, 55, 73, 85, 87, 127. Грэя, 27. без тренда, 48. Пфафф, Й. Ф. (Pfaff, J. F.), 134. Пэйли, Р. Э. Э. К. (Paley, R. Е. А. С), 97. Радемахер, Ганс (Rademacher, Hans), 19. Радойчич, P. (Radoicic, R.), 128. Разбиение, 82, 138. дважды истинное, 82. Рамрас, М. (Ramras, М.), 101. Ранг, 80, 132. Ранжирование, 15, 32, 48, 88. Ранкин, P. A. (Rankin, R. А.), 73, 87, 129. Рапопорт, Э. С. (Rapoport, Е. S.), 128. Раски, Ф. (Ruskey, F.), 8, 32, 33, 40, 44, 47, 73, 88, 109, 114, 127, 128, 132, 133. Распределение, п, 112. Расстояние, Ли, 42. Расширение, 77. Ребро, покрытие, 49. Реверсия; см. также переворот, 64. Рекуррентность, двоичная, 112. почти линейная, 35. Рингель, Дж. (Ringel, G.), 49. Ритчи, А. Э. (Ritchie, А. Е.), 93.
144 ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ Ричарде, Д. (Richards, D.), 49. Робинсон, Дж. П. (Robinson, J. P.), 43, 100, 103. Розенбаум, Дж. (Rosenbaum, J.), 106. Рой, М. К. (Roy, М. К., C*nf^ jsng^m), 120. Роте, X. A. (Rothe, Н. А., 117. Ротем, Д. (Rotem, D., ОЛП упп), 75, 78. Рудигер, К. Ф. (Rudiger, С. F.), 54. Ряд Фурье, 18. экспоненциальный, частичная сумма, 118. Савада, Дж. Дж. (Sawada, J. J.), 114. Саган, Б. (Sagan, В.), 138. Свертывание, 42. Сворачивание, 52. Связи, 134. Сдвиг, циклический, 38, 71, 73, 76. Северо-восточный проход конем, 87. Седжвик, P. (Sedgewick, R.), 74. Серия, длина, 27, 29. Серра, М. (Serra, М.), 114. Сигнал, аналоговый, 16. Сильвер, А. Л. Л. (Silver, A. L. L), 126. Сильверман, Дж. (Silverman, J.), 46, 99, 101. Сильвестер, Дж. Дж. (Sylvester, J. J.), 45, 98. Симметрия, 61, 81. Симе, Ч. К. (Sims, С. С), 61. Система обозначений двоичная, 15. со смешанным основанием, 80. счисления двоичная, 13. десятичная, 13, 31, 52. смешанная, 31. смешанная позиционная, 13. факториал ьная, 117. шестнадцатеричная, 137. Сквайр, М. Б. (Squire, М. В.), 109. Слоан, Н. Дж. A. (Sloane, N. J. А.), 94. Слово из пяти букв, 22, 82. Линдона, 38. пятибуквенное, 46. Слокам, Дж. (Slocum, J.), 108. Смежная транспозиция, 84. Собственное значение, 138. Соле, П. (Sole, Р.), 94. Сопрограмма, 36, 86. Сопряжение, 65. Сортировка пузырьковая, 54. топологическая, 77. Сочетание, 77, 88. совершенное, 47. Список связанный, 68. дважды связанный, 33, 109. Стайглитц, К. (Steiglitz, К.), 96. Стегер, A. (Steger, А.), 133. Стедман, Ф. (Stedman, F.), 56. Стибиц, Г. P. (Stibitz, G. R.), 16, 18. Стивене, Б. (Stevens, В.), 48. Строка антипод, 23. ортогональная, 45. предпростая, 39, 51. простая, 38, 51. разложение на простые, 51. Структурна, циклическая, 65. Стюарт, Й. (Stewart, I.), 52. Сумма квадратов, 45. продольная контрольная, 27. Суффикс, 38. собственный, 38. Сэвидж, К. (Savage, С), 29, 30, 40, 46-48, 100, 105, 128, 135. Сэйерс, Д. Л. (Sayers, D. L.), 52. Сэмпсон, Дж. Л. (Sampson, J. L.), 46, 99. Таблица инверсии, 55, 88, 133, 134. обратного преобразования, 117. Симса, 61-69, 82. Юнга, 77. Тейлор, Л. В. (Taylor, L. W.), 16. Телевидение, 16. Телефон, 16. Теорема китайская об остатках, 115. Кэли-Гамильтона, 96. о матрице, соответствующей дереву, 138. Ферма, 51. Тест, ужесточенный, 48. Томпкинс, Ч. (Tompkins, С), 71. Топологическая сортировка, 88. Топсвопс, 90. Тор, 42, 87, 93. де Бруийна, 52. ориентированный, 87. скрученный, 85. Тот, 3. (Toth, Z.), 115. Транзитивность, 88, 89. Транспозиция звездная, 72. смежная, 88, 134. Троттер, В. Т. (Trotter, W. Т.), 129. Троттер, X. Ф. (Trotter, Н. F.), 57. Тулиани, Дж. (Tuliani, J.), 112. Тутилл, Дж. К. (Tootill, G. С), 25, 92. Тчуенте, М. (Tchuente, М.), 127. Уголок, 138. длина, 138. Указатель, фокуса, 21, 32, 33, 109. Умножение в обратном порядке, 64, 61, 66, 134. в обычном порядке, 61. Уоллис, Джон (Wallis John), 17. Уолш, Дж. Л. (Walsh, J. L.), 18, 19, 97. Уолш, Т. (Walsh, Т.), 134, 135.
ПРЕДМЕТНО-ИМЕННОЙ УКАЗАТЕЛЬ 145 Упорядочение полное, 77. предпочтительное, 136. частичное, 77. Уэйн, A. (Wayne, А.), 82. Уэллс, М. (Wells, М.), 123. Фалутсос, К. (Faloutsos, С, ФаХоитаос, Xprjoxoc), 94. Филипс, Дж. П. Н. (Phillips, J. P. N.), 117. Фишер, Л. Дж. (Fischer, L. J.), 118. Флорес, И. (Flores, I.), 106. Фокс, Ральф (Fox, Ralph), 38. Форма двухстрочная, 60. циклическая, 60. Формула, суммирования Эйлера, 123. Фредман, М. Л. (Fredman, М. L.), 46, 99. Фредриксен, Гарольд (Fredricksen, Harold), 39, 40. Френкель, А. С. (Fraenkel, A. S., ^рЛО >TO>DN), 136. Функция итерация, 96. масштабная, 17, 19, 24, 25, 31, 98. факториальная, 84. обратная, 15, 44. ортогональная, 20. производящая, 80, 134. способы использования, 118. Пэйли, 45. Радемахера, 19, 98. Уолша, 18, 45. Хамли, В. (Hamley, W.), 108. Хаммонс, А. P. (Hammons, A. R.), 94. Хантер, Дж. Э. X. (Hunter, J. А. Н.), 58. Харигучи, Йоичи (Hariguchi, Yoichi, jf Pffi—), 8. Хартмут, X. Ф. (Harmuth, Н. F.), 18. Херльберт, Дж. X. (Hurlbert, G. Н), 115, 137. Хип, Б. P. (Heap, В. R.), 65, 67, 74, 87, 120. Хопкрофт, Дж. Э. (Hopcroft, J. Е.), 96. Центр, масс, 29. Цепь, 88. Цикл Гамильтона, 24, 47, 55, 73, 84, 138. Грэя, 24. для перестановок, 84. нелокальный, 47. сбалансированный, 49. де Бруийна, 34-40, 50, 90, 115, 139. лидер, 44. модулярный универсальный, 137. неориентированный, 81. перестановок универсальный, 90. Цифра m-ая: определение, 34. римская, 121. шестнадцатеричная, 61. Чайлдс, P. (Childs, R.), 121. Чезаре, Дж. (Cesare, G.), 121. Чен, Куо-Цаи (Chen, Kuo-Tsai, шшя), 38. Ченг, К. С. (Cheng, С. S.,It*), 105. Четность, проверкой, 41. Число тг, 94. 2-адическое, 44. логических переходов, 26, 46. нормальное, 113. со смешанным основанием, 33, 69, 117. отраженное, 119. Фибоначчи, 50, 90, 133. Шапиро, X. С. (Shapiro, Н. S.), 46. Шафлер, Отто (Schaffler, Otto), 16. Шнайдер, Б. (Schneider, В.), 106. Штанке, В. (Stahnke, W.), 35. Шутценбергер, М. П. (Schiitzenberger, М. Р.), 113. Элемент максимальный, 132. минимальный, 132. Энгрен, В. (Enggren, W.), 81, 82. Эпштейн, Д. (Eppstein, D.), 120. Эр, М. Ч. (Er, М. С, ^ щ BS), 69. Эрдеш, П. (Erdos, П.), 129. Эрлих, Г. (Ehrlich, G.), 72, 84, 85, 120. Этцион, Т. (Etzion, Т., yi>3V born nstnn >ПО), 38. Юэн, К. К. (Yuen, С. К., jfe), 95.
Научно-популярное издание Дональд Эрвин Кнут Искусство программирования Том 4, Выпуск 2 Генерация всех кортежей и перестановок Литературный редактор Верстка Художественный редактор Корректор И. А. Попова А. Я. Полинчик С. А. Чернокозинский Л. А. Гордиенко Издательский дом "Вильяме" 127055, г. Москва, ул. Лесная, д. 43, стр. 1. Подписано в печать 27.08.2007. Формат 70x100/16. Гарнитура LH. Печать офсетная. Усл. печ. лист. 12,9. Уч.-изд. лист. 11,8. Тираж 3000 экз. Заказ №> 4013. Отпечатано по технологии CtP в ОАО "Печатный двор" им. А. М. Горького. 197110, Санкт-Петербург, Чкаловский пр., 15.
ASCII СИМВОЛЫ *0 #1 *2 #3 #4 *5 *6 *7 #8 *9 *a #c *e #2x ! ti # $ % & ' ( ) * + - / #2x *3x 0 1 2 3 4 5 6 7 8 9 ; < = > ? *3x #4x © a В с d E f G H i J К l m n 0 #4x #5x p Q r s t u v W x Y z E \ ] - _ *5x *6x ( a b с d e f g h i j k 1 m n о #6x #7x p q r s t u V w X У z { 1 } ~ *7x # #1 0 #2 # *3 1 #4 м^ # #5 !IX К 2 *6 оды # *7 ОПЕ1 3 *8 5АЦШ *9 \ (ОП 4 #a кодь #b >I) 5 #c *d 6 *e a #f 7 #0x trap 5г; fcmp w fun v feql v fadd 4v fix 4v fsub 4v fixu 4v *Ox fl0t[i] 4v flotu[i] 4v sflotei] 4v sflotuei] 4v #lx FMUL Ax, | fcmpe 4v fune v feqle4v fdiv 4Qv | fsqrt 40u frem 4v | fint 4v #lx MUL[I] iov mulu[i] iov divei] 60t. divuei] бОг, *2x add[i] v addu[i] v sub El] v subuEi] v *2x 2adduei] v 4addu[i] v 8adduei] t; 16adduei] v #3x CMP [I] v CMPU[I] v NEGEI] v NEGUEl] v #3x SL[I] v SLU[I] v SREI] г; SRU ei] г; #4x BN [b] u+tt BZ[b] г;+тт BP ЕВ] <;+тт bod ЕВ] v+тг #4x BNN [b] t,+7r BNZ [b] v+tt BNPEB] v+tv BEVEB] v+tt *5x pbn [В] Зг,-тт pbz[b] 3v-n pbpEb] з^-тг pbodeb] 3v-n *5x pbnn [b] 3v-tt pbnz[b] 3v-n pbnpeb] 3v-7r pbeveb] з^-тг #6x CSN[I] v CSZ[I] г; cspei] csodei] г; #6x CSNN[I] v CSNZCI] v csnpei] u csevei] v #7x ZSN[I] v ZSZ[I] v ZSPEI] t; ZSODEI] v #7x ZSNN[I] v ZSNZ[I] v ZSNPEI] v ZSEVEI] v #8x LDB[I] М+г, LDBU[I] ц+v LDWEI] n+v LDWUEI] n+v #8x LDT[I] /x+v LDTU[I] m+v LDOEl] v+v LDOUEI] /x+u *9x LDSF[I] /х+г; LDHT[I] n+v CSWAPEI] 2fi+2v LDUNCEI] n+v #9x LDVTSEI] и PRELDEI] « PREGOEl] v GO El] 3v *Ax STB [I] fi+v STBUEI] /z+t; STWEI] n+v STWUEI] /x+v *Ax STT[I] м+г; STTUEI] m+" STO El] fi+v STOUEI] ti+v #Bx stsf[i] д+г sthtEi] stcoEi] v+v stuncei] n+v *Bx SYNCD[I] v PRESTEI] v SYNCIDEI] v PUSHGOEl] 3v #Cx OR[i] v ORNEI] v NOREI] v XOREI] г- #Cx AND [I] v ANDNEI] v NANDEI] v NXOREI] v #Dx BDIF[I] v WDIFEI] v TDIFEI] v ODIFEI] v #Dx MUX[i] v SADDEI] v MOREI] v MXOREI] v #Ex SETH v SETMH г; SETML v SETL v INCH v INCMH v INCML г; INCL v *Ex ORH i; ORMH v ORML г; ORL v ANDNH v ANDNMH ANDNML v ANDNL v *Fx JMP[b] v PUSHJЕВ] v GETAEB] v PUT El] v #Fx POP Зг, RESUME 5u EUN] SAVE 20/x+v SYNC v SWYM t; GET г; TRIP 5г; #8 #9 #a | #b *C #d *E #F 7Г = 2v, если условный переход выполняется; 7Г = 0, если условный переход не выполняется.