WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Научно- редакционный совет серии:

В. В. Прасолов, А. Б. Сосинский (гл. ред.), А. В. Спивак, В. М. Тихомиров, И. В. Ященко.

Серия основана в 1999 году.

Библиотека <Математическое просвещение> Выпуск 29 С. Б. Гашков СИСТЕМЫ СЧИСЛЕНИЯ И ИХ ПРИМЕНЕНИЕ Издательство Московского центра непрерывного математического образования Москва • 2004 УДК 511.1 ББК 22.130 Г12 Аннотация Различные системы счисления используются всегда, когда появляется потребность в числовых расчётах, начиная с вычи слений младшеклассника, выполняемых карандашом на бумаге, кончая вычислениями, выполняемыми на суперкомпьютерах.

В книжке кратко изложены и занимательно описаны не которые из наиболее популярных систем счисления, история их возникновения, а также их применения, как старые, так и но вые, как забавные, так и серьёзные.

Большая её часть доступна школьникам 7—8 классов, но и опытный читатель может найти в ней кое-что новое для себя.

Текст книжки написан на основе лекций, прочитанных автором в школе им. А. Н. Колмогорова при МГУ и на Малом мехмате МГУ.

Книжка рассчитана на широкий круг читателей, интересу ющихся математикой: школьников, учителей.

Издание осуществлено при поддержке Московской городской Думы и Департамента образования г. Москвы.

ISBN 5-94057-146-8 © Гашков С. Б., 2004.

© МЦНМО, 2004.

Сергей Борисович Гашков.

Системы счисления и их применение.

(Серия: <Библиотека,,Математическое просвещение“>).

М.: МЦНМО, 2004. — 52 с.: ил.

Редакторы Е. В. Корицкая, Ю. Г. Кудряшов.

Художник Т. И. Котова.

Техн. редактор М. Ю. Панов. Корректор Т. Л. Коробкова.

Лицензия ИД № 01335 от 24/III 2000 года. Подписано к печати 25/II 2004 года.

Формат бумаги 6088 /. Офсетная бумага №1. Офсетнаяпечать. Физ. печ. л. 3,25.

Усл. печ. л. 3,18. Уч.-изд. л. 3,62. Тираж 5000 экз. Заказ 6709.

Книга соответствует гигиеническим требованиям к учебным изданиям для обще го и начального профессионального образования (заключение государственной са нитарно-эпидемиологической службы Российской Федерации № 77.99.02.953.Д.

002797.04.03 от 18/IV 2003 года).

Издательство Московского центра непрерывного математического образования.

119002, Москва, Г-2, Бол. Власьевский пер., 11. Тел. 241 72 85, 241 05 00.

Отпечатано с готовых диапозитивов в ФГУП <Производственно-издательский комбинат ВИНИТИ>.

140010, г. Люберцы Московской обл., Октябрьский пр-т, 403. Тел. 554 21 86.

§ 1. ДЕНЬГИ В КОНВЕРТАХ И ЗЁРНА НА ШАХМАТНОЙ ДОСКЕ Представьте себе, дорогой читатель, что вы банкир, занимаю щийся отмыванием грязных денег, и завтра ждёте важного клиен та, которому вы должны выдать круглую или не очень круглую, но заранее вам неизвестнуюсумму от 1 до 1 000 000 000 у. е. Что бы не пачкать руки о грязные деньги, вы заранее дали указание своим кассирам заготовить некоторое количество конвертов с день гами, на которых написаны содержащиеся в них суммы, и собира етесь просто отдать клиенту один или несколько конвертов, в ко торых и будет содержаться требуемая им сумма. Какое наимень шее количество конвертов необходимо иметь?

Конечно, можно просто заготовить конверты со всеми суммами от 1 до 1 000 000 000. Но где взять столько денег на конверты?

1. А какова будет в этом случае полная сумма во всех конвер тах? Попробуйте оценить также массу бумаги, предполагая, что использованы не более чем сотенные купюры*).

Есть более рациональный подход к нашему делу. Надо положить в первый конверт 1 у. е., а в каждый следующий класть вдвое боль шую сумму, чем в предыдущий. Тогда, например, в 5-м конверте будет 16 у. е., в 10-м — 512 у. е., в 11-м — 1024 у. е., в 21-м — 10242=1 048 576 у. е., в 31-м — 10243=1 073 741 824 у. е., но он нам, очевидно, уже не понадобится, а вот 30-й с 1 073 741 824/2= =536 870 912 у. е. может и пригодиться. В общем случае сумма в (n+1)-м конверте будет равна произведению n двоек, это чи сло принято обозначать 2n и называть n-й степеньюдвойки. Усло вимся считать, что 20=1. Проведённые выше вычисления основы вались на следующих свойствах операции возведения в степень:

2n2m=2n+m, 2n/2m=2n-m, (2n)m=2nm.

Экспериментально легко проверить, что любое число можно пред ставить единственным образом в виде суммы различных меньших степеней двойки, и поэтому наша задача почти решена. Например, 30 000=214+213+212+210+28+25+24.

Но для реального применения нужен алгоритм построения тако го разложения. Далее будут приведены несколько разных алгорит мов, но вначале мы рассмотрим самый простой. В сущности, это алгоритм выдачи сдачи клиенту, записанный некогда даже в ин струкции для работников торговли, но очень редко ими выполняю щийся. А он очень прост — сдачу надо выдавать, начиная с самых больших купюр. В нашем случае нужно найти конверт с наиболь шей суммой денег, не превосходящей требуемую, т. е. наибольшую степень двойки, не превосходящую требуемого количества денег.

*) Двумя чертами слева выделены тексты задач для самостоятельного решения.

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

Ниже мы докажем, что, имея набор конвертов с суммами в 1 у. е., 2 у. е., 4 у. е.,..., 2n у. е., любую сумму денег от 1 у. е.

до 2n+1-1 у. е. можно выдать единственным способом. Также будет доказано, что, действуя по описанному алгоритму, мы всегда получим этот способ выдачи требуемой суммы.

Вначале рассмотрим пример работы алгоритма с числом 2n-1.

Ясно, что на первом шаге будет выбрано число 2n-1, останется число 2n-1-2n-1=2n-1-1, потом будет выбрано число 2n-2, и т. д., и в результате получится разложение 2n-1=2n-1+2n-2+...+22+21+20.

Но оно не показалось бы очевидным, если, не зная заранее ответа, пришлось бы вычислять сумму 1+2+4+8+...+2n-2+2n-1, называемуюсуммой геометрической прогрессии со знаменателем 2.

Ведь для этого пришлось бы выдумать какой-нибудь трюк наподо бие следующего:

1+2+4+8+...+2n-2+2n-1=2-1+2+4+8+...+2n-2+2n-1= =4-1+4+8+...+2n-2+2n-1=8-1+8+16+...+2n-2+2n-1=...

...=2n-2-1+2n-2+2n-1=2n-1-1+2n-1=2n-1.

2. Используя подобный трюк, вычислите произведение (2+1)(22+1)·...·(22n +1).

Докажем теперь существование и единственность представле ния числа N в виде суммы меньших степеней двойки. Доказатель ство будем проводить индукцией по N.

Для N=1 утверждение очевидно.

Пусть оно верно для всех N

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

Заметим ещё, что, в отличие от первого варианта решения, полная сумма во всех конвертах менее чем в два раза превосходит верхнюю границу подлежащей выплате суммы.

Для краткой записи результата работы алгоритма над данным числом a можно вместо разложения a=2n1 +...+2nk, которое и записать-то в общем виде без использования трёхэтаж ных обозначений затруднительно, использовать последовательность показателей степеней (n1,..., nk), или, что ещё удобнее (но не все гда короче), написать последовательность (am,..., a1) чисел 0 и 1, в которой ai=1, если число 2i-1 входит в указанное выше разло жение, и ai=0 в противном случае. Тогда это разложение можно будет переписать в виде а=a1+2a2+4a3+...+2m-1am.

Ясно, что приведённый выше алгоритм позволяет строить такое представление, причём оно определяется однозначно, если предпо лагать, что старший его разряд am ненулевой. Это представление и называется двоичной записьючисла a.

Читатель увидит, что понятие двоичной записи очень похоже на понятие десятичной записи и в каком-то смысле даже проще.

Остался вопрос о минимальности найденной системы конвер тов. В общем виде указанный выше приём предлагает для уплаты любой суммы от 1 до n использовать m конвертов с суммами 1, 2, 4, 8,..., 2m-1, где 2m-1n<2m. Меньшего количества кон вертов может не хватить, потому что с помощью k

3. Докажите последнее утверждение.

4. Докажите, что если n=2m-1, то минимальная система конвертов определяется однозначно, в противном случае — нет.

После упоминания десятичной системы сразу возникает идея на первый взгляд даже более простого решения задачи о конвер тах. Надо просто заготовить конверты с суммами 1, 2,..., 9, 10, 20, 30,..., 90, 100, 200, 300,..., 100 000 000, 200 000 000,...

..., 900 000 000. Тогда для выплаты любой требуемой суммы не нужно искать её двоичнуюзапись, так как для выплаты, напри мер, 123 456 789 у. е. нужно просто взять конверт с суммой 9, кон верт с суммой 80, конверт с суммой 700 и т. д. Это действительно проще, но исключительно потому, что мы привыкли пользоваться десятичной системой и все расчёты ведутся с её помощью. Если бы мы использовали в повседневной жизни только двоичнуюсистему, то этот способ был бы сложнее, так как приходилось бы перево дить даннуюсумму из двоичной системы в десятичную*). Поэтому простота десятичного способа решения задачи скорее мнимая.

На самом деле указанный выше двоичный метод имеет пре имущество перед десятичным (и любым другим). Оно заключается в меньшем числе используемых конвертов, что было показано выше.

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

Идея, лежащая в основе изложенной задачи, видимо, очень древ няя, и происходит, вероятно, из Индии. Об этом свидетельствует ле генда об изобретателе шахмат, который скромно попросил (после настояний магараджи, которому очень понравилась игра) себе в на граду положить одно зерно на угловую клетку шахматной доски и удваивать количество зёрен на каждой следующей клетке. Магарад жа, подивившись скудоумиюказавшегося таким мудрым человека, распорядился отсыпать ему запрошенные несколько мешков зерна.

5. Оцените приблизительно, во сколько миллионов тонн зерна обойдётся магарадже его щедрость.

Из сказанного выше видно, что если бы на каждое поле шах матной доски не всегда класть столько зерна, сколько просил му дрец, а иногда вообще не класть зёрен, то можно получить таким образом любое число от 0 до 264-1. Поэтому, вероятно, таким образом можно представить любое число, которое может встретить ся в каких либо конкретных прикладных вычислениях.

Индийская легенда обращает наше внимание на одну особен ность двоичной (и любой позиционной) системы — возможность представить колоссальные числа в виде короткой записи. Разуме ется, в качестве такой записи не надо использовать совокупность количеств зёрен, лежащих на клетках доски в точности так как указано выше — ведь эти числа могут быть очень велики, и реаль но такое количество зёрен на большей части клеток доски поме стится не может. Вместо этого, как и принято в двоичной системе, на каждуюклетку или не кладётся зёрен вообще, или кладётся од но зерно, которое символизирует соответствующую степень двой ки. Тогда шахматная доска превращается по существу в то, что на Востоке называют абак, а в России — счёты.

Конечно, реально используемые счёты всегда были десятичны ми, но проведённые выше рассуждения показывают, что, хотя дво ичная запись в три раза длиннее десятичной (и вообще, из всех позиционных систем в этом смысле двоичная — самая плохая), *) Иногда это приходится делать и в реальной жизни. Различные алгоритмы такого перевода будет изложены далее.

но изготовление счёт с применением двоичной системы могло бы дать определённую (правда, лишь теоретическую) экономию (см.

приложение, с. 49).

6. Пусть на каждой из n спиц счётов находится по b костяшек (т. е. счёты представляют числа в системе счисления с основани ем b+1) и поэтому они позволяют записать в этой системе любое число от 0 до N=(b+1)n-1 (число N характеризует <вмести мость> счётов). Каким нужно выбрать b, чтобы суммарное коли чество костяшек на счётах (<сложность> счётов) было минималь ным при условии возможности указанного представления на счё тах любого числа от 1 до N (т. е. при заданной вместимости)?

Для прочитавших этот параграф, ответ, конечно очевиден. Для знающих логарифмы продолжение этой задачи: сравните слож ности десятичных и двоичных счёт одинаковой вместимости.

Приведённый выше алгоритм перевода из десятичной системы в двоичную вычислял цифры двоичной записи, начиная со стар ших цифр. Опишем теперь кратко, возможно более удобный, ал горитм, в котором цифры двоичной записи вычисляются, начиная с младших*).

Очевидно, самая младшая цифра равна нулю, если число чёт ное, и единице, если оно нечётное. Для нахождения остальных двоичных цифр надо от исходного числа отнять найденную млад шую цифру, поделить разность пополам и к полученному числу применить описанный выше шаг алгоритма.

Например, у числа 300 последние две цифры нули, а для нахож дения остальных цифр надо иметь дело с числом 300/4=75, поэто му следующая цифра 1, и получаем промежуточный результат 37.

Следующая далее цифра опять 1, и промежуточный результат 18, поэтому следующая цифра 0, а промежуточный результат 9, сле дующая цифра 1, а потом три нуля подряд, а старший разряд, как всегда 1. В результате получается двоичная запись 1000101100.

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

§ 2. ВЗВЕШИВАНИЕ С ПОМОЩЬЮ ГИРЬ И ВОЗВЕДЕНИЕ В СТЕПЕНЬ Предлагаем читателюсамому убедиться в том, что точно так же, как и предыдущем разделе, можно доказать, что для отвешивания любого числа граммов песка от 1 г до n г за одно взвешивание, достаточно иметь гири 1 г, 2 г, 4 г,..., 2m г, где 2mn<2m+1, и меньшего числа гирь недостаточно, если песок лежит на одной чаш ке весов, а гири разрешается ставить на вторую чашку. На самом *) Кстати, кассиры в магазинах и на рынках предпочитают выдавать сдачу начиная с мелких купюр, вопреки инструкции. Причина понятная — надеются, что покупатель, получив мелочь, уйдёт, забыв взять крупные.

деле с математической точки зрения эта задача, известная со сред невековых времён, ничем не отличается от рассмотренной выше задачи о конвертах с деньгами.

Часто новые и интересные задачи получаются, если в старой задаче наложить какие-нибудь естественные ограничения. Напри мер, можно задать следующий вопрос: за какое наименьшее коли чество взвешиваний на чашечных весах можно отвесить килограмм сахарного песка, если имеется лишь одна однограммовая гирька?

На первый взгляд кажется, что единственный способ решения этой задачи — отвесить один грамм, положить в эту же чашку гирьку, отвесить в другой чашке два грамма, переложить гирьку в неё и т. д., добавляя по одному грамму, после тысячного взве шивания отмерить наконец-то килограмм.

Но есть и более быстрый способ. Нужно лишь заметить, что если мы научились отвешивать за n взвешиваний m г песка, то, сделав ещё одно взвешивание, можно даже не используя гирьку отвесить ещё m г, и, ссыпав обе порции вместе, получить 2m г за n+1 взве шивание. А если при этом взвешивании положить на одну из чашек гирьку, то за n+1 взвешивание можно отмерить 2m±1 г песка.

Теперь воспользуемся двоичной записьючисла 1000. Применяя любой из указанных выше алгоритмов, получаем равенство 1000=29+28+27+26+25+23.

Так как 29+28+27+26+25+23=(((((2+1)2+1)2+1)2+1)22+1)23, то, последовательно отвешивая 1, 2+1=3, 2·3+1=7, 2·7+1= =15, 2·15+1=31, 2·31=62, 2·62+1=125, 2·125=250, 2·250= =500, получаем на десятом взвешивании 2·500=1000 г. Девяти взвешиваний не хватит, потому что за два взвешивания можно отмерить массу не более 3=22-1, за три — не более 7=2·3+ +1=23-1, за четыре — не более 15=2·7+1=24-1, и за девять взвешиваний — не более 511=29-1.

Если нужно отмерить n г песка, то надо записать n в двоичном виде am...a1, где 2m-1n<2m, am=1, и воспользоваться формулой n=am2m-1+...+a22+a1=(...((2am+am-1)2+am-2)...)2+a1, последовательно отвешивая по b1=am, b2=2b1+am-1, b3=2b2+ +am-2,..., bm=bm-12+a1=n г.

В используемой формуле знающие читатели увидят так назы ваемую схему Горнера. К ней мы ещё вернёмся в дальнейшем.

Идея, лежащая в основе этого метода взвешивания, стара как сама математика. Её применяли и древние египтяне, и древние индусы, но, конечно, не для взвешивания, а для умножения. Ведь алгоритм умножения столбиком был придуман не сразу, а до этого умножение сводилось к сложению. Например, чтобы умножить какое-нибудь число a на 1000, можно, используя только операции сложения после довательно вычислить a+a+a=3a, 3a+3a+a=7a, 7a+7a+a= =15a, 15a+15a+a=31a, 31a+31a=62a, 62a+62a+a=125a, 125a+125a=250a, 250a+250a=500a, 500a+500a=1000a. Та кой метод умножения дожил почти до нашего времени, он удобен при вычислениях на счётах. Сейчас он никому не нужен, так как все используют калькуляторы. Но как возвести на калькуляторе число a, например, в тысячную степень, если у него нет специ альной операции возведения в произвольную степень? Умножать 999 раз не нужно, а можно применить тот же приём, последо вательно вычисляя a3=a2a, a7=(a3)2a, a15=(a7)2a, a31=(a15)2a, a62=(a31)2, a125=(a62)2a, a250=(a125)2, a500=(a250)2, a1000=(a500)2.

Если вспомнить, что 1000 имеет двоичнуюзапись 1111101000, то можно заметить, что если отбросить старший бит (всегда равный единице), то каждому следующему биту соответствует операция воз ведения в квадрат, если он нулевой, или, если он ненулевой, возве дение в квадрат с последующим умножением на число a — основа ние степени (т. е. делается две операции). Кстати, число a не нуж но каждый раз заново набирать на клавиатуре. Нужно в самом на чале вычислений занести его в память калькулятора, и когда нуж но, после нажатия кнопки для умножения, просто вызывать его из памяти и потом нажимать кнопку <равно>. Таким образом, воз ведение в квадрат требует двукратного нажатия кнопок, а возведе ние в квадрат и последующее умножение на основание степени — пятикратного. Для того чтобы не запутаться в операциях, можно перед началом вычислений составить мнемоническое правило. Воз ведение в квадрат обозначим символом К, а возведение в квадрат и последующее умножение — символом КУ. Тогда, заменяя в дво ичной записи единицы (кроме старшей) на КУ, а нули — на К, получим правило КУКУКУКУККУККК, или короче КУ4ККУК3.

Посчитаем общее число операций умножения в рассмотрен ном вычислении. Число возведений в квадрат на единицу меньше длины двоичной записи показателя степени, а число умножений общего вида на единицу меньше суммы цифр двоичной записи.

Для любого n обозначим (n) уменьшенную на единицу дли ну двоичной записи числа n, a (n) — её сумму цифр (другими словами, число единиц в ней). Тогда в общем случае число опера ций умножения, использованных в этом методе возведения в сте пень n, будет равно (n)+(n)-1. Далее будет показано, что мень шим числом операций обойтись нельзя, если только не обновлять содержимое ячейки памяти.

Очевидно, что (n)+(n)-12(n). Те, кто знают логарифмы, сообразят, что (n)= log2 n, где знак x означает целую часть числа x. Но можно вычислить обе введённые функции даже не упоминая о двоичной записи. Для этого надо воспользоваться следующими правилами:

(1)=1, (2n)=(n), (2n+1)=(n)+1, (1)=0, (2n)=(2n+1)=(n)+1.

Однако для доказательства справедливости этих правил полезно, конечно, воспользоваться двоичной системой, после чего они ста новятся почти очевидными.

Докажем полезное и простое неравенство (n+1)(n)+1. Оно очевидно превращается в равенство, если n чётно, так как тогда его двоичная запись заканчивается нулём. Если же эта двоичная запись заканчивается k единицами, перед которыми стоит нуль, то двоичная запись числа n+1 заканчивается k нулями, перед ко торыми стоит единица (а старшие биты остаются без изменения, если они есть). Для того, чтобы в этом убедиться, достаточно вы полнить прибавление 1 к n в двоичной системе. В обоих рассмо тренных случаях (n+1)(n)+1.

Из доказанного неравенства следует, что (n+1)+(n+1)(n)+(n)+1.

Действительно, если 2k-1

Если же n+1=2k, то (n+1)=k=(n)+1, (n+1)=1, (n)=k, откуда следует, что (n+1)+(n+1)=k+12k=(n)+(n)+1.

Справедливо также равенство (2n)+(2n)=(n)+(n)+1, которое сразу следует из равенств (2n)=(n), (2n)=(n)+1.

Выше было показано, что число операций умножения, исполь зованных для возведения в степень n на калькуляторе с одной ячейкой памяти, не больше чем (n)+(n)-1. При n=1, 2 оче видно, что меньшим числом операций обойтись нельзя. Покажем, что и в общем случае это так, если только не обновлять содержи мое ячейки памяти, т. е. кроме возведения в квадрат всегда ис пользовать только умножение на основание степени.

Допустим противное, а именно, что для вычисления указан ным образом xn при некотором n оказалось достаточно l<(n)+ +(n)-1 операций. Выберем среди таких чисел n наименьшее чи сло и обозначим его также n. Если последняя операция в рас сматриваемом вычислении была возведение в квадрат, то n чётно, и для вычисления xn/2 достаточно l-1<(n)+(n)-2=(n/2)+ +(n/2)-1 операций, поэтому минимальным числом с рассматри ваемым свойством не может быть n, что ведёт к противоречию.

Аналогично получается противоречие и в случае, когда последней операцией было умножение на x. Действительно, тогда согласно доказанному выше неравенству для вычисления xn-1 достаточно l-1<(n)+(n)-2(n-1)+(n-1)-1 операций.

Но если обновлять содержимое ячейки памяти, то указанный выше метод вычисления x1000 можно улучшить. Для этого можно применить так называемый метод множителей. Идея этого метода заключается в следующем. Заметим, что если мы умеем возводить в степень n за l(n) операций и возводить в степень m за l(m) операций, то можно после того, как закончено вычисление xn, занести его в ячейку памяти и далее вычислить xnm=(xn)m за l(m) операций, используя тот же метод, что и для вычисления xm.

Тогда общее число операций будет равно l(nm)=l(n)+l(m).

Вычисляя x5 старым методом за (5)+(5)-1=3 операции (с помощью последовательности x, x2, x4=(x2)2, x5=(x4)x) и при меняя два раза метод множителей, получаем, что l(125)=3l(5)= =9. Выполняя ещё три возведения в квадрат, получаем l(1000)= =l(125)+3=12. Старый же метод требовал (1000)+(1000)-1= =9+6-1=14 операций.

Читателю может показаться, что мы слишком много внима ния уделили такому специальному и не слишком важному вопро су, как быстрое выполнение возведения в степень. Лет тридцать назад это замечание было бы справедливым. Но в середине 1970-x годов почти одновременно и независимо группой американских ма тематиков (У. Диффи, М. Хеллман, Р. Ривест, А. Шамир, П. Ад леман) и группой английских криптографов (К. Кокс, М. Вильям сон, Д. Эллис) были открыты первые алгоритмы криптографии с открытым ключом*). Благодаря этим алгоритмам теперь частные лица могут обмениваться секретной информацией по общедоступ ным каналам связи (например, по Интернету) без боязни, что их сообщения прочтут не только конкуренты, но и спецслужбы. Воз никшее направление в криптографии быстро превратилось в по пулярную область математических исследований, которой уже по священы многочисленные журналы и книги. И во многих самых распространённых алгоритмах важную роль играет операция воз ведения в степень.

§ 3. АДДИТИВНЫЕ ЦЕПОЧКИ И ФЛЯГИ С МОЛОКОМ Назовём аддитивной цепочкой любую начинающуюся с 1 по следовательность натуральных чисел a0=1, a1,..., am, в которой каждое число является суммой каких-то двух предыдущих чисел (или удвоением какого-то предыдущего числа). Обозначим l(n) наи меньшую длину аддитивной цепочки, заканчивающейся числом n (длиной цепочки a0=1, a1,..., am называем число m).

Например, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 — адди тивная цепочка, 1, 2, 3, 5, 7, 14 — минимальная цепочка для 14, *) Англичане сделали это раньше, но им, как сотрудникам секретной крипто графической службы, было запрещено опубликовать свои результаты в открытой печати.

т. е. l(14)=5. Аддитивные цепоч ки можно изображать в виде ори ентированного графа, в котором 1 2 3 5 7 в вершину ai идут рёбра от вершин aj, ak, если ai=aj+ak (в случае, Рис. если такое представление неод нозначно, выбираем любое из них и рисуем только два ребра).

Если из какой-то вершины выходит только одно ребро, то длякрат кости можно <склеить> эту вершину с той вершиной, в которую ведёт это ребро. Граф для предыдущего примера показан на рис. 1.

Можно считать, что все числа в цепочке разные, так как этого легко достичь просто удаляя из неё повторяющиеся числа, и что эти числа расположены в цепочке в порядке возрастания.

Очевидно, что наименьшее число умножений, необходимое для возведения в n-юстепень, равно l(n).

Приведённый выше метод построения аддитивных цепочек на зывается двоичным (или бинарным). Фактически этим методом бы ло доказано, что справедливо неравенство l(n)(n)+(n)-1. Ме тодом множителей легко доказать неравенство l(nm)l(n)+l(m).

7. Докажите нижнюю оценку: l(n)(n).

Из этой оценки следует, что l(2n)=n.

Интересно, что бинарный метод был по существу известен древним индусам, потом был переоткрыт арабскими математиками, задача о точном вычислении функции l(n) появилась в одном французском журнале в 1894 году, потом заново была переоткрыта в 1930-е годы и неоднократно переоткрывалась в дальнейшем, но до сих пор в общем случае не решена.

По существу, наилучшая из известных общих верхних оценок была доказана в 1930-е годы А. Брауэром и имеет вид 1+ 1 + C(((n))) l(n)(n), ((n)) (((n))) где C>0 — некоторая константа.

Не каждуюаддитивнуюцепочку можно вычислить на кальку ляторе с одной ячейкой памяти, не используя для запоминания промежуточных результатов собственнуюголову (фактически, такие калькуляторы имеют две ячейки памяти, так одна из них содер жит число, изображаемое в данный момент на дисплее). Укажем, как можно определить необходимое число ячеек памяти для вы числения данной аддитивной цепочки. Для этого введём понятия ширины (а заодно и глубины) аддитивной цепочки.

Пусть дана произвольная цепочка a0=1, a1,..., aL=n. Сопо ставим каждому её элементу два числа. Первое из них назовём глубиной элемента, а второе — номером ячейки, хранящей это чи сло. Для элемента a0 первое число положим равным нулю, а вто рое — единице. Будем далее последовательно вычислять эти числа для элементов цепочки. Пусть они уже вычислены для всех эле ментов от a0 до ak. Составим список номеров ячеек, содержащих те элементы цепочки, которые ещё могут быть использованы для вычисления последующих элементов. Найдём наименьшее число, не входящее в этот список, и присвоим его элементу ak+1 в каче стве номера ячейки (возможно, она использовалась ранее, но те перь уже свободна). Пусть ak+1=ai+aj, i, jk. Если D(ai), D(aj) — значения глубины элементов ai, aj, то положим D(ak+1) на едини цу большим максимального из чисел D(ai), D(aj). Шириной S це почки назовём число использованных ячеек (равное наибольшему из использованных номеров ячеек). Глубиной D цепочки назовём глубину её последнего элемента.

8. Докажите, что ak2D(ak) и D(n). Докажите, что бинар ный метод можно модифицировать так, чтобы длина цепочки не изменилась, а глубина стала бы равна (n).

Если цепочка имеет ширину S, то её можно представить в виде вычисления на калькуляторе с S-1 ячейками памяти (кроме основ ной, содержащей число, изображаемое в данный момент на дисплее) или в виде компьютерной программы, использующей S ячеек памяти.

Можно ещё представить эту цепочку в виде способа, как налить в даннуюфлягу n литров молока из цистерны, если первоначально в ней был один литр и кроме неё имеется S таких же пустых фляг и весы, способные только сравнивать веса двух фляг между собой.

Для этого сопоставим S фляг ячейкам памяти рассматриваемой цепочки, а одну флягу оставим запасной. Тогда любую операцию с ячейками памяти вида xk=xi+xj можно выполнить, выливая в случае необходимости k-ю флягу в цистерну, потом наливая запаснуюфлягу до уровня i-й фляги и сливая её содержимое в k-ю флягу, если k=i, и делая аналогичную процедуру для индекса j.

Естественно, что аналогичным образом на языке <переливаний> можно представить и программу с командами, использующими не толь ко сложение, но и вычитание xk=xi-xj. Поэтому понятие аддитив ной цепочки можно обобщить, разрешив использовать вычитание.

Для вычисления степеней такие цепочки также можно выпол нять на калькуляторе, если кроме умножения использовать и де ление. Известно, что в среднем это не даёт существенной выгоды, но в некоторых случаях число используемых операций уменьшается.

Например, вычислить x1000 можно с помощью следующей цепочки: 1, 2, 4, 8, 16, 32, 31, 62, 124, 125, 250, 500, 1000.

§ 4. КРАТКАЯ ИСТОРИЯ ДВОИЧНОЙ СИСТЕМЫ Некоторые идеи, лежащие в основе двоичной системы, по су ществу были известны в Древнем Китае. Об этом свидетельствует классическая книга <И-цзин> (<Книга Перемен>), о которой речь пойдёт позже.

Идея двоичной системы была известна и древним индусам.

В Европе двоичная система, видимо, появилась уже в новое время.

Об этом свидетельствует система объёмных мер, применяемая англий скими виноторговцами: два джилла = полуштоф, два полуштофа = пинта, две пинты = кварта, две кварты = потл, два потла = галлон, два галлона = пек, два пека = полубушель, два полубушеля = = бушель, два бушеля = килдеркин, два килдеркина = баррель, два барреля = хогзхед, два хогзхеда = пайп, два пайпа = тан.

Читатели исторических романов, видимо, знакомы с пинтами и квартами. Частично эта система дожила и до нашего времени (нефть и бензин до сих пор меряют галлонами и баррелями).

И в английских мерах веса можно увидеть двоичный принцип.

Так, фунт (обычный, не тройский) содержит 16 унций, а унция — 16 дрэмов. Тройский фунт содержит 12 тройских унций. В английских аптекарских мерах веса, однако, унция содержит восемь дрэмов.

Пропагандистом двоичной системы был знаменитый Г. В. Лейб ниц (получивший, кстати, от Петра I звание тайного советника).

Он отмечал особуюпростоту алгоритмов арифметических действий в двоичной арифметике в сравнении с другими системами и при давал ей определённый философский смысл. Говорят, что по его предложению была выбита медаль с надписью <Для того, чтобы вывести из ничтожества всё, достаточно единицы>. Известный со временный математик Т. Данциг о нынешнем положении дел ска зал: <Увы! То, что некогда возвышалось как монумент монотеиз му, очутилось в чреве компьютера>. Причина такой метаморфозы не только уникальная простота таблицы умножения в двоичной системе, но и особенности физических принципов, на основе кото рых работает элементная база современных ЭВМ (впрочем, за по следние 40 лет она неоднократно менялась, но двоичная система и булева алгебра по-прежнему вне конкуренции).

§ 5. ПОЧЕМУ ДВОИЧНАЯ СИСТЕМА УДОБНА?

Главное достоинство двоичной системы — простота алгорит мов сложения, вычитания умножения и деления. Таблица умноже ния в ней совсем не требует ничего запоминать: ведь любое число, умноженное на нуль равно нулю, а умноженное на единицу рав но самому себе. И при этом никаких переносов в следую щие раз ряды, а они есть даже в троичной системе. Таблица деления сво дится к двум равенствам 0/1=0, 1/1=1, благодаря чему деление столбиком многозначных двоичных чисел делается гораздо проще, чем в десятичной системе, и по-существу сводится к многократно му вычитанию.

Таблица сложения как ни странно чуть сложнее, потому что 1+1=10 и возникает перенос в следующий разряд. В общем ви де операцию сложения однобитовых чисел можно записать в виде x+y=2w+v, где w, v — биты результата. Внимательно посмотрев на таблицу сложения, можно заметить, что бит переноса w —это просто произведение xy, потому что он равен единице лишь когда x и y равны единице. А вот бит v равен x+y, за исключением случая x=y=1, когда он равен не 2, а 0. Операцию, с помощью которой по битам x, y вычисляют бит v, называют по-разному.

Мы будем использовать для неё название <сложение по модулю 2> и символ. Таким образом, сложение битов выполняется факти чески не одной, а двумя операциями.

Если отвлечься от технических деталей, то именно с помощью этих операций и выполняются все операции в компьютере.

Для выполнения сложения однобитовых чисел делают обыч но даже специальный логический элемент с двумя входами x, y и двумя выходами w, v, как бы составленный из элемента умно жения (его часто называют конъюнкцией, чтобы не путать с умно жением многозначных чисел) и элемента сложения по модулю 2.

Этот элемент часто называют полусумматором.

§ 6. ХАНОЙСКАЯ БАШНЯ, КОД ГРЕЯ И ДВОИЧНЫЙ n-МЕРНЫЙ КУБ Далее мы рассмотрим несколько интересных задач, в решении которых помогает знание двоичной системы. Начнём мы с задач, в которых используется только одна, самая простая, из лежащих в её основе идей — идея чисто комбинаторная и почти не связанная с арифметикой.

Первая из них — это <Ханойская башня>. Головоломку под таким названием придумал французский математик Эдуард Люка в XIX веке.

На столбик нанизаны в порядке убывания размеров n круглых дисков с дырками в центре в виде детской игрушечной пирамидки.

Требуется перенести эту пирамидку на другой столбик, пользуясь третьим вспомогательным столбиком (рис. 2). За один ход разре шается переносить со столбика на столбик один диск, но класть больший диск на меньший нельзя. Спрашивается, за какое наименьшее ко личество ходов это можно сделать. Ответом в этой за даче служит уже извест ное нам <индийское число> 2n-1. Люка в своей книге Рис. приводит якобы известную легенду о том, что монахи в одном из монастырей Ханоя зани маются перенесением на другой столбик пирамидки, состоящей из 64 дисков. Когда они закончат работу, кончится жизнь Брах мы*). Видно, ждать придётся долго.

Решение этой головоломки сильно облегчается, если знать, что такое код Грея. Кодом Грея порядка n называется любая цикличе ская последовательность всех наборов из нулей и единиц длины n, в которой два соседних набора отличаются ровно в одной компо ненте. Примером кода Грея порядка 3 является последовательность трёхразрядных наборов 000, 001, 011, 010, 110, 111, 101, 100.

9. Докажите, что длина кода Грея порядка n равна 2n.

Если занумеровать компоненты каждого набора справа налево (при этом последняя, т. е. самая правая компонента получит но мер 1), и начинать код Грея с нулевого набора, то его можно за писать короче, если вместо очередного набора писать только номер компоненты, в которой он отличается от предшествующего набо ра. Например, указанный выше код Грея можно коротко записать в виде последовательности семи чисел 1, 2, 1, 3, 1, 2, 1. В общем случае длина подобной последовательности равна 2n-1. Указан ная краткая запись позволяет догадаться, как можно строить коды Грея дальше. Например, Грея порядка 4 можно задать последова тельностью1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1. Она получается, если мы повторим два раза последовательность, определяющую код Грея порядка 3, разделив оба экземпляра этой последовательности числом 4. Далее поступаем аналогично, т. е. последовательность длины 2n-1, определяющую код Грея порядка n, дублируем, раз делив оба дубля числом n+1. Полученная последовательность дли ны 2(2n-1)+1=2n+1-1 будет определять код Грея порядка n+1.

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

Последовательности (или слова) с таким свойством называются палиндромами. Например, одним из самых известных русских па линдромов является предложение (символы пробела, естественно, игнорируются) А РОЗА УПАЛА НА ЛАПУ АЗОРА.

Нам понадобится это свойство кода Грея порядка n+1, а также то обстоятельство, что все числа этой последовательности, кроме среднего, не больше n. Это означает, что если с её помощью мы начнём выписывать последовательность наборов длины n+1, на чиная с нулевого, то первые 2n-1 наборов будут начинаться с нуля, так как (n+1)-я компонента никогда в них не будет меняться.

*) Приблизительный западный аналог — это конец света, но на Востоке считают, что после этого рождается новый Брахма, и всё циклически повторяется сначала, от золотого века до нашей Кали-Юги, которой и заканчивается цикл.

Остальные же компоненты будут образовывать наборы длины n, и они будут чередоваться в том же порядке, что и в коде Грея порядка n, поэтому получится некоторая перестановка всех 2n на боров длины n+1, начинающихся с нуля. Потом в её последнем наборе этот нуль будет заменён на единицу (это определяется тем, что в середине последовательности стоит число n+1), далее эта единица меняться не будет, а будет меняться в каждом очередном наборе длины n+1 только одна из последних n компонент, и эти компоненты образуют код Грея порядка n, выписанный в обратном порядке, и закончится он нулевым набором. Сама же построенная при этом последовательность наборов длины n+1 будет образовывать перестановку всех наборов длины n+1, начинающихся с единицы, а её последним набором будет набор 10...0. Таким образом, построенная последовательность состоит из 2n различных наборов и может быть превращена в циклическую, т. е. является кодом Грея порядка n+1.

Код Грея можно наглядно изобразить на n-мерном двоичном кубе. Сам этот куб служит для наглядного представления множества всех наборов длины n из нулей и единиц. Наборы изображаются точками и называются вершинами куба. Два набора, отличающие ся только в одной компоненте, называются соседними и образуют ребро куба. Номер этой компоненты называется направлением ре бра. Куб можно нарисовать на плоскости так, что все рёбра будут изображены отрезками, соединяющими их вершины, причём рёбра одного направления будут изображены равными и параллельны ми отрезками (поэтому такие рёбра называют тоже параллельны ми). Например, четырёхмерный куб можно изобразить на плоско сти так, как показано на рис. 3.

Код Грея на многомерном кубе можно изобразить в виде последова тельности вершин, в которой каждые две соседние вершины соединя ются рёбрами. Такие последовательности вершин принято называть путями. Но код Грея изобра жается путём, у которого пер вая и последняя вершина тоже соединяются ребром. Такие пу ти естественно называть цикла ми. Однако код Грея — не про сто цикл, а цикл проходящий через все вершины куба. Такие циклы (а их можно искать не только на многомерном ку бе, но и на любом графе*)) называются гамильтоновыми *) Граф — это произвольное множе ство вершин, некоторые из которых соединены рёбрами. Рис. циклами*), а графы, у которых они есть — гамильтоновыми гра фами. Вопрос о том, какие графы гамильтоновы, а какие нет, ока зался чрезвычайно трудным и не решён удовлетворительно по сей день. Ему можно посвятить отдельную книгу, и такие книги уже написаны, поэтому мы прекращаем разговор на эту тему и возвра щаемся к многомерному кубу.

Для того, чтобы изобразить код Грея на приведённом на рис. изображении n-мерного куба рядом с вершинами следует написать их имена — соответствующие им наборы из нулей и единиц. Сделать это можно, например, таким образом. Самой нижней вершине сопо ставим набор из одних нулей. Рёбрам сопоставим номера их направ лений, например, направлению самого правого ребра, выходящего из <нулевой> вершины, сопоставим номер 1, и т. д., а направлению самого левого такого ребра — номер n. Далее сопоставляем остав шимся вершинам куба имена с помощью следующего алгоритма.

Если какой-то вершине имя уже присвоено и, поднимаясь из неё вверх по какому-нибудь ребру, скажем, направления k, попадаем в новую, пока безымянную, вершину, то ей присваиваем имя, кото рое получается из имени прежней вершины заменой k-й компо ненты (которая была нулём) на противоположную(т. е. единицу).

Если же мы попали в вершину, имя которой уже было присвоено ранее, то можно ничего не делать, так как если мы попробуем всё же сопоставить ей имя согласно указанному правилу, то оно совпадёт с уже присвоенным именем. Очевидно, самой верхней вершине будет присвоен набор из одних единиц. Результат работы описанного алгоритма для четырёхмерного куба показан на рис. 4.

Читателю предоставляется возможность самому решить голо воломку Люка и обнаружить её связь с кодом Грея, а мы займём ся другим вопросом.

Бросается в глаза на изображениях многомерного куба, что все вершины, имена которых содержат заданное число единиц, ска жем k, лежат на одной прямой (рис. 5). Говорят, что эти вершины лежат на k-м слое куба. Очевидно, нулевой слой состоит из одной вершины — <нулевой>, а n-й слой состоит только из <единичной> вершины.

10. Сколько различных <возрастающих> путей ведут из <ну левой> вершины в даннуювершину k-го слоя?

Ответ: k(k-1)(k-2)·...·2·1. Это число называют и кратко обозначают k!.

*) В честь ирландского математика, механика, физика и астронома У. Р. Га мильтона, подсказавшего одному книготорговцу идею головоломки — как обойти по рёбрам все вершины правильного многогранника (например, додекаэдра) и вер нуться в исходную вершину. Полученные от книготорговца десять фунтов были, вероятно, единственным гонораром знаменитого учёного за многочисленные науч ные труды, если не считать оклада профессора Дублинского университета.

Рис. Для того чтобы решить эту задачу, достаточно <закодировать> любой такой путь последовательностью k различных чисел, нуме рующих направления составляющих этот путь рёбер.

В частности, число возрастающих путей от нулевой вершины до единичной равно n!. На любом таком пути есть единственная вершина, принадлежащая k-му слою, и она разбивает его на две части. Нижняя часть соединяет её с нулевой вершиной, и этот путь — один из множества возможных путей, соединяющих её с нулевой вершиной, которых, как мы уже знаем, ровно k!. Верх няя часть соединяет её с единичной вершиной, и этот путь — один из множества возможных, которых, как легко понять по анало гии, в точности (n-k)!.

Поэтому множество всех возрастающих путей от нулевой верши ны до единичной, проходящих при этом через заданную вершину k-го слоя, равно k! (n-k)!. Но всего возрастающих путей от нулевой 4-й слой 3-й слой 2-й слой 1-й слой 0-й слой Рис. 1111) ( 0111) 1110) ( ( 1011) 1101) ( ( 1100) ( 1001) 1010) ( ( 0101) ( 0110) ( 0011) ( 0010) 0100) ( ( 0001) ( 1000) ( 0000) ( 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) 1111) ( ( ( ( ( ( ( 1111) 1111) 1111) ( ( 1111) 1111) ( ( 1111) 1111) ( ( 1111) 1111) ( ( 1111) 1111) ( ( 1111) 1111) ( ( ( 1111) 1111) 1111) 1111) 1111) 1111) 1111) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0111) 0111) 0111) 0111) 0111) 1110) 1110) 1110) 0111) 1110) 1110) 0111) 0111) 1110) 1110) 0111) 1110) 1110) 0111) 0111) 1110) 1110) 0111) 0111) 1110) 1110) 0111) 0111) 1110) 1110) 0111) 0111) ( ( ( ( 1110) 1110) ( ( ( ( ( ( 0111) 0111) 0111) ( ( ( ( 1110) 1110) 1110) ( ( 0111) 0111) ( ( ( ( 1110) 1110) ( ( ( ( 0111) 0111) 1110) 1110) ( ( ( ( 0111) 0111) 1110) 1110) ( ( 0111) 0111) ( ( 1110) 1110) 0111) 0111) ( ( ( ( ( 0111) 0111) 1110) 1110) 0111) 0111) ( ( ( 1110) 1110) 0111) 0111) 0111) 1110) 1110) ( ( 1110) 1110) 1110) ( ( ( ( ( ( ( ( 1011) 1011) 1011) 1101) 1101) 1101) ( ( ( ( 1011) 1011) 1101) 1101) 1011) 1011) 1101) 1101) ( ( ( ( 1011) 1011) 1101) 1101) ( ( ( ( ( ( 1011) 1011) 1101) 1101) ( ( ( ( ( ( ( ( ( 1011) 1011) 1101) 1101) ( 1011) 1011) 1101) 1101) 1011) 1011) 1101) 1101) ( ( ( ( ( ( ( ( ( ( ( ( 1011) 1011) 1011) ( ( 1101) 1101) 1101) ( ( ( ( 1011) 1011) 1101) 1101) ( ( ( ( ( ( 1011) 1011) ( ( 1101) 1101) ( ( 1011) 1011) ( ( 1101) 1101) 1011) 1011) 1101) 1101) ( ( ( ( 1011) 1011) 1101) 1101) ( ( ( 1011) 1011) ( ( ( 1101) 1101) 1011) 1011) 1011) 1011) 1101) 1101) 1101) 1101) 1011) 1101) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) 1100) ( ( ( ( ( ( ( 1100) 1100) 1100) ( ( 1100) 1100) ( ( ( ( 1100) 1100) ( ( 1100) 1100) 1100) 1100) ( ( 1100) 1100) ( ( ( 1100) 1100) 1100) 1100) 1100) 1100) 1100) ( ( ( ( 1001) 1010) ( ( 1001) 1001) 1001) 1001) 1010) 1010) 1010) 1010) 1001) 1001) 1010) 1010) ( ( 1001) 1001) 1010) 1010) ( ( 1001) 1001) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( 1001) 1001) 1010) 1010) 1001) 1001) 1010) 1010) ( ( ( ( ( ( ( ( ( ( ( ( 1001) 1001) 1001) ( ( 1010) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( ( 1001) 1001) 1010) 1010) ( ( ( 1001) 1001) ( ( ( 1010) 1010) 1001) 1001) 1010) 1010) 1001) 1001) 1001) 1010) 1010) 1010) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) 0101) ( ( ( ( ( 0101) 0101) ( ( 0101) ( ( 0101) 0101) ( ( 0101) 0101) ( ( ( ( 0101) 0101) 0101) 0101) ( ( 0101) 0101) 0110) 0110) 0110) ( ( ( 0101) 0101) 0110) 0110) 0101) 0101) 0101) 0101) 0110) 0110) ( 0101) ( 0110) 0110) 0110) 0110) ( ( 0110) 0110) ( ( 0110) 0110) ( ( ( ( 0110) ( 0110) ( ( ( ( ( ( ( ( ( ( 0110) 0110) 0110) ( ( ( ( ( 0110) 0110) ( ( ( 0110) 0110) ( 0110) 0110) ( ( 0110) 0110) ( ( 0110) 0110) ( 0110) 0011) 0011) 0011) ( ( 0110) 0011) 0011) 0110) 0110) 0110) 0110) 0110) 0011) 0011) ( ( 0011) 0011) ( 0011) 0011) ( 0011) 0011) ( ( ( 0011) 0011) ( ( ( 0011) ( 0011) ( ( ( ( ( ( ( ( ( ( ( ( 0011) 0011) 0011) ( ( ( 0011) 0011) ( ( ( ( 0011) 0011) 0011) 0011) ( ( 0011) 0011) ( ( 0011) 0011) ( 0011) 0011) ( ( 0011) 0011) 0011) 0011) 0011) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0010) 0010) 0010) 0100) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) 0010) 0010) 0100) 0100) ( ( ( ( ( ( ( ( ( ( ( ( 0010) 0010) 0010) ( ( 0100) 0100) 0100) ( ( ( ( 0010) 0010) 0100) 0100) ( ( ( ( ( ( 0010) 0010) ( ( 0100) 0100) ( ( 0010) 0010) ( ( 0100) 0100) 0010) 0010) 0100) 0100) ( ( ( ( 0010) 0010) 0100) 0100) ( ( ( 0010) 0010) ( ( ( 0100) 0100) 0001) 0001) 0001) 0001) 0001) 0010) 0010) 0010) 0100) 0100) 0100) 0001) 0001) 0010) 0010) 0100) 0100) ( ( ( ( 0001) 0001) ( ( ( ( 0001) 0001) ( ( ( ( 0001) 0001) ( ( ( ( 0001) 0001) ( ( ( ( 0001) 0001) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0001) 0001) 0001) ( ( 0001) 0001) ( ( ( ( 0001) 0001) 1000) 1000) 1000) ( ( 0001) 0001) 1000) 1000) 1000) 1000) 0001) 0001) 1000) 1000) ( ( 0001) 0001) 1000) 1000) ( ( ( 0001) 0001) 1000) 1000) 0001) 0001) 0001) 0001) 0001) ( ( 1000) 1000) ( ( 1000) 1000) ( ( ( ( ( ( ( ( 1000) 1000) ( 1000) ( ( ( ( 1000) 1000) ( ( ( ( ( ( 1000) 1000) ( ( ( ( ( ( ( 1000) ( ( 1000) 1000) 1000) ( ( 1000) 1000) ( ( ( 1000) 1000) 1000) 1000) 1000) 1000) ( ( 1000) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) 0000) ( ( ( ( ( 0000) ( ( 0000) 0000) ( ( 0000) 0000) ( ( 0000) ( ( 0000) ( ( 0000) 0000) 0000) ( 0000) ( 0000) 0000) ( ( ( 0000) 0000) 0000) 0000) 0000) 0000) 0000) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( вершины до единичной n!, поэтому число вершин в k-м слое рав n!

но. Это число называется k-м биномиальным коэффици k! (n-k)!

ентом и обозначается кратко Ck. Далее оно нам понадобится.

n На этом мы заканчиваем рассказ о n-мерном кубе и возвраща емся в заключение опять к коду Грея. Очевидно, что в нём несо седние вершины могут быть соседними на кубе, т. е. соединяться в нём ребром. В некоторых приложениях, как теоретических, так и практических, представляет интерес построение цепи или цикла в n-мерном кубе, в которой несоседние вершины никогда не явля ются соседними в этом кубе. Такая цепь максимальной возможной длины называется <змеёй в ящике>. Какова её длина, до сих пор неизвестно. Наилучшие известные её оценки принадлежат ново сибирским математикам А. А. Евдокимову и А. Д. Коршунову.

Другой задачей, связанной с кодом Грея, но более простой, является его недвоичное обобщение. Например, как построить ци клическуюпоследовательность всех трёхзначных десятичных чисел от 000 до 999, в которой каждые два соседних числа были бы соседними ещё и в том смысле, что отличались бы ровно в одном разряде и ровно на единицу? Несколько проще построить такую последовательность, если считать цифры 0 и 9 также соседними, хотя разность между ними и не равна 1. Ещё проще построить нециклическуюпоследовательность с теми же свойствами.

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

Заметим, что этим методом можно вскрыть, конечно, дипломат не только с десятичным, но и с любым k-ичным кодовым замком.

Однако при нечётном k аналога циклического кода Грея не суще ствует, а существует только <цепной> код Грея. Читателю предо ставляется возможность самому это проверить.

§ 7. КНИГА ПЕРЕМЕН, АЗБУКА МОРЗЕ, ШРИФТ БРАЙЛЯ И АЛФАВИТНЫЕ КОДЫ Двоичная система, по крайней мере в своей комбинаторной ипостаси, по существу была известна в Древнем Китае. В клас сической книге <И-цзин> (<Книга Перемен>) приведены так на зываемые гексаграммы Фу-си, первая из которых имеет вид, а последняя (64-я) — вид, причём они расположены по кругу и занумерованы в точном соответствии с двоичной системой (ну лям и единицам соответствуют сплошные и прерывистые линии).

Китайцы не поленились придумать для этих диаграмм специаль ные иероглифы и названия (например, первая из них называлась <кунь>, а последняя — <цянь>, сплошной линии сопоставляется мужское начало янь, а прерывистой линии — женское начало инь).

Каждая гексаграмма состоит из двух триграмм (верхней и ниж ней), им тоже соответствуют определённые иероглифы и названия.

Например, триграмме из трёх сплошных линий сопоставлен образ-ат рибут <небо, творчество>, а триграмме из трёх прерывистых линий сопоставлен образ-атрибут <земля, податливость, восприимчивость>.

Их также принято располагать циклически, но этот цикл не явля ется кодом Грея.

Книга Перемен очень древняя, возможно, одна из древнейших в мире, и кто её написал — неизвестно. Она использовалась ранее, и используется в настоящее время, в том числе и на Западе, для гадания. В Европе с аналогичной целью используются карты Таро. В чём-то обе эти системы схожи, но Таро никак не связаны с двоичной системой, поэтому о них мы говорить не будем.

Способ гадания по Книге Перемен в кратком изложении таков.

Бросается шесть раз монета (или лучше пуговица, деньги в гадании применять не рекомендуется) и по полученным результатам (орёл или решка) разыскивается подходящая гексаграмма (для этого на до заранее сопоставить орлу и решке янь или инь). По гексаграм ме разыскиваете соответствующий раздел Книги Перемен (имеется перевод выдающегося синолога Ю. К. Шуцкого, неоднократно пе реиздававшийся в последнее время) и читаете, что там написано.

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

А может быть, просто магическим образом из множества вариантов будущего выбирается тот, который соответствует предсказанию?

Заинтересованного читателя отсылаем к книгам Дж. Х. Брен нана <Таинственный И-цзин>, М.: Гранд, 2001;

В. Фирсова <Кни га Перемен. Мистика и магия древнего Китая>, М.: Центрполи граф, 2002, и переходим к другой теме — азбуке для слепых.

На этом примере, в частности, хорошо видно, что многие на первый взгляд простые идеи рождались не сразу, и своим по явлением обязаны усилиям многих людей. Идею использовать ре льефные буквы для печатания книг для слепых первым предло жил француз Валентен Ойи. Но выпущенные им книги успехом не пользовались, так как слепым трудно было на ощупь отличать сложные начертания букв друг от друга.

Капитан французской армии Шарль Барбье в 1819 году пред ложил печатать выпуклыми не буквы, а точки и тире (или просто продавливать их на бумаге) и ими уже записывать буквы. Эту систему он назвал <ночное письмо> и предлагал вовсе не для сле пых, а для использования в военно-полевых условиях. С появлени ем электрических фонариков военное значение этого изобретения упало до нуля.

Слепой мальчик Луи Брайль познакомился с этой системой в 12 лет. Она ему понравилась тем, что позволяла не только читать, но и писать. В течение трёх лет он её усовершенствовал и создал так называемый шрифт Брайля. В нём символы языка (буквы, знаки препинания и цифры) кодируются комбинациями от одной до шести выпуклых точек, расположенных в виде таблицы стан дартного размера с тремя строчками и двумя столбцами. Элементы (точки) таблицы нумеруются числами 1, 2, 3 в первом столбце сверху вниз и 4, 5, 6 во втором столбце сверху вниз. Каждая точка либо продавливается специальной машинкой (или даже шилом) или остаётся целой. Всего различных способов продавить выпуклые точки в этой таблице 64 (в том числе и тот, в котором ни одна из точек не вдавлена). При желании теперь читатель может со поставить каждому символу алфавита Брайля одну из гексаграмм Книги Перемен. Вряд ли, конечно, Брайль знал об этой книге.

Вероятно, не имеет смысла описывать все символы шрифта Брайля, тем более что после его смерти в 1852 году шрифт допол нялся и совершенствовался. Но несколько слов сказать, видимо, стоит. Буква <а>, например, изображается одной выпуклой точкой в 1-м элементе таблицы, буква <б> изображается выпуклыми точ ками в 1-м и 2-м элементах таблицы и т. д. Для сокращения тек стов некоторые часто встречающиеся слова или комбинации букв кодируются специальными таблицами. Для того чтобы отличать заглавнуюбукву от строчной, перед ней ставят специальнуютабли цу, изображающую то, что сейчас называют эскейп-символом. Мно гие таблицы имеют несколько значений (например, буква и какой нибудь специальный знак или знак препинания), выбор из которых делается в соответствии с контекстом. Цифры кодируются так же, как и первые буквы алфавита, и, чтобы их отличать, перед по следовательностьюцифр ставится специальный символ — признак числа, а заканчивается число символом отмены признака числа.

Азбука Брайля по известности уступает азбуке Морзе, хотя и применяется до сих пор в отличие от последней. Сэмюэль Морзе известен однако не только изобретением азбуки. Он был и худож ником-портретистом (его картина <Генерал Лафайет> до сих пор висит в нью-йоркском Сити-Холле*)), и одним из первых фотогра фов в Америке (учился делать дагерротипные фотографии у са мого Луи Дагерра), и политиком (он баллотировался в 1836 го ду на пост мэра Нью-Йорка), но самое главное его достижение — изобретение телеграфа (а азбука Морзе понадобилась ему для ис пользования телеграфа). Заодно он изобрёл устройство, которое на зывается реле. Именно из реле спустя сто лет после Морзе были построены первые компьютеры.

*) Известна также его картина <Человек в предсмертной агонии>, после просмо тра которой его приятель, известный врач, сказал: <По-моему, малярия>.

Начал свои работы в этом направлении он в 1832 году, запа тентовал своё изобретение в 1836 году, но публичная демонстрация телеграфа произошла только 24 мая 1844 года. По телеграфной линии, соединяющей Вашингтон с Балтимором, была успешно передана фраза из Библии.

Точки и тире оказались самыми элементарными символами, которые мог передавать его телеграф. Они соответствовали корот ким и длинным импульсам электрического тока, передаваемым по телеграфным проводам. Длина импульса определялась нажатием руки телеграфиста на ключ телеграфа. Приём сигнала осуществля ло реле, которое после появления в нём импульса тока включало электромагнит, который либо заставлял стучать молоточек, либо прижимал колёсико с красящей лентой к бумажной ленте, на ко торой отпечатывалась либо точка, либо тире в зависимости от дли ны импульса.

Азбука Морзе сопоставляет каждой букве алфавита последо вательность из точек и тире. Естественней всего использовать такие последовательности длины 6, их всего 64 и хватит даже на русский алфавит. Но Морзе понимал, что длину сообщения желательно уменьшить, насколько возможно, поэтому он решил использовать последовательности длины не более 4, их всего 2+4+8+16=30.

В русском алфавите пришлось не использовать буквы <э> и <ё> и отождествить мягкий и твёрдый знаки. Кроме того, наиболее часто используемым буквам он предложил давать самые короткие коды, чтобы уменьшить среднюю длину передаваемого сообщения.

Эту идею в наше время используют с той же целью в алфавитном кодировании.

Здесь имеет смысл ввести терминологию теории кодирования.

Определение алфавитного кодирования очень просто. Пусть, на пример, кодирующим алфавитом является двухбуквенный алфа вит, например, состоящий из символов 0, 1. Схемой алфавитного кодирования называется отображение каждой буквы кодируемого алфавита в некоторое слово в кодирующем алфавите (называемое элементарным кодом), в рассматриваемом случае — последователь ность нулей или единиц. Пользуясь этой схемой, можно закодиро вать любое слово в кодируемом алфавите, заменяя в нём каждую букву на соответствующий ей элементарный код, и превратить исходное слово в более длинное слово в кодирующем алфавите.

Таким образом, и код Брайля, и азбука Морзе являются алфавит ными кодами.

Удобнее всего задать код Морзе в виде четырёхярусного двоич ного дерева. Из корня дерева выходят два ребра, из которых пра вому соответствует тире, а левому — точка. Это — рёбра первого яруса. Из их концов тоже аналогичным образом выходят по два ребра. Это — рёбра второго яруса. Дерево рисуем до четвёртого Ш Ч Щ З Ы Ц Ь Б Й П Я Л Ю Ф Ж Х О Г К Д В Р У С МНАИ ТЕ Рис. яруса. Вершинам дерева (за исключением корня) приписываем буквы алфавита (рис. 6). Тогда каждой букве можно сопоставить последовательность точек или тире, получающуюся, если выпи сать друг за другом последовательность символов, сопоставленных рёбрам дерева, образующим путь, идущий из корня к вершине дерева, соответствующей данной букве.

Очевидно, что алфавитный код должен обладать свойством од нозначной декодируемости, т. е. разные слова в исходном алфавите не могут иметь одинаковые коды. А так как процедуру деко дирования можно представлять как поиск разбиения закодиро ванного слова на элементарные коды, то это разделение должно быть однозначным. Поэтому однозначно декодируемые коды иногда называют разделимыми кодами. Ясно, что если все элементарные коды имеют одинаковую длину, то код разделим и алгоритм деко дирования очень прост. Но если это не так, то код может и не быть разделимым. Например, таким является код Морзе. Но между словами телеграфисты всегда делали промежутки, поэтому никаких проблем не возникало. Однако если промежутки между словами выделять невозможно, приходится использовать только раздели мые коды. А пустую букву, изображающую промежуток между словами, часто включают в состав алфавита, что даёт возможность всегда иметь дело не с предложениями, а только со словами.

Понять по достаточно сложному алфавитному коду, являет ся ли он разделимым, бывает не просто. Известны несколько разных алгоритмов для проверки разделимости кода. Наиболее наглядный из них принадлежит А. А. Маркову*).

Не вдаваясь в подробности, ограничимся замечанием, что код, у которого ни один из элементарных кодов не является началом другого (такие коды принято называть префиксными), несомненно является разделимым. Предоставим доказательство этой теоремы читателю. Очевидным примером префиксного кода является лю *) Заинтересовавшегося этими вопросами читателя мы отсылаем к книге А. А. Маркова <Теория алгорифмов>, М.: Наука, 1984;

М.: Фазис, 1996.

бой код с равными длинами кодовых слов. Код Морзе префиксным не является, что также предоставляется проверить читателю. Лю бой двоичный префиксный код можно задать подобно коду Морзе с помощью двоичного дерева, не обязательно такого равномерно го, как у него, но при этом буквы кодируемого алфавита должны сопоставляться только <листьям> дерева, но никак не внутренним вершинам.

Возвращаясь к истории алфавитного кодирования, заметим, что его корни уходят в глубь веков. Фактически первый при мер применения алфавитного кодирования был описан древнегре ческим историком Полибием. Алфавит записывался в квадратную таблицу 55 и каждая буква шифровалась парой своих коорди нат (i, j) (номерами строки и столбца), а передаваться сообщения могли в то время с помощью факелов — i факелов в левой руке и j факелов в правой означали пару (i, j).

Дальнейшее развитие идеи алфавитного кодирования принад лежит знаменитому английскому философу, эзотерику и писателю сэру Френсису Бэкону, который первым начал использовать двоич ный алфавит в качестве шифроалфавита. В криптографии, правда, это не нашло особого применения, главным образом из-за пяти кратного удлинения шифртекста в сравнении с открытым текстом.

Но сам Бэкон предложил использовать его как метод, сочетающий криптографию со стеганографией (так называется скрытие самого факта передачи секретного сообщения).

Вместо двоичных цифр он использовал обычный алфавит, но со шрифтами двух типов. Таким методом можно было в любом тексте спрятать шифровку, если, конечно, шрифты были достаточно мало различимы. Желательно при этом использовать разделимый код. Длина зашифрованного сообщения будет в несколько раз ко роче, чем длина содержащего его (и одновременно маскирующего его) текста, но если для передачи шифровки использовать книгу, то в ней можно таким образом незаметно разместить ещё целую книгу. Но эта красивая идея из-за дороговизны её реализации так и не нашла применения. В наше же время её нельзя рассматривать как серьёзный метод.

Интересно, что в XIX веке, главным образом в кругах, инте ресующихся наследием возникшего в средневековье тайного ми стического ордена розенкрейцеров, появилась идея, что Френсис Бэкон, которого считали розенкрейцером, является настоящим автором пьес Шекспира. Начали искать подтверждение этого в шифрах, которые мог оставить Бэкон в своих книгах, а также в первом знаменитом издании пьес Шекспира. Было, естественно, найдено много таких, якобы зашифрованных фрагментов. Серьёзные исследователи, правда, замечали, что в любом длинном тексте можно при желании и некоторых натяжках найти короткие фрагменты, напоминающие шифры. Но у сторонников авторства Бэкона стрем ление доказать это криптографическим методом приняло форму мании.

Американский миллионер Фабиан даже создал в начале XX века на свои деньги лабораторию криптоанализа, которая занималась только подобными исследованиями.

Фабиан нанял на работу дипломированного генетика Уильяма Фридмана, сына эмигрантов из России. Через некоторое время Фридман уже возглавлял у Фабиана и лабораторию генетики, и лабораториюкриптоанализа. Доказать авторство Бэкона он не смог, более того, он впоследствии опубликовал книгу, где опровергал возможность такого криптографического доказательства. Но он не на шутку увлёкся криптографией и своей подчинённой Элизабет Смит, с которой обвенчался в 1917 году. Они стали самой знаменитой супружеской парой в истории криптографии. После вступления Америки в войну у него с супругой появилась серьёзная работа по правительственным заказам. После войны он ушёл от Фабиана, и стал главным криптографом войск связи.

§ 8. ФОТОПЛЁНКА И ШТРИХ-КОД Рассмотрим теперь некоторые примеры реального применения двоичного кодирования в современной технике.

Как автоматические фотоаппараты узнают светочувствительность заправленной в них плёнки? Её измеряют в некоторых единицах, и вся выпускаемая сейчас в мире плёнка имеет одно из 24 стандартных значений светочувствительности. Эти значения кодируются некото рым стандартным образом наборами из нулей и единиц, естественно, длины 5. На поверхностикассеты для плёнки нанесены 12 квадратиков чёрного или серебристого цвета, образующих прямоугольник 26.

Квадратики его верхней части мысленно занумеруем от 1 до 6, начиная слева. Квадратики нижней части аналогично занумеруем от 7 до 12. Серебристые квадратики — это просто металлическая поверхность кассеты, она проводит ток, который с контакта внутри аппарата подаётся на первый квадрат (он всегда серебристый).

Чёрные квадраты покрыты краской, не проводящей ток.

Когда плёнка вставляется в аппарат, шесть его контактов со прикасаются с шестью первыми квадратиками, и с квадратиков со 2-го по 6-й снимается информация — нуль, если квадратик чёрный и ток по соответствующему контакту не идёт, и единица в противном случае. Вся информация о светочувствительности плёнки заключена в квадратиках со 2-го по 6-й. В остальных ква дратиках заключена информация о числе кадров в плёнке и т. п.

Ещё на поверхности кассеты можно увидеть штрих-код. Это так называемый универсальный код продукта, он сейчас ставится на всех продаваемых товарах. Для чего он нужен и как его прочитать?

Нужен он только для автоматического занесения информации в кассовый аппарат. Сам штрих-код состоит из тридцати чёрных полос переменной толщины, разделённой промежутками тоже переменной толщины. Толщина полос может принимать четыре значения от самой тонкой до самой толстой. Такую же толщину могут иметь и промежутки. Когда по сканеру проводят штрих-кодом, он воспринимает каждую чёрную полоску как последовательность единиц длины от одной до четырёх, и также воспринимает проме жутки между полосами, но при этом вместо единиц сканер видит нули. Полностью весь штрих-код сканер воспринимает как после довательность из 95 цифр 0 или 1 (их давно уже принято назы вать битами). Что же содержит этот код? Он кодирует 13-разряд ное десятичное число, совершенно открыто написанное под самим штрих-кодом. Если сканер не смог распознать штрих-код, то это число кассир вводит в аппарат вручную. Штрих-код нужен лишь для облегчения распознавания сканером изображения. Распозна вать цифры, к тому же повёрнутые боком, может только сложная программа распознавания на универсальном компьютере, да и то не очень надёжно, а не кассовый аппарат.

Какую же информацию содержит это 13-значное число? Этот вопрос к математике никакого отношения не имеет. Первая цифра задаёт тип товара, например, у товаров переменного веса она равна 2.

Следующие пять цифр — это код производителя, а следующие пять цифр — код самого продукта в принятой этим производителем кодировке. Последняя цифра — это код проверки. Он однозначно вычисляется по предыдущим 12 цифрам следующим образом. Нужно сложить все цифры с нечётными номерами, утроить сумму, к ней прибавить сумму оставшихся цифр, а полученный результат вычесть из ближайшего (большего) кратного 10 числа.

А вот 95-битный код, соответствующий штрих-коду, более интересен. Он содержит в себе только указанное 12-значное число (контрольная цифра в самом штрих-коде не содержится), но с боль шой избыточностью. Первые три бита в нём, так же, как и по следние — это всегда 101. Они нужны только для того, чтобы ска нер смог определить ширину полосы, соответствующей одному би ту (ведь размеры штрих-кода на разных упаковках могут быть раз ными) и настроиться на распознавание. В центре кода всегда стоит комбинация 01010, а левая и правая части кода состоят каждая из шести блоков по семь битов и содержат информацию о левых шести и правых шести из данных 12 десятичных цифр. Централь ная комбинация позволяет, в частности, отличать поддельные или плохо напечатанные коды.

Цифры 13-значного кода кодируются в левой и правой частях штрих-кода по-разному. В левой половине каждая цифра коди руется семёркой битов, начинающейся с 0 и заканчивающейся согласно следующей таблице:

=0001101=0, =0111101=3, =0111011=7, =0011001=1, =0100011=4, =0110111=8, =0010011=2, =0110001=5, =0001011=9.

=0101111=6, В правой половине каждая цифра кодируется семёркой битов, на чинающейся с 1 и заканчивающейся 0 согласно таблице, кото рая получается из вышеприведённой, если в ней нули заменить на единицы и единицы на нули (это переход к дополнительному коду). Можно заметить, что каждый из кодов в таблице содержит нечётное число единиц и ровно две группы рядом стоящих единиц и ровно две группы рядом стоящих нулей. Это означает, что каж дая цифра соответствует двум соседним полосам на штрих-коде.

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

Такая избыточная (не четырёхбитовая, а семибитовая) табли ца кодов нужна для того, чтобы сканер мог правильно прочитать штрих-код и в случае, когда код направляют в него <вверх но гами>. Как сканер может отличать одно направление от другого?

По чётности или нечётности числа единиц в первом же прочитан ном семибитовом блоке, идущем после комбинации 101. При пра вильном направлении оно будет нечётным, а при обратном напра влении — чётным. Перепутать же коды, прочитанные слева, и ко ды, прочитанные справа, согласно свойству таблицы, невозможно.

Если же в каком-то из семибитовых блоков нарушено правиль ное чередование нулей и единиц в первом и последнем битах или ему не соответствует чётность числа единиц, то штрих-код при знаётся поддельным или плохо пропечатанным.

§ 9. ЗАДАЧИ О ПЕРЕЛИВАНИЯХ На одной из Всесоюзных математических олимпиад была пред ложена следующая задача. В три сосуда налито по целому числу литров воды. В любой сосуд разрешается перелить столько воды, сколько в нём уже содержится, из любого другого сосуда. Каждый из сосудов может вместить всюимеющуюся в них воду. Докажите, что можно несколькими переливаниями освободить один из сосудов.

В её решении неожиданно на первый взгляд применяется дво ичная система. Так как задача оказалась очень трудной (на олим пиаде её никто не решил), мы приведём здесь это решение. В нём используются две идеи. Первая из них заключается в том, что если будет найден алгоритм переливания, после применения которого ми нимальный объём воды, содержащейся в одном из сосудов, умень шается, то, повторяя многократно этот алгоритм, мы опорожним один из сосудов. Эта идея не такая простая, как может показать ся. Ведь это не что иное, как метод бесконечного спуска П. Ферма.

Идея применения двоичной системы лежит в основе этого алго ритма уменьшения минимума. Пусть в сосудах A, B, C находится abc литров воды. Разделим b на a с остатком, b=aq+r, 0r

Нужно ещё заметить, что во время каждой процедуры из сосу да C выливалось меньше воды, чем из сосуда B, так как 2+22+...

...+2l-1<2l. Поэтому всего из сосуда C вылито воды меньше, чем из B, значит оба они не опорожнятся раньше времени, и алгоритм работает корректно.

Приведённую выше задачу можно обобщить и на большее количество сосудов. Применив к любым трём из них указанный алгоритм, один из сосудов опорожним. Повторяя эту процедуру ещё раз, опорожним ещё один сосуд и т. д., пока не останутся заполненными только два сосуда.

Предоставляем читателю самостоятельно выяснить, что будет происходить, если продолжить переливания с двумя оставшимися сосудами.

Выше указывалось, что при решении некоторых задач о пе реливаниях можно использовать аддитивные цепочки. Предлага ем читателю для самостоятельного решения одну из таких задач.

11. Как быстрее всего наполнить флягу 85 литрами моло ка, пользуясь однолитровым черпаком, если есть ещё одна та кая же фляга и весы, способные только сравнивать массы фляг?

Классические задачи о переливаниях выглядят несколько по другому, и метод их решения не связан с двоичной системой.

Примером такой задачи, решение которой по преданиюпослу жило знаменитому французскому математику Пуассону толчком к выбору его профессии, является вопрос о том, как, имея полные сосуды в 3 и 5 литров и пустой 8-литровый сосуд, отмерить ров но 4 литра. Читателюпредоставляется возможность самостоятель но придумать метод решения подобных задач за наименьшее ко личество переливаний.

§ 10. ИГРА <НИМ> Двоичная система находит неожиданное применение при ана лизе известной игры <Ним>. Происхождение её, так же, как и шах мат, покрыто туманом. Возможно, она была изобретена в Китае.

Состоит она в следующем: на столе лежит несколько кучек спи чек, и два игрока по очереди выбирают одну из кучек и забирают из неё сколько угодно спичек (хоть все);

выигрывает тот, кто заби рает последнюю (есть вариант игры, в котором забравший послед нюю проигрывает). Эпизод с этой игрой неоднократно повторяется в известном французском фильме <Прошлым летом в Мариенбаде>.

Игра <Ним> являлась излюбленной темой математических кружков в МГУ. Иногда она представлялась в виде гонки несколь ких пешек от одного края доски доски до другого. Читатель сам сможет сформулировать правила игры в таком её представлении.

При игре с одной кучкой, очевидно, побеждает начинающий.

При игре с двумя кучками начинающий побеждает не всегда.

12. Докажите, что выигрывающей позицией является позиция с двумя равными кучками. Игрок, сумевший после своего хода попасть в такуюпозицию, всегда сможет выиграть.

В случае трёх и более кучек описание выигрышной позиции не так просто. Алгоритм распознавания выигрышной позиции следу ющий. Нужно количество спичек в каждой кучке записать в двоичной системе, и вычислить сумму по модулю 2 полученных двоичных наборов (далее для краткости будем называть её ним-суммой).

Для этого вначале нужно вычислить покомпонентную сумму этих наборов, т. е. найти сумму всех младших разрядов, потом сумму следующих за ними разрядов (отсутствующие разряды заменяются нулями) и т. д., и записать полученные суммы в виде (возможно, недвоичного) набора, а потом каждую его компоненту заменить на остаток от деления на 2. Если получится набор из одних нулей, то позиция выигрышная.

Например, если в кучках было 3, 7, 12, 17 спичек, то поком понентно складывать придётся наборы 11 (=3) + 111 (=7) 1100 (=12) 10001 (=17) Ним-сумма равна 11001, поэтому позиция является проигрыш ной для того, кто в неё попал после своего хода. Причина в том, что противник может сделать ход, которым он попадёт в позицию с нулевой ним-суммой. Для этого он может оставить в последней кучке число спичек, равное в двоичной записи ним-суммы наборов 10001 и 11001, т. е. 01000. Тогда ним-сумма чисел, образующих новую позицию, будет равна нулевому набору, так как эта сумма будет отли чаться от прежней суммы 11001 прибавлением к ней по модулю2 набо ра 11001, что даёт в результате, очевидно, нулевой набор. Поскольку 01000=8, из последней кучки надо взять 17-8=9 спичек.

13. Докажите в общем случае, что из позиции с ненулевой ним-суммой за один ход можно попасть в позицию с нулевой ним-суммой, а из позиции с нулевой ним-суммой любой ход ведёт к позиции с ненулевой ним-суммой.

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

Указанная выигрышная стратегия поддаётся для реализации даже на специализированных машинах. Одна из таких машин была вы ставлена после войны в Берлине на английской выставке и с успехом конкурировала с находящимся рядом бесплатным пивным залом.

Знаменитый английский математик Алан Тьюринг вспоминал о том, как популярность этой машины повысилась ещё больше после победы над тогдашним бундесминистром экономики Л. Эрхардом.

Читателю предоставляем возможность найти выигрышную стратегиюпри игре ним в поддавки.

Более интересная модификация игры ним получается, если огра ничить число спичек, которые можно взять за один раз, например, числом 10. Тогда интерес представляет даже игра с одной кучкой спичек. Эту игру изобрёл в XVII веке французский математик Баше де Мезириак, написавший кстати, одну из первых в Европе книг по занимательной математике. Читатель может попробовать сам придумать для неё выигрышную стратегию.

§ 11. Д. И. МЕНДЕЛЕЕВ И ТРОИЧНАЯ СИСТЕМА Когда мы рассматривали задачу о взвешивании с помощью гирь, мы предположили, что груз лежит на одной чашке, а гири — на другой. Но если разрешить класть гири на обе чашки весов, то ответ в задаче об оптимальной системе разновесок изменится. Оп тимальной теперь будет система из гирек с массами, образованны ми степенями тройки. Этой задачей интересовался Д. И. Менделеев в бытность свою председателем Российской палаты мер и весов*).

*) Менделеев имел широкие интересы как в чистой, так и в прикладной науке.

Он занимался, например, и экономикой, и демографией, известны его исследования об оптимальной концентрации спирта в воде при производстве водки, по просьбе генштаба он раскрыл состав артиллерийского пороха, используемого немецкой ар мией. Отвечая на один вопрос Менделеева, А. А. Марков написал знаменитую ра боту об оценке производной многочлена через величину его максимального значе ния на отрезке.

Оказалось, что частный случай этой задачи был опубликован в книге Баше де Мезириака в XVII веке, а ранее был известен Фибоначчи. Спрашивалось, какое наименьшее число гирь нужно иметь, чтобы можно было взвесить любой груз от 1 до 40 г. Опти мальным оказался набор гирь 1, 3, 9, 27 г. Для того чтобы взве сить груз в n г, надо представить число n в виде суммы a0+3a1+ +9a2+27a3, где ai=0, ±1 (i=0, 1, 2, 3). Тогда для его взвеши вания достаточно на чашку вместе с грузом положить все гири, массы которых входят в эту сумму со знаком минус, а на противо положнуючашку положить все гири, массы которых входят в эту сумму со знаком плюс.

Но как найти такую сумму? Один из возможных способов решения этой задачи основан на сведении её к представлению числа n+40 в виде суммы b0+3b1+9b2+27b3, где bi=0, 1, (i=0, 1, 2, 3). Мы уже знаем, что эта задача равносильна предста влению числа n+40 в троичной системе n+40=(b0b1b2b3)3. Один из алгоритмов её решения заключается в том, что на правую чашку весов кладутся вначале самые тяжёлые гири, потом гири меньшего веса и т. д. Например, этот алгоритм для числа 40 даёт разложение 40=27+9+3+1. Если мы уравновесили массу n+40 г, поло жив на чашку bi гирь массы 3i (i=0, 1, 2, 3), то перекладывая на другую чашку по одной гире каждой массы, мы уравновесим n г. На алгебраическом языке это означает, что будет получено равенство n=a0+3a1+9a2+27a3, ai=bi-1 (i=0, 1, 2, 3). Оче видно, что при этом ai=0, ±1 (i=0, 1, 2, 3). Верно и обратное, а именно, из разложения n=a0+3a1+9a2+27a3, ai=0, ± (i=0, 1, 2, 3) можно получить разложение n+40=b0+3b1+9b2+ +27b3, bi=0, 1, 2 (i=0, 1, 2, 3). Поэтому из известной нам един ственности представления n+40=b0+3b1+9b2+27b3, bi=0, 1, (i=0, 1, 2, 3), означающей единственность записи данного числа в троичной системе, вытекает единственность представления n= =a0+3a1+9a2+27a3, ai=0, ±1 (i=0, 1, 2, 3), означающая един ственность записи данного числа в так называемой уравновешенной троичной системе, n=(a0a1a2a3)3.

Эта система способна составить некоторую конкуренцию дво ичной системе как по простоте арифметических алгоритмов, так и по количеству применений в математических задачах. Удобным её свойством является то, что для изменения знака у представляе мого числа достаточно изменить знаки у всех его цифр.

В общем виде доказанные выше утверждения можно записать следующим образом.

Любое целое число от -(3n-1)/2 до (3n-1)/2 может быть однозначно представлено в виде 3n-1bn-1+...+3b1+b0, где bi= =0, ±1. Для того чтобы взвесить любой груз от 1 до (3n-1)/2 г за одно взвешивание, достаточно иметь гири 1, 3, 9,..., 3n-1 г.

Читатель легко докажет всё это самостоятельно, если заметит, что (3n-1)/2=1+3+32+...+3n-1, другими словами, троичная запись числа (3n-1)/2 состоит из одних единиц.

Докажем, что меньшего количества гирь недостаточно, и пред ложенная система для грузов от 1 до (3n-1)/2 г оптимальна. До пустим, что есть система из n-1 гирь с массами g1,..., gn-1, по зволяющая взвесить любой из этих грузов. Это значит, что любое число m от -(3n-1)/2 до (3n-1)/2 можно представить в виде алгебраической суммы a1g1+...+an-1gn-1, ai=0, ±1, (i=1,...

..., n-1). Но таких сумм ровно 3n-1, так как каждое слагаемое входит в неё с одним из трёх возможных коэффициентов. Но 3n- меньше общего числа различных грузов, равного 3n.

14. Покажите, что оптимальная система гирь для взвешивания грузов от 1 до (3n-1)/2 определена однозначно.

15. Докажите, что для взвешивания любого груза от 1 до m г, (3n-1-1)/2

Уравновешенная троичная система, кроме указанного выше свойства, обладает ещё несколькими удобными свойствами. Напри мер, для выполнения округления в этой системе достаточно просто отбросить лишние цифры. В неуравновешенной системе, даже дво ичной, округление выполняется не так просто. Так же просто, как и в уравновешенной системе, производится сравнение чисел по ве личине, но не нужно обращать при этом внимание на знак числа.

Кстати, знак числа в этой системе определяется знаком старшей ненулевой цифры, и не нужно использовать специальный знако вый бит, как в двоичной системе. А таблицы сложения, умноже ния и деления почти так же просты, как и в двоичной системе.

Вычитание же просто сводится к сложениюсо сменой знака у вы читаемого. При записи чисел в этой системе удобно вместо - писать 1. Так как таблица умножения и деления совсем просты, приведём только таблицу сложения:

1+1=11, 1+1=00, 1+1=11, 1+0=01, 1+0=01.

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

Видимо, благодаря им троичная уравновешенная система была положена в основу советского компьютера <Сетунь>, построенного в конце 1950-х годов.

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

Уравновешенная система может быть рассмотрена и для любого натурального основания, правда, при чётном основании запись в ней перестаёт быть однозначной. Преимуществом уравновешенных систем является то, что в них записываются и отрицательные числа без знака минус перед записью, а также то, что таблица умножения в этих системах в сравнении с обычными примерно в четыре раза короче, как отметил О. Л. Коши.

16. Запишите число (1234567890)10 в уравновешенной деся тичной системе счисления.

Утверждение следующей задачи на первый взгляд кажется ложным, однако присмотритесь к ней повнимательнее.

17. Докажите, что любое ненулевое целое число имеет един ственное знакопеременное двоичное представление 20 -21 +...

...+(-1)k2k, где 0<1<...

Десятичную запись чисел можно преобразовать в запись, со стоящую из цифр 0, ±1, ±2, ±3, ±4, ±5, заменяя все цифры, большие 5 на их дополнения до 10, взятые с противоположным знаком, и делая при этом единичный перенос в следующий раз ряд. Сложение и умножение таких записей можно делать так же, как и обычных, только при этом переносы в следующие разряды могут быть отрицательными. Оценки для числа операций при этом не улучшатся, но сами операции в некотором смысле станут проще, так как для их выполнения достаточно помнить таблицу умноже ния 55. Например, перемножим числа 89 и 98. Запишем первое из них как (1 -1 -1), а второе — (1 0 -2). Умножаем столбиком:

1 -1 - 1 0 - -2 2 1 -1 - 1 -1 -3 2 К счастью, не пришлось делать переносов, но это не труднее, чем в обычном умножении (заметим, что при умножении обыч ных записей этих чисел переносы чуть ли не в каждом разряде).

Осталось перевести ответ в обычнуюзапись: (1 -1 -3 2 2)=8722.

§ 12. ТРОИЧНАЯ СИСТЕМА И ФОКУС ЖЕРГОННА Троичная система удачно применяется при объяснении сле дующего фокуса Жергонна (французского математика XIX века).

Зритель запоминает одну из 27 карт и выкладывает их в три стоп ки по девять карт картинками вверх (первая карта идёт в первую стопку, вторая — во вторую, третья — в третью, четвёртая — в первую и т. д.). Фокуснику сообщается, в какой из стопок за думанная карта, потом стопки складываются в любом из шести возможных порядков (не перетасовывая карты внутри стопок) и раскладываются снова в три стопки, начиная с верхней карты, потом складываются опять и процедура повторяется в третий раз (каждый раз сообщается, в какую из стопок легла запомненная карта). Фокусник каждый раз замечает, куда легла стопка с запо мненной картой — в верх (фокусник запоминает символ 0), в сере дину (символ 1), или в низ колоды (символ 2), и составляет из этих символов трёхзначное число в троичной системе счисления, ставя первый из замеченных символов в младший разряд, следующий символ — во второй и последний символ — в старший разряд.

К полученному числу прибавляется единица и отсчитывается такое количество карт, начиная с верхней карты колоды — по следняя из отсчитанных карт и есть запомненная зрителем.

18. Объясните фокус Жергонна.

Имеется ещё один вариант фокуса Жергонна, но с другим спо собом раскладки карт. Колода из 27 карт раскладывается на три стопки в следующем порядке: первая карта — в первую стопку, вторая — во вторую, третья — в третью, четвёртая — опять в тре тью, пятая — во вторую, шестая — в первую и т. д. Одна из карт запоминается зрителем и указывается стопка, в которой она ле жит, и всё повторяется ещё два раза. Способ угадывания тот же самый. Можно показывать тот же фокус и с 21 картой, но тогда надо раскладывать карты самому и стопку с задуманной картой всегда класть в середину колоды.

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

Приведём ещё одну задачу, при решении которой может при годиться троичная система.

20. Докажите, что среди чисел от 1 до 3n-1 можно найти 2n таких, что никакое среди них не является средним арифмети ческим двух других.

§ 13. НЕМНОГО ОБ ИСТОРИИ ПОЗИЦИОННЫХ СИСТЕМ СЧИСЛЕНИЯ Ещё средневековые математики Ближнего Востока нашли простой подход к вычислениям с дробными числами — использование десятичных дробей. Десятичная система попала туда, видимо, из Индии, хотя позиционные дроби, правда не десятичные, a шестидесятеричные, были известны ещё в древнем Шумере, а десятичные дроби, по существу, были известны в древнем Китае.

Индейцы майя, вероятно, использовали двадцатеричную систему.

Здесь уместно вспомнить, что запись (bn...b0,b...b )b в пози -1 -k ционной системе счисления с основанием b означает число, равное bnbn+...+b1b+b0+b b-1+...+b b-k, где bnbn+...+b1b+b0 — -1 -k его целая, а b b-1+...+b b-k — дробная часть. В западных -1 -k странах вместо запятой, отделяющей целую часть от дробной, используется точка.

Почему обычно используется десятичная система? Главным образом, в силу традиции (которая, вероятно, основывается на том, что число пальцев на обеих руках равно обычно 10;

индейцы майя, возможно, не забыли и про ноги). Как писал Паскаль, десятичная система ничем не лучше систем с другими основаниями. С не которых точек зрения более удобны другие системы. Так, много поклонников имеет двенадцатеричная система (идущая от счёта дюжинами и гроссами — дюжинами дюжин). Возможно, к их числу относился и Г. Дж. Уэллс (см. его роман <Когда спящий проснётся>).

Преимущество этой системы в том, что 12 имеет больше делителей, чем 10, что несколько упрощает деление. С этой точки зрения ещё лучше шестидесятеричная система (но таблица умножения в этой системе вгоняет в дрожь). Остатки от былого распростране ния этой системы видны в картографии и астрономии, а алгоритм перевода из этой системы в десятичную запаян в любом кальку ляторе для научных расчётов (речь идёт о переводе из градусной меры в десятичную и обратно). Кстати, первая запись дробного числа в позиционной системе в Европе была сделана в XIII веке Фибоначчи: корень уравнения x3+2x2+10x=20 он нашёл в виде 1 26 7 42.

Есть поклонники и у восьмеричной и шестнадцатеричной систем. Первую из них хотел вести в Швеции Карл ХII (который, возможно, пришёл к этой идее самостоятельно), но ряд обстоя тельств помешали этому прогрессивному начинанию (среди них, вероятно, и занятость короля в военных кампаниях, в частности, в России). Преимущество этих систем в том, что легко осуще ствляется перевод в двоичнуюсистему и обратно.

Основатель теории множеств уроженец Петербурга Георг Кан тор предложил рассматривать системы счисления со смешанными основаниями. Запись в таких системах выглядит так:

a3, a2, a1, a0;

a, a, a, -1 -2 - b2, b1, b0;

b, b, b, -1 -2 - где bi — основания, ai —цифры, 0ai

-1 -1 -2 -2 - Частным случаем таких систем является факториальная, ко торая получается при bk=k+2, b =k+1. Используя её, можно -k любое натуральное число представить в виде ann!+...+a22!+a11!, где 0akk.

Системы со смешанными основаниями всем известны из по вседневной жизни. Например, <1 неделя 2 дня 3 часа 4 минуты 1, 2, 3, 4, 56;

56 секунд 789 миллисекунд> равно секунд.

7, 24, 60, 60;

§ 14. CХЕМА ГОРНЕРА И ПЕРЕВОД ИЗ ОДНОЙ ПОЗИЦИОННОЙ СИСТЕМЫ В ДРУГУЮ Использованный в бинарном методе (см. § 2) приём вычисле ния числа по его двоичной записи является примером более обще го алгоритма, называемого схемой Горнера. Схема Горнера — это алгоритм для вычисления частного и остатка от деления много члена p(x) на х-a. Кратко опишем, как он устроен и как связан с переводом числа из одной системы в другую.

Пусть дан произвольный многочлен p(x)=unxn+...+u1x+u0.

Деление этого многочлена на x-a — это представление его в виде p(x)=(x-a)h(x)+r, h(x)=vn-1xn-1+...+v1x+v0. Непосредствен но можно проверить, что коэффициенты частного можно найти по формулам vn-1=un, vn-2=un-1+avn-1,..., v0=u1+av1, а остаток можно вычислить по формулам r=u0+av0=u0+a(u1+av1)=u0+a(u1+a(u2+av2))=...

...=u0+a(u1+a(...(un-1+aun)...)=unan+...+u1a+u0=p(a).

Этот метод вычисления и называется схемой Горнера. Слово <схе ма> в названии алгоритма связано с тем, что обычно его выпол нение оформляют следующим образом. Сначала рисуют таблицу 2(n+2). В левой нижней клетке записывают число a, а в верх ней строке — коэффициенты un, un-1,..., u0 многочлена p(x), при этом левуюверхнюю клетку оставляют пустой:

...

un un-1 u...

a...

После этого под числом un записывают un. Далее на каждом ша ге последнее записанное число умножают на a, к результату при бавляют число, стоящее справа сверху от последнего записанного числа, и полученнуюсумму записывают в клетку справа от этого числа:

...

u u u n n-...

a vn-1=un vn-2=una+un-1 p(a)...

Число, которое после выполнения алгоритма оказывается записан ным в правой нижней клетке, и есть остаток p(a) деления много члена p(x) на x-a. Другие числа vn-1, vn-2,... нижней строки являются коэффициентами частного.

Например, деление многочлена p(x)=x3-2x+3 на x- по описанному алгоритму выполняется так:

1 0 -2 3 1 0 -2 1) 4) 2 2 1 2 2·2-2= 1 0 -2 3 1 0 -2 2) 5) 2 1 2 1 2 2 2·2+3= 1 0 -2 3 1 0 -2 3) 6) 2 1 1·2+0=2 2 1 2 2 Получаем, что x3-2x+3=(x-2)(x2+2x+2)+7.

Общее число операций, используемых в этом алгоритме, равно n плюс число ненулевых коэффициентов у многочлена p(x) минус единица.

Схема Горнера была на самом деле применена англичани ном Горнером (а ещё раньше итальянцем Руффини) для вычисле ния коэффициентов многочлена p(x+c) и использовалась для при ближённого вычисления корней многочленов*). Мы укажем неко торые другие её применения. Одно из них — быстрый алгоритм перевода из двоичной системы в десятичную, предложенный Соде ном в 1953 году.

Сначала переведём число из двоичной системы в восьмерич ную. Для этого разбиваем справа налево его цифры на <тройки> (последняя <тройка> на самом деле может быть <двойкой> или да же одной цифрой) и переводим их в восьмеричнуюсистему схемой Горнера (выполняемой устно). Например, (1111110000)2=(1.111.110.000)2 =(1760)8.

Выполним перевод из восьмеричной системы в десятичную.

Пусть u=(un...u1)8. На k-м шаге выполняем над полученной на предыдущем шаге записью в десятичной арифметике действия un...un-k-1-2·un...un-k=vn+1...vn-k- и получаем запись vn+1...vn-k-1.un-k-2...u1 (старшие разряды мо гут оказаться нулевыми и в реальных вычислениях участвовать не будут). На (n-1)-м шаге получаем десятичнуюзапись числа u.

*) Впрочем, лежащая в её основе идея была известна Ньютону и, может быть, даже до него.

Например, -1.7 6 -1 5.6 3 -1 2 6. 2 5 1 0 0 Алгоритм перевода из десятичной системы в двоичную, пред ложенный Розье в 1962 году, почти такой же. Сначала переводим в восьмеричную запись. Для этого, пользуясь восьмеричной ариф метикой, на k-м шаге выполняем над полученной на предыдущем шаге записьюдействия:

un...un-k-1+2·un...un-k=vn+1...vn-k- и получаем запись vn+1...vn-k-1.un-k-2...u1 (поначалу (n+1)-е разряды окажутся нулевыми и в реальных вычислениях участво вать не будут). На (n-1)-м шаге получаем восьмеричную запись числа u. Например, +1.9 4 +2 3.4 4 +3 0 2. 6 0 3 6 3 Далее переводим восьмеричное n-значное число в двоичное (вы числяя для каждой восьмеричной цифры двумя делениями на с остатком её двоичнуюзапись).

21. Переведите из десятичной системы в двоичную систему число 12345678987654321.

22. Переведите из двоичной системы в десятичную систему число 10101010101010101.

§ 15. ПРИЗНАКИ ДЕЛИМОСТИ Рассказывая о системах счисления, нельзя обойти вниманием признаки делимости. Напомним широко известные признаки де лимости в случае использования десятичной системы счисления.

Простейший из них следующий: остаток от деления некоторого числа на 2n равен остатку от деления на 2n числа, записанного последними его n цифрами. Аналогичный признак справедлив для 5n и любого числа вида 2k5m, где max(m, k)=n. Чуть более сложен в применении признак делимости на 9: сумма цифр данно го числа имеет тот же остаток от деления на 9, что и само число.

Такой же признак справедлив и для делимости на 3.

Подобный же признак можно предложить и для делимости на чи сло 9...9, состоящее из n девяток: надо разбить испытуемое число на n-разрядные блоки, начиная с младших разрядов, и всех их сло жить (блок, образованный старшими разрядами, может быть короче);

у полученного числа будет тот же остаток от деления, что и у ис ходного. Так как 99 делится на 11, то таким способом можно най ти и остаток от деления на 11. Учитывая, что 999 делится на и, следовательно, на 37, получаем признаки делимости на эти числа.

Но есть более эффективный признак делимости на 11: надо складывать цифры числа, начиная с младших, чередуя знаки (пер вая цифра берётся со знаком плюс) — полученное число имеет тот же остаток от деления на 11, что и исходное.

Аналогичный признак делимости имеется и для числа 10...01, запись которого, кроме двух единиц, содержит n нулей. Испытуе мое число разбивается на (n+1)-разрядные блоки, начиная с млад ших разрядов (блок, образованный старшими разрядами, может быть короче), и все они складываются с чередующимися знака ми (первое число берётся со знаком плюс). Полученный результат имеет тот же остаток от деления, что и испытуемое число. По скольку 1001=11·7·13, мы попутно получаем таким путём при знаки делимости на 7, 13, 91, 77, 143.

23. Докажите сформулированные признаки делимости.

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

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

24. Найдите остаток от деления 4444444444 на 99.

Число 4444444444 состоит более чем из 200 000 цифр, и его прямое вычисление требует порядка миллиарда операций. Правда, кроме признаков делимости на 9 и 11, здесь надо применить и не которые соображения, связанные с делимостью степеней. Другой способ решения этой задачи — применение калькулятора и бинар ного метода возведения в степень.

Полезны признаки делимости и при разгадывании ребусов, подобных следующему.

25. Замените звёздочки на пропущенные цифры в примере Признаки делимости могут помочь в нахождении ошибки при вы полнении умножения больших чисел. Простейший из способов контроля — проверка по модулю 9. Этому способу обучали ещё в средневековых университетах: у обоих множителей находятся остатки от деления на 9, потом исходные числа перемножаются и у результата опять находится остаток от деления на 9, который срав нивается с остатком от деления на 9 произведения исходных чисел, подлежащего проверке. Если остатки разные, то произошла ошиб ка. Если известно, что ошибка только в одном разряде, то мож но точно указать величину ошибки, но не её положение. В случае совпадения результатов остаётся возможность одной ошибки типа замены 0 на 9 или наоборот, а также нескольких ошибок. В этом случае можно провести ещё аналогичную проверку по модулю 11, которая или подтвердит существование ошибки указанного вида, или установит наличие нескольких ошибок (или их отсутствие).

§ 16. АРИФМЕТИЧЕСКИЕ КОДЫ Можно установить точно положение ошибки и даже исправить её, в предположении, что она только одна. Для этого надо применить так называемые арифметические коды. Приведём их простейший пример.

Допустим, что при перемножении десятичных чисел получи лось 15-разрядное число с ошибкой в одном разряде. Для нахожде ния величины ошибки применим проверку по модулю9 и найдём, что она по модулю 9 равна a. Если ошибка произошла в i-м раз ряде*), то величина ошибки в произведении равна a·10i-1 или (a-9)·10i-1, а если a=0, то или ошибки не было, или она рав на ±9·10i-1. Применим проверку по модулю31. После неё станет известно значение ошибки b по модулю 31. Если остаток по моду лю31 равен нулю, то ошибки не было.

Пусть он не равен нулю. Выпишем остатки от деления чисел 10,..., 1015 на 31. Они равны 10, 7, 8, 18, 25, 2, 20, 14, 16, 5, 19, 4, 9, 28, 1. Заметим, что невозможно равенство по моду лю 31 чисел a·10i и (a-9)·10j, так как тогда при некоторых a= =1, 2, 3, 4 и i=0, 1,..., 14 были бы равны по модулю 31 числа a·10i и a-9, а невозможность этого проверяется непосредственно *) Разряды нумеруются с конца десятичной записи. Например, 3-й разряд — это разряд сотен.

с помощью вычисленной выше последовательности остатков. Точ но также проверяется невозможность совпадения по модулю31 чи сел 9·10i и (-9)·10j. Вычисляя остатки по модулю31 у всех чисел a·10i и (a-9)·10i при i=1,..., 15 и сравнивая их с найденным ранее остатком, находим значение i и точную величину ошибки a или a-9. Аналогично поступаем в случае ошибки ±9·10i.

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

Но такие алгоритмы применяют для контроля правильности работы арифметических устройств, и этот контроль осуществляет специальный блок в таком устройстве. В рассматриваемом случае сложность устройства со встроенным арифметическим кодом рас смотренного вида увеличивается не более чем в два раза. Если рассмотреть подобные коды с достаточно большой длиной (p-1)/ и проверочными множителями 9 и p, где p — простое число вида 280k+31 такое, что 10(p-1)/2 при делении на p даёт остаток 1, а 10k при k<(p-1)/2 при делении на p дают остатки, отличные от 1 (в рассмотренном случае p равнялось 31, а k — нулю ), то сложность исправления ошибки будет мала при больших p в срав нении со сложностьюумножения (p-1)/2-разрядных чисел.

На самом деле, на практике использовались для повышения надёжности арифметических устройств не десятичные, как рассмо тренный, а двоичные коды, но они устроены подобным же образом.

26. Примените указанный арифметический код для расшиф ровки ребуса Можно с помощьюэтого кода расшифровать и ребус, в котором ровно в одном разряде результата имеется ошибка, но неизвестно в каком. Тот же код можно использовать для демонстрации ариф метического фокуса: вы предлагаете вашему другу задумать два не слишком больших числа, перемножить их и результат умно жить на якобы случайное число 279, а потом сообщить вам ответ с одной ошибкой в каком-нибудь разряде. Используя указанный код (если перед этим предварительно подготовить все нужные таблицы и немного потренироваться), вы быстро укажете эту ошибку. За метьте, что полный перебор вариантов требует в случае 15-разряд ного ответа 134-кратного деления предполагаемого ответа на 279.

§ 17. МИНИМАЛЬНЫЕ ФОРМЫ ДВОИЧНОЙ ЗАПИСИ С ЦИФРАМИ 0 И ± И ПЕРВАЯ ПОПЫТКА УМЕНЬШИТЬ СЛОЖНОСТЬ УМНОЖЕНИЯ В позиционных системах счисления с заданным основанием b можно, кроме обычных цифр, использовать и отрицательные цифры -1, -2,..., -(b-1). Правда, это приводит к неодно значности в записи чисел. Зато таким образом можно уменьшить количество ненулевых цифр в записи и их величину. Далее в этом параграфе мы будем рассматривать случай b=2, т. е. записи чисел в двоичной системе с цифрами -1, 0, 1.

27. Приведите пример числа, для которого существуют по крайней мере две записи описанного вида с минимальным возможным числом ненулевых цифр.

Назовём двоичную запись с использованием отрицательных единиц минимальной формой, если в ней нет соседних ненулевых цифр. Для этого определения не очевидна ни единственность ми нимальной формы, ни минимальность длины минимальной формы.

Однако и то, и другое верно, т. е. минимальная форма определе на однозачно и содержит наименьшее количество ненулевых цифр среди всех возможных форм двоичной записи числа с использова нием отрицательных единиц.

Докажем это. Пусть A=an...a0 — произвольная двоичная запись числа a, т. е.

a=2nan+...+2a1+a0, где ai=0, ±1. Далее вместо -1 будем писать 1. Обозначим че рез (A) количество ненулевых цифр в этой записи и через µ(A) — количество пар соседних ненулевых цифр. Заметим, что 2k+2k+1+...+2m-1=2m-2k, поэтому, выполняя в записи A следующие преобразования:

1 0, 2 0...0...0 (n3), n n- 3 0(0)...(0)0(0)...(0) (n1), n n+ 4 00(0)...(0)0(0)...(0) (n0), n n+ 5 0(0)...(0)(0)...(0) (n0) n n+ (где для =1, 1, соответственно, =1, 1), мы не меняем записы ваемого числа, не увеличиваем величин (A) и µ(A) и всегда умень шаем их сумму:

Операция µ 1 µ-1 или µ-2 - 2 µ+2-n или µ+1-n (n3) +2-n 3 µ-1 или µ-2 - 4 µ- 5 µ-1 или µ-2 - Будем выполнять эти преобразования, пока это возможно. Так как величина (A)+µ(A) не может неограниченно уменьшаться, то в конце концов получим запись числа a, в которой нельзя будет выполнить ни одну из этих операций.

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

Докажем единственность минимальной формы для данного чи сла a. Допустим, что есть две разные минимальные формы A и B.

Тогда они заканчиваются одинаковым числом нулей в младших разрядах, иначе, если бы одна заканчивалась k нулями, а другая m>k нулями, то наше число делилось бы на 2m, а с другой сто роны, делилось бы только на 2k, но не на 2k+1, что невозможно.

Аналогично получаем, что их последние ненулевые цифры равны, так как в противном случае наше число имело бы при делении на 2m+2 (где m — число нулей в конце) в остатке разные числа 2m и 2m+2-2m (так как в конце одной записи стоят цифры 010...0, а в конце другой — цифры 010...0 ввиду отсутствия пар ненуле вых цифр в обеих записях). Отбрасывая равные последние цифры от обеих записей, получаем более короткие различные записи для равных чисел. Повторяя для этих записей проведённое рассужде ние, получим, наконец, что число ±1 или 0 имеет две разные за писи, а это невозможно.

Наконец, докажем, что в минимальной форме наименьшее ко личество ненулевых цифр среди всех записей с отрицательными единицами. Действительно, из любой записи можно с помощью рассмотренных преобразований получить построеннуюзапись (как только что доказано, всегда одну и ту же). Но при выполнении этих преобразований величина (a) не возрастала, значит, постро енная запись имеет значение этой величины, равное наименьшему возможному.

Преобразование обычной двоичной записи числа a к мини мальной форме более удобно проводить следующим образом: вычи слить обычную двоичную запись n+1...1 числа 3a и вычислить обычные разности i-1=i-i, где i=2,..., n+1, i —цифрыза писи числа a, а n=n+1=0, тогда n...1 — минимальная форма числа a.

Минимальная форма максимум на единицу длиннее обычной записи, но содержит не более n/2 ненулевых цифр. При смене знака у числа меняются знаки у всех цифр его минимальной формы. Действительно, при замене знаков всех цифр минимальной формы числа a получается запись числа -a, в которой нет двух ненулевых цифр подряд. А это по определениюи есть минимальная запись числа -a.

Одно из возможных применений указанной минимальной фор мы — уменьшение числа арифметических операций для возведения в степень. Мы уже приводили конкретный пример такого примене ния, а сейчас сформулируем общуютеорему. Далее для краткости вместо словосочетания <число арифметических операций алгоритма> будем писать <сложность алгоритма>.

Обозначим число ненулевых цифр в записи числа n в виде мини мальной формы через (n), а уменьшеннуюна единицу длину этой записи — через (n). Мы используем те же обозначения, что и в обыч ном бинарном методе (см. § 2), но заметим, что новая функция (n) может быть на единицу больше старой, зато новая функция (n) немо жет быть больше старой, а часто меньше её, иногда почти в два раза.

Теорема. При использовании калькулятора с одной ячейкой памяти сложность вычисления xn не превосходит (n)+(n)-1.

Д о к а з а т е л ь с т в о. Используя полученную минимальную форму, запишем n в виде суммы 2(n)(n)+...+21+0, i=0, ±1, содержащей (n) ненулевых слагаемых. Далее, как и в обычном бинарном методе возведения в степень, используем аналог схемы Горнера, а цифрам -1 сопоставляем операциюделения на основа ние степени. Полученное обобщение бинарного метода использует не более (n) возведений в квадрат и (n)-1 умножений и деле ний. Теорема доказана.

Аналогично обычному бинарному методу можно доказать соот ношения (2n)+(2n)=(n)+(n)+1, (n±1)(n)+1. Из послед него неравенства следует, что (n±1)+(n±1)(n)+(n)+1. Дей ствительно, случай n±1=n+1 рассматривается аналогично обычно му бинарному методу, а в случае n±1=n-1, очевидно, (n-1) (n) и из неравенства (n-1)(n)+1 следует нужная оценка.

Используя доказанное неравенство, можно аналогично обычному бинарному методу в случае, когда содержимое ячейки памяти никогда не обновляется, получить аналогичную нижнюю оценку сложности возведения в степень (n)+(n)-1. Читателюпредоста вляется возможность самому убедится в этом.

Недостатком двоичной системы при её ручном использовании является то, что из-за увеличения длины записи по сравнениюс де сятичной системой соответственно возрастает и сложность умно жения. Использование минимальной формы позволяет уменьшить сложность ручного умножения двоичных чисел. Опишем алгоритм умножения, предложенный в начале 1950-х годов американским математиком Бутом.

Для этого данные n-разрядные и m-разрядные двоичные числа преобразуем в их минимальные формы и заметим, что эти формы содержат не более n+1 и m+1 разрядов, причём из них не более a=n/2+1 и b=m/2+1 ненулевых разрядов соответственно.

Сложность преобразования не превосходит 3n+3m-4. Умножая минимальные формы с помощью школьного алгоритма, замечаем, что число нетривиальных умножений не превосходит ab, так как ненулевых строк будет не более b и в каждой из них нетривиальных умножений не более a. Отметим, что каждое нетривиальное умножение, по-существу, не сложнее нетривиального умножения в обычной двоичной системе, и будем считать, что оно выполняется с единичной сложностью, так же как и нетривиальное сложение (операция нетривиальна, если оба операнда не нули). Заметим также, что число нетривиальных сложений не превосходит (b-1) (a+n-1), так как всего сложений различных строк требуется не более b-1, а каждое из них состоит из не более чем n пе реносов (переносы могут быть как 1, так и -1) и не более чем a-1 нетривиальных сложений (в складываемых строчках имеется не более a-1 стоящих друг под другом ненулевых цифр). Поэтому сложность умножения не превосходит (b-1)(a+n-1)+ab mn+(m+n)/2+1. Полученный результат содержит не более n+m+2 разрядов (так как он получается при сложении m+ не более чем (n+1)-разрядных чисел с соответствующими сдвига ми). Его можно преобразовать к обычной двоичной записи, сделав не более n+m+2 операции (заменяем блоки соседних цифр вида 10...01 на соответствующие блоки вида 01...11, блоки вида 11 — на блоки 01, блоки без отрицательных цифр оставляем без измене ния). Значит, полная сложность операции умножения не превосхо дит mn+(m+n)/2+1+3n+3m-4+n+m+2mn+3,5(m+n).

§ 18. БЫСТРОE УМНОЖЕНИЕ МНОГОЧЛЕНОВ Мало кто знает, что относительно недавно были открыты гораздо более быстрые алгоритмы умножения и деления много значных чисел и многочленов, чем <школьные>. Первый такой алгоритм придумал в 1962 году А. А. Карацуба, отвечая на вопрос А. Н. Колмогорова. Впоследствии А. Л. Тоомом, Ф. Штрассеном и А. Шенхаге были построены ещё более быстрые алгоритмы.

Идеюметода Карацубы можно пояснить на следующем приме ре. Пусть перемножаются восьмизначные числа U=u1...u8 и V= =v1...v8. Представим их как двузначные числа в системе счи сления с основанием 104: U=U1U2, V=V1V2, где U1=u1u2u3u4, U2=u5u6u7u8, V1=v1v2v3v4, V2=v5v6v7v8. Тогда их произведение можно представить в следующем виде:

UV=108U1V1+104((U1-U2)(V2-V1)+U1V1+U2V2)+U2V2.

Эта формула сводит умножение восьмизначных чисел к трём операциям умножения и шести операциям сложения-вычитания четырёхзначных чисел (с учётом переносов в следующие разряды).

Обычный способ требует четырёх умножений и трёх сложений вычитаний, но так как три раза сложить четырёхзначные числа можно быстрее, чем один раз перемножить, то метод Карацубы уже восьмизначные числа перемножает быстрее. В общем случае он требует для перемножения n-значных чисел по порядку не больше nlog2 3

Далее мы поговорим о сложности умножения более подробно.

Обозначим через M(n) наименьшее количество операций сло жения, вычитания и умножения (выполняемых над коэффициен тами многочленов и промежуточными числовыми результатами), требующихся для перемножения двух многочленов степеней, мень ших n. Тогда справедливо неравенство M(n)2M( n/2 )+M( n/2 )+4 n/2 +2n-4 *). (*) Действительно, применим равенство (f1x n/2 +f0)(g1x n/2 +g0)= =f1g1x2 n/2 +((f1+f0)(g1+g0)-f1g1-f0g0)x n/2 +f0g0, где степени многочленов f1 и g1 меньше n/2, а степени многочле нов f0 и g0 меньше n/2, и заметим, что для вычисления произве дений f1g1, f0g0 требуется не более M( n/2 )+M( n/2 ) операций, для вычисления сумм f1+f0, g1+g0, f1g1+f0g0 нужно не более 2 n/2 +2 n/2 -1 операций (так как число операций равно наи меньшему из количеств ненулевых коэффициентов у складывае мых многочленов), для вычисления произведения (f1+f0)(g1+g0) используется не более M( n/2 ) операций, для вычисления разно сти (f1+f0)(g1+g0)-f1g1-f0g0 достаточно n-1 операций, так как *) Через x обозначается наибольшее целое число, не большее x (<округление вниз>), а через x — наименьшее целое число, не меньшее x (<округление вверх>).

(f1+f0)(g1+g0)-f1g1-f0g0=f1g0+f0g1, значит, степень этого мно гочлена равна n/2 + n/2 -2=n-2, сложение многочленов f0g и f1g1x2 n/2 выполняется <бесплатно>, так как они не имеют по добных членов, причём в их сумме отсутствует член вида x2 n/2 -1, поэтому для сложения многочленов f0g0+f1g1x2 n/2 и(f1g0+f0g1) x n/2 достаточно n-2 операций. B итоге требуется дополнительно 4 n/2 +2n-4 операций.

Оценку сложности метода Карацубы можно представить в сле дующем виде. Если n кратно 2k, то справедливо неравенство M(n)3k M n 8n -2 -8n+2, 2k + 2k а при любом n — неравенство M(n)< nlog2 3.

Действительно, пусть 2km=n. Тогда неравенство M(n)3k M n 8n -2 -8n+2, 2k + 2k доказывается индукцией по k. База (k=1) — это неравенство (*).

Шаг индукции обосновывается тем же неравенством.

Bыберем k так, чтобы 2k

3 Если же n3·2k-1, то M(n)M(3·2k-1)<3k-1(M(3)+22)3k-1·35 nlog2 3.

29. Проверьте, что обычный способ умножения многочленов даёт оценку M(n)n2+(n-1)2.

§ 19. БЫСТРОE УМНОЖЕНИЕ ЧИСЕЛ Перейдём теперь к умножениючисел.

Обозначим через M(n) наименьшее количество операций сло жения, вычитания и умножения, выполняемых над числами, мень шими a, требующихcя для перемножения двух n-значных чисел, записанных в позиционной системе счисления с основанием a.

Метод умножения почти такой же, как и для многочленов.

Для примера укажем, как сделать необходимые изменения в рас суждениях из предыдущего параграфа.

Справедливы неравенства M(2n)3M(n)+19n, M(2n+1)2M(n+1)+M(n)+17n+10.

Действительно, применим тождество (f1b n/2 +f0)(g1b n/2 +g0)= =f1g1b2 n/2 +(f1g1+f0g0-(f1-f0)(g1-g0))b n/2 +f0g0, где числа f1 и g1 — n/2 -разрядные, а числа f0 и g0 — n/2 -раз рядные и заметим, что для вычисления произведений f1g1 и f0g требуется M( n/2 )+M( n/2 ) операций, для вычисления разностей f0-f1, g0-g1 и суммы f1g1+f0g0 требуется не более n(1+ n/2 - n/2 )+2( n/2 + n/2 -1)+2( n/2 + n/2 )-1= =4n-3+n(1+ n/2 - n/2 ) операций, так как числа f1g1 и f0g0 имеют не более чем 2 n/ и 2 n/2 разрядов соответственно, а в случае чётного n нужно ещё 2 n/2 =n операций для предварительного сравнения чисел (чтобы не вычитать из меньшего большее). Заметим далее, что для вычисле ния произведения (f1-f0)(g1-g0) требуется не более M( n/2 )+ операций (одна операция для вычисления знака у произведения), для вычисления разности f1g1+f0g0-(f1-f0)(g1-g0)=f1g0+f0g требуется не более 2 n/2 +1+2 n/2 -1=4 n/2 операций, сложе ние чисел f0g0 и f1g1b2 n/2 осуществляется <бесплатно> (записи этих чисел просто объединяются в одну запись), а для сложе ния чисел f1g1b2 n/2 +f0g0 и (f1g0+f0g1)b n/2 требуется не более 2n- n/2 +n+1-1=2n+ n/2 операций (так как число f1g0+f0g имеет не более n+1 разрядов, а младшие n/2 разрядов числа f0g0 не участвуют в операциях). B итоге требуется дополнительно 4n-3+n(1+ n/2 - n/2 )+1+4 n/2 +2n+ n/2 =7n+3 n/2 + +n(1+ n/2 - n/2 )-2 операций.

Остальные детали предоставляем додумать читателю.

Обозначим через Q(n) сложность возведения n-разрядного чи сла в квадрат и такое же обозначение будем использовать для сложности возведения в квадрат многочлена степени n-1.

(a+b)2-(a-b) 30. Используя тождество ab=, докажите для случая операций с числами неравенство M(n)2Q(n)+13n+ +O(1), а для случая операций с многочленами — неравенство M(n)2Q(n)+6n+4.

ПРИЛОЖЕНИЕ ЧТО МОЖНО ВЫЧИСЛИТЬ НА СЧЁТАХ?

Воспользовавшись такой простейшей модельювычислений, как абак, в России называвшийся просто счётами, можно построить всё здание современной теории алгоритмов. Разумеется, это понятие надо немного идеализировать и придать ему, например, такой вид.

Пусть нам нужно вычислить данную числовую функцию f(x1,..., xn). Представим себе, что у нас есть счёты, содержащие n <входных> спиц, на i-й из которых имеется в начальный момент xi костяшек, одну <выходную> (первоначально пустую) спицу, на которой будет получен результат, и некоторое количество (первоначально пустых) <рабочих> спиц. Каждая спица состоит на самом деле из двух половин, и пока речь шла только о левых половинах. В правой половине каждой спицы помещается потен циально не ограниченный запас костяшек, и по нашему желанию мы можем сделать в любой момент одну из двух операций: либо передвинуть самую левую костяшку из правой половины спицы в <рабочую> левую половину, увеличив тем самым <записанное> в ней число на единицу, либо передвинуть крайнюю правую ко стяшку из <рабочей> левой половины спицы в правую<запасную> половину, уменьшив тем самым <записанное> в левой половине число на единицу.

Если перейти к терминологии языков программирования, то мы здесь описали систему регистров машины, и две опера ции, применимые к ним — прибавление единицы и вычитание единицы.

Сама программа вычисления на счётах (или на соответству ющей идеализированной машине с неограниченными регистрами) представляет из себя диаграмму, состоящую из кружочков, в ко торых написаны номера спиц (регистров), после которых стоят знаки плюс или минус, указывающие на операции, которые мы выполняем на этих спицах (регистрах). Из кружочков со знаком плюс выходит одна стрелка, ведущая в какой-то другой кружочек (она указывает какую следующую операцию делать). Из кружоч ков со знаком минус выходит две такие стрелки. Одна из них по мечается специальным значком и используется только тогда, ко гда на <рабочей> половине спицы не осталось костяшек (в регистре записан ноль). Тогда операция вычитания единицы, естественно, не может быть выполнена, и просто делается переход к новой вершине диаграммы по указанной стрелке. Если же на спице оста вались костяшки (регистр не равен 0), то операция вычитания единицы выполняется и тоже делается переход к новой вершине диаграммы, но, естественно, по второй стрелке. Отметим ещё, что совсем не обязательно, чтобы разные вершины диаграммы вы полняли операции с разными спицами.

Теперь, чтобы такая диаграмма могла определить работающую программу, осталось выделить в ней две стрелки — начало и конец работы программы. Первая из них выделяется среди других стрелок тем, что имеет конец в одной из вершин диаграммы, но не имеет начала в вершинах диаграммы, а начинается в специальном кружке со словом <НАЧАЛО>, а вторая, наоборот, начинается в одной из вершин, но не ведёт ни в одну из вершин диаграммы, а ведёт в кружок со словом <КОНЕЦ>.

Программа начинает работать со слова <НАЧАЛО> и заканчи вает, когда придёт в слово <КОНЕЦ> (но может и <зациклиться> и никогда не закончить работу). Результатом работы программы можно считать число, записанное на <выходном> регистре. Если это число всегда совпадает со значением рассматриваемой функции f(x1,..., xn), в случае, если она определена при заданных значениях переменных, и если программа всегда <зацикливается> в случае, если эта функция не определена при заданных значениях перемен ных, то говорят, что программа (вычисления на счётах!) правильно вычисляет заданнуюфункцию.

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

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

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

А как известно, на машине Тьюринга можно промоделировать любые компьютерные вычисления. Значит, и на счётах тоже можно!

31. Приведите пример <зацикливающейся> программы для абака.

32. Приведите пример программы, складывающей содержимое двух регистров и помещающей результат во второй регистр одно временно с обнулением первого регистра.

33. Приведите пример программы, складывающей содержи мое двух регистров и помещающей результат во второй регистр, но не изменяющей первый регистр (используйте вспомогатель ный <рабочий> регистр).

34. Приведите пример программы, перемножающей содержи мое двух регистров и помещающей результат в третий регистр одновременно с обнулением первого регистра. (Используйте пре дыдущуюпрограмму в качестве подпрограммы.) 35. Приведите пример программы, перемножающей содержи мое двух регистров и помещающей результат во второй регистр без изменения первого регистра. (Используйте вспомогательный регистр и предыдущую программу в качестве подпрограммы.) 36. Покажите, как возводить в степень на счётах. (Используй те предыдущуюпрограмму в качестве подпрограммы.) ЛИТЕРАТУРА Литература по теме книжки огромна, и приводимый далее спи сок не претендует на полноту. В него включены некоторые источ ники, использованные автором при подготовки книжки, а также расширяющие и дополняющие её. Они выбраны из числа наиболее доступных, в том числе и по времени издания.

[1] А л ф у т о в а Н. Б., У с т и н о в А. В. Алгебра и теория чисел:

Сборник задач. — М.: МЦНМО, 2002.

[2] А н д р е е в а Е., Ф а л и н а И. Системы счисления и компью терные арифметика. — М.: Лаборатория базовых знаний, 1999.

[3] Б у л о с Д., Д ж е ф р и Р. Вычислимость и логика. — М.:

Мир, 1994.

[4] В а с и л ь е в Н. Б., Е г о р о в А. А. Задачи всесоюзных ма тематических олимпиад. — М.: Наука, 1988. — (Библиотека математического кружка. Вып. 18).

[5] Во р о б ь ё в Н. Н. Признаки делимости. — М.: Наука, 1988. — (Популярные лекции по математике. Вып. 39).

[6] Г а л ь п е р и н Г. А., Т о л п ы г о А. К. Московские математи ческие олимпиады. — М.: Просвещение, 1986.

[7] Г а р д н е р М. Математические головоломки и развлечения / Пер. с англ. Ю. А. Данилова / Под ред. Я. А. Смородинско го. — М.: Мир, 1999. — (Математическая мозаика. Вып. 1).

[8] Г а р д н е р М. Математические досуги / Пер. с англ. Ю. А. Да нилова / Под ред. Я. А. Смородинского. — М.: Мир, 2000. — (Математическая мозаика. Вып. 2).

[9] Г а р д н е р М. Математические новеллы / Пер. с англ.

Ю. А. Данилова / Под ред. Я. А. Смородинского. — М.: Мир, 2000. — (Математическая мозаика. Вып. 3).

[10] Г а ш к о в С. Б., Ч у б а р и к о в В. Н. Арифметика, алго ритмы, сложность вычислений. — М.: Высшая школа, 2000.

[11] Д а д а е в Ю. Г. Теория арифметических кодов. — М.: Радио и связь, 1981.

[12] Е л е н ь с к и й Щ. По следам Пифагора. — М.: Детгиз, 1961.

[13] К н у т Д. Искусство программирования: Пер. с англ. — Т. 2. — М.: Вильямс, 2000.

[14] П е т ц о л ь д Ч. Код. — М.: Русская редакция Майкрософт Пресс, 2001.

[15] С е в и д ж Д. Сложность вычислений. — М.: Факториал, 1998.

[16] С т а х о в А. П. Коды золотой пропорции. — М.: Радио о связь, 1984.

[17] Ф о м и н С. В. Системы счисления. — М.: Наука, 1980. — (Популярные лекции по математике. Вып. 40).

[18] Ш т е й н г а у з Г. Математический калейдоскоп: Пер.

с польск. — М.: Наука, 1981. — (Библиотечка <Квант>. Вып. 8).

БИБЛИОТЕКА <МАТЕМАТИЧЕСКОЕ ПРОСВЕЩЕНИЕ> ВЫПУСК 1 ВЫПУСК В. М. Тихомиров. Великие В. М. Т и х о м и р о в. Диф математики прошлого и их ве- ференциальное исчисление (те ликие теоремы. ория и приложения).

ВЫПУСК ВЫПУСК В. А. С к в о р ц о в. Примеры А. А. Б о л и б р у х. Проблемы метрических пространств.

Гильберта (100 лет спустя).

ВЫПУСК ВЫПУСК В. Г. С у р д и н. Пятая сила.

Д. В. Аносов. Взгляд на ма ВЫПУСК тематику и нечто из неё.

А. В. Ж у к о в. О числе.

ВЫПУСК ВЫПУСК В. В. Прасо ло в. Точки Брока А. Г. М я к и ш е в. Элементы ра и изогональное сопряжение.

геометрии треугольника.

ВЫПУСК ВЫПУСК Н. П. Долбилин. Жемчужины И. В. Я щ е н к о. Парадоксы теории многогранников.

теории множеств.

ВЫПУСК ВЫПУСК А. Б. С о с и н с к и й. Мыльные И. Х. С а б и т о в. Объёмы плёнки и случайные блуждания.

многогранников.

ВЫПУСК ВЫПУСК И. М. Парамонова. Сим А. Л. С е м ё н о в. Математика метрия в математике.

текстов.

ВЫПУСК 8 ВЫПУСК В. В. Острик, М. А. Цфасман. М. А. Ш у б и н. Математиче Алгебраическая геометрия ский анализ для решения фи и теория чисел: рациональные зических задач.

и эллиптические кривые.

ВЫПУСК А. И. Д ь я ч е н к о. Магнитные ВЫПУСК полюса Земли.

Б. П. Гейдман. Площади мно гоугольников.

ВЫПУСК С. М. Г у с е й н - З а д е. Разбор ВЫПУСК чивая невеста.

А.Б.Сосинский. Узлы и косы.

ВЫПУСК ВЫПУСК К. П. К о х а с ь. Ладейные Э. Б. В и н б е р г. Симметрия числа и многочлены.

многочленов.

ВЫПУСК ВЫПУСК С. Г. С м и р н о в. Прогулки В. Г. С у р д и н. Динамика по замкнутым поверхностям.

звёздных систем.

ВЫПУСК ВЫПУСК А. М. Райгородский. Хро В. О. Б у г а е н к о. Уравнения матические числа.

Пелля.

ВЫПУСК С. Б. Г а ш к о в. Системы ВЫПУСК В. И. Арнольд. Цепные дроби. счисления и их применение.




© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.