Расширенный алгоритм Евклида
В арифметике и компьютерном программировании расширенный алгоритм Евклида является расширением алгоритма Евклида и вычисляет, помимо наибольшего общего делителя (НОД) целых чисел a и b , также коэффициенты тождества Безу , которые являются целыми числами x и y. такой, что
Это сертифицирующий алгоритм , поскольку НОД — единственное число, которое может одновременно удовлетворять этому уравнению и делить входные данные. Это позволяет также почти без дополнительных затрат вычислить частное a и b по их наибольшему общему делителю.
Расширенный алгоритм Евклида также относится к очень похожему алгоритму для вычисления наибольшего общего делителя полинома и коэффициентов тождества Безу двух одномерных многочленов .
Расширенный алгоритм Евклида особенно полезен, когда a и b взаимно просты . С учетом этого условия x является модульным мультипликативным обратным к a по модулю b , а y является модульным мультипликативным обратным к b по модулю a . Точно так же полиномиальный расширенный алгоритм Евклида позволяет вычислять мультипликативное обратное в расширениях алгебраических полей и, в частности, в конечных полях непростого порядка. Отсюда следует, что оба расширенных алгоритма Евклида широко используются в криптографии . В частности, вычисление модульной мультипликативной инверсии является важным шагом в получении пар ключей в RSA методе шифрования с открытым ключом .
Описание [ править ]
Стандартный алгоритм Евклида использует последовательность евклидовых делений , частное которых не используется. только остатки Сохраняются . Для расширенного алгоритма используются последовательные коэффициенты. Точнее, стандартный алгоритм Евклида с a и b в качестве входных данных состоит из вычисления последовательности частных и последовательности остатков таких, что
Главное свойство евклидова деления состоит в том, что неравенства справа однозначно определяют и от и
Вычисления прекращаются, когда достигается остаток что равно нулю; наибольший общий делитель - это последний ненулевой остаток
Расширенный алгоритм Евклида действует аналогично, но добавляет две другие последовательности, а именно:
Вычисления также останавливаются, когда и дает
- это наибольший общий делитель входных данных и
- Коэффициенты Безу: и то есть
- Частные a и b по их наибольшему общему делителю определяются выражением и
Более того, если a и b оба положительны и , затем
для где обозначает целую часть x , то есть наибольшее целое число , не большее x .
Это означает, что пара коэффициентов Безу, предоставляемая расширенным алгоритмом Евклида, является минимальной парой коэффициентов Безу, поскольку является единственной парой, удовлетворяющей обоим вышеуказанным неравенствам.
Также это означает, что алгоритм может быть реализован без переполнения целых чисел с помощью компьютерной программы, используя целые числа фиксированного размера, которые больше, чем у a и b .
Пример [ править ]
В следующей таблице показано, как работает расширенный алгоритм Евклида с входными данными 240 и 46 . Наибольший общий делитель — это последняя ненулевая запись, 2 в столбце «Остаток». Вычисление останавливается на строке 6, поскольку остаток в ней равен 0 . Коэффициенты Безу появляются в двух последних записях предпоследней строки. На самом деле легко проверить, что −9 × 240 + 47 × 46 = 2 . Наконец, последние две записи 23 и -120 последней строки с точностью до знака являются частными входных данных 46 и 240 по наибольшему общему делителю 2 .
индекс я | частное q i −1 | Остаток r i | и я | т я |
---|---|---|---|---|
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 |
Доказательство [ править ]
Как последовательность — убывающая последовательность неотрицательных целых чисел (начиная с i = 2). Таким образом, это должно прекратиться с некоторых Это доказывает, что алгоритм в конечном итоге останавливается.
Как наибольший общий делитель одинаков для и Это показывает, что наибольший общий делитель входных данных такое же, как и у Это доказывает, что — наибольший общий делитель чисел a и b . (До этого момента доказательство такое же, как и у классического алгоритма Евклида.)
Как и у нас есть для i = 0 и 1. Соотношение следует по индукции для всех :
Таким образом и – коэффициенты Безу.
Рассмотрим матрицу
Рекуррентное соотношение можно переписать в матричной форме
Матрица – единичная матрица, и ее определитель равен единице. Определитель самой правой матрицы в предыдущей формуле равен −1. Отсюда следует, что определитель является В частности, для у нас есть Рассматривая это как личность Безу, это показывает, что и взаимнопросты . Отношение это доказано выше, и лемма Евклида показывает, что делит b , то есть для некоторого целого числа d . Деление на отношение дает Так, и являются взаимно простыми целыми числами, которые являются частными a и b по общему множителю, который, таким образом, является их наибольшим общим делителем или его противоположностью .
Для доказательства последнего утверждения предположим, что a и b оба положительны и . Затем, , и если , можно видеть, что последовательности s и t для ( a , b ) в рамках EEA являются, вплоть до начальных 0 и 1, последовательностями t и s для ( b , a ). Определения затем показывают, что случай ( a , b ) сводится к случаю ( b , a ). Итак, предположим, что без потери общности.
Видно, что равен 1 и (который существует по ) — отрицательное целое число. После этого чередуются по знаку и строго возрастают по величине, что индуктивно следует из определений и того факта, что для , случай держится, потому что . То же самое верно и для после первых нескольких сроков по той же причине. Более того, легко видеть, что (когда a и b оба положительны и ). Таким образом, заметив, что , мы получаем
Это сопровождается тем, что по абсолютной величине больше или равны любому предыдущему или соответственно завершил доказательство.
алгоритм Евклида расширенный Полиномиальный
Для одномерных многочленов с коэффициентами в поле все работает аналогично: евклидово деление, тождество Безу и расширенный алгоритм Евклида. Первое отличие состоит в том, что в евклидовом делении и алгоритме выполняется неравенство необходимо заменить неравенством о степенях В остальном все, что предшествует в этой статье, остается прежним, просто заменяя целые числа многочленами.
Второе отличие заключается в оценке размера коэффициентов Безу, предоставляемой расширенным алгоритмом Евклида, который более точен в полиномиальном случае, что приводит к следующей теореме.
Если a и b два ненулевых полинома, то расширенный алгоритм Евклида создает уникальную пару полиномов ( s , t ) таких, что
и
Третье отличие состоит в том, что в полиномиальном случае наибольший общий делитель определяется только с точностью до умножения на ненулевую константу. Существует несколько способов однозначно определить наибольший общий делитель.
В математике принято требовать, чтобы наибольший общий делитель был моническим многочленом . Для этого достаточно разделить каждый элемент вывода на старший коэффициент Это позволяет если a и b получить 1 в правой части неравенства Безу, взаимно простые. В противном случае можно получить любую ненулевую константу. В компьютерной алгебре полиномы обычно имеют целые коэффициенты, и этот способ нормализации наибольшего общего делителя вводит слишком много дробей, чтобы быть удобным.
Второй способ нормализации наибольшего общего делителя в случае многочленов с целыми коэффициентами состоит в том, чтобы разделить каждый выходной сигнал содержимое на чтобы получить примитивный наибольший общий делитель. Если входные полиномы взаимно просты, эта нормализация также обеспечивает наибольший общий делитель, равный 1. Недостаток этого подхода заключается в том, что во время вычислений необходимо вычислять и упрощать множество дробей.
Третий подход заключается в расширении алгоритма промежуточных последовательностей псевдоостатков способом, аналогичным расширению алгоритма Евклида до расширенного алгоритма Евклида. Это позволяет, начиная с полиномов с целыми коэффициентами, все вычисляемые полиномы имеют целые коэффициенты. Более того, каждый вычисленный остаток является промежуточным полиномом . В частности, если входные полиномы взаимно просты, то тождество Безу принимает вид
где обозначает результат a и b . В этой форме идентичности Безу в формуле нет знаменателя. Если разделить все на результат, получится классическое тождество Безу с явным общим знаменателем для рациональных чисел, входящих в него.
Псевдокод [ править ]
Для реализации описанного выше алгоритма следует сначала отметить, что на каждом шаге необходимы только два последних значения индексированных переменных. Таким образом, для экономии памяти каждую индексированную переменную необходимо заменить всего двумя переменными.
Для простоты следующий алгоритм (и другие алгоритмы в этой статье) используют параллельные присваивания . В языке программирования, который не имеет этой функции, параллельные присваивания необходимо моделировать с помощью вспомогательной переменной. Например, первый,
(old_r, r) := (r, old_r - quotient * r)
эквивалентно
prov := r; r := old_r - quotient × prov; old_r := prov;
и аналогично для других параллельных заданий. Это приводит к следующему коду:
function extended_gcd(a, b) (old_r, r) := (a, b) (old_s, s) := (1, 0) (old_t, t) := (0, 1) while r ≠ 0 do quotient := old_r div r (old_r, r) := (r, old_r − quotient × r) (old_s, s) := (s, old_s − quotient × s) (old_t, t) := (t, old_t − quotient × t) output "Bézout coefficients:", (old_s, old_t) output "greatest common divisor:", old_r output "quotients by the gcd:", (t, s)
Частные a и b по их наибольшему общему делителю, который выводится, могут иметь неверный знак. Это легко исправить в конце вычислений, но здесь это не сделано для упрощения кода. Аналогично, если один из a или b равен нулю, а другой отрицательный, то наибольший общий делитель, являющийся выходным значением, отрицателен, и все знаки выходного результата должны быть изменены.
Наконец, обратите внимание, что в личности Безу , можно решить для данный . Таким образом, оптимизация приведенного выше алгоритма заключается в вычислении только последовательность (которая дает коэффициент Безу ), а затем вычислить в конце:
function extended_gcd(a, b) s := 0; old_s := 1 r := b; old_r := a while r ≠ 0 do quotient := old_r div r (old_r, r) := (r, old_r − quotient × r) (old_s, s) := (s, old_s − quotient × s) if b ≠ 0 then bezout_t := (old_r − old_s × a) div b else bezout_t := 0 output "Bézout coefficients:", (old_s, bezout_t) output "greatest common divisor:", old_r
Однако во многих случаях это на самом деле не оптимизация: в то время как первый алгоритм не подвержен переполнению при использовании с машинными целыми числами (то есть целыми числами с фиксированной верхней границей цифр), умножение old_s * a при вычислении bezout_t может переполняться, ограничивая эту оптимизацию входными данными, которые могут быть представлены в размере менее половины максимального размера. При использовании целых чисел неограниченного размера время, необходимое для умножения и деления, растет квадратично с размером целых чисел. Это означает, что «оптимизация» заменяет последовательность умножений/делений небольших целых чисел одним умножением/делением, что требует больше вычислительного времени, чем операции, которые она заменяет, вместе взятые.
Упрощение дробей [ править ]
Дробь a / b находится в канонической упрощенной форме, если a и b , взаимно просты а b положителен. Эту каноническую упрощенную форму можно получить, заменив три выходные строки предыдущего псевдокода на
if s = 0 then output "Division by zero" if s < 0 then s := −s; t := −t (for avoiding negative denominators) if s = 1 then output -t (for avoiding denominators equal to 1) output -t/s
Доказательство этого алгоритма основано на том факте, что s и t — два взаимно простых целых числа, такие что as + bt = 0 и, следовательно, . Чтобы получить каноническую упрощенную форму, достаточно сдвинуть знак минус, чтобы знаменатель был положительным.
Если b делит a имеем s = 1 поровну, алгоритм выполняет только одну итерацию, и в конце алгоритма . Это единственный случай, когда результат представляет собой целое число.
мультипликативных обратных в модульных Вычисление структурах
Расширенный алгоритм Евклида является важным инструментом для вычисления мультипликативных обратных чисел в модульных структурах, обычно в модулярных целых числах и расширениях алгебраических полей . Ярким примером последнего случая являются конечные поля непростого порядка.
Модульные целые числа [ править ]
Если n — целое положительное число, кольцо Z / n Z можно отождествить с множеством {0, 1, ..., n -1} остатков евклидова деления на n , сложение и умножение, состоящее в взятии остаток на n от результата сложения и умножения целых чисел. Элемент a из Z / n Z имеет мультипликативный обратный (то есть является единицей ) , если он взаимно прост с n . В частности, если n простое число , a имеет мультипликативную обратную величину, если оно не равно нулю (по модулю n ). Таким образом, Z / n Z является полем тогда и только тогда, когда n простое.
Тождество Безу утверждает, что a и n взаимно просты тогда и только тогда, когда существуют целые числа s и t такие, что
Уменьшение этого тождества по модулю n дает
Таким образом , t деления t на n , является мультипликативным обратным модулем n или, точнее, остаток от .
Чтобы адаптировать расширенный алгоритм Евклида к этой проблеме, следует отметить, что коэффициент Безу при n не требуется и, следовательно, его не нужно вычислять. Кроме того, для получения положительного результата, меньшего n , можно использовать тот факт, что целое число t , предоставленное алгоритмом, удовлетворяет | т | < н . То есть, если t < 0 нужно добавить n , к нему в конце . В результате получается псевдокод, в котором входное значение n представляет собой целое число больше 1.
function inverse(a, n) t := 0; newt := 1 r := n; newr := a while newr ≠ 0 do quotient := r div newr (t, newt) := (newt, t − quotient × newt) (r, newr) := (newr, r − quotient × newr) if r > 1 then return "a is not invertible" if t < 0 then t := t + n return t
Простые расширения алгебраических полей [ править ]
Расширенный алгоритм Евклида также является основным инструментом для вычисления мультипликативных обратных значений в простых расширениях алгебраических полей . Важным случаем, широко используемым в криптографии и теории кодирования , является случай конечных полей непростого порядка. Действительно, если p — простое число и q = p д , поле порядка q является простым алгебраическим расширением простого поля из p элементов, порожденным корнем неприводимого многочлена степени d .
Простое алгебраическое расширение L поля K , порожденное корнем неприводимого многочлена p степени d, можно отождествить с факторкольцом , а его элементы находятся в взаимно однозначном соответствии с полиномами степени меньше d . Сложение в L — это сложение полиномов. Умножение в L — это остаток евклидова деления на p произведения многочленов. Таким образом, для завершения арифметики в L осталось только определить, как вычислять мультипликативные обратные. Это делается с помощью расширенного алгоритма Евклида.
Алгоритм очень похож на приведенный выше для вычисления модульного мультипликативного обратного. Есть два основных отличия: во-первых, предпоследняя строка не нужна, поскольку предоставляемый коэффициент Безу всегда имеет степень меньше d . Во-вторых, наибольший общий делитель, который предоставляется, когда входные полиномы взаимно просты, может быть любым ненулевым элементом K ; таким образом, этот коэффициент Безу (многочлен обычно положительной степени) должен быть умножен на обратный этому элементу K . В следующем псевдокоде p — полином степени больше единицы, а a — полином.
function inverse(a, p) t := 0; newt := 1 r := p; newr := a while newr ≠ 0 do quotient := r div newr (r, newr) := (newr, r − quotient × newr) (t, newt) := (newt, t − quotient × newt) if degree(r) > 0 then return "Either p is not irreducible or a is a multiple of p" return (1/r) × t
Пример [ править ]
Например, если полином, используемый для определения конечного поля GF(2 8 ) есть p = x 8 + х 4 + х 3 + x + 1 и a = x 6 + х 4 + x + 1 — это элемент, обратный которому требуется, затем выполнение алгоритма приводит к вычислениям, описанным в следующей таблице. Напомним, что в полях порядка 2 н , имеем − z = z и z + z = 0 для каждого элемента z в поле). Поскольку 1 — единственный ненулевой элемент GF(2), корректировка в последней строке псевдокода не требуется.
шаг | частное | р, сейчас | с, новости | т, Ньют |
---|---|---|---|---|
р = х 8 + х 4 + х 3 + х + 1 | 1 | 0 | ||
а = х 6 + х 4 + х + 1 | 0 | 1 | ||
1 | х 2 + 1 | х 2 = р - а ( х 2 + 1) | 1 | х 2 + 1 = 0 − 1 · ( х 2 + 1) |
2 | х 4 + х 2 | х + 1 = а - х 2 ( х 4 + х 2 ) | х 4 + х 2 = 0 − 1( х 4 + х 2 ) | х 6 + х 2 + 1 = 1 − ( х 4 + х 2 ) ( х 2 + 1) |
3 | х + 1 | 1 = х 2 - ( х + 1) ( х + 1) | х 5 + х 4 + х 3 + х 2 +1 = 1 − ( х +1)( х 4 + х 2 ) | х 7 + х 6 + х 3 + х = ( х 2 + 1) − ( х + 1) ( х 6 + х 2 + 1) |
4 | х + 1 | 0 = ( х + 1) - 1 × ( х + 1) | х 6 + х 4 + х + 1 = ( х 4 + х 2 ) − ( х +1)( х 5 + х 4 + х 3 + х 2 +1) |
Таким образом, обратным является x 7 + х 6 + х 3 + x , что можно подтвердить, умножив два элемента вместе и приняв остаток на p результата.
Случай более двух чисел [ править ]
Случай с более чем двумя числами можно обрабатывать итеративно. Сначала мы покажем, что . Чтобы доказать это, позвольте . По определению НОД является делителем и . Таким образом для некоторых . Сходным образом является делителем так для некоторых . Позволять . По нашей конструкции , но поскольку это наибольший делитель является единицей . И поскольку результат доказан.
Итак, если тогда есть и такой, что поэтому окончательное уравнение будет
Итак, чтобы применить к n числам, мы используем индукцию
с уравнениями, следующими непосредственно.
См. также [ править ]
Ссылки [ править ]
- Кнут, Дональд . Искусство компьютерного программирования . Аддисон-Уэсли. Том 2, Глава 4.
- Томас Х. Кормен , Чарльз Э. Лейзерсон , Рональд Л. Ривест и Клиффорд Стейн . Введение в алгоритмы , второе издание. MIT Press и McGraw-Hill, 2001. ISBN 0-262-03293-7 . Страницы 859–861 раздела 31.2: Наибольший общий делитель.
Внешние ссылки [ править ]
