Просто для нахождения даже не нужно знать, как устроен алгоритм Евклида — он есть в компиляторе.
Расширенный алгоритм Евклида находит, помимо , такие целые коэффициенты и , что
Заметим, что решений бесконечно много: имея решение , можно увеличить на , а уменьшить на , и равенство при этом не изменится.
#Основная идея
Алгоритм тоже будет рекурсивный. Пусть мы посчитали нужные коэффициенты и , когда рекурсивно считали . Иными словами, у нас есть решение для пары :
Чтобы получить решение для исходной пары, запишем выражение по определению как и подставим в приведенное выше равенство: Теперь выполним перегруппировку слагаемых (сгруппируем по исходным и ) и получим:Сравнивая это с исходным выражением, получаем, что для исходных и подходят коэффициенты при и .
#Реализация
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;
}
Эта рекурсивная функция по прежнему возвращает значение , но помимо этого записывает в переданные по ссылке переменные и искомые коэффициенты.
#Применения
Эта модификация алгоритма интересна, потому что с помощью неё можно искать обратный элемент по модулю: такой элемент , что — что то же самое, что найти решение в целых числах:
Также с помощью расширенного алгоритма Евклида можно решать линейные диофантовы уравнения — находить решения в целых числах. Для этого достаточно проверить, что делится на , и если это так, то и из алгоритма нужно просто домножить на .