Это не полный ответ, но некоторые предложения:
Примечание: я использую "s" для масштабного коэффициента и "x" для двойных.
Первый извсе, спросите себя, не работает ли грубая сила.Например, попробуйте s = 1, затем s = 2, затем s = 3 и т. Д. S
У нас есть список чисел x [i] и допуск t = 1/10.Мы хотим найти наименьшее положительное целое число s, такое что для каждого x [i] найдется целое число q [i] такое, что | s * x [i] - q [i] |
Во-первых, обратите внимание, что если мы можем создать упорядоченный список для каждого x [i], достаточно просто объединить их, чтобы найти самые маленькие s, которые будут работать для всех них.Во-вторых, обратите внимание, что ответ зависит только от дробной части x [i].
Переставляя тест выше, мы имеем | x - q / s |<т / с.То есть мы хотим найти «хорошее» рациональное приближение для x в том смысле, что это приближение должно быть лучше, чем t / s.Математики изучили вариант этого, где критерий «хорошо» состоит в том, что он должен быть лучше, чем любой с меньшим значением «s», и лучший способ найти их - это усечения непрерывного расширения дроби <a href="http://en.wikipedia.org/wiki/Continued_fraction" rel="nofollow">.1012 *.
К сожалению, это не совсем то, что вам нужно, поскольку, когда вы попадаете под свою терпимость, вам не обязательно продолжать становиться все лучше и лучше - такая же терпимость будет работать.Следующая очевидная вещь состоит в том, чтобы использовать это, чтобы перейти к первому числу, которое будет работать, и применить грубую силу оттуда.К сожалению, для любого числа наибольшее первое s может быть 5, так что это не так уж и много.Тем не менее, этот метод найдет вам работающие, но не самые маленькие.Можем ли мы использовать эти s, чтобы найти меньший, если он существует?Я не знаю, но он установит верхний предел для грубой силы.
Кроме того, если вам нужно, чтобы допуск для каждого x был