Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Понкратьев Е. В. - Элементы КА

.pdf
Скачиваний:
75
Добавлен:
03.05.2015
Размер:
1.64 Mб
Скачать

13. АЛГОРИТМЫ ВЫЧИСЛЕНИЯ РАЗМЕРНОСТНЫХ МНОГОЧЛЕНОВ 145

Применяя (13.14) к E2, сводим вычисление aτ (E2) (в правой части формулы (13.14)) к вычислению коэффициента a2(E21) многочлена Гильберта некоторой матрицы E2, содержащей (m − 1) столбец (эта матрица получена добавлением некоторых дополнительных

строк к E1). Чтобы вычислить aτ (E21), нужно не более (m − 1)b2 элементарных операций (здесь b2 обозначает число строк матрицы

E21). Продолжаем применять (13.14), пока не получим матрицу с нулевым первым столбцом. По лемме 13.17 такой столбец можно отбросить, затем применяем (13.14) к новой матрице и т. д.

Асимптотическая сложность g(n, m) описанного алгоритма не

превосходит

k

X

n log n + bim + g(n, m − 1)

i=1

bi N

b1+···+bk =n

6 2n log n + n(m + m − 1) + g(n, m − 2) 6 . . .

6 (m − 1)n log n + n(m + (m − 1) + · · · + 2) + g(n, 1)

= (m − 1)n log n + n m

2

 

mn log n.

 

+ 1

 

 

А14. АЛГОРИТМ (E, n, m, am−2).

Дано: n N; m N; n×m-матрица E, такая, что deg ωE 6 m − 2

Надо: am−2(E).

Начало

am−2 := 0

r := число нулевых столбцов матрицы E m := m − r

E : удалить нулевые столбцы

сортировать строки по возрастанию элементов первого столбца

NS := 0 i := 1

E0 :=

цикл пока i < n

цикл пока ei1 = NS и i 6 n E0 := E0 (ei2, . . . , eim) i := i + 1

конец цикла

NR := ei1

a := (a1, . . . , am−1), где ai — минимальный элемент i-го столбца матрицы, состоящей из векторов из E0

146

ГЛАВА 4. ЦЕЛОЗНАЧНЫЕ МНОГОЧЛЕНЫ

 

 

E0 := a

am−2 := am−2 + |a|(NR − NS )

NS := NR

конец цикла

E : удалить первый столбец алгоритм А14(E, n, m − 1, b) am−2 := am−2 + b

Конец

Теперь, пользуясь алгоритмом А14 и формулой (13.14), можно найти старший коэффициент многочлена Гильберта для любой матрицы. Сложность fk (n, m) вычисления этого коэффициента для матрицы E, такой, что deg ωE = m − k (1 6 k 6 m), не превосходит

n

X

n log n + fk−1(i, m − 1) + fk (n, m − 1)

i=1 6 n log n + nfk−1(n, m − 1) + fk(n, m − 1),

при использовании приведенного ниже алгоритма А15. Таким обра-

зом,

 

 

m)

m

2

n

и, в общем случае,

 

 

 

 

 

f3

(n,

 

2

n log m

 

k−1

 

 

 

 

fk(n, m) k − 1 n

 

log n (k = 3, . . . , m).

А15. АЛГОРИТМ (E, n, m, k, am−k).

Дано: n N, m N, k N, k > 2, m > k;

n×m-матрица E, такая, что deg ωE 6 m − k

Надо: am−k(E).

Начало

am−k := 0

r := число нулевых столбцов матрицы E m := m − r

E : удалить нулевые столбцы

сортировать строки по возрастанию элементов первого столбца

NS := 0 i := 1

E0 :=

цикл пока i < n

цикл пока ei1 = NS и i 6 n E0 := E0 (ei2, . . . , eim) i := i + 1

конец цикла

= NS }
NR := ei1
a := (a1, . . . , am−1

13. АЛГОРИТМЫ ВЫЧИСЛЕНИЯ РАЗМЕРНОСТНЫХ МНОГОЧЛЕНОВ 147

), где ai — минимальный элемент i-го столбца матрицы, состоящей из векторов из E0

E0 := a

am−2 := am−2 + |a|(NR − NS )

NS := NR

конец цикла

E : удалить первый столбец алгоритм А14(E, n, m − 1, b)

am−2 := am−2 + b

если k = 2, то алгоритм А14(E, n, m, am−2) иначе E : удалить нулевые столбцы

m := число столбцов матрицы E

NS := 0

E0 :=

цикл для каждого ненулевого ei1 в порядке возрастания

NR := ei1

E0 : добавить последовательность строк

{(ej2, . . . , ejm) | ej1

N0 := число векторов в E0

алгоритм А15(E0, N0, m − 1, k − 1, P )

am−k := am−k + (NR − NS )P

NS := NR

конец цикла

E : удалить первый столбец алгоритм А15 (E, n, m − 1, k − 1, P )

am−k := am−k + P

конец если Конец

Завершая изложение теории размерностных многочленов, следует упомянуть размерностные многочлены от многих переменных, теория которых была заложена в статье [19] и подробно изложена в монографии [20].

Глава 5

Факторизация многочленов

14. Алгоритмы Кронекера

Алгоритм Кронекера находит для данного многочлена f (x) Z[x] многочлен f1(x) Z[x], такой, что f1(x)|f (x), или доказывает, что такого многочлена нет. Алгоритм Кронекера основан на следующих соображениях:

если степень многочлена f равна n, то степень хотя бы одного множителя f1 многочлена f не превосходит [n/2];

значения как f , так и f1 в целых точках — целые числа, причем f1(i) делит f (i) для любого целого i;

при фиксированном i, если f (i) 6= 0, то f1(i) может принимать только конечное множество значений, состоящее из делителей числа f (i);

коэффициенты многочлена f1 однозначно восстанавливаются по его значениям в [n/2] + 1 точке.

Таким образом, для f1 получается конечное число возможностей; непосредственным делением проверяем, получили ли делитель многочлена f .

Перепишем алгоритм Кронекера в соответствии со сделанными выше замечаниями.

А16. АЛГОРИТМ (Кронекера).

Дано: f Z[x]; Надо: g Z[x];

успех L // “да”, если множитель найден.

Обозначения:

n == f .степень m == g.степень

f (i), i Z == значение многочлена f в точке i.

Переменные:

M — множество элементов типа целое

U — множество ’динамических’ векторов элементов типа Z

14. АЛГОРИТМЫ КРОНЕКЕРА

149

 

 

Начало

успех := “нет”

цикл для i от 0 до [n/2] пока не успех

// проверка, что среди целых чисел от 0 до [ n2 ] нет корней f (x)

если f (i) = 0, то

успех := “да” g := x − i

m := 1

конец если конец цикла если не успех, то

U := множество делителей числа f (0)

цикл для i от 1 до [n/2] пока не успех // поиск множителя степени i

M := множество делителей числа f (i) U := U × M // прямое произведение

цикл для каждого u из U пока не успех построить многочлен g степени i, такой, что g(j) = u(j) для j = 0..i

если f делится на g, то успех := “да”

m := i

конец если конец цикла

конец цикла конец если Конец

14.1. ЗАМЕЧАНИЕ. Достаточно научиться разлагать на множители многочлены со старшим коэффициентом, равным 1. Действительно, если старший коэффициент равен a, то домножив на an−1 и сделав замену x = y/a, сводим задачу к этому случаю. После ее решения остается сделать обратную замену и сократить на общий множитель an−1. Однако этот метод обычно оказывается неэффективным: из-за увеличения коэффициентов ухудшаются различные оценки и скорость работы алгоритмов. Поэтому в большинстве работающих алгоритмов таких преобразований не производится.

Другое решение задачи факторизации “за конечное число шагов” следует из того, что коэффициенты делителя — целые числа и их абсолютная величина ограничена сверху некоторой функцией

150

ГЛАВА 5. ФАКТОРИЗАЦИЯ МНОГОЧЛЕНОВ

 

 

от коэффициентов многочлена f . В параграфе 7 мы нашли некоторые оценки для этих коэффициентов. Они еще понадобятся нам в дальнейшем.

Задача разложения на неприводимые множители “за конечное число шагов” многочленов от нескольких переменных с “классической” точки зрения решена также примерно сто лет назад. Соответствующий алгоритм также носит имя Кронекера и для некоторых областей коэффициентов (например, для поля комплексных чисел C) остается единственным известным алгоритмом решения этой задачи. Для многочленов с коэффициентами из кольца целых чисел, или из кольца алгебраических чисел, или из конечного поля и некоторых других получены в последнее время новые, более быстрые алгоритмы. Общая схема этих алгоритмов достаточно близка к соответствующим алгоритмам факторизации одномерных многочленов, хотя некоторые отличия весьма существенны. Изложение современных алгоритмов факторизации многомерных многочленов не входит в число вопросов, освещаемых в данном пособии. Читателю, интересующемуся этой задачей, следует обратиться к специальной литературе.

Ниже излагаем многомерный алгоритм Кронекера для задачи, поставленной следующим образом.

Пусть D — область целостности с однозначным разложением на

множители, f (x1, . . . , xn) D[x1, . . . , xn]. Требуется разложить f на неприводимые множители.

14.1. Многомерный алгоритм Кронекера.

А17. АЛГОРИТМ (Кронекера_многомерный).

Дано:

f Z[x1, . . . , xn]

 

Надо:

G — разложение

 

Переменные:

 

 

¯

 

 

многочлен f Z[y],

¯

 

¯

 

разложение G многочлена f

множество M элементов типа Z

Идея реализации: Редуцировать задачу к одномерному случаю, путем введения новой неизвестной и заменой всех переменных достаточно высокими степенями этой неизвестной. Факторизовать получившийся многочлен. Выполнить обратную подстановку, пробным делением убедиться, получено ли желаемое разложение.

15. РАЗЛОЖЕНИЕ НА МНОЖИТЕЛИ, СВОБОДНЫЕ ОТ КВАДРАТОВ 151

Начало

выбрать целое d большее, чем степени отдельных переменных в f заменить все переменные степенями новой неизвестной y:

¯

 

d

, . . . , y

dn−1

).

 

 

 

 

 

f (y) := Sd(f ) = f (y, y

 

 

 

 

 

 

 

¯

 

 

 

 

 

 

 

 

 

 

разложить f (y) на неприводимые множители, т. е.

 

 

 

 

 

¯

gi(y) Z[y], 1 6 i 6 s.

 

 

 

 

f (y) = g¯1(y) . . . g¯s(y),

 

 

 

 

G.число_множителей := 1

 

 

 

 

 

 

 

 

 

 

m := 1

 

 

 

 

 

 

 

 

 

 

M := {1, . . . , s}

 

 

 

 

 

 

 

 

 

 

цикл пока m 6 [s/2]

 

 

 

 

 

 

 

 

s

 

цикл для каждого подмножества

{i1, . . . , im} M

пока

 

6

]

−1

 

 

m

 

[ 2

gi1,...,im (x1, . . . , xn) := Sd

(¯gi1 (y)¯gi2 (y) . . . g¯im (y))

 

 

 

 

если f делится на g то

 

 

 

 

 

 

 

 

 

 

G.множитель[G.число_множителей] := g G.число_множителей := G.число_множителей + 1 f := f /g

s := s − m M.удалить{i1, i2, . . . , im}

конец если конец цикла m := m + 1

конец цикла

G.множитель[G.число_множителей] := f

Конец

В этом алгоритме обратное преобразование Sd−1 определяется на одночленах по формуле

d

y

 

1−1

v

S−1

 

b1+db2+···+dv−1bv

= xb1

. . . xbv

(0 6 bi < d для 1 6 i 6 v, v Z), далее Sd

 

распространяется по

линейности.

 

 

 

 

 

15. Разложение на множители, свободные от квадратов

Разложение многочлена на множители начнем с приведения его к некоторому каноническому виду. Прежде всего найдем НОД его коэффициентов, эта величина называется содержанием многочлена f и обозначается cont(f ). Далее разложим многочлен f на свободные от квадратов множители, т. е. на такие множители, которые

152

ГЛАВА 5. ФАКТОРИЗАЦИЯ МНОГОЧЛЕНОВ

 

 

являются произведениями взаимно простых неприводимых многочленов в первой степени. Это можно сделать путем дифференцирования исходного многочлена и нахождения общих делителей многочлена и его производной. Свободный от квадратов многочлен, содержание которого равно 1, назовем примитивным.

В принятых нами обозначениях алгоритм факторизации многочлена f принимает следующий вид.

А18. АЛГОРИТМ (факторизовать_многочлен).

Дано: f Z[x]

Надо: cont(f ) — содержание многочлена f U — разложение

Переменные: G — разложение на свободные от квадратов V — разложение текущего многочлена из G

Обозначения: s == G.число_множителей g == G.множители

u == U.множители v == V.множители

Начало u.начать работу

вычислить cont(f )

f (x) := f (x)/ cont(f )

разложить_на_свободные_от_квадратов (f, G) f (x) = g1(x)g22(x) . . . gss(x),

цикл для i от 1 до s

факторизовать примитивный, свободный от квадратов (gi, v) u.добавить vi

конец цикла Конец

Вычисление содержания многочлена сводится к вычислению наибольшего общего делителя целых чисел. Поскольку мы предполагаем коэффициенты не слишком большими, вполне достаточно ограничиться алгоритмом Евклида нахождения НОД.

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

А19. АЛГОРИТМ (разложить_на_свободные_от_квадратов).

Дано: f (x) Z[x]; cont(f ) = 1

Надо: G — разложение

15. РАЗЛОЖЕНИЕ НА МНОЖИТЕЛИ, СВОБОДНЫЕ ОТ КВАДРАТОВ 153

Переменные: h, c, d Z[x] k N

Обозначения: s == G.число_множителей g == G.множители

Начало

h(x) := НОД(f (x), f (x)), где f (x) = df (x)/dx c(x) := f (x)/h(x)

d(x) := (df (x)/dx)/h(x) − dc(x)/dx k := 1

цикл пока c(x) 6= 1

gk(x) := НОД(c(x), d(x)) c(x) := c(x)/gk(x)

d(x) := d(x)/gk (x) − dc(x)/dx k := k + 1

конец цикла s := k − 1

Конец

Для доказательства корректности этого алгоритма предположим,

что f =

s

gii, где gi свободны от квадратов и взаимно просты. Тогда

 

s

i=1

 

 

 

 

−1

 

 

 

h = giQ

, до начала цикла

 

=2

i

 

 

 

 

 

i Q

 

 

 

s

 

 

 

 

 

 

 

 

 

 

 

 

Y

 

 

 

 

c(x) =

gi,

 

 

 

 

 

i=1

 

 

 

 

f

s

s

 

 

 

= i=1

igij=1,j6=i gj ,

 

 

 

 

h

 

 

 

 

 

X

Y

 

 

 

 

 

s

s

.

 

 

 

d = i=1

(i − 1)gij=1,j6=i gj

 

 

 

 

X

Y

 

В теле цикла выполняется присваивание многочленам c(x) и d(x) значений

s

s

s

.

c(x) = i=k+1 gi,

d = i=k+2 (i − k − 1)gi

· j=k+1,j6=i gj

Y

X

Y

 

15.1. УПРАЖНЕНИЕ. Построить аналог алгоритма А19 для многочленов с коэффициентами из поля Fp.

154

ГЛАВА 5. ФАКТОРИЗАЦИЯ МНОГОЧЛЕНОВ

 

 

Алгоритмы разложения на неприводимые множители примитивного свободного от квадратов многочлена с целыми коэффициентами составляют главное содержание данной главы.

Современные алгоритмы разложения примитивного свободного от квадратов многочлена f (x) Z(x) на неприводимые множители основаны на следующих соображениях. Кольцо целых чисел Z вкладывается в полное нормированное поле K. Предполагается, что мы умеем раскладывать на множители многочлены из кольца K[x], т. е. для любого наперед заданного числа ε > 0 можем вычислить с абсолютной точностью ε коэффициенты всех неприводимых делителей данного многочлена (предполагается некоторая нормировка делителей, например, равенство единице старшего коэффициента). Каждому неприводимому в K[x] делителю h(x) многочлена f (x) соответствует однозначно определенный неприводимый в Z[x] делитель g(x) многочлена f (x), который делится на h(x) (более точно, g(x) представляет собой произведение нескольких неприводимых в K[x] делителей многочлена f (x), если, конечно, сам h(x) не принадлежит Q[x]). Для нахождения неприводимого в Z[x] делителя многочлена f (x) либо используют перебор произведений различных подмножеств неприводимых в K[x] делителей многочлена f (x), либо для восстановления g(x) по h(x) пользуются следующим методом. Ограничивают возможную степень многочлена g(x) положительным числом m; выделяют свободный Z-модуль ранга m + 1 в модуле многочленов с целыми коэффициентами степени не выше m, в котором должен находиться искомый многочлен g(x), в частности, выделенный модуль может совпадать со всем множеством многочленов степени не выше m, вкладывают этот модуль в евклидово пространство над полем Q так, чтобы многочлену g(x) соответствовал кратчайший вектор в выделенном модуле, называемом обычно решеткой, и находят этот кратчайший вектор.

15.1. Выделение линейных множителей. Прежде чем переходить к общим алгоритмам разложения многочленов на неприводимые множители, рассмотрим случай, когда у многочлена имеются линейные множители. Нахождение линейных множителей осуществляется значительно проще, чем в общем случае нахождение неприводимых множителей. В большинстве систем компьютерной алгебры, прежде чем применять общие методы факторизации, у многочлена выделяются линейные множители.

Нахождение линейных множителей основано на теореме Безу, которая утверждает, что если рациональное число m/n, где m — целое, n — натуральное, НОД(m, n) = 1, является корнем многочлена