Смекни!
smekni.com

Быстрые вычисления с целыми числами и полиномами (стр. 3 из 5)

Но мы не учли корректирующие перемножения, которые должны быть выполнены, когда показатель не является степенью двойки. Если n = 2l+1 – 1, нужно добавить к последовательным возведениям в квадрат перемножения всех полученных многочленов. Умножение многочлена степени (2i-1)d на многочлен степени 2id вносит свой вклад из ((2i – 1)d + 1)( 2id + 1) умножений, которые, будучи собранными по всем корректирующим вычислениям, дают дополнительную сложность:

= =

=

Теперь можно заключить, что дихотомическое возведение в степень не всегда является лучшим способом для вычисления степени многочлена с помощью перемножений многочленов. Число перемножений базисного кольца, которые необходимы, Csqr(n), - в действительности заключено между ( ) и т.е. между n2d2/3 и 2n2d2/3, тогда как простой алгоритм требует всегда n2d2/2 перемножений. В частности, если исходный многочлен имеет степень, большую или равную 4, возведение в степень наивным методом требует меньше перемножений в базисном кольце, чем бинарное возведение в степень, когда n имеет форму 2l – 1.

Можно довольно просто доказать, что если nимеет вид 2l +2l1 + c (выражения, представляющие двоичное разложение n), то метод вычисления последовательными перемножениями лучше метода, использующего возведение в квадрат (этот последний метод требует корректирующего счёта ценой, по крайней мере, n2d2/9). Всё это доказывает, что наивный способ является лучшим для этого класса алгоритмов, по крайней мере, в половине случаев.

Действительно, МакКарти [3] доказал, что дихотомический алгоритм возведения в степень оптимален среди алгоритмов, оперирующих повторными умножениями, если действуют с плотными многочленами (антоним к разреженным) по модулю m, или с целыми и при условии оптимизации возведения в квадрат для сокращения его сложности наполовину (в этом случае сложность действительно падает приблизительно до n2d2/6 + n2d2/3 = n2d2/2).

3.3 Небольшие оптимизации для произведений многочленов

В принципе вычисление произведения двух многочленов степеней n и m соответственно требует (n +1)(m +1) элементарных перемножений. Алгоритм оптимизации возведения в квадрат состоит просто в применении формулы квадрата суммы:


что даёт n +1 умножений для первого члена и n(n +1)/2 – для второго, или в целом (n +1)(n +2)/2 умножений, что близко к половине предусмотренных умножений, когда n большое.

Для произведения двух многочленов первой степени P = aX+bиQ=cX + d достаточно легко находим формулы U=ac, W=bd, V = (a+ b)(c + d) и PQ = =UX2 + (VUW)X +W, в которых появляются только три элементарных умножения, но четыре сложения. Можно рекурсивно применить этот процесс для умножения двух многочленов P и Q степени 2l – 1, представляя их в виде и применяя предыдущие формулы для вычисления PQ в зависимости от A, B, C и D, где каждое произведение AB, CD и (A + B)(C + D) вычисляется с помощью рекурсивного применения данного метода (это метод Карацубы). Всё это даёт мультипликативную сложность M(2l)и аддитивную сложность A(2l)такие, что:

M(2l) = 3M(2l – 1),…, M(2) = 3M(1),M(1) = 1,

A(2l) =3A(2l – 1) + 3*2l,…, A(2) = 3A(1) + 6,A(1) = 1.

В этой последней формуле член 3*2l представляет собой число элементарных сложений, необходимых, чтобы сделать два сложения многочленов степени 2l – 1 – 1 (a + b и c + d) и два вычитания многочленов степени 2l – 1 (UVW). Суммируя каждое из этих выражений, находим для n, являющегося степенью двойки:

M(n) = nlog3/log2»n1,585иA(2) =7 nlog3/log2 – 6n.

К сожалению, этот принцип остаётся теоретическим, и на его основе нужно построить итерационный алгоритм, чтобы получить разумную эффективность (цена управления рекурсией очень велика).

3.4 Вычисление многочленов

Рассмотрим общую задачу вычисления многочлена n-й степени

u(x) = unxn + un – 1xn – 1 + ... + u1x + u0, un¹ 0, (1)

3.4.1 Схема Горнера

u(x) = (…(unx + un – 1)x + …)x + u0. (2)

Весь этот процесс требует n умножений и n сложений.

Было предложено несколько обобщений схемы Горнера. Посмотрим сначала, как вычисляется в случае, когда – комплексное число, а коэффициенты вещественны. Комплексное сложение и умножение можно очевидным образом свести к последовательности обычных операций над вещественными числами:

вещественное + комплексное требует 1 сложение,

комплексное + комплексное требует 2 сложения,

вещественное * комплексное требует 2 умножения,

комплексное * комплексное требует 4 умножения и 2 сложения

или 3 умножения и 5 сложений.

Следовательно, схема Горнера (2) требует 4n – 2 умножений и 3n – 2 сложений или 3n – 1 умножений и 6n – 5 сложений для вычисления u(z), когда z комплексное. Вот другая процедура для вычисления u(x + iy):

a1 = un, b1 = un – 1, r = x + x, s = x2 + y2; (3)

aj = bj – 1 + raj –1, bj = un – jsaj –1, 1 < j£n.

Легко доказать индукцией по n, что u(z) = zan + bn. Эта схема требует 2n + 2 умножений и 2n + 1 сложений, так что при n³ 3 она лучше схемы Горнера.

Рассмотрим процесс деления многочлена u(x) на многочлен x – x0. В результате такого деления мы получаемu(x) = (xx0)q(x) + r(x); здесь deg(r) < 1, поэтому r(x) есть постоянная, не зависящая от x и u(x0) = 0*q(x0) + r = r. Анализ этого процесса деления показывает, что вычисления почти те же самые, что в схеме Горнера для определения u(x0). Аналогично, когда мы делим u(z) на многочлен (zz0)(zz0) = z2 – 2x0z + x02 + y02, то соответствующие вычисления эквивалентны процедуре (3); мы получаем

u(z) = (zz0)(zz0)q(z) + anz + bn;

следовательно,

u(z0) = anz0 + bn.

Вообще, когда мы делим u(x) на, f(x) получая u(x) = f(x)q(x) +­ r(x), то из равенства f(x0) = 0 следует u(x0) = r(x0); это наблюдение ведёт к дальнейшим обобщениям правила Горнера. Мы можем положить, например, f(x) = x­2x02; это даст нам схему Горнера «второго порядка»

u(x) = (…(u2ën/2 û x2­­­ + u2ën/2 û – 2)x2 + u0 +

+((….u2én/2 ù - 1 x2 + u2én/2 ù - 3)x2+ … +)x2u1)x. (4)

3.4.2 Интерполяционная формула Ньютона и табулирование значений многочлена

Рассмотрим специальный случай вычисления многочлена. Интерполяционный многочлен Ньютона степени n, определяемый формулой

u[n](x) = an(x x0) (x x1)…(x xn – 1) +…+ an (x x0) (x x1) + a1 (x x0) + a0, (5)

является единственным многочленом степени £n от x, который принимает предписанные значения y0, y1, …, ynв заданных n + 1 различных точках x0, x1, …, xn соответственно. После того, как значения постоянных a найдены, интерполяционная формула Ньютона становится удобной для вычислений, так как мы можем, обобщив правило Горнера, записать

u[n](x) = ((…(an(xxn – 1) + an – 1)(xxn – 2) + …)(xx1) + a1)*