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

Глава 5. Битовая сложность

затрат переписывается в виде О (log2 п); при указанных выше размерах входа эта оценка является и оценкой сложности.

Вновь вернемся к обозначению т для битовой длины максималь­ного из двух данных целых положительных чисел, и пусть т рас­сматривается как размер входа а, Ъ алгоритмов умножения и деления с остатком. Для сложностей наивного умножения и деления мы по­лучили оценки 6(т2), следствием которых являются нижние оценки Г2(т2). Вместе с этим, для умножения и деления известны алгорит­мы, сложности которых при т > ∞ растут существенно медленнее, чем т2: первый алгоритм такого рода для умножения был предложен в 1962 г. А. А. Карацубой (верхняя оценка 0(mlo&3)), наилучшую из известных к настоящему времени верхнюю асимптотическую оценку битовой сложности О (т log т log log m) имеет алгоритм А.Шенхаге и Ф. Штрассена. Существуют алгоритмы деления, сложность которых допускает такие же оценки (см. задачу 152 к главе 7). Алгоритм Кара-цубы будет рассмотрен нами в § 27, алгоритм Шенхаге—Штрассена в этом курсе подробно не рассматривается; несколько слов о нем бу­дет сказано в конце § 27.

Пример 21.2. Исследуем битовую сложность алгоритма Евклида. В качестве размера входа можно рассмотреть большее число а0, но ни в коем случае не аг: если фиксировано аъ то, неограниченно уве­личивая а0, мы будем неограниченно увеличивать битовые затраты, связанные с первым делением с остатком (а0 на аг). Поэтому при вы­боре аг в качестве размера входа битовая сложность этого алгоритма тождественно равна бесконечности — здесь битовая сложность суще­ственно отличается от алгебраической (т. е. в данном случае от слож­ности по числу делений). Можно считать а0 размером входа, а можно рассмотреть два параметра а0,аг размера входа. Если т0,тг — бито­вые длины данных чисел а0, аъ то в качестве размера входа мож­но рассмотреть т = max{m0, тг} = т0 или же два параметра входа т0,тг. В настоящем примере мы будем использовать т.

Прежде всего покажем, что для алгоритма Евклида

a;-i = q;a; + ai+1, i = l,2, ...,n, an+1 = 0,

выполняется

a0^ q1q2...qn. (21.2)

В самом деле,

a0>q1a1, a1>q2a2, ..., an-2 > qn-ian-i> an-i = 4nan>

и получаем a0 ^ q1q2...qnan, откуда следует (21.2).

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

143

Для построения ai+1 делением ai_х на ai с остатком требуется не более c(Llog2 qi\ + l)(Llog2 ai\ + 2) битовых операций, где c—положи­тельная константа. Это дает общую оценку сверху

^CLlog2 qiJ +l)(Llog2 aiJ +2),

c

i=1

при этом возможно, что некоторые из qi равны единице. Написанная сумма не превосходит

c(Llog2 aг] + 2) ^ (Uog2 qi} + 1).

i=l

При a1>1 выполнено |_log2 aг] + 2 sj 3 log2 aг и, как следствие, c(Llog2 aг\ + 1) j^(Uog2 qi\ + 2) s= 3c(log2 al) fn + J] log2 qi =

i=l i=l

= 3c(log2 ai)(n + log2(qiq2...qn)) < 3c(log2 ai)(n + log2 a0). Как мы знаем, n ^ 2 log2 ax + 1; при ax > 1, очевидно, можем на­писать n^31og2a1. Это дает нам оценку сверху

3c(log2a1)(3log2a1+log2a0)

для числа битовых операций при aг > 1. Учитывая, что a0^aъ мы получаем отсюда следующее.

Количество битовых операций, затрачиваемых при применении алгоритма Евклида к a0, aь допускает оценку

O(loga0logai) (21.3)

и оценки O(log2a0), O{m2), m = A(a0).

Приведенные оценки получены в предположении, что для построе­ния остатков используется наивное деление, имеющее квадратичную сложность. Может ли быть так, что привлечение имеющего меньшую битовую сложность алгоритма деления с остатком приведет к суще­ственно меньшим битовым затратам алгоритма Евклида? Ответ отри­цательный: нетрудно, например, показать, что если a0 берется в ка­честве размера входа, то для битовой сложности алгоритма Евклида выполняется оценка n(log2a0).

В самом деле, в примере 10.1 было показано, что для каждо­го a0 можно подобрать меньшее его aг такое, что для числа делений с остатком выполняется неравенство (10.10). Если обозначить это чис­ло делений через n, то будем иметь n = n(loga0), при этом

A(a0),A(a1),...,A(an)

144

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