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

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

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

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

с целыми коэффициентами, то n делит старший коэффициент этого многочлена, а m делит его свободный член. Кроме того, между рациональными корнями многочлена и его линейными множителями существует взаимно однозначное соответствие: m/n является корнем многочлена f (x) Z[x] тогда и только тогда, когда f (x) делится на nx − m (предполагается, что m и n взаимно простые числа).

А20. АЛГОРИТМ (рациональные_корни).

Дано: f (x) Z[x]

Надо: M — стек элементов типа Q (рациональные корни f (x)) g(x) — делитель максимальной степени многочлена f (x),

не имеющий рациональных корней.

Начало

M.начать работу

a := f.старший коэффициент b := f.свободный член

g(x) := f (x)

цикл для всех (p, q), где p N, q Z, p|a, q|b, НОД(p, q) = 1 r := остаток от деления g(x) на px − q

// т. е. g(x) = (px − q) · h(x) + r

если r = 0, то

M.добавить q/p g(x) := h(x)

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

15.2. Организация перебора. Простейший случай:

цикл для p от 1 до a таких, что p|a

цикл для q от 1 до b таких, что q|b & НОД(p, q) = 1,

цикл для j = −1; 1

r := остаток от деления g(x) на px − jq

// т. е. g(x) = (px − jq) h(x) + r

если r=0, то

M.добавить q/p g(x) := h(x)

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

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

156

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

 

 

15.3. Перебор с предварительным разложением старшего коэффициента и свободного члена на простые множители. Мы предполагаем, что количество простых чисел, на которые делятся a или b, невелико (не превосходит N DEL). Эти числа располагаются в массиве del, соответствующие показатели степеней — в pow1 и pow2. Числа p и q задаются векторами curr1 и curr2, которые содержат показатели степеней простых делителей чисел p и q соответственно.

curr1 := 0 p := 0

M.начать работу конец_p_перебора := “нет” цикл пока не конец_p_перебора

q := 1 curr2 := 0

конец_q_перебора := “нет” цикл пока не конец_q_перебора

ДЕЛЕНИЕ (g, p, q, успех)

если успех, то

M.добавить q/p

цикл для i от 1 до N DEL pow1i := pow1i − curr1i pow2i := pow2i − curr2i

конец цикла конец если если q > 0 то

q := −q

иначе N EXT Q

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

N EXT P

конец цикла

А21. АЛГОРИТМ NEXTP.

Начало

конец_p_перебора := “да”

цикл для i от 1 до N DEL пока конец_p_перебора

если curr1i < pow1i то curr1i := curr1i + 1

конец_p_перебора := “нет”

16. ПЕРЕБОР НЕПРИВОДИМЫХ СОМНОЖИТЕЛЕЙ

157

 

 

иначе curr1i := 0

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

p := 1

если не конец_p_перебора, то

цикл для i от 1 до N DEL p := p · delicurr1i

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

А22. АЛГОРИТМ NEXTQ.

Начало

конец_q_перебора := “да”

цикл для i от 1 до N DEL пока конец_q_перебора

если (curr2i < pow2i)&(pow1i = 0) то curr2i := curr2i + 1

конец_q_перебора := “нет”

иначе curr2i := 0

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

q := 1

если не конец_q_перебора, то

цикл для i от 1 до N DEL q := q · delicurr2i

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

16. Факторизация, основанная на переборе неприводимых сомножителей в K[x]

16.1. Общая схема. Рассмотрим вложение кольца целых чисел Z в поле комплексных чисел C. Основная теорема алгебры утверждает, что в кольце C[x] всякий полином разлагается на линейные множители. Можно считать, что это разложение имеет вид

f (x) = a · (x − α1)(x − α2) . . . (x − αn),

где a — старший коэффициент полинома f , а α1, . . . , αn — его корни. Если f1 — делитель полинома f в кольце Z[x], то в C[x] имеет место разложение

f1(x) = b · (x − αi1 ) . . . (x − αik ),

158

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

 

 

где b — целое число, делящее a, а {i1, . . . , ik} — подмножество множества индексов {1, . . . , n}. С другой стороны, если полином

f1(x) = a · (x − αi1 ) . . . (x − αik ) принадлежит Z[x], то полином f1(x)/ cont(f1(x)) также принадлежит Z[x] и делит f (x). Таким об-

разом можно предложить следующий метод факторизации полинома f (x) Z[x].

А23. АЛГОРИТМ (Факторизовать перебором комплексных корней).

Начало

Найти все комплексные корни α1, . . . , αn полинома f I := {1, . . . , n}

цикл для каждого подмножества {i1, . . . , ik} I

если g(x) = a · (x − αi1 ) . . . (x − αik ) принадлежит Z[x] то

запомнить множитель g(x) := g(x)/ cont(g(x)) f (x) := f (x)/g(x)

I := I \ {i1, . . . , ik}

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

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

К сожалению, описанный подход не является решением задачи факторизации даже с “классической” точки зрения, поскольку в общем случае мы не можем “за конечное число шагов” найти даже один корень полинома. Однако мы можем находить корни полинома с любой наперед заданной точностью. При этом возникает другая проблема. Если корни полинома вычислены приближенно, то мы не можем проверить, принадлежит ли полином g(x) кольцу Z[x].

Однако, если точность выбрана достаточно высокой, то эту проверку мы можем заменить двумя шагами: округлить коэффициенты полинома g(x) до ближайшего целого, и проверить, делит ли получившийся полином исходный полином f (x). Получаем:

А24. АЛГОРИТМ (с учетом точности вычислений).

Начало

Определить требуемую точность вычислений ε

Найти все комплексные корни α1, . . . , αn полинома f с точностью ε

I := {1, . . . , n}

16. ПЕРЕБОР НЕПРИВОДИМЫХ СОМНОЖИТЕЛЕЙ

159

 

 

Цикл для каждого подмножества {i1, . . . , ik} I

Округлить до ближайшего целого коэффициенты

полинома g(x) = a · (x − αi1 ) . . . (x − αik ) g(x) := g(x)/ cont(g(x))

если g(x) делит f (x) то

запомнить множитель g(x) f (x) := f (x)/g(x)

I := I \ {i1, . . . , is}

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

Для практической реализации данного метода нужно детализировать алгоритмы выбора точности вычислений и нахождения корней полинома.

Выбор точности определяется следующим условием: если

g(x) = a · (x − αi1 ) . . . (x − αik ) Z[x]

и

g˜(x) = a · (x − α˜i1 ) . . . (x − α˜ik ),

где |αi − α˜i| < ε, то коэффициенты полинома g(x) − g˜(x) по модулю меньше 1/2. На основе оценок значений корней эта задача не представляет особой сложности.

16.1. УПРАЖНЕНИЕ. Используя границы для корней многочлена, оценить значение ε.

Для нахождения всех комплексных корней полинома можно воспользоваться комплексным аналогом метода Штурма, позволяющим определить количество корней полинома в заданном прямоугольнике комплексной плоскости [28], а далее — методом дихотомии. Однако гораздо чаще для нахождения комплексных корней полинома используются разновидности метода Ньютона. Эти методы разрабатываются в численном анализе, и мы не будем здесь останавливаться на них.

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

160

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

 

 

А25. АЛГОРИТМ (факторизовать с помощью разложения над R).

Начало

Определить требуемую точность вычислений ε

Найти все неприводимые над R нормированные делители h1, . . . , hm полинома f с точностью ε

I := {1, . . . , m}

цикл для каждого подмножества {i1, . . . , ik} I

Округлить коэффициенты полинома g(x) = a · (hi1 · · · · · hik ) до ближайшего целого

g(x) := g(x)/ cont(g(x))

если g(x) делит f (x) то

запомнить множитель g(x) f (x) := f (x)/g(x)

удалить из множества I подмножество {i1, . . . , ik}

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

Проанализируем предлагаемый алгоритм. Он основан на том, что любое действительное число является пределом фундаментальной последовательности рациональных чисел и любая фундаментальная последовательность рациональных чисел сходится к действительному числу. Арифметические операции являются при этом непрерывными. При реальных вычислениях на компьютере мы используем итерационные методы, т. е. строим фундаментальные последовательности, сходящиеся к коэффициентам делителей исходного полинома.

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

Кроме архимедовой, на поле рациональных чисел имеются более экзотические метрики, так называемые неархимедовы или p-ади- ческие. Они используются при решении многих алгебраических и

16. ПЕРЕБОР НЕПРИВОДИМЫХ СОМНОЖИТЕЛЕЙ

161

 

 

теоретико-числовых задач. В частности, p-адическая метрика оказывается более полезной, чем архимедова при факторизации полиномов.

Применение ее для решения задач факторизации стало возможным после того, как был получен достаточно эффективный метод разложения полиномов на множители над полем p-адических чисел. Этот метод состоит из двух ключевых алгоритмов: первый из них, алгоритм Берлекэмпа, позволяет достаточно быстро разлагать на множители полиномы с коэффициентами из конечного поля, что соответствует нахождению нулевого приближения разложения в описанном выше алгоритме; второй представляет p-адический аналог метода Ньютона. Математический результат, на котором он основан, носит название леммы Гензеля. Метод факторизации, базирующийся на алгоритме Берлекэмпа и лемме Гензеля, принят во многих системах компьютерной алгебры.

16.2.p-адический случай. Формально алгоритм факторизации

сиспользованием поля p-адической метрики совпадает с алгоритмом, приведенным выше для поля R:

А26. АЛГОРИТМ. (Факторизовать многочлен с помощью p-адиче- ской метрики)

Начало

Выбрать простое число p.

Определить требуемую точность вычислений ε.

Найти все неприводимые над Rp нормированные делители h1, . . . , hm полинома f с точностью ε

I := {1, . . . , m}

цикл для каждого подмножества {i1, . . . , ik} I

Округлить коэффициенты полинома g(x) = a · hi1 · · · · · hik до ближайшего целого

g(x) := g(x)/ cont(g(x))

если g(x) делит f (x) то

запомнить множитель g(x) f (x) := f (x)/g(x)

удалить из множества I подмножество {i1, . . . , ik}

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

Основные отличия заключаются в следующем.

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

Добавляется новый шаг алгоритма, заключающийся в выборе простого числа p. На выбор его накладывается два условия: вопервых, при переходе к вычетам по модулю p не должна понизиться степень полинома f , т. е. p не должно делить старший коэффициент полинома f ; во-вторых, после перехода к классам по модулю p полином f должен остаться свободным от квадратов, т. е. p не должно делить результант полиномов f и f .

Отметим, что от выбора простого числа p может зависеть количество множителей в разложении полинома по модулю p. В некоторых системах выполняется разложение исходного полинома по модулю нескольких различных значений p (обычно до пяти значений), из них выбирается такое p, разложение по модулю которого имеет наименьшее количество сомножителей, и разложение продолжается по этому модулю. Это замечание относится только ко временным характеристикам алгоритма и носит вероятностный характер (нет алгоритма, позволяющего проверить, что разложение по какому-то модулю имеет минимальное возможное количество сомножителей).

Далее, вместо рациональных чисел, приближающих вещественные коэффициенты, будут использоваться классы по модулю pi для натуральных значений i. Требуемая точность вычислений определяется как натуральное число s, так что для факторизации полинома f (x) Z[x] нам нужно разложить на множители этот полином по модулю ps. Округление коэффициентов полинома до ближайшего целого состоит в том, что представители коэффициентов берутся из симметричной системы вычетов.

Как определить требуемую точность вычислений? Предположим, что f (x), g(x) Q[x], причем g(x) делит f (x).

Предположим, что мы умеем оценивать сверху какой-то величиной B абсолютную величину коэффициентов полинома g(x) в зависимости от коэффициентов исходного полинома f (x) и от старшего коэффициента полинома g(x) и от его степени. Таким образом, ошибок округления при нахождении делителя исходного полинома не будет, если используемая симметричная система содержит значения от −B до +B, т. е. , если s удовлетворяет неравенству ps > 2B.

Учитывая предположение, что полином f не имеет линейных делителей, т. е. нужно искать неприводимые делители степени не выше n − 2, где n = deg f , и максимальное значение старшего коэффициента полинома g(x) равно старшему коэффициенту a исходного полинома, шаг алгоритма

Определить требуемую точность вычислений ε

16. ПЕРЕБОР НЕПРИВОДИМЫХ СОМНОЖИТЕЛЕЙ

163

 

 

принимает вид:

Найти наименьшее натуральное s, такое, что ps > 2n−1kf k.

Перейдем теперь к рассмотрению основного шага алгоритма:

Найти все неприводимые над Rp нормированные делители h1, . . . , hm полинома f с точностью ε

Детализируем его следующим образом.

Найти нулевое приближение разложения Оценить необходимую точность вычислений цикл пока не достигнута требуемая точность

выполнить шаг итерации

конец цикла

Нулевое приближение разложения f (x) в поле p-адических чисел получается из разложения полинома f (x) в поле вычетов по модулю p. Это разложение выполняется с помощью алгоритма Берлекэмпа.

Итерационный шаг уточнения разложения заключается в переходе от сравнения по модулю pk к сравнению по модулю q = pt, где t > k. Этот переход выполняется с помощью леммы Гензеля. Наиболее часто используется случай t = 2k (квадратичный подъем) или t = k + 1 (линейный подъем). При этом в одной и той же системе могут применяться оба метода: сначала квадратичный, а после, когда применение квадратичного метода приведет к слишком большим числам, — линейный. Итерационный процесс заканчивается, когда показатель степени t будет не меньше значения s, определенного выше. В качестве представителей системы вычетов по модулю pt берется сбалансированная система, т. е. целые числа, не превосходящие по абсолютной величине числа (pt − 1)/2.

Проверка испытуемой комбинации на получение делителя полинома f (x) осуществляется пробным делением.

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

С учетом сделанных замечаний алгоритм факторизации принимает вид:

А27. АЛГОРИТМ (разложить на неприводимые (f, G)).

Дано: f (x) Z[x]

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

Переменные: U — разложение

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

t := 1
M := {1, . . . , r}
цикл пока t 6 [r/2]
цикл для каждого подмножества {i1, . . . , it} M
g(x) := lc(f )ui1 (x)ui2 (x) . . . uit (x) g(x) := g(x)/ cont(g)
если f (x) делится на g(x) то G.добавить g(x)
f (x) := f (x)/g(x) r := r − t
M .удалить {i1, i2, . . . , it}
конец если конец цикла
t := t + 1
конец цикла
lc(f )
U := нулевое приближение разложения f1(x) поднять разложение U до разложения по модулю q
// достигается кратным применением леммы Гензеля r := U.число_множителей
f1(x) :=
(mod q)
f (x)
s := [logp B] + 1 q := ps
164
Начало
выбрать

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

простое число p

// p не должно делить lc(f ) и результант (f, f ) B := 2m−1kf k // оценивается необходимая точность вычислений

пока t 6 [ 2r ]

G.добавить f (x)

Конец

17. Разложение многочленов на неприводимые множители по модулю p

Этот раздел посвящен детализации предписания “нулевое приближение разложения”. Разделим его на два этапа:

(1)разложить многочлен на неприводимые множители по модулю простого p;

(2)найти добавочные множители vi.

Результатом первого этапа будет целое r и вектор u элементов типа многочлен с индексом 1..r.