Русская Википедия:Расширенный алгоритм Евклида

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Расширенный алгоритм Евклида — это расширение алгоритма Евклида, которое вычисляет, кроме наибольшего общего делителя (НОД) целых чисел <math>a</math> и <math>b</math>, ещё и коэффициенты соотношения Безу, то есть целые <math>x</math> и <math>y</math>, такие что

<math>ax + by = \text{НОД}{\left(a, b\right)}.</math>

Алгоритм является Шаблон:Нп5, поскольку НОД является единственным числом, которое одновременно удовлетворяет уравнению и делит входные числа. Алгоритм позволяет также почти без дополнительных затрат вычислять частные от деления <math>a</math> и <math>b</math> на их наибольший общий делитель.

Под Шаблон:Em также понимается Шаблон:Нп5 для вычисления наибольшего общего делителя многочленов и вычисления коэффициентов соотношения Безу двух многочленов от одной переменной.

Расширенный алгоритм Евклида особенно полезен, когда <math>a</math> и <math>b</math> взаимно просты. При таких условиях <math>x</math> является модульным обратным числа <math>a</math> по модулю <math>b</math>, а <math>y</math> является модульным обратным числа <math>b</math> по модулю <math>a</math>. Аналогично, расширенный алгоритм Евклида для многочленов позволяет вычислить обратное число в алгебраических расширениях и, в частности, в конечных полях непростого порядка. Поэтому оба расширенных алгоритма Евклида широко используются в криптографии. В частности, вычисление обратного элемента по модулю является существенным шагом в получении пары ключей в методе RSA шифрования с открытым ключом.

Описание

Стандартный алгоритм Евклида выполняется путём последовательных делений с остатком, при этом частное не используется, только остаток сохраняется. В расширенном алгоритме используются и частные от деления. Точнее, стандартный алгоритм Евклида для чисел <math>a</math> и <math>b</math> в качестве исходных данных состоит из вычисления последовательности <math>q_1,\ldots, q_k</math> частных и последовательности <math>r_0,\ldots, r_{k+1}</math> остатков, таких что

<math>

\begin{align} r_0 & =a \\ r_1 & =b \\ & \,\,\,\vdots \\ r_{i+1} & =r_{i-1}-q_i r_i \quad \text {и} \quad 0\leqslant r_{i+1} < |r_i| \quad\text{(это определяет }q_i)\\ & \,\,\, \vdots \end{align} </math> Главным свойством деления с остатком является то, что неравенство справа определяет единственность <math>q_i</math> и <math>r_{i+1}</math> для <math>r_{i-1}</math> и <math>r_{i}</math>.

Вычисление останавливается, когда достигнем нулевого остатка <math>r_{k+1}</math>. Наибольший общий делитель тогда равен последнему ненулевому остатку <math>r_{k}</math>.

Расширенный алгоритм Евклида работает аналогично, но добавляет две другие последовательности

<math>

\begin{align} r_0 & =a & r_1 & =b \\ s_0 & =1 & s_1 & =0 \\ t_0 & =0 & t_1 & =1 \\ & \,\,\,\vdots & & \,\,\,\vdots \\ r_{i+1} & =r_{i-1}-q_i r_i & \text {и } 0 & \leqslant r_{i+1} < |r_i| & \text{(это определяет } q_i \text{)}\\ s_{i+1} & =s_{i-1}-q_i s_i \\ t_{i+1} & =t_{i-1}-q_i t_i \\ & \,\,\, \vdots \end{align}

.</math>

Вычисление также останавливается, когда <math>r_{k+1}=0</math>, и в результате получаем

  • <math>r_k</math> равен наибольшему общему делителю входных значений <math>a=r_0</math> и <math>b=r_1</math>.
  • Коэффициенты Безу равны <math>s_k</math> и <math>t_k,</math>, то есть <math>\text{НОД}{\left(a, b\right)}=r_k=as_k+bt_k</math>.
  • Частные от деления <math>a</math> и <math>b</math> на их наибольший общий делитель задаются величинами <math>s_{k+1}=\pm\dfrac{b}{\text{НОД}{\left(a, b\right)}}</math> и <math>t_{k+1}=\pm\dfrac{a}{\text{НОД}{\left(a, b\right)}}</math>.

Более того, если оба числа <math>a</math> и <math>b</math> положительны и <math>\text{НОД}{\left(a, b\right)}\neq\min{\left(a,b\right)}</math>, то

<math>|s_i| \leqslant \left\lfloor\dfrac{b}{2\text{НОД}{\left(a,b\right)}}\right\rfloor\quad \text{и} \quad |t_i| \leqslant \left\lfloor\dfrac{a}{2\text{НОД}{\left(a,b\right)}}\right\rfloor</math>

для <math>0\leqslant i \leqslant k</math>, где <math>\lfloor x\rfloor</math> означает целую часть числа <math>x</math>, то есть, наибольшее целое, не превосходящее <math>x</math>.

Отсюда вытекает, что пара коэффициентов Безу, которую даёт расширенный алгоритм Евклида, является минимальной парой коэффициентов Безу, поскольку она является единственной парой, удовлетворяющей обоим неравенствам выше.

Также из этого следует, что алгоритм может быть выполнен без риска целочисленного переполнения программой, использующей целые числа фиксированного размера, который превосходит размер обоих чисел <math>a</math> и <math>b</math>.

Пример

Следующая таблица показывает, как расширенный алгоритм Евклида работает с входными числами Шаблон:Nowrap и Шаблон:Nowrap. Наибольший общий делитель — это последний ненулевой элемент, Шаблон:Nowrap в столбце «остаток». Вычисление завершается на строке 6, поскольку остаток в ней равен Шаблон:Nowrap. Коэффициенты Безу появляются в двух последних ячейках предпоследней строки. Легко проверить, что Шаблон:Nowrap. Наконец, два последних значения Шаблон:Nowrap и Шаблон:Nowrap последней строки, с точностью до знака, являются частными от деления входных значений Шаблон:Nowrap и Шаблон:Nowrap на наибольший общий делитель Шаблон:Nowrap.

индекс i частное qi−1 остаток ri si ti
0 240 1 0
1 46 0 1
2 240 ÷ 46 = 5 2405 × 46 = 10 15 × 0 = 1 0 − 5 × 1 = −5
3 46 ÷ 10 = 4 464 × 10 = 6 04 × 1 = −4 1 − 4 × −5 = 21
4 10 ÷ 6 = 1 101 × 6 = 4 11 × −4 = 5 −5 − 1 × 21 = −26
5 6 ÷ 4 = 1 61 × 4 = 2 −41 × 5 = −9 21 − 1 × −26 = 47
6 4 ÷ 2 = 2 42 × 2 = 0 52 × −9 = 23 −26 − 2 × 47 = −120

Доказательство

Поскольку <math> 0\leqslant r_{i+1}<|r_i|, </math> последовательность <math> r_i </math> является убывающей последовательностью неотрицательных целых (начиная с i = 2). Тогда алгоритм должен остановиться на некотором <math> r_{k+1}=0.</math> Это доказывает, что алгоритм когда-нибудь завершится.

Поскольку <math> r_{i+1}= r_{i-1} - r_i q_i,</math> наибольший общий делитель будет тем же самым для <math>(r_{i-1}, r_i)</math> и <math>(r_{i}, r_{i+1}).</math> Это показывает, что наибольший общий делитель входных <math>a=r_0, b=r_1 </math> будет тем же самым, что и для <math> r_k, r_{k+1}=0.</math> Это доказывает, что <math> r_k </math> является наибольшим общим делителем a и b. (До этого момента доказательство то же самое, что и для классического алгоритма Евклида.)

Поскольку <math> a=r_0</math> и <math> b=r_1,</math>, мы имеем <math>as_i+bt_i=r_i</math> для i = 0 и 1. Отношение доказывается по индукции для всех <math>i>1</math>:

<math>r_{i+1} = r_{i-1} - r_i q_i = (as_{i-1}+bt_{i-1}) - (as_i+bt_i)q_i = (as_{i-1}-as_iq_i) + (bt_{i-1}-bt_iq_i) = as_{i+1}+bt_{i+1}.</math>

Тогда <math>s_k</math> и <math>t_k</math> являются коэффициентами Безу.

Рассмотрим матрицу

<math>A_i=\begin{pmatrix} s_{i-1} & s_i\\ t_{i-1} & t_i \end{pmatrix}.</math>

Рекуррентные соотношения можно переписать в матричном виде

<math>A_{i+1} = A_i \cdot \begin{pmatrix} 0 & 1\\ 1 & -q_i \end{pmatrix}.</math>

Матрица <math>A_1</math> является единичной матрицей и её определитель равен единице. Определитель самой правой матрицы здесь равен −1. Отсюда следует, что определитель <math>A_i</math> равен <math>(-1)^{i-1}.</math> В частности, для <math>i=k+1</math> мы имеем <math>s_k t_{k+1}-t_k s_{k+1} = (-1)^k.</math> Если рассматривать это как соотношение Безу, получаем, что <math>s_{k+1}</math> и <math>t_{k+1}</math> взаимно просты. Соотношение <math>as_{k+1}+bt_{k+1}=0</math>, доказанное выше, и лемма Евклида показывают, что <math>s_{k+1}</math> делит Шаблон:Mvar, то есть <math>b=ds_{k+1}</math> для некоторого целого Шаблон:Mvar. Разделив на <math>s_{k+1}</math> соотношение <math>as_{k+1}+bt_{k+1}=0</math>, получим, что <math>a=-dt_{k+1}.</math> Таким образом, <math>s_{k+1}</math> и <math>-t_{k+1}</math> являются взаимно простыми целыми, которые являются частными от деления Шаблон:Mvar и Шаблон:Mvar на общий делитель, который является их наибольшим общим делителем или ему противоположным.

Чтобы доказать последнее утверждение, предположим, что a и b положительны и <math>\text{НОД}(a,b)\neq\min(a,b)</math>. Тогда <math>a\neq b </math>, и если <math>a<b</math>, можно видеть, что последовательности s и t для (a,b) в расширенном алгоритме являются, с точностью до начальных нулей и единиц последовательностями t и s для (b,a). Определения затем показывают, что случай (a,b) сводится к случаю (b,a). Таким образом, без потери общности, можно предположить, что <math>a>b</math>.

Можно заметить, что <math>s_2</math> равно 1, а <math>s_3</math> (которое существует ввиду <math>\text{НОД}(a,b)\neq\min(a,b)</math>) отрицательно. Таким образом, <math>s_i</math> меняет знак и строго возрастает по абсолютной величине, что следует по индукции из определения и факта, что <math>q_i\geqslant 1</math> для <math>1\leqslant i \leqslant k</math>. Случай для <math>i=1</math> выполняется, поскольку <math>a>b</math>. То же самое верно для <math>t_i</math> после нескольких первых членов по тем же причинам. Более того, легко видеть, что <math>q_k \geqslant 2</math> (если a и b положительны и <math>\text{НОД}(a,b)\neq\min(a,b)</math>). Тогда

<math>|s_{k+1}|=\left |\frac{b}{\text{НОД}(a,b)} \right | \geqslant 2|s_k| \qquad \text{и} \qquad |t_{k+1}|= \left |\frac{a}{\text{НОД}(a,b)} \right | \geqslant 2|t_k|.</math>

Это, в компании с фактом, что <math>s_k,t_k</math> не меньше по абсолютному значению любого предыдущего <math>s_i</math> или <math>t_i</math> соответственно, завершает доказательство.

Расширение алгоритма Евклида для многочленов

Шаблон:See also

Для многочленов от одной переменной с коэффициентами в поле всё работает аналогичным образом, включая деление Евклида, соотношение Безу и расширенный алгоритм Евклида. Первое отличие в том, что в делении Евклида и в алгоритме неравенство <math>0\leqslant r_{i+1}<|r_i|</math> следует заменить на неравенство степеней <math>\deg r_{i+1}<\deg r_i.</math> Остальное остаётся тем же самым, просто заменяем целые числа многочленами.

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

Если a и b два ненулевых многочлена, расширенный алгоритм Евклида даёт единственную пару многочленов (s, t), таких что

<math>as+bt=\text{НОД}(a,b)</math>

и

<math>\deg s < \deg b - \deg (\text{НОД}(a,b)), \quad \deg t < \deg a - \deg (\text{НОД}(a,b)).</math>

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

В математике обычно требуют, чтобы наибольший общий делитель был приведённым многочленом. Чтобы этого достичь, достаточно разделить все элементы результата на ведущий коэффициент <math>r_{k}.</math> Это позволяет, если a и b взаимно простые, получить 1 в правой части неравенства Безу. В противном случае получим ненулевую константу. В компьютерной алгебре многочлены обычно имеют целые коэффициенты и этот способ нормализации наибольшего общего делителя приводит к большому числу дробей.

Другим способом нормализации наибольшего общего делителя для случая целых коэффициентов является деление выходного многочлена на НОД коэффициентов многочлена <math>r_{k},</math>, чтобы получить примитивный наибольший общий делитель. Если входные многочлены взаимно просты, нормализация даёт наибольший общий делитель, равный 1. Недостатком этого подхода является большое количество дробей, которые должны быть вычислены и упрощены.

Третий подход заключается в расширении алгоритма вычисления Шаблон:Нп5 (подрезультантов) аналогично расширению алгоритма Евклида до расширенного алгоритма Евклида. Это позволяет, начав с многочлена с целыми коэффициентами, получать в процессе вычислений многочлены с целыми коэффициентами. Более того, каждый вычисленный остаток <math>r_i</math> остаётся подрезультантом. В частности, если многочлены взаимно просты, то соотношение Безу превращается в

<math>as+bt=\operatorname{Res}(a,b),</math>

где <math>\operatorname{Res}(a,b)</math> означает результант для a и b. В таком виде соотношения Безу нет в формуле знаменателя. Если разделить всё на результант, получим классическое соотношение Безу с явным общим знаменателем для рациональных чисел которые при этом появляются.

Псевдокод

Шаблон:Hatnote Для реализации вышеописанного алгоритма следует заметить, что только два последних значения индексированных переменных нужны на каждом шаге. Таким образом, для экономии памяти, каждая индексированная переменная должна быть заменена просто двумя переменными.

Для простоты следующий алгоритм (и другие алгоритмы в этой статье) используют параллельные присваивания. В языках программирования, не поддерживающих данную возможность параллельное присвоение необходимо осуществлять с использованием дополнительной переменной. Например, первое присвоение

(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 равно нулю, а второе число отрицательно, наибольший общий делитель в выводе отрицателен, так что все знаки в выводе нужно изменить.

Наконец заметим, что соотношение Безу <math>ax + by = \text{НОД}(a, b)</math> мoжно решить относительно <math>y</math> при заданных <math>a, b, x, \text{НОД}(a, b)</math>. Тогда оптимизацией для алгоритма выше будет вычислять только последовательность <math>s_k</math> (которая приводит к коэффициенту Безу <math>x</math>), а значение <math>y</math> вычислить в конце алгоритма:

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 может вызвать переполнение, что ограничивает оптимизацию только на входные данные, которые не превосходят половины максимального размера целых чисел. Если используются целые числа неограниченного размера, время, необходимое для умножения и деления растёт квадратично от размера целых чисел. Из этого следует, что «оптимизация» заменяет последовательность умножений/делений малых чисел на одно умножение/деление, которое требует большего времени выполнения, чем операции, которые оно заменяет, взятые вместе.

Упрощение деления

Деление Шаблон:Math находится в канонической упрощённой форме, если Шаблон:Math и Шаблон:Math взаимно просты и Шаблон:Math положительно. Эта каноническая упрощённая форма может быть получена путём замены трёх строк вывода на псеводокод

if Шаблон:Math then output "Деление на ноль"
if Шаблон:Math then Шаблон:Math;  Шаблон:Math   (во избежание нулевых делителей)
if Шаблон:Math then output Шаблон:Math        (во избежание делителей, равных  1)
output Шаблон:Math

Доказательство этого алгоритма полагается на факт, что Шаблон:Math и Шаблон:Math являются двумя взаимно простыми целыми, такими что <math>as+bt=0</math>, а тогда <math>\frac{a}{b} = -\frac{t}{s}</math>. Для получения канонически упрощённой формы достаточно изменить знак для получения положительного делителя.

Если Шаблон:Math делит Шаблон:Math нацело, алгоритм выполняет только одну итерацию, и мы имеем Шаблон:Math в конце алгоритма. Это единственный случай, когда вывод является целым числом.

Вычисление обратного в модулярных структурах

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

Целые по модулю

Шаблон:Main Если Шаблон:Math является положительным целым, кольцо Z/nZ может быть отождествлено со множеством Шаблон:Math остатков от деления с остатком на Шаблон:Math, сложение и умножение заключается во взятии остатка от деления на Шаблон:Math результатов сложения и умножения целых чисел. Элемент Шаблон:Math Шаблон:Math имеет обратный элемент (то есть элемент обратимый), если он взаимно прост с Шаблон:Math. В частности, если Шаблон:Math является простым, Шаблон:Math имеет обратное, если оно не нулевое (по модулю Шаблон:Math). То есть, Шаблон:Math будет полем тогда и только тогда, когда Шаблон:Math просто.

Соотношение Безу утверждает, что Шаблон:Math и Шаблон:Math взаимно просты тогда и только тогда, когда существуют целые Шаблон:Mathи Шаблон:Math, такие что

<math>ns+at=1</math>

Сравнение по модулю Шаблон:Math даёт

<math>at \equiv 1 \mod n.</math>

Тогда Шаблон:Math, или точнее, остаток от деления Шаблон:Math на Шаблон:Math, равен обратному числу Шаблон:Math по модулю Шаблон:Math.

Чтобы приспособить расширенный алгоритм Евклида для этой задачи, следует заметить, что коэффициент Безу при Шаблон:Math не нужен, а потому нет необходимости его и вычислять. Также, для получения результата в виде положительного числа, меньшего n, можно использовать факт что целое Шаблон:Math, предоставляемое алгоритмом, удовлетворяет соотношению <math>|t| < n</math>. То есть, если <math>t<0</math>, можно добавить Шаблон:Math в конце. Это приводит к псевдокоду, в котором входное значение 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

Алгебраические расширения полей

Расширенный алгоритм Евклида является также главным средством для вычисления обратных элементов в алгебраических расширениях полей. Важный случай, широко используемый в криптографии и теории кодирования, это случай конечных полей непростого порядка. Фактически, если Шаблон:Math просто и Шаблон:Math, поле порядка Шаблон:Math является алгебраическим расширением простого поля с Шаблон:Math элементами, образованного корнем неприводимого многочлена степени Шаблон:Math.

Алгебраическое расширение Шаблон:Math поля Шаблон:Math, генерируемое корнем неприводимого многочлена Шаблон:Math степени Шаблон:Math можно отождествить с факторкольцом <math>K[X]/\langle p\rangle,</math>, а его элементы находятся в биективном соотношении с многочленами степени, меньшей Шаблон:Math.Сложениев Шаблон:Math есть сложение многочленов. Умножение в Шаблон:Math есть остаток от Шаблон:Нп5на Шаблон:Math произведения многочленов. Таким образом, для завершения арифметики в Шаблон:Math остаётся только определить, каким образом вычислять обратные элементы. Делается это с расширенным алгоритмом Евклида.

Алгоритм очень похож на приведённый выше для вычисления модульного обратного. Есть два главных отличия — во-первых, предпоследняя строка не нужна, поскольку получаемые коэффициенты Безу имеют всегда степень меньшую, чем Шаблон:Math. Во-вторых, Наибольший общий делитель, который получается, если входные данные являются взаимно простыми многочленами, может быть любым ненулевым элементом Шаблон:Math. Этот коэффициент Безу (многочлен обычно имеет положительную степень), следует умножить на обратный этому элементу в Шаблон:Math. В псевдокоде (ниже) Шаблон:Math является многочленом степени, большим единицы, а Шаблон:Math является многочленом.

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

Пример

Например, пусть многочлен <math>p=x^8+x^4+x^3+x+1</math> определяет конечное поле <math>GF(2^8)</math> , а <math>a=x^6+x^4+x+1</math> является элементом, обратный которому нужно найти. Тогда работа алгоритма приведена ниже в таблице. Напомни, что в поле порядка <math>2^n</math>, имеем -z = z и z + z = 0 для любого или элемента z поля). Поскольку 1 является единственным ненулевым элементом GF(2), подгонка последней строки псевдокода не нужна.

шаг  частное  r, newr s, news t, newt
  <math>p=x^8+x^4+x^3+x+1</math> 1  0
  <math>a=x^6+x^4+x+1</math> 0  1
1 <math>x^2+1</math> <math>x^2=p-a(x^2+1)</math> 1 <math>x^2+1=0-1\times(x^2+1)</math>
2 <math>x^4+x^2</math> <math>x+1=a-x^2(x^4+x^2)</math> <math>x^4+x^2=0-1(x^4+x^2)</math> <math>x^6+x^2+1=1-(x^4+x^2)(x^2+1)</math>
3  x + 1 <math>1=x^2-(x+1)(x+1)</math> <math>x^5+x^4+x^3+x^2+1=1-(x +1)(x^4+x^2)</math> <math>x^7+x^6+x^3+x=(x^2+1)-(x+1) (x^6+x^2+1)</math>
4  x + 1 <math>0=(x+1)-1\times(x+1)</math> <math>x^6+x^4+x+1=(x^4+x^2)-(x+1)(x^5+x^4+x^3+x^2+1)</math>  

Таким образом, обратный элемент равен <math>x^7+x^6+x^3+x</math>, что подтверждается Шаблон:Нп5 и взятия остатка по Шаблон:Math от результата.

Случай более двух чисел

Можно обрабатывать случай более двух чисел итеративно. Сначала покажем, что <math>\text{НОД}(a,b,c) = \text{НОД}(\text{НОД}(a,b),c)</math>. Для доказательства положим <math>d=\text{НОД}(a,b,c)</math>. По определению НОД <math>d</math> является делителем <math>a</math> и <math>b</math>. Тогда <math>\text{НОД}(a,b)=k d</math> для некоторого <math>k</math>. Аналогично <math>d</math> является делителем <math>c</math>, так что <math>c=jd</math> для некоторого <math>j</math>. Положим <math>u=\text{НОД}(k,j)</math>. По построению <math>u</math>, <math>ud | a,b,c</math>, но поскольку <math>d</math> является наибольшим делителем, <math>u</math> является обратимым элементом. А поскольку <math>ud=\text{НОД}(\text{НОД}(a,b),c)</math>, результат доказан.

Таким образом, если <math>na + mb = \text{НОД}(a,b)</math>, то есть <math>x</math> и <math>y</math>, такие что <math>x\text{НОД}(a,b) + yc = \text{НОД}(a,b,c)</math>, так что конечным уравнением будет

<math>x(na + mb) + yc = (xn)a + (xm)b + yc = \text{НОД}(a,b,c).\,</math>

Для перехода к n числам используем индукцию

<math>\text{НОД}(a_1,a_2,\dots,a_n) =\text{НОД}(a_1,\, \text{НОД}(a_2,\, \text{НОД}(a_3,\dots, \text{НОД}(a_{n-1}\,,a_n))),\dots),</math>

См. также

Примечания

Шаблон:Примечания

Литература

Шаблон:Refbegin

Шаблон:Refend

Ссылки

Шаблон:Wikibooks

Шаблон:Теоретико-числовые алгоритмы Шаблон:Rq