Наивная арифметика: умножение
Предложение 20.1.Пусть T*м(m) — временная битовая сложность наивного умножения при использовании m в качестве размера входа, а T^mmJ —временная битовая сложность этого же алгоритма при использовании mъ m2 в качестве двух параметров размера входа. Тогда
T*M(m) = Q(m2), T*ll(m1,m2)=Q(m1m2). (20.1)
Доказательство. Затраты наивного умножения a на b связаны с суммированием m, чисел n-i,n?,...,nm , где каждое ni равно 0 или a ■ 2i-1 в зависимости от соответствующей цифры в двоичной записи b. Несложной индукцией доказывается, что для si = nг + n2 + ... ...+ni, i = l,2,...,m2, выполнено X{si)^m1 + i. Если ni+1ф0, то последние i цифр числа ni+1 суть нули, и при вычислении si+1 = si + ni+1 мы не притрагиваемся к этим цифрам, а преобразуем si в si+1 сложением двух чисел, первое из которых образовано всеми разрядами числа si, кроме i последних (согласно сказанному, битовая длина этого числа не превосходит mг), второе же слагаемое есть a, и его битовая длина равна mг. Число битовых операций, требующихся для преобразования si в si+1, не превосходит c{mг +1) для некоторой положительной константы c. В том случае, когда все цифры числа b равны 1, это число при любом i не меньше, чем mъ по лемме 19.1.
1 См., например, книгу [50]. В литературе на английском языке, в частности в книге [50], используется термин «word complexity».
Глава 5. Битовая сложность
Поэтому битовые затраты, связанные с наивным умножением а на Ъ, не превосходят с{тг + 1)т2, а при Ъ = 2т? - 1 (двоичная запись этого Ъ состоит только из единиц) затраты не меньше, чем тгт2. Это дает оценку Щ1[{тът2) = 6(m1m2).
Рассмотрим теперь т как размер входа. Так как тг ^ т и т2 ^ т,
то затраты не превосходят c(m + l)m, это дает оценку Т*м(т) = 0(,т2).
С другой стороны, если тг = т2 = т и а = Ъ = 2т - 1, то затраты не
могут быть меньше, чем т2, и, следовательно, Г*(т) = Г2(т2). Таким
образом, Гм*м(т) = в (т2). □
Для пространственной битовой сложности наивного умножения мы имеем, очевидно, оценки
S*NM(m) = 2т + 0(1), S^Qnlt т2) = тг + т2 + 0(1).
Обсудим переход от параметров тъ т2 размера входа к параметрам а, Ъ (можно считать, что и к параметрам logo, logЪ—между а, Ъ и log a, log Ъ в этом смысле нет принципиальной разницы, так как одни параметры однозначно определяют другие; в то же время мы не можем восстановить а,Ъ по riog2(a + l)l, [log2(b +1)1).
Для перехода в верхних оценках сложности от A(fc) к log2 к, fee gN*, часто оказывается удобным простое неравенство |"log2(fc + 1)] ^ ^ 2 log2 к, справедливое для всех к ^ 2:
[log2(fc + 1)1 = Llog2 fcj + 1 ^ log2 к+ 1^2 log2 к.
Поэтому, например,
т1 ^ 2 log2 a, m2 ^ 2 log2 b
и
тгт2^ 4 log2 a log2b (20.2)
для всех a, b ^ 2. Имеем для достаточно больших тъ т2 и некоторой положительной константы с
Clu{a, Ъ) s= Т^Л{тъ т2) s= стгт2 s= Ac log2 a log2 Ъ.
Мы можем написать C^M(a, b) = 0(loga logb), считая, что выражение под знаком О рассматривается как функция двух переменных а, Ъ, при этом а, Ь—>оо; считаем также, что логарифмы имеют общее основание (подобные предположения будут подразумеваться и в дальнейшем). Остается заметить, что битовая временная сложность при использовании самих а, Ъ в качестве параметров размера входа совпадает с битовыми временными затратами. Это позволяет получить из оценки Т**м(.тът2) = 0(.т1т2) оценку TNM(a, Ь) = О (log a logb) для
§ 20. Наивная арифметика: умножение
временной битовой сложности при использовании двух параметров размера входа a, b. Итак:
При использовании самих положительных целых a,b в качестве параметров размера входа сложность наивного умножения a на b по числу битовых операций допускает оценку O(logalogb).
Выше наивное умножение (умножение «столбиком») понималось так, что если какая-то цифра числа b равна нулю, то, несмотря на это, построение соответствующих ni и si требует не менее mг битовых операций. При таком взгляде сложность будет величиной 6(loga log b). Но можно считать, что в рассматриваемом случае битовые затраты на получение si не зависят от a и ограничены константой. Тогда оценка n(logalogb) места не имеет: если a = 2k\b = 2k, где kг,k2—положительные целые, то битовые затраты будут ограничены линейной функцией от kъ k2.
Пример 20.1.Покажем, что битовая временная сложность алгоритма вычисления n\с помощью пошаговых наивных умножений
2-3, (2-3)-4, ..., (2-3...(n-1))-n
при использовании n в качестве размера входа допускает верхнюю оценку O((n logn)2). В силу предложения 20.1 и неравенства (20.2) рассматриваемая сложность не превосходит cf{n), где c — некоторая положительная константа, а значение f(n) равно
log2 2 log2 3 + log2(2 •3) log2 4 + ... + log2(2 •3... (n - 1)) log2 n.
Имеем
f(n) s=log2(2 •3... (n - l))(log2 2 + log2 3 + ... + log2 n) s=log2(n!).
Одним из следствий формулы Стирлинга является оценка log2(n!) = = O(n log n), откуда log2(n!) = O((n log n)2), иf(n) = O((n log n)2).
Пример 20.2.Мы упоминали о том, что для алгоритма, входом которого является несколько целых чисел, можно в некоторых случаях определять размер входа как суммарную битовую длину всех этих чисел. Предположим, что имеется несколько целых чисел aг, a2, •••, an, каждое из которых ^ 2, и с помощью пошаговых наивных умножений
aгa2, {aгa2)a^ ..., {aгa2...an-г)an (20.3)
вычисляется произведение A = aгa2...an. Пусть суммарная битовая длина чисел равна M, и число M рассматривается как размер входа алгоритма (20.3). Покажем, что тогда битовая сложность этого
Глава 5. Битовая сложность
алгоритма допускает верхнюю оценку O{M2), — примечательно, что число n, т. е. общее количество сомножителей, в этой оценке не появляется.
В силу предложения 20.1 и неравенства (20.2) битовые затраты на вычисление aъa2, ■■■an не превосходит cF{aг,a2, ...,an), где c—некоторая положительная константа, а значение F{aг, a2,..., an) равно
log2 aг log2 a2 + log2(aia2) log2 a3 + ... + log2(a1a2...an_1) log2 an
(использовано предположение, что aъa2,..., an ^ 2). Мы легко получаем
F(aъ a2,...,an) s= log2(a1...an_1)aog2 a2 + ... + log2 an)
и
F{aъ a2,..., an) s= (log2 aг + log2 a2 + ... + log2 an)2.
Последнее неравенство позволяет перейти к рассмотрению M в качестве размера входа, так как, очевидно,
F(a1,a2,...,an)^(riog2(a1 + l)l + riog2(a2 + l)l+...+ riog2(an + l)l)2 =M 2 ,
что дает нам требуемое.
Доказанное утверждение справедливо и в том случае, когда среди aг,a2, ...,an имеются единицы, если считать, что умножение на 1 требует одной битовой операции. Если среди aъa2,...,an имеются k единиц, то из M ^ k следует (M - k)2 + k s= M2.