Наибольший общий делитель

 

Если u и v – целые числа, не оба рвные нулю, то их наибольшим общим делителем D(u, v) называется наибольшее целое число, на которое делятся без остатка как u, так и v. Если u и v оба равны нулю, то, поскольку нуль делится без остатка на любое целое число, выше приведенное определение не применимо; для удобства условимся, что D(0,0) = 0.

Для нахождения D(u, v) используется алгоритм Евклида. Чтобы найти наибольший общий делитель двух целых положительных чисел, нужно сначала большее число разделить на меньшее, затем второе число разделить на остаток от первого деления, потом первый остаток – на второй и т. д. Последний ненулевой положительный остаток в этом процессе и будет наибольшим общим делителем данных чисел.

Обоначив исходные числа через u и v, положительные остатки, получающиеся в результате делений, через r1, r2, ..., rn, а неполные частные через q1, q2, ..., qn+1, можно записать алгоритм Евклида в виде цепочки равенств

u = vq1 + r1,

v = r1q2 + r2,

r1 = r2q3 + r3,

. . . . . .

rn–2 = rn–1qn + rn,

rn–1 = rnqn+1.

Алгоритм. (Алгоритм Евклида в современной редакции.) По данным неотрицательным числам u и v этот алгоритм находит их наибольший общий делитель. (Замечание: наибольший общий делитель произвольных целых чисел u и v можно получить, применяя алгоритм к êu êи çvï.)

1. [v = 0?] Если v = 0, то алгоритм заканчивается, давая в качестве ответа u.

2. [Взять u mod v.] Установить r ¬ u mod v, u ¬ v, v ¬ r и возвратиться в шаг 1.

Алгоритм Евклида можно обобщить одним способом, который имеет большое значение. При этом способе во время вычисления D(u, v) можно попутно вычислить такие целые числа m и n, что

u×m = v×n = D(u, v).

Это обобщение удобно записать, используя векторные обозначения.

Алгоритм. (Обобщенный алгоритм Евклида.) При заданных неотрицательных целых числах u и v этот алгоритм определяет вектор (u1, u2, u3), такой, что uu1 + vu2 = u3 = D(u, v). В процессе вычисления используются вспомогательные векторы (v1, v2, v3), (t1, t2, t3); действия с векторами производятся таким образом, что в течение всего процесса вычисления выполняются соотношения

ut1 + vt2 = t3, uu1 + vu2 = u3, uv1 + vv2 = v3.

1. [Начальная установка.] Установить (u1, u2, u3) ¬ (1, 0, u), (v1, v2, v3) ¬ (0, 1, v).

2. [v3 = 0?] Если v3 = 0, то алгоритм заканчивается.

3. [Разделить, вычесть.] Установить , затем установить

(t1, t2, t3) ¬ (u1, u2, u3) – (v1, v2, v3)q,

(u1, u2, u3) ¬ (v1, v2, v3),

(v1, v2, v3) ¬ (t1, t2, t3).

Возвратиться в шаг 2.