Расширенный алгоритм Евклида — модификация алгоритма Евклида, вычисляющая, кроме наибольшего общего делителя (НОД) целых чисел a {\displaystyle a} и b {\displaystyle b} , ещё и коэффициенты соотношения Безу, то есть такие целые x {\displaystyle x} и y {\displaystyle y} , что a x + b y = НОД ( a , b ) . {\displaystyle ax+by={\text{НОД}}{\left(a,b\right)}.}
Алгоритм является удостоверяющим[англ.], то есть помимо решения задачи приводит также доказательство корректности этого решения.[1] Это связано с тем, что НОД является единственным числом, которое одновременно удовлетворяет уравнению и делит входные числа. Алгоритм позволяет также почти без дополнительных затрат вычислять частные от деления a {\displaystyle a} и b {\displaystyle b} на их наибольший общий делитель.
Под расширенным алгоритмом Евклида также понимается очень похожий алгоритм[англ.] для вычисления наибольшего общего делителя многочленов и вычисления коэффициентов соотношения Безу двух многочленов от одной переменной.
Когда a {\displaystyle a} и b {\displaystyle b} взаимно просты, получаемый расширенным алгоритмом Евклида x {\displaystyle x} является модульным обратным числа a {\displaystyle a} по модулю b {\displaystyle b} , а y {\displaystyle y} является модульным обратным числа b {\displaystyle b} по модулю a {\displaystyle a} . Аналогично, расширенный алгоритм Евклида для многочленов позволяет вычислить обратное число в алгебраических расширениях и, в частности, в конечных полях непростого порядка. Поэтому оба расширенных алгоритма Евклида широко используются в криптографии. В частности, вычисление обратного элемента по модулю является существенным шагом в получении пары ключей в методе RSA шифрования с открытым ключом.
Стандартный алгоритм Евклида выполняется путём последовательных делений с остатком, при этом частное не используется, и сохраняется только остаток. В расширенном алгоритме используются и частные от деления. Точнее, стандартный алгоритм Евклида для чисел a {\displaystyle a} и b {\displaystyle b} в качестве исходных данных состоит из вычисления последовательности q 1 , … , q k {\displaystyle q_{1},\ldots ,q_{k}} частных и последовательности r 0 , … , r k + 1 {\displaystyle r_{0},\ldots ,r_{k+1}} остатков, таких что:
Одним из свойств деления с остатком является то, что неравенство справа определяет единственность q i {\displaystyle q_{i}} и r i + 1 {\displaystyle r_{i+1}} для r i − 1 {\displaystyle r_{i-1}} и r i {\displaystyle r_{i}} .
Вычисление останавливается, когда достигaет нулевого остатка r k + 1 {\displaystyle r_{k+1}} . Наибольший общий делитель тогда равен последнему ненулевому остатку r k {\displaystyle r_{k}} .
Расширенный алгоритм Евклида вычисляет последовательности q 1 , … , q k {\displaystyle q_{1},\ldots ,q_{k}} и r 0 , … , r k + 1 {\displaystyle r_{0},\ldots ,r_{k+1}} аналогично, но добавляет ещё две последовательности s 1 , … , s k + 1 {\displaystyle s_{1},\ldots ,s_{k+1}} и t 0 , … , t k + 1 {\displaystyle t_{0},\ldots ,t_{k+1}} , вычисляемые следующим образом:
Вычисление останавливается, когда r k + 1 = 0 {\displaystyle r_{k+1}=0} . В итоге получаются искомые величины:
оге получаются искомые величины:
Более того, если оба числа a {\displaystyle a} и b {\displaystyle b} положительны и НОД ( a , b ) ≠ min ( a , b ) {\displaystyle {\text{НОД}}{\left(a,b\right)}\neq \min {\left(a,b\right)}} , то
для 0 ⩽ i ⩽ k {\displaystyle 0\leqslant i\leqslant k} , где ⌊ x ⌋ {\displaystyle \lfloor x\rfloor } означает целую часть числа x {\displaystyle x} , то есть, наибольшее целое, не превосходящее x {\displaystyle x} .
Отсюда вытекает, что пара коэффициентов Безу, которую даёт расширенный алгоритм Евклида, является минимальной парой коэффициентов Безу, поскольку она является единственной парой, удовлетворяющей обоим неравенствам выше.
Также из этого следует, что алгоритм может быть выполнен без риска целочисленного переполнения программой, использующей целые числа фиксированного размера, который превосходит размер обоих чисел a {\displaystyle a} и b {\displaystyle b} .
Следующая таблица показывает, как расширенный алгоритм Евклида работает с входными числами 240 и 46. Наибольший общий делитель — последний ненулевой элемент, 2 в столбце «остаток». Вычисление завершается на строке 6, поскольку остаток в ней равен 0. Коэффициенты Безу появляются в двух последних ячейках предпоследней строки. Легко проверить, что −9 × 240 + 47 × 46 = 2. Наконец, два последних значения 23 и −120 последней строки, с точностью до знака, являются частными от деления входных значений 46 и 240 на наибольший общий делитель 2.
Поскольку 0 ⩽ r i + 1 < | r i | , {\displaystyle 0\leqslant r_{i+1}<|r_{i}|,} последовательность r i {\displaystyle r_{i}} является строго убывающей последовательностью неотрицательных целых (начиная с i = 2). Тогда алгоритм должен остановиться на некотором r k + 1 = 0. {\displaystyle r_{k+1}=0.} Это доказывает, что алгоритм когда-нибудь завершится.
Поскольку r i + 1 = r i − 1 − r i q i , {\displaystyle r_{i+1}=r_{i-1}-r_{i}q_{i},} наибольшие общие делители пар ( r i − 1 , r i ) {\displaystyle (r_{i-1},r_{i})} и ( r i , r i + 1 ) {\displaystyle (r_{i},r_{i+1})} одинаковы. По индукции можно показать, что наибольший общий делитель входных a = r 0 , b = r 1 {\displaystyle a=r_{0},b=r_{1}} будет тем же самым, что и для r k , r k + 1 = 0 {\displaystyle r_{k},r_{k+1}=0} , и таким образом доказать, что r k {\displaystyle r_{k}} является наибольшим общим делителем a и b. (До этого момента доказательство то же самое, что и для классического алгоритма Евклида.)
Поскольку a = r 0 {\displaystyle a=r_{0}} и b = r 1 {\displaystyle b=r_{1}} , при i = 0 и 1 a s i + b t i = r i {\displaystyle as_{i}+bt_{i}=r_{i}} . Далее отношение доказывается по индукции для всех i > 1 {\displaystyle i>1} :
Тогда s k {\displaystyle s_{k}} и t k {\displaystyle t_{k}} являются коэффициентами Безу.
Рекуррентные соотношения можно переписать в матричном виде:
Матрица A 1 {\displaystyle A_{1}} является единичной матрицей и её определитель равен единице. Определитель самой правой матрицы здесь равен −1. Отсюда следует, что определитель A i {\displaystyle A_{i}} равен ( − 1 ) i − 1 . {\displaystyle (-1)^{i-1}.} В частности, для i = k + 1 {\displaystyle i=k+1} определитель A k + 1 {\displaystyle A_{k+1}} равен s k t k + 1 − t k s k + 1 = ( − 1 ) k . {\displaystyle s_{k}t_{k+1}-t_{k}s_{k+1}=(-1)^{k}.} Если рассматривать это как соотношение Безу, получится, что s k + 1 {\displaystyle s_{k+1}} и t k + 1 {\displaystyle t_{k+1}} взаимно просты. Соотношение a s k + 1 + b t k + 1 = 0 {\displaystyle as_{k+1}+bt_{k+1}=0} , доказанное выше, и лемма Евклида показывают, что s k + 1 {\displaystyle s_{k+1}} делит b, то есть b = d s k + 1 {\displaystyle b=ds_{k+1}} для некоторого целого d. При делении на s k + 1 {\displaystyle s_{k+1}} соотношения a s k + 1 + b t k + 1 = 0 {\displaystyle as_{k+1}+bt_{k+1}=0} получается a = − d t k + 1 . {\displaystyle a=-dt_{k+1}.} Таким образом, s k + 1 {\displaystyle s_{k+1}} и − t k + 1 {\displaystyle -t_{k+1}} являются взаимно простыми целыми, которые являются частными от деления a и b на общий делитель, который является их наибольшим общим делителем или ему противоположным.
Последнее утверждение может быть доказано следующим образом: пусть a и b положительны и НОД ( a , b ) ≠ min ( a , b ) {\displaystyle {\text{НОД}}(a,b)\neq \min(a,b)} . Тогда a ≠ b {\displaystyle a\neq b} , и если a < b {\displaystyle a<b} , то последовательности s и t для (a,b) в расширенном алгоритме являются, с точностью до начальных нулей и единиц, последовательностями t и s для (b,a). Определения затем показывают, что случай (a,b) сводится к случаю (b,a). Таким образом, без потери общности, можно предположить, что a > b {\displaystyle a>b} .
s 2 {\displaystyle s_{2}} равно 1, а s 3 {\displaystyle s_{3}} (которое существует ввиду НОД ( a , b ) ≠ min ( a , b ) {\displaystyle {\text{НОД}}(a,b)\neq \min(a,b)} ) отрицательно. Таким образом, s i {\displaystyle s_{i}} меняет знак и строго возрастает по абсолютной величине, что следует по индукции из определения и факта, что q i ⩾ 1 {\displaystyle q_{i}\geqslant 1} для 1 ⩽ i ⩽ k {\displaystyle 1\leqslant i\leqslant k} . Случай для i = 1 {\displaystyle i=1} выполняется, поскольку a > b {\displaystyle a>b} . То же самое верно для t i {\displaystyle t_{i}} после нескольких первых членов по тем же причинам. Более того, q k ⩾ 2 {\displaystyle q_{k}\geqslant 2} (если a и b положительны и НОД ( a , b ) ≠ min ( a , b ) {\displaystyle {\text{НОД}}(a,b)\neq \min(a,b)} ). Тогда:
Это, и тот факт, что s k , t k {\displaystyle s_{k},t_{k}} не меньше по абсолютному значению любого предыдущего s i {\displaystyle s_{i}} или t i {\displaystyle t_{i}} соответственно, завершает доказательство.
Для многочленов от одной переменной с коэффициентами в поле всё работает аналогичным образом, включая деление Евклида, соотношение Безу и расширенный алгоритм Евклида. Первое отличие в том, что в делении Евклида и в алгоритме неравенство 0 ⩽ r i + 1 < | r i | {\displaystyle 0\leqslant r_{i+1}<|r_{i}|} следует заменить на неравенство степеней deg r i + 1 < deg r i . {\displaystyle \deg r_{i+1}<\deg r_{i}.} Остальное остаётся тем же самым, просто заменяем целые числа многочленами.
Второе отличие лежит в границах размера коэффициентов Безу, даваемых расширенным алгоритмом Евклида, которые более точны в случае многочленов, что приводит к следующей теореме.
Если a и b два ненулевых многочлена, расширенный алгоритм Евклида даёт единственную пару многочленов (s, t), таких что
и
Третье отличие в том, что для многочленов наибольший общий делитель определён с точностью до умножения на ненулевую константу. Есть несколько путей определить наибольший общий делитель однозначно.
В математике обычно требуют, чтобы наибольший общий делитель был приведённым многочленом. Чтобы этого достичь, достаточно разделить все элементы результата на ведущий коэффициент r k . {\displaystyle r_{k}.} Это позволяет, если a и b взаимно простые, получить 1 в правой части неравенства Безу. В противном случае получим ненулевую константу. В компьютерной алгебре многочлены обычно имеют целые коэффициенты и этот способ нормализации наибольшего общего делителя приводит к большому числу дробей.
Другим способом нормализации наибольшего общего делителя для случая целых коэффициентов является деление выходного многочлена на НОД коэффициентов многочлена r k , {\displaystyle r_{k},} , чтобы получить примитивный наибольший общий делитель. Если входные многочлены взаимно просты, нормализация даёт наибольший общий делитель, равный 1. Недостатком этого подхода является большое количество дробей, которые должны быть вычислены и упрощены.
Третий подход заключается в расширении алгоритма вычисления промежуточных последовательностей псевдоостатков[англ.] (подрезультантов) аналогично расширению алгоритма Евклида до расширенного алгоритма Евклида. Это позволяет, начав с многочлена с целыми коэффициентами, получать в процессе вычислений многочлены с целыми коэффициентами. Более того, каждый вычисленный остаток r i {\displaystyle r_{i}} остаётся подрезультантом. В частности, если многочлены взаимно просты, то соотношение Безу превращается в
где Res ( a , b ) {\displaystyle \operatorname {Res} (a,b)} означает результант для 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 "коэффициенты Безу:", (old_s, old_t) output "наибольший общий делитель:", old_r output "частные от деления на НОД:", (t, s)
Частные от деления a и b на их наибольший общий делитель, который тоже есть в выводе, могут иметь неверный знак. Это легко исправить в конце вычислений, но не сделано здесь для упрощения кода. Аналогично, если a или b равно нулю, а второе число отрицательно, наибольший общий делитель в выводе отрицателен, так что все знаки в выводе нужно изменить.
Наконец заметим, что соотношение Безу a x + b y = НОД ( a , b ) {\displaystyle ax+by={\text{НОД}}(a,b)} мoжно решить относительно y {\displaystyle y} при заданных a , b , x , НОД ( a , b ) {\displaystyle a,b,x,{\text{НОД}}(a,b)} . Тогда оптимизацией для алгоритма выше будет вычислять только последовательность s k {\displaystyle s_{k}} (которая приводит к коэффициенту Безу x {\displaystyle x} ), а значение y {\displaystyle y} вычислить в конце алгоритма:
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 "коэффициенты Безу:", (old_s, bezout_t) output "наибольший общий делитель:", old_r
Однако, во многих случаях это не будет реальной оптимизацией — прежний алгоритм нечувствителен к переполнению при использовании целых чисел в машине (то есть целых чисел с фиксированной верхней границей представления), умножение old_s * a при вычислении bezout_t может вызвать переполнение, что ограничивает оптимизацию только на входные данные, которые не превосходят половины максимального размера целых чисел. Если используются целые числа неограниченного размера, время, необходимое для умножения и деления растёт квадратично от размера целых чисел. Из этого следует, что «оптимизация» заменяет последовательность умножений/делений малых чисел на одно умножение/деление, которое требует большего времени выполнения, чем операции, которые оно заменяет, взятые вместе.
Деление a/b находится в канонической упрощённой форме, если a и b взаимно просты и b положительно. Эта каноническая упрощённая форма может быть получена путём замены трёх строк вывода на псеводокод
if s = 0 then output "Деление на ноль" if s < 0 then s := −s; t := −t (во избежание нулевых делителей) if s = 1 then output -t (во избежание делителей, равных 1) output -t/s
Доказательство этого алгоритма полагается на факт, что s и t являются двумя взаимно простыми целыми, такими что a s + b t = 0 {\displaystyle as+bt=0} , а тогда a b = − t s {\displaystyle {\frac {a}{b}}=-{\frac {t}{s}}} . Для получения канонически упрощённой формы достаточно изменить знак для получения положительного делителя.
Если 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, равен обратному числу a по модулю n.
Чтобы приспособить расширенный алгоритм Евклида для этой задачи, следует заметить, что коэффициент Безу при n не нужен, а потому нет необходимости его и вычислять. Также, для получения результата в виде положительного числа, меньшего n, можно использовать факт что целое t, предоставляемое алгоритмом, удовлетворяет соотношению | t | < n {\displaystyle |t|<n} . То есть, если t < 0 {\displaystyle 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 "не обратимо" if t < 0 then t := t + n return t
Расширенный алгоритм Евклида является также главным средством для вычисления обратных элементов в алгебраических расширениях полей. Важный случай, широко используемый в криптографии и теории кодирования, это случай конечных полей непростого порядка. Фактически, если p просто и q = pd, поле порядка q является алгебраическим расширением простого поля с p элементами, образованного корнем неприводимого многочлена степени d.
Алгебраическое расширение L поля K, генерируемое корнем неприводимого многочлена p степени d можно отождествить с факторкольцом K [ X ] / ⟨ p ⟩ , {\displaystyle K[X]/\langle p\rangle ,} , а его элементы находятся в биективном соотношении с многочленами степени, меньшей 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
Например, пусть многочлен p = x 8 + x 4 + x 3 + x + 1 {\displaystyle p=x^{8}+x^{4}+x^{3}+x+1} определяет конечное поле G F ( 2 8 ) {\displaystyle GF(2^{8})} , а a = x 6 + x 4 + x + 1 {\displaystyle a=x^{6}+x^{4}+x+1} является элементом, обратный которому нужно найти. Тогда работа алгоритма приведена ниже в таблице. Напомни, что в поле порядка 2 n {\displaystyle 2^{n}} , имеем -z = z и z + z = 0 для любого или элемента z поля). Поскольку 1 является единственным ненулевым элементом GF(2), подгонка последней строки псевдокода не нужна.
Таким образом, обратный элемент равен x 7 + x 6 + x 3 + x {\displaystyle x^{7}+x^{6}+x^{3}+x} , что подтверждается умножением двух элементов[англ.] и взятия остатка по p от результата.
Можно обрабатывать случай более двух чисел итеративно. Сначала покажем, что НОД ( a , b , c ) = НОД ( НОД ( a , b ) , c ) {\displaystyle {\text{НОД}}(a,b,c)={\text{НОД}}({\text{НОД}}(a,b),c)} . Для доказательства положим d = НОД ( a , b , c ) {\displaystyle d={\text{НОД}}(a,b,c)} . По определению НОД d {\displaystyle d} является делителем a {\displaystyle a} и b {\displaystyle b} . Тогда НОД ( a , b ) = k d {\displaystyle {\text{НОД}}(a,b)=kd} для некоторого k {\displaystyle k} . Аналогично d {\displaystyle d} является делителем c {\displaystyle c} , так что c = j d {\displaystyle c=jd} для некоторого j {\displaystyle j} . Положим u = НОД ( k , j ) {\displaystyle u={\text{НОД}}(k,j)} . По построению u {\displaystyle u} , u d | a , b , c {\displaystyle ud|a,b,c} , но поскольку d {\displaystyle d} является наибольшим делителем, u {\displaystyle u} является обратимым элементом. А поскольку u d = НОД ( НОД ( a , b ) , c ) {\displaystyle ud={\text{НОД}}({\text{НОД}}(a,b),c)} , результат доказан.
Таким образом, если n a + m b = НОД ( a , b ) {\displaystyle na+mb={\text{НОД}}(a,b)} , то есть x {\displaystyle x} и y {\displaystyle y} , такие что x НОД ( a , b ) + y c = НОД ( a , b , c ) {\displaystyle x{\text{НОД}}(a,b)+yc={\text{НОД}}(a,b,c)} , так что конечным уравнением будет
Для перехода к n числам используем индукцию