Опубликован: 04.03.2008 | Уровень: профессионал | Доступ: платный
Лекция 3:

Наибольший общий делитель и последовательности полиномиальных остатков

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

  1. оценить заранее достаточное число редукций, пользуясь, например, оценками для коэффициентов делителей заданного многочлена, приведенными в "Алгоритмы Кронекера. Разложение на множители, свободные от квадратов. Факторизация" ;
  2. после каждой редукции пересчитывать коэффициенты искомого НОД, пользуясь КТО; если применение новой редукции не меняет этих коэффициентов, то проверить, делит ли полученный многочлен исходные. Если да, то задача решена, иначе выполнять следующие редукции.

Отметим, что в этой задаче, применяя КТО, мы должны находить числа с данными вычетами не из множества неотрицательных чисел \smu{1}\{0,1,\dots,m-1\}, а из симметричной системы \smu{1}\{-(m-1)/2,\dots,-1,0,1,\dots,(m-1)/2\} (при четном m, т. е. когда в качестве одного из модулей используется 2, система получается немного несимметричной: от -k+1 до k, где k=m/2 ).

Основная же проблема состоит в том, как согласовать вычисления для различных значений p. Здесь можно предложить два подхода.

Во-первых, можно свести задачу к случаю, когда искомый НОД является нормированным многочленом. Для этого заметим, что старший коэффициент искомого НОД делит старшие коэффициенты исходных многочленов, а значит, делит НОД старших коэффициентов этих многочленов. Обозначим этот НОД через c. Перейдем от переменной x к переменной y=cx. Для этого нам понадобится домножить исходные многочлены на некоторые степени числа c, чтобы после замены cx=y получить многочлены a'(y) и b'(y) с целочисленными коэффициентами. После этого решаем задачу для многочленов a'(y) и b'(y), выполняя все вычисления в кольцах вычетов над нормированными многочленами. Получаем d'(y)=НОД(a'(y),b'(y)) в \Z[y]. К сожалению, d'(cx), в общем случае, не является искомым наибольшим общим делителем, а отличается от него некоторым целочисленным множителем. Чтобы найти искомый НОД, достаточно вычислить примитивную часть многочлена d'(cx).

Недостаток этого метода в том, что при достаточно высоких степенях исходных многочленов коэффициенты промежуточных многочленов (от y ) становятся очень большими, что требует большего количества чисел p, используемых для редукций, и более громоздких вычислений при применении КТО.

А 8. АЛГОРИТМ (Модулярный НОД).

\begin{align*}
&\text{Дано: \quad $a(x), b(x) \in Z[x]$}\\
&\text{Надо: \quad $d(x) = НОД(a(x), b(x))$}\\
&\text{начало}\\
&\text{$c := НОД(lc(a(x)), lc(b(x)))$}\\
&\text{выбрать нечетное простое $p$}\\
&\text{$m := p$}\\
&\text{$dm(x) := c * НОД(a_p(x), b_p(x))$ (в симметричной системе вычетов}\\
&\text{\quad \quad \quad по модулю $m$);}\\
&\text{цикл пока $p.p.(d_m(x))$ не делит $a(x) и b(x) в Z[x]$}\\
&\text{\quad выбрать следующее простое $p$}\\
&\text{\quad $d_p(x) := НОД(a_p(x), b_p(x))$}\\
&\text{\quad если $deg d_p(x) < deg d_m(x)$ то}\\
&\text{\quad \quad $m := p$}\\
&\text{\quad \quad $d_m(x) := c * d_p(x)$ (в симметричной системе вычетов}\\
&\text{\quad \quad \quad по модулю $m$);}\\
&\text{\quad иначе если $deg d_p(x) = deg d_m(x)$ то}\\
&\text{\quad \quad Применить КТО к $(m, p, d_m(x), c * d_p(x))$}\\
&\text{\quad конец если}\\
&\text{конец цикла}\\
&\text{вернуть$(d_m(x)$)}
\end{align*}

Предписание "Применить КТО к (m,p,d_m(x),c*d_p(x)) " означает следующее. На входе: pпростое число, m — натуральное число, не делящееся на p, коэффициенты многочленов d_m(x)=\sum\limits_{i=0}^na_ix^i и c*d_p(x)=\smash[t]{\sum\limits_{i=0}^n}b_ix^i рассматриваются как представители смежных классов по модулю m и p соответственно. Вычисляются числа a'_i, такие что a'_i\equiv a_i\pmod
m и a'_i\equiv b_i\pmod p, -mp/2 < a'_i\le mp/2, i=0,1,\dots,n. На выходе m:=m*p и d_m(x)=\sum\limits_{i=0}^na'_ix^i.

6.16. ЗАДАЧА. Доказать корректность представленного алгоритма.

6.17. ПРИМЕР. Пользуясь модулярным алгоритмом, вычислим НОД многочленов f(x)=28x^3+216x^2-193x-51 и g(x)=8x^3+
78x^2+33x-442.

Наибольший общий делитель старших коэффициентов равен 4. Вычисляя НОД(f(x),g(x))\pmod3, получим d_3(x)=x+1. Домножая d_3(x) на 4 и переходя к симметричной системе вычетов, снова получим x+1. Легко проверить, что полученный многочлен не делит ни один из исходных многочленов.

В качестве следующего простого числа берем p=5. Вычисляя НОД(f(x),g(x))\pmod5, получим d_5(x)=x^2+3x+2. Поскольку \smu{1} \deg(d_5)>\deg(d_3), заключаем, что \smu{1}
p=5 является "плохой редукцией".

Переходим к p=7. Получаем \smu{1}
d_7(x)=НОД(f(x),g(x))\pmod7= x+5. Домножая на 4, получим 4x+20\equiv 4x+6\pmod7. Пользуясь китайской теоремой об остатках, решаем систему сравнений

\begin{cases} a\equiv 1\pmod3,&\\a\equiv6\pmod7.&\end{cases}
Получаем a\equiv13\pmod{21}. Переходя к симметричной системе вычетов, получаем d_{21}(x)=4x-8. Убеждаемся, что d_{21}(x) не делит исходные многочлены в \mathbb Q[x].

Берем p=11. Получаем d_{11}(x)=НОД(f(x),g(x))\pmod{11}
 = x+3. Домножая на 4, получим 4x+12\equiv 4x+1\pmod7. Пользуясь китайской теоремой об остатках, решаем систему сравнений

\begin{cases} a\equiv
13\pmod{21},&\\a\equiv1\pmod{11}.&\end{cases}
Получаем a\equiv34\pmod{231}. Переход к симметричной системе вычетов ничего не меняет, и в итоге мы получаем d_{231}(x)=4x+34. Убеждаемся, что d_{231}(x) делит исходные многочлены в \mathbb \Q[x] и p.p.(d_{231}(x))=2x+17 является наибольшим общим делителем исходных многочленов.

Марина Подлевских
Марина Подлевских

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

Александр Марушко
Александр Марушко
Россия
Стешков Антон
Стешков Антон
Россия, г. Гуково