Опубликован: 04.03.2008 | Доступ: свободный | Студентов: 1644 / 57 | Оценка: 4.56 / 3.67 | Длительность: 30:07:00
ISBN: 978-5-9556-0099-4
Специальности: Программист, Математик
Лекция 7:

Алгоритмы Кронекера. Разложение на множители, свободные от квадратов. Факторизация

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

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

Общая схема.

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

f(x) = a\cdot (x- \alpha_1)(x-\alpha
_2)\dots(x-\alpha_n),
где a - старший коэффициент полинома f, а \alpha _1,\dots,\alpha _n - его корни. Если f_1 - делитель полинома f в кольце \mathbb Z[x], то в \mathbb C[x] имеет место разложение
f_1(x) = b\cdot (x-
\alpha_{i_1})\dots(x-\alpha_{i_k}),
где b - целое число, делящее a, а \{ i_1,\dots,i_k\} - подмножество множества индексов \{
1,\dots,n\}. С другой стороны, если полином f_1(x)  = 
a\cdot  (x-\alpha
_{i_1})\dots(x-\alpha  _{i_k}) принадлежит \mathbb Z[x], то полином f_1(x)/
\cont(f_1(x)) также принадлежит \mathbb Z[x] и делит f(x). Таким образом можно предложить следующий метод факторизации полинома f(x) \in
\mathbb Z[x].

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

\begin{equation}\\
\text{Начало}\\
\text{Найти все комплексные корни $\alpha_1,\dots,\alpha_n$ полинома
$f$}\\
\text{$I:=\{1,\dots,n\}$}\\
\text{цикл для каждого подмножества $\{ i_1,\dots,i_k\} \subset I$}\\
\text{если $g(x) =  a\cdot (x-\alpha_{i_1})\dots(x-\alpha_{i_k})$ принадлежит $\mathbb Z[x]$
то}\\
\text{\qquad \qquad запомнить множитель $g(x) := g(x)/\cont(g(x))$}\\
\text{\qquad \qquad $f(x) := f(x)/g(x)$}\\
\text{\qquad \qquad $I:=I\setminus\{i_1,\dots,i_k\}$}\\
\text{\qquad  конец если}\\
 \text{конец цикла}\\
 \text{Конец}
\end{equation}

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

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

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

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

\begin{equation}\\
\text{Начало}\\
\text{Определить требуемую точность вычислений $\varepsilon$}\\
\text{Найти все комплексные корни $\alpha_1,\dots,\alpha_n$ полинома
$f$ с точностью $\varepsilon$}\\
\text{$I:=\{1,\dots,n\}$}\\
 \text{Цикл для каждого подмножества $\{ i_1,\dots,i_k\} \subset I$}\\
\text{\qquad Округлить до ближайшего целого коэффициенты}\\
\text{\qquad \qquad  полинома $g(x) = a\cdot (x-\alpha _{i_1}) \dots (x-\alpha
_{i_k})$}\\
\text{\qquad  $g(x) := g(x)/\cont(g(x))$}\\
\text{\qquad  если  $g(x)$ делит
$f(x)$  то } \\
\text{\qquad \qquad запомнить множитель $g(x)$}\\
\text{\qquad \qquad $f(x) := f(x)/g(x)$}\\
\text{\qquad \qquad $I:=I\setminus\{i_1,\dots,i_s\}$}\\
\text{\qquad  конец если }\\
\text{ конец цикла }\\
 \text{Конец}  
\end{equation}

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

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

g(x) =  a\cdot  (x-\alpha_{i_1})\dots(x-\alpha
_{i_k})\in\mathbb Z[x]
и
\tilde g(x) =  a\cdot(x-\tilde  \alpha 
_{i_1})\dots(x-\tilde  \alpha  _{i_k}),
где \vert  \alpha_i-\tilde \alpha _i \vert < \eps, то коэффициенты полинома g(x)-\tilde g(x) по модулю меньше 1/2. На основе оценок значений корней эта задача не представляет особой сложности.

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

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

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

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

\begin{equation}\\
 \text{Начало} \\
\text{Определить требуемую точность вычислений $\varepsilon$}\\
\text{Найти все неприводимые над $\R$  нормированные  делители 
$h_1,\dots,h_m$}\\
\text{полинома $f$ с точностью $\varepsilon$}\\
\text{$I:= \{  1,\dots,m\}$}\\
 \text{цикл для каждого подмножества $\{ i_1,\dots,i_k\} \subset I$}\\
\text{\qquad Округлить коэффициенты полинома $g(x)  =  a\cdot(h_{i_1}\cdot\dots\cdot
h_{i_k})$}\\
\text{\qquad \qquad   до ближайшего целого}\\
\text{\qquad $g(x) :=  g(x)/\cont(g(x))$}\\
\text{\qquad  если  $g(x)$ делит $f(x)$  то }\\
\text{\qquad \qquad запомнить множитель $g(x)$}\\
\text{\qquad \qquad $f(x) := f(x)/g(x)$}\\
\text{\qquad \qquad удалить из множества $I$ подмножество $\{
i_1,\dots,i_k\}$}\\
\text{\qquad  конец если} \\
 \text{конец цикла} \\
 \text{Конец} 
\end{equation}

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

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

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

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

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Марина Подлевских
Марина Подлевских

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