logo search
Th_Numb+Combi (2)

§ 4. Алгоритм Евклида

Алгоритм Евклида применяется во многих задачах арифметики. Изучим вначале его применение для отыскания наибольшего общего делителя ненулевых целых чисел a, b. Рассмотрим теперь следующую процедуру деления целых чисел с остатком, которую и называют алгоритмом Евклида:

Шаг 0: a = bq0 + r0 (0 < r0 < b)

Шаг 1: b = r0q1 + r1 (0 < r1 < r0)

Шаг 2: r0 = r1q2 + r2 (0 < r2 < r1)

Шаг i: ri–2 = ri–1qi + ri (0 < ri < ri–1)

Шаг s: rs–2 = rs–1qs + rs (0 < rs < rs–1)

Шаг s +1: rs–1 = rsqs+1 + 0 ( rs+1 = 0 )

Алгоритм Евклида

Если b | a, то r0 = 0 и алгоритм завершается на шаге 0, т.к. (a, b) = b. В противном случае имеем: (a, b) = (bq0 + r0 , b) = (r0 , b). Поэтому на шаге 1 делим с остатком b на r0 . Если r1 = 0, то (a, b) = (r0 , b) = r0 и алгоритм завершается. Если же r1 > 0, то (a, b) = (r0 , b) = (r0 , r0q1 + r1) = (r0 , r1). Поэтому на шаге 3 делим с остатком r0 на r1 , и.т.д. В результате получается убывающая последовательность остатков:

|b| > r0 > r1 > … > ri > … > > rs > … > 0 ,

которая не может убывать бесконечно. Значит, не более чем через |b| – 1 шаг – при некотором s – получится нулевой остаток, и

(a, b) = (b, r0) = (r0 , r1) = … = (ri , ri+1) = … = (rs–2 , rs–1) = (rs–1 , rs) = rs .

Значит, при r0 0 последний делитель в алгоритме Евклида (или последний ненулевой остаток, если число шагов больше нуля) равен НОД(a, b). Таким образом, доказана следующая

Теорема (о нахождении НОД(a, b) с помощью алгоритма Евклида). Для любых ненулевых целых чисел a, b их наибольший общий делитель НОД(a, b) может быть найден с помощью алгоритма Евклида не более чем за min(|a|, |b|) – 1 шагов и равен последнему делителю в этом алгоритме (или последнему ненулевому остатку, если число шагов больше нуля).

Следствие 1 (о линейном разложении НОД(a, b)). Наибольший общий делитель НОД(a, b) любых ненулевых целых чисел a, b можно представить в виде линейной комбинации чисел a и b c целыми коэффициентами x и y: НОД(a, b) = ax + by. Такое представление называется линейным разложением наибольшего общего делителя чисел a и b.

Доказательство. Будем “ползти” сверху вниз по алгоритму Евклида. Если (a, b) = |b|, то алгоритм Евклида завершается на шаге 0, и существование линейного разложения очевидно: (a, b) = a0 + b(±1). Если же число шагов в алгоритме Евклида больше 0, будем последовательно представлять остатки ri в виде ri = axi + byi (0 i s). В результате x = xs , y = ys .

Ясно, что r0 = a1 + b(–q0), так что можно положить x0 = 1, y0 = –q0 . Далее, r1 = b1+r0(–q1) = b1+(a1+b(–q0))(–q1) = a(–q1)+b(1+q0q1), т.е. x1 = –q1 , y1 = 1+q0q1 . Предположим, что коэффициенты xk , yk построены для k = 0, 1, … , i–1 < s. Тогда шаг i алгоритма Евклида даёт равенство

ri = ri–2 + ri–1(–qi) = (axi–2 + byi–2)+(axi–1 + byi–1)(–qi) =

= a(xi–2 – xi–1qi)+b(yi–2 – yi–1qi),

и можно положить xi = xi–2xi–1qi , yi = yi–2yi–1qi . Таким образом, доказано не только существование представлений ri = axi + byi (0 i s), но и указан явный способ вычисления чисел xk , yk по следующим рекуррентным формулам :

(2 k s).

Следствие 1 доказано.

Следствие 2 (о линейном разложении НОД(a1 , … , аn)). Наибольший общий делитель НОД(a1 , … , an) любых ненулевых целых чисел a1 , … , an можно представить в виде линейной комбинации этих чисел c целыми коэффициентами: НОД(a1 , … , an) = a1x1+ …+anxn . Такое равенство называется линейным разложением НОД(a1 , … , an).

Доказательство. Воспользуемся доказанной выше формулой

(a1 , … , an) = (((…((a1 , a2), a3), … ), an–1), an).

Если Dn = (a1 , … , an) и Dn–1 = (a1 , … , an–1), то Dn = (Dn–1 , an). Линейное разложение для D2 = (a1 , a2) уже построено. Если уже построены линейные разложения

Dn–1 = a1u1 + … + an–1un–1 , Dn = Dn–1u + anv,

то, подставив первое равенство во второе, получим

Dn = Dn–1u + anv = (a1u1 + … + an–1un–1)u + anv =

= a1(u1u) + … + an–1(un–1u) + anv –

линейное разложение НОД(a1 , … , an).

Следствие 2 доказано.

Примеры: 1. Найти линейное разложение НОД(–6, 8, 34).

Имеем (–6, 8, 34) = ((–6, 8), 34) = (2, 34) = 2. При этом

(–6, 8) = 2 = (–6)(–3) + 8(–2), (2, 34) = 2 = 21 + 340,

(–6, 8, 34) = 2 = (2, 34) = 21 + 340 = ((–6)(–3) + 8(–2))1 + 340 =

= (–6)(–3) + 8(–2) + 340 –

линейное разложение НОД(–6, 8, 34).

2. Найти линейное разложение НОД(–12, 16, 34).

Аналогично предыдущему, (–12, 16, 34) = ((–12, 16), 34) = (4, 34) = 2,

(–12, 16) = 4 = (–12)(–3) + 16(–2), (4, 34) = 2 = 4(–8) + 341,

(–6, 8, 34) = 2 = (4, 34) = 4(–8) + 341 = ((–12)(–3) + 16(–2))1 + 341 =

= (–12)(–3) + 16(–2) + 341 –

линейное разложение НОД(–12, 16, 34).