Розширений алгоритм Евкліда
Порівнюючи із "звичайним" алгоритмом Евкліда, який знаходить найбільший спільний дільник двох чисел і , розширений алгоритм Евкліда знаходить, крім НСД, також такі коефіцієнти та , що:
тобто він знаходить коефіцієнти, за допомогою яких НСД двох чисел виражається через самі ці числа.
Алгоритм
Введемо обчислення цих коефіцієнтів в алгоритм Евкліда. Для цього достатньо вивести формули, по яким вони змінюються при переході від пари до пари .
Отже, нехай ми знайшли розв'язок для задачі з новою парою :
і хочемо отримати розв'язок для задачі з парою :
Для цього перетворимо величину наступним чином:
Підставимо у вираз з та і отримаємо:
і, виконавши перегрупування доданків, отримуємо:
Порівнявши результат з початковим виразом з невідомими та , отримуємо необхідні рівності:
Реалізація
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;
}
Це рекурсивна функція як і раніше повертає значення НСД від чисел та , але крім цього також шукані коефіцієнти та у вигляді параметрів функції, що передаються у вигляді посилань.
База рекурсії . Значить НСД рівний , і, очевидно, необхідні коефіцієнти та рівні та відповідно. В інших випадках коефіцієнти перераховуються по вищеописаним формулами.
Розширений алгоритм Евкліда у такій реалізації працює правильно навіть для від'ємних чисел.
Застосування
TODO: add applications