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

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

Алгоритмы вычисления НОД(a,b) в кольцах иногочленов k[x] и Z[x]

Сформулируем алгоритмы, предложенные ранее в качестве упражнения. Во всех предложенных ниже алгоритмах считаем, что a и b — натуральные числа, следовательно, ненулевые.

А1. АЛГОРИТМ (НОД1).

Дано:  \quad $a,b\in \mathbb N$ \\
Надо: \quad $d\in \mathbb \mathbb N$, \\
Переменные:\quad $x,y\in \mathbb N$  \\
начало \\
$x:=a$ \\
$y:=b$ \\
цикл пока $x \ne y$\\
  \quad если $x>y$, то \\
    \quad\quad    $x:=x-y$\\
  \quad иначе\\
    \quad\quad    $y:=y-x$\\
 \quad  конец если\\
конец цикла\\
$d:=x$ \\
конец

Данный алгоритм использует операции сравнения натуральных чисел, вычитания натуральных чисел и присваивания переменной значения натурального числа. Оценивая сложность предложенного алгоритма, можно рассматривать эти операции как элементарные. В теле цикла "пока" выполняется две операции сравнения, одна операция вычитания и одна операция присваивания. Цикл выполняется не более max(a, b) раз. Таким образом, сложность алгоритма равна O(max(a, b)).

Однако, более естественно рассматривать в качестве элементарных битовые операции.

5.22. УПРАЖНЕНИЕ. Показать, что если max(a, b) = n, то сложность вычисления НОД(a, b) по предложенному алгоритму равна O(n log2 n) битовых операций.

А2. АЛГОРИТМ (Евклида).

\begin{align*}
&\text{Дано: \quad $a, b \in\mathbb N$}\\
&\text{Надо: \quad $d \in\mathbb N$,}\\
&\text{Переменные: \quad $r, x, y \in\mathbb Z_+$}\\
&\text{начало}\\
&\text{$x := a$}\\
&\text{$y := b$}\\
&\text{цикл пока \quad $y \ne 0$}\\
&\text{\quad\quad $r := x (mod \;y)$}\\
&\text{\quad\quad $x := y$}\\
&\text{\quad\quad $y := r$}\\
&\text{конец цикла}\\
&\text{$d := x$}\\
&\text{конец}
\end{align*}

В алгоритме Евклида использовано стандартное обозначение x (mod y) для остатка от деления x на y. Легко показать, что после двух делений делимое уменьшается, как минимум, в два раза. Значит, количество повторений цикла равно O(log2 n), где n=max(a, b). Определяя битовую сложность алгоритма Евклида, мы должны учитывать, что сложность операции деления зависит от количества цифр квадратично. Таким образом, мы получаем оценку O(\log_2^3n) для битовой сложности алгоритма Евклида. Более тщательный анализ позволяет доказать оценку O(\log_2^2n).

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

5.23. УПРАЖНЕНИЕ. Показать, что если a = Fn+1, b = Fn — со- ответствующие числа Фиббоначчи, то остатки в алгоритме Евклида принимают последовательно значения Fn-1, . . . , F2 = 1.

5.24. УПРАЖНЕНИЕ. Показать, что если a > b и r_{1}, . . . , r_{n} \ne  0 — последовательные остатки, получаемые в алгоритме Евклида, то a > Fn+1, где Fk — k -ое число Фиббоначчи.

Легко видеть, что алгоритм Евклида применим в любом евкли- довом кольце, т. е. условия a, b \in \mathbb N, d \in \mathbb N и r, x, y \in \mathbb Z_+ можно заменить на a, b, d, r, x, y \in R, где R — любое евклидово кольцо.

5.25. УПРАЖНЕНИЕ. Что произойдет, если в алгоритме Евклида a и b — отрицательные или нулевые целые числа?

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

А3. АЛГОРИТМ (бинарный НОД).

\begin{align*}
&\text{Дано: \quad$a, b \in \mathbbN$}\\
&\text{Надо: \quad$d \in \mathbbN$,}\\
&\text{Переменные: \quad$x, y \in \mathbbN$}\\
&\text{начало}\\
&\text{$x := a$}\\
&\text{$y := b$}\\
&\text{$d := 1$}\\
&\text{цикл пока $x (mod \; 2) = y (mod \;2) = 0$}\\
&\quad\text{$d := 2d, x := x/2, y := y/2$}\\
&\text{конец цикла}\\
&\text{цикл пока $x \ne y$}\\
&\quad\text{выбор}\\
&\quad\quad\text{при $x (mod 2) = 0$ делать $x := x/2$}\\
&\quad\quad\quad\text{при $y (mod 2) = 0$ делать $y := y/2$}\\
&\quad\quad\quad\text{при $x > y$ делать $x := x - y$}\\
&\quad\quad\quad\text{при $x < y$ делать $y := y - x$}\\
&\quad\quad\text{конец выбора}\\
&\text{конец цикла}\\ 
&\text{$d := d \cdot x$}\\
&\text{конец}\\
\end{align*}

5.26. ЗАМЕЧАНИЕ. В конструкции выбор выполняются только действия для первого истинного условия в операторах при. Таким образом, на первые два условия мы можем попасть, когда один из аргументов четный, а другой — нечетный. На последние два условия можно попасть, только когда оба аргумента нечетны. Учитывая, что при вычитании нечетного числа из нечетного получается четное, можно результат сразу разделить на 2, т. е. строки

при x > y делать x := x - y
		при x < y делать y := y - x

заменить строками

при x > y делать x := (x - y)/2
		при x < y делать y := (y - x)/2

Очевидно, что при каждом повторении тела цикла последнего алгоритма хотя бы один аргумент уменьшается в два раза. Значит, количество повторений цикла равно O(log2 n), где n = max(a, b). Определяя битовую сложность бинарного алгоритма, мы должны учитывать, что сложность операций, выполняемых в теле цикла, зависит от количества цифр линейно, т. е. битовая сложность бинарного алгоритма равна O(\log_2^2n).

Приведем еще алгоритм вычисления НОД, основанный на свойстве факториальности кольца \mathbb Z.

А4. АЛГОРИТМ ( НОД через примарное разложение).

\begin{align*}
&\text{Дано: $a, b \in \mathbb N$}\\
&\text{Надо: $d \in \mathbb N,$}\\
&\text{Переменные: $x, \;y, \;p \in \mathbb N, \; p$ — простое число}\\
&\text{начало}\\
&\text{$x := a$}\\
&\text{$y := b$}\\
&\text{$p := 2$}\\
&\text{$d := 1$}\\
&\quad\text{цикл пока $x \ne 1$ или $y \ne 1$}\\
&\quad\quad\text{цикл пока $x \;(mod \; p) = y (mod \; p) = 0$}\\
&\quad\quad\quad\text{$d = d \cdot p, x = x/p, y = y/p$}\\
&\quad\text{конец цикла}\\
&\quad\text{цикл пока $x \;(mod \; p) = 0$}\\
&\quad\quad\text{$x = x/p$}\\
&\quad\text{конец цикла}\\
&\quad\text{цикл пока $y\; (mod \; p) = 0$}\\
&\quad\quad\text{$y = y/p$}\\
&\quad\text{конец цикла}\\
&\quad\text{$p :=$ следующее простое число}\\
&\text{конец цикла}\\
&\text{конец}
\end{align*}
Марина Подлевских
Марина Подлевских

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