ДЕЙСТВИЯ НАД ПОЛИНОМАМИ, ПРЕДСТАВЛЕННЫМИ БИНАРНЫМИ ДЕРЕВЬЯМИ
© Г.И. Малашонок, A.A. Бетин
В основе каждой системы символьных вычислений находится набор средств для оперирования с многочленами многих переменных. Две основные задачи, которые должен решить разработчик - это представление полинома в памяти и выбор схемы выполнения операции умножения. Например, полином от 10 переменных с высшей степенью 10 по каждой переменной и коэффициентами, занимающими 1 слово, при стандартном плотном хранении потребует 10 Г слов памяти. Для умножения таких полиномов потребуется Ю20 операций умножения коэффициентов. Поэтому используются различные формы для разреженного представления полиномов в памяти (см., например [1], стр.404).
В докладе предлагается одна из форм разреженного хранения полиномов, которая согласована с алгоритмом быстрого умножения Карацубы. Схема умножения Карацубы
(а + АхХЬ + Вх) = с + Сх + Е)х2,
где с = аЬ, Б = АВ, С = (а + АХЬ + В) - с - С,
примененная рекурсивно, требует м|ог3 операций умножения, для умножения полиномов степени п. Здесь логарифм берется по основанию 2. Для рекурсивного применения такой схемы умножения удобно, чтобы степень полинома являлась степенью числа 2 и имелась легкая адресация каждого из ненулевых отрезков полинома длиной 2*, начинающихся с монома кратного числу 2*, к - натуральное. Бинарные деревья (бидеревья) - это деревья, у которых из каждой вершины исходит не более двух ребер, (см. так же определение в [1]). Они являются удобной и естественной формой для такого хранения полиномов.
Действительно, корневой вершине сопоставим весь полином, каждой их двух дочерних вершин сопоставим младшую и старшую половины полинома. Соответственно их дочерним вершинам сопоставим четвертинки и так далее, до отдельных мономов, которым сопоставляются их коэффициенты. Пустым отрезкам, то есть отрезкам полинома с нулевыми коэффициентами, соответствуют вершины, не имеющие дочерних. Это обеспечивает разреженную форму хранения полинома: маршрут от корневой вершины к мономам прокладывается только для ненулевых мономов.
Бидеревья удобны для хранения полиномов от многих переменных. Полиномы из кольца Щхі, хг,..., хп] можно рассматривать как полиномы из кольца Щхі, хг,..., хп-і][хп]. Тогда вершина, соответствующая коэффициенту монома в Щхі, Хг,..., хп-і][хп], будет полином из Щхі, Хг,..., Хп-і], который хранится как бидерево.
Бидерево соответствующее полиному ИЗ ЩХ1, Х2,..., хп] можно разделить на слои. Прикорневой слой будет соответствовать переменной х„, следующий за ним слой будет соответствовать переменной Хп-1 и так далее. Самый верхний слой будет соответствовать переменной XI, после которого располагаются коэффициенты. Например, полиномы ^ = в) + а2у + азх + гцху + + а5Х2 + абХ^ + а7Х3 + авх3у и £г = 5х3у + 2х2 будут представлены следующими бидеревьями
ai &2 аз ац а$ a^ а7 as
1 у 1 у 1 у 1 у
. V V V V 1 х 1 х \ / \
1
\
/
2 5
1 У
V V 1 х
\/
х2
/
Планируется разработка пакета процедур для выполнения действий над такими полиномами. Пакет будет содержать четыре арифметические процедуры, процедуры сравнения (<, >, =,>=,<=), процедуры преобразования из строчной формы в форму бидерева и обратно.
Приведем функцию PolyMult из этого пакета, вычисляющую произведение полиномов.
Function PolyMult(Pi, Рг, р);
Comment: Р]=а+Ахр, Р2 =Ы-Вхр, а, А, Ь, В - полиномы
степени р, по старшей переменной Хк, р=2п Comment: Функция вычисляет произведение полиномов Comment: Pi* P2=c+Cxp+Dx2p, где c=ab, D=AB,
C=(a+AXb+B)-c-D,
Ifp==l Then If k=l
Then c=ab; D=AB; С=(а+АХЬ+В>с-С; Return
(c+Cx+Dx2) Else k:=k-l; p=MaxDeg(a,brA,B;k)/2; c=PolyMult(a, b, p); D=PolyMult(A,B, p); C=PolyMult(a+A,b+B,p) -c -D; Return (c+Cxkp+Dxk2p) End {PolyMult}
Здесь MaxDeg(a,bA3;k) - функция, вычисляющая максимальную степень переменной х* в многочленах а,ЬА,В.
ЛИТЕРАТУРА
Кнут ДЭ. Искусство программирования. Т. 1. Основные алгоритмы. Издательский дом «Вильямс», 2001.