Научная статья на тему 'Действия над полиномами, представленными бинарными деревьями'

Действия над полиномами, представленными бинарными деревьями Текст научной статьи по специальности «Математика»

CC BY
335
38
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Действия над полиномами, представленными бинарными деревьями»

ДЕЙСТВИЯ НАД ПОЛИНОМАМИ, ПРЕДСТАВЛЕННЫМИ БИНАРНЫМИ ДЕРЕВЬЯМИ

© Г.И. Малашонок, 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.

i Надоели баннеры? Вы всегда можете отключить рекламу.