В арифметике и компьютерном программировании используется расширенный алгоритм Евклида является расширением алгоритма Евклида и вычисляет, помимо наибольшего общего делителя (gcd) целых чисел a и b, также коэффициенты тождества Безу., которые являются целыми числами x и y, такими что
Это алгоритм сертификации, потому что gcd - единственное число, которое может одновременно удовлетворять этому уравнению и разделять входные данные. Это позволяет также вычислить, почти без дополнительных затрат, частное чисел a и b на их наибольший общий делитель.
Расширенный алгоритм Евклида также относится к очень похожему алгоритму для вычисления наибольшего общего делителя полинома и коэффициентов тождества Безу двух одномерных многочленов.
Расширенный алгоритм Евклида особенно полезен, когда a и b взаимно просты. С этим положением, x является модульным мультипликативным обратным к по модулю b, а y является модульным мультипликативным обратным к b по модулю a. Точно так же полиномиальный расширенный алгоритм Евклида позволяет вычислять мультипликативную обратную в расширениях алгебраических полей и, в частности, в конечных полях непростого порядка. Отсюда следует, что оба расширенных алгоритма Евклида широко используются в криптографии. В частности, вычисление модульного мультипликативного обратного является важным этапом при выводе пар ключей в методе шифрования с открытым ключом RSA.
Стандартный алгоритм Евклида использует последовательность евклидовых делений, частные которых не используются. Сохраняются только остатки. Для расширенного алгоритма используются последовательные частные. Точнее, стандартный алгоритм Евклида с a и b в качестве входных данных состоит из вычисления последовательности частных и последовательность остатков такая, что
Основным свойством евклидова деления является то, что неравенства справа однозначно определяют и из и
Вычисление останавливается, когда достигается остаток , равный нулю; тогда наибольший общий делитель - это последний ненулевой остаток
Расширенный алгоритм Евклида действует аналогично, но добавляет две другие последовательности, как показано ниже:
Вычисление также останавливается, когда и дает
Более того, если a и b оба положительны и , затем
для где обозначает неотъемлемая часть числа x, то есть наибольшее целое число, не превышающее x.
Это означает, что пара коэффициентов Безу, предоставленная расширенным алгоритмом Евклида, является минимальной парой коэффициентов Безу, как единственная пара, удовлетворяющая обоим вышеупомянутым неравенствам.
Также это означает, что алгоритм может быть выполнен без целочисленного переполнения с помощью компьютерной программы с использованием целых чисел фиксированного размера, который больше, чем у a и b.
В следующей таблице показано, как расширенный алгоритм Евклида работает с входными данными 240 и 46. Наибольший общий делитель - это последняя ненулевая запись, 2 в столбце «остаток». Вычисление останавливается на строке 6, потому что остаток в ней равен 0. Коэффициенты Безу появляются в последних двух записях предпоследней строки. Фактически, легко проверить, что −9 × 240 + 47 × 46 = 2. Наконец, два последних элемента 23 и −120 последней строки являются, с точностью до знака, частными входных данных 46 и 240 на наибольший общий делитель 2.
индекс i | частное q i − 1 | остаток r i | si | ti |
---|---|---|---|---|
0 | 240 | 1 | 0 | |
1 | 46 | 0 | 1 | |
2 | 240 ÷ 46 = 5 | 240-5 × 46 = 10 | 1 - 5 × 0 = 1 | 0 - 5 × 1 = −5 |
3 | 46 ÷ 10 = 4 | 46 - 4 × 10 = 6 | 0 - 4 × 1 = −4 | 1 - 4 × −5 = 21 |
4 | 10 ÷ 6 = 1 | 10 - 1 × 6 = 4 | 1-1 × −4 = 5 | −5-1 × 21 = −26 |
5 | 6 ÷ 4 = 1 | 6-1 × 4 = 2 | −4-1 × 5 = −9 | 21-1 × −26 = 47 |
6 | 4 ÷ 2 = 2 | 4-2 × 2 = 0 | 5-2 × −9 = 23 | −26-2 × 47 = -120 |
As последовательность представляет собой убывающую последовательность неотрицательных целых чисел (начиная с i = 2 и далее). Таким образом, он должен остановиться с некоторым Это доказывает, что алгоритм в конечном итоге останавливается.
As наибольший общий делитель одинаков для и Это показывает, что наибольший общий делитель входных данных то же самое, что и Это доказывает, что является наибольшим общим делителем a и b. (До этого момента доказательство такое же, как и для классического алгоритма Евклида.)
As и мы имеем для i = 0 и 1. Отношение следует по индукции для всех :
Таким образом, и являются коэффициентами Безу.
Рассмотрим матрица
Повторяющееся отношение можно переписать в матричной форме
Матрица - это единичная матрица, и ее определитель равен единице. Определитель самой правой матрицы в предыдущей формуле равен −1. Отсюда следует, что определитель равен В частности, для имеем Если рассматривать это как личность Безу, это показывает что и равны coprime. Доказанное выше соотношение и лемма Евклида показывает, что делит b и делит a. Поскольку они взаимно просты, они до своего знака являются частными b и a по их наибольшему общему делителю.
Чтобы доказать последнее утверждение, предположим, что a и b оба положительны и . Тогда , и если
Видно, что
Это, сопровождаемый тем фактом, что
Для одномерных многочленов с коэффициентами в поле все работает аналогично, евклидово деление, тождество Безу и расширенный алгоритм Евклида. Первое отличие состоит в том, что в евклидовом делении и алгоритме неравенство
Второе отличие заключается в ограничении размера коэффициентов Безу, обеспечиваемом расширенным алгоритмом Евклида, который более точен в полиномиальном случае, что приводит к следующей теореме.
Если a и b - два ненулевых многочлена, то расширенный алгоритм Евклида создает уникальную пару многочленов (s, t), такую что
и
Третье отличие состоит в том, что в полиномиальном случае наибольший общий делитель определяется только с точностью до умножения на ненулевое постоянный. Существует несколько способов однозначного определения наибольшего общего делителя.
В математике принято требовать, чтобы наибольший общий делитель был моническим многочленом. Чтобы получить это, достаточно разделить каждый элемент вывода на ведущий коэффициент
Второй способ нормализовать наибольший общий делитель в случае многочленов с целыми коэффициентами - разделить каждый вывод на содержимое из
Третий подход состоит в расширении алгоритма подрезультатных последовательностей псевдоостаточных остатков способом, аналогичным расширению алгоритма Евклида на расширенный алгоритм Евклида. Это позволяет, начиная с полиномов с целыми коэффициентами, все вычисляемые многочлены имеют целые коэффициенты. Кроме того, каждый вычисленный остаток
где
Для реализации алгоритма, описанного выше, следует сначала отметить, что на каждом шаге необходимы только два последних значения индексированных переменных. Таким образом, для экономии памяти каждая индексируемая переменная должна быть заменена всего двумя переменными.
Для простоты следующий алгоритм (и другие алгоритмы в этой статье) используют параллельные назначения. В языке программирования, который не имеет этой функции, параллельные присвоения необходимо моделировать с помощью вспомогательной переменной. Например, первый,
(old_r, r): = (r, old_r - quotient * r)
эквивалентен
prov: = r; r: = old_r - частное × prov; old_r: = prov;
и аналогично для других параллельных назначений. Это приводит к следующему коду:
function extended_gcd (a, b) (old_r, r): = (a, b) (old_s, s): = (1, 0) (old_t, t): = (0, 1) в то время как r ≠ 0 do частное: = old_r div r (old_r, r): = (r, old_r - частное × r) (old_s, s): = (s, old_s - частное × s) (old_t, t): = (t, old_t - частное × t) output «Коэффициенты Безу:», (old_s, old_t) output "наибольший общий делитель:", old_r output "частные по НОД:", (t, s)
Частные a и b по их Наибольший общий делитель, который выводится, может иметь неправильный знак. Это легко исправить в конце вычислений, но здесь не было сделано для упрощения кода. Точно так же, если либо a, либо b равны нулю, а другое отрицательное, наибольший общий делитель, который выводится, отрицателен, и все знаки вывода должны быть изменены.
Наконец, обратите внимание, что в личности Безу
function extended_gcd (a, b) s: = 0; old_s: = 1 r: = b; old_r: = a в то время как r ≠ 0 do частное: = old_r div r (old_r, r): = (r, old_r - частное × r) ( old_s, s): = (s, old_s - частное × s) если b ≠ 0, то bezout_t: = частное (old_r - old_s × a, b) else bezout_t: = 0 вывод «Коэффициенты Безу:», (old_s, bezout_t) вывод «наибольший общий делитель:», old_r
Однако во многих случаях на самом деле это не оптимизация: в то время как первый алгоритм не подвержен переполнению при использовании с машинными целыми числами (то есть целыми числами с фиксированной верхней границей цифр), умножение old_s * a при вычислении bezout_t может переполняться, ограничивая это оптимизация входов, которые могут быть представлены в менее чем половине максимального размера. При использовании целых чисел неограниченного размера время, необходимое для умножения и деления, увеличивается квадратично с размером целых чисел. Это означает, что «оптимизация» заменяет последовательность умножений / делений небольших целых чисел на одно умножение / деление, что требует больше вычислительного времени, чем операции, которые она заменяет, вместе взятые.
Дробь a / b находится в канонической упрощенной форме, если a и b взаимно просты и b положительно. Эту каноническую упрощенную форму можно получить, заменив три строки вывода предыдущего псевдокода на
ifs = 0, затем выведите «Деление на ноль» ifs < 0, затем s: = −s ; t: = −t (для исключения отрицательных знаменателей) если s = 1, тогда вывести -t (чтобы избежать знаменателей, равных 1) output -t / s
Доказательство этого алгоритма основывается на том факте, что s и t - два взаимно простых целых числа, такие как + bt = 0, и, следовательно,
Если b делит a равномерно, алгоритм выполняет только одну итерацию, и в конце алгоритма s = 1. Это единственный случай, когда результат является целым числом.
Расширенный алгоритм Евклида является важным инструментом для вычисления мультипликативных инверсий в модульных структурах, обычно модульных целых числах и расширения алгебраических полей. Ярким примером последнего случая являются конечные поля непростого порядка.
Если n является положительным целым числом, кольцо Z/nZ может быть идентифицировано с набором {0, 1,..., n-1} остатков Евклидово деление на n, сложение и умножение, заключающееся в взятии остатка на n результата сложения и умножения целых чисел. Элемент a из Z/nZимеет мультипликативную инверсию (то есть это единица ), если он взаимно просто с n. В частности, если n является простым, a имеет мультипликативный обратный, если он не равен нулю (по модулю n). Таким образом, Z/nZявляется полем тогда и только тогда, когда n простое.
Идентификатор Безу утверждает, что a и n взаимно просты тогда и только тогда, когда существуют целые числа s и t такие, что
Уменьшение этой идентичности по модулю n дает
Таким образом, t, или, точнее, остаток от деления t на n, является мультипликативным обратным по модулю n.
Чтобы адаптировать расширенный алгоритм Евклида к этой проблеме, следует отметить, что коэффициент Безу для n не требуется, и, следовательно, его не нужно вычислять. Кроме того, для получения положительного результата, меньшего n, можно использовать тот факт, что целое число t, предоставленное алгоритмом, удовлетворяет | t | < n. That is, if t < 0, one must add n to it at the end. This results in the pseudocode, in which the input n is an integer larger than 1.
функция инверсия (a, n) t: = 0; тритон: = 1 r: = n; newr: = a while newr ≠ 0 do частное: = r div newr (t, newt): = (newt, t - частное × тритон) ( r, newr): = (newr, r - частное × newr) если r>1, тогдаreturn «a не обратимо» ift < 0, затем t: = t + n return t
Расширенный алгоритм Евклида также является основным инструментом для вычисления мультипликативных обратных в простых алгебраических расширения полей. Важным случаем, широко используемым в криптографии и теории кодирования, является случай конечных полей непростого порядка. Фактически, если p - простое число и q = p, поле порядка q представляет собой простое алгебраическое расширение простого поля из p элементов, порожденное корнем неприводимого многочлена степени d.
Простое алгебраическое расширение L поля K, порожденное корнем неприводимого многочлена p степени d, можно отождествить с кольцом частных
Алгоритм очень похож на описанный выше для вычисления модульного мультипликативного обратного. Есть два основных отличия: во-первых, предпоследняя линия не нужна, потому что коэффициент Безу, который предоставляется, всегда имеет степень меньше d. Во-вторых, наибольший общий делитель, который предоставляется, когда входные многочлены взаимно просты, может быть любыми ненулевыми элементами K; этот коэффициент Безу (полином, как правило, положительной степени) должен быть умножен на обратный к этому элементу K. В псевдокоде, который следует далее, p - многочлен степени больше единицы, а a - многочлен. Кроме того, div - вспомогательная функция, которая вычисляет частное евклидова деления.
функция инверсия (a, p) t: = 0; тритон: = 1 r: = p; newr: = a, а newr ≠ 0 do частное: = r div newr (r, newr): = (newr, r - частное × новее) ( t, тритон): = (тритон, t - частное × тритон) если степень (r)>0, тоreturn "Либо p не является несократимым, либо кратно p "return (1 / r) × t
Например, если многочлен, используемый для определения конечного поля GF (2), равен p = x + x + x + x + 1, а a = x + x + x + 1 - это элемент, инверсия которого требуется, тогда выполнение алгоритма приводит к вычислению, описанному в следующей таблице. Напомним, что в полях порядка 2 -z = z и z + z = 0 для каждого элемента z в поле). Поскольку 1 - единственный ненулевой элемент GF (2), корректировка в последней строке псевдокода не требуется.
шаг | частное | r, newr | s, news | t, newt |
---|---|---|---|---|
p = x + x + x + x + 1 | 1 | 0 | ||
a = x + x + x + 1 | 0 | 1 | ||
1 | x + 1 | x = p - a (x + 1) | 1 | x + 1 = 0 - 1 × (x + 1) |
2 | x + x | x + 1 = a - x (x + x) | x + x = 0-1 (x + x) | x + x + 1 = 1 - (x + x) (x + 1) |
3 | x + 1 | 1 = x - (x + 1) (x + 1) | х + х + х + х + 1 = 1 - (х +1) (х + х) | х + х + х + х = (х + 1) - (х + 1) (х + x + 1) |
4 | x + 1 | 0 = (x + 1) - 1 × (x + 1) | x + x + x + 1 = (x + x) - (x + 1) (x + x + x + x + 1) |
Таким образом, обратное значение равно x + x + x + x, что может быть подтверждено умножением двух элементов вместе, и взяв остаток на p от результата.
Можно обрабатывать случай более двух чисел итеративно. Сначала мы показываем, что
Итак, если
Итак, чтобы применить к n числам, мы используем индукцию
с уравнениями, которые следуют непосредственно.
Викибук Реализация алгоритма содержит страницу по теме: Расширенный алгоритм Евклида |