Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
abramov_s_a_lekcii_o_slozhnosti_algoritmov.doc
Скачиваний:
136
Добавлен:
11.05.2015
Размер:
2.74 Mб
Скачать

§ 21. Наивная арифметика: деление с остатком

Обратимся к наивному делению с остатком. Здесь мы считаем, что m = mг^ m2.

Предложение 21.1. Пусть T*D(m) сложность по числу битовых операций наивного деления при использовании m в качестве разме­ра входа. Пусть T*^(mъ m2) сложность по числу битовых операций этого же алгоритма при использовании mъ m2 в качестве двух пара­метров размера входа. Тогда

T*D(m) = Q(m2), T^*(m1,m2) = e((m1-m2 + l)m2). (21.1)

Доказательство. Наивное деление a на b сводится к ряду вы­читаний числа b, и в каждом вычитании битовая длина уменьша­емого либо равна, либо на единицу превосходит m2. Битовые затра­ты на каждое такое вычитание не могут превзойти, как мы зна­ем, c{m2 + 1). Количество всех таких вычитаний не превосходит mг-m2 + 1, откуда T^* {mъm2) = O{{mг - m2 + 1)(m2 + 1)) и, после

§ 21. Наивная арифметика: деление с остатком

141

упрощения, Т^(т1г т2) = 0{{тг -т2 + 1)т2) (см. задачу 101). С дру­гой стороны, если, например, а = 21 - 1, Ъ = 2'"2-1, то число вы­читаний равно тг-т2 + 1, и, как следствие, битовые затраты на наивное деление будут не меньше, чем {тг - т2 + 1)т2. Поэтому Т**0(.тъ т2) = GCCni! - т2 + 1)т2).

Оценка T*D(т) = 0{т2) следует теперь из неравенства т2 ^тгт2 ^ ^{тг-т2 + 1)т2. Если взять а = 2т-1, b = 2Lm/2J, то битовые затра- ты на наивное деление будут не меньше чем (т-у+1](тМ+1], и, как следствие, 7^D(m) = Г2(т2). Получаем 7^D(m) = 6(т2). П

Мы не пишем Т*£(тъ т2) = Gt^ - т22) из-за возможности ра­венства тг = т2 (из которого не следует, что а = Ъ). Эта возможность указывает и на то, что неверно соотношение T^l{m1,m2) = Q{m1m2).

Предложение 21.2. При использовании самих положительных це­лых а,Ъ, а^Ъ>1, в качестве параметров размера входа, сложность наивного деления а на Ъ допускает оценку О (log a log Ь). При исполь­зовании а в качестве размера входа имеем оценку О (log2 а).

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

c((Uog2 а] + 1) - (Llog2 Ъ\ + 1) + 1) (Llog2 Ъ\ + 1)

(с — положительная константа), которое не превосходит в свою оче­редь

c(log2 а - log2 Ъ + 2)(log2 Ъ + 1).

Каждое слагаемое, возникающее в результате раскрытия скобок в по­ следнем выражении, есть O(logalogb) при а, Ь—><*>, а^Ъ. Отсюда следует первая часть утверждения. Вторая часть следует из того, что log2 a log2 Ъ s= log2 а при а ^ Ъ.

Пример 21.1. Пусть пик положительные целые числа, к ^ 2, заданные в двоичной системе счисления. Покажем, что при избра­нии п в качестве размера входа п, к (равно как и при избрании п, к в качестве двух параметров размера этого входа) битовая сложность обычного алгоритма построения fc-ичной записи числа п с помощью наивных делений с остатком допускает оценку О (log2 п).

В самом деле, при построении fc-ичной записи п шаг за шагом рас-сматриваются числа q0,<li, ...,qt, t= |_logfc n\ + 1, где q0 = n,qt= --- , i = 1, 2,..., t. Очевидно, что qt s= n, в силу чего общие затраты всех ша­гов для данных пик допускают оценку О (log п log к logfc п). Очевидно, log к logfc п = log п (например, log2 к logfc п = log2 п), поэтому оценка для

142

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]