Выполните этот пример: предположим, что уравнения:
7 = x + 3y + 4z + 9w
12 = 4x + 2y + 3z + 7w
Есть 2 уравнения и 4 неизвестных. Вы можете установить 2 неизвестных, чтобы быть параметры, поэтому система будет иметь столько уравнений, сколько неизвестных:
7 - (4z + 9w) = x + 3y
12 - (3z + 7w) = 4x + 2y
Мы будем использовать х и у, как неизвестные. Можно решить и оставить ш и г в качестве параметров линейного решения:
x = (22 - 3w - z)/10
y = (16 - 29w - 13z)/10
Теперь вам нужно сделать числитель делится на 10, то знаменатель. Если есть решение, вы можете проверить все параметры от 1 до 10.
В общем, вы делаете это:
- Выберите параметры так, что есть так много неизвестных как уравнения. Попробуйте оставить неизвестные, которые генерируют наименьшее абсолютное значение для детерминанта (в примере это было 10, но выбор y и z был бы лучше, так как это было бы | det | = 3)
- Решите линейную систему и сгенерируйте ответ в зависимости от параметров
- Проверьте значения параметров от 1 до абсолютного значения det (если есть решение, вы найдете его в этой точке), пока не будет целочисленное решение для всех неизвестных (именно поэтому вы выбираете наименьшее детерминантное значение перед) и проверяете, является ли оно положительным (это не было проиллюстрировано в примере).
Извините, если это грубая сила на последнем шаге, но, по крайней мере, существует возможность минимизировать диапазон теста. Может быть, может быть лучший способ решить окончательную систему диофантовых уравнений, но я не знаю никакого метода.
EDIT1
Существует способ избежать перебирая последнюю часть.Опять же, в этом примере, вы должны сделать:
22 = 3w + z (congruent, mod 10)
16 = 29w + 13z (congruent, mod 10)
Применение модуля:
2 = 3w + z (congruent, mod 10)
6 = 9w + 3z (congruent, mod 10)
Вы можете сделать систему сравнений треугольной (Gaussian элиминации), умножая конгруэнтность на инверсий в модуле 10 и подведение итогов к другим. Инверсия 9 по модулю 10 равена -1, поэтому мы умножаем последнюю конгруэнтность:
2 = 3w + z (congruent, mod 10)
-6 = -9w + -3z (congruent, mod 10)
эквивалентна:
2 = 3w + z (congruent, mod 10)
4 = w + 7z (congruent, mod 10)
Затем умножить на -3 и добавить к первому:
2 - 3*4 = 3w + z -3w - 21z (congruent, mod 10)
4 = w + 7z (congruent, mod 10)
Эквивалент:
-10 = -20z (congruent, mod 10)
4 = w + 7z (congruent, mod 10)
The n, вы решаете сверху вниз (этот пример кажется истинным для любого значения z). Там может быть определенная степень свободы, если у вас больше параметров, чем сравнений, но они эквивалентны, и вы можете установить избыточные параметры при любом значении, предпочтительно наименьшее, которое равно 1.
Сообщите мне, если есть что-то непонятное все же!
У меня нет решения, но, возможно, вы можете указать на правильное направление: вы пытаетесь решить систему диофантовых уравнений. Математическая дисциплина, связанная с такими проблемами, называется теорией чисел. Алгоритмы числовой теории обычно не включаются в числовые библиотеки. –
Другие переменные, чем уравнения? Есть простой ответ: наименьшая квадратная регрессия. Нет никакой гарантии, что решения будут целыми. – duffymo
Этот тип задачи называется «целым программированием», и его трудно решить в целом. https://en.m.wikipedia.org/wiki/Integer_programming –