добавлено: 10 Jun 2008 17:58 Расширенный алгоритм ЕвклидаВ то время как "обычный" алгоритм Евклида просто находит наибольший общий делитель двух чисел Т.е. он находит коэффициенты, с помощью которых НОД двух чисел выражается через сами эти числа. АлгоритмВнести вычисление этих коэффициентов в алгоритм Евклида несложно, достаточно вывести формулы, по которым они меняются при переходе от пары Итак, пусть мы нашли решение и хотим получить решение Для этого преобразуем величину Подставим это в приведённое выше выражение с и, выполняя перегруппировку слагаемых, получаем: Сравнивая это с исходным выражением над неизвестными Реализацияint gcd (int a, int b, int & x, int & y) { if (a == 0) { x = 0; y = 1; return b; } int x1, y1; int d = gcd (b%a, a, x1, y1); x = y1 - (b / a) * x1; y = x1; return d; } Это рекурсивная функция, которая по-прежнему возвращает значение НОД от чисел База рекурсии — случай Расширенный алгоритм Евклида в такой реализации работает корректно даже для отрицательных чисел. Литература
|