1пУ = (20,31,62,43) (44,405,2б,27) (48,—19,0|о,1ц)
(—112,413,014,115) (116,317,318,219) (42о, 1221,122,2гз)
(424,— 125,026,127) [— 128,0г9,0зо. 131 ] (~ 132,4зз,034,135)
[0зб,-1 37,0з8, 139] (440,-141,042,143) (444,-145,046,147)
(1481^49,250,251) (452,-153,054,255) [056,057,158,259]
С/У= 20,3„102,5з.
Здесь компоненты векторов пронумерованы и сгруппированы в блоки. Концевые блоки обозначены квадратными скобками, заголовки бидеревьев выделены жирным шрифтом. Например, из заголовка (20,31,62,4з) следует, что переменная у имеет второй номер, старшая степень по у в двоичной записи имеет 3 разряда, суммарное число двоичных разрядов для записи старших степеней по * и у равно 6, всего у полинома 4 монома.
Отметим некоторые свойства данного формата. Если из корневой вершины исходят оба ребра, то все блоки, соответствующие вершинам, путь к которым лежит через левое ребро, располагаются в 1пУ, начиная с относительного адреса 4, а после них в старшей части 1п V располагаются все блоки, соответ-
ствующие вершинам, путь к которым лежит через левое ребро.
В примере из корневой вершины исходят оба ребра, поэтому левая часть (2хь + 3х)уь находится с адреса 8 по 39, а правая часть (1 Ох3 + 5х2)уі - с адреса 40 по 59. Таким же свойством обладает и вектор коэффициентов: коэффициенты для левой части располагаются по адресам 0 и 1, а для правой части - 2 и З.На этом свойстве информационного вектора основано деление бидерева пополам.
Если векторы InV и CJV имеют по lengthlnV и lenghtCjV компонент, соответственно, и {left, right, пит, *)
- запись в корневом блоке, то левая часть Бидерева расположена в InV по абсолютным адресам от 8 до {right + 3), а ее коэффициенты расположены в CJV с адреса 0 до {пит - 1); правая часть Бидерева расположена по абсолютным адресам от {right + 4) до {lengthlnV - 1), а ее коэффициенты - с пит до {lenghtCfV - 1).
БЛАГОДАРНОСТИ: Работа частично финансировалась грантами Министерства образования РФ № Е02-2.0-98 и «Научный потенциал» 23-03-24.
БЫСТРЫЕ АЛГОРИТМЫ ДЕЛЕНИЯ ПОЛИНОМОВ
© М.С. Зуев
История быстрых алгоритмов умножения имеет сегодня обширную библиографию, и крайне мало работ посвящено быстрым алгоритмам деления (см. [2-4]). Например, в известной монографии Д. Кнута [1] упоминаются только стандартные алгоритмы деления. Все больший интерес к быстрым алгоритмам связан с параллельными вычислительными системами. В данной работе приводится быстрый алгоритм деления, ориентированный на параллельную рекурсивную дихотомическую реализацию с использованием быстрого умножения по Карацубе.
1. БЫСТРЫЙ АЛГОРИТМ КОРОТКОГО УМНОЖЕНИЯ
Пусть Л - коммутативная область,/и g- полиномы из Л[лс]. Для натурального п младшую часть произведения/^ степени п - 1 назовем коротким произведением и обозначим {[g)„:
(fg)n =/^тоАх".
Пусть с^(/) = = п - 1. Возьмем рациональ-
ное число Р из интервала [0,5; 1] и разобьем полиномы / и § на старшую и младшую часть: / = /] -х^" + /2 -=/з -х" "Р)" +/4, £ = g\ -*р" +gг=gз •*<1 “Р)" + gi■ Тогда (fg)„ = Р шо<1 х", где
Р = ^"(СА'ЫлО -р>+ (Л'&Оло -р>) +/г ^gг■ (1)
J ,87 і
0 8
}А
\
\ 8,7 Q.6E
■■ - - t 8,6 Л - 1.55 8,5
г 4
0 2* 2*+|
Рис. 1. Результаты экспериментальных исследований лучших значений (3 для алгоритма умножения Карацубы
Это равенство дает рекуррентную схему для вычисления короткого умножения {[g)„.
Если применяется стандартный алгоритм умножения, то наилучшим значением р является 0,5, при этом для короткого умножения требуется вдвое меньше операций над коэффициентами, чем для полного умножения. В общем случае лучшее значение для р может быть другим. Результаты экспериментальных исследований лучших значений р для алгоритма умножения Карацубы представлены на рис. 1. По горизонтальной оси отложены значения п в интервале [2к, 2*+|], по вертикальной оси - выигрыш по сравнению с ис-
пользованием полного умножения. Приведенные графики получены для значений Р = 0,5, 0,55, 0,6, 0,65, 0,7,
0,75, 0,8, 0,85, 0,875. Графики практически не меняются при изменении и в некоторых случаях можно получить выигрыш в 2,8 раза по сравнению с Р = 0,5. Для Р = 0,5 сложность короткого умножения совпадает со сложностью полного умножения.
В общем случае, когда с1е£/> deg g = п— 1, задача сводится к последовательным вычислениям полных и коротких произведений полиномов/§■, где/представлена В виде суммы/= д=о /кхк", 5 = [(<1е§/ + 1)/и].
Обозначим (/g)" старшую часть/■%, такую, что/# = ([%)р-„ + хГ”([g)", где p = deg(fg) + 1 . Задача вычисления ([g)n сводится к предыдущей с помощью инволюции / (х) —> хіщ^х> ]{1/х), которая меняет местами старшую и младшую части.
2. АЛГОРИТМ ДЕЛЕНИЯ
Пусть И - поле, заданы полиномы є Щх] и надо найти д,г є Щх], такие, что/ = q■g + г и г < с1е£ g .
Алгоритм 1. (с!е§/= 2п - 2, g = п - 1, п = 2к).
Пусть полиномы/и g разбиты на части/=/ -х" +/,
g = g^■x"/2+g2■
1. Разделим старшие части:/ = §і + г\.
2. Умножим и вычтем:/ =/-(/] -Гі)х" -g2^д\ ■х!'12.
3. Старшую часть (/’)"“ разделим на (/)"”' = = g\■q2 + гг-
4. Остаток от деления/на £.г =/ - (([’)" ' - г2)-х"/2 -- <?2 й-
5. Частное от деления/на^: </ = <7гх + д2.
Оценим вычислительную сложность этого рекурсивного алгоритма в числе мультипликативных операций над Л:
РО(п) = 2ГО(л/2) + 2^М(и/2),
где F^)(/г) - сложность деления, РМ(п) - сложность умножения. Полагая РМ(п) = па и Р'В(п) = с-па, найдем с = 1/(2“ 1 - 1).
Теорема. Если сложность алгоритма умножения FA/(и) = па, то сложность алгоритма 1 для деления составляет
РО(п) = 1/(2“-' - 1) РМ(п).
В частности, если используется классический алгоритм умножения, то FD(и) =РМ{п), если используется алгоритм Карацубы, то №(«) = 2РМ(п).
Алгоритм 2. (ёе§ g < < 2&е% £).
1. Если ёе§ g = 2" — 1, то/дополняем нулями до
степени 2 - 2 и применяем Алгоритм 1.
2. Если 2" - 1 < ёе§ g < 2"+1 - 1, то для полиномов /х1 и g■x\ где / = 2"+' -1 - с1е§ g, задача деления сводится к случаю 1.
В результате получим частное с/ и остаток г х\ где с/ и г являются искомым частным и остатком.
Алгоритм 3. (deg/> 2Ае% g).
Пусть 2т - К с1е8£ = к<2т+х - 1 и / = 2т+' - к-\.
Разделим полиномы / = /х и ^ = g■xl. Для этого разобьем / следующим образом: / = / -х1 + /, где 5 = ёе§/0-2'"+2-2.
1. Разделим/ на^: / = + г, (Применяем Ал-
горитм 1).
2. Умножим и вычтем:/ = /, - ^ д^-х5 = /0 - (/}-
- п)*1-
3. Если с^/ < 2 с1е§ §і, то разделим / на / = = &і '?2 + ^ (Применяем Алгоритм 1 или 2).
3.1. Остаток от деления/на g: г.
3.2. Частное отделения/на#: д = «зух5 + д2-
4. Если с1е§/ > 2-&е% gі, то идем на начало Алгоритма 3.
Доказательство Алгоритма 3. По построению имеем сіе£ g^ = 2т+1 - 1, йе%/=2"'*1 - 2, следовательно, на шаге 1 применим Алгоритм 1. Так как с^/ < Ащ/,
- 2т+1 - 3, то возможны два случая, соответствующие шагу 3 или шагу 4, и алгоритм завершается в конечное число шагов. По построению на шаге 3 получим /о = (§і Ч\У^ + #1 92 + гх' и/= g■(qx х* + д2) + г.
3. АЛГОРИТМ КОРОТКОГО ДЕЛЕНИЯ
Это алгоритм вычисления целой части от деления/ на g, когда остаток не нужно знать, (с^ / = 2п - 2, ёеБ^ = п- 1).
Разобьем /и #:/ = /, ■х1>"+ /2 и £ = #, ■х^"/1+ g2, где Р є [0; 0,5].
1. Разделим:/ = £, ^ + г] .
2. Умножим и вычтем: /г =/- (/і - Гі) хР" - (§2 9і)Р" ■хр"^.
3. Разделим: (/г)' = (яО'^г + О. ГДе / =Ря-1,</ = = Р п/2 - 1 (При <1 > 0 рекурсивно вызывается Алгоритм короткого деления, при й? = 0 происходит возврат без деления.).
4. Результат - целая часть частного: <7 = д,гхр"/2 + д2.
Оценим сложность этого алгоритма 5£>(и), обозначая 5А/(и) - сложность короткого умножения, Р = 0,5:
Ж(п) = £0(л/ 2) + 25М(я/2).
В частности, для стандартного алгоритма умножения: Ж(и) = 0,5-РМ(п).
4. АЛГОРИТМ ТОЧНОГО ДЕЛЕНИЯ
Если известно, что полином / делится без остатка на полином g, то можно применить специальный алгоритм для точного деления. Для случая с^/= 2п - 2, deg g — п - 1 достаточно дважды обратиться к алгоритму короткого деления.
1. Разобьем/и я:/=/гх'' +/2 и§ =ягхл/2+§2-
2. Разделим: / = с/, + Г|. Алгоритм короткого
деления.
3. Инвертируемых) —> х2"_2Д1/х), §(х) -> х"А §(1/х).
4. Разобьем/и £:/=/3-х" +/4 и # = §3-х"л+ ^4.
5. Разделим: fз = gз дз + гз- Алгоритм короткого деления.
6. Инвертируем: д3(х) х"/2^з(1/х).
7. Результат - частное д = д \ -х"'7 + дъ.
Сложность алгоритма ЕО(п) = 2Ж(л/2).
ЛИТЕРАТУРА
1. Кнут Д.Э. Искусство программирования. Получисленные алгоритмы. М.: Издат. дом «Вильямс», 2001. Т. 2. С. 553.
2. Mulders Т., Storjohann A. On Short Multiplications and Divisions // Applicable Algebra in Engineering, Communication and Computiong. 2000. V. 1.
3. Jebelean T, Dragan M, Tepenue D, Negru V. Parallel algorithms for practical multiprecision arithmetic using the Karatsuba method //
Proceedings of Algoritmy. 2000. P. 1-10.
4. Jebelean T. Practical integer division with Karatsuba complexity // W. Kuechlin, ed. ISSAC’97. ACM Press, 1997. P. 339-341.
БЛАГОДАРНОСТИ: Работа частично финансировалась грантами Министерства образования РФ Е02-2.0-98 и «Научный потенциал» 23-03-24.
АЛГОРИТМЫ УМНОЖЕНИЯ КАРАЦУБЫ И ШТРАССЕНА ДЛЯ РАЗРЕЖЕННЫХ СТРУКТУР
© Г.И. Малашонок, Е.С. Сатина
Обсуждается применение быстрых алгоритмов умножения к разреженным структурам. Даются оценки для допустимой степени разреженности матриц и полиномов, при которой быстрые алгоритмы умножения имеют преимущество по мультипликативной сложности по сравнению со стандартными алгоритмами. Исследование ведется для алгоритмов Карацубы [1] и Штрассена [2] и предполагается равномерное распределение нулевых элементов.
Исследуемым параметром является коэффициент плотности р - отношение числа ненулевых коэффициентов к числу всех коэффициентов матрицы или полинома. При р = 1 все коэффициенты ненулевые и быстрые алгоритмы эффективнее стандартных. При уменьшении р эффективность быстрого алгоритма по отношению к стандартному алгоритму уменьшается. Задача состоит в указании граничного значения р, при котором сложность быстрого алгоритма становится равной сложности стандартного алгоритма
АЛГОРИТМ КАРАЦУБЫ
Пусть R - поле. Рассматривается задача умножения двух полиномов Дх) и g(x) степени п (п = 2n - 1) из кольца Л[х], у которых ненулевые элементы распределены равномерно и их плотность равна а. Применяется рекурсивный алгоритм:
fg = (А + Вх)(С + Dx) =
= АС + (АС + BD - (А - В)(С - D))x + BDx,
где А, В, С, D - многочлены степени 2ЛМ - 1. Чтобы учесть разреженность полиномов, будем полагать, что глубина рекурсии равна к. После чего вычисляется произведение полиномов степени 2'v к - 1 стандартным способом и при этом требуется (2N~ka)2 операций умножения.
Обозначим через ф(а) плотность суммы полиномов, когда а - плотности слагаемых. Для конечного поля, содержащего р элементов, ф(а) = 2а - а2 р/(р - 1), для поля характеристики 0 ф (а) = 2а - а2. Тогда общее число операций умножения в случае поля, содержащего р элементов, составит:
сі
5=0
р-1
2J-
Для поля характеристики 0 достаточно перейти к пределу при р —> о0, и в выражении для ф'(а) исчезнет дробь.
Сравним полученную оценку сложности со сложностью стандартного умножения - (а2л)2 для разной глубины рекурсии (1, 2, ..., 15) и для разной плотности исходных многочленов. Полученные результаты представлены в таблице плотностей (табл. 1). В левом столбце указана глубина рекурсии, в верхней строке -отношение сложности алгоритма Карацубы к сложности стандартного умножения. На пересечении соответствующих столбца и строки - плотность полиномов-сомножителей.
Например, при глубине рекурсии 15 алгоритм Карацубы имеет вдвое меньшую мультипликативную сложность, чем стандартный алгоритм, когда плотности полиномов сомножителей равны 0,1503.
В практических целях можно пользоваться графиком, приведенным на рис. 1. На этом графике изображены линии уровня (1, 1/2, 1/4, 1/8, 1/16) с постоянным отношением сложности алгоритма Карацубы к сложности стандартного алгоритма. По горизонтальной оси откладываются логарифмы степеней полиномов сомножителей N = \0g2n, по вертикальной оси - плотности.
АЛГОРИТМ ШТРАССЕНА
Формула Штрассена [2] для умножения матриц дает алгоритм для вычисления произведения матриц порядка п = 2^, в котором ~ и2 8 операций умножения.
В левом столбце указана глубина рекурсии, в верхней строке - отношение сложности алгоритма Штрассена к сложности стандартного умножения. Число, стоящее на пересечении соответствующих столбца и строки - это плотность матриц сомножителей.