потратил целый час на эту фигню
function gcd (x, y, s1=1, s2=0, t1=0, t2=1) {
let q = Math.floor(x/y),
s1copy = s1,
t1copy = t1;
return (x % y === 0) ? {gcd: y, s: s2, t: t2} : gcd(y, x%y, s1=s2, s2=s1copy-q*s2, t1=t2, t2=t1copy-q*t2);
}
gcd(161, 28); // returns { gcd: 7, s: -1, t: 6 }
посмотри здесь https://repl.it/CZhu
пример взят отсюда http://www.intuit.ru/studies/courses/552/408/lecture/9351?page=3
JavaScript
Помогите как реализовать расширенный алгоритм Евклида на js?
Расширенный алгоритм Евклида
В то время как "обычный" алгоритм Евклида просто находит наибольший общий делитель двух чисел a и b, расширенный алгоритм Евклида находит помимо НОД также коэффициенты x и y такие, что:
a \cdot x + b \cdot y = {\rm gcd} (a, b).
Т. е. он находит коэффициенты, с помощью которых НОД двух чисел выражается через сами эти числа.
Алгоритм
Внести вычисление этих коэффициентов в алгоритм Евклида несложно, достаточно вывести формулы, по которым они меняются при переходе от пары (a,b) к паре (b\%a,a) (знаком процента мы обозначаем взятие остатка от деления).
Итак, пусть мы нашли решение (x_1,y_1) задачи для новой пары (b\%a,a):
(b \% a) \cdot x_1 + a \cdot y_1 = g,
и хотим получить решение (x,y) для нашей пары (a,b):
a \cdot x + b \cdot y = g.
Для этого преобразуем величину b \% a:
b \% a = b - \left\lfloor \frac{b}{a} \right\rflo[...]
Подставим это в приведённое выше выражение с x_1 и y_1 и получим:
g = (b \% a) \cdot x_1 + a \cdot y_1 = \left( b -[...]
и, выполняя перегруппировку слагаемых, получаем:
g = b \cdot x_1 + a \cdot \left( y_1 - \left\lflo[...]
Сравнивая это с исходным выражением над неизвестными x и y, получаем требуемые выражения:
\cases{
x = y_1 - \left\lfloor \frac{b}{a} \righ[...]
Реализация
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;
}
Это рекурсивная функция, которая по-прежнему возвращает значение НОД от чисел a и b, но помимо этого — также искомые коэффициенты x и y в виде параметров функции, передающихся по ссылкам.
База рекурсии — случай a = 0. Тогда НОД равен b, и, очевидно, требуемые коэффициенты x и y равны 0 и 1 соответственно. В остальных случаях работает обычное решение, а коэффициенты пересчитываются по вышеописанным формулам.
Расширенный алгоритм Евклида в такой реализации работает корректно даже для отрицательных чисел.
В то время как "обычный" алгоритм Евклида просто находит наибольший общий делитель двух чисел a и b, расширенный алгоритм Евклида находит помимо НОД также коэффициенты x и y такие, что:
a \cdot x + b \cdot y = {\rm gcd} (a, b).
Т. е. он находит коэффициенты, с помощью которых НОД двух чисел выражается через сами эти числа.
Алгоритм
Внести вычисление этих коэффициентов в алгоритм Евклида несложно, достаточно вывести формулы, по которым они меняются при переходе от пары (a,b) к паре (b\%a,a) (знаком процента мы обозначаем взятие остатка от деления).
Итак, пусть мы нашли решение (x_1,y_1) задачи для новой пары (b\%a,a):
(b \% a) \cdot x_1 + a \cdot y_1 = g,
и хотим получить решение (x,y) для нашей пары (a,b):
a \cdot x + b \cdot y = g.
Для этого преобразуем величину b \% a:
b \% a = b - \left\lfloor \frac{b}{a} \right\rflo[...]
Подставим это в приведённое выше выражение с x_1 и y_1 и получим:
g = (b \% a) \cdot x_1 + a \cdot y_1 = \left( b -[...]
и, выполняя перегруппировку слагаемых, получаем:
g = b \cdot x_1 + a \cdot \left( y_1 - \left\lflo[...]
Сравнивая это с исходным выражением над неизвестными x и y, получаем требуемые выражения:
\cases{
x = y_1 - \left\lfloor \frac{b}{a} \righ[...]
Реализация
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;
}
Это рекурсивная функция, которая по-прежнему возвращает значение НОД от чисел a и b, но помимо этого — также искомые коэффициенты x и y в виде параметров функции, передающихся по ссылкам.
База рекурсии — случай a = 0. Тогда НОД равен b, и, очевидно, требуемые коэффициенты x и y равны 0 и 1 соответственно. В остальных случаях работает обычное решение, а коэффициенты пересчитываются по вышеописанным формулам.
Расширенный алгоритм Евклида в такой реализации работает корректно даже для отрицательных чисел.
Похожие вопросы
- Помогите определиться с выбором нового языка (JS(TS) vs Java)
- Js фреймворки, что полезного можно для себя найти?
- В чем цель фреймворков js web?
- Помогите, пожалуйста, написать js код для обновления ссылки
- [HTML/CSS/JS] Как сохранять изменённые в .js данные оффлайн-сервера локально?
- Почему jQuery методы популярнее js методов при общении с ДоМ?
- ПОЧЕМУ JS ТАКОЙ НЕПОНЯТНЫЙ???
- Ребят помогите с кодом пожалуйста (JS, Googl Apps Sсript)
- вопрос по JS. " простой ()";
- Порядок изучени JavaScripta. Путь к Node.js. Нужен совет по обучению от программистов