/
Автор: Гашков С.Б.
Теги: теория чисел электротехника математика арифметика алгоритмы компьютерные технологии
ISBN: 978-5-397-02880-6
Год: 2012
Текст
ШЕДЕВРЫ
НАУЧНО-ПОПУЛЯРНОЙ
’ I
НАУКУ
MATE]'
И
С.Б.Гашков
ЗПНИНПТЕПЬНПЯ
КОМПЬЮТЕРНАЯ /
АРИФМЕТИКА
1UJ-),
tyliVbk |
I
URSS
Быстрыео
алгоритмы операций
с числами
'и многочленами
НАУКУ—ВСЕМ!
Шедевры научно-популярной литературы (математика)
С. Б. Гашков
ЗАНИМАТЕЛЬНАЯ
КОМПЬЮТЕРНАЯ
АРИФМЕТИКА
Быстрые алгоритмы
операций с числами
и многочленами
URSS
МОСКВА
ББК 22.130 22.19 22.1о 32.811 32.81о 32.97
Гашков Сергей Борисович
Занимательная компьютерная арифметика: Быстрые алгоритмы
операций с числами и многочленами. — М.: Книжный дом «ЛИБРОКОМ»,
2012. — 224 с. (НАУКУ — ВСЕМ! Шедевры научно-популярной
литературы (математика).)
В настоящей книге рассматриваются методы быстрого выполнения различных
видов вычислений, рассказывается о реализации быстрых алгоритмов как в виде
логических схем — математической модели реальных электронных микросхем,
так и в виде компьютерных программ. Исследуются также вопросы о том, как
измерить сложность того или иного вычислительного алгоритма и оценить время
его работы на компьютере. Бблыпая часть материала книги доступна всем, кто
знаком лишь со школьным курсом математики, но и опытный читатель может
найти в этой книге кое-что новое для себя.
Книга написана на основе лекций, которые автор в разное время читал
учащимся физико-математической Школы им. А. Н. Колмогорова при МГУ, на
Малом и Большом мехмате, а также на факультетах информационной безопасности
и информатики РГГУ.
Издательство «Книжный дом “ЛИБРОКОМ”».
117335, Москва, Нахимовский пр-т, 56.
Формат 60x90/16. Печ л 14 Зак.№ЖМ-54.
Отпечатано в ООО «ЛЕНАНД».
117312, Москва, пр-т Шестидесятилетия Октября, ПА, стр. 11.
ISBN 978-5-397-02880-6
© Книжный дом «ЛИБРОКОМ», 2012
НАУЧНАЯ И УЧЕБНАЯ ЛИТЕРАТУРА
~р-! E-mail. URSS@URSS.ru
Каталог изданий в Интернете:
http://URSS.ru
Тел /факс (многоканальный):
URSS + 7 (499) 724-25-45
Все права защищены. Никакая часть настоящей книги не может быть воспроизведена или
передана в какой бы то ни было форме и какими бы то ни было средствами, будь то элек-
тронные или механические, включая фотокопирование и запись на магнитный носитель,
а также размещение в Интернете, если на то нет письменного разрешения владельца.
Моей матери и памяти моего отца
Содержание
От автора............................................... 6
Введение ............................................... 7
Глава 1. Школьные алгоритмы арифметических операций
с многочленами...................................... 12
Глава 2. Школьные алгоритмы сложения
и умножения чисел .................................. 19
Глава 3. Умножение столбиком нескольких чисел...... 25
Глава 4. Переносы при сложении двоичных чисел
и теорема Куммера................................... 30
Плава 5. Минимальные формы двоичной записи
с цифрами 0 и ±1 и первая попытка уменьшить
сложность умножения ................................ 35
Глава 6. Быстрое умножение многочленов................. 43
Глава 7. Быстрое умножение чисел....................... 50
Схемная реализация метода Карацубы
для умножения двоичных чисел ............... 52
Глава 8. Деление многозначных чисел.................... 62
Глава 9. Как представляются отрицательные числа
в компьютере ....................................... 71
Глава 10. SRT-деление.................................. 75
Глава 11. Быстрое деление многочленов.................. 94
Глава 12. Быстрое деление чисел....................... 107
Содержание
5
Глава 13. Сравнение сложности умножения, деления,
возведения в квадрат и извлечения
квадратного корня..................................... 120
Глава 14. О сложности преобразования чисел
из одной системы в другую............................. 131
Глава 15. Модулярная арифметика и китайская теорема
об остатках........................................... 143
Глава 16. Сложность операций модулярной арифметики ... 153
Как найти остаток от деления,
не вычисляя частное...................... 157
Глава 17. Умножение и деление на константы............ 169
Глава 18. Некоторые быстрые алгоритмы работы с битами . . 179
Маленькие хитрости в работе с битами....... 186
Глава 19. Вычисление некоторых целочисленных
элементарных функций.................................. 193
Целочисленный квадратный корень............ 193
Целочисленные логарифмы.................... 196
Глава 20. Быстрые операции с дробно-рациональными
функциями............................................. 197
Быстрое сложение дробно-рациональных функций .... 197
Быстрый китайский алгоритм .............. 202
Быстрая интерполяция....................... 203
Еще о быстром умножении многочленов........ 204
Глава 21. Варианты алгоритма Евклида.................. 206
Алгоритм Евклида с выбором минимального остатка . . 206
Бинарный алгоритм Евклида ................ 210
Глава 22. Еще о схеме Горнера......................... 214
Diaea23. Что можно вычислить на счетах................ 218
Литература............................................ 222
От автора
Предлагаемая вниманию читателя книга является продолже-
нием моей книги «Занимательная компьютерная арифметика: Ма-
тематика и искусство счета на компьютерах и без них». Назва-
ние «Быстрые алгоритмы» допускает неоднозначное толкование.
Например, естественно подумать, что будут обсуждаться методы
быстрого выполнения различных видов вычислений (фактически,
подобные вопросы уже рассматривались в предыдущей части кни-
ги). Но можно также решить, что будут рассматриваться вопросы
о том, как измерить сложность того или иного вычислительного
алгоритма и оценить время его работы на компьютере (или объем
вычислений, который предстоит выполнить собственными рука-
ми). Речь пойдет и о том, и о другом.
Настоящий материал можно изучать независимо от первой
части, хотя в нем и содержится небольшое количество ссылок
на книгу «Математика и искусство счета на компьютерах и без
них». Следующее далее введение в основном повторяет введение
к предыдущей книге.
Введение
Развитие быстрых алгоритмов
происходит медленно.
Арнольд Шёнхаге
Здесь уместно разъяснить, что означает термин «компьютерная
арифметика» или, по крайней мере, как он понимается в книге.
Как и любая область науки, компьютерная арифметика со-
стоит из нескольких связанных между собой направлений и по-
разному выглядит с разных точек зрения. В ней есть и многочис-
ленные технические детали, и фундаментальные понятия. Есте-
ственно, вторым будет уделяться больше внимания, чем первым,
поэтому в технической области изложение не всегда будет исчер-
пывающим.
С одной стороны, компьютерная арифметика, как и следу-
ет ожидать, должна объяснять, как выполняются на компьютере
различные операции с числами и/или машинными словами. Ком-
пьютеры имеют многочисленные команды для выполнения таких
операций, среди которых есть и арифметические, и логические.
Разные компьютеры (а к их числу без большой ошибки можно
причислить и калькуляторы, да и почти любую цифровую технику)
делают это по-разному и имеют различные наборы команд. Зна-
ние особенностей системы команд компьютера, конечно, нужно
каждому программисту, хотя оно выходит за пределы собствен-
но программирования — чтобы писать программы, в общем-то
не обязательно знать, каким образом компьютер выполняет ко-
манду сравнения чисел или их деления с остатком. Кроме того,
полное понимание процессов, реально происходящих в компью-
тере во время выполнения программы, требует знания массы тех-
нических деталей, связанных с устройством процессора и других
8
Введение
микросхем, составляющих компьютер, и выходит за рамки соб-
ственно компьютерной арифметики, относясь к области, которую
можно назвать архитектурой вычислительных систем.
Тем не менее компьютерные процессоры и другие большие
цифровые микросхемы («чипы») содержат в себе сравнительно не-
большие микросхемы для выполнения отдельных арифметических
или логических операций. Разобраться в их устройстве, по крайней
мере в общих принципах функционирования, не так уж и сложно,
потому что электронные микросхемы, как старые, так и самые со-
временные, имеют очень простую математическую модель — схе-
му из функциональных логических элементов, часто называемую
в инженерной практике комбинационной схемой, а в теории — бу-
левой логической схемой, или просто схемой (реализующей буле-
вы функции, называемые также функциями алгебры логики). По-
строение булевых схем, реализующих арифметические и логиче-
ские операции, относится к сфере первоочередных интересов ком-
пьютерной арифметики, и в тоже время составляет существенный
раздел теории сложности булевых функций. Впрочем, вопросы
связанные с поиском эффективных алгоритмов построения буле-
вых схем и с автоматизацией проектирования реальных электрон-
ных микросхем содержат множество технических деталей и выхо-
дят за рамки как компьютерной арифметики, так и теории слож-
ности булевых функций, относясь к специальной области ком-
пьютерных наук — автоматизации проектирования микросхем.
Разумеется, касаться этой области в популярной книге неуместно.
В программировании иногда возникает необходимость вы-
полнять арифметические действия с «длинными» числами, не уме-
щающимися в разрядную сетку компьютера, например в научных
расчетах для достижения требуемой точности, в криптографии для
выполнения действий с числами, состоящими из сотен цифр, в ре-
кордных вычислениях, например, с целью найти миллиард знаков
числа 7г и т. д. Для выполнения этих действий нельзя непосред-
ственно использовать команды машинной арифметики, а необхо-
димо писать программы для так называемой длинной арифметики.
Такие программы давно написаны и входят в пакеты многих си-
Введение
9
стем компьютерной алгебры. Чтобы самому написать подобные
программы и разобраться в работе известных программ нужна
компьютерная арифметика. На самом деле используемые в этих
программах арифметические алгоритмы весьма близки к алгорит-
мам, «зашитым в железе» электронных микросхем для выполнения
арифметических операций. Но вместо двоичной системы счис-
ления, которая используется в микросхемах (хотя используются
и микросхемы, реализующие с помощью двоичных элементов де-
сятичную арифметику), в компьютерных программах «длинной
арифметики» обычно применяется система счисления с основа-
нием 2W, где w — длина машинного слова применяемого ком-
пьютера, а для записи самих программ вместо двоичной удобно
использовать шестнадцатеричную систему (так как это в четыре
раза сокращает длину записи чисел).
Использование подходящей (как правило, того или иного ва-
рианта позиционной) системы счисления является простейшей,
старейшей, и в то же время важнейшей и фундаментальной иде-
ей, используемой в компьютерной арифметике. Поэтому знаком-
ство с ней естественно начинать с рассмотрения различных си-
стем счисления. Книга «Занимательная компьютерная арифме-
тика: Математика и искусство счета на компьютерах и без них»
с этого и начинается, причем содержит почти целиком (и в не-
сколько дополненном виде) материал из брошюры автора «Систе-
мы счисления и их применения». На самом деле упомянутая бро-
шюра и задумывалась как первая часть популярной книги по ком-
пьютерной арифметике, но ее написание несколько затянулось,
и первую часть пришлось опубликовать отдельно. Арифметиче-
ские алгоритмы в нашей книге обычно излагаются для произ-
вольной позиционной системы, но иногда они даются только для
десятичной системы (чтобы подчеркнуть удобство их применения
в ручных вычислениях, и даже в устном счете), а иногда — только
для двоичной (потому что в двоичной системе они имеют наибо-
лее простой вид и наиболее широкую область применения).
Кроме чисто арифметических алгоритмов уместно показалось
рассмотреть в книге некоторые вопросы, связанные с вычислениями
10
Введение
с обыкновенными дробями, многочленами и дробно-рациональ-
ными функциями. Эти вопросы являются пограничными между
компьютерной алгеброй и компьютерной арифметикой и весьма
близки к последней. Их включение в книгу оправдано также тем,
что, например, алгоритмы арифметических действий с многочле-
нами на самом деле проще аналогичных алгоритмов для чисел.
Особенностью книги является также то, что, помимо описа-
ния различных алгоритмов, часто дается обоснованная оценка их
сложности (т. е. числа выполняемых ими операций). В случае Ло-
гических схем оценка их сложности позволяет объективно судить
о размерах, которые может иметь реальная электронная микро-
схема, моделируемая рассматриваемой логической схемой. В слу-
чае же программных алгоритмов оценка их сложности позволяет
судить о времени их работы. Умение оценивать сложность алгорит-
ма, таким образом, полезно и в программировании и в проектиро-
вании (и производстве) электронной техники. Разделы, связанные
с оценками сложности, находятся в конце книги и составляют,
по-видимому, наиболее сложную ее часть (извините за каламбур).
Это не удивительно, поскольку они находятся на границе между
собственно компьютерной арифметикой и теорией сложности вы-
числений.
Чтобы компенсировать неизбежную сложность некоторых раз-
делов книги, в нее показалось разумным вставить различный раз-
влекательный материал, вроде приемов устных вычислений, инте-
ресных даже младшеклассникам, алгоритмам вычислений на каль-
куляторах, применений систем счисления за пределами компью-
терной арифметики, исторических сведений о первооткрывателях
тех или иных идей, затрагиваемых в книге и т. д. (однако точные
ссылки на используемые результаты, как правило, не даются).
Рассмотрены также вопросы эффективного выполнения некото-
рых манипуляций с числами и машинными словами на компью-
тере в условиях, когда отсутствуют команды, непосредственно их
выполняющие. Подобные вопросы несомненно также относятся
к компьютерной арифметике.
Введение
11
Книга, претендующая на популярность, не может освещать
рассматриваемые вопросы в достаточной полноте. Поэтому неко-
торые вопросы, связанные с компьютерной арифметикой, затро-
нуты лишь мимоходом или не затронуты вовсе. Это и вопросы
оценки точности машинных вычислений, арифметика с плаваю-
щей запятой, логические схемы с памятью (автоматные схемы),
алгоритмы вычисления элементарных функций, принципы работы
компьютерного процессора, физические принципы работы элек-
тронных микросхем и их математического моделирования, вопро-
сы проектирования, тестирования и производства чипов и т. д.
Многим из подобных вопросов уже посвящаются целые книги
(разумеется, не научно-популярные). Из великого множества ал-
горитмов компьютерной арифметики в книге упоминается лишь
небольшая часть.
Предполагается, что читатель немного знает школьную ма-
тематику (сейчас изучает ее или еще не успел забыть), поэтому
иногда в книге используются без пояснений некоторые понятия
и обозначения. Но во многих случаях необходимые пояснения
даются. В отличие от учебников изложение не всегда система-
тичное, одним вопросам уделяется больше внимания, другим —
меньше, некоторые темы даже не упоминаются, в книге встреча-
ются ссылки как назад, так и вперед и т. д. Все это неизбежные
особенности вольного стиля изложения (вообще свойственного,
как нам кажется, научно-популярной литературе). Но из-за почти
полного отсутствия на русском языке литературы по компьютер-
ной арифметике автор надеется, что ее можно будет использовать
и с учебной целью как в школах, так и в вузах.
В заключение автор благодарит своих бывших учеников (и ны-
нешних коллег) А. А. Бурцева и И. С. Сергеева за помощь в работе.
Глава 1
Школьные алгоритмы арифметических
операций с многочленами
<...> and then the different branches of
arithmetic — Ambition, Distraction, Ugli-
fication and Derision
Льюис Кэрролл,
Алиса в стране чудес
Как ни странно на первый взгляд, проще выполнять арифме-
тические операции с многочленами, чем с натуральными числами.
Читатель сейчас же в этом убедится. Однако в школе полиноми-
альную арифметику проходят позднее обычной и в недостаточном
объеме. Дело в том, что строгое определение понятия многочле-
на несколько абстрактно и требует предварительного определения
понятий поля и кольца. Мы будем пользоваться менее строгим,
но интуитивно ясным следующим определением.
Многочлен над кольцом К — это выражение вида
р(х) = ипхп + ... + щх + и0,
где коэффициенты щ принадлежат кольцу К, а переменная х —
формальный символ, который может принимать любое нужное
значение. Под кольцом К понимаем любое множество с операци-
ями сложения, вычитания, умножения, для которых выполняют-
ся все общеизвестные правила арифметики. Например, кольцом
')<...> а затем проходили четыре действия арифметики — служение, почита-
ние, угождение и давление.
Глава 1. Школьные алгоритмы операций с многочленами
13
является множество всех целых чисел с обычными арифметиче-
скими операциями, обычно его обозначают Z. Множество всех
многочленов над К обычно обозначают К[ж]. Естественно счи-
тать многочлены
р(я) = ипхп + ... + щх + щ
и
р'(х) = 0 • хп+т + ... + 0 • ж"+1 + ипхп + ... + щх + и0
равными, хотя формально они имеют разный вид. Обычно пред-
полагают все же, что в записи
р(х) = ипхп + ... + щх + и0
старший коэффициент ип 0. Его обозначают ld(p), а число п на-
зывают степенью многочлена и обозначают deg р. Если ld(p) = 1, то
многочлен называют нормированным. Многочлены нулевой сте-
пени назовем константами и отождествим с элементами кольца К.
Для того, чтобы определить сумму и разность многочленов
р(х) и q(x), удобно дополнить, если это нужно, один из них
старшими членами с нулевыми коэффициентами так, чтобы они
приняли вид
р(х) = ипхп + . . . + ЩХ + U0
и
q(x) = vnxn + ... + vix + v0.
Тогда
p(x) + q(x) = (un + vn)xn + ... + (u) + Vi)® + (u0 + ^o),
p(x) - q(x) = (un - vn)xn + ... + (ui - vi)a; + (u0 - v0).
Для определения произведения многочленов р(х) и q(x) удоб-
но считать, что их старшие коэффициенты ненулевые. Пусть
р(х) — ипхп + ... + щх 4- и0,
q(x) = vmxm + ... 4- vtx 4- vo.
14
Глава 1. Школьные алгоритмы операций с многочленами
Тогда произведение
p{x)q(x) = wn+mxn+m + ... + wtx + w0,
где
Wfc = U0Vk + «iVfc-i + . . . + Uk-1 V1 + UfcVo»
и, естественно, в этой формуле щ = 0 при i > п и vj = 0 при
j > т. В частности,
Wo = UqVo, Wn.).m = unvm.
Отсюда следует, что
deg (p(x)q(x)) = degp(rc) + deg q(x),
если в кольце К произведение ненулевых элементов всегда от-
лично от нуля (такие кольца называют кольцами без делителей
нуля, примером является кольцо Z). Для произвольных колец К
выполнено лишь неравенство
deg (р(ж)д(а;)) degp(x) + deg q(x),
а также то, что произведение нормированных многочленов нор-
мировано.
Задача 1. Докажите, что множество К[ж] с введенными операциями
является кольцом, содержащим К в качестве подкольца. Докажите,
что если К не имеет делителей нуля, то К[ж] — тоже.
Кольцо F называют полем, если в нем всегда возможно деле-
ние на ненулевое число (напомним, что деление — это операция,
обратная умножению). Примером поля служит множество Q ра-
циональных чисел, и множество R действительных чисел. Поля
являются кольцами без делителей нуля.
Задача 2. Докажите, что К[ж] не является полем.
Хотя деление в кольце К[я] невозможно, но в случае когда
К — поле, всегда можно выполнить деление с остатком. Говорят,
что при делении многочлена р(х) на q(x) получается частное h(x)
и остаток г(ж), если р(х) = q(x)h(x) + г(х), и degr(a;) < degg(a:).
Глава 1. Школьные алгоритмы операций с многочленами
15
Задача 3. Докажите, что в кольце F[i] деление с остатком выпол-
нимо всегда и однозначным образом. Докажите, что если р(ш) и q(x)
принадлежат К[я], К не имеет делителей нуля и q(x) нормирован-
ный, то деление с остатком тоже выполнимо и однозначным образом.
Обозначим М(т, п) наименьшее количество арифметических
операций, выполняемых над числами, которые требуются для пе-
ремножения многочлена степени меньшей т и многочлена степе-
ни меньшей п. Величину М(т, п) и подобные ей будем называть
сложностью (в данном случае операции умножения многочленов
указанных степеней).
Для краткости положим М(п) = М(п, п). Обозначим D(n, т)
сложность операции деления многочлена степени п - 1 на мно-
гочлен степени т - 1 с нахождением частного и остатка (в случае
п <т очевидно, что D(n, т) = 0).
Для сложности операций сложения и вычитания многочленов
степени меньшей п справедливы очевидные равенства А(п) = п
и S(n) = п.
Теорема 1. Школьный алгоритм умножения многочленов име-
ет сложность
М(п, т) 2пт - п - т + I.
Школьный алгоритм деления многочленов имеет сложность
D(n, т) 2т(п - т) + п + т + 1.
Если делитель нормированный, то получается оценка
D(n, т) 2т(п - т + 1).
Доказательство. Под школьным алгоритмом умножения много-
членов
р(х) = ип_1Жп-1 + ... + щх + Uq
и
q(x) = vm-ixm~' + ... + V\x + v0
16
Глава 1. Школьные алгоритмы операций с многочленами
подразумевается умножение р(ж) на все одночлены многочлена
q(x), что требует тп операций умножения коэффициентов, и после-
дующее сложение результатов, которое требует (т— l)(n-1) опера-
ций сложения. Под школьным алгоритмом деления многочлена
р(х) на q(x) подразумевается умножение q(x) на (un-i/vm-i)xn~m,
которое требует одной операции деления и т операций умножения, и
последующее вычитание изр(я) произведения (un_]/vm_i)xn~mq(x),
которое требует т вычитаний, и дает в результате многочлен Р1(ж)
степени не выше п- 2. Одночлен (un_\/vm_})xn~m является стар-
шим членом частного, остальные члены которого и остаток нахо-
дятся в результате деления pi(s) на q(x). Отсюда имеем неравенство
D(n, т) D(n - 1, т) 4- 1 4- 2т,
из которого, учитывая, что
D(m - 1, т) = О,
выводим неравенство
D(n, т) (1 + 2т)(п - т 4- 1) = 2т(п - т) + п 4- т 4-1,
Интересно отметить, что при растущем т оценка сложности
деления даже ниже, чем у умножения. Если многочлен q нормиро-
ван, п - т 4-1 операций деления фактически делать не приходится
и оценка сложности еще понижается.
В случае К = Z можно ввести понятие псевдоделения. Псевдо-
частным и псевдоостатком при делении р(х) на q(x) называются
такие многочлены h(x) и г(х), для которых
deg r(x) < deg q(x)
и
ld(q)de&p~de&q+ip(x) = q(x)h(x) 4- r(x). □
Обозначим l(ri) наименьшее число умножений, требующееся для
возведения х в n-ю степень. (Эта функция встречается в разделе
«Аддитивные цепочки и фляги с молоком» в Гашков С. Б. Занима-
тельная компьютерная арифметика. М.: URSS, 2012.)
Глава 1. Школьные алгоритмы операций с многочленами
17
Теорема 2. Псевдочастное и псевдоостаток всегда существу-
ют и определены однозначно. Сложность Dp(n, т) псевдоде-
ления многочлена степени п - 1 на многочлен степени т - I
удовлетворяет неравенствам
Dp(n, т) D(n, т) + п + 1(п-т+ 1),
D(n, т) Dp(n, т) 4- 2п + Цп - т 4- 1).
Доказательство. Пусть
р(ж) = ип-1ХП~1 + . . . + U1IE + Uq
И
q(x) = vm_\xm~' 4-... 4- V\x + v0-
Обычный алгоритм деления находит частное ho и остаток го, для
которых р(х) = q(x)hQ(x) 4- г0(х) и degr0(®) < degg(a:), причем
коэффициенты частного и остатка являются дробями со знаме-
нателем (vm_i)n-m+l. Тогда в качестве псевдочастного и псевдо-
остатка можно взять многочлены с целыми коэффициентами
ЛИ = С”+1М*). Ф) =
Действительно, умножая обе части равенства
р(х) = q(x)ho(x) 4- го (ж)
на
<-_T+1 = w(v)degp'deg9+'
получаем равенство
ld(q)desp~de&g+'p(x) = q(x)h(x) 4- r(x).
Однозначность псевдочастного и псевдоостатка следует из то-
го, что они являются частным и остатком от деления многочлена
ld(q)deep~deeq+1p(x) на д(ж). Коэффициенты первого из них можно
18
Глава 1. Школьные алгоритмы операций с многочленами
вычислить со сложностью не выше п+1(п-т+1), а последующее
деление — со сложностью D(n, т). Отсюда
Dp(n, т) D(n, т) + п + 1(п- т + 1).
Если мы нашли псевдочастное и псевдоостаток h(x) и г(х),
то частное и остаток находятся по формулам
h(x) _ h / ч Лх) _ „ , Л
/ n-m+l\ “ "0W’ / n-m+lx ~ М®)
со сложностью не большей l(n-m+ l) + n-m+1 +m- 1, откуда
D(n, т) < Dp(n, т) + 2п + 1(п - т + 1). □
Задача 4. Покажите, что алгоритм псевдоделения, чуть увеличив его
сложность, можно выполнить без операции деления чисел.
Глава 2
Школьные алгоритмы сложения
и умножения чисел
Полковник: Сержант, почему мало оштрафо-
ванных?
Сержант: Виноват, задумался, почему три
плюс три — шесть, а трижды три — девять.
Полковник: Th сюда поставлен не складывать
и умножать, а отнимать и делить!
Из анекдота о ГИБДД
При оценке сложности операций над натуральными числами
надо вначале договориться о том, как задавать эти числа. Для
этого мы будем использовать классическую позиционную систему
с произвольным натуральным основанием Ъ. Под 6-ичной пози-
ционной записью числа п понимается его единственное представ-
ление в виде
п = птЬт + ... + пф + п0,
где все тц — целые неотрицательные и меньше Ь. Для дальней-
шего объяснения удобно здесь ввести функции 1/ь(п) — сумму
цифр Ь-ичной позиционной записи числа п, и А&(п) — длину
этой записи. Очевидно, что
р6(п) = п0 + ... + пт, Хь(п) = riog6(n + 1)1.
Задача 5. Докажите неравенство
А6(п) + Аь(т) - 1 АДптп) Аь(п) + Аь(тп).
20 Глава 2. Школьные алгоритмы сложения и умножения чисел
Задача 6. Вычислите суммы Аь(1) + ... + Aj(n) и 1/(,(1) + . . + иъ(п).
Обозначим М(т, п) наименьшее количество операций сло-
жения, вычитания и умножения, выполняемых над цифрами, ко-
торые требуются для перемножения m-значного и п-значного
чисел и положим для краткости М(п) = М(п, п).
Значение величины М(т, п) существенно зависит от того,
что понимать под элементарными операциями. Будем считать,
что операция с сложения двух цифр х и у дает, вообще го-
воря, двузначное число, младший разряд которого с\(х, у) ра-
вен х + у mod а, а старший разряд с^х, у) равен ра(х + у), где
po(n) = 1 О п а.
Операция умножения двух цифр х и у дает тоже двузначное
число, младший разряд которого д ] (ж, у) равен х • у mod а, а стар-
ший разряд Ц2(х,у) равен LX2//°J- Очевидны следующие связи
между введенными функциями: х + у mod а (сумма по модулю а)
равна х + у - ара(х + у), ах-у mod а (произведение по модулю а)
равно ху - а\_ху/а\. Тогда справедлива следующая лемма.
Лемма 1. Сложение двух n-значных чисел можно выполнить
за 2п-1 операцию, вычитание из большего меньшее — за 2п~ 1
операцию, а сложение n-значного числа с m-значным (при
п> т) можно выполнить за п + т - 1 операцию.
Доказательство. Определим трехместный оператор S(x, у, z) ра-
венствами
S\ (ж, у, z) = х + у + z mod а,
S2(x,y, z) =Pa(x + y + z).
Непосредственно проверяется, что
51(ж,у, z) = ci(ci(x,y),z),
Si(x, у, z) = с2(ж, у) V с2(с1(ж, у), z),
Глава 2. Школьные алгоритмы сложения и умножения чисел
21
где операция дизъюнкции х V у = шах(я, у). Из этих равенств
видно, что S вычисляется с помощью двух операций сложения
и операции дизъюнкции (применяемой только к числам 0 или 1).
Далее мы не будем учитывать при вычислении сложности опера-
ции дизъюнкции, так как в компьютерных вычислениях время их
выполнения мало по сравнению со временем сложения, а в руч-
ных вычислениях (в том числе и с помощью непрограммируемого
калькулятора) она вообще не замечается. Непосредственно про-
веряется, что оператор
А(жь... ,хп, yi,...,yn),
осуществляющий сложение п-разрядных чисел хп...х\ и уп..-У1
и дающий в результате (n + 1)-разрядное число zn+\... Zi, где
Zi = Ai(xi,... fxn> у\,...,уп),
вычисляется схемой, составленной из 2п - 1 операции
(^1,31) = с(Ж1,г/1),
(Z2,82) = S(x2,y2,Si),
(^т $п) — ^(^т Ут 8п-1)>
В случае уп =... = ут+1 = 0 в силу равенства S(x, 0, z) — с(х, z)
операций нужно на п>- т меньше, т.е. для сложение п-значного
числа с m-значным достаточно
2n-l-(n-m) = n + m- l операции.
Для вычисления оператора вычитания годится та же схема,
только в определении оператора S и операции с надо заменить
сумму по модулю а на разность по модулю а. При этом з, бу-
дет величиной займа из следующего разряда, a sn+i задает знак
разности. Если sn+i = 1, то он будет отрицательный (тогда для
вычисления модуля разности надо заменить все разряды резуль-
тата на их дополнения до числа а - 1, кроме младшего, который
надо заменить на дополнение до а). □
22 Глава 2. Школьные алгоритмы сложения и умножения чисел
Лемма 2. Справедливо неравенство
М(п, 1) < Зп - 2.
Доказательство. Рассмотрим оператор П(ж1,... ,хп, у) умноже-
ния п-разрядного числа хп.. .Xi на цифру у, в результате кото-
рого получается (п + 1)-разрядное число zn+i ... 2,, где
Zi = ГЦж],... ,xniy), l^i^n+1.
Он вычисляется схемой, составленной из Зп - 2 операций
(21, S,) = (/2i(Si,y),0)(22,S2) = S(A41(XC2, у), Д2(Ж1, У), »1),
• * * *....................................................
(%п> sn) = >5(М1(®п> у), /^(а-п-ь У), ®п-1) — с((д2(ж«? У)> sn)> О),
так как для вычисления оператора
-S(/zi(s2,y),/z2(a:i,y),Si) = S(mi(z2, у),/^(яч, у), 0) =
= с(ц1(ж2,у),Д2(Ж1,у))
требуется не три, а только две операции. □
Теорема 3. Школьный алгоритм умножения дает оценку
М(п, т) < 5пт -2п~т-2.
Доказательство. Согласно школьному алгоритму для умножения
n-разрядного числа на m-разрядное нужно m раз применить опе-
ратор
П(ач,... ,хп,у)
(это потребует m(3n - 2) операций) и тп - 1 раз — оператор
A(a?j,..., жп+ь У1,...,Уп+1)
(для этого требуется (m- l)(2n+1) -1 операций при m > 1, так как
при первом применении оператора первый операнд на один разряд
Глава 2. Школьные алгоритмы сложения и умножения чисел
23
короче, и поэтому на 1 операцию нужно меньше). При выполне-
нии операций в двоичной системе пренебрегать операцией дизъ-
юнкции представляется неестественным, более того, в этом случае
естественно считать, что операция сложения с состоит из опера-
ций х + у mod 2 и Pi(x 4- у) = х у mod 2 = х & у, а операция
умножения д сводится только к одной операции конъюнкции
х & у. Тогда леммы 1 и 2 превращаются в соотношения
А(п) 5п - 3, S(ri) 5п - 3,
А(п, т) < 2(n + т) 4- min(m, п) - 3, M(n, 1) = п,
где через А и S обозначены сложности сложения и вычитания.
Можно доказать, что все эти неравенства следует заменить на ра-
венства. □
Доказанная теорема в двоичном случае заменяется неравен-
ством
М(п, т) < бпт - 5п- 3m.
Пользуясь тем, что от перестановки сомножителей произведение
не меняется, эту оценку можно заменить на следующую:
M(n, т) < бпт - 3(п 4- т) - 2 тах(т, п),
и подобным же образом заменить оценку теоремы 3. Это означает,
что столбиком чуть быстрее умножать более длинное число на
менее длинное.
Величина констант в полученных оценках сложности умно-
жения особого значения не имеет, так как эти неравенства чрез-
вычайно далеки от точных значений. Чтобы подчеркнуть порядок
указанных оценок, сложность как умножения чисел, так и умно-
жения многочленов, можно записать в виде М(п, т) = О(п, т),
где символ О, например в равенстве / = 0(g), означает, что при
некоторой константе С справедливо неравенство f Сд.
Задача 7. Докажите последнее утверждение.
24 Глава 2. Школьные алгоритмы сложения и умножения чисел
Задачу 8. С какой сложностью можно возвести в квадрат многочлен
степени меньшей п, используя школьный метод?
Задача 9. Докажите, что n-разрядное двоичное число возводится
в квадрат школьным методом со сложностью не больше 5,5п2 - 8,5п.
Попробуйте улучшить эту оценку до Зп2 + О(п), учитывая, что склады-
вать надо не п2 чисел, а приблизительно вдвое меньшее количество.
Глава 3
Умножение столбиком нескольких чисел
Сом и делит, сом и множит, сом
сложить и вычесть может.
Борис Заходер. Сомомнение
Обобщение полученных выше оценок на случай сложения
или умножения многих чисел не представляет труда, если ин-
тересоваться только порядком величины, но вызывает трудности
уже в случае сложения при попытке получить достаточно точные
константы. Отметим, что при больших числах щ школьный ал-
горитм умножения имеет асимптотически одинаковую сложность
при любом способе расстановки скобок в произведении.
Покажем, что сложность М(п\, Пк) школьного алгоритма
умножения чисел с длинами записи П|,..., п* зависит только от
порядка сомножителей, но не зависит от порядка выполнения
операций умножения. Положим для краткости
s(ni,... ,пк) = n’nJ’
k-1
l(ni, ...,Пк) = 53<2i ~ № + (2k ~ 2)nk-
i=l
Теорема 4. Справедливо равенство
M(n},..., Пк) = 5e(n।,.,., - l(ni,... ,Пк) -2к + 2.
Сложность умножения будет минимальна, когда ni Пк,
т. е. выгоднее умножать числа, начиная с самых больших.
26
Глава 3. Умножение столбиком нескольких чисел
Доказательство. Пусть надо перемножить позначные числа Xi.
Рассмотрим все возможные формулы Ф, указывающие порядок
выполнения операций. Определим понятие формулы по индук-
ции. Произвольную переменную Xi назовем формулой. Если Ф1
и Ф2 — формулы, то Ф = (Ф] о Ф2) тоже назовем формулой. Будем
рассматривать только формулы, содержащие все переменные Х{
по одному разу. Формулу Ф будем изображать бинарным дере-
вом Т с листьями П{,... ,nk. Определим Т по индукции. Если Ф
есть переменная Xi, то Т есть лист щ. Если формулам Ф;, j — 1,2,
сопоставлены деревья Tj, то формуле Ф = (Ф1 о Ф2) сопоставим
дерево Т, получающееся объединением Tj и присоединением их
к корню дерева Т с помощью двух ребер. Весом дерева Т назовем
v(T) — сумму весов его листьев. Очевидно, что
v(T) = v(Tl) + v(T2)
и v(T) равно числу разрядов в произведении, вычисляемом фор-
мулой Ф.
Раскрасим все ребра дерева Т в два цвета по индукции сле-
дующим образом: считая, что ребра деревьев Tj уже раскрашены
согласно предположению индукции, покрасим ребро, соединяю-
щее с корнем дерево Ti, в белый цвет, если v(T\) < v(T2), а второе
ребро — в черный, и сделаем наоборот, если v(T\) v(T2). Каж-
дый из листьев п, соединяется в дереве с корнем единственным
путем, состоящим из Oj белых и Ь, черных ребер. Назовем длиной
пути число di = a,i + 2bi, а сумму назовем длиной дерева
и обозначим ее d(T). Докажем по индукции, что если мы перемно-
жим числа Xi по формуле Ф, то сложность этого вычисления будет
5s(nj,..., Пк) - d(T) - 2к + 2,
где П1,..., Пк — это все листья дерева Т. База индукции (к = 2)
следует из теоремы 3. Допустим, что согласно предположению ин-
дукции сложность вычислений по формулам Ф2 равна
Б(Фу) = 5в(Фу) - d(Tj) - 2kj + 2,
где через Ф2 обозначен для краткости список всех kj — листьев
дерева Tj, j = 1,2.
Глава 3. Умножение столбиком нескольких чисел
27
Тогда сложность вычисления по формуле Ф равна
Ь(Ф) = ЦФО + Т(Ф2) + 5«(Г1)«(Т2) - av(I\) - bv(T2) - 2,
где а = 1, b = 2, если ребро, идущее в корень дерева Т\ из корня
дерева Т, белое, и наоборот. Так как длины путей, ведущих к ли-
стьям в дереве Т, длинней на а, чем соответствующие пути в де-
реве Т\, и длинней на Ь, чем соответствующие пути в дереве Т2, то
d(T) = d(Ti) 4- d(T2) 4- av(T\) 4- bv(T2).
Непосредственно проверяется, что
s(nb ... ,nfe) = а(Ф]) + з(Ф2) + v(Ty)v(T2), к = к\ + к2.
Поэтому
2
Ь(*) = Е - dW) - 2*У + 2) +
J=1
+ 5v(T])v(T2) - av(Ti) - bv(T2) - 2 =
= 5(а(Ф]) 4- з(Ф2) 4- v(Ti)v(T2)) -
- 2(fci 4- k2) + 2 - (d(T{) 4- d(T2) 4- av(Ti) 4- bv(T2)) =
= 5s(ni,... ,nk) - d(T) -2k+ 2,
что и требовалось доказать. □
Теперь нужно максимизировать d(T). Для этого потребуются
две леммы.
Лемма 3. Если а^| и fy,] — упорядоченные в порядке воз-
растания последовательности а, и Ьг, то
52 а[,|й|П_,+ц 52aibi 52
•=l i=l i=l
Доказательство. Без ограничения общности считаем, что сц = а[,|.
Пусть Ь\ — такая перестановка Ь<, для которой макси-
28
Глава 3. Умножение столбиком нескольких чисел
маЛьна. Если b'i > b'j и г < j, то, меняя местами b'i и b'j, получаем
перестановку Ь", для которой
п п
0>ibi “ — O,ibj “f* Ofjbi O»ibi 0,
i=l t=i
что ведет к противоречию.
Лемма 4. Максимум d(T) по всем деревьям Т с листьями
П],... ,Пк равен
1(п} ,...,пк) = У~^(2г - 1)п» + (2к - 2)пк.
Доказательство. Доказательство проведем индукцией по к. База
(к = 2) очевидна. Пусть Т — дерево, обеспечивающее максимум.
Докажем, что Т можно выбрать так, что di не убывают. Допустим
противное: di > dj, i < j. Поменяем местами п, и nj. Согласно
лемме 3 d(T) при этом не уменьшается, но раскраска может стать
неправильной. Заменим ее на правильную и заметим, что d(T)
не уменьшится.
Действительно, если в некотором поддереве Т, состоящем из
поддеревьев Tj, выполнено неравенство v(I\) v(T2), но ребро,
ведущее в Т\, белое, то после перекраски оно станет черным, и для
нового раскрашенного дерева Т' длина
d(r') = ВД + d(T2) + 2v(Ti) + v(T2) =
= d(T\) + d(T2) + v(Ti) + 2v(T2) + v(T\) - v(T2) =
= d(T) + v(Ti) — v(T2) > d(T).
После выполненных операций длина дерева не может возрасти,
так как она максимальна. Поэтому n, = nj и такие значения мож-
но переставлять между собой в максимальном дереве как угодно.
Переставим их так, чтобы последовательность di стала монотонной.
Зная теперь, что di не убывает, заметим, что соседний с лис-
том пк лист щ соединяется ребром с той же вершиной дерева,
Глава 3. Умножение столбиком нескольких чисел
29
что и Пк, иначе путь до листа тц был бы длиннее. Выбросим из Т
эти два ребра и получим дерево Т' с листьями щ,... щ +nj
(знак щ означает пропуск числа П;). Тогда
d(T) = d(T') + n,i + 2пк,
значит, Т максимально тогда и только тогда, когда максимально Т'.
Но по предположению индукции Т' — линейное дерево с
длинами листьев 1,3,..., 2к - 5,2к - 4. Тогда Т — тоже линейное
дерево с длинами листьев 1,3,..., 2к - 3,2k - 2. Если i < к — 1, то
оно не будет максимальным, так как при перестановке «младших»
листьев его длина увеличивается (а раскраска остается правиль-
ной). Поэтому г = к - 1 и лемма доказана. □
Из леммы немедленно следует утверждение теоремы.
В случае же сложения надо поступать наоборот: начинать сло-
жение с самых маленьких чисел и заканчивать самыми большими.
Задача 10. Докажите, что
Л(П1,.. .,Пк)^П|4-2(п2 + .. .+nfc_i)+nfc4-Ab(l) + .. .+Aj(A:—1) —А:-Ы<
<П] +2(пг+.. .+nfe_j)+nfc-|-(A;— l)(A(,(fc— 1) — 1).
Указание. Складывайте числа, начиная с маленьких. Примените лемму 2
и неравенство А(,(Ж1 + ... + хк) < Англах а^) + АЬ(А:).
Задача 11. Докажите, что если складывать к чисел, начиная с самых
больших, то оценка сложности может возрасти (асимптотически) в
(к — 1) раз.
Глава 4
Переносы при сложении двоичных чисел
и теорема Куммера
Большинство специалистов по теории чисел
не проявляют интереса к арифметике.
Бересфорд Парлетт, 1979
(цитируется по книге Д. Кнута
«Искусство программирования»)
Последние две задачи предыдущего раздела справедливы толь-
ко для оценки сложности компьютерных вычислений. В ручных же
вычислениях переносы в старшие разряды в действительности не
выполняются, если они оказываются нулевыми. Разберемся в этом
вопросе.
Лемма 5. Если Ь-ичная запись числа п оканчивается ровно
т нулями, то
иь(п - 1) + 1 - Уь(п) = (Ь - 1 )тп,
и при прибавлении к числу п - 1 единицы т будет равно
количеству переносов в следующий разряд (возможно, т — 0).
Доказательство. Заметим, что Ь-ичная запись числа п - 1 окан-
чивается ровно m цифрами b - 1. После прибавления единицы
происходит m-кратный перенос в старшие разряды и получается
число п, у которого все цифры, кроме m + 1 последних, совпада-
ют с такими же цифрами числа п - 1, причем (т + 1)-я от конца
цифра на 1 больше такой же цифры числа n- 1, а последние m
цифр — нули. □
Глава 4. Переносы при сложении двоичных чисел 31
Теорема 5 (теорема Куммера1^). Количество переносов в
следующий разряд при сложении чисел к и п - к в 6-ичной
системе счисления равно
vb(n -к) + - i^(n)
6-1
Доказательство. Утверждение вытека-
ет из приведенной выше леммы. Дей-
ствительно, если переносов не проис-
ходило, то величина
иь(п - к) + vb(k) - vb(n)
6-1
равна нулю. Каждый перенос уменьша-
ет один разряд в числе п на b и увеличи-
вает следующий разряд на 1, в резуль-
тате рассматриваемая величина возрас-
тает на b - 1, а значит, величина
Эрнст Эдуард Куммер
уь(п - к) + vb(k) - vb(ri)
6-1
возрастает на 1.
□
Во втором томе «Искусства программирования» Д. Кнута по-
казано, что для случайных независимых п-разрядных 6-ичных чи-
сел и и v среднее число переносов (vb(u) + vb(v)-vb(u+v))/(b — 1)
равно
1/ 1- 6"п\ п
2\~ 6-1 ) <2‘
Эрнст Эдуард Куммер (1810-1893) — знаменитый немецкий математик, до-
казавший теорему Ферма для многих значений п и заложивший основы теории
алгебраических чисел.
32 Глава 4. Переносы при сложении двоичных чисел
Значит, средняя сложность сложения n-разрядных чисел меньше
Зп/2. Отвлекаясь от темы, заметим, что на самом деле эта теорема
была нужна Куммеру в связи со следующим фактом.
Наибольший показатель степени простого числа р, делящей
биномиальный коэффициент
/ п\ _ п!
\fc/ fc!(n - fc)!’
равен
о . = ир(п ~ fc) + ~ рл(та)
\к) р- 1
Для доказательства этого факта полезна следующая формула
Лежандра.
Теорема 6 (теорема Лежандра2)). Наибольший показатель
степени простого числа р, делящей факториал п!, равен
. . п - 1/р(п)
orcLn! =------л—.
Biii^
Доказательство. Действительно, если согласно предположению
индукции
и ordp(n) = m, то р-ичная запись числа п оканчивается ровно m
нулями, значит, согласно лемме 5
, . . / .ч. n-l-i/p(n-l) п-и„(п)
ordp n! — ord„ (п - 1)! + m = m Н---------=--------—. □
р-1 р-1
Возвращаясь опять к сложению чисел, покажем, что слож-
ность его выполнения на самом деле почти не зависит от по-
рядка выполнения операций, если учитывать только те переносы
в старшие разряды, которые в действительности выполняются.
2) Адриен Мари Лежандр (1752-1833) — выдающийся французский математик.
Глава 4. Переносы при сложении двоичных чисел
33
Обозначим сложность вычисления суммы чисел ni,..., пк через
A(ni,.... пк). Для краткости положим
Пусть п[г] — последовательность тц, переставленная в неубыва-
ющем порядке.
Теорема 7. При любом порядке суммирования справедливо
неравенство
А(п|.....nfc) > рь(пИ1) + ^(ni..... пк),
1И||!8вИ|||И^^^
причем равенство достигается, если числа складывать, начиная
с больших. При любом порядке суммирования справедливо
также неравенство
lliBiiliiiiiilMli
A(nt,..., пк) pb(nW) + иъ(п............пк)Хь(к).
Доказательство. Предположим, без ограничения общности, что
последовательность щ не убывает. Докажем по индукции нера-
венство
к-1
A(n],...,nfe) >^иь(пд + »ь(п',...,пк).
i=l
База (к = 2) очевидна в силу теоремы Куммера. Пусть сложе-
ние выполняется по формуле Ф = (Ф1+Ф2), где Ф1 вычисляет сум-
му х = nj+.. .+nj+ni, а Ф2 — сумму у = па+.. ,+nq+nr. По пред-
положению индукции сложности этих вычислений не меньше
Aft(ni) + ... + Ль(пу) + иъ(п{,..., rij, ni),
Хь(па) + ... + Xb(nq) + иь(пя, ...,nq, nr).
Сложность вычисления суммы Ф1 + Ф2 не меньше
min(A6(a;), Хь(у)) + иь(х, у).
34
Глава 4. Переносы при сложении двоичных чисел
Складывая эти неравенства и учитывая равенство
у) + 1^ь(Пг, , nj, Гц) + Vb(ns, ... ,nq, Пг) = l/b(nb . . . , Пк),
получаем нужное нам неравенство. Достижимость этого неравен-
ства при сложении чисел в порядке возрастания аналогичным
образом устанавливается по индукции. Для доказательства верх-
ней оценки
k— 1
A(m,..., njt) 52 ^(ПН) + ,...,пк) + Хь(к)
i=i
складываем числа в произвольном порядке и применяем преды-
дущее равенство и неравенства
Aft(ni 4-... + пк) Аь(тахп,) + АЬ(Л:),
A6(l) + ...+A6(fc) ^кХь(к). □
Задача 12. Докажите, что наибольший показатель степени простого
числа р, делящей биномиальный коэффициент
п\ п!
kJ fc!(n-fc)!’
равен
ord fn\ _ vp(n ~к) + vp{k) - Ур(п)
р\к J р - 1
Указание. Утверждение следует из формулы Лежандра и формулы для
биномиального коэффициента.
Глава 5
Минимальные формы двоичной записи
с цифрами 0 и ±1 и первая попытка
уменьшить сложность умножения
А потом произошло кое-что еще — то, о чем
у Люмаса не упоминалось ни словом', все буквы
алфавита исчезли, превратившись в цифры, а по-
том и цифры — все, кроме единицы и нуля, ис-
чезли, оставив мне целый океан нулей и единиц,
которые так и сыпались по стенам вокруг меня.
Скарлетт Томас.
Наваждение Люмаса (2006)
В позиционных системах счисления по заданному основа-
нию Ъ можно, кроме обычных цифр, использовать и отрицатель-
ные цифры: -1, -2,..., -(6-1). Правда, это приводит к неодно-
значности в записи чисел. Зато таким образом можно уменьшить
количество ненулевых цифр в записи и их величину.
Рассмотрим двоичную систему с отрицательными цифрами. На-
зовем запись данного числа в этой системе минимальной формой
этого числа, если она содержит наименьшее число ненулевых цифр.
Задача 13. Покажите, что определенная таким образом минималь-
ная форма не всегда единственна.
Определим минимальную форму по-другому. Назовем запись
минимальной формой, если в ней нет соседних ненулевых цифр.
Для этого определения не очевидна ни единственность минималь-
ной формы, ни ее минимальность в прежнем смысле. Однако и то
и другое верно.
36
Глава 5. Минимальные формы двоичной записи
Теорема 8. Минимальная форма определена однозначно и
содержит наименьшее количество ненулевых цифр среди всех
возможных форм двоичной записи числа с использованием
отрицательных единиц.
Доказательство. Пусть (ап ... do) — произвольная запись числа а,
т. е.
о = 2пап + ... + 2di + во»
где dj = 0 или ±1. Далее вместо -1 будем писать Т. Обозначим
p(d) количество ненулевых цифр в этой записи, и |d| — количество
пар соседних ненулевых цифр. Заметим, что
2^ । 2fe+l | । 2m-1_2m — 2fc
поэтому, выполняя в записи а следующие преобразования:
аа —> Оа,
Оа. ..а —► аО... Оа,
ООаа —► ОаОа,
аОаа —► ОаОа,
ОааОаа —► аООаОа,
0(0а)... (Оа)Оаа —► 0а(0а)... (0а)0а,
а(0а)... (0а)(0а)а —► 0а(0а)... (0а)0а,
Оаа(Оа)... (ОаО)аа —► аООа(Оа)... (0а)0а
(где а=1,Т;а=Т, 1), мы не меняем записываемого числа, не
увеличиваем величин i/(d) и |а| и всегда уменьшаем их сумму.
Будем выполнять эти преобразования, пока это возможно. Так
как величина u(d) + |а| не может неограниченно уменьшаться, то
в конце концов получим запись числа а, в которой нигде не будут
встречаться рядом ненулевые цифры. Действительно, разных цифр
рядом быть не может, а также трех и более подряд одинаковых не-
нулевых цифр — тоже. Если пары соседних равных ненулевых
Глава 5. Минимальные формы двоичной записи
37
цифр встречаются, то рядом с ними не могут стоять пары нулей,
и сами пары ненулевых цифр не могут стоять рядом, разделяясь
одним нулем. Между ними не может также находиться ни циф-
ра противоположного знака, ни пара нулей. И, наконец, пары
ненулевых цифр, между которыми не встречается таких же пар,
всегда совпадают, и промежуток между ними заполняется череду-
ющимися нулями и цифрой, образующей эти пары. Но и такие
комбинации цифр не могут встречаться в построенной записи,
значит, она вообще не содержит пар ненулевых цифр.
Докажем, что запись, не содержащая таких пар, для данного
числа только одна. Допустим, что есть две разные такие записи а
и Ъ. Тогда они заканчиваются одинаковым числом нулей в млад-
ших разрядах, иначе, если бы одна заканчивалась к нулями, а дру-
гая т > к нулями, то наше число делилось бы на 2т, а с другой
стороны, делилось бы только на 2к, но не на 2fc+l, что невозможно.
Аналогично получаем, что их последние ненулевые цифры равны,
так как в противном случае наше число имело бы при делении
на 2т+2 (где т — число нулей в его конце) в остатке разные
числа 2т и 2т+2 - 2т (так как в конце одной записи стоят цифры
010... О, а в конце другой — цифры ОТО... 0 ввиду отсутствия пар
ненулевых цифр в обоих записях). Отбрасывая равные последние
цифры от обеих записей, получаем более короткие различные за-
писи для равных чисел. Повторяя для этих записей проведенное
рассуждение, получим, наконец, что число ±1 или 0 имеет две
разные записи, а это невозможно.
И наконец, докажем, что построенная запись минимальна в
том смысле, что содержит минимальное число ненулевых цифр.
Действительно, из любой записи можно с помощью рассмотрен-
ных преобразований получить построенную запись (как только
что доказано, всегда одну и ту же). Но при выполнении этих пре-
образований величина и{а) не возрастала, значит, построенная
запись имеет значение этой величины, равное наименьшему воз-
можному. Теорема доказана. □
Преобразование обычной двоичной записи числа а к ми-
нимальной форме более удобно проводить следующим образом:
38
Глава 5. Минимальные формы двоичной записи
вычислить обычную двоичную запись 7n+i... 71 числа За и вы-
числить обычные разности = 7,-0,, где i = 2,..., п + 1,
Of — цифры записи числа а, а ап = an+i = 0, тогда 6п... 6 \ —
минимальная форма числа а.
Теорема 9. Минимальная форма максимум на единицу длин-
нее обычной записи, но содержит не более п/2 ненулевых
цифр. При смене знака у числа меняются знаки у всех цифр
его минимальной формы.
Доказательство. Двоичную запись числа а можно представить
в виде одного или нескольких блоков
1... 101... 101... 10... 01... 1,
не содержащих соседних нулей и отделяющихся друг от друга
блоками из нескольких нулей. Число За получается сложением
чисел 2a и а, которое можно представить в виде
...ООП... 1011... 1011... 101... 1011... 1100...
+ ... 001... 1101... 1101... ПО... 1101... 1110...
... 101... 1001... 1001... 100... 1001... 101...
Если какой-то из единичных блоков состоит из двух единиц, то
соответствующая часть записи суммирования имеет вид
01101
+ 10110
00100
(так как из предыдущего разряда идет перенос и в старшие разряды
уходит перенос) или вид
1100...
+ ОНО...
001...
(в следующий разряд идет перенос). Если же какой-то из единич-
ных блоков состоит только из одной единицы, то соответствующая
Глава 5. Минимальные формы двоичной записи
39
часть записи суммирования имеет вид
0101
+ 1010
0000
(так как из предыдущего разряда идет перенос и в старшие разряды
уходит перенос) или вид
1101 ...010100...
+ ОНО... 101010...
ООН... 11111...
или вид
0010101 ...011
+ 001010... 1011
100000...001
(здесь идет перенос в следующий разряд).
Таким образом, в числах а и За соответствующие блоки имеют
вид
001010... 1011... 1101... 1101... ПО... 1101... 1110... 1010100...
+ 100000... 0011... 1001... 1001... 100... 1001... 1011... 11111 ...
Значит, соответствующий блок, состоящий из цифр <5j, имеет вид
.. .010-1.. .0-100.. .0-10.. .0-10.. .0-10.. .0-10.. .0-101.. .010...,
поэтому в этой записи нет соседних ненулевых цифр, значит,
она минимальна. Остальные утверждения легко следуют из выше
доказанных. □
Одно из возможных применений указанной минимальной
формы — уменьшение числа арифметических операций в задаче
возведения данного числа в высокую степень за счет использо-
вания операции деления (задача рассматривается в разделе «Ад-
дитивные цепочки и фляги с молоком»1*). Мы уже приводили
Гашков С. Б. Занимательная компьютерная арифметика. М.: URSS, 2012.
40 Глава 5. Минимальные формы двоичной записи
конкретный пример такого применения, а сейчас сформулируем
общую теорему. Хотя далее, как и раньше, мы будем говорить
о вычислении на калькуляторе, на самом деле, конечно, все ска-
занное справедливо и для компьютерных вычислений. Далее для
краткости вместо словосочетания «число арифметических опера-
ций алгоритма» будем писать «сложность алгоритма».
Обозначим число ненулевых цифр в записи числа п в виде
минимальной формы через v(n), а уменьшенную на единицу дли-
ну этой записи — через А(п). Мы используем те же обозначения,
что и в разделе «Аддитивные цепочки и фляги с молоком»), но за-
метим, что новая функция А(п) может быть на единицу больше
старой, зато новая функция v(n) не может быть больше старой,
а часто меньше ее, иногда почти в два раза.
Теорема 10. При использовании калькулятора с одной ячей-
кой памяти сложность вычисления ж” равно у(п) 4- А(п) - 1.
Доказательство. Используя полученную минимальную форму, за-
пишем п в виде суммы
2а(п)О!а(п)+ ...+ 2ai+а0, aij = 0, ±1,
содержащей р(п) ненулевых слагаемых. Далее, как и в обычном
бинарном методе возведения в степень, используем аналог схемы
Горнера, а цифрам минус единица сопоставляем операцию де-
ления на основание степени. Полученное обобщение бинарного
метода использует не более А(п) возведений в квадрат и и(п) - 1
умножений и делений. Верхняя оценка доказана.
Аналогично обычному бинарному методу можно доказать со-
отношения
А(2п) 4- i/(2n) = А(п) 4- р(п) 4-1, v(n ± 1) v(ri) 4-1.
Из последнего неравенства следует, что
A(n ± 1) 4- v(n ± 1) А(п) 4- и(п) 4-1.
Глава 5. Минимальные формы двоичной записи
41
Действительно, случай п ± 1 = п + 1 рассматривается аналогично
обычному бинарному методу, а в случае п ± 1 = п - 1 очевидно
Л(п - 1) А(п), и из неравенства и(п - 1) v(n) + 1 следует
нужная нам оценка. □
Используя доказанное неравенство, можно, аналогично обыч-
ному бинарному методу (см. раздел «Аддитивные цепочки и фляги
с молоком»), в случае, когда содержимое ячейки памяти никогда
не обновляется, получить аналогичную нижнюю оценку сложно-
сти возведения в степень ц(п)+А(п) -1. Читателю предоставляется
возможность самому убедиться в этом во всех деталях.
Недостатком двоичной системы при ее ручном использовании
является то, что из-за увеличения длины записи по сравнению
с десятичной системой соответственно возрастает и сложность
умножения.
Использование минимальной фор-
мы позволяет уменьшить сложность руч-
ного умножения двоичных чисел. Опи-
шем алгоритм умножения, предложен-
ный в начале 50-х гг. прошлого века
Э.Д. Бутом 2\
Для этого данные п- и т-разряд-
ные двоичные числа преобразуем в их
минимальные формы и заметим, что эти Эндрю Бут
формы содержат не более п + 1 и т + 1
разрядов, причем из них не более а = п/2 + 1 и b = т/2 + 1
ненулевых разрядов соответственно. Сложность преобразования
не превосходит Зп + Зт — 4. Умножая минимальные формы с по-
мощью школьного алгоритма, замечаем, что число нетривиальных
умножений не превосходит ab, так как ненулевых строк не более b
и в каждой из них нетривиальных умножений не более а. Отметим,
что каждое нетривиальное умножение по существу не сложнее не-
тривиального умножения в обычной двоичной системе, и будем
Эндрю Дональд Бут (1918-2009) — британский физик, инженер, изобретатель
памяти на магнитных барабанах для компьютеров.
42
Глава 5. Минимальные формы двоичной записи
считать, что оно выполняется с единичной сложностью, так же
как и нетривиальное сложение (операция нетривиальна, если оба
операнда не нули). Заметим также, что число нетривиальных сло-
жений не превосходит (Ь - 1)(а 4- n - 1), так как всего сложений
различных строк требуется не более Ь - 1, а каждое из них со-
стоит не более чем из п переносов (переносы могут быть как
1, так и -1) и не более чем из а - 1 нетривиальных сложе-
ний (в складываемых строчках имеется не более а - 1 стоящих
друг под другом ненулевых цифр). Поэтому сложность умноже-
ния не превосходит (Ь - 1)(а 4- п - 1) 4- ab < тп 4- (т 4- n)/2 4- 1.
Полученный результат содержит не более п 4- т 4- 2 разрядов
(так как он получается при сложении т 4- 1 не более чем (п 4-1)-
разрядных чисел с соответствующими сдвигами). Его можно при-
вести к обычной двоичной записи, сделав не более п + т + 2
операции (заменяем блоки соседних цифр вида 10 ... О - 1 на со-
ответствующие блоки вида 01... 1, блоки вида 1-1 — на бло-
ки 01, блоки без отрицательных цифр оставляем без изменения).
Значит, полная сложность операции умножения не превосходит
тп 4- (т + п)/2 4-1 4- Зп 4- Зт - 4 4- п 4- т 4- 2 -- тп 4- 3,5(тп 4- п).
Глава 6
Быстрое умножение многочленов
Осенью 1960 г. в МГУ на мехмате начал работать
семинар по математическим вопросам киберне-
тики под руководством А. Н. Колмогорова, где им
была сформулирована гипотеза п2 <...> Я актив-
но стал размышлять над ней и через неделю обна-
ружил, что метод, которым я надеялся получить
нижнюю оценку величины М(п), дает оценку ви-
да М(п) = О(п|ок3) <...> На следующем засе-
дании семинара мой метод умножения был рас-
сказан самим А. Н. Колмогоровым и на этом се-
минар прекратил свою работу <...> После этого
началась бурная деятельность в прикладной ма-
тематике, которая получила название «быстрые
вычисления». Она продолжается до сих пор.
Анатолий Карацуба.
Сложность вычислений (Труды МИ РАН, 1995)
Мало кто знает, что относительно не-
давно были открыты гораздо более быстрые
алгоритмы умножения и деления многознач-
ных чисел и многочленов. Первый такой ал-
горитм придумал в 1962 г., отвечая на вопрос
А. Н. Колмогорова, аспирант мехмата МГУ
А. А. Карацуба
Впоследствии, в 1963 г. студентом мехма-
та МГУ А. Л. Тоомом, а в 1970 г. немецкими
А. А. Карацуба
Анатолий Алексеевич Карацуба (1937-2008) — выдающийся специалист по
теории чисел, профессор.
44
Глава 6. Быстрое умножение многочленов
А. Л. Тоом
математиками Ф. Штрассеном и А. Шёнхаге были построены еще
более быстрые алгоритмы для умножения чисел и многочленов.
Фолкер Штрассен
В 2007 г. американский матема-
тик Мартин Фюрер предложил для
умножения чисел чуть более быстрый
алгоритм, чем алгоритм Шёнхаге—
Штрассена. Однако' описание этих
алгоритмов сильно выходит за рамки
нашей книжки.
Идею метода Карацубы можно по-
яснить на следующем примере. Пусть
перемножаются 8-значные числа
U = и\ ... Ug и V = v\ ... Vg.
Представим их как двузначные числа
в 104-значной системе счисления:
U =UiU2, V = ViV2.
Тогда их произведение можно представить в следующем виде:
UV = ЩVi 108 + (([/] - U2)(V2 - Vi) + U{Vi + U2V2) 104 + U2V2.
Эта формула сводит умножение 8-значных чисел к трем опе-
рациям умножения и шести операциям сложения—вычитания
Глава 6. Быстрое умножение многочленов
45
4-значных чисел (с учетом переносов в
следующие разряды). Обычный способ
требует четырех умножений и трех сло-
жений-вычитаний, но так как три раза
сложить 4-значные числа можно быст-
рее, чем один раз перемножить, то метод
Карацубы уже 8-значные числа перемно-
жает быстрее. В общем случае он требу-
ет для перемножения n-значных чисел
по порядку не больше nlog2 3 < п1’585 опе-
раций над цифрами.
Мартин Фюрер
Далее мы рассмотрим вопрос о сложности умножения более
подробно.
Обозначим М(п) наименьшее количество операций сложе-
ния, вычитания и умножения (выполняемых над коэффициен-
тами многочленов и промежуточными числовыми результатами),
требующихся для перемножения двух многочленов степеней мень-
ших п.
Лемма 6. Справедливо неравенство
M(n) < 2M([n/21) + M([n/2J) + 4[п/2] + 2п - 4.
Доказательство. Применим равенство
(/,xL’,/2J+A)(s^t”/2J+9o) =
= fidi + ((/i + /о)(91 + 9о) — jiSi — /о9о) х
где степени многочленов /1 и дх меньше [п/21, а степени мно-
гочленов /о и до меньше [n/2j и заметим, что для вычисления
произведений fxgi, fogo требуется не более M(fn/2"|) + M(|_n/2J)
операций, для вычисления сумм ft +fQ, дх +gQ, fxg\+fogo нужно
не более 2 [п/2] + 2[n/2j - 1 операция (так как число опера-
ций равно наименьшему из количеств ненулевых коэффициентов
у складываемых многочленов), для вычисления произведения
46
Глава 6. Быстрое умножение многочленов
(/1 + /o)(Si + So) используется не более М(|"п/21) операций, для
вычисления разности
(/i + /о)(51 + So) - /iSi _ /oSo
достаточна n — 1 операция, так как
(/1 + /o)(si + So) _ /1 Si — /oSo — f\9o + /oSi >
значит, степень этого многочлена равна I n/2j + |’п/2] - 2 = п - 2,
сложение многочленов /oSo и /iSi®2^2 выполняется «бесплат-
но», так как они не имеют подобных членов, причем в их сумме от-
сутствует член вида ж2^2-*-1, поэтому для сложения многочленов
/oSo + /1 Si z2Ln/2J и (/] д0 + /oSi> L”/2J
достаточно п - 2 операции. В итоге требуется дополнительно
4|n/2j + 2п - 4 операции. □
Оценку сложности метода Карацубы можно представить в сле-
дующем виде.
Теорема 11 (теорема Карацубы). Если п кратно 2к, то
справедливо неравенство
. . !• f ( п \ 8п \
М(п)<Зк[м1 + — -21 -8п + 2,
а при любом п — неравенство
М(п) < уп|082 3.
Доказательство. Пусть 2km = п. Тогда неравенство
М(п) 3k(M(m) + 8m - 2) - 8n + 2
доказывается индукцией по к. База (к = 1) уже доказана выше.
Шаг индукции обосновывается тем же неравенством.
Глава 6. Быстрое умножение многочленов
47
Выберем к так, чтобы 2к < п 2fc+1. Тогда если 3 • 2к 1 < п,
то
M(n) < M(2fc+I) < 3fc-1(M(4) + 30) 3fc“' • 55 <
/„\ 10g23 тс
<55-Р)
\3/ 3
Если же п 3 • 2*-1, то
М(п) ^M(3-2fc-1) < 3fc"’(M(3) + 22) 3fc-1-35 уп1082. □
Рассмотрим вопрос сложности умножения многочленов раз-
ных степеней.
Теорема 12. При тп > п справедливо неравенство
М(т, п) [тп/п)М(п) + т - т/п,
и при т/п -> оо в предположении, что М(п)/п -> оо при
п-у оо, справедливо асимптотическое неравенство
м(т,п)<;^.
WggfftiiiiilM
Доказательство. Представим многочлен степени меньшей m в
виде
/о + /1®” + • • • + fkXnk,
где к = fm/n'| - 1 и степени многочленов fi меньше п. Пользуясь
тождеством
(/о + /1®п + • • • + fkxnk)9 — (fog + f\gxn + • • • + fkgxnk)
и неравенством m/n [’m/n] - 1, получим оценку
M(m, п) < \m/ri]M(n) + (n - l)([m/n] - 1) <
< [m/n\M(n) + m - m/n < mM(n)/n + m + Af(n) =
= (mM(n)/n)(l + n/M(n) + n/m).
48
Глава 6. Быстрое умножение многочленов
Используя вместе с этой теоремой любой быстрый способ умно-
жения многочленов равной степени, получаем быстрый способ
умножения многочленов разных степеней. Например, применяя
метод Карацубы, получаем при т^п оценку
ас
М(т, п) < — mn1082*3^.
Очевидно, она при больших п лучше, чем оценка сложности
школьного алгоритма. □
Задача 14. Проверьте, что умножение методом Карацубы много-
членов степени 7 и выше требует меньшего числа операций, чем
школьный метод. Проверьте, что умножение методом Карацубы мно-
гочленов степени 5 также требует меньшего числа операций, чем
школьный метод. Если предположить, что умножение коэффициен-
тов выполняется втрое медленнее сложения—вычитания, то метод
Карацубы всегда быстрее школьного метода.
Обозначим число умножений в методе Карацубы (которое
можно назвать мультипликативной сложностью этого метода) че-
рез Кп, где (п - 1) — степень умножаемых многочленов.
Задача 15. Докажите, что
К2п = ЗКп, K2n+1 = 2К„+1 + Кп, К\ = 1
и выведите отсюда, что
Кп С-п'™3.
Задача 16 (Д. Кнут). Пусть двоичное разложение числа п
п = 2е'+ ... + 2е', e,>...>et>0.
Докажите, что
Глава 6. Быстрое умножение многочленов
49
Задача 17. Докажите, что сложность возведения в квадрат удовле-
творяет рекуррентному неравенству
Q(n) 2Q([n/2]) + Q([n/2J) + 3|n/2] + 2п - 4.
Задача 18. Докажите, что при использовании метода Карацубы для
возведения в квадрат, сложность этой операции асимптотически рав-
на 7/8 сложности умножения произвольных многочленов той же сте-
пени методом Карацубы.
Задача 19. Две правильные алгебраические дроби степеней мень-
ших п и т при т п можно сложить со сложностью
3 Г т/п\ М(п) + О(т).
Задача 20. Оценку леммы 6 можно усилить до следующей:
М(2п) ЗМ(п) + 7п - 3.
Указание. Достаточно заметить, что при подсчете числа сложений неко-
торые операции мы посчитали дважды (это не сразу бросается в глаза,
но если читатель попробует на конкретном примере, скажем, при п = 3,
аккуратно выписать все выполняемые операции сложения, то заметит,
что некоторые операции дублируются; результаты таких операции можно
запомнить и потом использовать, когда понадобится, не вычисляя вновь).
Задача 21. Используя задачу 20, оценку теоремы 11 можно уточнить
следующим образом:
М(п) Зк(м(^\ + - Л - 7п+ |,
у у 2*/ 2К 2/ 2
М(п)< Г^п10®3.
у 6 /
Глава 7
Быстрое умножение чисел
Я был в это время студентом старшего курса
в Гарварде и, вдохновленный вопросом Кобхэма
«Сложнее ли умножение, чем сложение», наив-
но пытался доказать, что умножение требует
П(п2) шагов на многоленточной машине Тью-
ринга. Статья Тоома сильно удивила меня <...>
Я отметил в своей диссертации, что метод
Тоома может быть приспособлен к многолен-
точным машинам Тьюринга с тем, чтобы вы-
полнить умножение за п'+е шагов, то, что,
я уверен, Тоома не удивило бы.
Стивен А. Кук. Лекция при получении
премии Тьюринга 1982 г.
Перейдем теперь к умножению чисел. Обозначим М(п) наи-
меньшее количество операций сложения, вычитания и умноже-
ния, выполняемых над числами, меньшими Ь, требующихся для
перемножения двух n-значных чисел, записанных в позиционной
системе счисления по основанию Ь.
Метод умножения почти такой же, как и для многочленов.
Объясним, как внести необходимые изменения в лемму из преды-
дущего раздела.
Лемма 7. Справедливы неравенства
М(2п) < ЗМ(п) + 19п,
М(2п + 1) < 2M(n + 1) + М(п) + 17п + 10.
Глава 7. Быстрое умножение чисел 51
Доказательство. Применим тождества
(/1ЬГп/21+/о)(5.ЬГп/21+5о) =
= + (/101 4- fo9o — (/1 ~ /о)(Х71 — 9о))^п/21 + /о0о,
где числа f\ и д\ — [n/2j -разрядные, а числа /о и 9о соответствен-
но fn/2] -разрядные, и заметим, что для вычисления произведений
f\9\ и /о0о требуется Af(fn/2]) + M([n/2J) операций, для вычис-
ления разностей и суммы
/о_/1, 0о~01, /101 +/о0о
требуется не более
n(l + fn/2J - fn/2]) + 2(fn/2] + fn/2] — 1) + 2(fn/2] + Гп/2])- 1 =
= 4п —3 + п(1 + [п/2] - fn/2])
операций, так как числа figi и fogo имеют не более чем 2|_n/2J
и 2 [п/2] разрядов соответственно, а в случае четного п нужно
еще 2[п/2] = п операций для предварительного сравнения чисел
(чтобы не вычитать из меньшего большее). Заметим далее, что
для вычисления произведения (/] - /о) (01 ~ So) требуется не бо-
лее Af(fn/2])+ 1 операция (одна операция для вычисления знака
у произведения), для вычисления разности
f\9\ + fogo ~ (/i - /o)(0i - So) = /100 + /О01
требуется не более
2 fn/2] + 1 + 2 fn/2] - 1 = 4 fn/2]
операций, сложение чисел fogo и fig\b2^n/2^ осуществляется «бес-
платно» (записи этих чисел просто объединяются в одну запись),
а для сложения чисел
fi9\b2^2^ + /о0о и (/iSo +/oSi)^^2^
требуется не более
2n - fn/2] 4-n+l — I — 2п+ [п/2]
52
Глава 7. Быстрое умножение чисел
операций (так как число f\go + /о51 имеет не более п + 1 разряда,
а младшие [n/2j разрядов числа /oS'o не участвуют в операциях).
В итоге требуется дополнительно
4п - 3 + п(1 + [п/2] - [n/2"|) + 1 + 4|’n/2{ + 2п + |_n/2j =
= 7п + 3[n/2] + n(l + [n/2j — Гп/21) _ 2
операции.
□
Отметим, что в среднем сравнение двух п-разрядных Ь-ичных
чисел осуществляется гораздо быстрее, чем за п операций. Дей-
ствительно, ровно к операций сравнения цифр понадобится для
сравнения чисел лишь с вероятностью не выше b~fc+l (в предпо-
ложении равномерной распределенности и независимости цифр
в числах), значит, математическое ожидание операций не превос-
ходит
При сложении т-разрядного и п-разрядного чисел при т > п в
среднем также требуется не т+п-1 операция, а 2п+О(1/Ь) опера-
ций. Поэтому в среднем оценку леммы можно заменить на такую
М(п) 2M(fn/21) + M(Ln/2j) + 8n + 2.
Остальные детали предоставляем додумать читателю.
Задача 22 (Д. Кнут). Докажите, что Кп нечетно и мультипликативная
сложность умножения n-разрядного числа на (n+1) -разрядное равна
(Кп + Кп+М2.
Схемная реализация метода Карацубы
для умножения двоичных чисел
Пусть им v — два 2п -разрядных двоичных натуральных числа:
и = (ц2п-1 • UiMoh, V = («2п-1 • • «1 Voh,
щ, vj G {0,1}, i, j — 0,1,... 2п - 1;
Глава 7. Быстрое умножение чисел
53
•2п-1
U = 52
>о
Введем обозначения
U\ = (и2п— 1 • • •
Uq = (un-i ... ^0)2,
U2 = (U} - Uo),
Тогда
и = 2nUx + Uo,
uv = 2lnUiV\+2n(U\V\
2n-l
v = 12 Vi2*-
i=0
V = (V2n-1 • • • Vn)2,
V) = ('Wn-I . . . Уо)2>
V2 = (Vo- Vl).
v = 2nV + Vo,
+ U2V2 + UoVo) + UoVo. (*)
Рассмотрим реализацию метода Карацубы схемами из функ-
циональных элементов (СФЭ) в базисе {->, &, V, Ф, 0,1}. Обозна-
чим М(п) число элементов (т. е. сложность) СФЭ, реализующей
умножение двух n-разрядных двоичных чисел. Из (*) следует, что
М(2п) ЗМ(п) + С]П + с2.
Оценим сверху константы с,. Для этого понадобятся эконом-
ные реализации некоторых вспомогательных схем.
Инвертор двоичному числу х = (хп . ..Х])2 ставит в соответ-
ствие двоичное число х = (жп ... Х[)2 = еп - х, где еп — 2п - 1 =
= Сложность инвертора £(!„) = п.
п раз
Схема Dn вычисляет модуль разности \z—у\ двух п-разрядных
натуральных двоичных чисел z и у и знак разности (z - у)
sign (z -у) -.= <
0,
1,
у,
z<y.
Пусть z у, z = х + у. Так как
Zi = Xi Ф yi ф qi,
54
Глава 7. Быстрое умножение чисел
то
Xi = Zi ф yi Ф qi-,
qi+i = Xiyi Ф fa ф yi)qi =
= (Zi ®yi® qi)yi Ф (Zi Ф qi)qi = (zi Ф qi)(yi Ф qi) Ф y^
Поэтому,
9i = 0,
Xi = (Zi Ф qi) Ф Уг,
qi+1 = (zi Ф qi)(yi Ф q^ Ф yif
где i = 1,..., n.
Обозначим через Ri схему, изображенную на рис. 1.
Рис. 1. Блок переносов
Схема Sn, вычисляющая х, х = z — у, получается путем по-
следовательного соединения блоков Ri, i = 1,... ,п, как показано
на рис. 2.
Блок Ri осуществляет преобразование Xi = Zi + у\ (mod 2),
92 = Ziyi + yt (mod 2). Таким образом, сложность схемы L(J3n)
5п-2. Очевидно, что s = gn+i = sign(z — у) = 0, если (хп.. .021)2 =
~х = |:е| ^0.
Глава 7. Быстрое умножение чисел
55
zn Уп Qn Z2 У2 42 Zr 2/1 91
Рис. 2. Схема вычитания с вычислением знака разности
В случае z < у
s = sign {z - у) = 1, х = (хп... ®i)2 - 2П < О,
|®| = -X = 2п - (хп . . . Я])2 = ((2П - 1) - (хп . . . Ж1)2) + 1 =
= (еп - (хп ...Ж1)2) + 1 = (жп ...Ж1)2 + 1 > 0.
Таким образом, всегда
s = sign (z - у), lz - j/l = (хп © s,..., X] Ф s)2 + s.
Схема Dn выглядит следующим образом (рис. 3).
Рис. 3. Схема для вычисления абсолютной величины разности
Блок Сп осуществляет преобразование х\ = х\ Ф s, ..., хп =
= хп ф s, где s = sign (z - у), со сложностью п.
56
Глава 7. Быстрое умножение чисел
Блок Sn выполняет преобразование
(жп,... ,Ж1)2 = (жп, ...,Я1)2 + а
со сложностью 2п - 1, как это следует из предыдущих формул,
учитывая, что qn+] = 0.
Ясно, что
х = (xn...xi)2 = \z~y\, sign (z - у) = s.
Сложность построенной схемы
L(Dn) L(Sn) + L(Cn) + L(Sn) (5n - 2) + n + (2n - 1) = 8n - 3.
Таким образом, сложность вычисления
U2 = (U\-Uo), V2 = (V0-V!)
и знака
sign (f72V2) = sign (U2) Ф sign (V2)
удовлетворяет неравенству
Lo 2(8n - 3) + 1 = 16n - 5.
Пусть U]Vj, UqVq и |C72 • V2| уже вычислены co сложностью
Z(Wi, U0V0, |Z72 • V2|) 3M(n) + 16n - 5
и представляют собой 2n-разрядные двоичные числа.
Далее требуется вычислить t=x+y, где х, х+у — (2п+ ^-раз-
рядные, а у — 2п-разрядное двоичные натуральные числа, причем
х 0, а у может быть как неотрицательным, так и меньше нуля.
Это делается с помощью следующей схемы Тп (рис. 4).
Пояснения к схеме:
8 = sign (у), x = (x2n+i...xi)2, у = (у2п . . . У1)2.
Блок С„ вычисляет
Ж] — Ж] ф S, • • 9 ®
Глава 7. Быстрое умножение чисел
57
Рис. 4. Схема для сложения—вычитания
Блок S2n складывает столбиком (a?2n+i,-• -,£1)2 и (j/2n,• • • ,3/1)2-
Блок С2п вычисляет t = (t2n+i - • • £1)2, где
il = Zi ® 8, tin+l = -Z2n+1 ® S.
Таким образом, если s = 0, то вычисляется t — х + у, если s — 1,
то вычисляется
t = х + у = еп- ((еп - х) - у) = х - у.
Сложность схемы Тп оценивается как
L(Tn) L(Cn) + L(H2n) + L(Cn)
(2n + 1) + (5 • 2п - 3 + 1) + (2п + 1) = 14п.
Оценим сложность всей схемы умножения. Вспомним, что
UiVi + U2V2 + U0V0 = U\V\ + (Ux - C7o)(Vo - Vi) + {70V0 =
= СШ + U0V} > 0.
Сумма U} Vi + UqVq вычисляется co сложностью, не меньшей
5 • 2n - 3 = Юп - 3,
58
Глава 7. Быстрое умножение чисел
и получается (2n + 1)-разрядное число. Далее вычисляется
(U1 Vi + СШ) + u2v2
с помощью схемы Тп.
Таким образом,
Wo = 2n(U\V\ + U2V2 + С70 И,)
вычисляется co сложностью
L(W0) (lOn - 3) + 14n = 24n - 3
в предположении, что соответствующие произведения уже вычис-
лены (очевидно, умножение на 2П осуществляется просто сдви-
гом компонент двоичного вектора и без каких-либо вычислений).
Остается вычислить Wo + W\, где
W, = 22nUxVx + U0V0.
Заметим, что двоичные цифры числа W\ получаются просто объ-
единением двоичных цифр чисел U\ Vx и U0Vq (которые уже вычис-
лены), и эта операция не требует каких-либо вычислений. Чис-
ло Wi имеет 4п разрядов, а число Wo — Зп + 1, причем в Wo
младшие п разрядов — нули. С учетом этого, сложность соответ-
ствующего сумматора S1 будет
L(S*) < 5(2n + 1) - 3 + 2(п - 1) - 1 = 12п - 1.
Окончательно, имеем следующую рекуррентную оценку слож-
ности:
M(2n) С L(l7i Vi, U0V0, \Ui • V2|) + L(W0) + L(Sl)
< 3M(n) + (16n - 5) + (24n - 3) + (12n - 1) =
= 3M(n) + 52n - 9,
t. e.
M(2ri) < 3M(n) + 52n — 9.
Глава 7. Быстрое умножение чисел
59
Покажем, как можно несколько улучшить полученную выше
рекуррентную оценку. Рассмотрим число
= 2lnU\V\ + U0V0.
Его младшие 2п разрядов в точности совпадают с числом По Vo,
а старшие 2п разрядов в точности совпадают с числом U\V\. Обо-
значим число, образованное старшими п разрядами числа UM,
через А}, а число, образованное младшими п разрядами, через
Ао, тогда UiVj = At2n + Ао. Аналогично определим п-разрядные
числа В\ и Во, такие, что По Vo = В\2п 4- Во.
Рассмотрим внимательнее сумму
Wt 4- Wo = W, + (UM + Ho Vo + U2V2)2n =
= 22nUM + По Vo + (HiVi + Ho Vo + U2V2)2n.
Она равна
23nAi + 22nAo + 2nBi + Bo + (2n Л + Ao 4- 2nBx + B0)2n + U2V22n =
_ 2^nj4j 22n(Ao 4- Ai 4- Bi) 4- 2n(Bi 4- Ao 4- Bo) + Bo + U2V22n =
(23nAi 4- 22nAj + 2nB0 + Bo) + (2n(A0 + Bj) + (Ao + Bj) + U2 V2)2n.
Первое слагаемое в ней
23nA, + 22nAi + 2пВо + Во
составляется, как и число W\, без использования каких-либо опе-
раций. А второе слагаемое
2"(Ао + В]) + (Ао 4- Bj) + U2V2
вычисляется с меньшей сложностью, чем число IVo- Действитель-
но, Ao + Bi является, вообще говоря, (п 4- 1)-разрядным чис-
лом и вычисляется со сложностью 5п - 3. После этого число
2п(Ао 4- Bi) 4- (Ао 4- В\) вычисляется со сложностью 2п 4- 1, так
как его вычисление сводится к прибавлению к (п 4-1)-разрядно-
му числу Ао 4- Во одноразрядного числа, а перенос в (п 4- 2) -й
разряд не возникает, так как Ао 4- В\ < 2n+1 - 1, и в результате
60
Глава 7. Быстрое умножение чисел
получается (2п+1)-разрядное число 2n(Ao+Bi) + (Ao+Bi). К это-
му числу далее прибавляется или вычитается 2п-разрядное число
U2V2 точно так же, как вычислялось число (С7| Vj 4- UoVo) 4- U2V2
с помощью схемы Тп. Но число C7i Vj + UoVo ранее вычислялось
со сложностью 10п - 3, а используемое здесь вместо него число
2п(Ло 4- В\) 4- (Д 4- В\) было вычислено выше со сложностью
5п - 3 + 2n +1 = 7п - 2. Поэтому общая сложность в рассматрива-
емом варианте схемы уменьшается на Зп - 1 и становится равной
М(2п) = ЗМ(п) 4- 49п - 8.
Применяя это неравенство при п = 8, а для умножения 8-раз-
рядных чисел используя школьный метод, видим, что получен-
ная таким образом схема Карацубы для умножения 16-разрядных
чисел имеет чуть меньшую сложность, чем схема, реализующая
школьный алгоритм. Но при п = 7 (т. е. для умножения 14-раз-
рядных чисел) метод Карацубы дает схему большей сложности,
чем школьный метод.
Получим в одном частном случае верхнюю оценку сложности
схемы Карацубы в явном виде. Пусть п является степенью двойки.
Тогда, используя данное выше рекуррентное неравенство, имеем
М (n) ЗМ +49^-8,
. /п\ , (п\ п
+49^-8,
М(п)^32м(^\ +49п(| + |Л -8(1+3),
М(п)^Зкм(^ +49nQ + ^+.. -8(1+3+.. .+3А ’),
M(n)^3fcM^^+49n^0 -1) -4(3*-1).
Используя оценку
М(п/2к) = М(8) = 6 • 82 - 8 • 8 = 320
Глава 7. Быстрое умножение чисел
61
школьного метода, отсюда выводим, что
2
М(п) 26- -n10g23 - 49п + 4.
Например, для умножения 32-битных чисел схема имеет слож-
ность 4808. Школьный метод дает схему сложности 5888. Для
умножения 64-битных чисел имеем оценку 15 984. Школьный
метод дает схему сложности 24 064.
Задача 23. Аналогичным образом попробуйте улучшить оценку слож-
ности умножения многочленов методом Карацубы.
Задача 24. Попробуйте оценить, насколько быстрее возводить чис-
ла в квадрат в сравнении с общим умножением для метода Карацубы.
Глава 8
Деление многозначных чисел
Учитель: Сколько получится, если разделить 28 яблок
на семерых?
Ученик: 13!
Учитель: Почему так много?
Ученик: Делим столбиком, 8 делим на 7, получаем 1,
от 28 отнимаем 7, получаем 21, опять делим на 7,
получаем 3, 1 и 3 составляют 13!
Учитель: А проверка?
Ученик: Умножаем 13 на 7, 1 на 7 равно 7, 3 на 7
равно 21, 21 плюс 7 будет 28!
Школьный анекдот
Деление многозначных чисел — самая трудная из арифмети-
ческих операций. Это помнят все со школы. Дело в том, что при
выполнении деления больших чисел столбиком возникает такая
задача: как найти частное q от деления (п + 1)-разрядного числа
и = и0...ип
на n-разрядное число
V = V] ... ип
где Uq V]. Это число равно [u/wj и находится обычно подбором
(поэтому школьный алгоритм деления алгоритмом на самом деле
не является, так как требует определенного искусства от исполни-
теля). Следующий прием облегчает его нахождение. В его изложе-
нии следуем «Искусству программирования» Д. Кнута. Положим
q = min
Юн + и
,9 .
v
Глава 8. Деление многозначных чисел
63
Теорема 13. Справедливы неравенства g > д, а при > 5
к тому же д- 2 д. Умножив и и v на [10/viJ, можно, не
изменяя u/Vf добиться того, что v 5. Неравенство д - 2 д,
вообще говоря, усилить нельзя.
Доказательство. Можно считать, что д < 9, тогда
IOuq + «1
qv0 (lO«o + Ui) - Ui + 1,
значит
и — qv и - 10” 1 v ] д
д0Юп + ... + ип - 1Опио ~ Юп«1 + 10"“'^ - 10п-1 <
< 10п-1 и, v.
Отсюда следует, что g > g. Допустим, что g^g + 3. Тогда
10^0 + Щ lOn«o + Юп {U] и «
vj ~ 10n-’ui 10п-’^ < и - 10п’
значит
Л и и (u/v)10n~l
зсв_4<„.__ + 1__ = 1+ ,
поэтому
2(v- 10п~1)
юп-'
> 2(vt - 1),
и
v
откуда
6 g - 3 > g =
> 2(V! - 1),
Vi 4,
противоречие. Для доказательства последнего утверждения заме-
тим, что
10
v + 1
< (v+ 1)
10
V + 1
Ю,
и при v > 5 очевидно
V
10
> v > 5.
64
Глава 8. Деление многозначных чисел
Если же 1 v 4, то
10
v + 1
так как
+L Л _4 = "Р~”> >о.
V + 1 / V + 1
Пример, когда неравенство q - 2 < q обращается в равенство
в случае десятичной системы, таков: и = 4100, v = 588. □
Теорема 14.
а) Если «о > то q = 9 или 8.
lO«o+ui
б) ------------- .
L + 1 J
в) Если при т = 1 Ouq + «1 - qv\ справедливо неравенство
v2q > 10г + «2, то q = q- 1 или q = q- 2, а если Viq С
Юг + и2, то q — q или q = q - 1.
г) Если «| 5, v2q Юг + и2, но q q, то и - qv 41 «/50
(т. е. с вероятностью 0,82 все же q = q).
Доказательство.
. и uolOn / 1 \ / 1\
а) - > ------ + „ -, > 10 1----------) > 101 1 - - ) = 8
7 v (v\ + 1)10п-1 \ «1 + 1/ \ 5/
1О«о + «I < и и
«1 + 1 10(«] + 1) «’
в) В первом случае
и — qv ^u — qv\ 10n 1 — qv210n 2 =
= м210п-2 + ... + un + rlO - g«210n-2 <
< 10n-2(u2 + 1 + 10r2 - g«2) 0,
и так как и — qv 0, то q > q.
Глава 8. Деление многозначных чисел
65
Во втором случае, предположив, что q - 2 q, заметим, что
тогда
и < (q- 1)и < q(y\ 10”“1 + (v2 +1) 10”“2) - v < q(v} 10”“1 + u210"“2) +
+ 10"",-v^^l0n“1 + (10r+u2)10n"2 + 10"“,-v = u010n +
+ U110"-1+u210”“2+10”“’-t^u010” + ui 10”“'+u210”“4u.
Противоречие.
г) Из неравенства v2q < Юг + и2 следует
lOOuo + 10«1 + и2 и
10v] + v2 10n-2(10vi + v2)’
Отсюда и - qv = v(l - а), где
и и ( 1 1\
1 + ® v у \10n~2(10wi + v2) v)
и(10”“3г>з +... + vn) и < # < 9 < 9
10п—2(10г>1 + v2)v < Юг)]^ 10г>] 10vj 50’
Доказанные теоремы справедливы для позиционной системы
по любому натуральному основанию Ь (при b = 2 все они триви-
альны). В формулировках и доказательствах надо лишь заменить
10 на Ь, число 5 — на [i>/2 J, а число 0,82 — на (1 - 2/6).
Прежде чем заняться оценками величины D(n, т) — слож-
ности деления с остатком n-значного числа на m-значное (оче-
видно, при п < т она равна нулю), добавим к использован-
ным ранее операциям над цифрами новую операцию, осуществ-
ляющую деление двузначного числа на однозначное с остатком:
6(и0, ui,v) = (<53, <52, <50, где
<53 = <53(uo,ui,v), S2 = 62(и0,щ,у), q = 63b + 62 =
и
и = илЬ + щ, о\ = o\(Uo,U\,v) = и — q — .
|_ц_
Всегда далее при применении этой операции будет 63 — 0.
66
Глава 8. Деление многозначных чисел
Лемма 8. Справедливо неравенство D(n, 1) п.
Доказательство. Деление n-значного числа и\ ...ип на одно-
значное v осуществляется следующим простым алгоритмом. По-
лагаем т = 0, j = 1, вычисляем
заменяем г на
rb + Uj mod v = 6\(r, Uj,v),
увеличиваем j на I и повторяем все, пока j п. Так как всегда
О г < Vj, то
(Ь + Uj
значит 6з(г, Uj, v) = 0. Частным j будет число иц ... wn, а остат-
ком — г.
Легко получить оценку D(n, m) = 0(nm). Но для получения
по возможности меньших мультипликативных констант в этой
оценке можно использовать следующие далее леммы. Обозначим
далее для краткости D0(n, тп) сложность вычисления только част-
ного (без остатка).
Лемма 9. Пусть
и = щ ...um Vi ...vm = v, U| > L^/2].
Тогда если ii| < 2ui, то [u/vj = 1. Равенство [u/uj = 2 воз-
можно, лишь когда U] 2i?i, т. е. при нечетном Ь и и\ = b- 1,
Vi = (Ь — 1)/2. Сложность выполнения деления и на v с остат-
ком, как правило, равна 2т + 1 и лишь с малой вероятностью
равна 6т.
Доказательство. Частное w = u/v заключено в пределах
и и + 1
------ < w <
v + 1-v
Глава 8. Деление многозначных чисел
67
значит при Uj < 2vi неполное частное [w] = 1. Так как v, > [6/2],
то и < b < 3 [6/2] Зи, значит [га] 2. Если щ > 2vj, то Ui > b
при четном Ь, что невозможно, либо щ >6—1, значит и\ =6-1 >
> 2г>1 >6-1. Если хотя бы одно из равенств и = 6— 1, v = (6-1)/2
неверно, то деление сводится к вычитанию, а если оба верны,
то к вычислению и - 2v и прибавлению v, если разность будет
отрицательной. □
Лемма 10. Справедливо неравенство
D(n, т) < 7 пт + 8n + Ют + 7 - 7п^.
Доказательство. Опишем алгоритм деления числа и — щ ...ип
на v = V] ...vm и оценим его сложность. Одновременно будем
описывать схему (неветвящуюся программу) для деления чисел.
Для применения оценок теоремы 13, нужно выполнение неравен-
ства г>| > [6/2]. С определенной точки зрения [5] вероятность
этого события вовсе не 1/2, a logb2. Согласно той же теореме
в случае невыполнения этого неравенства умножаем и и v на
d — [6/(vi + 1)], на что требуется, согласно лемме 2, не более
3(m + n) -4 операций. Вычисление d (вне зависимости от условия
г>1 > [6/2]) можно осуществить со сложностью S = 6 с помощью
следующей схемы
s = V] - <51(1» 0,2), d = тах(<52(1,0, v + s)s, 1),
где х-у означает знак разности чисел х и у, вычисляемый при
их вычитании, т. е. х—у = 1, если х < у, и х—у = 0 в противном
случае. При ручном вычислении сложность здесь равна 4, так
как 2 операции очень легкие и их сложностью можно пренебречь.
В случае
W] . • . Um > V] ... vm
(это заведомо так при щ > «| и иногда бывает при щ = Vj)
делим uj . ит на V] ...vm с остатком, записываем неполное
частное в качестве первой цифры результата и заменяем запись
68
Глава 8. Деление многозначных чисел
щ .. .ит на полученную запись остатка. Сложность выполнения
этой процедуры, согласно лемме 9, не превосходит 6т. В случае
Ui ... щ выполняем деление tti . . . um+i на Vi ...
с остатком, но деление здесь выполняется сложнее. В случае
Ui — V| полагаем q = Ь - 1, а в случае tti < г>| полагаем
U\b + U2
= 52(ui,u2,vi).
Проверяем выполнение неравенства (согласно теореме 14 в случае
щ = V] эту проверку можно не делать)
«2<7 > (u\b + u2 - qvi)b + u2. (*)
Если оно выполнено, то уменьшаем q на 1 и повторяем проверку.
Вычисление q можно осуществить со сложностью S = 12 с помо-
щью следующей схемы
S = Щ -U|, S = (S2(U[, U2, V\)b + U2)-V26\(U], U2, V]),
q= (&2(иьи2,щ) - si)s + (b- 1)(1 - s).
При ручном вычислении сложность здесь равна 7, так как 5 опе-
раций тривиальные и их сложностью можно пренебречь. Если при
второй проверке неравенство (*) выполняется, то согласно теоре-
мам 13 и 14 истинное значение q — |ti| ... uto+i/vJ равно или q,
или q - 1, причем вероятность последнего случая равна примерно
2/Ь при больших Ь. Далее вычисляем
«1 ... ttm+I -vq
с помощью леммы 8, и если результат только второй проверки
будет отрицательным, то к получившемуся числу
bm+2 + U1... um+i - vq
(вместо отрицательного числа ги ... um+i - vq в этом случае, со-
гласно лемме 8, получается именно оно) прибавляем «для ком-
пенсации» число v и получаем, если не обращать внимание на
Глава 8. Деление многозначных чисел
69
(т + 2)-й разряд, число
= и} ...um+i - vq.
Схемой это число вычисляется так:
s = Uy ... um+\—vq, х = ViS,
w} ...wm = ... um+i - vq) + x}, ...xm.
Сложность равна, согласно леммам 8 и 9,
Зт - 2 + 2т +14- 2т - 1 = 7т - 2,
так как т операций тривиальны и в ручном счете ими можно
пренебречь. Далее заменяем n-значное число и = щ ...ип на
(п — 1)-значное число
W1 . . .
и задача сводится к делению этого числа на v. Отсюда имеем
оценку
D0(n, т) D0(n - 1, т) + (7т -2 + 7).
Учитывая сложность умножения на d и вычисления первой цифры
частного, а также применяя в дальнейшем индукцию, получаем
оценку
D0(n, т) ^(п-т + 1)(7т + 5) + 3(п + т) + 5т + 2.
Полученный остаток от деления еще надо разделить на d (он,
кстати, делится нацело), что согласно лемме 8 требует сложно-
сти т. В итоге имеем
D(n, т) < Dq(n, т) + т 7 пт + 8n + 10m + 7 - 7m2.
Если учесть, что вычисление d, умножение на d, а потом деление
на d в среднем выполняется со сложностью
logb 2 + (1 - logv 2)(3n + 4m),
70
Глава 8. Деление многозначных чисел
а вычисление Ш] ... wm — со сложностью, не большей
74-3m- 2 +2m+1 + (2m - 1)у = fs + ^jm + e- ^,
о \ о/ о
то оценка сложности в среднем чуть уменьшается и имеет вид
D(n, m) (п - т + 1) ^5 4- m 4- 6 - 4-
+ (1 - logb 2)(3n + 4m) 4- 2 log6 2 4- log6 2(5m + 2) <
/ 6\ 2
< ( 5 + г I mn + O(m + n) - 5m .
\ 0/
Имеет смысл учесть, что операция деления двухразрядного числа
на одноразрядное с вычислением остатка при больших b сложнее,
чем операция умножения одноразрядных чисел. Так, при выпол-
нении ее на калькуляторе, она фактически распадается на 3 опе-
рации (деление, умножение целой части частного на делитель
и вычитание полученного произведения из делимого). Если счи-
тать, что сложность этой операции равна 3, то оценка сложности
деления принимает вид
D(n, m) < 7nm 4- 10n + 8m + 13 - 7m2,
а оценка, приведенная в лемме 8, заменяется на оценку
D(n, 1) Зп.
Задача 25. При условии использования только операций &, V, Ф, ->
получите следующую оценку сложности умножения в двоичной си-
стеме:
D(n, т) < 12(п - т)т + О(п).
Глава 9
Как представляются отрицательные
числа в компьютере
Когда было введено понятие отрицатель-
ных чисел, меньших нуля, математику,
как науку, в которой самым важным яв-
ляется ясность и очевидность, накрыло
непроницаемым облаком и ввергло в лаби-
ринт парадоксов, один загадочней другого.
Лазарь Карно
Обычный школьный способ записи отрицательных чисел со-
стоит в постановке знака минус перед записью модуля этого числа.
Этот способ в компьютерной арифметике называется прямым ко-
дом. В случае использования в компьютере у него есть очевидный
недостаток, а именно неоднозначность записи нуля в этой системе
(«проблема минус нуля»). Для компьютера, как правило, удобнее
дополнительный код, в котором, например, число -(123 456 789) ю
записывается как
-109 + 1 + (987 654 321)ю = (1 987 654 322)10.
Единица в старшем разряде является символом знака и показыва-
ет, что данное число отрицательное. Запись (ao^i • • • ап)ю и-раз-
рядного числа в дополнительном коде во всех случаях означает
число -до Юп + (ai ... а-п)ю> где (aj... ап)ю — обычная запись
положительного п-разрядного числа. Если символ знака д0 = 0,
то очевидно (Оси ... дп)ю = («1 • • • ап)ю-
Дополнительный код удобен еще и тем, что при вычитании
из меньшего числа большего с помощью обычного алгоритма вы-
72
Глава 9. Представление отрицательных чисел в компьютере
читания как раз и получается разность, записанная в дополни-
тельном коде. Например, если вычесть из меньшего числа (89)ю
большее число (98) ю, то получится запись
89
98,
1 91
так как в старший разряд мы должны поместить «заем», рав-
ный единице. Однако такой результат выглядит странно, и при
использовании прямого кода в этом случае числа переставляют,
опять выполняют вычитание, получают уже положительное число
и перед ним ставят знак минус. Но при использовании дополни-
тельного кода эти трудности исчезают, так как полученное число
(191)ю со знаковым разрядом 1 в дополнительном коде означает
-100 + 91 = -9, и это верный результат.
На самом деле в компьютере дополнительный код, конечно,
используется для двоичной системы, а не для десятичной. При-
менение дополнительного кода удобно еще и тем, что позволяет
выполнять сложение чисел любых знаков тем же алгоритмом, ко-
торый осуществляет сложение положительных чисел. Например,
если компьютер был бы 8-разрядный, то сложение положительно-
го и отрицательного чисел он бы выполнял следующим образом:
00111010
10011111.
11011001
Первое слагаемое здесь равно
(00111010)2 = (0111010)2 = 32 + 16 + 8 + 2 = 58,
второе равно
(10011111)2 = -128+ (0011111)2 = -128 + 16 + 8 + 4 + 2 + 1 = -97,
сумма равна
(11011001)2 = -128+ (1011001)2 = -128 + 64+ 16 + 8+ 1 = -39,
что очевидно правильно, так как 58 + (-97) = -39.
Глава 9. Представление отрицательных чисел в компьютере
73
Сложение отрицательных чисел выполнялось бы, напри-
мер, так:
10111010
11011111.
1 10011001
Получившийся в результате переноса девятый бит просто отбра-
сывается, и результат оказывается равным
(10011001)2 = -128 + (0011001)2 = -128 + 16 + 8 + 1 = -103.
Впрочем, если получившийся девятый бит воспринимать как зна-
ковый, то результат будет таким же:
(110011001)2 = -256 + (10011001)2 = -256+ 128 + (0011001)2 =
= -128+ (0011001)2 = -ЮЗ.
Он очевидно правильный, так как
(10111010)2 = -128+(0111010)2=-128+32+16+8+2=-70,
(11011111)2 = — 128+(1011111)2= —128+64+16+8+4+2+1 = —33,
и -70 + (-33) = -103. Однако если абсолютная величина суммы
слишком велика (в случае 8-разрядных чисел больше 127), то ре-
зультат сложения будет неправильным (будет иметь даже неверный
знак), как в следующем примере:
10111010
10011111.
01011001
В результате сложения отрицательных чисел (10111010)2 = -70
и (10011111)2 = -97 у нас получилось не -167, а (01011001)2 =
= 64 + 16 + 8 + 1 = 89 (правда, возник перенос в девятый разряд,
но мы вынуждены его отбросить). На это неприятное явление
есть такой ответ. Во-первых, число -167 (и вообще любое число,
большее по абсолютной величине 128) невозможно изобразить
в нашей системе 8-разрядных знаковых чисел в дополнительном
74
Глава 9. Представление отрицательных чисел в компьютере
коде, так как в этой системе записываются только числа из отрезка
{-128,, 127}, поэтому появление числа, большего 128 вызыва-
ет переполнение. Во-вторых, почти правильный ответ мы все же по-
лучили, так как он отличается от верного на 256, другими словами,
наш алгоритм выполняет сложение по модулю 28 = 256. Причина
этого явления конечно в том, что мы отбросили появившийся де-
вятый разряд. В реальных компьютерах все происходит примерно
так же, только длина машинного слова сейчас 64 разряда.
Но у дополнительного кода есть и недостатки. Складывать
и вычитать в нем действительно очень удобно. А вот умножать
и делить — не очень. Для умножения удобнее упоминавшийся
выше (и хорошо всем известный) прямой код. И вычислять абсо-
лютную величину числа в дополнительном коде не так тривиально.
Тем не менее, в цифровой технике почти повсеместно использу-
ется именно дополнительный код.
Задача 26. Докажите, что абсолютная величина числа (а8...Я|)2,
заданного в дополнительном коде, равна
(а2 ф а8, Ф а8,..., в| ф о8, )2 -I- о8.
Кроме дополнительного кода изредка используют также об-
ратный код, в котором, например число -(123 456 789) ю записы-
вается как 876 543 210 (каждая цифра дополняется до 9). В этом
коде сложение и вычитание производятся фактически по модулю
109 - 1.
Глава 10
SRT-деление
В мире есть много трудных вещей, но нет
ничего труднее, чем четыре действия ариф-
метики.
Беда Достопочтенный (673-735 гг.)
Здесь будет рассказано об алгоритме деления двоичных чи-
сел, удобном для компьютерных вычислений и реально приме-
няющемся при проектировании логических схем, выполняющих
деление1^.
Деление т -битного числа Z на п-битное число D в част-
ном дает число Q, которое может быть (т - п + 1)-битным или
(т — п)-битным, и остаток R, 0 R < D, такие, что Z = QD + R.
Обычный школьный алгоритм деления столбиком удобно пред-
ставлять в виде деления дроби z = 2~m~'Z = O.Ozj... zm на дробь
d = 2~nD = O.d]. ..dn (здесь и далее в этом разделе предполага-
ется, что d] = 1, т. е. делитель, как говорят, нормализован), тогда
частным будет число Q = qo2m~n +... + qm-n, а остатком — число
Любопытно, что при использовании аналогичного алгоритма фирма «Интел»
допустила свой знаменитый баг в одной из ранних версий процессора «Пентиум».
Баг состоял в том, что процессор неправильно делил. Ошибки, правда, возни-
кали чрезвычайно редко, поэтому и были не замечены при его тестировании.
После обнаружения бага специалисты по компьютерной арифметике «Интела» да-
же написали статью, в которой показали, что вероятность ошибочного деления
чрезвычайно мала. Ошибку обнаружил британский специалист по теории чисел
во время отлаживания своей программы, проверяющей числа на простоту. Про-
грамма иногда выдавала очевидно неверные результаты, и при поиске ошибки
в программе он обнаружил, что компьютер неправильно делил, и послал пример
ошибочного деления в «Интел».
76
Глава 10. SRT-деление
г = 2~nR, z = dQ + т, 0 г < 1. Для выполнения деления вна-
чале полагаем zq = z, а потом на каждом шаге деления находим
очередную цифру частного qj и остаток Zj+] = 2zj-dqj, при этом
после m + 1 - п шагов имеем равенство
„ лт+1-n , vn-n-L . । \
Zm+i-n — 2 Zq u(2 Qq 2 Q| + . . . + Qm—n) >
в котором легко убедиться по индукции, откуда при г = zm+]_n
получаем равенства
2m+l~nz = dQ + r, 2m+'z = 2ndQ + 2nr,
откуда имеем при D = 2nd, R = 2пг
Z = 2m+'z = DQ + R.
Выполняемые этим алгоритмом действия фактически совпадают
с действиями, выполняемыми обычным алгоритмом деления чи-
сел «в столбик», только в обычном алгоритме последние цифры
делимого не сносятся вниз, если они реально не участвуют в вы-
числениях. Тот факт, что дробная часть числа z начинается с нуля,
нужен лишь для того, чтобы и на первом шаге алгоритма оста-
ток вычислялся по формуле zj+] — 2zj — dqj при j = 0. Если бы
мы решили использовать при инициализации алгоритма число
0.21 • • zm, то в приведенные выше формулы пришлось бы внести
небольшие изменения, например на первом шаге остаток вычис-
лялся бы по формуле 2| = 2о - dqo. Для вычисления qj G {0,1}
на каждом шаге этого алгоритма сначала надо сравнить числа 2zj
и d, и в случае если первое из них не меньше второго, выбрать
qj; = 1 и далее выполнить вычитание, в противном случае — взять
qj = 0 (и вычитание делать не нужно). При вычислениях с «длин-
ными» числами указанные процедуры довольно трудоемки (тре-
буют времени, пропорционального числу п — «длине» делителя).
В конце 50-х гг. прошлого века американцы Свини, Роберт-
сон и (независимо) Точер предложили модификацию школьно-
го алгоритма деления, свободную от этих недостатков (но су-
щественно более трудную для понимания), которую с тех пор
Глава 10. SRT-деление
77
называют SRT-делением. Первая идея, которую они использова-
ли, заключалась в применении двоичной системы с отрицатель-
ными цифрами, точнее с одной такой цифрой — минус едини-
цей, обозначаемой далее Т. При этом на каждом шаге выбирается
qj € {-1,0,1} так, чтобы Zj+\ = 2zj — dqj € [-d, d) (в обычном
алгоритме всегда Zj+] € [0, d)). Выбирать qj можно по-разному,
в SRT-делении используется следующий эффективный с вычис-
лительной точки зрения способ: если Zj 0, то qj = 1 (и тогда
-d Zj+i = 2zj — d < 2d — d = d), если 0 > Zj —1/4, то
qj = 0 (и тогда при Zj < 1/4 в силу предположения о нормали-
зованное™ делителя имеем -d -1/2 Zj+\ = 2zj < 1/2 d),
и если Zj < -1/4, то qj = — 1 (и тогда даже при Zj < 0 имеем
-d = —2d+d Zj+i = 2zj+d < d). Формулы для Zj и окончатель-
ные формулы для вычисления частаого и остатка по сравнению
с обычным алгоритмом по существу не меняются, за исключени-
ем того, что в формуле для частного q цифры qj могут равняться
и минус единице, т. е. частное может быть представлено в виде
двоичной записи с отрицательными цифрами, например
10Ш0011Ш01.
Преобразовать такую запись в обычную несложно, для этого надо
в ней заменить все минус единицы на нули, получив некоторое
число в обычной записи, потом заменить все единицы в исходной
записи на нули, а все минус единицы в этой записи на единицы,
и, наконец, из первого числа вычесть второе, например
_ _ _ 101Ю00Ш0001
10111001111101 = 00001000001100.
10101001100101
Обратом внимание на одну особенность алгоритма: остаток в ука-
занном алгоритме может оказаться отрицательным (но не мень-
шим -d). В этом случае для завершения работы алгоритма от по-
лученного частного Q надо отнять единицу, а к остатку прибавить
d. Так как остатки Zj могут быть отрицательными, а при вычис-
лении каждого из них делитель d иногда прибавляется, а иногда
78
Глава 10. SRT-деление
отнимается, удобно использовать для записи отрицательных чисел
систему записи в дополнительном коде, в которой запись двоич-
ной дроби sao.a,-\... означает при знаковом бите з — 0 просто
положительную дробь ао.а_) ... = ао + 2-1a_i +... (значит, з = О
указывает на то, что число неотрицательное), а при знаковом бите
з = 1 запись аао.а_| ... означает число -2 + ао + 2-1а_] + ....
(значит, s=l указывает на то, что число отрицательное), та-
ким образом, в общем случае запись зао.а-\... означает число
-з + ao.a_i... - 2з + ао + 2-1а_1 +.... Например, запись 10.1011
означает число
-2 + 0.1011 = —2 +77 = ~14 = -1.0101
16 16
в стандартной записи (т. е. записи с помощью абсолютной вели-
чины и знака). Запись 11.1011 означает число
И 5
-2+1+0.1011 = -1+0.1011 = —! + — = —- -0.0101,
16 16
которое по модулю меньше 1, и поэтому может быть записано
также в виде 1.1011. Аналогично запись вида 00.*** эквивалентна
записи 0.***. Подобным же образом запись в дополнительном ко-
де можно применять к дробям с любой целой частью, да и к целым
числам тоже. Операция смены знака в этой системе записи дела-
ется не так просто, как в обычной. Например, -0.0101 = 1.1011,
как было указано выше. В общем случае алгоритм смены знака
такой:
—0.a_i... a_fc = l.b-i • • • b-k,
(6-i... 6_fc)2 = (-ia_i ... -’a_fc)2 + 1,
где -il =0, -i0 = 1. Зато в этой системе легко складывать чис-
ла любых знаков. Для этого, с некоторыми оговорками, годится
тот же алгоритм, который складывает обычные положительные
числа в двоичной записи. Нужно лишь при появлении переноса
в разряд, отсутствующий у слагаемых, иногда именно его рассмат-
ривать как знаковый бит, а иногда его игнорировать, а если этого
Глава 10. SRT-деление
79
переноса не происходит, то добавлять в этот разряд нуль и иногда
его рассматривать как знаковый бит.
Например, при сложении положительных чисел 0.01011 и 0.011
получается ответ 0.10111, а при сложении чисел О.ОЮПиО.П тоже
получается ответ 01.00011, при сложении чисел 1.011 и 0.011 по-
лучается правильный ответ 1.11, при сложении чисел 1.111 и 0.11
получается ответ 10.101, который будет правильным, только если
проигнорировать перенос и за результат принять 0.101, при сло-
жении отрицательных чисел 1.001 и 1.010 результат будет 10.011,
а при сложении чисел 1.111 и 1.01 результат будет 11.001 = 1.001.
Заметим, что если сумма чисел по модулю меньше 1, то знаковый
бит всегда стоит сразу перед дробной частью.
Вычитание числа можно, например, заменить на прибавле-
ние этого же числа с противоположным знаком. Поэтому для ор-
ганизации вычисления Zj+i — 2zj — dqj можно заранее вычислить
d1 = —d, как указано выше, и потом, в зависимости от значения
qj = -1,1,0, прибавлять d',d или 0 (в случае ручных вычис-
лений последнее означает просто не делать ничего). Сравнение
произвольного числа t = t0.t—ii-2... € [-1,1) с нулем или —1/4
в дополнительном коде делается очень легко. Нужно у t знать
лишь 3 старших бита. Очевидно, t 0 <=> to = 0,
0 > t - 7 <=> t0.t_*it-2 = 1.11 = - 7 <=> tot-lt-2 = I-
4 4
Используя двоичные цифры, можно представить -1,0,1 как 11,
00, 01. Поэтому цифры qj можно представить как (qj,i,qj,o), а ука-
занный выше алгоритм их вычисления записать в следующем виде:
t > 0 <=> to = 0 => qj = 1 <=> qjtt = 0 & <7у,0 = 1,
0 > t 4=> tot-it-2 = 1 => Qj = 0 <=> qj,t = 0 & qji0 = 0,
t < -1 <=> t0(->(i_,t_2)) = 1 ==> qj = -1 <=> qjti = 1 & qjfi = 1,
откуда следуют формулы
qj,o = qjt\ = t0(->(t-it_2)).
80
Глава 10. SRT-деление
Заметим еще, что = -'*1 (так как (Qj,o = 1) & (qj,\ = 0)
4=> to = 0) и qj,oqj,\ = qj,\ (так как gjj = 1 ==> д,,о = 1). Выразим
теперь через gj,o,Qj,\ биты числа -dqj. Пусть d1 = d'o-d'j ...dnt
d — O.di... dn. Обозначим биты числа -qjd = d'^.d" ...d„. Тогда
для любого г имеем
di = diqjfi->q\ V diqj^qjfi = d^~>to V diQj\,
где для a, (3 € {0,1} операция V (дизъюнкция) определяется ра-
венствами
а V /3 - max(a, /3) = а + /3 — а/3 = -,(->а-</3),
но проще выражается словами: дизъюнкция равна нулю, только
если оба операнда нули, в противном случае она равна единице.
В компьютерной реализации алгоритма для вычисления булевого
вектора d" можно побитово умножить вектор d' на бит to, потом
побитово умножить вектор d на бит qi и вычислить побитовую
дизъюнкцию полученных векторов.
Приведем пример применения указанной выше упрощенной
версии SRT-алгоритма. Пусть нужно разделить число (1101110101)2
на (101101)2. Переходим к двоичным дробям, т. е. полагаем z —
= 2о = О.О11О111О1О1, d = 0.101101. Вычисляем d' = -d= 1.010011
19 45
(в виде обычных дробей </ = -! + — = -— = -d).
64 64
На первом шаге вычисляем
0.1101110101
2] = 220 - dq0 = 2z0-d = 0.1101110101 + d! = + 1.010011
0.0010100101
так как z0 > 0, а поэтому go = 1.
На втором шаге вычисляем
0.010100101
22 = 221 - dgi =2zi-d = 0.0010100101 + d' - + 1.010011 ,
1.100111101
так как Z\ > 0, а поэтому gi = 1.
Глава 10. SRT-деление
81
На третьем шаге вычисляем
11.00111101
z3 = 2z2 - dq2 = 2z2 + d= 11.00111101 + d = + 00.101101 ,
11.11110001
так как z2 < 1.11 = -1/4, а поэтому q2 — —1.
На четвертом шаге вычисляем
z4 = 2z3 - dq3 = 2z3 = 111.1110001 = 11.1110001 = 1.1110001,
так как 0 > z3 > 11.11 = -1/4, а поэтому q3 = 0.
На пятом шаге вычисляем
z3 = 2^4 - dq4 = 2z4 = 11.110001,
так как 0 > Zi, > 11.11 — -1/4, а поэтому q^ = 0.
На этом шаге алгоритм можно закончить с отрицательным
остатком
49 15
г = z5 = 11.110001 = 1.110001 = -! + — = - —
64 64
и частным Q = (11100)г = 16 + 8 - 4 = 20, откуда имеем
D = 26d = (101101)2 = 32 + 8 + 4 = 1 = 45, R = 26г = -15,
Z = 2nz0 = (1101110101)2 = 885 = 45 • 20 - 15 = DQ + R.
Д ля получения неотрицательного остатка достаточно отнять от част-
ного единицу (получим (1 1T00)j -1 = (11000)2 - (100)2 -1 = 19), а к
отрицательному остатку прибавить D :
1110001
R + D = + 0101101 =30.
0011110
Заметим еще, что если не остановиться на пятом шаге, а продолжить
работу алгоритма до бесконечности, получим разложение дроби
0.01101110101 1101110101 885 _5 59
-------------=--------------=------2 = —
0.101101 10110100000 45 96
82
Глава 10. SRT-деление
в бесконечную двоичную дробь с отрицательными цифрами
0.01101110101
0.101101
= 0.11100010101...
с периодом (01). Легко видеть, что
О.ПТОООТОТОТ... = 0.11 - 0.00100010101... =
_3_1__1_/1 _1_ \ 5_J_1_59
“ 4 ~ 8 “ 32\4 + 16 + ” ) “ 8 " 32 3 ~ 9б‘
В общем случае, конечно, тоже получается бесконечная двоичная
периодическая дробь с отрицательными цифрами.
Вторая идея, которая используется в SRT-делении, заклю-
чается в том, что сложение для вычисления zj+i по формуле
2Zj - qjd выполнять в полном объеме не надо. Точнее, Zj+i будем
представлять в виде пары чисел Uj+\, Vj+\ Е (—1,1), таких, что
uj+i + = Zj+\, а вычисление этой пары по предыдущей паре
Uj, Vj будем выполнять с помощью неполного сложения
ЧгМ + Vj+i = 2uj + 2vj + (-qjd).
Под неполным сложением будем понимать операцию, которая
преобразует три числа
О — Gg-®1 • • • Ь — &Q.&1 • • Ьк, С — Cq.C{ .. . Ск
в два числа
8 = So-31... sk, Р = РО-Р\,-- - ,Рк, Si = a,i + bi + Ci mod 2,
Pi — a,ibi V diCi V b^i, i = 0,... ,k.
Числа Si,pi € {0,1} получаются путем сложения трех чисел a,, bi, Ci
и связаны с ними формулой 2pi + з< = + Ь, + с,. Ее можно про-
верить непосредственно, но проверка упрощается, если восполь-
зоваться симметричностью формул для и р<. Действительно,
достаточно выполнить проверку для случаев, когда среди чисел
сц, bi, ч имеется соответственно 0,1,2 или 3 единицы. Можно
заметить также, что число Pi образуется в результате переноса,
Глава 10. SRT-деление
83
который происходит только тогда, когда минимум два из трех чи-
сел di, bi, Ci равны 1. Отсюда следует, что
Pi = тах(а$Ь,, а&, Ь&) = а&г V V Ь&.
Легко проверить также, что справедливы формулы
Pi = (Ж + d^i + b^i mod 2 = аД © © Ь»с, = аД V сДа» © bi),
где операция х © у = х+у mod 2. Из равенств 2pt- + в,- = а,+^ + Cj
следует равенство
к
РоРь ... PfcO + Зо.З!... Sfc = —(2р0 + So) + 52(2pi + 3j)2~l =
i=l
к
= ~(do + bo + Co) + + ci)^ * ~ а + Ь + C,
i=l
т. e. сумма двух чисел, получившихся в результате неполного сло-
жения, равна сумме складываемых трех чисел. Например,
1110001
+ 0101101
+ 1000100
0011000 “ 30,
+ 11001010
11100010
В SRT-алгоритме можно на каждом шаге вместо одного числа
Zj вычислять два числа Uj, Vj, сумма которых равна Zj, и только
в самом конце работы алгоритма для получения остатка rn = zn
выполнить полное сложение чисел un,vn. На первом шаге ал-
горитма можно взять «1 = 2zi, Vi = -dq\. Заметим еще, что
для вычисления на каждом шаге алгоритма нужных для нахо-
ждения qj разрядов Zj^, Zjto, Zj,-\, Zj,-i числа 2zj можно просто
сложить 4-разрядные числа, полученные из 2uj, 2vj отбрасыва-
нием всех разрядов, начиная с 3-го. При этом полученное число
2г'- будет меньше, чем 2zj на 1/4 + 1/4 = 1/2. Но алгоритм вы-
бора qj был таков, что уменьшение указанного числа на величи-
ну, меньшую 1/2, или вообще не приведет к изменению qj, или
84
Глава 10. SRT-деление
оно уменьшится на 1 по сравнению со значением, вычисленным
по точному значению z'j. Но при этом, хотя значение qj изме-
нится, новое значение Zj+i, вычисленное по измененному значе-
нию qj, по-прежнему будет удовлетворять нужному нам условию
—d 2j+i<d- Действительно, если 2z'j 0, то qj = 1 (и так
как 2zj 0, то -d < Zj+i = 2zj - d < 2d — d = d), если
О > 2zj -y/'i-, to qj = 0 (и тогда 2zj < 1/2, откуда имеем
—d < -1/2 < Zj+i — 2zj < 1/2 < d), и если 2z'j < -1/2, то qj = -1
(и тогда 2zj < 0, откуда имеем —d = —2d+d Zj+i = 2zj+d < d).
Рассмотрим указанный выше пример работы SRT-алгоритма
в его полном варианте. Напоминаем, что во всех числах старший
разряд — знаковый! Пусть нужно разделить число (1101110101)2
на (101101)2. Переходим к двоичным дробям, т. е. полагаем z =
= zo = 0.01101110101, d=0.101101. Вычисляем d' = -d= 1.010011.
На первом шаге вычисляем
Z\ = 2z0 - dq0 — 2zq - d =
= 0.1101110101 + 6?' = 0.1101110101 + 1.010011,
так как zq > 0, а поэтому qo = 1.
На втором шаге вычисляем
z2 = 2zi - rig, = 2zj - d = 01.101110101 + 10.10011 + 1.010011 =
= 01.101110101 +10.10011 +11.010011 =
= 00.011011101 + 111.00110 = 0.011011101 + 1.00110,
так как Z\ > 0, поэтому q\ = 1, а неполное суммирование дает
результат
01.101110101
+ 10.10011
+ 11.010011 .
00.011011101
+ 111.00110
Заметим, что при выполнении неполного сложения младшие раз-
ряды самого длинного (первого) слагаемого, отсутствующие в двух
других слагаемых, можно просто перенести в любое из двух чисел
Глава 10. SRT-деление
85
результата, не выполняя фактически над этими разрядами ника-
ких операций. Разумеется, аналогичным образом можно поступать
и на следующих шагах алгоритма.
На третьем шаге вычисляем
z3 = 2z2 - dq2 = 2z2 + d = 00.011011101 + 111.00110 + 0.101101 =
= 0.011011101 + 1.00110 + 0.101101 = 10.00001001 + 001.11101 =
= 10.00001001 + 01.11101,
так как 2z2 = 0.011 + 1.001 = 1.100 < 1.1 = -1/2, поэтому q2 = -1,
а неполное суммирование дает результат
00.11011101
+ 10.0110
+ 0.101101 .
10.00001001
+ 001.11101
Заметим, что если бы мы не отбросили два старших бита (числа
при этом не изменились), пришлось бы делать неполное сложение
с чуть более длинными числами:
000.11011101
+ 1110.0110
+ 0.101101
1110.00001001
+ 00001.11101
разумеется, потом три старших бита тоже можно было бы отки-
нуть.
На четвертом шаге вычисляем
z4 = 2^3 - dq3 = 2z3 + Q = 100.0001001 + 011.1101 + 0,
так как
2z2 = 100.00 + 011.11 = 111.11 = 1.11 > 1.1 = -р
поэтому q3 = 0. Так как 10+01 = 11 = 1 = 0+1, то в проведенных
выше вычислениях можно было бы откинуть старшие разряды
86
Глава 10. SRT-деление
Ё обоих числах и вычислить z2 как 00.00+ 11.11 = 11.11 = 1.11,
a Z4 = 00.0001001 + 11.1101. В компьютерных вычислениях все
равно нужно преобразовать сумму трех слагаемых, одно из которых
нулевое, в сумму двух слагаемых согласно данному алгоритму:
00.0001001
+ 11.1101000
+ 00.0000000.
11.1100001
+ 000.001000
Тогда = 11.1100001 + 000.001000 = 1.1100001 + 0.001000.
На пятом шаге вычисляем
z$ - 2z4 - dq4 = 2z4 = 11.110001,
так как 2z4 = 1.110 + 0.001 = 1.111 > 1.1 = -1/2, поэтому g4 = 0.
В другом варианте приходится вычислять
2z'4 = 1000.00 + 0111.10 = 000.00+ 111.10 =
= 0.00+1.10= 1.10 > 1.1 =
но опять получаем, что д4 = 0.
На этом шаге алгоритм можно закончить с отрицательным
остатком
r = zs = 2z4 = 11.100001 +00.01000= 11.110001 =
и частным Q = (11Т00)2 = 16 + 8 — 4 = 20.
Рассмотрим вопрос о том, не будут ли удлиняться целые части
результата при неполном сложении
U + V = 2и + 2v + qd
на каждом из шагов алгоритма. Очевидно, целая часть числа
d" = dq может быть записана в виде d^do, так как это число
по модулю меньше 1. Если числа и, v тоже по модулю меньше 1,
Глава 10. SRT-деление
87
то применение неполного сложения к старшим двум разрядам чи-
сел 2и, 2v, d" выглядит следующим образом (штрихи опускаем):
Uo U-1. U-2 ...
Vq V-]. V-2 ...
do do. cLi ...
I Sl So- S-I ...
P2P1P0- P-l •••
Очевидно, разряд рг нельзя игнорировать, только если рг — I,
Pi = 0 (при р2 = 0 и р2 = Pi = I очевидно Р2Р\Ро-* = PiPo-*),
а тогда 2р < -4 4- 1 + 1 = -2. Так как сумма 2р 4- з, равная
очередному числу Zj, по модулю меньше 1, то это возможно лишь
при Si = 0, so = 1 (тогда 2 > з > 1) и ро = 1 (потому что при
Ро = 0 выполняется неравенство 2р < -4 4- 1 = -3 и 2р 4- з < -1
независимо от в). Но тогда
РгР1Ро.* 4- S]So.* = 101.* + 01.* = 110.* = 10.* < —1,
что невозможно, или
Р2Р1Р0-* + StS0.* = 101.* 4~ 01.* = 111.* = 1.* = Ро.* + So.*,
поэтому в этом случае в числах 2р и з можно игнорировать два
старших разряда, и полученные числа U, V будут как и исходные
иметь только один разряд в целой части (знаковый). Рассмотрим
теперь случай, когда рг = 0. Так как 2р 4- s = PiPo-* + 3|3о.*
по модулю меньше 1, то если з,р 0, имеем з = 00.*, р = 00.*
(иначе 2р4- з > 1), если з,р < 0, имеем з = И.*, р = 11.* (иначе
2р 4- з < -1, поэтому в обоих случаях 2р 4- з = pip0.* 4- 3|30.* =
= Po.*4-sq.*, следовательно в обоих числах можно оставить только
по одному разряду в целой части. Если же рз < 0, то возможны
только варианты pj = 1, si = 0 или pi =0, si — 1. Равенство
Р2 = 0 возможно лишь при ио 4- ио + do < 1, причем если Si = 0,
тогда и0 = v0 — do = 0, значит, и, v, d 0, откуда 0 < 2р 4- в =
= 2и 4- 2v 4- d < 1, поэтому iz_i = v_i = do = 0, следовательно
«о = 0, pi =0, 2p 4- s = PiPo-* 4- SiSo.* = 0po-* 4- 00.* и так
88
Глава 10. SRT-деление
как 2р + з < 1, то ро = 0, 2р + з = 00.* + 00.* = 0.* + 0.*, т. е.
и в этом случае в обоих числах можно оставить только по одному
разряду в целой части. Если же si = 1, то возможны, например,
следующие варианты неполного сложения:
0 0. 1 ...
+ 0 0. 1 ...
+ 1 1. о...
1 1. о... ’
+
0 О 1. * ...
0 1. * ...
+ 10.*...
+ 0 0. * ...
11.*...’
+
0 0 1. * ...
в которых оставить в числах в, 2р только по одному разряду в це-
лой части без изменения их суммы нельзя. Поэтому в указанном
алгоритме возможно появление чисел, в которых целая часть име-
ет два разряда, что приведет далее к еще большему ее удлинению
(хотя этого и не произошло в приведенном выше примере).
Справиться с этим затруднением можно разными способами.
Один из них заключается в том, чтобы после выполнения оче-
редного неполного сложения в полученных числах 2р и з просто
откинуть все старшие разряды в целой части, кроме самого млад-
шего (который после этого становится знаковым разрядом). Сумма
полученных чисел 2р и з при этом может измениться, но если это
произойдет, то, очевидно, она изменится на целое четное число.
Если же в этой сумме откинуть старший разряд, то полученный
результат по-прежнему будет отличаться от правильного на целое
четное число. Но правильный результат равен Zj и поэтому должен
быть по модулю меньше единицы. В то же время сумма любых
чисел вида *.*... (у которых имеется только один разряд в целой
части, он же знаковый), после того как у нее откинули старший
разряд, тоже имеет вид *.*... и поэтому по модулю меньше еди-
Глава 10. SRT-деление
89
ницы. Так как два числа, по модулю меньшие единицы, разность
которых является целым четным числом, очевидно равны, то при
неполном сложении трех чисел и отбрасывании лишних разрядов
у результата получаем два числа вида *.***, такие, что если их
сложить и получить результат того же вида, проигнорировав пе-
ренос в следующий разряд, то полученный результат в точности
совпадет с числом Zj, которое и должно появиться на очередном
шаге алгоритма. Так, в приведенном выше примере
О 0. 1 ...
+ 0 0. 1 ...
+ 1 1. 0 ...
1 1. 0 ...
+
0 0 1. о...
сумма трех чисел равна 00.***, сумма чисел 11.0*** и 001.0***
будет такой же, а после откидывания, как указано выше, старших
разрядов из этих двух чисел получатся числа 1.0*** и 1.0***, сум-
ма которых будет равна 10.***, но если в ней откинуть старший
(знаковый) разряд, то получим правильный результат 0.***. По-
этому, если внести в алгоритм указанные изменения, то на каждом
его шаге Zj и qj будут вычисляться правильно, а на последнем ша-
ге алгоритма для вычисления (возможно, отрицательного) остатка
нужно будет сложить два полученных на этом шаге числа, но при
этом откинуть (если надо) старший разряд.
Оценим сложность и глубину логической схемы (в базисе
из всех двухместных булевых операций) для деления т-битного
числа на n-битное нормализованное число. Эта схема состоит
из подсхемы, вычисляющей
d' = -d = (l.di... dn)2 + (0.0... 01)2
co сложностью 5n и глубиной log2 п+1, и из т—п+1 выстроенных
друг за другом цепью подсхем Aj, каждая из которых выполняет
неполное сложение двух m-битных Uj, Vj и одного (п + 2) -бит-
ного числа Dj (в числах Uj, Vj откидываются старшие разряды,
как было указано выше, а к числу Dj добавляется старший п + 2
90
Глава 10. SRT-деление
разряд, равный предшествующему разряду, и он становится зна-
ковым разрядом). Для этого вначале из чисел Uj, Vj составляются
два числа, образованные четырьмя старшими разрядами, которые
потом складываются, получается 4-разрядное число Tj (пятый раз-
ряд не может появиться, так как < 1), по трем старшим
разрядам которого ti,to,t-i вычисляются два разряда числа qj.
Сложение двух 4-разрядных чисел
Ui U0. U-! U-2
U1 Ур. г>-1 V-2
tj to- t-l t-1
(без вычисления последнего разряда t-з) можно выполнить сле-
дующей подсхемой сложности 14 и глубины 6: а, — щ Ф
bi = щ & Vi, t_i = а-i Ф b-г, iu_i = a-ib-2 V 6_i, to = ao + w_i,
w0 = <W-i V bp, ti = ai + Wp. Если Wp вычислять по формуле
apa-\b-2 V aob-\ V bp, то получится схема глубины 5 и сложности
16. Поэтому вычисление обоих разрядов числа qj по формулам
9j,o = -'(titpt-i) = -«ti V -.(tot-i), qj,i = ti(-i(tot-i))
одновременно c ti можно выполнить подсхемой сложности 17
и глубины 7 или подсхемой сложности 19 и глубины 6. Далее
подсхема, одновременно вычисляющая Dj и qj, имеет сложность
Зп + 2 + 19 и глубину 7, так как младшие п разрядов можно
вычислить по формуле
Di = d-->ti V diqjtl = d-iti V (di-i(tot-i))ti,
a
-i(tot-i) = ~>((a_j Ф b-2)(ap Ф b-i))
вычисляется с глубиной 4. Подсхема Aj теперь может быть по-
лучена из построенной подсхемы добавлением п + 2 параллельно
расположенных подсхем сложности 5 и глубины 3, осуществляю-
щих неполное сложение чисел Uj, Vj, Dj. Каждому разряду числа
Глава 10. SRT-деление
91
Dj соответствует одна такая подсхема. Заметим, что в подсхе-
мах, соответствующих четырем старшим разрядам, можно выбро-
сить 7 элементов, вычисляющих попарные суммы и произведе-
ния старших разрядов чисел Uj, Vj, так как они уже есть в под-
схеме, выполняющей сложение старших четырех разрядов этих
чисел. Заметим еще, что у первой подсхемы Aj глубина будет
равна 21og2 п 4- 1 4- 2 4- 3, так как глубина подсхемы, вычисля-
ющей d' равна 21og2n 4- 1. У каждой следующей подсхемы Aj
глубина увеличивается на 9, потому что глубина входов Dj рав-
на 7, глубина входов Uj, Vj равна 0 (в каждой подсхеме, вы-
числяющей pi — UiVi V © Vi)di, Si — (щ © Vi) © di), глубина
входов di увеличивается на 2. Сложность каждой подсхемы Aj
равна Зп 4- 21 4- 5п 4- 3 = 8п + 24. Выходы последней подсхемы
Am_n+i подаются на входы сумматора (п 4- 2)-разрядных чисел
(на его выходе получается остаток zm+i-n G [-d, d), являющийся
(n4-2)-разрядным числом). Сложность этой схемы равна 9(п + 2),
а глубина 2 log2(n 4- 2) 4-1. Частное получается в виде числа
(9о,19о,о)-(91,191,о) • • • (9m-n,l, 9m-n,o)>
состоящего из цифр -1,0,1, записанных в виде пар двоичных
разрядов. Если в этом числе заменить отрицательные единицы
на обычные нули, а положительные единицы и нули на обычные
единицы и нули, то получится число с обычной двоичной записью
(Ь90,1)&90,0> (^91,1) & 91,0, •••, (->9m-n,l) &9ш-п,о)2,
а если заменить положительные единицы на нули, а отрицатель-
ные единицы на обычные единицы, то получится число с обычной
двоичной записью
(9од & 9о,о, 91,1 & 91,0, • • •, 9m-n,l & 9m-n,о)2-
Для перевода числа Q в обычную двоичную запись достаточно
из первого числа вычесть второе. Для этого используем схему для
вычитания (пг - п 4-1)-разрядных чисел. С учетом необходимости
предварительного вычисления 2(т - п) конъюнкций сложность
92
Глава 10. SRT-деление
этой схемы равна ll(m - п + 1) (переноса в {т - п + 2)-й раз-
ряд не возникает), а глубина цепи схем Aj после присоединения
соответствующих их выходов qj к входам указанной схемы вы-
читания увеличится на 21og2(m — п + 1). Если остаток zm+\_n
отрицательный (т. е. его знаковый разряд zm+i-n>\ — 1), то его
превращаем в неотрицательный, прибавляя dzm+i-nii, для чего
используем схему сложения (п + 2)-разрядных чисел. Ее слож-
ность равна 10(п + 2) (переноса в (п + 3)-й разряд не возникает),
d глубина этой схемы не больше 2 log2(n + 2). Для исправления
частного к нему надо прибавить число гт+]_п>] (фактически эта
операция выполняется только в случае отрицательного остатка
Zm+i-n), что еще увеличивает сложность схемы на 5(п + 2), а глу-
бину на 1 + log2(n + 2). Заметим, что глубина выходов, на которых
реализуется частное Q, меньше, чем глубина выходов, на кото-
рых реализуется остаток. Поэтому вся схема деления имеет слож-
ность (m + 1 - п)(8п + 35) + 24(п + 2) и глубину не больше
9{тп + 1 - п) + 5 log2(n + 2).
Глубину схемы деления можно уменьшить до 8(m + 1 - п) +
+5 log2(n+2), если схемы Aj построить следующим образом. Вме-
сто вычисления Zj+i = 2zj — dqj = 2(Uj + Vj) - dqj параллельно
вычисляем 2Sj + Pj = 2(Uj + Vj) - d, 2<Sj + Pj = 2(Uj + Vj) + d,
2Sj + Pj = 2{Uj + Vj) с помощью двух схем неполного сложения
со сложностью 8(п + 2) и глубиной 3 (в схемах неполного сложе-
ния имеется 2(п + 2) общих элементов, вычисляющих попарные
суммы и произведения одноименных разрядов чисел Uj, Vj, а вы-
числение Sj = Uj, Pj = 2Vj делается бесплатно). Потом выбираем
из полученных трех пар чисел правильную пару по формулам
Sj-'to V Sjqjti V Sj->qjfl — Sj~>to V tf)(Sj->(t-\t-2) V Sj(t_]t_2)),
Pj-to V to (^^(t-it-z) V Pjtt-it-i)).
Сложность этих вычислений равна 6m 4- 19 (одновременно вы-
числяются qjfi, qjj), а глубина 8 (так как глубина t_jt_2 равна 4,
а глубина Pj, Pj, Pj, Sj, S?j, Sj не больше трех). Окончательно име-
ем, что глубина указанной реализации схемы Aj равна 8, а слож-
ность 8(п + 2) + 6m + 19. Поэтому сложность всей схемы деления
Глава 10. SRT-деление
93
равна (т +1 - п)(8п+6т+46) + 24(п+2). Например, для деления
16-разрядного числа на 8-разрядное получаем схему сложности
не более 2094 и глубины не более 92. Если же делить 64-разряд-
ное число на 32-разрядное, то сложность схемы будет 23454.
Задача 27. Докажите, что если не стремиться минимизировать глу-
бину и воспользоваться упрощенным алгоритмом SRT-деления, то для
его реализации можно построить схему сложности 7(т - п)п + О(п).
Глубина при этом будет равна О((т - п) log2 п).
Так как глубина схемы деления оказалась, как видим, очень
большой, то обычно такие схемы делают многотактовыми, т. е.
работающими как конечные автоматы, а не как чисто логиче-
ские схемы. Для того, чтобы уменьшить число тактов применяют
SRT-алгоритмы, использущие представление чисел не в двоичной,
а четверичной или восьмеричной системе. Алгоритмы при этом
становятся более изощренными, так как усложняется процедура
вычисления очередной цифры частного. Именно при использова-
нии четверичного SRT-алгоритма фирма «Интел» допустила свой
знаменитый баг в одной из ранних версий процессора «Пентиум».
Глава 11
Быстрое деление многочленов
Все следует сделать настолько простым,
насколько это возможно, но не проще.
Альберт Эйнштейн
(цитируется по книге Джона Бентли
«Жемчужины программирования»)
Здесь будет показано, что деление можно выполнять с той же
по порядку сложностью, что и умножение. Впервые это было сде-
лано немецким математиком Фолкером Штрассеном в 70-е гг.
XX века. Мы приведем другое доказательство, которое далее почти
дословно будет перенесено и на случай деления многозначных чисел.
Обозначим Do(m, п) наименьшее количество арифметиче-
ских операций над числами, требующихся для нахождения не-
полного частного при делении многочлена степени не выше т
на многочлен степени п, а через D(m, п) — сложность деления
этих многочленов, в которую включается также сложность нахо-
ждения остатка от деления и произведения неполного частного
на делитель. Очевидно, что при т п обе эти величины равны
нулю. Далее для удобства изменим определение М(п, т), заменив
его на М(п + 1, т + 1), т. е. обозначим М(т, п) сложность умно-
жения двух многочленов степеней тип соответственно.
Д ля любых двух многочленов р(х) и д(ж) обозначим [p(o:)/g(a?)J
целую часть рациональной функции p(x)/q(x), т. е. неполное част-
ное при делении р(х) на q(x). Дробную часть этой функции,
т. е. разность p(x)/q{x) - Lp(»)/q(®)J , обозначим {p(x)/q(x)}. То-
гда остаток от деления р(х) на q(x) равен числителю последней
дроби, т. е. q(x){p(x)/q(x)}.
Глава 11. Быстрое деление многочленов
95
Нашей целью является доказательство следующих теорем.
Пусть М(п) обозначает любую функцию, такую, что
М(п) М(п)
Теорема 15. при п > 1 справедливы неравенства
D(2n, n) < D(2n, п) < 5М(п) + Зп + 2 log2 п.
Теорема 16. При т^2п справедлива оценка
D(m, п) <------+ ЗМ(п) + т + 4п,
п
а при п -> оо и предположении, что М(п)/п ~+ оо, справед-
ливо асимптотическое неравенство
D(m, п) < 2тМ(п)/п.
При п < т < 2п справедлива оценка
н
т — п
D(mt п) <
М(т - п) +
+ 4М(т — п) 4- Зп + (т — п) + о(т - п),
а при условиях т - п -ч оо, (т - п)/п ч 0 и предположении,
что М(п)/п чоо и М(п)/п = о(п), справедливо асимптоти-
ческое неравенство
D(mt п) < пМ(т — n)/(m ~ п).
Доказательства теорем занимают несколько строк и будут
приведены в конце раздела. Но предварительно придется дока-
Далее иногда будем пользоваться стандартным обозначением: f = о(д), если
f/g стремится к нулю (при выполнении указанных в контексте условий, например
при стремлении некоторого параметра к бесконечности).
96
Глава 11. Быстрое деление многочленов
зать несколько лемм. Заметим, что для получения оценок вида
D(m, ri) = О(тМ(п)/п) леммы 17, 22-24 и 26 не нужны, не нужно
последнее равенство в лемме 20, а леммы 21 и 25 нужны в упро-
щенном и ослабленном виде.
Задача 28. Докажите, что если определить D(m, п), не требуя вы-
числения произведения неполного частного на делитель, то слож-
ность уменьшается не более чем на п.
Указание. Для нахождения произведения неполного частного на делитель
достаточно вычесть из делимого остаток.
Лемма 11. При т^п справедливо неравенство
D(m, ri) Do(m, п) + М(т - п, п) + п.
Доказательство. Для нахождения остатка воспользуемся равен-
ством г = / - д L//gJ и тем фактом, что при вычитании все члены
со степенями не ниже n-й сокращаются, поэтому для вычисления
остатка достаточно найти разности п младших коэффициентов. □
Лемма 12. При тп п справедливо неравенство
В "ml \ mD(2n,ri)
— — 1 ) <-----------.
п / п
Доказательство. Представим многочлен степени m в виде
/о + /1ЖП + ... + fkxnk,
где k = \m/n\ - 1 и степени многочленов меньше п (у Д
степень может быть равна п), и, пользуясь тождеством
/ = /о + /1®п + ... + fkXnk = f + hkgxn{k~l} =
= (/о + М" + • • + fk-2Xn{k~2) + rkxn^) + hkgxn^,
где hk = [(fkxn + /*-i)/5j — частное, a rk = fkxn + fk-i - ghk —
остаток от деления fkxn + Д-i на g, сведем деление f на д к де-
Глава 11. Быстрое деление многочленов
97
лению f на д и получим неравенство
D(m, п) D(nk 4- п, n) < D(nk, п) + D(2n, п),
из которого индукцией получаем неравенство
D(m, п) D(nk + п, п) kD(2n, п) =
т
п
= D(2n, п)
< —D(2n, п).
п
- 1
Для обоснования последнего неравенства применяем следующую
далее лемму 19. Лемма доказана. □
Обозначим R(m, п) наименьшее количество арифметических
операций над числами, требующихся для нахождения неполного
частного при делении многочлена хт на произвольный многочлен
степени п. Очевидно, что
R(m, n) D(m, п).
Правильной дробью назовем дробь, у которой степень числителя
меньше степени знаменателя, а полуправильной — дробь, у кото-
рой степень числителя не больше степени знаменателя. Очевидно,
полуправильная дробь есть сумма правильной дроби и константы.
Лемма 13. Сумма правильных дробей — правильная дробь,
а сумма полуправильных — полуправильная. Произведение
полуправильных дробей — полуправильная дробь, а произ-
ведение правильной на полуправильную —- правильная дробь.
Любая дробь однозначным образом представляется в виде сум-
мы целого многочлена и правильной дроби.
Доказательство. Доказательство первых четырех утверждений лег-
ко получается с помощью того факта, что степень произведения
многочленов равна сумме их степеней. Последнее утверждение
следует из того, что многочлен может совпадать с правильной
дробью, лишь когда он равен нулю. □
98
Глава 11. Быстрое деление многочленов
Лемма 14. Сумма дробных частей нескольких рациональных
функций равна дробной части их суммы, и то же самое верно
для суммы их целых частей. В частности, целый многочлен
можно выносить за знак целой части при суммировании.
Доказательство обоих утверждений легко получается с помо-
щью первого и последнего утверждений предыдущей леммы.
Лемма 15. Для любой рациональной функции R и любой
полуправильной дроби R справедливо равенство
U?iia2JJ = UW
Доказательство. Согласно леммам 13 и 14 справедливо равенство
= L^i(L^2]-b{/?2})J = [Bi|fl2J = [Я1 №JJ. □
Лемма 16. Для любого многочлена / степени тп > п деление
на многочлен хп осуществляется бесплатно, т. е. не требует
выполнения арифметических операций.
Доказательство. Действительно, если f = amxm + ... + а0, то
f „ п I , _ П ( f [ „ _ | . „ I—I
— сЬщХ + • • • ”Ь Offii 1 «г — । • • • т“ cto* I—I
xn J t x J
Лемма 17. При m > k сложность вычисления k4-1 старшего
коэффициента в произведении многочленов степеней тип
не превосходит величины М(к, п).
Доказательство. Воспользуемся вытекающим из леммы 15 тож-
деством
fg
f 9
дртп—~к
Глава 11. Быстрое деление многочленов
99
где степени многочленов / и д равны тип соответственно.
Согласно предыдущей лемме для нахождения (к 4- 1)-го старше-
го коэффициента в произведении многочленов fug достаточно
вычислить левую часть этого тождества. В силу той же леммы мно-
гочлен \J/xm~k\ вычисляется бесплатно, и для вычисления правой
части тождества достаточно выполнить умножение многочленов
степеней п и к, на что требуется не более М(к, п) арифметических
операций. □
Лемма 18. При m > п справедливо неравенство
Do(m, и) < R(m, п) + М(т - п).
Доказательство. Воспользуемся вытекающим из леммы 15 тож-
деством
/ = J_
хт [ д
\хт/д\
хт
где степени многочленов fug равны тип соответственно.
Далее применяем лемму 17 при к=т-п для оценки сложности
вычисления к старших коэффициентов произведения [f [хт/д] J,
т.е. if/xm[xm/gM. □
Лемма 19. Функция М(п, т) монотонна по обеим перемен-
ным, a D(m, п) и 7?(т, п) — только по первой.
Доказательство. Первые два утверждения следуют из того, что
при формальном добавлении к сомножителям старших членов
с нулевыми коэффициентами произведение не меняется, и при
добавлении к делимому старших членов с нулевыми коэффици-
ентами частное и остаток тоже не меняются, так как коэффициен-
ты частного и остатка выражаются в виде рациональных функций
от коэффициентов делимого и делителя со знаменателями, являю-
щимися степенями старшего коэффициента делителя. Последнее
100
Глава 11. Быстрое деление многочленов
утверждение следует из тождества
хт _ [хп+т/д\
. 9 J L хп J ’
вытекающего из леммы 15 и леммы 16. Немонотонность по вто-
рому аргументу следует из того, что при т < п очевидно
D(m, п) = 0. □
Следующая лемма является основой алгоритма быстрого де-
ления.
Лемма 20. Пусть многочлен Рк = [хк+п/дJ, где д — за-
данный многочлен степени п со старшим коэффициентом а,
а следующим коэффициентом — Ъ. Тогда Pi (ж) = а~1х — а~2Ь,
к"ХРк ~
жп-1
Р1к = 2>хкРк-
Рк9
хп
Доказательство. Первое равенство проверяется непосредственно,
так как многочлен
жп+1 - Р\(х)д = xn+i - (a~lx - a~2b)(anx + Ь"-1ж + ... + с)
имеет степень меньше п, что становится очевидным после рас-
крытия скобок, и значит, он является остатком при делении жп+1
на д. Для доказательства второго равенства заметим, что
Рьд = хк+п - дт,
где
так как
Pk + r =
учтем, что степень многочлена дг не выше п-1, и выведем с по-
мощью лемм 14 и 15 равенства
Глава 11. Быстрое деление многочленов
101
Pkxk+i -
Рк9Г = рк+1_ ^дг
„п-l к „п—\
tJb vlf
„к+п
д хп 1 _
из которых, согласно лемме 14, немедленно следует равенство
2-хк+хРк-
Рк9
хп~1
= 2 • хк+1Рк - Ркхк+' + |ж*+1г| =
= Ркхк+' + |/+'rj = \РкХк+' +?+,г] =
Последнее равенство леммы доказывается совершенно анало-
гично. □
Лемма 21. Положим для краткости Rk — R(n + к, ri). Тогда
при любом к справедлива оценка
к
2
Rk -Rifc/2j + М
к
+ Af(fc) + 2 - +2.
Доказательство. Рассмотрим случай нечетного к. Применяя лем-
мы 20 и 16, получаем неравенство
Далее при 2 [fc/2j < п воспользуемся леммами 17 и 16 и заметим,
что для вычисления [-Pjfc/zjfl/®"-1 J достаточно найти 2[к/2] + 2
102
Глава 11. Быстрое деление многочленов
старших коэффициента произведения Р\к/2\9> что можно сделать
со сложностью
м(1 +1, 2 )
\ L2J L2J /
М(к).
В случае четного к последняя оценка заменяется на
= М(к).
м(г -
\ L2
Заметим, что оценка
Rk < -R[fc/2J + О(М(к))
доказывается совсем просто, при этом не требуется лемма 17 и
в силу леммы 19 достаточно рассмотреть случай нечетного к. □
Лемма 22. При любом действительном х и натуральном п
х _ [ж]
_nj L n J
Доказательство. Действительно, [x/nj — это количество чисел на
отрезке от 0 до х, кратных п. Но на отрезке от 0 до [ж] лежит
такое же количество этих чисел. Случай отрицательного х сводится
к случаю положительного с помощью тождества |_-ж] = - [ж] -1. □
Лемма 23. Положим
LfcJ*=LWi-iJr LfcJi =
m = Llog2 fcj,
и обозначим v(k) сумму всех цифр двоичной позиционной
записи числа к. Тогда
m m
i=l i=l
= к -
Глава 11. Быстрое деление многочленов
103
Доказательство. Сначала индукцией по г с помощью предыду-
щей леммы проверяем, что
1ЛП = LlAN-di =
Lfc/y-1]
2
fc/2’-1 _ k
2 J “ [2{
Потом применяем индукцию по m и проверяем, что в случае
четного к имеем и(к) — и(к/2) и
к к 1 m
= _ + _ 1 =k-v(k),
а в случае нечетного к имеем
m
m
к = 2
к
к
2
к
+ 1,
m
8=1 8=1
8=2
m
= 2
к
2
LV2J
m-1
i—2
/ к
2
2>-l
8=1
W\
2i
к
= 2 - — и(к) + 1 = к = к - и(к).
— v
Лемма 24. Справедливо неравенство М(2п, п) 2М(п) + п.
Доказательство. Доказательство основано на тождестве
(fixn + fo)g = figxn + fog,
где многочлены f\ и д имеют степени п, а /о — степень п - 1. □
104
Глава 11. Быстрое деление многочленов
Лемма 25. Справедливо неравенство
Rk 3M(fc) + 2к 4- 2[log2 к\ - 2и(к),
и, в частности, при к = 2s - I справедливо неравенство
Rk 3M(fc) + 2к - 2.
При любых тип, таких, что т > п, справедливо неравенство
R(m, п) < ЗМ(тп - n) + 2(т - п) + 2 log2(m - п).
Доказательство. Из лемм 21 и 23 вытекают неравенства
RWi_l-RWi^M([k\i) + M(2[k\i)+2[k\i + 2,
где [fcji = [fc/2*J, 0 i m. Складывая их и пользуясь неравен-
ствами
M(LfcJi) с M(LfcJi) 2“‘М(2ЧШ 2-<M(fc), М(1) Я(1)
и соотношениями леммы 23, получаем, что
Rk 3M(fc) + 2к - 2i/(A) + 2[log2 JfeJ.
Последнее неравенство леммы немедленно следует из первого.
Заметим, что равенство Rk = O(M(fc)) доказывается при к =
= 2s - 1 совсем просто, без использования леммы 23 и с помощью
упрощенного варианта леммы 21. Применяя лемму 19, получаем
это равенство без всяких ограничений на к. □
Лемма 26. При тп 2п справедлива оценка
2тпМ(п)
D(m, ri) <------------------ + ЗМ(п) + тп + 4п,
а при п -» оо и предположении, что М(п)/п -> оо, справед-
ливо асимптотическое неравенство
Глава 11. Быстрое деление многочленов
105
Доказательство. Повторяя доказательство леммы 12, заметим,
что неравенство
D(m, п) D(nk + п, п) D(nk, п) 4- D(2n, п)
можно, применяя леммы 11 и 18, заменить на неравенство
D(m, п) < D(nk + п, п) D(nk, ri) 4- R(2n, ri) 4- 2М(п) 4- п,
из которого по индукции можно вывести неравенство
D(m, ri) D(nk 4- п, ri) R(2n, ri) 4- к(2М(п) 4- п),
если заметить, что процедура вычисления [х2п/д], имеющая слож-
ность R(2n, ri), выполняется только один раз. Подставляя [m/n] - 1
вместо к и оценивая R(2n, ri) с помощью леммы 25 имеем
D(m, п)< ЗМ(п) + 2
+1 )n4-21og2n^
. . 2mM(ri)
3M(n) -I------- 4- т 4- 2п 4- 2 log2 п,
откуда и следует первое неравенство леммы. Второе неравенство
очевидно следует из первого. Лемма доказана.
Заметим, что при больших т неравенство леммы точнее, чем
оценка, которую можно получить из теоремы 15 и леммы 12. На-
пример, применяя оценку Карацубы, из леммы 26 можно вывести
асимптотическое неравенство
D(m, n) < ^mn1O8^3/2\
Очевидно, эта оценка при больших п точнее, чем оценка слож-
ности школьного алгоритма, и всего лишь асимптотически в два
раза хуже, чем аналогичная оценка сложности умножения много-
членов. □
Доказательство теоремы 15. Применяя леммы 11, 18, 24 и 25,
имеем
Р(2п, п) < £>о(2п, n) 4- M(n) 4- п M(ri)4-п+R(2n, п) 4- М(2п, п)
ЗМ (п) 4- ЗМ(п) 4- 4п 4- 2 log2 п.
106
Глава 11. Быстрое деление многочленов
Остается заметить, что log2 п < п, так как при п = 1 и п = 2 это
верно, а производная log2 х равна 1 /(хIn2) < 2/ж 1 при х 2.0
Заметим, что с помощью упрощенного варианта леммы 25
получается равенство D(2n,n) = 0(М(п)).
Доказательство теоремы 16. Применяя леммы И, 12, 18, 25, 26
и теорему 12, имеем при m 2п неравенство
. . 2mM(n)
D(m, п) <--------- + 3M(n) + m + 4п,
п
а при п m < 2п имеем неравенство
п
т — п
D(m, п) <
M(m-n)4-4M(m-n)+3n+(m-n)+o(ni-n).
Последнее утверждение теоремы 16 немедленно следует из до-
казанного.
Равенство D(m, п) = О(тпМ(п)/п) вытекает из упрощенного
варианта теоремы 15. □
Если т>п1лт-п = о(п), то из теоремы 16 и теоремы
Карацубы вытекает асимптотическая оценка
Z>(m, п) < т - п = 0(п(т - п)'082^),
т — п
которая очевидно точнее, чем оценка сложности школьного алго-
ритма деления многочленов.
Глава 12
Быстрое деление чисел
Натуральные числа придумал Господь Бог.
Все остальное — дело рук человеческих.
Леопольд Кронекер ’’
Результаты этого раздела во многом аналогичны результа-
там предыдущего. Для простоты рассматриваем алгоритм деле-
ния только в двоичной системе счисления. 1лавная идея, лежа-
щая в основе этого алгоритма, заключается в применении метода
Ньютона, который обычно используется для приближенного ре-
шения уравнений. Хотя придумать алгоритм быстрого деления мог
и Ньютон, но в реальности он был открыт только в 60-е гг. XX века
(вероятно, впервые он был изложен в диссертации американского
математика Стивена Кука в 60-е гг. XX века).
Теорема 17. При т > 2п справедлива оценка
, 2тпМ(п) .
D(m, п) <-------- + ЗМ(п) + О(тп),
а при п -» оо и предположении, что М(п)/п оо, справед-
ливо асимптотическое неравенство
ц(т,п) <52^
и
При т = 2п справедлива оценка
D(2n, п) < 5М(п) + О(п).
Леопольд Кронекер (1823-1891) — выдающийся немецкий математик, спе-
циалист по алгебре и теории чисел.
108
Глава 12. Быстрое деление чисел
Теорема 18. При п < т < 2п справедлива оценка
. . nM(m - п) .
D(m, ri) С--------- + 4ЬС(т - п) 4- О(п),
а при условиях т - п -> оо, (т - п)/п -> 0 и предположении,
что М(п)/п ->оо и М(п)/п = о(п), справедливо асимптоти-
ческое неравенство
„, ч _ пМ(т - п)
D(m,ri) <----------
т — п
Стивен Кук
Доказательства теорем бу-
дут приведены в конце раздела.
Для доказательства понадобит-
ся ряд лемм. Отметим, что лем-
ма 33, последнее неравенство
леммы 28 и неравенства лем-
мы 31 в нем не используются.
Однако они нужны для более
простого доказательства менее
точной оценки
. /тМ(п)\
D(m, л) = 01----),
\ п /
в котором в свою очередь не ис-
пользуются первые неравенства
леммы 28 и применяются упрощенные варианты лемм 29-32. Да-
лее обозначаем {ж} ближайшее целое к числу х, причем при
целом п полагаем
= п 4- 1,
а вместо [2пх]2 п пишем хп. Легко проверить, что
—п
2
Глава 12. Быстрое деление чисел
109
а хп записывается двоичной дробью не более чем с п знаками
после запятой.
Лемма 27. Пусть q — произвольное заданное число, 1/2 <
q < 1, a zk = zk -i-Zfc.o, 4i • • zk,k — двоичная ^-разрядная
дробь, такая, что
zk 2 .
11Ж
I < q < I И Z2k-i = {(2zk - g2fc+24)22fc~,}2,“2fe.
Докажите, что
WiiWifiiilM
^2fc-l-----
q
2~2fc-j-l
1 z2fc-i 2
и Z2fc-i — двоичная (2k — 1)-разрядная дробь.
Доказательство. Положим z'2k_\ = 2zk - q2k+2zk, тогда
О < 4_1 - 2zk + qzk = (q- q2k+2)z2k 2~2k~2 4 = 4~k.
Так как
|1 ~ qzk\ C 2~kq,
то
л 1 Ъ -L “ qZk^ д~кл <г д~к
О С---2zk + qzk — —-------С 4 q с 4 ,
q q
поэтому
4-1-^ ^4“*
В силу неравенства <72^4-2 1/2 имеем
J _ п л. < л, _ 4 _ , _ (2 - *кУ
z2k-\ ~ 2-Zk q2k+2zk *,Zk — 2 2.
Отсюда и из соотношения
14-1 ~ ^2Л-1| = |4-1 _ {4-122* 1 }2* 2fe| < 4 к
110
Глава 12. Быстрое деление чисел
следует, что
*2*-i = {4t-i22fc ’}2' 2Ч 2,
Неравенство^-! 1 вытекает из предыдущего неравенства. Лем-
ма доказана.
Обозначим Rk наименьшее количество операций над числами
О и 1, требующихся для нахождения двоичной fc-разрядной дроби
Zk = Zk-iZkfi, Zk,i . . • Zktk, 1 Zk 2,
такой, что
Zk----C 2 ,
9
где q — заданная двоичная дробь, 1/2 q< 1, a M(n) — любая мо-
нотонно неубывающая функция, удовлетворяющая соотношениям
М(п) М(п)
Лемма 28. Справедливы неравенства
М(п 4-1) M(n) 4- 7п - 1,
Af(2n, n) 2Af(n) 4- Зп - 1.
Доказательство. Для доказательства первого неравенства восполь-
зуемся тождеством
(2uj + «о)(2г>1 + v0) = 4i£]Vi 4- 2(uiU0 4- viito) 4- UovQ,
где щ и vj — n-разрядные числа, a uq и «о — просто нули или
единицы, и заметим, что для вычисления 2(uiv0 4- V|Uo) 4- uoVq
достаточно п + п + 2п— 14-1 = 4п операций, а для вычисления
4iZ| V| 4- 2(u]Vo 4- Vi«o) 4- WqVo — еще M(n) 4- Зп - 1 операция. Для
Глава 12. Быстрое деление чисел
111
доказательства второго неравенства воспользуемся тождеством
(2nU] + uo)vo = 2nuiv0 + wo^o,
где tii, «о и Wq — n-разрядные числа, и заметим, что вычисление
суммы требует всего лишь Зп — 1 операцию, если произведения
уже готовы. □
Лемма 29. При к 3 справедливы неравенства
к
.2,
к
С -R[js/2j4-i “I" М ( — +1 ) +М(к) +17&+ 22.
\ J
Rk + М
\ X Jq \
+ 2 1 +М(2 - +4 ) +7
к
Л
Доказательство. Пусть к = 2 s - 1 или 2s - 2, тогда s = [fc/2j + 1.
Обозначим za такую s-разрядную дробь, что для ее вычисления
требуется не более Ra операций и
1
zs - -
9
2“*.
Пользуясь леммой 27, получаем, что число
z2^ = {2za-qwz^-'2^s
удовлетворяет неравенству
1
^2в-1 - “
q
।—2s4-1 <
и для его вычисления достаточно M(s + 1) + М(2з + 2) + 7s + 5
операций. Действительно, можно считать, что za / 2 (иначе во-
обще не требуется умножений), поэтому для возведения в квадрат
нужно M(s+ 1) операций, для умножения <?2в+2 на za достаточно
М(2з + 2) операций, для вычисления (2za - <72s+2Ze)22e-1 доста-
точны 5s + 4 операции, и для нахождения гга~\ нужна еще 2s + 1
112
Глава 12. Быстрое деление чисел
операция. Остается применить предыдущую лемму. Заметим, что
неравенство
Rk -R[fc/2j+i + О(М(к))
доказывается проще и без использования леммы 28. □
Лемма 30. Справедливо неравенство Rk < ЗМ(А) + 466.
Доказательство. Положим
(Ah = LlAh-iJ,.
7П = [10g2 6].
С помощью леммы 22 докажем по индукции равенство
[k]i =
к-2
2i
+ 2.
Из предыдущей леммы следует, что
м( 1ЛЬ) + м(1ЛЬ-1) + 17L*jt + 22, О i < m.
Сложим их и воспользуемся неравенствами
+б|ЛЬ-п^
2“*М(6) + 6 (Al i - 11, 3 > R(2) = Я([6]т),
первое из которых вытекает из леммы 28, а последнее — из того,
что
1
о, 1?2?з + <^/8
1
4
при любых qi = 0 или 1, О С 6 С 1 и
*1 = 1-92, *2 = тах(?2,(1 ~9з))-
Отсюда, используя лемму 23, получаем, что
Rk < ЗМ(6) + 466.
Глава 12. Быстрое деление чисел
113
Заметим, что при к = 2s + 1 равенство Rk = O(M(fc)) дока-
зывается проще, без использования лемм 22 и 23 и при помощи
ослабленного варианта предыдущей леммы и оценки R(2) = 0(1).
Обозначим R(m,ri) наименьшее количество операций над чис-
лами 0 и 1, требующихся для нахождения [2m~l/Q\, где Q —
произвольное двоичное n-разрядное число,
Q = ^2ian-i,
aj = 0 или 1, ап_! = 1.
Лемма 31. При fc > 1
R(k + n,ri) Rk + М(к, ri) + 2k,
а при т > п
R(m, n) ЗМ(т - п) + М(т -п,п) + 48(тп - п).
Доказательство. Действительно, если при q = 2~nQ
а так как Q не степень двойки, то 2n+k~]/Q не является конеч-
ной двоичной дробью, поэтому целое число [2n+*-1/QJ равно
2fc-1Zfc_i либо 2k~'zk-\ - 1. Число Zk-i находится со сложностью
Rk-\. Сравнивая 2*-I^_iQ с 2п+к~1, находим [2n+fc-l/QJ точно.
Для этого нужны дополнительные М(к, п) + 2к операции. По-
следнее неравенство леммы вытекает из первого и предыдущей
леммы. Заметим, что менее точное равенство R(m, ri) = 0(М(т))
легко вытекает из упрощенного варианта леммы 30 и следующей
114
Глава 12. Быстрое деление чисел
далее леммы 33. Обозначим D(m, п) сложность деления с остат-
ком т -разрядного числа на п -разрядное число и одновременного
вычисления произведения неполного частного на делитель. □
Лемма 32. При т > п справедливы неравенства
D(m, n) R(m, п) + М(т, т-п) + М(п, т-п) + О(т),
D(m, п) 4М(т - п) + М(п, т- п) + 47т - 44п + 7.
Доказательство. Применим леммы 30 и 31 и воспользуемся ра-
венством
где f — m-разрядное, д — п-разрядное двоичные числа, а а = 0
или 1, вытекающим из неравенства
f__j_ 1
9 2m L 9 J
|7П
Для точного вычисления \J/g\ остается найти разность
сравнить ее с числом д и в зависимости от результата, возможно,
прибавить к числу
Л2т/91
2т
единицу. Но таким образом получается лишь оценка
D(m, п) < R(m, п) + М(т, т-п) + М(п, т-п) + О(т).
Чтобы получить лучшую оценку, достаточно вместо числа [2т/д]
< 2m~n+1 взять целое число a = 2kZk (где к = т - п, на вычисле-
ние которого требуется Rk операций), такое, что [2т/д\ равно a
или а - 1. Тогда
Л1т/91 fa <j_<l
' 2т 2т 2т '
Глава 12. Быстрое деление чисел
115
значит,
/о
2т
/ 0_
'ут-к 2*
а
2*
/L2m/Pj
2m
f ±
Qm-k 2fc
2.
На вычисление произведения \_f/2m~k$a достаточно M(k) опера-
ций, так как числа [f/2m~k\ и а являются fc-разрядными, а вы-
числение чисел [//2m-fcJ и b = [и/2т"к]а/2к] делается бесплат-
но. Из доказанных неравенств следует, что [//gj = b + /3, где
(3 = -2,..., 3 и произведение gb равно числу g[f/g\ или отлича-
ется от него на (Зд. Для точного вычисления [f/g\ и g[//gj доста-
точно сравнить gb-f с числами ig, где i = -1,0,1,2, и закончить
доказательство так же, как и выше. Сложность выполнения ука-
занных действий не больше
М(к) + М(п, к) + 3(п + 2) + к + 1
(так как числа ±д, 2д вычисляются бесплатно, а сравнение gb-f
с нулем не нужно, ибо уже сравнили / с gb). Остается применить
лемму 29. □
Лемма 33. Функция М(п, т) монотонна по обеим перемен-
ным, a D(m, п) и R(m, п) — только по первой. При любых
неотрицательных целых т, п,к,з
D(m + к + 8,п + к) D(m, п),
R(m + к + s,n + k) R(m, п)
и, в частности, последовательность D(n), равная по определе-
нию D(2n,n), монотонна.
Доказательство. Первое утверждение следует из того, что при фор-
мальном добавлении к сомножителям старших разрядов с нулевы-
ми цифрами произведение не меняется. Монотонность D(m, п)
116
Глава 12. Быстрое деление чисел
по первому аргументу следует из того, что при добавлении к де-
лимому старших разрядов с нулевыми цифрами частное и остаток
тоже не меняются, так как цифры частного и остатка выражаются
в виде функций алгебры логики от цифр делимого и делителя.
Монотонность R(m, п) по первому аргументу выводится с по-
мощью вытекающего из леммы 22 тождества
LW _ /
. 2 J Ь.
Немонотонность по второму аргументу следует из того, что при
т < п очевидно D(m, ri) = 0. Доказательство неравенства в случае
а = 0 основано на применении очевидных тождеств
,2‘»J LJ’
2 9
J
= 2
/
9
Случай s > 0 сводится к рассмотренному с помощью моно-
тонности D(m, ri) по первому аргументу. □
Задача 29. Докажите неравенства
М(п, т) п + т - 1, D(n, т) п + т - 1.
Указание. Докажите, что произведение и частное двух чисел существенно
зависят от всех их цифр.
Лемма 34. При тп 2п справедливо неравенство
D(m, ri) D(ri)
(тп - l)D(ri)
п
Доказательство. Лемма доказывается аналогично лемме 12. Пред-
ставим тп-разрядное число в виде
/о + /12” + ... + fk2nk,
Глава 12. Быстрое деление чисел
117
где к= [(тп- l)/nj и fi суть n-разрядные числа и, пользуясь тож-
деством
f = /о + /12” + •.. + fk2nk = f + hkg 2n(fc-,) =
= (/о + /12” + ... + /fc-22"(fc-2) + Tfc2n(fc-1)) + hkg 2n(fc-1),
где hk = L(/fc2n + fk-i)/g\ — частное, a rk = /fc2" + fk-\- ghk —
остаток от деления Д2" + fk-\ на д, сведем деление / на д к де-
лению f на д и получим неравенство
D(m, ri) D(nk + n,ri) D(nk, ri) + D(2n, ri),
из которого индукцией получаем неравенство
D(m, ri) D(nk + п, ri) kD(2n, ri) =
= D(2n, ri)
Остается применить лемму 33.
Аналогично лемме 26 доказывается следующая лемма. □
т - 1 т — 1 . .
--- <-----Рп.
п п
Лемма 35. При т^2п справедлива оценка
D(m, ri) < —+ ЗМ(п) + т + 50п + 7,
а при п -> оо и предположении, что М(п)/п -» со, справед-
ливо асимптотическое неравенство
Доказательство. Повторяя доказательство леммы 34, заметим, что
неравенство
D(m, п) D(nk + п, п) < D(nk, п) + D(2n, п)
можно, применяя лемму 32, заменить на неравенство
D(m, n) < D(nk + п,п) D(nk, ri) + Rn + 2M(ri) + 4n + 7,
118
Глава 12. Быстрое деление чисел
из которого по индукции можно вывести неравенство
D(m, n) D(nk + п, п) Rn + к(2М(п) + п),
2п
zn, име-
ющая сложность Лп, выполняется только один раз. Подставляя
[(т - 1)/п] вместо к и оценивая Лп с помощью леммы 30, имеем
т
М(п) +
п
D(m, ri) ЗМ(п) + 2
. 2тМ(п)
ЗМ(п) + -------- + т + 50п,
п
откуда и следует первое неравенство леммы. Второе неравенство
очевидно следует из первого. Лемма доказана.
Заметим, что при больших т, п неравенство леммы асимпто-
тически в 2,5 раза лучше, чем оценка, вытекающая из лемм 32 и 34:
mP(2n>n) . 5mM(n) 7m
£/(771, Т1) —... < ------- + 50771 п--.
П П П
Применяя оценку Карацубы, можно вывести равенство
D(m, ri) = O(mnlog2^).
Очевидно, эта оценка при больших т, п лучше, чем оценка слож-
ности школьного алгоритма. В то же время, если в указанном ал-
горитме деления 2п-разрядного числа на п -разрядное в качестве
алгоритма умножения применить школьный алгоритм, то указан-
ный алгоритм быстрым не будет, так как оценка его сложности
асимптотически в 5 раз выше, чем у школьного алгоритма умно-
жения, в то время как стандартные алгоритмы деления имеют, как
было показано выше, почти такую же сложность, как и стандарт-
ный алгоритм умножения. □
Доказательство теоремы 17. Применяя лемму 32, имеем
D(2n, ri) < 5М(п) + 50п + 7,
Глава 12. Быстрое деление чисел
119
а из леммы 35 при т^2п следует, что
, 2mM(n)
D(m, п) <--------- + ЗМ(п) + т + 50п + 7. □
п
Доказательство теоремы 18. Пользуясь леммой 32 и теоремой 12,
имеем
D(m, п) < 4М(т - п) + М(п, m-ri) + 47т - 37п <
пМ(т-п) ч
<----------L + 4M(m - п) + О(т). □
т — п
Если т>пит-п = о(п), то из теоремы 18 и теоремы
Карацубы вытекает асимптотическая оценка
P(m.n) < nM^n> _ о(п(т - «)**<’">),
которая очевидно лучше, чем оценка сложности школьного алго-
ритма деления чисел.
Оценим сложность полученной схемы для деления 64-раз-
рядного числа на 32-разрядное:
Р(64, 32) 5 • 4924 + 50 • 32 + 7 = 26 227.
Если использовать для умножения 32-разрядных чисел не метод
Карацубы, а школьный метод, то оценка станет равной 31 047. Обе
схемы имеют бблыпую сложность, чем схема SRT-деления, но глу-
бина у второй из них может быть сделана несколько меньше, чем
у схемы SRT. Для деления 128-разрядного числа на 64-разрядное
схема быстрого деления уже будет иметь меньшую сложность, чем
схема SRT-деления, так при удвоении числа разрядов сложность
этой схемы приблизительно утраивается, а сложность SRT-схемы
возрастает в 4 раза.
Для деления чисел близкой друг к другу разрядности указан-
ный быстрый алгоритм более эффективен, например, схема для
деления 40-разрядного числа на 32-разрядное имеет сложность
3328. Схема SRT-деления имеет сложность 5694.
Глава 13
Сравнение сложности умножения,
деления, возведения в квадрат
и извлечения квадратного корня
Будь силен в расчетах, и часу не проводи без
повторения их, ибо математика — наука
свирепая.
Кей-Кавус.
Кабус-Намэ (XI век)
Сначала докажем ряд лемм о сложности операций с много-
членами.
Лемма 36. Пусть для рациональных функций R\ и Ri удво-
енная степень многочлена [ЯгJ не меньше степени многочлена
[.Rj ]. Тогда справедливо равенство
Я1 R\
И J = LX
Доказательство. У рациональной функции Я]/([Яг}Яг) степень
числителя не больше степени знаменателя согласно условию лем-
мы. Действительно, если у рациональной функции Ri степень чис-
лителя равна di, а степень знаменателя равна bi, то у рациональ-
ной функции Я1/([Яг}Яг) степень числителя равна a = ai + bi,
а степень знаменателя равна b — by + аг + аг - bi, а так как
2(аг - Ь2) aj - bi, то а Ъ. Отсюда, применяя лемму 13, выво-
дим, что R\{Ri}/([Ri\Ri) — правильная дробь. Так как
Я] Я] Я] {Яг}
[Яг J Яг [Яг J Яг ’
Глава 13. Сравнение сложности математических операций
121
то согласно лемме 14
R\ R\
[ял J= lx
что и доказывает лемму.
Лемма 37. Для любых многочленов f и д степени п спра-
ведливо тождество
[Z3r,/0j
Доказательство. Достаточно применить лемму 36 при R\ — x3nf,
R? =
Положим для краткости D(n) = D(2n, ri). □
Лемма 38. Справедливо неравенство
M(ri) 2D(ri) + Р(2п).
Доказательство. Применим лемму 37 для вычисления fg. Вычис-
ление x3nf делается бесплатно, деление [х3п/д] делается со слож-
ностью 2D(n) согласно лемме 12, деление \x3nf/|®3n/pJJ выпол-
няется со сложностью D(2ri). □
Лемма 39. При любых неотрицательных целых m,n, k, s спра-
ведливо неравенство
D(m + к + з, п + к) > D(mf п),
и, в частности, последовательность Р(2п, п) монотонна. Ана-
логичное утверждение справедливо для функции R.
Доказательство. В случае s = 0 доказательство основано на при-
менении очевидных тождеств
**/ = f
L5
122
Глава 13. Сравнение сложности математических операций
Случай s > 0 сводится к рассмотренному с помощью леммы 19.
Лемма доказана.
Пусть Д(п) обозначает любую функцию, удовлетворяющую
соотношениям Р(п)<Д(п), д(2п)-? □
Лемма 40. Справедливо неравенство Д(п) > М(п)/4.
Доказательство. Применим лемму 38. Тогда
М(п) 2D(n) + D(2ri) < 4Д(п).
Из леммы 39 вытекает более слабое неравенство М(п) С ЗР(2п).
Далее докажем ряд лемм о сложности вычислений с двоич-
ными числами. □
2-'п~'А
Д23п-'/В]
или 1.
23пА
Лемма 41. Пусть А и В суть n-разрядныс двоичные числа.
Тогда
23”Л
.|23n/BjJ ~АВ’
illilljl
Доказательство. Заметим, что
АВ+ 1 > |23n/Bj АВ’
так как
пЗп \ пЗп
— - 1 ) = А 23п + — - 1 - АВ > А • 23п
В / в
в силу неравенств
пЗп
АВС22п-1^-------------------------------1.
В
Второе неравенство леммы доказывается аналогично. □
(АВ 4-1)
Глава 13. Сравнение сложности математических операций 123
Лемма 42. Справедливы неравенства
D(n + 1) < D(ri) + O(n), М(п + 1) < M(ri) + O(n).
Доказательство. Второе неравенство доказано в лемме 28. Дока-
жем первое неравенство. Пусть f — суть (2п+2) -разрядное, ад —
(п + 1)-разрядное числа. Положим
9 =
/
5
UJ
r = f~qg, qi =
L//4J
. Lp/2J J ’
T] =
~9i
9
2
тогда числа q\ и q\ \_g/2\ вычисляются co сложностью D(n) 4- O(ri),
а значит, и число 2gi g, равное 4g, [5/2 J при четном g и 4gi [<j/2J +2gi
при нечетном g, вычисляется co сложностью D(n)+O(ri). Так как,
согласно лемме 22,
9
2 ’
91 =
. LP/2J
4
то
- 2 < 2q\ - q < - f- + 1 —Д- + 1 < 5
2[0/2j д 2.д[д/2\
значит,
-25 < 2qxg - qg < 5д, -5д < f - 2qxg < Зд.
Сравнивая число /- 2q\g с числами -4д, -Зд,... ,2д, представ-
ляем его в виде зд + г, где з = -5,..., 2, и со сложностью О(п)
находим остаток г и частное q = 2q\ + з. □
Лемма 43. Справедливо неравенство
M(n) 2D(n) + D(2ri) + O(n).
Доказательство. Доказательство немедленно получается, если при-
менить лемму 41, лемму 34 и лемму 42.
Пусть Д(п) обозначает любую функцию, удовлетворяющую
соотношениям
D(ri) < Д(п),
Д(п) 1 Д(п)
Д(2п) 2’ п
124
Глава 13. Сравнение сложности математических операций
Лемма 44. Справедливы неравенства Д(п) > М(п)/4.
Доказательство. Из леммы 43 следует, что
М(п) 2D(ri) + D(2ri) + O(n) < 4Д(п).
Из леммы 33 вытекает более слабое неравенство М(п) 3D(2n).
Обозначим Q(ri) сложность возведения п -разрядного числа
в квадрат. Очевидно, что Q(n) М(п). Такое же обозначение
введем и для сложности возведения в квадрат многочлена п-й
степени. □
Лемма 45. Для случая операций с числами справедливо не-
равенство
M(n)<2Q(n) + 13n + O(l),
а для случая операций с многочленами справедливо неравенство
М(п) < 2Q(n) + 6п + 4.
Доказательство. Доказательство можно получить, используя тож-
дество
(а + Ь)2 - (а - Ь)2
ab =------------------. □
4
Лемма 46. Для любого n-разрядного числа х число
. L24n~7#J - [24«“7(ж + 1)]] ~Х
отличается от х2 не более чем на 3.
Доказательство. Заметим, что
2^п~у 24n-' 24”-1 24п-1
----------- 1 =-------------1 < ------ — -------* <
®(ж + 1) х ш + 1 L х J L® + i.
Глава 13. Сравнение сложности математических операций
125
24п-1
24п-1 24п-1
----7 + 1 = —-------г + 1
х + 1 х(х + 1)
откуда имеем
22п-1
24п-1
X + 1
< 22n+t
24”-1
24п-1
х(х + 1)
24п-1
24”-1
24п-1
24п-1
24п~’
- 1
значит,
х
< х(х + 1) + (х(х + 1))* 221 -4п + (х(х + 1))323-8п <
< х(х + 1) + 3,
и аналогично
24п-1 j
----------- = Х(Х + От— > Ф + 0(1 - «п) >
Z----------1 -г сп
х(х + 1) +
> х(х + 1) - (х(х + 1))22|-4п > х(х + 1) - 2. □
Лемма 47. Для любого многочлена n-й степени f(x) спра-
ведливо тождество
/(х) =
хгп
Доказательство. Если fg = хгп + г, где f,g — многочлены сте-
пени п, а г — многочлен степени меньше п, то
126.
Глава 13. Сравнение сложности математических операций
Лемма 48. Для любого многочлена n-й степени /(ж) спра-
ведливо тождество
х*
Доказательство. Так как
L f J
х4п х4п
/ + 1J - Л/+1)
есть многочлен степени 2п, то согласно лемме 47
™4п
*2 *
' + f= I + i)J.'
Обозначим для краткости R(2n, ri) через R(n). Следующее
утверждение справедливо и для случая чисел, и для случая много-
членов. □
Лемма 49. Справедливо неравенство
Q(ri) < R(4n, 2ri) + 2R(4n, n) + O(ri) < ЗЯ(Зп) + O(ri).
Доказательство. Рассмотрим случай многочленов. Применим лем-
му 48. Вычисление [x4n/f\ и |ж4”/(/ + 1)J выполняется со слож-
ностью 2R(4n, ri) + 1. Разность этих многочленов вычисляется со
сложностью О(п) и является многочленом x4n/[f(J + 1)] степе-
ни 2п. Вычисление /2 + f выполняется со сложностью Л(4п, 2п).
Потом применяется лемма 39.
Числовой вариант леммы доказывается аналогично, только
вместо леммы 48 используется лемма 46, а вместо леммы 30 —
лемма 33. □
Теорема 19. Функции Q(ri), M(ri), D(ri), R(ri) имеют одина-
ковый порядок роста как для чисел, так и для многочленов.
Глава 13. Сравнение сложности математических операций
127
Доказательство. Доказательство немедленно следует из лемм 40,
44, 45, 49 и первых теорем разделов 11, 12. Без лемм 40, 44 можно
обойтись, но они дают более точные оценки.
Определим теперь функцию SQR(n) как сложность вычисле-
ния для любого n-разрядного числа х целой части его арифмети-
ческого квадратного корня. □
Лемма 50. Для любого целого х, 0 х < 2П,
|_л/212п+6 + х 29п+б] = 26п+3 + х 23п+2 - ж2.
Доказательство. Для доказательства достаточно заметить, что
(2бп+3 + х • 23п+2 -х2)2 = 2,2п+б + х • 29п+6 + ж4 - ж3 • 23п+3 <
*ч12п4-6 , /j9n+6
X Я» * Z j
а также, что
/ 1\2
( 26п+3 + ж • 23п+2 - ж2 + - ) =
\ 2/
= 212п+6 + ж • 29п+6 + ж4 - ж3 • 23п+3 + 26п+3 + ж • 23п+2 - ж2 + ^ >
4
> 212п+6 + х . 29п+6 + 26п+3 _ д.3 ; 23п+3 > 2Пп+6 + х . 29r»+6 Q
Лемма 51. Справедливо неравенство
Q(n) < SQR(l2n + 7) + 4п.
Доказательство основывается на лемме 50. □
Лемма 52. Справедливо неравенство
SQR(n) < ЗМ(2п) + О(п).
Доказательство. Для вычисления [\/Х] представим X в виде 4пж,
1/4 ж < 1, и заметим, что = 2nXn, где Хп — двоично-
рациональное приближение л/х с погрешностью не более 2~п.
128
Глава 13. Сравнение сложности математических операций
Для его вычисления применим рекуррентную последователь-
ность
zk(3 - xzfy
zk+i -
и в качестве искомого приближения возьмем xzk, такое, что
\zk-x-^2~k.
Если представить zk в виде (1 + ек)/>/х, где ек — относительная
погрешность приближения, то
1 + Q-н _ О + efc)(3 ~ 0 + 6fc)2)
л/х 2^/х
откуда
-1Л с3
€к+\ = -~!--^, |бь+11 <
при достаточно малом ек- Докажем по индукции, что существует
двоично-рациональная последовательность uk = qk/‘2K, К=2к+4,
такая, что
^-^1^2-*,
и оценим сложность ее вычисления. Очевидно, сложность вы-
числения zo не превосходит некоторой константы С. Для по-
строения itfc+i сначала найдем Wfc+1 = ик(3 - хик)/2 и заметим,
что относительная погрешность ек у/х • 2~К = 2~к, поэтому
Cfc+i 2 • €к 2-2Я+1, откуда следует, что
< «±1 <2-гк+2.
1 у/Х
Оставив в х только т = 2к+] +5 знаков после запятой, заменим х
на хт, тогда |ж - хт\ < 2~т, и для tk+\ = ик(3 - xmUk)/2 имеем
оценку погрешности
|^+1 х | |^fc+i ^fc+d "Ь |^fc+i Я" |
-m-1 2~2К+2 = 2~2К+3
Глава 13. Сравнение сложности математических операций
129
Вычисление хти2к требует не более М(К) + М(т, 2К) операций.
Оставив в числе 3 - xmu2k только т - 1 разрядов из т + 2К,
получим число Sk, такое, что
|о „ -.2 I
|3 2
Тогда fk+i = UkSk/2 удовлетворяет неравенству
|A+i — х 1/2| |Д+1 — | + |tfc+i — х 1/21
< 2—। 2""2ЛГ-|-3 < 2“22t"-4-4
Для вычисления Д+1 достаточно М(К, т - 1) = 2М(2*) + 0(2*)
операций. Округлив Д+1 до т - 1 = 2*+1 + 4 разрядов с сохра-
нением неравенства |Д+] - ж-1/2| 2-2 + ~4, получаем очередной
член последовательности Ufc+i. Сложность его вычисления при
условии предварительного вычисления предыдущего члена после-
довательности Uk оценивается сверху, согласно лемме 28, как
М(К) + М(т, 2К) + М(К, т - 1) = 3M(2fc) + M(2fc+1) + 0(2fc).
Поэтому полная сложность вычисления и*+1 оценивается (как мы
уже не раз делали)
к
ЗМ(2*) + M(2<+1) + 0(2*) < 3M(2*+1) + M(2fc+2) + 0(2fc+1).
i=0
Осталось выбрать к так, чтобы 2к + 2 п > 2к~1 + 2, тогда по
К = (2к + 4)-разрядной двоичной дроби ик, такой, что
|ufc- х-,/2| 2-п~2,
находим (2п + К)-разрядную дробь хик, такую, что
\л/х - < ж|а;~1/2 - Ufc| < 2-"-2.
Оставляя в дроби х только старшие п + 2 разряда, получим
(п+2)-разрядную дробь хп, такую, что |я - ®п| 2-"-2, откуда
для (п + 2 + К) -разрядной дроби xnUk имеем
- >/ж| < |xnUjt -xUkl + \xUk - >/х\ 2~п~2 + 2~п~2 = 2-"-1,
130
Глава 13. Сравнение сложности математических операций
причем произведение xnUk вычисляется со сложностью не более
М(п + 2, К) М(п + 2, 2п - 2)Х 2М(п) + О(п)
и в то же время не более
М(п + 2, К) М(К).
Округляя дробь хпик до п разрядов, получаем нужное нам число
Хп — двоично-рациональное приближение >/х с погрешностью
не более 2~п. Заметим, что округление делается «бесплатно», так
как нам известно, Uk больше, чем я~1/2, или меньше (это зависит
от четности или нечетности к). Поэтому полная сложность вы-
числения Хп оценивается как
4М(К) + М(2К) + О(К)
или как
2М(п) + ЗМ(К) + М(2К) + О(п),
где К = 2к + 2 п > 2к~1 + 2, а также как
2М(п) + ЗМ(2п) + М(4п) + О(п) ЗМ(4п) + О(п).
Вспоминая, что в выбранном выше двоичном представлении чис-
ла X было 2п или 2п— 1 разряд, получаем, наконец, что для вычис-
ления [vCxj из т-разрядного числа достаточно ЗМ(2т) + О(т)
двоичных операций. □
Теорема 20. Функция SQR(n) имеет тот же порядок роста,
что и функции Q(n), M(n), D(n), R(ri).
Доказательство. Для доказательства достаточно применить лем-
мы 51, 52 и теорему 19. □
Глава 14
О сложности преобразования чисел
из одной системы в другую
Сообщение на доске объявлений гласило, что
он находится в комнате 423, но при взгляде
на план системы нумерации, с виду логичной,
складывалось впечатление, будто ее разраба-
тывал либо лунатик, либо математик.
Роберт Бэрнанд, 1983
(цитируется по книге Д. Кнута
«Искусство программирования»)
Обозначим Къ,в(п) сложность преобразования п-значного
числа из б-ичной системы в В-ичную. Операции выполняем в
В-ичной арифметике.
Теорема 21. Если число /? = logs Ъ рационально, то
Кь,о(п) = О(п).
Если /? иррационально, то при b < В
Къ,в(п) (2n + I)(п - \)/3 + о(п),
а при b > В
Кь,в(п) ------Р 0{р п).
Доказательство. Для того, чтобы перевести число и = (ип ... щ)ь
в В-ичную систему, применим схему Горнера вычисления значе-
ния многочлена ипЬь~1 +... + щ, проводя все операции в В-ичной
132
Глава 14. О сложности преобразования чисел
системе. Оценка сложности О(п2) для этого алгоритма очевидна.
Получим более точные оценки. Пусть /3 рационально, тогда для
некоторых натуральных с и С имеем Вс = Ьс. Перевод из Ь-ичной
системы в В-ичную представляется в виде композиции перевода
из b-ичной системы в Ьс-ичную и перевода из В-ичной системы
в Вс-ичную, которые выполняются со сложностью О(п) каждый.
Пусть /3иррационально и b < В. Положим Хк = (ип.. .ип-к+\)ъ>
тогда
•Efc+l = "Ь 'U'n—kt ~
и в силу неравенства
Ьк-1^ВК-1, K=\kfi\,
длина числа х в В-ичной системе не больше К. Предполагаем, что
множество Ь-ичных цифр «бесплатно» разыскивается во множе-
стве В-ичных цифр. Тогда вычисление х в В-ичной арифметике
выполняется со сложностью не больше
ЗК - 2 + [(Л + 1)/3] = (4А? + 1)/3 + 2 - 3{kf3} - {(к + 1)/3},
где знак {ж} = х - |ж] — символ дробной части числа х. Значит,
сложность вычисления и = хп не выше
п-1
у №+1 w+2 - з{вд - {(*+од) =
fc=l
п-1
= (п - 1)(2п + 1)/3 + 2(п — 1) — 4 ^{к/3} - {п(3} + {/3}.
fc=i
Так как /3 иррационально, то последовательность {п(3} рав-
номерно распределена на отрезке [0,1] согласно теореме Вейля—
Серпинского, значит,
откуда и следует оценка теоремы. □
Глава 14. О сложности преобразования чисел
133
Пусть b > В. Тогда для нахождения В-ичных записей чисел щ
требуется сложность О(п). Ее можно найти с помощью такого
алгоритма:
u = (Uk...U})B,
где
U\=u mod В,
U2 =
mod В,
ик =
Uk-I
в
mod В,
£1
В
ж mod В означает х - B[a;/Bj — остаток от деления х на В.
Этот алгоритм, кстати, можно использовать для перевода не толь-
ко одноразрядных, но и произвольных чисел из одной системы
в другую. Можно оценить его сложность более точно, если учесть
то, как заданы числа щ. Если, например, они заданы в двоичном
виде, число В тоже, и операции деления проводятся в двоичной
арифметике, то получается оценка О(Д2п). Далее, для вычисле-
ния и = хп с помощью указанной выше схемы Горнера требуется,
согласно результатам раздела 2, сложность не выше
п-1
£ (М(гад, 101) + Г№ +1)/?1 + U3J) «
fc=l
п-1
22 (5гад 17?! - 2ГА#| + \(к + 1)Д1 - 3),
fc=l
так как неравенство b В^ - 1 равносильно неравенству b В^.
5ГВДГД1-21*01 + !(<=+1)01 - 3=
= 5(0101*+ ]0] - {ВД101) - (*-1)0- {(*+1)0} + 2{ВД - 4,
то, используя равенство
п-1 .
22 к@ = +
к=1
получаем оценку
п(п — 1)
2
р(п - 2)(п -1) / ад
2 V 2
-4 +
|)(п” О-
134
Глава 14. О сложности преобразования чисел
Полученные оценки сложности несколько завышены, так как в
них учтены, например, все переносы, реально в ручных вычисле-
ниях выполняющиеся «в уме». При Ь = В + 1 оценку теоремы 21
можно улучшить. А именно, тогда можно считать, что перевод
чисел щ в В-ичную систему осуществляется «бесплатно», а вы-
числение
Zfc+i = xkb + ип_к = хк(В + 1) + ип-к = хкВ + ип-к + хк
в В-ичной арифметике осуществляется со сложностью не выше
2m + f(fc+
Поэтому общая оценка сложности имеет вид
£ (2 гад + [(* + 1>Д] -1) = 3^*(" ~ ° + Н + о(п).
fc=l
В случае b = В - 1 вычисление
хк+} = xkb + ип-к = хк(В - 1) + ип_к = хкВ + ип_к - хк
в В-ичной арифметике осуществляется со сложностью не выше
2[fc/T| 4-1. Поэтому общая оценка сложности имеет вид
п-1
J^(2fA:^'| + 1) = /Зп(п - 1) + 2п + о(п).
fc=i
Так как оценка сложности перевода при Ь > В получилась выше,
то в случае b = Ь®, где b < В, а с — натуральное число, лучше
переводить из Ь-ичной в Ь0-ичную систему со сложностью О(п),
а потом из Ьо-ичной в В-ичную систему, и пользоваться оценкой
Кь,в(п) О(п) + Къ^п).
Этой оценкой можно пользоваться и при Ьо = В ± 1. Так, на-
пример для перевода из троичной в десятичную системы, скажем,
Глава 14.0 сложности преобразования чисел
135
числа (1220102)з, сначала переводим его в девятеричную систему
и получаем число (1812)9, а потом, проводя вычисления в десятич-
ной арифметике, на к-м шаге из десятичного числа, записанного
первыми к + 1 цифрами, отнимаем десятичное число, записанное
первыми к цифрами, и записываем цифры разности вместо пер-
вых к + 1 цифр, и проводя эти операции для к = 1,2,... ,п- 1,
получаем в итоге десятичную запись исходного числа:
1.812
~_1____
17.12
~ 17___
154.2
~ 154
1388
Оценка сложности имеет вид
Кз.ю(п) п + 1<9,1о(п) (logic 9)n(n - 1) + Зп + о(п).
Для проверки выполним обратный перевод. Чтобы перевести де-
сятичное число в троичное, сначала переведем его в девятеричное.
Для этого применяем подобный же алгоритм, но на к-м шаге бу-
дем не отнимать, а прибавлять, учитывая формулу
~ “Ь к = Як-В “Ь Un—к "Ь
и операции будем выполнять на сей раз в девятеричной арифме-
тике.
Вычисления выглядят так (точки, как и ранее, ставятся с це-
лью избежать ошибок):
163.8
+ 163
1812
136
Глава 14. О сложности преобразования чисел
Для перевода в троичную запись достаточно каждую девятеричную
цифру заменить на ее троичную запись, которая получается путем
деления на 3 с остатком. В итоге оценка сложности перевода имеет
вид
х Г п 1 ч _ Зп(п - 1) /1 1 \ .
;---х +-^io,9(w) —-------—И -+---------- )п+о(п).
logio 9 21og109 \2 log109/
Рассмотрим теперь более практически важный случай пере-
вода из двоичной системы в десятичную. Напомним уже рассмат-
ривавшийся для этого алгоритм (см. «Схема Горнера и перевод
из одной позиционной системы в другую» '*). Сначала переведем
число из двоичной системы в восьмеричную. Для этого разбиваем
справа налево его цифры на «тройки» (последняя «тройка» на са-
мом деле может быть «двойкой» или одной цифрой) и переводим
их в восьмеричную систему схемой Горнера (выполняемой устно).
Например,
(1111110000)2 = (1.111.110.000)2 = (176О)8.
Сложность этого перевода не выше 4п/3 (при выполнении на ком-
пьютере по существу она нулевая). Выполним перевод из восьме-
ричной системы в десятичную. Пусть
и = (ип ... Ui)8.
На /s-м шаге выполняем над полученной на предыдущем шаге
записью в десятичной арифметике действия
. . . Un—k—\ • • • ^п—к — •• • Vn—k—l
и получаем запись
Vn • • • Vn-к-У •'U'n-k-2 • • • Щ
(старшие разряды могут оказаться нулевыми и в ручных вычисле-
ниях участвовать не будут). На (п — 1)-шаге получаем десятичную
9 Гашков С. Б. Занимательная компьютерная арифметика. М.: URSS, 2012.
Глава 14. О сложности преобразования чисел
137
запись числа и. Например,
1.760
“2______
15.60
“30_____
126.0
~ 252
1008
Указанный алгоритм удобен в применении, однако вариант алго-
ритма, использованный в доказательстве теоремы 21, дает лучшую
оценку сложности, именно
#2,io(n) (logio 8)(n(n - 1)) + ^ + о(п).
Действительно, в случае 6 = 2 вычисление
•Efc+l = 2хк + Un-k
в В-ичной арифметике осуществляется со сложностью не выше
Г(Л+1)/3] +2^1-1.
Поэтому общая оценка сложности имеет вид
£ (2|ВД + f(*+ 1)01 - 1) = Vn(n ~ ° + ^ + О(п).
*1=1 2 2
Алгоритм перевода из десятичной системы в двоичную почти та-
кой же. Сначала переводим в восьмеричную запись. Для этого,
пользуясь восьмеричной арифметикой, на к-м шаге выполняем
над полученной на предыдущем шаге записью действия:
Цп . . . Un-k-l + 2lln . . . Un-k =
и получаем запись
Vn-|-1 . . . Vn-k-1 .Un-k-2 • •
138
Глава 14. О сложности преобразования чисел
(поначалу (п+ 1)-е разряды окажутся нулевыми и в ручных вы-
числениях участвовать не будут). На (п - 1)-м шаге получаем
восьмеричную запись числа и. Например,
1.945
+ 2_____
23.45
+ 46____
302.5
+ 604
3631
Далее со сложностью не больше 2п переводим восьмеричное п-знач-
ное число в двоичное (вычисляя для каждой восьмеричной цифры
двумя делениями на 2 с остатком ее двоичную запись). Подобно
теореме 21 получаем (несколько более точную чем вытекающая
из нее) оценку сложности перевода
-К)о,2(гс)^2
n 5n(n—1) /5 2 \
Z---7 + #10,«(п)^ —-----r+H + i--------о)П + °(П)-
logjo 8 21og108 \2 logi0 8/
Действительно, в случае b = В + 2 вычисление
•®/s+i = xkb + Un—k = EkiB + 2) + Un-k = s-fcB + Un—k 4" 2s/{
в В-ичной арифметике осуществляется со сложностью не выше
4[’А;Д] + f(fc+ 1)Д] (требуется не более переносов при вычис-
лении ХкВ + ип-к, со сложностью не более \к(3~\ - 1 вычисляется
2хк путем сложения и получается не более чем (|’А;Д'] + 1)-разряд-
ное число, со сложностью не более + [(&+ 1)Д] выполняется
сложение ХкВ + ип_к + 2^, с единичной сложностью вычисляет-
ся В-ичная запись числа un-fc), поэтому общая оценка сложности
имеет вид
£ (41М1 + f(t + 0Д1) = 5/3^-И + у + о(п).
к=1
Глава 14. О сложности преобразования чисел
139
Алгоритмы перевода, приведенные выше, хо-
рошо работают для небольших чисел. Однако
известен асимптотически более быстрый ал-
горитм. Пусть М(п) — любая верхняя оцен-
ка сложности умножения п-разрядных чисел,
удовлетворяющая условию
М(п + т) > М(п) + М(т).
Арнольд Шёнхаге
Например, в качестве такой функции можно взять сп“, если а > 1.
Теорема 22 (теорема Шёнхаге). Если
/3 = logB Ь
иррационально, то
KbJ}(n) < 2М
log2 n + Con log2 п + С\п,
где Со и С| — константы.
Доказательство. Сначала докажем несколько лемм.
Лемма 53. Справедливо неравенство
М(п + 1) М(п) + 12n + 1.
Предлагаем эту лемму читателю доказать самостоятельно.
Лемма 54. Справедливы неравенства
М(п, п + k) М(п) + М(п, к) + Зп - 1
< М(п) + + М(к) + 6п,
Af(n, п + 1) М(п) + 6п - 3.
140
Глава 14. О сложности преобразования чисел
Доказательство. Второе неравенство следует из первого и теоремы 12.
Последнее неравенство следует из первого и леммы из раздела 2.
Обозначим no = |n/2j, nj = [п/2],
П = (Hq,..а*_|)а*’ О?» = 0, 1. D
Лемма 55. Справедливы равенство и неравенства
Доказательство. Применим индукцию по к и проверим, что
По,...,О ,.jQt П1,...,Ь
'О|..а*_|)а*
Па,....а к —
а,=0,1.. .,а*=0,1 а|=0,1.. ,,а*_|=0,1 а*=0
1
= l 2Tl'ai,...,aie-i = • • • = > ПО| = По + П] = П. О
О| =0,1...I —0J СК|=О
Следующая лемма является основной в доказательстве теоремы.
Лемма 56. Справедливо неравенство
п0
2
Кь,в(п) Кь.в(п) + KbiB(n) + 2М
+ Kqti + К[,
где при b < В константы Ко = 25,50, = 10, а при b > В
Ко = 13,50 + + 12, К} = + 12 + 2М(Г/?1).
Глава 14. О сложности преобразования чисел
141
Доказательство. Обозначим К(п) сложность перевода п-значно-
го Ь-ичного числа в В-ичную систему и одновременного вычис-
ления в этой системе числа Ьп. Пусть и = (ип ... и\)ъ. Представим
его в виде
и = Uibno + Uo,
где
J71 = (ип . . . ltno+l)b, Во — (иПо • • • 14])б.
Со сложностью К(по) + К(п\) можно перевести числа Ui в В-ич-
ную систему и вычислить в ней числа и Ьп'. После этого вы-
числение Ъп = ЪПйЪп' и и = U\bn° + Во выполняется со сложностью
2М(\по0], Гл,/?]) + [n/T] + [по/31 - 1,
так как при иррациональном /3 число В-ичных разрядов в числах
По, Ь"° не превосходит [ni 0], в числах U\, Ьп' не превосходит [П1Д]
и в числе и не превосходит Так как [ni/З] — [по/3] \0], то
согласно леммам 53, 54
м(1М],Г»1Д1)
\ I г' I
1-6 (М + 1)+м(Ш
М(Гпо/Я) ^JWdnofll + lSLno/JJ + 1,
а при /3 < 1
М(Гп0/31, Гп1/?1) М([п0/3]) + 18|no/3J +4.
Лемма 57. Справедливы неравенства
М(х] +... + хп) М(Х]) + ... + М(хп),
|®1 + ... + xnJ > [xij + ... + La=nJ-
Доказательство. Применим индукцию по п и проверим, что
M(xi + ... + хп) M(xi + ... + zn_i) + М(хп)
M(a?i) + М(х2) + ... + М(хп).
142
Глава 14. О сложности преобразования чисел
Аналогично доказываем второе неравенство, предварительно про-
верив, что [ж] + я:2] kij + кг] • Лемма доказана. □
Докажем теперь теорему. Применяя индукцию и леммы 55,
56, 57, получаем
KbtB(n) 2к+хКь,в
ai=0,l,.. .,а*=0,1
тгО|,...,а»^
2
+ KQn(k + 1) + К] (1 + 2 + ..
Къ,в
П
2*4-1
+ 2М
+ K,2fc+1.
Полагая k + 1 = [log2 nJ, отсюда выводим, что
Кь,в(п) 2М
log2 п + KQn log2 п + (Ki + Кь,в(2))п.
Можно проверить, что при Ь> В
Кь,в(2) 2КЬ,В(1) + 2М(Г/?1) + 3ГХ?1 - 1, Кь,в(1) O(log2 Ь)2,
а при b < В Къ,в(2) = 2. Теорема доказана.
Глава 15
Модулярная арифметика
и китайская теорема об остатках
Частный случай этой теоремы был сформулирован
китайским математиком Сунь Цю, который пред-
ложил правило «тай йен» («большое обобщение»).
Дата написания его работы точно не установлена',
предположительно между 280 и 473 гг. н. э.
Д. Кнут. Искусство программирования
Будем здесь и далее обозначать остаток от деления числа а
на т через a mod т. Остатки от деления на т суммы и произве-
дения двух чисел удобно вычислять по следующим формулам:
а + b mod т = a mod т ф b mod т,
ab mod т = a mod mob mod т,
где через х Ф у обозначается операция х + у mod т, а через х о у
обозначается операция ajymodm. Частные случаи этих формул
при т = 2 известны любому младшекласснику: сумма четных чи-
сел четна так же, как и сумма двух нечетных чисел, сумма чисел
разной четности нечетна, произведение нечетных чисел нечетно,
а произведение четного числа на любое число всегда четно. Вы-
числения по модулю 7 позволяют легко решать задачи о календаре.
Для разминки предлагаем читателю пару таких задач.
Задача 30. В какой день недели начнется XXII век?
Указание. Учтите, что XXII век начинается 1 января 2101 года, а не 2100.
144
Глава 15. Модулярная арифметика
Задача 31. Вы решили не выбрасывать старый настенный кален-
дарь. Через сколько лет он опять сможет Вам пригодиться?
Указание. Не забудьте, что календарь мог быть для високосного года.
В качестве более сложного примера приведем формулу Гаусса
для Пасхалии. В n-й год от Рождества Христова западные церкви
празднуют Пасху (22 + d + е) марта или (d + е - 9) апреля, где
d = (19а + М) mod 30, е = (26 + 4с + 6d + N) mod 7, а = nmod 19,
b = п mod 4, с = п mod 7, М =23, N = 3 при п = 17**, М = 23,
N = 4 при п = 18**, М = 24, N = 5 при п = 19**, М = 24,
N = 6 при п = 20**, М = 24, N = 7 при п = 21**.
Задача 32. Вычислите, когда будет Пасха в текущем году.
О том, как быстро вычислять остатки от больших чисел по ма-
лым модулям, фактически шла речь в разделе, посвященном при-
знакам делимости. По остатку от деления произвольного числа
на тп можно однозначно определить остатки от его деления
на т и п. Китайская теорема об остатках утверждает, что если
(т, n) = 1, то по остаткам от деления на т и п можно однозначно
восстановить остаток от деления на тп, причем всегда найдется
число, имеющее заданные остатки от деления на числа тип.
Сунь Цю, живший около 2000 лет назад, сформулировал частный
случай этой теоремы. Прежде чем приступить к ее изучению, ре-
шите следующую задачу.
Задача 33. Найдите наименьшее натуральное число, которое при
делении на п дает остаток п - 1, а при делении на п+1 — остаток п.
Мы рассмотрим несколько доказательств китайской теоремы.
Указание. Прибавьте 1.
Начнем с неконструктивного доказательства. Заметим, что
если два числа имеют разные остатки от деления на тп, то они
имеют либо разные остатки от деления на тп, либо разные остат-
ки от деления на п. Действительно, в противном случае разность
Глава 15. Модулярная арифметика
145
этих чисел делится на т и на п, а значит, и на тп (ведь тип
взаимно просты), но это невозможно, так как они имеют разные
остатки при делении на тп. Но разных упорядоченных пар остат-
ков от деления на т и п имеется ровно тп штук, и столько же
имеется различных остатков от деления на тп. Значит, по остат-
кам от деления на т и п можно однозначно восстановить остаток
от деления на тп, причем всегда найдется число, имеющее за-
данные остатки от деления на числа тип.
Теперь приведем конструктивное доказательство, причем в
более общем случае. А именно, докажем, что для любых попарно
взаимно простых чисел mi, 1 < г г, и любых чисел щ, 0 < щ < т,,
найдется единственное число N, 0 N < М = т\... тТ, дающее
при делении на остаток щ.
Действительно, пусть Mi — произведение всех этих чисел,
кроме mi. Найдется такое натуральное число а,, что а,М» при
делении на т, дает в остатке 1. Это число быстрее всего можно
найти с помощью алгоритма Евклида, но можно также довольно
быстро вычислить по явной формуле
а, = м}^' mod mi,
где ф(т) — функция Эйлера. Действительно, согласно теореме
Эйлера
diMi mod mi = М?^ mod = 1.
Заметим теперь, что число
Г
nidiMi mod М
i=l
при делении на дает остаток щ. Действительно, слагаемое
nidiMi делится на Mi, а значит, и на любое m,j при j / i, а при
делении на т, дает остаток тц. Поэтому сумма при делении на т»
дает остаток щ, что и доказывает существование числа, имею-
щего заданные остатки по модулям т,. Единственность такого
числа по модулю М = т\... тг (т. е. однозначность опреде-
ления его остатка при делении на М) вытекает из следующего.
146
Глава 15. Модулярная арифметика
Различных упорядоченных наборов остатков при делении на т<
имеется ровно М штук, и каждому из них соответствует хотя бы
один из остатков по модулю М (как только что было доказано),
а значит, и ровно один из этих остатков. Действительно, в про-
тивном случае общее число разных наборов остатков при делении
на mi, соответствующих разным остаткам по модулю М, было бы
меньше М, и для какого-то набора остатков по модулю mi не на-
шлось бы числа, соответствующего этому набору, что невозможно,
как было уже доказано.
Сделаем замечание об организации вычислений. При вычис-
лении любой из указанных сумм не следует сначала производить
все арифметические действия и только в конце вычислять оста-
ток по модулю М, так как это приведет к громоздким операциям
с большими числами. Надо каждую из арифметических операций
заменять на соответствующую операцию по модулю М, как бы-
ло указано в начале раздела, тогда получится тот же результат,
но гораздо быстрее, причем при вычислениях никогда не будут
появляться числа, большие М. При использовании для вычисле-
ний суммы
УУ mod М = У7 niUiMi mod М
i=l i=l
следует возведение в степень проводить при помощи быстрого
(например, бинарного) алгоритма. Чтобы им воспользоваться, од-
нако, надо заранее знать показатели степеней, а для этого нужно
уметь вычислять значение функции Эйлера. К сожалению, быстро
ее можно вычислить, только если заранее известно разложение ее
аргумента на простые множители. Приведем эту формулу Эйлера:
если р“' ... Рпп — разложение числа т на простые множители, то
л Ч Л Ч
\ Р1/ \ Рп/
Для ее доказательства достаточно применить следующее, так на-
зываемое мультипликативное свойство функции Эйлера: при вза-
Глава 15. Модулярная арифметика
147
имно простых тип справедливо равенство
ф(тп) = ф(т)ф(п),
и воспользоваться частным случаем указанной формулы, который
предлагается в виде задачи.
Задача 34. Докажите, что при простом р
ф(рп)=рп -рп~'.
Указание. Число взаимно просто с рп тогда и только тогда, когда оно
не кратно р.
Для доказательства мультипликативного свойства заметим,
что при взаимно простых тип остаток от деления на тп вза-
имно прост с тп тогда и только тогда, когда соответствующие
ему (согласно китайской теореме) остатки от деления на т и п
взаимно просты с т и п соответственно, и поэтому ф(тп), рав-
ное по определению количеству взаимно простых с тп остатков
по модулю тпп, равно количеству всех различных упорядоченных
пар остатков по модулям тип, взаимно простых со своими
модулями, т. е. равно ф(т)ф(п). Остается доказать сформулиро-
ванное утверждение «тогда и только тогда». Действительно, если
число взаимно просто с тпп, то его остаток, например, по модулю
тп, взаимно прост с модулем, так как иначе их общий делитель,
скажем d, будет общим делителем нашего числа и тпп, что невоз-
можно. Если же это число не взаимно просто с тпп, то оно имеет
нетривиальный общий делитель, например, с числом п, и значит,
его остаток по модулю п будет иметь с ним тот же общий делитель,
поэтому, если остатки нашего числа по модулям тип взаимно
просты со своими модулями, то наше число взаимно просто с тп.
Задача 35. Докажите равенство
ф(тк) = тк~'ф(т).
Указание. Разложите т на простые множители и примените формулу
Эйлера.
148
Глава 15. Модулярная арифметика
Недостаток приведенного алгоритма вычисления по задан-
ным остаткам n< по mod mi числа {пу,..., пт) mod М в том, что
числа Mi могут быть очень велики по сравнению с т,. Это-
го недостатка лишен следующий способ вычисления функции
(П],..., nr) mod М (принадлежащий X. Гарнеру). Он основан на
использовании чисел с^, таких, что суть mod mj — 1. Эти числа,
причем не превосходящие по величине mj, можно заранее вычис-
лить с помощью алгоритма Евклида (или теоремы Эйлера). Далее
рекурсивно вычисляем
U] = П],
U2 = (п2 - ^1)С1,2 mod m2,
из = ((«з - «1)с1,з - и2)с2,з mod тп3,
ur — (• • • ((nr - щ)с^г - U2)c2,r - ••• - ‘Ur-^Cr-i.r mod mr.
Операции выполняем модулярные, поэтому все возникающие в
процессе вычислений числа не превосходят
m = maxm$.
Тогда справедливо равенство
(п],..., nr) modM = urmr-\... mi +... + изтгШ! + + tti.
Действительно, сумма неотрицательна и меньше М, так как
U2m\ + щ < (m2 - 1)т, + mj = mjm],
изтгт] + + и\ (тз - 1)тгт1 -I- тзт] = тэп^т,,
uTmr-i ... mi + ... 4- изт2т\ 4- U2m\ + и\ <
< (mr - l)mr_i ... mi + mr~\ ...mt = mrmr-i ...m\ = M.
Остаток от ее деления на m, равен остатку от деления на тг- числа
и<т<_1... mi 4-... -I- щт^т.! + U2mi +
Глава 15. Модулярная арифметика
149
а он равен тц, в чем можно убедиться по индукции, так как
щтПг- \... mimodm, =
= (... ((ni-Ui)c\ti-U2)c2,i -... ...mi modm, =
= (... ((nj - uOci.i - u2)c2,i -... - Ui-i)mi-2 ...mi modm, =
= (... ((ni-Ui)Ci>i-U2)c2>i-...-‘Ui-2)ci_2>imi_2...mi -
- Ui-imi-2 ...mi modmj =
= ni - uj - U27Tii - u2m2mi -... - Ui-im^2 ...mi modm,.
В последнее время китайская теорема об остатках нашла интерес-
ные применения в криптологии — науке об организации хранения
и передачи секретной информации. Расскажем об одном из про-
стейших таких применений. Допустим, что Вам поручили органи-
зовать доступ к секретной информации на компьютере для трех со-
трудников банка так, чтобы они, только собравшись втроем, смог-
ли получить ее. Каждому Вы сообщаете ключ — некоторое боль-
шое (например, стозначное) число, которое он хранит в секрете
от остальных. Паролем, который открывает секретную информа-
цию, является неизвестное никому из них число, которое однако
можно быстро определить (разумеется, с помощью компьютера)
по трем упомянутым ключам. В случае же отсутствия одного из них
для определения пароля придется, даже зная алгоритм определе-
ния пароля по ключам, перебрать 9 • 1099 вариантов возможного
значения неизвестного ключа, а это пока не доступно даже супер-
компьютерам. Кроме того, для надежности вы можете периодиче-
ски менять ключи. Это смогут сделать даже сами работники банка,
договорившись только о размерах ключей, чтобы гарантировать их
отличие друг от друга и сохранить пароль в тайне даже от Вас.
Задача 36. Предложите алгоритм определения пароля по ключам,
основанный на применении китайской теоремы об остатках.
Указание. Выберем 3 больших попарно взаимно простых числа, например
числа Ферма
й] — 2 4- 1, аг = 2 4-1, О3 = 2 4-1.
150
Глава 15. Модулярная арифметика
Пусть i-й «компаньон» в качестве ключа выбирает произвольное
число к{ в пределах от I до а, — 1. Тогда, собравшись вместе, они могут
выработать пароль к, взяв в качестве него такое число а = aia2a3 в пре-
делах от 1 до a - 1, которое при делении на а; дает в остатке к<. Как
было показано выше, число к можно вычислить по формуле
к = к'-
а,
а
где
к1 = kint + к2п2 + к3пз, nimi~aiqi = l, mi=a,jO,k, j^k^i^j.
Для вычисления п можно применить алгоритм Евклида. Нетрудно напи-
сать программу для компьютера, которая будет вычислять пароль к после
того, как «компаньоны», таясь друг от друга, введут свои ключи. Положим
N = 2". Если двое в тайне от третьего захотят найти ключ к, то им при-
дется перебрать все возможные варианты выбора третьего ключа (потому
что разным способам выбора ключей соответствуют разные значения к),
т. е. перебрать не менее 2N вариантов. С помощью результатов раздела 12
и оценки числа шагов алгоритма Евклида (указанной в разделе «Схема
Горнера и перевод из одной позиционной системы в другую» '>) можно
оценить сложность алгоритма вычисления общего ключа по порядку как
где M(N) — сложность умножения TV-разрядных чисел. Приме-
нение метода умножения Карацубы дает оценку 0(№°й 3). Поэтому даже
при больших N вычисление общего ключа можно провести достаточно
быстро.
Для применения модулярной арифметики в криптографи-
ческих алгоритмах нужно иметь быстрые алгоритмы для пере-
хода от системы остатков гг- по взаимно простым модулям mi,
1 < i < п, к остатку г по модулю т = т\ ... тп и обратно для
очень больших чисел т,. Обратный переход требует выполнения
деления числа г на числа тщ с остатком.
Если предположить, что числа тпг- являются ^разрядными,
то сложность стандартного алгоритма для этого равна по порядку
n2M(N), где M(N) — сложность умножения N-разрядных чи-
сел, которую можно оценить, согласно результатам предыдущих
Гашков С. Б. Занимательная компьютерная арифметика. М.: URSS, 2012.
Глава 15. Модулярная арифметика
151
параграфов, по порядку как 7V1082 3. Более быстрый алгоритм вы-
числения системы остатков при большом количестве модулей
основан на методе «деления пополам». Для простоты предпо-
ложим, что п является степенью двойки, и вычислим вначале
попарные произведения 7П]7п2,..., 7пп_|7тзп, потом «четверные»
произведения и т. д., и наконец произведения М\ = т\... тп/2
и М2 = mn/2+i ... тп. Если учесть, что функция M(N) удовлетво-
ряет неравенству
M(N\ + ЛГ2) < M(N\) + M(W2),
то сложность всех операций умножения оценивается как
M(Nn) log2 п.
Потом вычисляем R\ = т mod М] и R2 = т mod М2. Применяя
лемму 32, можно оценить сложность двух этих операций деления
как
5М(^л) + 50Мг + 14.
Теперь заметим, что для нахождения остатков гг- = г mod mi до-
статочно при i п/2 найти R\ modm», а при г > п/2 найти
R2 mod mi, т. е. исходная задача нахождения п остатков свелась
к двум таким же задачам, но вдвое меньшего размера. Поэтому,
применяя указанные выше неравенства, получаем полную верх-
нюю оценку сложности вычисления системы остатков Г{, равную
6M(Nn) log2 п + 5O7Vn log2 ti+14 log2 п.
При больших тг эта оценка лучше оценки n2M(N), если, конеч-
но, для умножения использовать, например, алгоритм с оценкой
по порядку Nlog2 3.
Рассмотрим теперь вопрос о вычислении по системе остатков
71$ mod тп» остатка по mod тп 1... тп. Для этого модифицируем ал-
горитм, приведенный в начале раздела. Для вычисления системы
чисел MmodTTii применяем изложенный выше прием «деления
пополам». Непосредственное вычисление системы чисел Mi име-
ет оценку сложности O(nM(Nn)). Это слишком много. Но если
152
Глава 15. Модулярная арифметика
заметить, что
mod тп? М mod m?
Mi mod mi =--------------=-----------,
mi mi
где M = 7П] ... mn, и вычислить вначале квадраты т», потом
применить указанный выше алгоритм для вычисления М mod mj
и выполнить деления на mi, то получим оценку сложности, рав-
ную по порядку M(Nn) log2 п.
Далее вычисляем числа с помощью алгоритма Евклида по
уже найденным остаткам Mi modm;. Остается вычислить сумму
п
УЗ riidiMi mod М.
i=l
Для этого опять применяем «деление пополам», используя тожде-
ство
п п
УЗ mod М = т\ ... тп/2 УЗ гцсцМ'г mod mi+i... тп +
»=1 <=2 + 1
п/2
+ ma+i... тп УЗ niaiM" mod mi... тп/2,
i=l
которое сводит рассматриваемую задачу к двум таким же задачам,
но вдвое меньшего размера. Как и раньше, получаем оценку слож-
ности, по порядку равную M(Nri) log2 п.
Глава 16
Сложность операций
модулярной арифметики
Однако в общем случае эта теорема впервые
была сформулирована и доказана Чин Чжу-Шао
в работе Shu Shu Chiu Chang в 1247 г.
Д. Кнут.
Искусство программирования
Операцию умножения двух п -разрядных чисел по модулю
n-разрядного числа можно выполнить со сложностью 6М(п)+О(п),
что очевидно следует из результатов раздела 12. Однако если мо-
дуль фиксирован, то часть вычислений можно выполнить заранее,
и эту оценку можно улучшить.
Теорема 23. Сложность операции сложения—вычитания п-
разрядных чисел по данному n-разрядному модулю р равна
О(п), а сложность умножения не больше ЗМ(п) + О(п).
Доказательство. Для выполнения сложения чисел х, у по моду-
лю р достаточно вычислить х + у - р, и если это число будет
отрицательным, то заменить его на х + у. Для выполнения умно-
жения чисел х, у по модулю р достаточно вычислить f = ху,
а потом f mod р. Для выполнения последней операции надо най-
ти q = [//pj и вычислить f - qp. Для вычисления q можно при-
менить метод доказательства леммы 32, а именно воспользоваться
Китайская теорема об остатках.
154
Глава 16. Сложность операций модулярной арифметики
тем, что а = [22п/р] можно вычислить заранее, тогда
/[22n/pJ
22п
2П 2п
<2,
на вычисление произведения [//2”]о достаточно М(п) операций,
так как числа [//2П] и а являются n-разрядными, а вычисление
чисел L//2”] и Ь = [[//2"Ja/2nJ делается бесплатно.
Указанный метод модулярного умножения по существу сов-
падает с методом Баррета. □
Для модулей р специального вида оценки теоремы, разумеется,
можно улучшить. Еще большего улучшения можно достичь в слу-
чае выполнения операций с числами специального вида. Приведем
несколько примеров, представляющих практический интерес.
Пусть р = 2п - 1. Тогда прибавление—вычитание единицы
по модулю р имеет сложность 4п + 0(1), так как требуется при-
ведение по модулю р, сложение—вычитание по модулю р имеет
сложность А(р) = 7п + 0(1), умножение по модулю р школьным
методом имеет сложность 6п2 - п + 0(1).
Умножение на элементы 2к при любом целом к сводится к
циклическому сдвигу и схемно делается бесплатно.
Если натуральное число С может быть представлено в виде ал-
гебраической суммы 1(C) степеней двойки по модулю р, то слож-
ность М(С, р) умножения на константу С по модулю р не больше
(1(0 - 1)4(р).
Если число С = С\ Ci mod р, то очевидно
М(С, р) М(СХ, р) + М(С2, р).
Поэтому, например при С = 1 + 23 + 25 + 28 = (1 + 23)(1 + 25)
М(С,р) 2А(р).
Можно комбинировать эти два приема.
Умножение на 1/С по модулю р можно выполнить по формуле
1 , х - (х mod С) / , _ 1
х • — mod р =-----—-------1- I х mod С • —
mod р I mod р.
Глава 16. Сложность операций модулярной арифметики
155
Пусть р = 2п + 1. Представление чисел по этому модулю
требует не п, а п + 1 разряд. Прибавление—вычитание единицы
по модулю р имеет сложность 4п + 0(1), сложение—вычитание
по модулю р имеет сложность А(р) = 7п+0(1), умножение по мо-
дулю р имеет сложность 6n2 + 1 In + 0(1).
Умножение на элементы 2к при 1 < /с < п - 1 уже не сводится
к циклическому сдвигу и схемно делается со сложностью 4п+0(1).
При к = п умножение на 2к — это смена знака, а при 2п > к > п
оно сводится к умножению на 2к~п и смене знака.
Если натуральное число С может быть представлено в виде
алгебраической суммы 1(C) степеней двойки по модулю р, то
сложность умножения на константу С по модулю р не больше
(1(C) - 1)А(р) + (4п + С)1(С).
Например, М(3,р) 11п + 0(1).
Умножение на константы 1/0 делается аналогично модулю
2n + 1, но тоже чуть сложнее. Так, умножение 2-битового числа
х mod 3 на число
1 _ - (2п
3 “ 6
~2' " + 4 = 2 + 8 + ... + 22*'1 + |
= 2 + 8 + ... + 22fc“’ - 2п~} = 2 + 8 + ... + 2"-3 - 2п~[ =
= 3 + 8 4-... + 2”-3 + 2”-1 mod р
делается со сложностью 2п + 0(1). В итоге имеем
мГ|,р) =21п + 0(1).
Пусть р = 2" + с, с = ±3, ±5. Тогда прибавление—вычитание
единицы по модулю р имеет сложность 4п + 0(1), сложение-
вычитание по модулю р имеет сложность А(р) = 1п + 0(1),
умножение по модулю р имеет сложность 6п2 + 0(п). Умножение
на элементы 2к при 1 к п делается со сложностью 7п + 0(1).
Если натуральное число С может быть представлено в виде
алгебраической суммы 1(C) степеней двойки по модулю р, то
156
Глава 16. Сложность операций модулярной арифметики
сложность умножения на константу С по модулю р не больше
(21(C)-1)А(р).
Умножение на константы I/O делается аналогично случаю
р = 2П - 1. Так, при р — 2п - 3 умножение 2-битного числа
х mod 3 на число
= 2 + 8 + ... + 22*-1 + 2П-1 -1 = 1 + 8 + ... + 2П-1
делается бесплатно. В итоге имеем
= 19п + О(1).
Но еще проще выполнять операции по модулю 2П. Очевидно,
для этого вообще не нужно приводить результат по модулю. Более
того, для выполнения умножения по этому модулю достаточно в
каждом из сомножителей оставить только младшие п разрядов,
перемножить полученные числа и в произведении из 2п разрядов
оставить только младшие п разрядов. Обозначим сложность такого
усеченного умножения через Мо(п).
Задача 37. Модифицируйте школьный алгоритм так, чтобы получить
оценку Ма(п) < М(п)/2.
Можно модифицировать и метод Карацубы для ускоренного
вычисления усеченного произведения.
Задача 38. Докажите, что М0(2п) М(п) + 2М0(п) + 10п - 12.
Указание. Складывать надо n-разрядные числа и только два раза, причем
переносы в старший разряд вычислять не нужно.
Задача 39. Оцените скорость работы указанного выше алгоритма.
Подобные же задачи можно сформулировать и в случае умно-
жения многочленов.
Глава 16. Сложность операций модулярной арифметики
157
Как найти остаток от деления,
не вычисляя частное
Пусть надо найти остаток от деления произвольного числа
х = (хп...хх)2
на фиксированное число
Р = (Pm •••Plh-
Естественно попытаться сделать это, не находя частное. По суще-
ству речь идет об алгоритмической реализации признака делимо-
сти на р.
Один из возможных способов таков. Представим х в виде
Х23 + У, X = (хп ... хд)2, Y = (^_!... zi)2.
Остаток а = Х29 mod р находится по таблице размера 2n-s+1 х т,
а остаток b = Y modp находится по таблице размера 2s-1 х т.
Выбирая д— 1 = [п/2], можно обе таблицы слить в одну, имеющую
длину [п/2] и ширину 2m. Эту таблицу можно заранее вычислить
и поместить в память компьютера.
Далее надо сложить а, b по модулю р. Для этого можно просто
их сложить, из полученной суммы вычесть р и выбрать из этих двух
чисел второе, если оно неотрицательно, или первое — в противном
случае.
Этот метод можно обобщить, представляя х в виде суммы к
чисел Xi, у каждого из которых число ненулевых битов не пре-
восходит [n/Л], для вычисления всех остатков а, = Xi modp ис-
пользуется таблица с длиной [п//с] и шириной кт.
Далее надо сложить остатки a,i по модулю р. Для этого можно
просто их сложить, при этом число разрядов у суммы не превос-
ходит т+ [log2 к]. У полученного результата надо найти оста-
ток по модулю р. Это можно сделать тремя способами: можно
рекурсивно применить описанный выше алгоритм (это эффек-
тивно, если т + [log2 А:] достаточно велико); выполнить деление
на р с остатком методом SRT (это эффективно, если [log2 к~]
достаточно мало, во всяком случае не больше т); применить еще
одну таблицу с длиной т + [log2 fc] и шириной т.
158
Глава 16. Сложность операций модулярной арифметики
Второй метод вычисления х mod р, где
х = (хп ...a?i)2>
является частным случаем предыдущего метода, в котором х пред-
ставляется в виде суммы к = п чисел Xi, у каждого из которых
число ненулевых разрядов равно 1, т. е. каждое Xi является по су-
ществу степенью двойки,
Xi = Xi^-1.
Поэтому di — Xi modp равно или нулю, или 2*-1 modp, а эти
числа можно вычислить заранее. Далее надо сложить числа а»
по модулю р. Для этого можно просто их сложить, при этом число
разрядов у суммы не превосходит т+ [log2 п], а у полученного ре-
зультата надо найти остаток по модулю р. Как и выше, это можно
сделать тремя способами: рекурсивно применить описанный выше
алгоритм (это эффективно, если число log2 п достаточно велико);
выполнить деление на р с остатком методом SRT (это эффектив-
но, если число log2n достаточно мало, во всяком случае т);
применить таблицу с длиной т + [log2 п"| и шириной т.
Третий метод удобен для вычисления остатка по фиксиро-
ванному малому нечетному модулю. Вначале вычислим порядок
двойки по модулю р, т. е. найдем такое минимальное к, что 2к - 1
делится на р. Известно, что к является делителем числа
где <р — функция Эйлера. Для вычисления
х modр = (хп .;. Я])2 mod р
тогда можно воспользоваться формулой
х mod р = (хк ... ®i)2 + ... + (хп ... xn+i-nmod fc)2 mod р.
Выполнить сложение можно со сложностью 5(1 + о(1))(п + к).
К полученному числу можно или применить рекурсивно тот же
алгоритм, или выполнить деление методом SRT (если log2 п/к
мало по сравнению с к), или применить таблицу с длиной
+ к.
п
к
log2
Глава 16. Сложность операций модулярной арифметики
159
Например, если р = 15 и п кратно 4, то к = 4 и
х mod 15 = (Ж4 ... а?])2 + ... + (жп ... хп-з)2 mod 15,
и вычисление
(Я?4 . . . Ж])2 + . . . + (Хп . . . Ж„_3)2
можно выполнить со сложностью 5(1 + о(1))п.
Если р = 5 и п кратно 4, то к = 4 и
х mod 5 = fa ... Ш])2 + ... + (хп ... хп-у)2 mod 5,
и для вычисления
(я4 • • • Ж])2 + ... + (яп ... жп_3)2
применяется та же схема, что и для р = 15.
Иногда (например, если р простое и порядок двойки по мо-
дулю р четен) можно найти такое к, что 2к + 1 делится на р. Из-
вестно, что минимальное такое к равно половине порядка двойки
по модулю р и является делителем числа <р(т)/2, где ср — функ-
ция Эйлера.
Для вычисления
х mod р = (хп ... х\ )2 mod р
тогда можно воспользоваться формулой
х modp = (хк... х})2 ~ (х2к • • ж*+1)2 + • • •
... i (хп ... Жп+i-n mocj mod р
и вычислить эту знакопеременную суммы со сложностью
5(1 + о(1))(п + к).
По сравнению с предыдущим методом число разрядов в полученной
сумме может уменьшиться почти в два раза (если log2 п/к = o(fc)).
При р = 5 указанный метод применим, но не дает преиму-
щества. Но при р = 11 и п = 64 небольшое преимущество уже
160
Глава 16. Сложность операций модулярной арифметики
проявляется. Действительно, тогда можно выбрать к = 5 и вычис-
лить знакопеременную сумму
(х5... Ж|)2 - (жю • . . Ж6)2 + . . • + (ж64 • • • Ж6|)2 = 0/9 • • • 2/1)2,
где J/9 — знаковый бит, после чего (уэ... 2/1 )2 mod 11 можно вы-
числить с помощью небольшой таблицы.
Если же взять к = 10, то вычисляется сумма
(жш ... Ж|)2 + (ж20... жц)2 + ... + (ж64... ж61)2 = (г/1з... 2/1)2,
после чего (j/u ... у\)2 то<111 можно вычислить с помощью таб-
лицы.
При р — 13 и п = 64 можно выбрать к = 6 и вычислить
знакопеременную сумму
(ж6... Ж])2 - (Ж]2... ж7)2 + ... + (ж64. •. ж6|)2 = 0/ю • • • У\)г,
где ум — знаковый бит, после чего (ую ... ?/i)2 mod 13 можно
вычислить с помощью таблицы.
Если при нахождении суммы
(ЖД; . . . Ж])2 + . . . + (хп . . . Xji-^-1—п mod к)1
сложение А-битных чисел выполнять по модулю р с тп-битным
результатом, то полученная сумма тоже будет тп-битной и приво-
дить ее по модулю уже будет не нужно. Этот прием эффективен
при малых р. Например, для сложения по модулю 3 можно вос-
пользоваться вместо формулы
(ж2Ж|)2 + (У2У\)2 = (z3Z2Z})2
формулой
(ж2Ж1)2 + (у2у} )2 mod 3 = (u2ui)2,
Ui=Z]®Z3, U2 = Z2 Ф Z]Z3.
Так как
21=Ж1Фу1, <г2 = ж2 ф у2 Ф Ж12/1, z3 = (ж2 ф y2)xiy} Ф х2у2
Глава 16. Сложность операций модулярной арифметики
161
и
(я] ©3/1)2:13/! = О,
то
U2 = Z2 © ZiZ3 = Z2 Ф ®2!/2(Ж1 Ф 3/1) =
= ((®2 ® У1) © ЯГ13/1) + (х2у2)(х} ф ух).
Сложность построенной схемы равна 10.
Поэтому, применяя эту схему для сложения по модулю 3 двух
2-битных чисел, можно вычислить
(^2®1)2 + (®4^з)2 + • • • mod 3
со сложностью 5п - 7.
Еще один метод вычисления остатка по модулю р основан
на использовании китайской теоремы об остатках. Этот метод
пригоден только для составных р и применяется в комбинации
с описанными выше методами при фиксированном р.
Пусть р = pi ... р* и числа pj попарно взаимно просты. Поло-
жим Pi равным произведению всех чисел Pj, кроме р;. Пусть Ri —
остаток от деления Р< на р;, тогда Ri взаимно просто с pi, и поэто-
му существует такое з,,0 < Sj < р,, что SiRi = 1 modp,. Значит,
для любого число ViSiPi делится на любое Pj, j а при деле-
нии на pi получается остаток Tj. Поэтому число
g = T]S]Pi + ...+rt3tPt
при делении на Pi дает остаток для каждого i = 1,..., t. Тот же
остаток будет получаться при делении на р, числа г = q mod р.
Поэтому для вычисления г = п mod р можно вначале вычислить
все ri = п mod р,, а потом найти г по формуле
г = г 18]Pj + ... + rt3tPt mod р,
так как число
г = q mod р
при делении на р, дает те же остатки, что и п, значит, п - q кратно
р, т. е. п mod р = г = q mod р.
162
Глава 16. Сложность операций модулярной арифметики
В качестве примера рассмотрим вычисление п по модулю
р — 15. Так как р = 15 = р\р2 = 3 • 5, то
Р} =5, Р2 = 3,
R\ = Pi mod pi = 5 mod 3 = 2,
R2 = P2 mod p2 = 3 mod 5 = 3,
значит,
Si = Pf1 mod pi = 2-1 mod 3 = 2,
s2 = R21 mod p2 = 3-1 mod 5 = 2,
поэтому
n mod 15 = TjSiPi 4- r2s2P2 mod 15 = Ют] + 6r2 mod 15,
где n = n mod pj. Однако указанный метод не будет в этом случае
иметь преимущество перед описанным выше методом вычисления
х mod 15.
Рассмотрим еще в качестве примера вычисление п по модулю
р = 143. Так как
Pi = 13, Р2 = 11,
Pi = Р] modpi = 13 mod 11 = 2,
Р2 — Р2 mod р2 = 11 mod 13 = -2,
значит,
Si = Pf1 mod pi = 2-1 mod 11=6,
s2 = Рр1 modp2 = —2-1 mod 13 = 6,
поэтому
п mod 143 = г 1 si Pi + r2s2P2 mod 143 = 78ri + 66r2 mod 143,
где Ti = n mod pi. Так как pi 4-битные числа, то и ri тоже. Для
вычисления 78r t + 66r 2 mod 143 проще всего применить подходя-
щую таблицу.
Эффективность указанных методов при применении к боль-
шим числам все же ненамного выше простого деления. Чтобы
убедиться в этом, оценим сложность их применения.
Обозначим D] (т, п) сложность вычисления остатка от де-
ления m-значного числа на n-значное. Введем еще обозначение
Глава 16. Сложность операций модулярной арифметики
163
D^N) для сложности вычисления остатка при делении N на а,
который далее обозначаем N mod а, где Ь — основание системы
счисления, в которой заданы m-разрядное число N и п-разрядное
число а. Обозначим orda b такое наименьшее г, что br - 1 кратно
а. Это обозначение имеет смысл только при (a, b) — 1.
Обобщением признаков делимости на 9 и 11 являются сле-
дующие признаки делимости на 6 - 1 и b + 1 в Ь-ичной системе
счисления: для любого W = (ит ...щ)ь справедливы равенства
N = nub(N) mod(b - 1) и N = щ — U2 + U3 — ... ± mod(b + 1).
Если вместо операций обычного сложения и вычитания исполь-
зовать операции по mod(fe - 1) и mod(b + 1), каждая из которых
сводится к двум обычным операциям сложения—вычитания (одна
из которых к тому же почти тривиальна), то получаем оценку
Da,b(X) < 2(т - 1)
при а = Ь ± 1. Справедливы следующие теоремы, которые приво-
дятся без доказательства.
Теорема 24. Пусть (a, b) = 1, г = ord0 b < т. Тогда при т -> оо
„ _ Vb(N) „ аьтп
"7—:—h 2m -I-----F
IM
4- (2r + 0-6 + o(l)) logj I — I + D](r, n) + 0(r),
где ab =
Следствие. Если г —> оо и г = o(mlog2^), то
Da,b(N) < + 2m < 3m,
а в среднем Da,b(N) < 2-m.
164
Глава 16. Сложность операций модулярной арифметики
Представим а в виде произведения аоДь где (a\,b) = 1, ао
делит Ьк при некотором к, и положим г = ordO| Ь.
Теорема 25. При т/ log2 b оо
Da,b(N) + 2т+ + (2т++ р( 1)) log6 (у )
+ Pi (г, п) 4- О(г) + (1 + о( 1 ))n2 log2 Ъ.
Следствие. Если bn = o(mlog^4/3^), то D\(m, ri) < Зт, и
D(m, ri) < Do(m, ri) + Зт + о(т).
Если остаток от деления на данное п-разрядное число а най-
ден, то, вычитая его из делимого, получаем число, заведомо де-
Петер Монтгомери
лящееся на а. Есть ли какой-нибудь способ
быстро выполнить деление в этом случае,
т. е. когда делимое делится на а без остатка?
Такой способ предложили Гренлунд и
Монтгомери.
Они предложили свести деление к умно-
жению. Пусть вначале а нечетно. Найдем
(т- п + 1)-разрядное число А, такое, что
аА = 1 mod 2m~n+1.
Теорема 26. Деление данного m-разрядного числа N на а
можно выполнить по формуле
-. = NA mod 2m~n+1
liiliillie
со сложностью Mo(m - n + 1).
Доказательство. Заметим, что
- = (оА) mod 2m""+' = NA mod 2m-n+1.
a \ a /
Глава 16. Сложность операций модулярной арифметики
165
Так как число 0 N/a < 2т "+1, то по произведению NA mod
2m—n+1
это число восстанавливается однозначно.
Указанный алгоритм деления очевидно быстрее общего быст-
рого алгоритма деления с остатком, и его можно выполнять, ис-
пользуя как усеченный школьный алгоритм, так и усеченный ал-
горитм Карацубы.
Если же число а четно, то оно имеет вид 2fcaj, где ai нечетно.
Так как N/a = (N/2k)/ay, первое деление выполняется очевидно
бесплатно (просто отбрасываются нули в младших разрядах), и за-
дача сводится к делению на нечетное число а\.
Число А можно вычислить заранее, например, с помощью
расширенного алгоритма Евклида.
Есть и другой способ это сделать. Он основан на использова-
нии ньютоновых итераций
Жп+1 = ®п(2 — ахп).
В качестве а?] можно взять любое нечетное число, например 1,
но лучше взять Xi = а, так как тогда сразу
х\а = а2 = 1 mod 8.
Если ахп = 1 mod 2к, то
1 - axn+i = (ахп - I)2 = О mod 22к,
откуда по индукции получаем, что ахп = 1 mod 23'2 , значит, при
I = [log2 2fc/3l
ахi = 1 mod 2к.
Полагая к — т - п + 1, получаем, что в качестве А можно взять
xt mod 2п~т+\
где I = flog2 2(п - т + 1)/3]. Оценим сложность вычисления ж/.
Для вычисления Xfc+i при уже вычисленном Xk можно использо-
вать формулу
Xfc+i = Xk(2 - axk) mod 23’2 .
166
Глава 16. Сложность операций модулярной арифметики
Сложность вычисления по ней не больше -2Мо(3 • 2к) +12 • 2к. Сум-
мируя и учитывая, что Мо(я/2) Mq(x)/2, получаем окончатель-
ную оценку сложности вычисления Xi при 1 = |’log22(n — m + l)/3]
в виде
4М0(3 • 21) + 24-24 4М0(2(т - п) + 1) + 16(m - п + 1) =
= 4Мо(2(т - п)) + О(т - п).
Указанный способ имеет меньшую сложность, чем основанный
на расширенном алгоритме Евклида, во всяком случае, если поль-
зоваться оценкой последнего в общем случае. Если применить
указанный алгоритм для деления произвольного числа на произ-
вольное же число, то оценка сложности будет
Мо(т -п) + 4Мо(2(т - п)) + О(т - п),
причем в некоторых случаях она может понижаться до
5Мо(т - ri) + О(т - ri).
При (т - п)/п -+ 0 данная оценка лучше, чем оценка теоремы 18,
но при т/п -+ оо она хуже, чем оценка теоремы 17.
Укажем также способ быстрой проверки, делится ли нацело
данное беззнаковое число п на нечетный делитель d. Для это-
го заранее вычислим мультипликативное обратное D к числу d
по модулю 2W, где W — длина машинного слова, одним из указан-
ных выше методов. Очевидно, что D нечетно, и если п пробегает
все возможные значения от 0 до 2W - 1, то nD mod 2W — оста-
ток от деления nD на 2W (записываемый очевидно младшими W
битами произведения) тоже пробегает (но в другом порядке) все
числа от 0 до 2W - 1. □
Задача 40. Докажите сформулированный выше факт.
Если же п кратно d, то
ля
— = nD mod 2 ,
d
Глава 16. Сложность операций модулярной арифметики
167
поэтому, когда п пробегает все кратные d числа из рассматривае-
мого интервала
О, d, 2d,...
2W-1
то nD mod 2й" пробегает (в некотором порядке) все числа от О
до L(2^- l)/dJ.
Задача 41. Убедитесь и в этом.
Из указанных фактов немедленно следует, что если п кратно d,
то nD mod 2W не больше [(2^ - 1 )/dJ, а если п не кратно d, то
nD mod 2W больше [(2^ - l)/d].
На этом основан следующий алгоритм тестирования делимо-
сти нацело на данное нечетное число d, который мы приведем
для примера в случае d = 25 (фактически это признак делимости
на d в двоичной системе). Заранее вычисляем, что число
D = (11000010100011110101110000101001)2 = (C28F5C29)i6,
такое, что dD = 1 mod 232. Также заранее вычисляем число
С =
232 - 1
25
= (АЗГ70АЗ)16.
Умножаем D на п командой умножения, позволяющей вычислять
64-битный результат, и оставляем от него младшие 32 бита. Срав-
ниваем результат с числом С. Если он больше, то п не делится
на 25, в противном случае делится. Так как умножение 32-битных
чисел — медленно выполняемая команда, его можно заменить
на сложения—вычитания и сдвиги влево. Для минимизации чис-
ла сложений—вычитаний можно записать D в двоичной системе
с отрицательными битами, минимизируя количество ненулевых
битов. Так как (1111)2 = (10000 - 1)2,(111)2 = (Ю00 - 1)2, то,
выполнив указанные преобразования, получим число, записанное
12 ненулевыми битами. Значит, умножение можно заменить на 9
сложений, 2 вычитания и 11 сдвигов влево. Все операции факти-
->32
чески проводятся по модулю 2 .
168 Глава 16. Сложность операций модулярной арифметики
Конечно, можно определить, делится ли число на 25, переведя
его в десятичную систему, в которой указанная проверка очевидна.
Но эта процедура требует более сложного программирования и вы-
полняется медленнее, хотя и может быть сведена только к опера-
циям сложения—вычитания.
Почти все результаты этого раздела имеют аналоги для опе-
раций в системах счисления с произвольным основанием Ъ и для
операций с многочленами, но мы не будем здесь их рассматривать.
Глава 17
Умножение и деление на константы
Когда он [ Тьюринг] переходил к чтению моей ра-
боты, то обычно бывал великодушен в оценке',
особенно он любил маленькие программистские
трюки (кое-кто сказал бы, что он слишком их
любил, чтобы быть «хорошим» программистом)
и добродушно посмеивался, как мальчик, над ма-
ленькими хитростями, которые я использовал.
Джеймс X. Уилкинсон.
Некоторые замечания математика-вычислителя
(лекция при получении премии Тьюринга за 1970 г.)
Вопрос о делении на константы не представляет особого инте-
реса для тех, кто пользуется только калькулятором. И в том и в дру-
гом случае вычисления выполняются по алгоритмам, работающим
с любыми числами, а в случае вычислений на калькуляторе ско-
рость их выполнения практически не зависит от того, с какими
числами они выполняются. Однако для вычислений на компью-
тере это уже не так. Дело в том, что умножение и деление целых
чисел на компьютере — довольно медленные операции по срав-
нению со сложением—вычитанием и тем более с логическими
операциями типа покомпонентной конъюнкции или дизъюнкции
машинных слов, а также операциями сдвига машинного слова в ту
или иную сторону. Если же в умножении или делении один опе-
ранд — заранее известная константа, и тем более, если операции
с этой константой надо выполнять часто, то их можно существен-
но ускорить с помощью следующих простых приемов.
Умножение на константу положительных целых чисел в ряде
случаев можно свести к небольшому числу сложений и сдвигов.
170
Глава 17. Умножение и деление на константы
Например, если константа в двоичной записи имеет мало единиц,
т. е. представима в виде
с = 2“° + 2“' + ... + 2“*,
то умножение х на нее сводится к сдвигам числа х на оо, а1»• • • > dk
позиций влево (сдвиг на s позиций влево означает появление s
нулей в младших разрядах и равносилен умножению на 2s, разуме-
ется, в предположении отсутствия переполнения, которое проис-
ходит, если результат не вмещается в разрядную сетку компьютера)
и к - 1 сложению. При небольших к соответствующая подпро-
грамма будет работать быстрее, чем использование команды умно-
жения.
На самом деле вопрос об умножении на константы не так
прост, как это кажется на первый взгляд. Для его оптимального
решения полезно применить аддитивные цепочки. Рассмотрим,
например, умножение х на 45. Так как 45 = (101101)2, то 45ж
можно, применяя бинарный метод для аддитивных цепочек, вы-
числить следующим образом:
t<— 4х, r<-t + x, t+-2r,
t<—t + x, t+-4t, t*—t + x.
Однако возможны и другие варианты, столь же эффективные,
например
t\ <— 4х, ^2"*—8ж, <з <- 32х,
r*—t\+x, + r*-r + t\
(второй вариант бинарного метода). Этот вариант требует большое
число ячеек памяти и в этом он уступает первому варианту, но зато
он будет быстрее работать на компьютерах, допускающих парал-
лелизацию вычислений (второй вариант бинарного метода имеет
ту же сложность, что и первый, но меньшую глубину, равную
А(п) + 1. В то же время его ширина также равна А(п) +1.) Однако
бинарный метод не всегда оптимален, как нам известно. Напри-
мер, его иногда превосходит метод множителей. И действительно,
Глава 17. Умножение и деление на константы
171
применяя его к умножению на 45 = 5 • 9, получаем следующую
программу:
£-«— 4х + х, r<— 8t + t.
Еще один метод ускорения вычислений связан с использованием
аддитивных цепочек с вычитаниями и метода Бута (или любо-
го другого метода) для минимизации числа ненулевых разрядов
в представлении данного числа в двоичной системе с использо-
ванием отрицательных единиц. Например, любое 32-разрядное
число может быть записано таким образом с помощью не более
чем 16 разрядов, что требует не более 15 сложений—вычитаний.
Рассмотрим теперь вопрос о том, как можно быстро делить
на некоторые константы, не пользуясь операцией деления. Де-
ление — самая сложная операция компьютерной арифметики
не только из-за медленности ее выполнения. Трудности при по-
пытке ускорить компьютерные вычисления с большим количе-
ством делений связаны еще и с тем, что используются разные
операции деления в разных компьютерах, и вначале надо выяс-
нить, какое именно деление выполняет ваш компьютер. Известны
три разновидности компьютерного деления. Для всех из них вы-
полняется тождество а — bq + г, где q — частное, г — остаток,
и для положительных а, b эти операции не отличаются друг от дру-
га. Отличия возникают при знаковом делении. Мы в этой книге
в основном рассматривали операции с положительными числами,
а там, где возникали отрицательные числа, использовали так на-
зываемое модулярное деление, в котором остаток всегда неотрица-
телен и меньше делителя. Этот вид деления наиболее естественен
с чисто математической точки зрения. В некоторых компьютерах
используется деление с округлением частного к меньшему значению.
В этом случае частное q = [a/bj не только при положительных
а, Ь, но и во всех остальных случаях тоже. Так называемое отсе-
кающее деление определяется так, чтобы выполнялось тождество
(-а) 4- b = а 4- (-Ь) = -(а 4- Ь),
где а 4- Ъ означает частное от деления а, Ь. Остатки у различных
видов деления могут сильно отличаться друг от друга, но частные
172
Глава 17. Умножение и деление на константы
отклоняются друг от друга не более чем на 1. Приведем формулу
для вычисления частного при отсекающем делении:
п 4- d =
если d^O, nd ? г 0;
если d 7^ 0, nd « $ 0.
Укажем несколько быстрых способов выполнять деление на
некоторые константы.
Деление числа а на степень двойки 2к выполняется путем
сдвига числа на к позиций вправо (разумеется, мы предполага-
ем, что к меньше длины машинного слова, которое, как правило,
равно 32). Такая команда есть в большинстве компьютеров и вы-
полняется она очень быстро. В результате получается частное.
Чтобы найти остаток, нужно выполнить побитовое умножение а
на число 2fc - 1 = (0... 01... 1)г. В результате останутся только к
младших битов, а старшие биты занулятся. Интересно, что ука-
занный способ деления годится и для деления чисел любого знака
при использовании в компьютере модулярного деления и пред-
ставления отрицательных чисел в дополнительном коде (как было
разъяснено в разделе 9).
Задача 42. Докажите факт, указанный выше.
Но в случае отсекающего деления указанный простой способ
не годится.
Задача 43. Придумайте быстрый алгоритм отсекающего деления.
Деление на 3, 5, 7 и другие небольшие числа можно свести
к умножению тем же методом, который использовался для быст-
рого деления в разделе 12. Рассмотрим эти вопросы подробнее.
Предполагаем, что длина машинного слова 32 и компьютер имеет
операцию умножения 32-разрядных чисел, или операцию, кото-
рая вычисляет старшие 32-бита этого произведения. Эта операция
Глава 17. Умножение и деление на константы
173
равносильна делению 64-битного произведения двух 32-битных
чисел на 232. Для нахождения частного q = |п/3] в случае неот-
рицательного п можно вычислить
232 + 2 п
~232
с помощью указанной выше операции умножения п на число
(232 + 2)/3. Это число натуральное, и его, конечно, надо вычислить
самому заранее и написать в тексте программы явно (например
в шестнадцатеричной системе), а не поручать делать это за вас
компьютеру (так можно не ускорить, а замедлить деление).
Для доказательства корректности полезны следующие факты,
которые остаются читателю в качестве задач.
Задача 44. Докажите, что для целых n, d 0 и действительного х
п d + ® = п .d. , если 0 s // \ н Л 1 d
п 'п' 1
d d , если 0 « $ X < d
Задача 45. Докажите, что для целых п, d > О
Действительно, при п > О
232 + 2 п
3 232
п 2п
3 +Г232
174
Глава 17. Умножение и деление на константы
а так как п < 231, то
значит, согласно задаче 44 имеем q = [n/3J.
Если же п < 0, то к частному надо еще прибавить 1. Тогда
232 + 2 п 232п + 2п + 3 • 232
~~3~ 232] + 1 “ L Г232
"232п + 2п + Г
Г232
согласно задаче 45. Поэтому
q 3 + 3 • 232 ‘
Так как -231 п < 0, то
-1 1 ^2п+1 1
~3~ + 3 - 232 3 • 232 ~ 3 • 232'
Значит, согласно задаче 44 имеем q — fn/З") в этом случае. Поэто-
му отсекающее деление выполнено корректно. Если еще нужно
найти остаток от деления на 3, то его можно вычислить как п - 3q.
Можно проверить, что переполнение при выполнении этих опе-
раций не возникает. Умножение на 3 заменяется на сдвиг влево
и сложение по формуле 3g = 2q + g.
Беззнаковое деление на 3 (т. е. деление положительного чис-
ла) выполняется аналогичным образом, но с небольшими отли-
чиями. В этом случае число п может достигать величины 232 — 1,
и использовать умножение на число (232 + 2)/3 уже нельзя, так как
возникающая ошибка 2п/(3 • 232) может стать больше 1/3. Однако
можно использовать умножение на число (233 + 1)/3, при этом
применять команду, вычисляющую старшие 32 бита у беззнако-
вого произведения 32-битных чисел:
9 =
233 + 1 п
~Т~ 232
п п
3 + 3 • 233
Так как всегда 0 п < 232, то 0 < п/(3 • 233) < 1/3, и согласно
задаче 44 имеем g = |_n/3j. Остаток от беззнакового (т. е. обычного,
Глава 17. Умножение и деление на константы
175
«модулярного») деления на 3 вычисляется так же, как и в случае
знакового деления.
Для выполнения знакового деления на 5 аналогичным обра-
зом хотелось бы использовать число (232 + 4)/5, но ошибка будет
слишком большой и иногда результат будет отличаться на едини-
цу от верного. Однако, можно использовать множитель (233 + 3)/5
следующим образом: умножаем п на этот множитель командой
умножения знаковых чисел, которая вычисляет старшие 32 бита
результата, потом полученное число сдвигается вправо на одну
позицию. Эти действия равносильны делению 64-битного резуль-
тата обычного знакового умножения на 232 и взятию целой части
от полученного числа:
п Зп
5 + 5 - 233. '
Для 0 п < 231 ошибка равна Зп/(5 • 233) и заключена в пределах
от 0 до 1/5. Поэтому согласно задаче 44 имеем q = [n/5j. Если же
п < 0, то алгоритм прибавляет к вычисленному ранее q единицу,
и получается
233 + 3 п . , 233п + Зп + 5 • 233
п Зп + Г
2^ + 3 п
5 233
<1 =
5 233J L 5 • 233
’233п + Зп+ Г
согласно задаче 45. А так как
1 Зп + 1
“5 < Т233- <0,
то согласно задаче 44 имеем q — [п/5"|. Поэтому отсекающее деле-
ние выполнено корректно. Если еще нужно найти остаток от де-
ления на 5, то его можно вычислить как п — 5q. Можно проверить,
что переполнение при выполнении этих операций не возникает.
Умножение на 5 заменяется на сдвиг влево на две позиции и сло-
жение по формуле 5q = 4q + q.
176
Глава 17. Умножение и деление на константы
При знаковом делении на 7 не удается аналогичным вы-
ше приведенному способу использовать множители (232 + 3)/7 и
(233 + 6)/7 из-за слишком больших ошибок, а лишенный этого не-
достатка множитель (234 + 5)/7 не помещается в 32-битовом слове.
Однако умножение на это число можно заменить на умножение
на отрицательное число (234 + 5)/7 — 232 и последующее сложение
и сдвиг вправо на две позиции. Более точно, алгоритм таков: умно-
жаем п на М = (234 + 5)/7 - 232 с вычислением старших 32 раз-
рядов, что дает результат q = [пМ/232]; прибавляем к нему п
и получаем q <— q + п = |пМ/232 + nJ; сдвигаем на две позиции
вправо, т. е. делим на 4, и получаем q+- [g/4j = [[пМ/232 + nj/4j.
В итоге при п О имеем
9 =
пМ /
+"]/4
234п + 5п /
7 • 232 J/4
п _ 5п
7 + 7 • 234
согласно тождеству
а
bd
Задача 46. Докажите вышеприведенное тождество и двойственное
к нему тождество
Для 0 п < 231 ошибка равна 5п/(7 • 233) и заключена в пре-
делах от 0 до 1/7. Поэтому согласно задаче 44 имеем q = [п/1\.
Если же п < 0, то алгоритм прибавляет к вычисленному ранее q
единицу, и получается согласно задаче 45
9 =
+ 1 =
п 5п + 1
7 + 7 • 234
В этом случае ошибка лежит в пределах от -1/7 до 0, поэтому
согласно задаче 44 имеем q = [п/7]. При выполнении всех ука-
занных вычислений переполнение нигде не возникает. Поэтому
отсекающее деление выполнено корректно. Если нужно найти
Глава 17. Умножение и деление на константы
177
остаток от деления на 7, то его можно вычислить как п - lq.
Можно проверить, что переполнение при выполнении этих опе-
раций не возникает. Умножение на 7 заменяется на сдвиг влево
на три позиции и вычитание по формуле lq = 8q - q.
При беззнаковом делении на 7 нельзя использовать множите-
ли (232 + 3)/7, (233 + 6)/7, (234 + 5)/7 из-за слишком больших оши-
бок, но можно использовать множитель М = (235+ 3)/7 - 232. Одна-
ко более элегантная схема была предложена Гренлундом и Монт-
гомери. Она основана на следующем тождестве
д + п
2р
п — q
2
1-
Применяем это тождество к q = [Мп/232]. Вычитание не вызывает
переполнения, так как 0 q п. Сложение также не вызывает
переполнения, поскольку
on
и 0 q, п < 2 . Алгоритм заключается в выполнении следующих
операций:
Тогда
Быстрое деление можно организовать и в случае произволь-
ного постоянного (т. е. заранее известного) делителя d > 2. Для
этого надо уметь по данному размеру машинного слова W (обычно
W = 32) и данному делителю d, 2^d<2w~\ находить наимень-
шее целое тп, 0 тп < 2W, и целое р W, такие, что
тп
~2р"
для 0 < п < 2W 1
п
d
178
Глава 17. Умножение и деление на константы
и
Число, которое будет использоваться в алгоритме для умножения,
тогда определяется следующим образом:
{т,
w
m-2w
П s' ™ s nW-1,
0 ТП 2 ,
01Г-1 s . мв
2 С т < 2 .
Число р выбирается из условия
2Р > пс (d - (2Р mod d)),
где
пс =
d - 1 = 2w~l - 1 - (2W~' mod d),
а знак a mod b означает остаток от деления а на b при обычном
(«модулярном») делении. Можно доказать, что если предыдущее
неравенство всегда имеет решение и если оно выполнено для
некоторого р, то оно будет выполнено и для больших значений р.
Решить это неравенство можно с помощью бинарного или даже
линейного поиска.
После выбора числа р полагаем
2Р + d - (2Р mod d)
т~ d
Можно показать, что 0 т < 2й", и если р и тп выбраны, исхо-
дя из указанных выше условий, то будет обязательно выполнено
нужное нам равенство
тп п
~2Р~] = [d
для 0 п < 2W ’ и
тп
+ 1 =
п
d
Доказательство этих фактов громоздкое и поэтому опускается.
Читатель может его найти в книге Г. Уоррена «Алгоритмические
трюки для программистов», где также приведены программы для
вычисления р и тп и рассмотрен случай d < 0, а также случай
беззнакового деления.
Глава 18
Некоторые быстрые алгоритмы
работы с битами
Я изучал эти маленькие программные самород-
ки с тем же наслаждением, с которым другие
пьют пиво или едят сладости. Я просто не мог
остановиться. Каждая такая программа ока-
зывалась для меня находкой, в каждой из них
была интеллектуальная глубина, элегантность
и даже своеобразная поэзия.
Гай Л. Стил младший, 2002
(из предисловия к кн. Генри С. Уоррена
Hacker’s Delight)
Встречаются ситуации, когда приходится выполнять опера-
ции не с числами, а с битами, составляющими эти числа (или ма-
шинные слова). Для этого используются команды языка ассем-
блера. Но и язык С (и C++) имеет возможности для непосред-
ственной работы с битами. Для быстрого выполнения различных
манипуляций с битами в программистском фольклоре и в лите-
ратуре известно множество различных эффективных программ.
Замечательная коллекция таких трюков содержится в уже упоми-
навшейся книге Г. Уоррена. Приведем здесь некоторые из них.
Рассмотрим задачу подсчета числа единичных битов в ма-
шинном слове (т. е. количества единичных разрядов в данном
32-битном числе х). Известно много элегантных и эффективных
решений этой задачи. Приведем одно из самых лучших. Заметим,
что рассматриваемая задача очень близка к задаче построения
логической схемы, выполняющей суммирование п однобитных
180
Глава 18. Быстрые алгоритмы работы с битами
чисел в двоичной системе счисления. Известно, что такую схему
можно построить следующим образом. Разобьем эти числа на па-
ры и сложим каждую пару. Получим п/2 двухбитных чисел. Эти
числа опять разобьем на пары и сложим каждую пару. Получим
п/4 трехбитных чисел. Разобьем эти числа на пары и сложим
каждую пару. Получим п/8 четырехбитных чисел. Далее получа-
ем п/16 пятибитных чисел и т. д. В результате получится одно
(log2 n4- 1)-битное число (предполагаем, что п есть степень двой-
ки), которое и равно сумме всех п чисел, а другими словами,
количеству единиц среди них.
Указанную схему при п = 32 можно промоделировать следу-
ющей компьютерной программой. Сначала вычисляем
а; & (010101... 0101)2
и получаем число
(0жз10ж29 • • • 0^1)2-
Аналогично получаем число (Ожз2Ожзо... 0а:2)2 в результате опера-
ции
х^(х> 1)& (010101 ...0101)2,
где х 1 означает сдвиг битов числа х на один разряд вправо.
Потом складываем полученные числа. Все вместе это выполняется
следующим образом:
х^х& (010101... 0101)2 + (х » 1) & (010101... 0101)2.
В результате получится число (^з2... 2/1 )2, такое, что
(?/2i?/2i-l)2 = x2i + x2i-1, 1 = 1, .... 16.
Значит, выполнив 4 команды, мы параллельно сложили 16 пар
чисел. Далее выполняем команды
х <- (х & (00110011... 0011)2) + ((ж » 2) & (00110011... 0011)2).
В результате получится число, состоящее из четверок битов, ко-
торые являются двоичными записями восьми сумм
X4i 4“ *^4i— 1 + x4i-2 4" Х41—3, t — 1, . . . , 8.
Глава 18. Быстрые алгоритмы работы с битами
181
Заметим, что первый бит в каждой четверке нулевой, так как сумма
четырех однобитных чисел трехбитна.
Далее выполняем аналогичным образом команды
ж *-(ж & (00001111... 00001111)2) +
+ ((ж » 4)& (00001111... 00001111)2).
В результате получится число, состоящее из восьмерок битов, ко-
торые являются двоичными записями четырех сумм
»8i + a;8i-i + ... + ж8,_7, i=l,...,4.
Заметим, что левая половина битов в каждой восьмерке нулевая,
так как сумма восьми однобитных чисел четырехбитна.
Далее выполняем аналогичным образом команды
ж(ж & (00000000111111110000000011111111)2) +
+ ((ж » 8)& (00000000111111110000000011111111)2).
В результате получится число, состоящее из двух блоков по 16 бит,
которые являются двоичными записями двух сумм
®16i *2* 16г—1 “И • • • 2*161—15) i 1, . . . , 2.
Заметим, что левая половина битов в каждом блоке нулевая, так
как сумма 16 однобитных чисел пятибитна.
Далее выполняем аналогичным образом команды
ж *- (ж & (00000000000000001111111111111111)2) +
+ ((ж » 16)&(00000000000000001111111111111111)2)
и получаем окончательно нужную нам сумму, в которой левая
половина битов нулевая, а ненулевыми могут быть только правые 6
битов. Заметим, что каждую строку, кроме первой и второй, можно
упростить, устраняя первую конъюнкцию и перегруппировывая
скобки. Например, третью скобку можно переписать в виде
ж <- (ж + (ж > 4)) & (00001111... 00001111)2.
182
Глава 18. Быстрые алгоритмы работы с битами
При этом результат работы каждой строки не изменится, так
как каждый из четырехбитных блоков, на которые разбивается
число х, полученное в результате работы первых двух строк, имеет
нуль в самом левом бите, поэтому при сложении этих четырех-
битных блоков не происходит переноса в другие блоки. Первую
строку можно упростить, заменив на следующую:
х *—х — ((ж» 1) & (0101... 01)2).
Результат при этом не изменится, потому что при вычитании
в каждой паре соседних битов будет производиться операция
22l(2a?2i+i + X2i) - X2i+i22t = 22'(x2i+i + X2i).
Далее эту программу можно несколько упростить, заменив по-
следнюю строку на следующую:
х •*- х + (х > 16).
Полученный результат будет совпадать с правильным только в 16
правых битах, но нужная нам информация содержится именно
в них, точнее даже в 6 самых правых. Поэтому для правильной
работы программы достаточно добавить строку
return х & (00... 0111111)2.
Аналогичным образом можно заменить и предпоследнюю строку
в исходной программе на
х *— х + (х > 8).
Результат тогда будет совпадать с правильным в самой правой
восьмерке битов, в следующей восьмерке он, возможно, будет не-
правильным (ненулевым), а в следующей — опять правильным,
причем сумма этих правильных результатов (чисел, двоичные за-
писи которых задают указанные восьмерки) будет окончательным
результатом программы. Поэтому, если после этой строки выпол-
нять уже измененные командные строки
х *- х + (х 16), return я: & (00... 0111111)2,
Глава 18. Быстрые алгоритмы работы с битами
183
окончательный результат все равно будет верным. Известны также
много других эффективных программ для решения той же задачи.
Некоторые из них основаны на следующих формулах, доказатель-
ство которых предлагается в виде задач.
Задача 47. Обозначим с' Докажите, что 11®Н = ®- /мк/ X .2. у бк 1T0t X .4. з п-битнс )ГО ЧИ( X 2”-' зла х через ||х||.
Задача 48. Обозначим (х <& i)rot циклический битовый сдвиг на г
позиций. Докажите, что
П-1
11®Н — ~ О"* mod 2".
»=о
Указание. Каждый бит при сдвигах пробегает все возможные позиции,
и сумма полученных таким образом чисел по модулю 2" равна
®(11... 1)2 mod 2" = -х.
В качестве применения быстрого алгоритма вычисления ||я||
можно найти знакопеременную сумму битов
S(x) = Xi - Х2 + Х3 - . . . + Ж31 - ®з2.
Очевидно
з(х) = ||а; & (0101... 01) || - ||ж & (1010... 10) ||, -16 в(х) 16.
В разделе 16 было показано, что остаток отделения неотрицатель-
ного числа ж на 3 можно найти, не выполняя деления, вычислив
s(x) и заметив, что х mod 3 = s(x) mod 3. Далее быстрее всего
воспользоваться предвычисленной таблицей остатков по модулю 3
чисел от -16 до 16. В случае знаковых чисел в определении з(х)
нужно заменить — х32 на +®зг. Тогда в формулу для вычисления
з(х) надо добавить слагаемое ((х 31) < 1), если компьютер
выполняет сдвиг знаковых чисел вправо с заполнением слева ну-
лями, а если такой команды нет, но есть команда правого знако-
184
Глава 18. Быстрые алгоритмы работы с битами
вого сдвига, при котором слева все биты заполняются знаковым
битом, тогда надо вычесть это слагаемое.
Вместо з(х) можно использовать с той же целью формулу
а?1 + 2x2 + хз + 2ж4 + ... + ®3i + 2ж32
(для положительных чисел). Тогда вычисление чуть быстрее:
s(x) = ||z|| + ||я&(10... 10)2||.
Но размеры используемой далее таблицы немного возрастут.
Подобный же прием можно использовать и при вычислении
остатка от деления на 7, но в нем уже придется три раза применять
функцию ||ж||. Возможно, в этом случае более быстрой окажется
программа, вычисляющая
s(x) = X) + 2x2 + 4®з + Х4 + 2а?5 + 4»б + ...
по формуле
з(х) = (х 30) & (0... 0111)2 + ...
... + (х » 3) & (0... 0111)2 + х & (0... 0111)2.
Остаток от деления на 15 можно вычислять с помощью функции
s(x) = X] + 2x2 + 4яз + 8ге4 + х5 + 2^6 + 4я7 + 8ж8 + ...,
задаваемой формулой
з(х) = (ж»28)&(0...01111)2 + ...
... + (я > 4) & (0... 01111)2 + х & (0... 01111)2
еще быстрее. Правда, размер используемой в конце таблицы воз-
растет до 120 чисел. Если составляющие ее числа от 0 до 15
заменить на их остатки по модулю 3 или 5, получим быстрые про-
граммы вычисления х mod Зия mod 5. Возможно, первая из них
будет быстрее, чем указанная выше. Но для 64-разрядной маши-
ны, видимо, первая программа будет быстрее.
Глава 18. Быстрые алгоритмы работы с битами
185
В разделе 16 был приведен алгоритм Гренлунда—Монтгомери
для быстрого беззнакового деления в случае, когда заранее из-
вестно, что остаток равен 0. Там же отмечалось, что его мож-
но применять и для деления с нахождением остатка, если найти
остаток каким-нибудь алгоритмом без вычисления частного, вы-
честь его из делимого и применить алгоритм деления без остатка.
Например, для деления на 3 или на 7 можно применить ука-
занные выше алгоритмы вычисления остатка, не использующие
команды умножения и деления, а потом применить алгоритм
Гренлунда—Монтгомери. Например, в случае деления нацело на 7
этот алгоритм выглядит следующим образом. Заранее вычисляем
мультипликативное обратное к 7 по модулю 232, которое равно
(5 • 232 + 1)/7.
Задача 49. Проверьте этот факт без калькулятора.
Умножаем делимое на это число и оставляем в результате
младшие 32 бита (если не происходит переполнения, то результат
находится простой командой умножения, которая может выпол-
няться чуть быстрее, чем умножение с получением старших 32 би-
тов, используемая в алгоритмах деления, указанных в разделе 17).
Функцию || ж || можно также применить для быстрой проверки
машинного слова х на четность, т. е. для вычисления суммы его
битов по модулю 2. Для этой цели достаточно обычную сумму
битов з преобразовать в з & (00... 01)2. Но еще быстрее будет
работать следующая программа:
у = х*(х> 1); у = у'(у> 2); у = ук(у > 4);
у = у'(у>8); у = у~(у> 16),
в которой знак'означает покомпонентное сложение по модулю 2.
Нужный нам бит четности оказывается в младшем разряде числа у,
поэтому в конце надо добавить команду у = у & (0... 01)2.
С помощью функции ||ж|| можно эффективно решить задачу
поиска числа старших нулевых битов в данном машинном слове
186
Глава 18. Быстрые алгоритмы работы с битами
(как всегда, 32-битном). Сначала выполняется следующая про-
грамма:
х = ж|(ж >1); х = ж|(ж >2); х = ж|(ж > 4);
х = х\(х >8); х = ж|(ж 16)
(знак | в ней означает покомпонентную дизъюнкцию), в конце рабо-
ты которой получается число у, составленное из следующих битов:
(^32, V Язь ^32 V a?3i V Жзо, . . . , Ж32 V Ж31 V... V®1).
Очевидно в начале этого слова стоят нули, а потом идут сплошь
единицы. Если к нему применить команду ~ у (замена всех би-
тов на их отрицания: нулей на 1 и наоборот), то получим слово,
в начале которого идут единицы, а потом сплошь нули. К этому
слову применяем подпрограмму, вычисляющую сумму битов. Она
и дает нам число ведущих нулей в слове. Функция nl(x) — число
ведущих нулевых битов, тесно связана с функцией Llog2 ж].
Задача 50. Докажите, что
[log2 arj = 31 - nl(x), [log2 ж] = 32 — nl(x - 1).
Задача 51. Как быстро вычислить число завершающих нулевых битов?
Маленькие хитрости в работе с битами
Как обнулить младший (крайний справа) единичный бит в
данном числе ж, т. е., например, вместо числа ж = (... 1010001000)2
получить число (... 10100000000)2? Для этого надо выполнить вы-
числение ж & (ж — 1).
Задача 52. Докажите данное утверждение.
Указание. В рассмотренном примере ж - 1 = (... 1010000111)2 и поком-
понентная конъюнкция уничтожает крайние справа единицы.
Глава 18. Быстрые алгоритмы работы с битами
187
Как выделить в числе х крайний справа единичный бит (или
получить нуль, если х = 0), т.е. например из числа
х = (10... 1010001000)2
получить число (... 0000001000)2? Для этого надо выполнить вы-
числение х&(-х).
Задача 53. Докажите данное утверждение.
Указание. Пусть знаковое число х = -агз2231 4- (з?з1 • • • ^1)2, тогда
-х = хз223' - (o?3i ...11)2 =
= -(1 - ж32 ) 231 + (231 - (®3i... £1)2) =
= —“'Ж32231 + (231 — 1 — (жз| ... £1)2) + 1 =
= — -1Ж32231 + (1Ж31 . . . ~'Х\)2 + 1 = “'Ж + 1,
т. е. для смены знака в дополнительном коде нужно инвертировать все
биты и к результату прибавить 1. Например, если х = (10... 1010001000)2,
то
-х = (01 ...0101110111)2 +1 = (01 ...0101111000)2,
т. е. последние нули в х сначала заменяются на единицы, а после прибав-
ления единицы опять превращаются в нули, а предшествующая им едини-
ца сначала превращается в нуль, а потом опять становится единицей (по-
сле прибавления единицы). Дальше переносы, появившиеся при прибав-
лении единицы, не распространяются, и все биты, лежащие левее упомя-
нутой единицы, остаются инвертированными к соответствующим битам
числа х. После покомпонентной конъюнкции они превращаются в нули.
Как выделить в числе х крайний справа нулевой бит, т. е., на-
пример, из числа (01... 0111)2 получить число (000 ... 0001000)г?
Для этого можно использовать формулу
->х & (х + 1).
Задача 54. Докажите данное утверждение.
Существует много тождеств, связывающих побитовые логиче-
ские и арифметические операции друг с другом. Приведем список
188
Глава 18. Быстрые алгоритмы работы с битами
таких тождеств, оставив доказательства читателю. Отрицательные
числа в них представлены в дополнительном коде.
• —х = ->х + 1;
• —х = -у(х - 1);
• ->х = -х - 1;
• —>х = х + 1;
• ж) = ж + 1;
• x + y = x-(-iy)~ 1;
• х + у= (х®у) + 2(х&у);
• х+ у = (хУ у) + (х &у);
• х + у = 2(ж V у) - (х © у);
• х - у - х + -iy + 1;
• х -у - (ж ф у) - 2(->ж & у);
• х - у = (ж & ~*у) - (-ух & у)-,
• х - у = 2(ж & ->у) - (ж Ф у);
• жфу = (ж Vу) - (ж&у);
• ж & -iy = (ж V у) - у;
• ж & ->у = ж - (ж &у);
• ~>(ж-у) = у —ж — 1;
• -у) = ~'х + у;
• ж V у = (ж & -iy) + у,
• ж&у = (-IX V у) —'ж;
• ж = у = (ж & у) - (ж V у) - 1;
• ж = у = (ж & у) + -’(ж V у).
В рассмотренных задачах речь шла о представлении некото-
рых отображений множества всех машинных слов в себя с по-
мощью некоторой комбинации логических побитовых операций
и операций сложения—вычитания и умножения. Возникает во-
прос: как охарактеризовать все такие отображения, представимые
указанным способом? Ответ дает следующая теорема.
Глава 18. Быстрые алгоритмы работы с битами
189
Теорема 27. Отображение машинных слов может быть реа-
лизовано посредством побитовых логических операций и опе-
раций сложения—вычитания и умножения тогда и только то-
гда, когда в данном отображении каждый бит результата за-
висит только от битов исходных операндов в той же позиции
или правее ее.
Доказательство. Чтобы доказать эту теорему в одну сторону до-
статочно заметить, что любая из упомянутых в ее формулировке
операций обладает указанным в теореме свойством. Если пред-
ставить себе, что рассматриваемое отображение реализуется не-
которым абстрактным устройством, на входы которого в первый
такт его работы подаются младшие (крайние справа) биты операн-
дов, во второй такт подаются следующие биты (вторые с правого
края) каждого операнда и т. д., а на выходе этого устройства в пер-
вом такте появляется младший бит результата, во втором такте —
следующий бит и т. д., то указанное свойство рассматриваемого
отображения есть не что иное, как свойство детерминированно-
сти, известное в теории конечных автоматов, а рассматриваемые
отображения есть детерминированные отображения (ограничен-
ные, впрочем, тем, что количество тактов работы этого устройства
не превосходит 32). Понятно, что композиция детерминирован-
ных отображений снова будет детерминированным отображени-
ем, поэтому отображение, реализуемое рассматриваемым в теоре-
ме способом, обязательно будет детерминированным. Из теории
автоматов известно, что любое детерминированное отображение,
рассматриваемое на ограниченном числе тактов, можно предста-
вить с помощью побитовых операций дизъюнкции, конъюнкции
и отрицания, а также операции сдвига влево обнулением младшего
бита (операции х-> (ж<С 1)) при условии использования констан-
ты 1 = (0.. .01)г- Этим теорема доказана и в обратную сторону. □
Задача 55. Проведите доказательство теоремы 27 во всех деталях.
Указание. Допустим, что у = f(x) удовлетворяет условиям теоремы, тогда
= где fi — некоторая булева функция. Согласно известной
190
Глава 18. Быстрые алгоритмы работы с битами
теореме алгебры логики функцию можно выразить в виде формулы
через булевы операции конъюнкции, дизъюнкции и отрицания. Рассмот-
рим машинные слова
Х= (Ж32 ...2:1)2, (х < 1) = (Жз] . . . 2JiO)2, ...,
(х » i) = (z32-i... X|0... 0)
и применим к ним побитовые операции х & у, хУ у, ->х в том же по-
рядке, в каком они применялись в упомянутой формуле. В результате
получится машинное слово Pi, в котором г-я компонента будет равна
Pi = №1, • • •, Xi). Поэтому
Yi & (0... 0 Uh^0)2 = (0... 0yfi... 0)2 = Zi.
* i
Остается выполнить указанные вычисления при всех г и заметить, что
(... (Zt V Z2) У Z3... Z32) — (узг • • • 2/1)2 = У — f(x)-
Из теоремы следует невозможность представления указанным
в ней способом, например, отображения, которое заключалось бы
в обнулении в слове х крайнего левого единичного бита. Так, не-
возможно определить, является ли данный единичный бит край-
ним левым, имея только информацию о битах, расположенных
справа от него. По той же причине невозможно указанным спо-
собом выразить циклический сдвиг, сдвиг вправо или функции
nl(x), ||х||. Тем не менее многие словарные функции, не удовле-
творяющие условиям теоремы, можно компактно выразить через
машинные операции.
Задача 56. Функция вычисления модуля знакового числа abs(2?) мо-
жет быть выполнена без применения команд ветвления следующим
образом. Сначала вычисляем у = (х » 31) с помощью команды зна-
кового сдвига. В результате получаем слово у, все биты которого
совпадают со знаковым битом числа х. Потом вычисляем
abs(a:) = (х ф у) - у.
Поле битов машинного слова или массива машинных слов
можно использовать для представления множеств в компьютере.
Глава 18. Быстрые алгоритмы работы с битами
191
Для этого элементам множества достаточно сопоставить единич-
ные биты числа, и само множество будет представляться этим
числом (или массивом чисел, если рассматриваемые множества
слишком велики). При таком представлении теоретико-множе-
ственные операции (объединение, пересечение и пр.) будут пред-
ставляться битовыми логическими операциями (пересечению со-
ответствует конъюнкция, объединению — дизъюнкция, дополне-
нию — отрицание, симметрической разности — сумма по моду-
лю 2 и т.д.), равенство множеств будет соответствовать равенству
чисел, включение одного множества в другое равносильно равен-
ству х&.у = х. Иногда требуется рассматривать только множества
одинаковой мощности (с равным числом элементов). Чтобы сге-
нерировать все такие множества, полезно иметь функцию, которая
машинное слово с данным числом единиц переводит в машинное
слово с тем же числом единиц, и изображающее большее чис-
ло, причем следующее по величине среди чисел, изображающих
множества с данным числом единицы. Например, эта функция
должна переводить число (... 00101110)2 в число (... 00110011).
Задача 57. Докажите, что указанную функцию можно вычислить сле-
дующим образом:
з-» ж & (-ж); r-ts + x', у -> г V (((х Ф г) » 2) 4- з).
Указание. Нужно найти крайнюю справа группу единичных битов, перед
которой стоит хотя бы один нуль. Пусть, например х = (... 011110000)2.
Тогда з = (0... 010000)2, т. е. з представляет крайний справа единичный
бит числа х. Далее
г = з + х = (... 100000000)2
и крайняя справа единица в этом числе стоит на позиции нуля, соседнего
слева с упомянутой группой единиц в числе х. Потом находим число
z = r®x = (... 100000000)2 Ф (... 011110000)2 = (0... 0111110000)2,
в котором по сравнению с х левый соседний с блоком единиц нуль
заменился на единицу, а все левые по отношению к нему позиции запол-
нились нулями. Далее, вычисляя (г 2) 4- з, сдвигаем число у вправо
на две позиции, а потом еще на к - 1 = log2 з позиций вправо, потому
192
Глава 18. Быстрые алгоритмы работы с битами
что s = 2fc_|, где к — номер позиции крайней правой единицы в х.
Получаем в рассматриваемом примере (0... 0111)2, т.е. единичный блок
переместился на правый край и стал короче на один бит в сравнении
с исходным блоком. Наконец, находим
y = zVr = (... 100000111)2.
В этом числе первая единица единичного блока сдвинулась влево на одну
позицию, а остальные сдвинулись на правый край. Полученное число
содержит столько же единиц, как и число х, но оно больше его, так
как в нем вместо нуля, соседнего слева с упомянутым блоком единиц,
появилась единица, причем среди всех чисел, больших х и содержащих
такое же число единиц, полученное число будет наименьшим.
Задача 58. Как обменять в одном числе (одном регистре) два поля
битов равной длины? Более точная формулировка. Пусть машинное
слово х = ABCDE, где А, В, С, D, Е его подслова, причем подсло-
ва В и D имеют одинаковую длину и их надо поменять местами,
т. е. получить слово у = ADCBE. Обозначим тп маску поля D, т. е.
слово, в котором на позициях поля D стоят единицы, а на остальных
позициях — нули. Пусть к — суммарная длина слов С, D (т. е. длина
слова CD). Тогда для вычисления у можно сделать следующие ма-
нипуляции:
и = (ж ф (х » к)) & m; v = (и fc); y = x®u®v.
Указание. Число и в позициях поля D содержит биты подслова В® D
и имеет нули в остальных позициях (из-за конъюнкции с маской тп).
Поэтому число v содержит биты слова B®D на позициях поля В (и нули
в остальных позициях). Значит,
х ® и Ф v = (ABCDE)2 Ф (000(В ф Р)0)2 Ф (0(В Ф £>)000)2 =
= (ADCBE)2 = у.
Глава 19
Вычисление некоторых
целочисленных элементарных функций
Поразительно, сколько всего можно сделать,
используя только операции двоичного сложе-
ния и вычитания вместе с некоторыми по-
разрядными операциями.
Гай Л. Стил младший, 2002
(из предисловия к кн. Генри С. Уоррена
Hacker’s Delight)
Целочисленным квадратным корнем называется функция [ ,
а целочисленным логарифмом — [log& хJ.
Целочисленный квадратный корень
Один из методов вычисления этой функции приведен в раз-
деле 13 (теорема 20). Там же дана оценка сложности этого вычис-
ления. Приведем еще один метод (близкий к упомянутому), но без
оценки сложности. Опишем вариант этого метода для примене-
ния на 32-разрядном компьютере. Он начинает работу с выбора
некоторой начальной целочисленной аппроксимации д0 к кор-
ню у/a, а затем делается серия уточнений этой аппроксимации,
вычисляемой по формуле Ньютона—Терона </„+1 = (9п + о,/дп)/2.
Точнее, для проведения очередной итерации используется следу-
ющая модификация этой формулы:
194 Глава 19. Вычисление целочисленных элементарных функций
Корректность алгоритма обосновывается следующим утвержде-
нием:
если дп > [Та], то [Va] < 5n+i < 9т
если дп = [x/aj, то L>/aJ < 5n+i < Lv^J + 1-
Для доказательства заметим, что так как дп — целое, то
Далее так как дп > [x/aj и дп — целое, то дп > у/a. Выберем е
так, чтобы дп = (1 + б)х/а. Тогда б > 0, и так как
ffn +Q
. 19п .
— 9п+\
9п + а
2дп
то
2 + 2б + б2
2(1 +б)
откуда
LVa] =
(1 + б)2а + а
2(1 + б)х/а
2 + 2б
2(1 +е)
— 9п+1 < - — 9т
^9п
2 + 2б + б2
2(1 + е)
— 9п+1 < 9т
что и доказывает первое утверждение.
Для доказательства второго заметим, что если дп = |_x/aj, то
Va - 1 < дп < у/a, значит, д2п < а < (дп + I)2, поэтому
9п — LtfnJ ~~
д^+9п
. ^9п .
Рп+1
9^ + (9п +1)2
2<7п
9п +14
1
2^п.
откуда в силу целочисленности дп и неравенства 1/(2дп) < 1 имеем
Lx/aJ = дп </п+1 [дп + 1J = 9п + 1 — Lv^J + 1.
Начальное приближение к у/х можно вычислить по формуле go = 2s,
где з = 16 - nl(x - 1)/2, nl(x) — функция подсчета числа старших
нулевых битов, быстрый алгоритм вычисления которой был указан
Глава 19. Вычисление целочисленных элементарных функций 195
в разделе 18. Разумеется, 2s компьютер вычисляет командой 1 з.
На первом шаге алгоритм вычисляет
до + х/д0
9]~ 2
с программной строкой д\ = (до + (х s)) 1, а потом выпол-
няет итерацию
до тех пор, пока впервые не получим ду до- Экспериментально
проверяется, что алгоритм заканчивает работу после пяти итера-
ций (а для малых х и раньше).
Другой практически приемлемый алгоритм вычисления цело-
численного квадратного корня можно построить, применяя метод
бинарного поиска (или «метод вилки»). В этом методе после каж-
дой итерации вычисляются числа а, Ъ, такие, что а [ж] + 1,
b [к], и для выполнения следующей итерации вычисляется
т = (a + b) » 1, и если т2 > х, полагаем b = т- 1, в противном
случае а = т + 1. Итерации продолжаются, пока ft > а, и после
их окончания результат выводится в виде а — 1. В этом алгорит-
ме не выполняются деления, но итераций он производит больше
предыдущего. Чтобы уменьшить их количество, нужно подходя-
щим образом выбрать начальные значения а, Ь. Например, можно
взять а = l,b — [_i/4j + 1. Действительно, ж/4 + 1 у/х, так
как х2/4 + х/2 + 1 > х равносильно (ж/2 - I)2 0. В качестве Ь
можно также по аналогичной причине взять [я/8J + 2, \_х/16] + 4,
[х/32] +8 и т. д., при этом, конечно, для больших х выгоднее брать
значения из конца этого списка, а так как величина х может быть
заранее неизвестна, то лучше всего взять b = х 5 -I- 8, но, ра-
зумеется, не больше 216 - 1. При небольших х алгоритм работает
быстро, но при 1 I 232 - 1 в среднем требует 16 итераций.
Можно также выбрать начальные значения следующим образом:
L / (33-nl(x)\\ , t 3
ь = О « (-Г12))-’’ а = Ь+2-
При х 10 000 это дает некоторое уменьшение числа итераций.
196 Глава 19. Вычисление целочисленных элементарных функций
Целочисленные логарифмы
Быстрый алгоритм для вычисления [log2 хJ был указан в раз-
деле 18.
Укажем несколько быстрых алгоритмов для вычисления
[logio a?J. Один из них основан на поиске в таблице. Таблица со-
стоит из 11 значений 0,9,99,999,..., 999999999, 232 - 1. Для на-
хождения [log] о х\ надо найти в этой таблице два соседних числа,
между которыми заключено число х. Для этого можно применить
бинарный поиск, и даже линейный поиск, выполнив цикл
for (i=-l; i++) { if (x <= table[i+1]) } return i;
Использование таблицы можно заменить последовательным умно-
жением на 10, как в следующей программе:
р=1;
for (i=-l; i<=8; i++) {
if (x < p) return i;
p=(p«2)+p;
p=p«l;
}
return i;
Если воспользоваться подпрограммой, быстро вычисляющей nl(x),
и приближенной формулой
и । ~ 9Li°g2(z)J
[logio zj « -,
то, используя по существу ту же таблицу, можно вычислить цело-
численный десятичный логарифм программой из одной строки:
у = (9*(31-п1(х)))»5;
if (х > table[у+1]) у=у+1;
return у;
Умножение на 9 лучше выполнять так: 9*х=(х«3)+х.
Глава 20
Быстрые операции
с дробно-рациональными функциями
Асимптотически наилучшие алгоритмы
зачастую оказываются наихудшим ре-
шением для тех задач, к которым они
применимы.
Георг Кантор, Ханс Цассенхауз, 1981
(цитируется по книге Д. Кнута
«Искусство программирования»)
Сначала рассмотрим операцию сложения. Операция умноже-
ния дробно-рациональных функций сводится очевидным образом
к умножению многочленов, а эта операция уже рассматривалась
в разделах 1, 2, 6. Алгоритм быстрого умножения многочленов
будет приведен в конце этого раздела.
Быстрое сложение дробно-рациональных функций
Справедлива следующая теорема.
Теорема 28. Сумму правильных рациональных дробей
ИМ
можно вычислить со сложностью
(3M(deg Q) + 2 deg Q) [’log2 s],
где M(n) сложность умножения многочленов степени п.
198
Глава 20. Операции с дробно-рациональными функциями
Доказательство. Предполагаем, что
М(х + у) М(х) + М(у).
Доказательство можно получить, применяя итеративно для сло-
жения дробей метод деления пополам (т. е. разбивая сумму на две
равные, или примерно равные подсуммы, вычисляя их, а потом
складывая результаты) и замечая, что сложение двух дробей сте-
пени d требует не более 3Af(d) + 2d операций, а число итераций
не превосходит [logjs] .
Аналогичное утверждение можно доказать и для сложения
числовых дробей. □
В следующей лемме дается тождество, которое называется раз-
ложением дроби на простейшие дроби.
Лемма 58. Пусть P/Q — произвольная правильная дробь
степени п, Q = q} ... qa, (qit qj) = 1, i^j. Положим Qi = Q/qi,
тогда справедливо равенство
в
Pi = (P mod qi • mod gt) mod g,.
Доказательство. Достаточно проверить, что (Qi,...,Q3)= 1, вос-
пользоваться линейным представлением наибольшего Общего де-
лителя
1 = 23
i=l
и заметить, что
Ui mod qi = Qix mod д,
P = A P Vi = A (P-Pi) mod
0 S' ® h *
Глава 20. Операции с дробно-рациональными функциями
199
Теорема 29. Разложение на простейшие дроби можно вы-
числить со сложностью
Е(п) + 4М(п) + 5п + riog2 s](22M(n) + 10n),
где Е(п) — сложность расширенного алгоритма Евклида, при-
мененного к многочленам степени п.
Доказательство. Предполагаем, что Е(х+у) Е(х)+Е(у). Допу-
стим, что Р mod qi и Qi mod qi уже вычислены. Тогда Qf1 mod qi
находится co сложностью E(deg дД применением к паре Qi mod qi,
qi расширенного алгоритма Евклида, который вычисляет линей-
ное представление
1 = (Qi, Qi) = UQi + Vqi,
где U = Qi' mod qi, a pi = (Pmodgi) • (Qt~* modgj находится co
сложностью 6M(deg qi) + 5 deg qi путем умножения и последую-
щего деления результата на д, (с помощью теоремы 15). Отсюда
имеем оценку Е(п) + 6М(п) + 5п. □
Лемма 59. Сложность вычисления последовательности
Р mod qi, i = 1,..., з,
оценивается как
|’log2 s](8M(n) + 4n) - М(п).
Доказательство. Для вычисления Р mod qi применяем метод «де-
ления пополам». Строим последовательность многочленов
Qat...ak, Oti = 0, 1, k С l(s) = riog2 s],
такую, что
Q ~ QoQl» • • ’ > Qa\t.. ,,ak ~ Qai,.. .,a*,0 ' Qat,.. .,a*,l > • • •
и количество сомножителей в соседних многочленах Qg.o, Qa,\
отличалось бы не более, чем на 1. Вычисляем последовательность
200
Глава 20. Операции с дробно-рациональными функциями
многочленов Ра рекурсивно:
«>«*+! = Р5 mod Qg,at+I.
Если положить degQg = ng, то сложность вычисления обоих мно-
гочленов Ра,а, Ра,\ оценивается (с помощью лемм 11 и 25) как
3 (М (Па, 1) + Па, 1) + 2M(ns) + Па,0 + 3(М (Па,о) + ^g,o) +
+ 2М(па) + пз,1 < ЗМ (ng) + 4ng + 4М (ng) = 7М (ng)+4ng,
а полная сложность — как
flog2 «1
/(«)
23 23 7M(n«)+4пз
А=1 «1=0,1;.. ,а*=0,1
+ 4 ng
«I =0, = 0,1
[log2 s](7M(n) + 4n).
Сложность вычисления последовательности многочленов Qg
также оценивается с помощью метода «деления пополам» как
([log2 з] - 1)ЛГ(п). Поэтому полная сложность вычисления Р mod &
оценивается как
[log2 s|(8M(n) + 4n) - M(n). □
Лемма 60. Сложность вычисления последовательности
Qi mod qif
оценивается как
[log2 s](14M(n) + 6n) - M(n).
Доказательство. Так как
Qi mod qi =
Q mod qf
Qi
Глава 20. Операции с дробно-рациональными функциями
201
то сложность вычисления этой последовательности оценивается
тем же методом (используем лемму 25) как
[log2 з](8М(2п) + 8п) - М(2п) 4- 4М(п) 4- 4п.
Заметим, что возникающая в вычислениях последовательность
остатков по modQg представляется в виде Qa • Ra, где последо-
вательность Rs вычисляется рекурсивно:
Ra,ak+i = Qa,l—ak+\ ' Ra mod Qa,ai,+\ >
причем окончательные результаты Qi mod qi имеют вид Ra........
Так как deg R$ <Па, то сложность вычисления обоих многочленов
Rafi, -Ra, i оценивается (с помощью теоремы 15) как
M(ng) 4- 3(M(2ns,o) + 2ngto) 4- М(па 4- ng,о) 4- ngj 4-
4- M(2nQfi, Па,1) 4~ М(Па) 4- 3(M(2ng,i) 4- 2riati) 4- М(Па 4-Пй,1) 4-
4- Па,0 4- М(2Па,1, Пз,о) 4M(2ng) 4- М(ЗПа) 4- ЗМ(Па) 4- 7Па,
а полная сложность как
[log2 з] (4М(2п) 4- М(3п) 4- ЗМ(п) 4- 7п).
Если вычислить последовательность Rs раньше, чем последова-
тельность Ps, то при вычислении последней не надо будет «обра-
щать» многочлены Qs, так как это уже сделано при вычислении
предыдущей последовательности (это ясно из леммы 25), что поз-
воляет уменьшить оценку сложности на ЗЛГ(п) 4- Зп, и оценка
будет иметь вид
[log2 sl(4M(2n) 4- М(3п) 4- ЗМ(п) 4- 4п).
Можно еще уменьшить оценку, если перед умножением
Ra,at+i = Qa,i-ak+t * Ra Hiod Qg,a*+1
привести Ra по modQ3,at+l> тогда «обращать» многочлен Qs при-
дется тоже только один раз, на умножение будет уходить 2М(п),
а на приведение по модулю —
ЗМ(п) 4- Зп 4- 4М(п) 4- 2п
202
Глава 20. Операции с дробно-рациональными функциями
операций. Суммарная оценка тогда будет иметь вид
Plog2 s](14M(n) + 6n) - M(n).
Можно еще заметить, что при выполнении условия ng,o = ngj
равенства степеней соседних многочленов эта оценка еще умень-
шается на 2flog2 s]M(n). Применяя леммы 59,60, получаем утвер-
ждение теоремы.
Аналогичное утверждение можно доказать и для числовых
дробей. □
Быстрый китайский алгоритм
Интересно отметить, что быстрый вариант китайского алго-
ритма тесно связан с указанным выше быстрым алгоритмом раз-
ложения на простейшие дроби.
Пусть даны многочлены qi,... ,qk, (qi, qj) = 1, j, и мно-
гочлены pi,.... pk, degpi <rii = degqt, n = ni 4-... 4- n*. Китай-
ская теорема об остатках утверждает существование и единствен-
ность по mod Q многочлена Р, такого, что Рmod qi= Pi, 1 г С к.
Положим
Q
Q = 91 • • • qk, Qi = —, Ri = Qi modqi,
Qi
тогда справедливы равенства
в 3
P = ^2(PiQiRi) mod Q = Q
i=l i=l
(PiRi) mod qj
Qi
Теорема 30. Вычисление многочлена степени меньшей п по
данным остаткам от деления на данные многочлены ф имеет
сложность не выше
Е(п) 4- l(k)(13M(ri) 4- 6п) 4- 6М(п) 4- 5п.
Доказательство. Поэтому для вычисления многочлена Р доста-
точно найти произведения = PiRi mod , что делается так же,
Глава 20. Операции с дробно-рациональными функциями 203
как и выше, со сложностью
Е(п) 4- 6М(п) 4- 5п 4- [log2 А;К10М(п) + 5п) — М(п),
а потом вычислить сумму правильных дробей степеней п,
р А п
‘З h ®
так же, как и в теореме 28, со сложностью flog2 АГ|(ЗМ(п) 4- п).
Итоговая оценка имеет вид
Е(п) 4- [log2 fc](13M(n) 4- 6n) 4- 6M(n) 4- 5n. □
Быстрая интерполяция
В случае когда qi(x) = x-Ci, а ц и Pi принадлежат полю коэф-
фициентов, как известно, многочлен Р, построенный с помощью
обратного китайского алгоритма, является решением интерполя-
ционной задачи Р(с$) = pi.
Теорема 31. Интерполяция выполняется со сложностью
[log2 n] (13М(п) + 6п) 4- 6М(п) 4- 6п.
Доказательство. В этом случае вычисление Я, = Qf1 mod^ по
известным Qi mod д, вместо применения расширенного алгоритма
нахождения НОД многочленов требует просто п операций деле-
ния. Из сказанного выше вытекает, что сложность ее решения
оценивается как
/(п)(13М(п) 4-6п) 4-6М(п) 4-6п.
Если п является степенью двойки, то с учетом сделанного выше
замечания эту оценку можно немного уменьшить.
Прямой китайский алгоритм вычисляет по многочлену Р его
остатки по заданным модулям qi и, в частности, просто его зна-
чения в заданных точках с,. Оценка его сложности фактически и
была получена выше. □
204 Глава 20. Операции с дробно-рациональными функциями
Еще о быстром умножении многочленов
Оценим сверху сложность умножения многочленов над по-
лем действительных или комплексных чисел. Любопытно, что это
можно сделать без упоминания о быстром преобразовании Фурье.
Для вычисления многочлена г, являющегося произведением
многочленов р и q степени меньшей п/2, естественно выполнить
их умножение по модулю хп - 1, для чего вначале надо вычислить
остатки от деления этих многочленов на линейные попарно вза-
к
имно-простые двучлены х - б , получающиеся при разложении
многочлена хп - 1 на множители (например, над полем С — по-
лем комплексных чисел), т.е. попросту вычислить значения p(efc)
и q(ek), к = 0,..., п-1, потом, попарно перемножив их, получить
значения r(ek) = p(€k)q(€k) и, применяя обратный китайский алго-
ритм, восстановить многочлен г. Удобно при этом предполагать п
равным степени двойки (добавляя, если надо, нулевые младшие
коэффициенты к многочленам р и q).
Применяя для вычисления значений р(ек) и q(ek), к = 0,...,
п - 1, метод «деления пополам», находим вначале
pmodzn/2-l, р mod 2гп/2 + 1, ?modo:n/2-l, gmoda?^2 + 1,
потом вычисляем остатки по модулям хп/4 + 1, хп/4 - 1, хп/4 4- г,
х ' -гит. д., пока не найдем остатки по модулям х - б ,
к = 0,..., п/2, и, наконец, по модулям х - ек, к = 0,..., п. Так
как деление многочлена степени меньшей т на двучлен степени
т/2 осуществляется школьным алгоритмом со сложностью т, то
сложность всего алгоритма вычисления значений р(еА) и q(ek),
к = 0,... ,п - 1, оценивается как 2п log2 п (умножений и сложе-
ний, выполненных в поле С).
Для восстановления (интерполяции) многочлена г по его из-
вестным значениям г(ек), к = 0,..., n -1, естественно применить
формулу Лагранжа
. - С
к=0
п-1
=f<x) 22
fc=0
r(ek)ek
п(х - €к) ’
Глава 20. Операции с дробно-рациональными функциями 205
где f(x) = хп -1, и сложение дробей выполнить так же, как указа-
но выше. Так как при надлежащем выборе порядка суммирования
все получающиеся дроби будут иметь двучленные знаменатели,
а умножение многочлена степени меньшей т на двучлен сте-
пени т школьным методом имеет сложность т, то сложение
двух таких дробей имеет сложность 4тп, а весь алгоритм интер-
поляции — сложность 2п + 2п log2 п. В итоге получаем известное
равенство M(n) = О(п logn).
Глава 21
Варианты алгоритма Евклида
— Вижу, он заинтересовался математикой.
— Не думаю, что он создан быть простым счет-
чиком, — предупредил Кларк.
— <...> дни напролет сидеть над тетрадями,
корпеть над таблицами логарифмов, кубиче-
скими корнями, косинусами <...>
— Благодарение Декарту, математикам есть
чем заняться, помимо этого, — промолвил Енох.
— Скажите брату, чтобы показал мальчику
Евклида, и пусть он выбирает сам.
Нил Стивенсон. Ртуть (2003)
Со времен Евклида придумано немало новых вариантов его
алгоритма, в основном с целью ускорения работы. Опишем неко-
торые из них.
Алгоритм Евклида
с выбором минимального остатка
Обобщенный алгоритм Евклида определяет последовательность
вычислений вида
а = Ьд2 + б2Г2, Ь = т2дз + ез^з, г2 = r3q4 + е4г4, ....
гк-з = rk_2qk-1 + 6fc-1 rk-1, rk-1 = rkqk,
где
6j = ±l, 0<Ti<r,_i, i > 1, b = ri, a = Го-
Число k - 1 назовем длиной алгоритма. Как и в обычном алгорит-
ме Евклида (а, Ь) = rk. Обозначим Е(а, Ь) минимальную длину
обобщенного алгоритма Евклида для вычисления (а, Ь).
Глава 21. Варианты алгоритма Евклида
207
Алгоритмом Евклида с выбором мини-
мального остатка называется обобщен-
ный алгоритм Евклида, в котором всегда
2r i Tj-i, т. е. на каждом шаге из двух
возможных вариантов деления
П-2 = П-ift-i + ri} где 0 < < П-i,
и
п-2 = n-i(g»-i +1) - (п-i - п)
выбираем тот, при котором получается
минимальный по абсолютной величине Леопольд Кронекер
остаток (если они равны по модулю, то
берем любой из них). Обозначим Lv(a,b} минимальную длину
алгоритма Евклида с выбором минимального остатка. Следующая
теорема показывает, что этот алгоритм является наилучшим, среди
обобщенных алгоритмов Евклида.
Теорема 32 (теорема Кронекера). Справедливо неравенство
£о(а, Ь) < Д(а,6).
Сначала докажем следующую лемму.
Лемма 61. При а > 26
Lo(a, 6) L0(a, а - Ь).
Доказательство. Применим индукцию по а. База (а = 2) очевидна.
Для обоснования шага индукции рассмотрим три случая. Пусть
а 36, a = bq2 + е2г2, 2г2 < 6, тогда a = (а - 6) • 1 + 6, так как
26 a-bna-b = b(q2~l)+e2r2, поэтому Ща, 6) = Lo(a, а-6)-1.
Пусть теперь 26 а < 56/2. Тогда первые два шага алгоритма
в применении к паре (а, 6) имеют вид
а = 6 • 2 + (а - 26), 6 = r2q3 + вуГз, г2 = а-2Ь,
208
Глава 21. Варианты алгоритма Евклида
а в применении к паре (а, а-b) имеют вид
а = (а - Ь) • 2 - (а - 2Ъ),
a-b = b + r2 = г2(?з + 1) + ЕзП-
Поэтому
Lo(a, b) = Ьо(а, а - Ь).
В третьем случае считаем, что 5Ь/2 а < ЗЬ. Тогда первый шаг
алгоритма в применении к паре (а, Ь) имеет вид
а = Ь • 3 - (ЗЬ - а), т2 = ЗЬ - а,
значит,
£0(а, Ь) = L0(b,r2) + 1,
а в применении к паре (а, а - Ь) имеет вид
а = (а - Ь) • 2 - (а - 2Ь) = (а - Ь) • 2 - (Ь - т2),
значит,
Lo(a, а-Ь) = Lo(a - Ь, Ь - r2) + 1.
Так как
a-b — 2b-r2 = b + (b- г2),
то из равенства
а - Ь = (Ь - т2)д3 + «з^з
следует равенство
Ь = (Ь-г2)(?з - 1)+£зТь
поэтому
L0(a, Ь) = 10(а - Ь, Ь - r2) + 1 = £0(Ь - т2, т3) 4- 2 - L0(b, Ь - r2) +1.
Согласно предположению индукции
Ь0(Ь,Ь- г2) = L0(b,r2),
откуда
L0(a, Ь) — Lo(a, а - Ь).
Глава 21. Варианты алгоритма Евклида 209
Для доказательства теоремы применим индукцию и лемму 61.
Пусть
a = 6g24-e2r2, 2r2 О, а — Ь^ + е^.
Если г г = г2, то е2 — е2, (?2 = q2 и согласно предположению
индукции
L0(a, b) = L0(b, r2) + 1 L(b, r2) 4- 1 = L(a, b).
Если же г2 < г'2, то €2 = -б2, g2 = q2 - е2, r2 = b - г2 и согласно
предположению индукции и лемме 61 имеем
L0(a, b) = L0(b, г2) 4- 1 L(b - r2, b) 4- 1 = L(a, b).
Теорема доказана. □
Теорема 33 (теорема Дюпре). Справедливо неравенство
Ьо(а, b) min{ [loga (2д/2 min (a, b) 4- V2) J,
[loga (2\/2(a 4- b) 4- y/2)J - 1}.
Доказательство. Рассмотрим рекуррентную последовательность
Пд_|_| — 2ил 4“ tZn— i) щ — 1, Uq 0.
Лемма 62. Справедливо неравенство
Uk^n 4=> к < [ loga (2у/2п 4- \/2) J.
Доказательство. Формула
ик = 2-3/2((л/2 + l)fc - (1 -
доказывается по индукции. Из нее выводится, что ближайшее це-
лое к числу 2~3/2(\/24-l)fc есть ик. Так как число 2-3/2(V^4- l)fc —1/2
не целое (оно иррационально), то
0 < ик - 2~3/2(^ 4-1)* + | < 1,
210
Глава 21. Варианты алгоритма Евклида
и значит,
ик <: п 4=> 2“3/2(л/2 + l)fc - 1 П,
откуда следует, что
ик п <=$> к [logQ (2л/2тг + V2)J. □
Продолжим доказательство теоремы 33.
Пусть алгоритм Евклида порождает равенства
a = bq2 + €2r2, b = r2q3 + e3r3, г2 = r3q4 + е4г4, ....
rk_3 = rk-2qk-1 + Q-1 Tk- ь г к- j = Tkqk,
где 2г< т,_|, i = 2,... ,к, r\ = b. Тогда
ri = г<+1д-+24-г-+2 > 2ri+i +ri+2, i=l,...,fc-2, rk-i 2rk,
откуда с помощью индукции получается, что
rk-i^ui+l, г = 0,..., к- 1,
значит,
b^Uk, b + r2^ b + uk-i, a + b^Uk~\.
Из леммы 62 следует теперь, что
к [loga (2\/2 min (а, Ь) + \/2) J,
к < [loga(2\/2(a + b) + у/2) J - 1.
Теорема доказана. □
Заметим, что алгоритм Евклида с выбором минимального по
модулю остатка на каждом шаге не более чем вдвое короче по числу
шагов деления обычного алгоритма Евклида. Оценка достигается
на паре чисел F2n-i и F2n.
Бинарный алгоритм Евклида
Рассмотрим еще один вариант алгоритма Евклида — бинар-
ный алгоритм Евклида.
Очевидно справедливы следующие утверждения: если и и v
четны, то (и, v) — 2{и/2, п/2); если и четно, a v нечетно, то (и, v) =
Глава 21. Варианты алгоритма Евклида
211
= (п/2, и); если и и v нечетны, то и — v четно,
|u - v| < max (и, v) и (и, v) = (|u - v|, min (и, v)).
Алгоритм, основанный на этих утверждениях, называется бинар-
ным вариантом алгоритма Евклида. Оценка его сложности дается
следующей теоремой.
Теорема 34 (теорема Кнута—Шал лита). Число вычитаний,
выполняемых бинарным алгоритмом в применении к ларе чи-
сел и, v, не больше 14- [log2 max (и, u)J, и равенство возможно,
лишь когда [log2 (и + v)J > [log2 max (и, v)J.
Доказательство. Положим
тп = [log2 и j, п = |_log2 и].
Пусть тп = п. Можно считать, что и > v. Выполнив шаг деления-
сдвига, по индукции получаем, что нужно еще выполнить не более
тп 4- 1 шага деления. Если бы понадобился ровно тп 4- 1 шаг, то
мы имели бы
[_log2 ((и - и)2-г 4- v)J > |tog2 чЬ
где г 1 — число уже выполненных сдвигов вправо, что невоз-
можно, так как
(и - v)2~r 4- v (к - v) 4- v = и.
Пусть тп > п. Выполнив шаг деления, получим пару (и, v), где
и1 = (ц - v)2 r, г 1, [log2 u'J = тп - к, к 1.
Согласно предположению индукции осталось сделать не бо-
лее 14-max (тп - к, п) тп шагов. Если требуется ровно тп шагов,
то согласно предположению индукции [log2 (и1 4- v)J тп, откуда
[log2 (и 4- v)J
log2
2
> llog2 2(и 4- v)J >
> m 4-1 > Ll°& 4J •
□
212
Глава 21. Варианты алгоритма Евклида
Выше были получены оценки числа шагов для различных ва-
риантов алгоритма Евклида. Представляют интерес также оценки
сложности всех вычислений, выполняемых этим алгоритмом.
Задача 59. Докажите, что обычный алгоритм Евклида для п-разряд-
ных чисел имеет оценку сложности Е(п) = О(п2).
Если для выполнения арифметических операций в алгоритме
Евклида использовать быстрые алгоритмы деления с остатком, то
можно построить быструю версию алгоритма Евклида, имеющую
сложность О(М(п) log2 п), однако это нелегко доказать.
Алгоритм Евклида можно применять и к многочленам, так-
же многие его варианты имеют полиномиальные аналоги. Напри-
мер, справедливы следующие утверждения, доказательство кото-
рых предлагается выполнить читателю.
Задача 60. Докажите, что обычный алгоритм Евклида для многочле-
нов степени не выше п имеет оценку сложности
ч 7 2 з
Е(п) -п2 + -п.
Указание. Надо учесть необходимость на каждом шаге алгоритма выпол-
нять приведение полученного остатка к виду, в котором старший коэф-
фициент будет равен единице.
Глава 21. Варианты алгоритма Евклида
213
Задача 61. Докажите, что обычный алгоритм Евклида для многочле-
нов степени не выше п имеет оценку сложности
7
-(п2 - тп2) + О(п),
где т — степень вычисленного наибольшего общего делителя.
Задача 62. Докажите, что обычный алгоритм Евклида для многочле-
нов степени п и т имеет оценку сложности
. тп2 5п
Е(п) С 2пт + — + —.
Указание. Сначала рассмотрите случай, когда на каждом шаге алгоритма
степень уменьшается на единицу. Потом покажите, что в общем случае
оценка не выше, чем в этом частном случае.
Глава 22
Еще о схеме Горнера
Если начнем с древних греков, то мы найдем резкое
разграничение чистой и прикладной математи-
ки <...> К чистой математике относится <.„>
евклидово построение геометрии, к прикладной
принадлежат в особенности числовые операции
<...> При этом к последней относились довольно
презрительно — предрассудок, который во мно-
гих случаях сохранился до сих пор, но, во всяком
случае, большей частью только у людей, которые
сами не умеют вычислять.
Феликс Клейн. Элементарная
математика с точки зрения высшей.
Т. 1 (перевод на русский 1933 г.)
Основные применения схемы Горнера связаны с алгебраиче-
скими вычислениями и относятся к компьютерной алгебре. Их
известно на удивление много. Приведем некоторые из них.
Теорема 35. Младшие k + 1 коэффициентов многочлена
р(х + с), равные
Р(с), Р(с). >
можно вычислить со сложностью (Л+1)(2п-&), где n=degp(®).
В частности, все коэффициенты вычисляются со сложностью
Доказательство. Обозначим G(n, k 4-1) сложность этого вычис-
ления. С помощью схемы Горнера со сложностью 2п вычислим
Глава 22. Еще о схеме Горнера
215
q(x) и р(с), где
р(х) = (ж - с)д(я) 4- р(с).
Тогда
р(х 4- с) = xq(x 4- с) 4- р(с),
и для вычисления остальных к коэффициентов достаточно найти к
младших коэффициентов у многочлена q(x + с) степени п - 1.
Поэтому
G(n, к 4- 1) G(n - 1, к) + 2п, G(n, 1) 2п,
значит,
G(n, к + 1) < 2п 4- 2(п - 1) 4-... 4- 2(п - к) = (к 4- 1)(2п - к).
При к = п получаем
G(n, п 4-1) = п(п 4-1).
Тот факт, что коэффициент при хк во многочлене р(х 4- с) равен
p^(c)/fc!, следует из формулы Тейлора.
Впрочем, вот доказательство. Пусть
р(х 4- с) = спхп 4-... 4- С[Х 4- с0.
Продифференцируем к раз обе части этого равенства. Используя
правила дифференцирования, получаем, что
р(к\х + с) = klck + (k+ l)!cfc+i2?4-...4-n(n-1)... (п-к+ 1)спХп~к.
Подставляя вместо х нуль, имеем р^к\с) = kick- □
Следствие.* Для одновременного вычисления значений много-
члена и его производной достаточно 4п — 2 операции, причем
коэффициенты производной не вычисляются.
Теорема 36. Для одновременного вычисления значений р(с)
и р(-с) достаточно 2п 4-1 операции, где п — степень много-
члена р(ж).
216
Глава 22. Еще о схеме Горнера
Доказательство. Разделим p(ir) на х2 — с2. Получим равенство
р(х) = q(x)(x2 - с2) + rix 4- то-
Представляя р(х) в виде суммы многочленов, содержащих толь-
ко четные и только нечетные степени переменной, получим что
р(х) = po(®2) + хр\(х2), где сумма степеней многочленов ро(х)
и pi(x) равна п - 1. Деля их на х - с2, имеем
Ро(^) = qo(x)(x - с2) 4- к0, pi(z) = q\(x)(x - с2) 4- к\.
Отсюда
q(x)(x2 - с2) 4- Г]Ж + г0 = р(х) = ро(х2) + хр{(я2) =
= qo(x2)(x2 - с2) 4- ко + x(q^x2)(x2 - с2) 4- кх) =
= (х2 - c2)(q0(x2) 4- ж(д](ж2))) 4- к\Х 4- ко,
значит,
ri = к], го = ко, q(x) = g0(®2) + x(q\(x2).
Так как вычисление гг и коэффициентов q(x) по числам ki и ко-
эффициентам qi{x) делается «бесплатно», то сложность деления
на х2 - с2 не превосходит 2п - 2. Для вычисления
р(с) = д(с)(с2 - с2) 4- тс 4- г = тс 4- г,
р(-с) = д(-с)(с2 - с2) 4- Г1(-с) 4- го = -т\с 4- г0
нужно дополнительно 3 операции. □
Следствие. Если компьютер имеет два независимо работаю-
щих процессора, то сложность одновременного вычисления р(с)
и р(-с) в 2 раза меньше, чем на однопроцессорной машине.
Рассмотренный алгоритм Горнера «второго порядка» является
простейшим примером так называемого параллельного вычисле-
ния. К сожалению, не все алгоритмы можно «распараллелить».
Но если это удается, и технические возможности позволяют реа-
лизовать распараллеленный алгоритм, то получается существенная
экономия времени.
Глава 22. Еще о схеме Горнера
217
Теорема 37 (параллельная схема Горнера). Если компь-
ютер имеет k параллельно работающих процессоров, операции
обмена между которыми занимают пренебрежимо малое вре-
мя, то вычисление значения многочлена степени п в заданной
точке требует
— + max l(j) + log2 к + 0( 1)
к j^k
единиц времени.
Доказательство. Положим п = тк + з, 0 з < к, и представим
р(х) в виде
k-l s т к-1 тп-1
52 = 22 22 ик^хк1 + 22 22 и*+зхк*-
j=0 j=0 i=0 j=s-f-l i=0
Ha j-м процессоре вычисляем x3pj(xk). Для этого на (к- 1)-м
процессоре вычисляются со сложностью 1(к) + 0(1) степени a?fc-1
и хк и последняя передается на остальные процессоры, которые
тем временем вычисляют степени х3. После этого все процессоры
вычисляют x3pj(xk) со сложностью 2п/к+0(Г) каждый (используя
обычную схему Горнера).
Остается сложить полученные результаты за время log2 к + 0(1),
используя параллельно к/2 процессоров. □
Задача 63. Докажите утверждение следствия, что для одновремен-
ного вычисления значений многочлена и его производной достаточно
4п-2 операции, причем коэффициенты производной не вычисляются.
Задача 64. Предложите быстрый способ вычисления многочленов,
содержащих только четные или только нечетные степени переменной.
Глава 23
Что можно вычислить на счетах
Все это выглядит как чрезвычайно замедлен-
ная киносъемка выполняемого человеком про-
цесса вычисления. Разбор такой механизации
вычисления на нескольких функциях помога-
ет освоиться с мыслью, что и человек обычно
считает совершенно так же, только быстрее.
Роза Петер Рекурсивные функции
(русский перевод 1954 г.)
Воспользовавшись такой простейшей моделью вычислений,
как абак (в России называвшейся просто счетами), можно постро-
ить все здание современной теории алгоритмов. Разумеется, это
понятие надо немного идеализировать и придать ему, например,
следующий вид (как это было сделано американским математи-
ком Ламбеком в начале 60-х гг. XX века, см. [1]).
Пусть нужно вычислить данную числовую функцию
/(жь... ,хп).
Представим себе, что у нас есть счеты, содержащие п «входных»
спиц, на i-й из которых имеется в начальный момент Xi костяшек,
одну «выходную» (первоначально пустую) спицу, на которой бу-
дет получен результат, и некоторое количество (первоначально пу-
стых) «рабочих» спиц. Каждая спица состоит на самом деле из двух
половин, и пока речь шла только о левых половинах. В правой
половине каждой спицы помещается потенциально не ограни-
Роза Петер (Rosza Peter, 1905-1977) — венгерский математик. На русский язык
переведена также ее научно-популярная книга «Игра с бесконечностью» (М., 1967).
Глава 23. Что можно вычислить на счетах
219
ченный запас костяшек, и по нашему желанию мы можем сделать
в любой момент одну из двух операций: либо передвинуть самую
левую костяшку из правой половины спицы в «рабочую» левую
половину, увеличив тем самым «записанное» в ней число на еди-
ницу, либо передвинуть крайнюю правую костяшку из «рабочей»
левой половины спицы в правую «запасную» половину, уменьшив
тем самым «записанное» в ней число на единицу.
Если перейти к терминологии языков программирования, то
мы здесь описали систему регистров машины и две операции,
применимые к ним — инкременцию и декременцию.
Сама программа вычисления на счетах (или на соответствую-
щей идеализированной машине с неограниченными регистрами)
представляет из себя диаграмму, состоящую из кружочков, в кото-
рых написаны номера спиц (регистров), после которых написаны
знаки плюс или минус, указывающие на операции, которые мы
выполняем на этих спицах (регистрах). Из кружочков со знаком
плюс выходит одна стрелка, ведущая в какой-то другой кружочек
(она указывает какую следующую операцию делать). Из кружочков
со знаком минус выходит две такие стрелки. Одна из них помеча-
ется специальным значком * и используется только тогда, когда
на «рабочей» половине спицы не осталось костяшек (в регистре
записан ноль). Тогда операция декременции, естественно, не мо-
жет быть выполнена, и просто делается переход к новой вершине
диаграммы по указанной стрелке. Если же на спице оставались
костяшки (регистр не пуст), то операция декременции выполня-
ется и тоже делается переход к новой вершине диаграммы, но,
естественно, по второй стрелке. Отметим еще, что совсем не обя-
зательно, чтобы разные вершины диаграммы выполняли операции
с разными спицами.
Теперь, чтобы такая диаграмма могла определить работаю-
щую программу, осталось выделить в ней две стрелки — начало
и конец работы программы. Первая из них выделяется среди дру-
гих стрелок тем, что имеет конец в одной из вершин диаграммы,
но не имеет начала в вершинах диаграммы, а начинается в специ-
альном кружке со словом begin, а вторая, наоборот, начинается
220
Глава 23. Что можно вычислить на счетах
в одной из вершин, но не ведет ни в одну из вершин диаграммы,
а ведет в кружок со словом end.
Программа начинает работать со слова begin и заканчивает,
когда придет в слово end (но может и «зациклиться» и нико-
гда не закончить работу). Результатом работы программы мож-
но считать число, записанное на «выходном» регистре. Если это
число всегда совпадает со значением рассматриваемой функции
f(x\,... ,хп), в случае когда она определена при заданных зна-
чениях переменных, и если программа всегда «зацикливается»,
в случае когда эта функция не определена при заданных значени-
ях переменных, то говорят, что программа (вычисления на счетах!)
правильно вычисляет заданную функцию.
Алан Тьюринг
С целью сокращения диаграмм у
сложных программ можно вместо неко-
торых вершин, имеющих одну выходную
стрелку, использовать не оператор ин-
кременции, а кружок с символическим
обозначением какой угодно программы
(называемой в этом случае, естественно,
подпрограммой).
Работу любой такой программы
можно промоделировать и на машине
Тьюринга, если изображать состояние
абака в каждый момент времени на лен-
те машины в виде массивов палочек, разделенных пробелами.
В возможность обратного моделирования поверить труднее, тем
не менее справедливо следующее утверждение, приводимое без
доказательства: класс числовых функций, вычислимых на абаке,
совпадает с классом функций, вычислимых по Тьюрингу 2\
А как известно, на машине Тьюринга можно промоделировать
любые вычисления. Значит, и на счетах тоже можно.
Машина Тьюринга — умозрительное вычислительное устройство, предло-
женное в 1936 г. английским математиком Аланом Тьюрингом (1912-1954) в каче-
стве базиса развитого им варианта построения теории алгоритмов, ставшего с тех
пор общепринятым. Определение машины Тьюринга можно найти, например, в [ 1].
Глава 23. Что можно вычислить на счетах
221
Задача 65. Приведите пример диаграммы, никогда не заканчиваю-
щей работы.
Задача 66. Приведите пример диаграммы, складывающей содер-
жимое двух регистров и помещающей результат во второй регистр
одновременно с обнулением первого регистра.
Задача 67. Приведите пример диаграммы, складывающей содер-
жимое двух регистров и помещающей результат во второй регистр,
но не изменяющей первый регистр (используйте вспомогательный
«рабочий» регистр).
Задача 68. Приведите пример диаграммы, перемножающей содер-
жимое двух регистров и помещающей результат в третий регистр
одновременно с обнулением первого регистра (используйте преды-
дущую программу в качестве подпрограммы).
Задача 69. Приведите пример диаграммы, перемножающей содер-
жимое двух регистров и помещающей результат во второй регистр
без изменения первого регистра (используйте вспомогательный ре-
гистр и предыдущую программу в качестве подпрограммы).
Задача 70. Покажите, как возводить в степень на «счетах» (исполь-
зуйте предыдущую программу в качестве подпрограммы).
Литература
Библиография по теме нашей книги огромна, и приводимый
далее список не претендует на полноту. В него включены неко-
торые источники, использованные автором при ее подготовке,
а также расширяющие и дополняющие ее. Они выбраны из числа
наиболее доступных в разных смыслах, в том числе и по времени
издания.
1. Булос Д., Джефри Р Вычислимость и логика. М.: Мир, 1994.
2. Гашков С. Б., Чубариков В. Н. Арифметика, алгоритмы, слож-
ность вычислений. М.: Дрофа, 2005.
3. Гашков С. Б. Системы счисления и их применения. М.: МЦНМО,
2004.
4. Гашков С. Б. Современная элементарная алгебра в задачах и
упражнениях. М.: МЦНМО, 2006.
5. КнутД. Искусство программирования. Т. 2. М.: Вильямс, 2000.
6. СевиджД. Сложность вычислений. М.: Факториал, 1998.
7. Уоррен Г, мл. Алгоритмические трюки для программистов. М.:
Вильямс, 2004.
URSS.ru URSS.ru URSS.ru URSS.ru
nJ'SSIIII njssun nJSSMn .UJ'SSURnj*ssnn nj-ssnn
Другие книги нашего издательства:
Популярные книги по математике
Пухначев Ю. В., Попов Ю. П. Математика без формул. Кн. 1,2.
Творогов В. Б. Наглядная арифметика и технология быстрого счета: Основы.
Пантаев М. Ю. Матанализ с человеческим лицом, или Как выжить URSS
после предельного перехода: Полный курс математического анализа. В 2 т.
Жуков А. В. Вездесущее число «пи».
Жуков А. В. Прометеева искра: Античные истоки искусства математики.
Жуков А. В. и др. Элегантная математика. Задачи и решения.
Зуев Ю.А. По океану дискретной математики: От перечислительной комбинаторики
до современной криптографии. В 2 т.
Оре О. Приглашение в теорию чисел.
Гильберт Д., Кон-Фоссен С. Наглядная геометрия.
Яглом И. М. Математика и реальный мир.
Яглом И. М. Как разрезать квадрат?
Яглом И. М. Необыкновенная алгебра.
Амелькин В. В. Дифференциальные уравнения в приложениях.
Федин С. Н. Математики тоже шутят.
Ушаков И. А. История науки сквозь призму озарений. Кн. 1-8.
Серия «Знакомство с высшей математикой»
Понтрягин Л. С. Метод координат.
Понтрягин Л. С. Анализ бесконечно малых.
Понтрягин Л. С. Алгебра.
Понтрягин Л. С. Дифференциальные уравнения и их приложения.
Серия «Классический университетский учебник»
Колмогоров А. И., Драгалин А. Г. Математическая логика.
Петровский И. Г. Лекции по теории обыкновенных дифференциальных уравнений.
Гнеденко Б. В. Курс теории вероятностей.
Кононович Э. В., Мороз В. И. Общий курс астрономии.
Ишханов Б. С., Капитонов И. М., Юдин Н. П Частицы и атомные ядра.
Квасников И. А. Термодинамика и статистическая физика. В 4 т.
RJ'SSHn nj’SSMn nj'SSHU njssun njssun nj'SSMR
Тел./факс: +7(499)724-25-45 (многоканальный) E-mail: URSS®URSSju http://UR5S.ru Наши книги можно приобрести в магазинах: «НАУКУ - ВСЕМ!» (и. Профсоюзная, Нахимовский пр-т, 56. Тел. (499) 724-2545) «Библио-Глобус» (и. Лубянка, ул. Мясницкая, 6. Тел. (495) 625-2457) «Московский дом книги» (м. Арбатская, ул. Новый Арбат, 8. Тел. (495) 203-8242) «Молодая гвардия» (и. Полянка, ул. Б. Полянка, 28. Тел. (495) 238-5001, 780-3370) «Дом научно-технической книги» (Ленинский пр-т, 40. Тел. (495) 137-6019) «Дом книги на Ладожской» (м. Бауманская, ул. Ладожская, 8, стр.1. Тел. 267-0302) «СПб. ДОИ КНИГИ» (Невский пр., 28. Тел. (812) 448-2355) «100009 книг» (г. Екатеринбург, ул. Тургенева, 13. Тел. (343) 22-12-979) Сеть магазинов «дом книги» (г. Екатеринбург, ул. Антона Валена, 12. тел. (343) 253-50-10)
URSS.ru URSS.ru URSS.ru URSS.ru
URSS.ru
URSS.ru URSS.ru URSS.ru
URSS.ru URSS.ru UHSS.ru URSS.ru г URSS.ru URSS.ru
Уважаемые читатели! Уважаемые авторы! Наше издательство специализируется на выпуске научной и учеб- ной литературы, в том числе монографий, журналов, трудов уче- ных Российской академии наук, научно-исследовательских ин- ститутов и учебных заведений. Мы предлагаем авторам свои услу- ги на выгодных экономических условиях. При этом мы берем на себя всю работу по подготовке издания — от набора, редак- тирования и верстки до тиражирования и распространения. LIRSS
Среди вышедших и готовящихся к изданию книг мы предлагаем Вам следующие: Серия «НАУКУ — ВСЕМ! Шедевры научно-популярной литературы» Гашков С. Б. Занимательная компьютерная арифметика. Кн. 1,2. Меннхен Ф. Некоторые тайны артистов-вычислителей. Вильямс Дж. Д. Совершенный стратег, или Букварь по теории стратегических игр. Юдин Д. Б., Юдин А.Д. Математики измеряют сложность. Колмогоров А. Н. Математика — наука и профессия. Босс В. Интуиция и математика. Нагель Э., Ньюмен Дж. Р. Теорема Гёделя. Гнеденко Б. В. Беседы о теории массового обслуживания. Гнеденко Б. В. Беседы о математической статистике. Гнеденко Б. В., Хинчин А. Я. Элементарное введение в теорию вероятностей. Мизес Р. Вероятность и статистика. Больберг 0. А. Основные идеи проективной геометрии. Щербаков Р. И, Пичурин Л. Ф. От проективной геометрии — к неевклидовой. Щербаков Р. Н., Пичурин Л.Ф. Дифференциалы помогают геометрии. Стинрод И, Чинн У. Первые понятия топологии. Калягин Ю. М., Саркисян А. А. Познакомьтесь с топологией: На подступах к топологии. Широков П. А. Краткий очерк основ геометрии Лобачевского. Меньчуков А. Е. В мире ориентиров. Фрова А. Почему происходит то, что происходит: Окружающий мир глазами ученого. Уле О. Почему и потому: Учебник физики в вопросах и ответах. Гартман 3. Занимательная физика, или Физика во время прогулки. Ланге В. Н. Физические парадоксы, софизмы и занимательные задачи. Кн. 1,2. Ланге В. Н. Физические опыты и наблюдения в домашней обстановке. Перельман М. Е. А почему это так? Физика вокруг нас. Перельман М. Е. А почему это так? Физика в гостях у других наук. Перельман М. Е. Наблюдения и озарения, или Как физики выявляют законы природы. ЗакгеЦм А. Ю. Системность — симметрия — эволюция в физике, химии, биологии. Покровский В. В. Космос, Вселенная, теория всего почти без формул, или Как дошли до теории суперструн.
По всем вопросам Вы можете обратиться к нам: тел. +7 (499) 724-25-45 (многоканальный) или электронное почтой URSS©URSS.ru Полный каталог изданий представлен в интернет-магазине: http://URSS.ru Научная и учебная литература
URSS.ru - л URSS.ru URSS.ru URSS.ru 4 URSS.ru URSS.ru
URSS.ru URSS.ru
URSS.ru
URSS.ru
+ f (499) 7z4~Z5~45 Академическая
Ул. Вавилова
От м. Профсоюзная:
8 мин. пешком
или одна остановка
наземным транспортом:
автобусы № 67, 67к, 130;
троллейбус № 49
до остановки
«Ул. Ивана Бабушкина»
От м. Университет:
трамваи № 14, 39
до остановки
«Черемушкинский рынок»;
трамваи № 22, 26
до остановки
«Ул. Вавилова»;
автобусы № 67, 67г, 130;
троллейбус № 49
до остановки
«Ул. Ивана Бабушкина»
Доктор физико-математических наук,
профессор кафедры дискретной
математики МГУ им. М. В. Ломоносова.
Автор и соавтор книг «Примени
математику», «Арифметика. Алгоритмы.
Сложность вычислений», «Системы
счисления и их применения»,
«Современная элементарная алгебра»,
«Элементарное введение
в эллиптическую криптографию»,
«Криптографические методы
защиты информации».
Наше издательство предлагает следующие книги:
Математика'
и искусство счета
на компьютерах
и без них
С.Б.Гашиов
занимательная
КОМПЬЮТЕРНАЯ
АРИФМЕТИКА —
ИЛЛЮСТР]
основы
ОРГАНИЗАЦИОННО-
ПРАВОВОЙ
ЗАЩИТЫ
ИНФОРМАЦИИ
ПРДКТИЧЕСКОЕ
РУКОВОДСТВО
КОМПЬЮТЕРНОЙ
□БРОБОТКГЯвЦ
Отзывы о настоящем издании,
а также обнаруженные опечатки присылайте
по адресу URSS@URSS.ru.
Ваши замечания и предложения будут учтены
и отражены на web-странице этой книги
в нашем интернет-магазине http://URSS.ru
URSS
E-mail:
URSS@URSS.ru
Каталог изданий
в Интернете:
http://URSS.ru
ПРОС НАШИ НОВЫЕ КИ+7(499)724-2!Н5
UIXVV КООРДИНАТЫ 117335, Москва, Нахимовский пр-т, 56